Product UI Patterns
App frame
A fixed sidebar (sidebar-width, 248px) on the left, content on the right. The sidebar holds the wordmark at 24px, the module nav (Pulse, Projects, Flow, Connect) and Workspace settings at the foot. The active nav item uses ignition-tint with ignition-text and a filled dot. Content has a page title (h1), one primary action at the top right, and space-6 between sections.
Pulse: the dashboard
Pulse is the daily destination, so it is calm and sorted by what needs a decision.
- Portfolio first. A list of project cards sorted Stalled, At risk, On track. Each card shows name, stage, health badge, three metrics and a last-synced line.
- Few signals. A project dashboard shows five panels: health, velocity, open blockers, release status, recent activity. Add a sixth only by removing one.
- Explain every state. Clicking a health badge lists the rules that triggered it. A health state is never a black box.
- Show freshness. Every panel carries a "Last synced" time. A stale source is flagged, never hidden.
- One accent. The current stage bar is the only ignition element on a project card. The portfolio view has no other orange.
Health states
| State | Shape | Colour | Label | When |
|---|---|---|---|---|
| On track | Circle | on-track | On track | No rule triggered |
| At risk | Triangle | at-risk | At risk | One or more at-risk rules triggered |
| Stalled | Square | stalled | Stalled | No synced activity for the stage's window |
| No data | Open ring | ink-muted | No data | No connected resources |
Use the .badge classes: badge-on-track, badge-at-risk, badge-stalled, badge-neutral.
Data visualisation
- Choose the chart for the question. Trend over time: a line. Compare items: bars from zero. Parts of a whole: a stacked bar, only when the parts sum to a whole. Ranges: a point with a whisker, not floating bars.
- Colour.
chart-1leads,chart-2(ignition) is for the single series to emphasise,chart-3tochart-5follow. Five series maximum. - Always label directly at the line end or bar, with a legend only as a fallback. Axis text is
captioninink-muted; gridlines areline. - Numbers use tabular figures. Show units in the axis title, not in every label.
- Previous period is drawn in
chart-5(slate) as a thinner line, never in a competing hue. - Never use gradient fills, 3D, or dual axes. Every chart gets a text summary or data table for accessibility.
Forms
Labels sit above fields (field-label). Hints sit below (field-hint). Errors replace the hint and use field-error with a leading sentence that says what to do: "Enter a project name." Required is the default; mark optional fields "(optional)". Primary action bottom-left, aligned with the fields.
Empty, loading and error states
- Empty: one sentence and one action. "Connect a tool to see your first project." plus the Connect tool button.
- Loading: skeleton blocks in
surface-2at the size of the final content, with no shimmer longer than 1.5 seconds. After 10 seconds, say what is slow. - Error: what failed, whether data is safe, what to do. Offer Retry and, where it helps, the sync log.
Writes and destructive actions
BAFOS reads first and writes carefully. Every write to a connected tool shows a preview of exactly what will change, and says whether it can be undone. Destructive actions are confirmed in a dialog, with btn-danger on the confirm button and a calm way out beside it. They are never an accent button.
Responsive behaviour
| Width | Behaviour |
|---|---|
| 1200px and up | Sidebar plus 12-column content, three project cards per row |
| 768 to 1199px | Sidebar plus content, two cards per row |
| Below 768px | Sidebar becomes a top bar and menu, cards stack, tables scroll horizontally in their own container |
| 360px | Every core flow works; no horizontal scroll on the page body |