Color tokens
Dark mode is default for LGL-OS apps. Violet is identity, not decoration. Status colors are reserved for live, pending, and failure — never decorative.
Typography scale
Inter for UI, JetBrains Mono for timecodes and technical values. Tabular numerals for anything that updates in place.
Form inputs
Square corners, 1px borders, violet focus ring. Labels above inputs, helper text below. No placeholder-as-label.
Tabs & segmented
Underline tabs for major views. Segmented for exclusive options. Pills for filters.
Cards, tiles & rows
Three surface primitives, picked by content shape — not by looks. Square corners always; subsystem accent on the left border of a Card.
- Card — a single bordered section with its own heading. One per logical block (Firmware state, Update policy, Connectivity). If you're repeating it in a list, it's the wrong primitive.
- Tile — a repeating cell in a list or grid (per-node row, per-pair row, stat tile, metric card). Always borderless with
surface="raised"; separation comes from background brightness, not stacked borders. - Row — a dense list item inside a parent Card or Tile. Touch-friendly (≥44px, 56px on coarse pointers). Use when rows share a single outer frame; use Tile when each item is its own block.
Timecode & readouts
Mono everywhere for anything that changes in place — timecodes, bitrates, protocol endpoints. Status colors are never decorative.
Icon set
Line icons at 16px default, 1.4px stroke, rounded joins. Monochrome — color comes from context, never the icon.
Modals, dropdowns & tooltips
Elevated surfaces use the lightest shade in the stack. Shadows reinforce depth in light mode; in dark mode, elevation comes from lightness.