Design System · Elements

Elements

The indivisible atoms — a single design class each: a button, a link, an input, a chip, a platform tile, a star rating, a quotation. Elements carry no layout opinions of their own; they’re the smallest pieces that Objects and Components snap together.

01

Buttons & links

One primary action per view, in black (--ink-900). Everything else is secondary (outlined) or quiet (text). Destructive actions read in red but stay understated. Orange is reserved for brand & wayfinding — never a button fill.

Primary ink-900 bg + white text (~16:1) → hover lifts to --ink-800 · soft neutral shadow for a floating-CTA feel · Secondary surface + strong border · Quiet text-only · --size-ctl (34px) tall, --size-ctl-sm (28px) small · focus = --focus-ring.
On-dark — a real outlined button for the ink-900 header (.km-btn--ondark): transparent fill, --ondark-line border, --ondark-hover wash on hover. Inherits the full button contract so it can never wrap or de-centre.
Links brand-press, underline on hover · external links get a ↗ and open in a new tab. Public platform links use this style on cards.

Icon micro-motions on buttons

Every glyph owns one move. Hover previews it (bell swings, refresh half-turns, trash leans, upload rises); the glyph’s own event plays it in full — .km-ic-swing · .km-ic-turn · .km-ic-tilt · .km-ic-rise · .km-ic-spin while syncing. One glyph at a time, never ambient.
02

Form fields & textareas

Calm inputs with a clear focus state. The intake textarea is the most important field in the app — make it inviting and large.

Shown on Krown.com and synced platforms.
Plain language is fine — the system will tell you what it understood before anything happens.
Input surface + strong border · focus = brand border + 3px brand-tint ring · labels are 12px semibold ink-700 · hints are 11px ink-500.
03

Chips, status pills & platform indicators

The most-repeated, most-abusable elements in the app. Lock them now. Status pills always pair colour + dot + word. Live platform tiles fill green to match the Published pill; not-live tiles stay neutral and a corner dot names the work that's left.

Status pills

Published Live Manual desk task Awaiting review Inactive Failed Draft 12 locations
Pill 22px · tint bg + status text + 6px dot · --plain variant (no dot) for neutral counts/tags so it never reads as a status.

Platform indicators

Live (link)
Manual
Not set
Coverage row (K · G · A · B)
No brand-colour rainbow. Real platform marks render monochrome — never in their own brand colours. Live tiles fill green to match the Published pill (one colour, so a fully-live row reads as “done” without rainbowing) and carry no dot — the fill is the signal. Not-live tiles stay neutral and the corner dot names the state. Live tiles are links; manual/not-set are non-clickable. title/aria gives the full name on hover & to screen readers.

Tile status system

A live tile is a square sibling of the Published pill — same green fill, same green glyph, no dot, because the fill already says “done”. Every not-live tile stays neutral; its corner dot names the one thing left to do. So a row of green = fully live, and the only marks left on a card point at real work.

TileStateReads as
Live · green fill · no dot · linkPublished and reachable — the tile opens the public profile. A platform counts as live even if it was published by hand (Apple/Bing).
Action needed · amber dotConnected but waiting on a person — a manual desk task or a pending review.
Not connected · hollow ringNo matching listing found. The slot is genuinely empty — free to create a new listing from scratch.
Not connected — possible match · filled ringAn existing listing shares this address under a different business name. Worth checking first to link, request access, or knowingly create a separate listing.
Sync failed · red dot · optionalWas live, last push errored. Borrows the system --block hue; pairs with a retry.
Three states cover the everyday — Live, Action needed, Not connected. Add Sync failed (red) only where a platform can break after going live.
Green = live, not automatic. A platform is live the moment it’s published — including a hand-published Apple or Bing listing, which fills green exactly like Google. We reward the outcome, never the mechanism, so the “all-green” board stays winnable for every location.
Two flavours of not-connected. A hollow ring means the slot is truly empty — no listing found anywhere, so create freely. A filled ring (same light hue) means a listing already exists at this address under a different name. Same neutral tile, no new colour introduced.
04

Star rating

Literal stars, but monochrome — keeping the house rule that icons never carry their own colour. Filled (ink) = the score; hollow (border-grey) = the remainder. Rating reads from the count of filled stars, never from gold. Gold/amber was rejected: amber already means “pending” in the status system, and gold would be the first icon allowed its own colour.

5-star
3-star
1-star
.km-stars — the Stars component renders filled + hollow glyphs. .on = --ink-700, .off = --border-strong.
05

Quote

Review text — and later, customer messages — are quotations, not our copy. The block opens with the system's filled quote glyph in muted --ink-500 in place of a grey left rule, so it reads as a quiet ornament; the quoted text sits at --ink-900 regular so it's the primary read.

Great service — they did every part, very nice to deal with.
.km-quote — flex row: .km-quote__mark (the glyph) + the quoted text. Weight, not colour, separates it from names.