Press response
A press confirms input by changing colour — never by moving the box.
100ms · colour only
Mynos · A console design system
A system for dashboards, workspaces and everyday workflows — the pages people open to find what matters and get things done. A white page, navy ink, rows of 14px type ranked by weight, and one accent that means you can act here.
text-uishadow-ring--primaryFerro & Vale · USD
Principles
The small decisions are already made: where an edge lands, how a title separates from its description, what the one colour means. Each rule below names the file that enforces it, so it can be checked rather than believed.
Nearly everything is 14px. A title separates from its description by stepping to 700 rather than growing, which is what keeps a dense index calm.
globals.css · @utility text-h3 · text-uiAn outline control draws its edge as a 1px box-shadow, so it occupies exactly the box a filled one does and a toolbar never shifts.
ui/button.tsx · shadow-ringA 24px, a 28px and a 40px control all carry 6px — a switch track included, because a switch is a control and not a chip. Chips and counts are pills, structure is square, and nothing in between is invented.
globals.css · --radius: 6pxThe accent fills one action per view and colours the titles you click. It never washes a card, so wherever it appears it means you can act.
globals.css · --primary → --brand-solidCards and rows sit flat on one hairline. Popovers, menus and dialogs carry the overlay shadow, because what they say is that they are not the page.
ui/popover.tsx · shadow-overlay100ms on one decelerating curve, set as the default transition. A hover answers at once, a press has no travel, and nothing moves on its own.
globals.css · --default-transition-durationColour
A palette owns the neutral spine, the brand family and the focus ring — nothing else. Status belongs to the system and holds still under all six, so identity can change without meaning changing.
--background--card--popover--muted--secondary--fieldtext-neutral-solidtext-foregroundtext-muted-foreground-strongtext-muted-foreground--secondary--warning-*--success-*--danger-*Type
One platform grotesque, no web font. Body, labels, cells and actions all sit at 14px, and a title steps to 700 instead of growing. The scale's right column is measured off each specimen, not declared.
Aa Bb 14
ent_4F7K2Q
text-display-2xltext-displaytext-h1text-h2text-h3text-h4text-body-lgtext-bodytext-uitext-ui-smtext-ui-xstext-ui-2xstext-eyebrowtext-captionShape & depth
The corner moves by what a thing is, never by how big it is — 4px on a solid mark, 6px on every control at every height. Depth is just as narrow: three shadows, none of which lifts a card.
rounded-sm4pxSolid marksrounded-lg6pxEvery controlrounded-xl8pxLarge search, segmentedrounded-2xl12pxDetached chromerounded-fullpillCounts and dots onlyLayout
A 4px scale and three target sizes, drawn at their true widths and measured back. The overlay is the same grid the content uses, so it stays true at any width.
gap-1Icon to its countgap-2Icon to label, glyph tile to titlegap-3Controls in a toolbargap-4Label to field, card paddinggap-5The phone guttergap-6Section title to its contentgap-8Group to groupgap-10The desktop guttergap-12Index column gapcontrol-smThe floor for anything clickablecontrolEvery toolbar button and fieldcontrol-lgA page's one prominent actioncontrol-touchA row read by a thumbrowA table rowheaderThe header stripsectionBand padding on a phonesidebarThe railNothing interactive is smaller: a row action, a chip, an inline icon.
The workhorse: every toolbar button, field and select that was measured.
On a phone the row grows to the thumb. The control inside it keeps its size.
The overlay is the same grid the index uses, so it stays true at any width — three columns at 1280px, two at 768px, one below.
Mynos moves with purpose: an immediate answer, one decelerating curve, and nothing that could be mistaken for a change in the data itself. The four recipes loop below — pause them, or replay from the top.
Running. The four recipes advance in order, one duration on one curve, until you pause.
Canonical response
One curve, four state changes
01
Press response
02
State change
03
Selection
04
Bounded loading
A press confirms input by changing colour — never by moving the box.
100ms · colour only
Colour and position move together so a control reads as one event.
100ms · standard easing
A row takes its selection in the same beat, with no slide or fade-up.
100ms · bg + ink
Ambient motion is reserved for work whose completion is unresolved.
while pending only
Cleared this week
67,421.30
68,105.44
A number replaces itself. Nothing travels between two values, so nothing implies a direction.
0ms · transition: none
Ambient motion claims something is unresolved. When it resolves, the loop stops competing for attention.
while pending only
same final frame
Motion off removes the journey, never the destination. No meaning lives in skipped frames.
prefers-reduced-motion: reduce
A hover or a press answers in the same beat it is given.
One decelerating timing function drives every transition.
Nothing grows, lifts or slides — a state change is colour.
Reduced motion keeps every final state and its meaning.
Components
Twenty-four plates, eight to a shelf, dealt at four widths and closing on one line. Every plate names the job it does, states the rule it follows, and shows a primitive doing that job on real entries — so you can type, toggle and open the evidence yourself.
The six variants, ranked
Four sizes, one 6px corner
Nothing pressed yet.
--action fills one button per view. Everything else is outline, ghost or link.
Surfaces
Carrying a mark or a count
drafted · open · cleared · reversed — four states, one ramp.
Small, default, large
A mark on the corner
Everyone on the book
A group shows three and counts the rest. 24 · 32 · 40px.
Paging a book
Counting entries
Stacked
The group keeps its height and its ends. Only the label between them changes.
A toggle reports what the selection already is.
Quiet and outlined
Three sizes, one corner
Held down, and unavailable
Size changes the box. It never changes the corner.
Segmented — inside a panel
Underlined — across a destination
Segmented inside a panel. A line rule for a destination's own sections.
Down to the entry
A slash, where the trail is a path
Two steps is still a trail
The last crumb is the page itself, so it never links to where you already are.
One of three
Any of three
Joined, with no gap
One height at every width — a control's size is its role, not its viewport.
Enter a complete email address.
Never a red edge alone. The sentence under the field is the signal.
Default
Small, for a toolbar
Unavailable
The trigger is a field — same height, same edge, same focus ring.
2 of 18 entries match. The count rides in the field it counts.
A mark and a shortcut
An amount, both ends
A fixed prefix
One ring around the group. The input inside draws none.
16 of 18 entries shown
Off, on, and partly on
Required, and not yet given
Mixed is a real third state, not a half-guessed check.
Next report: Monday 17 March.
Stacked
In a line, when there are two
Decided elsewhere
One is always chosen. There is no way back to none.
On and off
Small, for a dense row
Unavailable, either way
The track carries the 6px corner; the knob inside carries 4.
Roughly is enough here — the field beside it takes exact.
One value
A range, both ends
Stepped, in quarters
Unavailable
A stepped track can only stop where the steps are.
The client sees this on their statement.
Required, and empty
A reason is required.
Two rows to start. It grows by drag, never by surprise.
The same shape, at five weights
Never 'Error'. Say what happened, to how many, and why.
At zero
Underway
Done
No total to report
A known total gets a number. An unknown one gets motion.
Three sizes
Beside a sentence
Inside the control that is busy
A busy control stays disabled until the work finishes.
The same ledger row, loaded and loading
Text, held open to its own 20px line
Held open to a control's own height
Same tracks, same line boxes. Nothing moves when the data lands.
Only the cleared one can be reversed, and only after it asks.
A consequence, spelled out
Nothing to decide, only to read
Open either one to try focus and dismissal.
The confirm button says the verb. Never 'OK'.
Anchored start
Anchored center
Anchored end
Overlays are the only things that lift — --shadow-overlay, and nothing else.
One open at a time
As many as you like
A folded panel holds the real answer — never a teaser for one.
Carrying the shortcut, not the instruction
Above and below
Left and right
Hover or focus. Anything essential stays on the page.
Charts
Your own number is a line in the brand. Categories get three fixed hues, magnitude gets one hue stepping in lightness, and only a lifecycle chart may borrow status. Figures are tabular and every delta carries its sign.
The only chart where the accent draws: the number the page exists to show. The forecast continues it dashed rather than in a second colour, because it is the same series.
Three categoricals is the ceiling. A fourth series is a second chart, not a fourth colour.
Magnitude is one hue stepping in lightness: the bigger the count, the stronger the mark. The palest steps carry an edge, so a small count stays visible on the card.
The one chart allowed the status families: its categories are the lifecycle itself. Every slice also carries its word and its count, so colour is never the only signal.
Screens
Everything above is inventory — the tokens, the type, the shape, the primitives and the charts. This is what they add up to. Each panel below is a live route from the screen library, running in a frame that follows the palette and mode you are reading in. Six shells, one language.
Loading /dashboard-001 …
Cash position tiles by book, the last seven days of money in and out, entries waiting on an owner, and clients owing in a quiet side panel.
Segment cards with counts, dashed filter chips, Export and New entry, the entries table, results caption and page strip.
The amount as the title with its status, facts, the drafted to cleared timeline, related entries, and a client card and actions.
A thread list in the rail beside one chat column — the open thread's header, messages that show the assistant's working, and a composer that never scrolls away.
A profit-and-loss statement for the quarter: income and expenses by category against a year earlier, and the net that follows.
The owner's Desk under a thumb: four tiles two across, the entries waiting longest, and the clients who owe the most.
These six are a sample. The library carries 103 built screens across 13 categories, beside 63 composition blocks and 5 demo applications — every one a route or a file in this repository, on the tokens argued for above.
Browse the screen libraryThe end of the argument · the start of the work
If a primitive needs a hex, the token set is short a token — so you add the role, then use it. One attribute on <html> swaps every palette above, and nothing in src/components/ui knows which one is on.
White page, navy ink, 14px ranked by weight, a 6px corner that never scales, and one accent that means you can act here.