Skip to content
Documentation

UI development

bin/dev ui
bin/generate-tokens --check
bin/sync-brand-assets --check
bin/build ui

The supplied Angular Open Bay SVGs and complete semantic light/dark JSON are authoritative. ui/brand/provenance.json records original paths and SHA-256. Token generation produces CSS, TypeScript/native maps, and Android colors from one JSON source. Do not hand-edit generated exports.

Use Inter 400/500/600/700 with system fallback, a 4 px spacing base, 10 px controls, 16 px cards, 20 px dialogs, 44 px interaction targets, and 160 ms motion that respects reduced motion. Fonts are local. Use supplied outlined logos, minimum 180 px horizontal, 32–47 px compact, or 16–31 px micro, with clear space.

Components

FhButton, fields, select/checkbox/radio/switch, dialog/confirmation/popover/menu, tabs/tooltip/toast, avatar/status/skeleton/empty states, shell/navigation, message and composer, event/form, member/profile, and theme controls are exported from @firehall/ui. Reka owns suitable interaction mechanics; Firehall owns styling and typed props/events. FhIcon exposes a curated Font Awesome Free vocabulary; decorative icons are hidden from assistive technology and icon-only buttons need labels. No remote Font Awesome kit is loaded.

Messages distinguish local preview, sending, failed, and sent presentations. Only the explicit preview creates local messages, always marked as preview. Most surfaces stay neutral. No tagline, decorative edge strips, emergency indicators, external avatar service, or oversized marketing headings belong in app screens.

Checks

Playwright captures the major compositions in light/dark at 320, 390, 768, and 1440 px. Reviewed baselines live in ui/tests/browser/baselines; failures and traces go to .firehall. Axe scans, labels, keyboard dialogs, focus restoration, tabs, long content, and text scaling are tested. A passing automated scan does not replace manual assistive-technology/device review.

Non-emergency communication only. Not for dispatch or emergency response.