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