Calm
Nothing pulses, bounces, or counts at you
Muted palette, low elevation, no attention-grabbing motion, no red guilt mechanics.
There is no streak component and no confetti — not hidden behind a flag, simply
absent. Copy names what is: “Inbox is clear”, never an exclamation mark.
Tokens
Semantic tokens only — no hex, ever
Component CSS reads Layer 2 role tokens (--ornie-surface,
--ornie-accent). Raw palette ramps need a written justification comment
on the line above. An audit script fails the build otherwise.
Theming
Dark mode is free, or the tokens are wrong
data-ornie-theme="dark" on any subtree re-themes everything inside it.
Not one component contains a dark-specific rule; if something looks wrong in dark,
the fix goes in tokens.json. That discipline is what makes user themes
shippable later as pure token-overlay packages.
Naming
Plain daily nouns
Sheet, Dock, Chip, TaskRow — names
a non-designer understands. No BottomDrawer2, no
FABContainer. If a name needs a glossary, it is the wrong name.
Access
AA contrast on every pair, both themes
Full keyboard operation, a visible focus ring, 44px touch targets, and
prefers-reduced-motion collapsing motion in the token layer so no
component ever writes that media query itself.
Scope
The system ships parts; the app ships screens
No onboarding flow, no focus-session component. Anything that feels like a screen is
split into shells and patterns. A component with only one consumer gets inlined in
the app instead of living here.