Theme
Customize the design system

Every control starts at the preset. Change one and every preview on the site follows, on this page and the next, until you reset it.

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.

Waiting for the first preview to report its palette.

Corners

Sets all three radii at once. The individual values are under Geometry.

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.

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.

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.

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.

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.

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.

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.

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.

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.

Advanced 6

Real controls that are not decisions — motion durations, the focus ring offset, the touch floor. Opens collapsed on purpose.

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.

Building with it

What to do when the thing you need does not exist yet, and why you can trust every number on this site.

What to do when nothing fits

The sourcing gate has four legitimate answers, and only one of them is "use the kit widget". Rolling your own is a normal outcome — an undecided one is not.

Situation What you do What you record
A kit widget covers it Use it. Stop. Nothing
Covers it, missing a variant Extend the kit — additive, opt-in, defaulting to today's behavior A real consumer in the same PR, and the knob named in kit vocabulary
Generic, nothing covers it Born in packages/app_widgets, blessed on sight A catalog entry, via /new-widget
Generic but blocked Born app-local The blocking reason in a kind:harvest issue
Domain composition of kit parts Born app-local A // kit-source: composition line naming its parts
Genuinely cannot comply Sanctioned deviation — rare, and ask first A row in apps/<app>/deviations.md with an owner and an expiry
An app-local widget is fine. An app-local widget nobody decided on is not. That line is the whole rule; the tiers just make the decision cheap.

How this site stays true

Knobs, types, defaults and enum values are extracted from the Dart API by tools/kit-catalog and byte-compared in CI, so they cannot drift. The only hand-written things here are which section an entry sits in, its ordering, its summary, and a screen's own knobs — and scripts/check-catalog.sh fails the build if a summary cites a knob that no longer exists, or if a screen offers a control its builder does not read.