Contrast
Text against what it sits on. Below 4.5:1 fails WCAG AA for body text —
the check a reviewer runs on any surface that takes a tone.
Body text on cards
Secondary text on cards
Body text on the app background
Text on the accent
Muted text on the app background
Danger text on its wash
Ok text on its wash
Waiting for the first preview to report its palette.
Corners
Sets all three radii at once. The individual values are under Geometry.
Sharp Soft Round Pill
Brand 5 The accent seam an app actually brands itself through. Change these and you have made the decision a real `DesignTokens.graphite(...)` call makes.
accent
reset
The one voice of color — a BRAND SLOT — as a FILL (`--accent`, `Brand.d.ts` THE ACCENT'S TWO JOBS, #1689): a surface painted with the accent under [onAccent] (a slab, the FAB, a count badge, a checked box's face, an on switch's track, an active toggle's face, a pin head, a band under `chrome: accent`) and every wash mixed from it ([accentTint], [accentSel], [focusHalo], [groundGridInk], the deep chrome). Drawn ON a surface, the accent is [accentInk]. onAccent
reset
Foreground color painted on top of [accent]. accentInk
reset
THE ACCENT'S INK (`--accent-ink`, #1689): the accent drawn ON a neutral or washed surface — text and links, a glyph or icon, a border, an edge or underline, a selection start-edge, the focus ring and a field's focused border, a radio's dot, a status marker, a progress bar or spinner, the chart's lead series, the palette's `accent` ink. THE BOUNDARY OF A FILLED STATE IS INK: a checked box, an on switch and an active toggle draw their edge in it over the [accent] fill. Absent from the brand it IS [accent], byte for byte; a brand whose accent is a high-luminance hue states a darker ink of the same hue, and the plane-contrast gate holds this, not the fill, to the card and the ground (`contrastFloorViolations`). accentTint
reset
The accent at 9% (16% dark) — ID chips, the active row's wash, an applied chip, an applied-but-closed control (`--accent-tint`, derived from [accent]). accentSel
reset
The accent at 11% (18% dark) — the rail's FILLED INDICATOR (M3), laid over the GROUND, a step stronger than [accentTint] because the ground is darker than the card (`--accent-sel`, derived from [accent]).
Geometry 15 Square or rounded, and how heavy every line is. The radius row above the controls sets all three corners at once, because "what does square feel like" is one decision rather than three numbers.
rXs
reset
Radius for chips, checkboxes, tags, badges (`--r-xs`, 2). rS
reset
Radius for controls: buttons, fields, map pins and clusters (`--r-s`, 3). rM
reset
Radius for surfaces: cards, menus, dialogs (`--r-m`, 4). rL
reset
Radius for a sheet's leading corners, the largest surfaces (`--r-l`, 8). rMark
reset
Radius for a status marker, a legend swatch (`--r-mark`, 1). rPill
reset
THE PILL FLOOR (`--r-pill`, #1102): 0 in every corners set but [CornerStyle.round], where it is 999 and clamps to height / 2. A pill-capable control reads [controlRadius] or [chipRadius], never this directly. hairline
reset
Hairline stroke width. iconStroke
reset
Icon stroke weight. focusW
reset
Focus ring stroke width (solid [accentInk], offset [focusOffset]). focusHaloW
reset
The width of a FIELD's focus halo (`--focus-halo-w`, 3): a focused field takes the [accentInk] border plus [focusHalo] this wide OUTSIDE the box — the idiomatic Flutter form is a [BoxShadow] with this `spreadRadius` and zero blur. ctl
reset
Control height: buttons, toolbar (44 comfortable · 32 compact). fld
reset
Field box height: text fields, selects, date fields (`--fld`, 44 comfortable · 36 compact) — a field box stays a step taller than a control at the desk. navh
reset
Nav row height (44 comfortable · 34 compact). rowV
reset
Table row vertical padding (density knob): 14 comfortable (a 48 row) · 10 compact (a 40 row). barH
reset
The app bar's height (`--bar-h`, 64 comfortable · 56 compact) — the frame's one band, on the ground.
Surfaces 17 Everything the app is painted ON — the ground behind the content (the frame paints it too), the cards over it, the well inset in a card, and the washes that show state.
sur
reset
The GROUND (`--sur`): the app background, and the frame — the app bar and the rail paint it, with no fill, rule or shadow of their own. paper
reset
The CARD (`--paper`): tables, panes, charts, forms, sheets, menus — the plane every job sits on, a step above [sur]. paperW
reset
Sidebar / rail wash (`--paper-w`) — retiring with the rail wash (#892). well
reset
The WELL (`--well`): inset fills inside a card — photo plates, quote blocks, tracks, avatar blocks, neutral tags. ink4
reset
State layer: hover wash, pressed, chip trays — opaque, over the card. cardEdge
reset
The card's hairline edge (`--card-edge`) — a LITERAL per theme, not an alias: in dark it is the card's RIM, its own value, because a shadow cannot lift a card off a near-black ground. cardSelEdge
reset
The selected record card's start-edge bar (`--card-sel-edge`): 0, or [edge] under [SelectionMark.edge]. surfaceEdge
reset
The frame a tile, sheet, panel or docked pane draws around itself (`--surface-edge`, aliasing `--card-edge` — every one a card now). hair
reset
Row + minor separators inside a card. hairS
reset
Structural: table header rule, sheet edges, a divider that must read. rowHover
reset
Table row hover wash. groundHover
reset
The state layer ON THE GROUND (`--ground-hover`, #892): the rail's hover, a ghost control on the bar. [ink4] is a CARD state layer and sits above the ground's value, so on the ground it vanishes; this steps the ground itself toward the ink — `color-mix(in srgb, var(--ink) 6%, var(--sur))`, derived in each factory from its own ink and ground, so the separation knob moves it with [sur]. groundGridInk
reset
The grid's line color (`--ground-grid`: the accent at 10%). groundGridSize
reset
The grid's pitch (`--ground-pattern-size`, 24). rowSel
reset
Table row selected wash. expandBg
reset
Expanded-row detail well. scrim
reset
Modal/sheet scrim.
Bands 10 The rail's head and the view bar beside it (one band across the top at 960 and wider), a pushed screen's bar, the compact bar and the compact nav bar — the band's fill, its rule, its hover and active faces, the resting field box on it, and the ink and accent control that sit on it. The rail's tree and its footer stay on the ground.
chrome
reset
A band's fill (`--chrome`): the app bar, the app band, the rail outside a drawer, the compact nav bar. chromeField
reset
A FIELD BOX's resting fill on a band (`--chrome-field`, #1186 — `AppBar.d.ts` ON A BAND): the search field resting on an accent or deep band takes this tonal step of the band — the on-chrome ink at 14% over [chrome] — with no border, and lift to [paper] while focused. Under [ChromeTone.ground] it is the field's ordinary paper fill, so nothing changes there. chromeHair
reset
A rule on a band (`--chrome-hair`). chromeHover
reset
A band's state layer (`--chrome-hover`). chromeSel
reset
The active nav item's face on a band (`--chrome-sel`). onChrome
reset
Text and glyphs on a band (`--on-chrome`). onChrome60
reset
Secondary ink on a band (`--on-chrome-60`): meta, counts, borders. onChromeAccent
reset
An accent control on a band (`--on-chrome-accent`) — inverted under an accent or deep band (the #338 accent-on-accent cases). onChromeAccentInk
reset
The accent as INK on a band (`--on-chrome-accent-ink`, #1689): a lit glyph, an edge or a ring on the chrome. [accentInk] under a ground band; under an accent or deep band it inverts with the fill and IS [onChromeAccent]. [onChromeScope] maps [accentInk] onto it. onChromeOnAccent
reset
The ink on that control (`--on-chrome-on-accent`).
Text and controls 11 The ink ramp, the control outlines and the field's focus halo. Every pair the panel can break is watched by a contrast badge above.
ink
reset
Primary text. ink60
reset
Secondary text. ink40
reset
Tertiary: labels, counts, glyphs, placeholders — never body text. ink20
reset
DIM MARKS, never text (`--ink20`): an unfilled priority bar, the grab bar, a stepped-back chart bar, the crosshair. btnBorder
reset
Default button outline. btnBorderHover
reset
Button outline on hover. fieldBorder
reset
A field's box (`--field-border`): text fields, selects, date fields, the combobox, the ref tile, the search field — the 3:1 boundary. chkBorder
reset
Checkbox border — the 3:1 boundary. focusHalo
reset
A FIELD's focus halo color (`--focus-halo`): the accent at 20%, derived from [accent] — the FILL, since a halo is a wash (#1689) — so a brand's halo follows its accent. focusHaloDanger
reset
A focused field IN ERROR (`--focus-halo-danger`, #896; `TextField.d.ts` THE FIELD STATES): [focusHalo]'s halo in the danger, the danger at 20%. edge
reset
Selection/cursor start-edge indicator width.
Status 7 The three voices that mean something — danger, caution and ok — each as a foreground and a surface wash, danger with a border as well.
danger
reset
Danger/error foreground — someone must act. dangerTint
reset
Danger/error surface wash — the filled tag and the banner a demanding status takes. dangerEdge
reset
Danger/error border. caution
reset
The caution ink (`--caution`, #922): the StatusPill caution plate's word and the chart tier's caution tone (a donut segment, a gauge band, an aging segment). ONE number on both kits — the token's oklch value converted, never a color this kit derives. Accent-independent. cautionTint
reset
The caution plate's wash (`--caution-tint`) — [caution] at the token's alpha, so the plate composites on whatever surface it sits on. ok
reset
Success/resolved foreground — the estate's one green (`--ok`). Accent-independent like [danger]; appears only where resolution or success is stated (StatusPill positive, resolved chips), never as a third decorative voice. okTint
reset
Success/resolved surface wash (`--ok-tint`).
Data 5 The default pin head, its glyph and its halo, and the group bands. A pin's category color comes from the palette, named in the theme seed.
pinFill
reset
The head of a pin that names neither a category nor a status (`--pin-fill: var(--accent)`; `MapView.d.ts` ONE CHANNEL PER JOB). It IS the themed accent by definition. pinFg
reset
The glyph on [pinFill] (`--pin-fg: var(--on-accent)`); a palette fill takes its own [KitPaletteColor.on]. pinHalo
reset
The 1.5px ring OUTSIDE a pin head's rim, so any fill reads on any basemap (`--pin-halo`: the paper at 85%; `MapView.d.ts` EVERY FILL IS LEGIBLE ON EVERY BASEMAP). group0
reset
Level-0 group header band. group1
reset
Level-1 group header band.
Map 11 The basemap's roles — land, water, parks, roads and their casings, buildings, labels — and the pending pin's gray. A raster basemap keeps its own imagery; these paint the map's plate and any kit-drawn map.
mapLand
reset
Land — the map's plate (`--map-land`). mapWater
reset
Water (`--map-water`). mapPark
reset
Parks and green space (`--map-park`). mapRoad
reset
A minor road's fill (`--map-road`). mapRoadEdge
reset
A minor road's casing (`--map-road-edge`). mapRoadMajor
reset
A major road's fill (`--map-road-major`). mapRoadMajorEdge
reset
A major road's casing (`--map-road-major-edge`). mapBuilding
reset
Building footprints (`--map-building`). mapLabel
reset
Place and road labels (`--map-label`). mapLabelWater
reset
Water labels (`--map-label-water`). pinPending
reset
A PENDING pin's head (`--pin-pending`, #894): the StatusMark `pending` tone on a pin with no category, whose fill says its status — and the hollow status badge's border beside one (`MapView.d.ts` ONE CHANNEL PER JOB, #972). [accent], [ok] and [danger] carry the other three. Clears 3:1 on [mapLand]; never text.
Scrollbars 6 Every scroller's bar: the thumb at rest and while hovered or dragged, the strip it rides, and the desk bar's thickness, side gap and corners. The desk half shows only while a fine pointer is attached; at touch the platform's own overlay keeps its size.
scrollbarThumb
reset
The scrollbar thumb at rest (`--scrollbar-thumb`, aliasing [ink40]): the muted-ink role, which clears the 3:1 a draggable control needs on [sur] and [paper] — never the state layer, which Material's Android thumb reads by default and which cannot be seen on [sur]. scrollbarThumbHover
reset
The thumb while hovered or dragged (`--scrollbar-thumb-hover`, aliasing [ink60]) — one ink level up; the thumb never grows. scrollbarTrack
reset
The strip the thumb rides (`--scrollbar-track`): transparent in graphite, so the thumb reads against the surface it scrolls. A theme may fill it. scrollbarSize
reset
The DESK scrollbar thumb's thickness (`--scrollbar-size`, 8). Applied only while a fine pointer is attached; at touch the platform's overlay keeps its own. scrollbarInset
reset
The clear gap on either side of the desk thumb (`--scrollbar-inset`, 2) — `ScrollbarThemeData.crossAxisMargin` — so a scroller's bar takes [scrollbarSize] + 2 × this. scrollbarRadius
reset
The thumb's corner radius (`--scrollbar-radius`, aliasing [rS]): the control radius, so a theme that moves [rS] moves its thumbs with no widget edit.
Advanced 6 Real controls that are not decisions — motion durations, the focus ring offset, the touch floor. Opens collapsed on purpose.
tQuick
reset
Quick transition duration — chevrons, hovers, checks. tMove
reset
Move transition duration — sheets, rail, menus. tDraw
reset
Draw transition duration (`--t-draw`) — the chart entrance band, the draw-in choreography's clock. tStagger
reset
Per-mark entrance offset (`--t-stagger`) — the delay each successive mark takes on top of the entrance band; the per-mark offset clamps at 20 steps, so a large series never trails past the band. focusOffset
reset
Focus ring offset. touch
reset
Minimum hit-target floor. Follows the POINTER, not the density knob alone (rhythm.css): 44 at comfortable (touch surfaces — never shrink below on touch), 32 at compact, which only ever applies with a fine pointer attached. Density-resolving this is what lets the control set — and a control-bearing table row — densify together (V-16).
Take it with you
The Dart that reproduces what you are looking at. It is a real
constructor call, because the configurator edits a real preset — what
you copy is what an app can paste.
Copy Dart Reset everything
Install this once at the app root, in the MaterialApp builder, so an attached mouse or trackpad puts the kit in the desk posture — the tighter motion clocks, navigation that cuts, and compact density unless the host forces one — on every platform but iOS, whose primary pointer stays touch. Without it every surface stays on touch.
Real widgets, built from the real kit. Turn a knob and it rebuilds; the
theme bar above applies the design system's own tokens — including
anything you changed under Customize — and the device selector uses the
same sizes the golden baselines gate on, so what you see here is what CI
holds the widget to.
No live preview — a scope — it publishes the pointer posture and re-resolves the density its child paints with, and paints nothing itself. Its knobs are documented below.
Publishes the AppPointerPosture to the kit, and re-resolves the density of everything below it — the ONE place the app listens to the pointer. **Install it in `MaterialApp.builder`**, around the builder's child: below the app's theme, so the density reader can re-theme it, and above the Navigator,…