- Sidebar width:
260pxexpanded,76pxcollapsed. - Topbar height:
64px. - Page content max width:
1200px. - Page padding:
32pxdesktop,20pxmobile. - Mobile and narrow viewports use the topbar route menu; the sidebar is hidden.
- Every console route uses
AppShell. - Every page uses
PageShell. - Every page starts with
PageHeader. - Page headers include a kicker, title, and plain operational description.
- Data pages use
AsyncStatewith loading, error, empty, and populated states. - Destructive actions require
AlertDialog. - Copyable commands use
CommandBlockandCopyButton. - Secrets use
SecretFieldand are never rendered raw.
- Dashboard summary: responsive 1/2/4 stat grid.
- Page sections:
grid gap-lg. - Data + detail split:
xl:grid-cols-[1fr_1.2fr]. - Tables are full-width inside bordered surfaces and horizontally scroll on small screens.
- Forms stay inside one card or panel; they do not float as nested cards.
- Loading uses
Skeletonand must be visually stable. - Empty states use dashed bordered panels with one action when useful.
- Errors use
Alertwith text and tone.
- Radix components provide keyboard behavior for dialogs, menus, select, popovers, tabs, tooltips, switches, checkboxes, radio groups, and alerts.
- Focus rings are visible and accent colored.
- Statuses include text labels.
- Dialogs trap focus.
- Forms use explicit labels and error messages.