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.

Components

Icons

The whole design-system glyph set, named — the house tier and the curated library tier, one name table on both kits. Every one, not a sample: the question this answers is "is there one for X", and a sample cannot answer it. A host adds its own glyphs by name on a KitIconScope.

Spec of record: design-system/components/icons/Icons.d.ts

0
Knobs

Live

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.

Press Focus on any preview to take it to the full window — at a desktop width that renders most devices at 1:1, which is when the widget's own controls become clickable. The bar always states the device and the scale, so a shrunk preview says it is shrunk. Esc leaves.

family_icons
Knobs
Theme
Dart for these values
family_icons()

What it is made of

The widgets this screen assembles, with their full API below. They used to live on a second entry of their own; one thing you choose gets one page.

KitIcon widget

Renders one glyph, by name, from the design-system set — the kit's table (KitGlyph) or a host glyph registered on a KitIconScope. Sizes per the DS: 16 default · 20 in nav rails · 13 inside buttons · 10 on a pin head.

Full dartdoc

Renders one glyph, by name, from the design-system set — the kit's table (KitGlyph) or a host glyph registered on a KitIconScope. Sizes per the DS: 16 default · 20 in nav rails · 13 inside buttons · 10 on a pin head. Color follows `currentColor` semantics — it inherits the ambient IconTheme color, falling back to DesignTokens.ink; pass color to override. Stroke weight comes from DesignTokens.iconStroke and scales with size exactly as the source SVG's viewBox scaling does. AN UNKNOWN NAME IS AN ABSENT GLYPH, never an error: a glyph that resolves to nothing draws fallback when one is given (a pin or a legend key passes KitGlyph.dot) and otherwise nothing, in a box of size, so a row's layout does not jump. The icon itself is excluded from semantics — a kit icon marks identity or action and the wrapping control (button, nav item) carries the accessible name. ```dart KitIcon(KitGlyph.sync, size: 15) KitIcon(KitGlyph.syringe, size: 20) // nav rail KitIcon(KitIconRef.named('wellhead')) // a host glyph ```

KitIcondefault constructor

Knob Type Default What it does
glyph * KitIconRef — Which glyph to render.
color Color? null Explicit paint color. Null inherits the ambient IconTheme color (`currentColor`), falling back to DesignTokens.ink.
fallback KitIconRef? null The glyph drawn when glyph names nothing — the surface's own "no glyph" rule. Null draws nothing in a box of size.
size double 16 Rendered edge length in logical px. DS sizes: 16 default · 20 nav · 13 in-button · 10 on a pin head.

KitIconScope widget

The host's own glyphs, by name, for every `KitIcon` below it — the rare domain mark no library has, without forking the kit. Install ONCE, in the app root's `MaterialApp.builder` beside `AppPointerPostureScope`, so every route (pushed ones included) sees it: Then `KitIconRef.named('wellhead')` draws…

Full dartdoc

The host's own glyphs, by name, for every `KitIcon` below it — the rare domain mark no library has, without forking the kit. Install ONCE, in the app root's `MaterialApp.builder` beside `AppPointerPostureScope`, so every route (pushed ones included) sees it: ```dart const hostGlyphs = { 'wellhead': KitGlyphDef([KitGlyphElement('M8 21V9h8v12M6 9h12M12 9V3')]), }; MaterialApp( builder: (context, child) => KitIconScope(glyphs: hostGlyphs, child: child!), ); ``` Then `KitIconRef.named('wellhead')` draws it anywhere a glyph goes, and `parseIconName(s, hostGlyphs: hostGlyphs)` resolves it from data. A name matches `^[a-z][A-Za-z0-9]*$` and may not fold onto a kit glyph or another host glyph; a violation throws an ArgumentError here.

KitIconScopedefault constructor

Knob Type Default What it does
child * dynamic —
glyphs * Map<String, KitGlyphDef> — The host's glyphs, by name (validated).

Types its knobs take

These are not things you choose — they are the shapes the knobs above expect. They live under this entry rather than in the navigation for exactly that reason.

KitGlyphDef support

One glyph's drawing: path data on the 24 grid plus its tier grammar. Every KitGlyph carries one, and it is also the shape a HOST GLYPH is written in — registered by name on a `KitIconScope` for the rare domain mark no library has (Icons.d.ts, A HOST REGISTERS ITS OWN GLYPHS BY NAME).

Field Type Default What it does
elements * List<KitGlyphElement> — The glyph's elements, painted in order.
cap KitGlyphCap KitGlyphCap.butt Stroke caps.
flip bool false Whether the glyph mirrors under an RTL `Directionality` (back/open, the library's left/right arrows, undo/redo, log-in/out).
join KitGlyphJoin KitGlyphJoin.miter Stroke joins.
Field Type Default What it does
elements * List<KitGlyphElement> — The glyph's elements, painted in order.
flip bool false Whether the glyph mirrors under an RTL `Directionality` (back/open, the library's left/right arrows, undo/redo, log-in/out).

KitIconRef support

A glyph, by NAME — what every glyph-bearing kit API takes (a pin, a legend key, a nav item, an action, an empty face, a category card). Two shapes implement it: - a KitGlyph — a glyph in the kit's own name table, checked by the compiler (`KitGlyph.syringe`); - KitIconRef.named — any name as a…

Field Type Default What it does
name * String —

Where it lives

Class File
KitIcon packages/app_widgets/lib/src/kit/icons/kit_icon.dart
KitIconScope packages/app_widgets/lib/src/kit/icons/kit_icon_scope.dart