Make the right thing easy and the wrong thing hard.
Justin's users operate in stressful, critical situations where outcomes depend on getting things right. Every rule below serves that one goal: guide people toward successful actions and make mistakes difficult to make.
HTML first, CSS second, JavaScript last
Native elements before custom widgets: <details> for disclosure, <dialog> for modals, <select> for dropdowns. Modern CSS (:has(), light-dark(), container queries) before reaching for JavaScript. JavaScript only
when HTML and CSS demonstrably can't do the job.
Tokens are the source of truth
Colors, spacing, typography, radii, shadows: one shared vocabulary, expressed as CSS custom properties on the web and Kotlin objects in Compose. No hardcoded design values anywhere in component code — a component asks for a role, never a raw value.
The rest of the rules
-
Accessibility is a default, not a feature
Every component ships with semantic markup, keyboard navigation, sufficient contrast, focus indication, and respect for
prefers-reduced-motionandprefers-color-scheme. Accessibility is part of "done", not part of "later". -
Material 3 Expressive
Justin's vocabulary derives from Material 3 Expressive — color roles, type scale, motion easing, surface containers. Familiar to any Material consumer, customised to Davidhorn's brand.
-
Two platforms, one feel
A button in Capture (KMP) and a button in Ark (Svelte) use the same color role, the same corner radius, the same spacing. Either codebase looks like the same product.