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.

Screens

Home

Reach for this for a person's front door: the apps (or any destinations) they can open, as a grid of category cards under a greeting, with no rail, no search and no facets. The floorplan owns the band (the brand, the organization item, the account button and sync), the greeting, the grid and its faces: the first sync on its way, and the empty face whose copy is yours. A door list that needs search, sort or grouping is a RecordsScreen, not this. Step through face to see each, and set organizations to two to see the organization item.

Spec of record: design-system/components/floorplans/HomeScreen.d.ts

6
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.

screen_home
Knobs
Theme

The doors the grid shows, in the host's order. Read on the grid face.

One organization draws no trace of the item; two or more draw it.

Shows when you Open the account menu at the band's end. — press Focus to make the preview interactive.

Dart for these values
screen_home()

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.

HomeScreen widget

The FLOORPLAN for a person's FRONT DOOR (`design-system/components/floorplans/HomeScreen.d.ts`): the doors they can open, as a grid of category cards under a greeting, on a frame of its own with no rail, no search and no facets. What it always owns: * **THE BAND** — one row across the top, 64 tall…

Full dartdoc

The FLOORPLAN for a person's FRONT DOOR (`design-system/components/floorplans/HomeScreen.d.ts`): the doors they can open, as a grid of category cards under a greeting, on a frame of its own with no rail, no search and no facets. What it always owns: * **THE BAND** — one row across the top, 64 tall at >=600 and 56 below, painting the `chrome` knob's fill with its content re-inked through the on-chrome scope (Scaffold.d.ts THE BANDS TAKE THE CHROME): the brand (railMark and title, identity only), the organization item (organizations, two or more), then at the end the account button and syncStatus LAST. * **THE GREETING** — heading in the display role, subheading under it in the body role at ink60. * **THE GRID** — entries as the kit's category grid, in the host's order (it never sorts, groups, searches or filters), track floor 160 below 600 and 264 at >=600 (three across the measure), each whole card firing onOpen. * **THE MEASURE** — one column at most 1040 wide, centered on the ground with the workspace gutter at its sides, scrolling under the band. * **THE FACES**, ranked FIRST-SYNC > EMPTY > the grid. notice renders over any of them; hint only over the grid. ```dart HomeScreen( title: 'Field Kit', railMark: const AppRailMark(glyph: KitGlyph.target), heading: 'Welcome, Jordan', subheading: 'Choose an app to get started.', entries: const [ HomeEntry(id: 'jobs', title: 'Projects', supporting: 'Jobs and their tasks.', glyph: KitGlyph.folder), ], onOpen: openApp, empty: HomeEmpty(title: 'No apps yet', actions: [HomeEmptyAction(label: 'Check again', onSelect: syncNow)]), syncStatus: const SyncStatusButton(...), // required; null = no channel ) ```

HomeScreendefault constructor

Knob Type Default What it does
account AppNavFooterAccount? null The signed-in person; WINS over the AppScaffoldAccountScope the host that owns the session installs. Null reads the scope; neither draws no button (THE ACCOUNT BUTTON).
empty * HomeEmpty — THE EMPTY FACE's copy and actions, shown when entries is empty and the first sync is not still on its way.
entries * List<HomeEntry> — The doors, in the host's order.
heading * String — The greeting, display role ("Welcome, Jordan").
hint String? null THE HINT, one quiet line after the grid: the one thing a person should learn here to use what lies past it. Never drawn on the empty or the first-sync face. Null draws nothing.
hydration SyncHydration? null THE HYDRATING FACT from the host's sync layer: hydrating with no entries draws the first-sync face in the grid's place, and a terminal phase falls through to that phase's remedy. Null: no first-sync face.
notice HomeNotice? null THE NOTICE, one standing message above the grid, the banner's neutral kind. Null draws nothing and pays no height.
onOpen * ValueChanged<String> — Opening a door, by its HomeEntry.id.
onSettings VoidCallback? null Adds "Settings" to the account menu, above the account's own items. Settings is reached HERE on a front door: there is no rail footer to hold it. Null: no Settings item.
organizations HomeOrganizations? null THE ORGANIZATION ITEM; drawn only with two or more items. Null: no item. At >=600 a hairline divider after the brand, then ONE button: a 16px building glyph, the current organization's label at the em weight, a chevron.
railMark Widget? null The brand's identity face (`AppRailMark` — the 28 block, or the shell's image mark). Null: the title alone.
subheading String? null The greeting's second line, body role at ink60. Null: no line under the heading.
syncStatus * Widget? — The shell's sync control, LAST in the band. REQUIRED BUT NULLABLE: null states the surface has no sync channel and renders no control.
title * String — The brand title in the band, and the screen's accessible name.

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.

AppNavFooterAccount support

THE FOOTER ACCOUNT (`NavRail.d.ts`, `Scaffold.d.ts` THE ACCOUNT ITEM, steady-core #1739) — the signed-in person at the foot of an AppNavRail's footer: how a person sees who they are signed in as and reaches the verbs about their session (Sign out first among them). Pure data, and the kit never reads…

Field Type Default What it does
detail String? null One line under the name in the opened menu's heading (an email). Never drawn on the row. Null or empty draws nothing.
items * List<AppMenuItem> — The menu's verbs, in order.
name * String — The person's name: the row's label, the collapsed row's accessible name and tooltip, the avatar's initials and the menu heading's title.

HomeEmpty support

THE EMPTY FACE's copy and actions. THE COPY IS THE HOST'S: a front door's empty face is a statement about the person's access, which only the host can make true ("No apps yet"); the floorplan owns where it goes.

Field Type Default What it does
actions * List<HomeEmptyAction> — The face's actions, in order; the first is the one slab.
detail String? null Why, and who can change it.
meta String? null One quiet line: who is signed in ("Signed in as a@b.example"), so a person on the wrong account sees it.
title * String — What the person sees, stated flat ("No apps yet").

HomeEntry support

One door: an app (or any destination) the person can open (`HomeScreen.d.ts` `HomeEntry`).

Field Type Default What it does
color String? null THE APP'S COLOR ON THE DOOR (`HomeScreen.d.ts`, steady-core #1928): a palette NAME (`tokens/palette/Palette.d.ts`) the plate paints in, its tint under the glyph in its ink (AppCardGridItem.glyphColor). Null, or a name the palette does not hold, is the accent-tint plate.
glyph KitIconRef? null The glyph on the card's 40px plate (the contract's `icon`, named as `AppScaffoldApp.glyph` names an app's mark). Null draws the plate with no mark, as the category card does on the web kit.
id * String — The entry's stable id, handed back to HomeScreen.onOpen.
offline OfflineReadiness? null THE DOOR'S OFFLINE STATE (`HomeScreen.d.ts`, steady-core #1920): whether the app opens with no signal, which the HOST sets only for an app it keeps ready offline. Drawn as the card's state pill in the kit's words (offlineReadinessLabel); null draws none.
supporting String? null A short phrase saying what it is for, on at most two lines before it ellipsizes (`HomeScreen.d.ts` THE DESCRIPTION IS READ, NOT CLIPPED, #1891); null draws none.
title * String — Its name, the card's emphasized line.

HomeNotice support

THE NOTICE: one standing message above the grid — a fact about the door itself ("An update is available. Update to open every app."), or a host's refusal to switch organization now.

Field Type Default What it does
actionLabel String? null The one action's label; drawn only with onAction.
message * String — The message, one or two plain sentences.
onAction VoidCallback? null The one action.
onDismiss VoidCallback? null Non-null, the notice carries a dismiss control.

HomeOrganizations support

THE ORGANIZATION ITEM's value: a SLOT THE HOST FILLS. The floorplan never learns what an organization is, how a switch happens or whether one may happen now.

Field Type Default What it does
current * String — The id of the organization this screen shows; checked in the list.
items * List<HomeOrganization> — Every organization the person belongs to, in the host's order.
onSelect * ValueChanged<String> — Choosing another organization. Never fired for current.

Where it lives

Class File
HomeScreen packages/app_widgets/lib/src/floorplans/home_screen.dart