3.6 KiB
Page Layout and Action Guidelines
This document defines the binding composition grammar for headed GovOPlaN pages. Core owns the reusable anatomy; each module owns its domain actions, wording, authorization, consequences, and data state.
Required Page Frame
- Use
PageLayoutfor every headed standalone, workspace, or embedded page. - Use
WorkspaceFramefor a full-height module surface andWorkspaceLayoutonly where navigation/content or list/detail panes are genuinely part of the interaction. - Put page-wide feedback in
PageLayoutnotices. UseDismissibleAlertfor a recoverable warning or failure andStatePanelwhen the entire surface is loading, empty, unavailable, or blocked. - Do not reproduce shared page padding, heading, toolbar, form-grid, section, table, dialog, or breakpoint CSS in a module.
Page Action Archetypes
Pass one PageActionBar to the PageLayout actions slot. The variant makes
the page's intent inspectable and preserves the same keyboard and visual order
across modules.
| Page kind | Leading group | Trailing group |
|---|---|---|
| Collection | Reload, then collection context such as export | Help, then Create at the far right |
| Detail | Reload, then object context | Help, ordinary primary actions, then consequential actions |
| Editor | Reload, then editor context such as preview | Help, Discard, then Save at the far right |
Reload means re-fetch or re-evaluate the current surface. It remains present when the page can become stale. Create is a collection-wide action and is not duplicated in a persistent side panel. Save is present only where the page owns an editable draft; a read-only detail page must not display a disabled or inert Save merely to fill the slot.
PageActionBar controls placement only. Actions continue to use central
Button, IconButton, or TableActionGroup components. When an action is
visible but unavailable because of permission, target, policy, state, or
validation, keep it in its stable slot and supply disabledReason. Do not
silently hide a normally applicable action.
Forms and Dialogs
- Compose forms from
FormLayout/FormGrid,FormSection, andFormField. - Use
FieldLabelthroughFormFieldfor every field that is not genuinely self-explanatory; record justified omissions in the owning UI ledger. - Use
Dialog,DialogForm,DialogSection, andDialogActionsfor modal work. A dialog can be domain-specific while its anatomy remains central. - Use
useUnsavedDraftGuardfor explicit Discard and guarded navigation on an editable page or dialog. - Explain irreversible or operationally consequential actions before the commit button, including reversibility and durable evidence.
Collections and Details
- Use
FilterBarfor collection query controls andDataGridfor tabular collections. Keep a single orderedTableActionGroupaction set per table. - Use
MetricGrid/MetricCardfor summary measures,CardorContentSectionfor logical sections, andDescriptionListfor labelled facts. - Preserve loaded data after a refresh failure and mark it stale; offer Reload as the recovery action. Distinguish initial loading, empty, unavailable, permission-blocked, conflict, success, and retry states.
Review Evidence
Every new or changed page should have structural evidence for its page frame, semantic action archetype and slot order, shared component usage, stable disabled actions, and module-owned help identity. Keyboard and narrow-layout checks must confirm that all commands remain reachable in DOM order and that the trailing group stays visually trailing after wrapping.