Flutter docs
Default skin

Tokens

Every value a component may use. Structure tokens (spacing, radius, timing) are stable across brands; skin tokens (colour, elevation, texture) are what a Skin rewrites. A component never writes a hex and never writes a duration.

Colour

--cb-bg

--cb-bg-subtle

--cb-surface

--cb-border

--cb-fg

--cb-fg-muted

--cb-brand-300

--cb-brand-500

--cb-brand-700

--cb-tone-info

--cb-tone-success

--cb-tone-warning

--cb-tone-danger

--cb-decor-violet

--cb-decor-blue

--cb-decor-teal

--cb-decor-green

--cb-decor-amber

--cb-decor-rose

Spacing

--cb-space-1

--cb-space-2

--cb-space-3

--cb-space-4

--cb-space-5

--cb-space-6

--cb-space-7

--cb-space-8

Control heights

The height a form control is drawn at: sm 2rem (32px), md 2.5rem (40px), lg 3rem (48px). Each is max() of a preferred step (--cb-control-height-base-*) and the active pointer floor, so a density scale can retune the ladder but never take a control under its floor.

On a coarse pointer — a touch screen — --cb-control-floor becomes --cb-control-floor-coarse (2.75rem, 44px), so sm and md both reach 44px and lg keeps its 48px, with no per-control CSS. A pointer that hovers keeps --cb-control-floor-fine (2rem, 32px).

The 2026 SaaS convention is a tighter ladder — xs 24 / sm 28 / md 36 / lg 44 / xl 52. Ceebee starts higher (its sm 32 is already above that convention's sm 28) and its md is 40 because the library is drawn at a roomier base than a dense admin table. The top is lg 48; there is no xl control. A consumer that wants the convention's tighter steps retunes --cb-control-height-base-*, and the floor still holds.

--cb-control-height-sm

--cb-control-height-md

--cb-control-height-lg

Radius

--cb-radius-sm

--cb-radius-md

--cb-radius-lg

--cb-radius-xl

--cb-radius-full

Motion

Durations and easings are tokens too, so timing stays consistent across components and can be retuned in one place.

--cb-duration-instant

--cb-duration-fast

--cb-duration-base

--cb-duration-slow

--cb-duration-deliberate