Kiri Design System
Kiri’s design system: warm, editorial Japanese-craft language with lacquer browns, paper neutrals, and a serif/sans pairing.
This file is the human-readable mirror of docs/design.md (the source of truth). Both update together.
Brand
The Kiri mark: the bronze jeweler's loupe beside the tracked small-caps wordmark ("All-Caps Small-Caps Trailed"). Newsreader SemiBold, uppercase, +0.125em tracking, a 1.5:1 icon-to-text ratio at every size.
Lockup · master and context sizes, 1.5:1 icon-to-text
On the dark anchor · footer and cta-band grounds
Colors
Natural materials named in Japanese: Urushi lacquer ink, Haku bronze accents, Suna sand and Kami paper surfaces. Toggle dark mode (top right) to see the inverted roasted-brown set.
Tonal ramps · hover a cell for its hex
Semantic mapping · core
Surfaces
Semantic & categorical
Typography
Newsreader (Production Type, free via Google Fonts) for headings (chosen over paid transitional serifs as the closest free equivalent) and Geist (Vercel) for everything functional. Money always uses tabular numerals.
Spacing
4px base scale. Default to space-5 (24px) card padding; keep card grids catalog-generous.
Radius
Radius scales with component size: badges xs, buttons/inputs sm, cards md, modals lg, chips/pills full.
Elevation & Depth
Essentially flat: depth comes from warm surface steps and hairline borders. Shadows only on floating layers (modal, drawer, toast, menus), always brown-tinted.
System
Breakpoints, container, motion, focus, and layering: the invisible tokens that keep builds consistent.
Breakpoints & container
Motion · three durations, ease-out, slow tier off under reduced-motion
Focus · 2px accent ring, 2px offset, on every interactive element
Z-index scale
Interaction & keyboard · Esc, arrows, focus traps, ARIA
| Surface | Keyboard | ARIA |
|---|---|---|
| Modal & drawer | Esc closes · Tab trapped · focus returns to trigger | role="dialog" aria-modal, labelled by title |
| Menus (dropdown, user, kebab) | ↑ ↓ cycle · Home/End jump · Enter activates | menu pattern · trigger carries aria-expanded |
| Card search | ↑ ↓ highlight · Enter selects · Esc clears popup, then query | combobox with listbox popup |
| Tabs & segmented pills | ← → move · Home/End jump | tablist / tab / tabpanel |
| Date picker | Arrows move by day · PgUp/PgDn by month | grid pattern · aria-selected |
| Range slider | Arrows adjust · Shift for 10× steps | role="slider" with aria-valuenow |
| Sortable headers | Enter / Space toggle | aria-sort on the active column |
| Toast | Never takes focus · auto-dismiss 5s, hover pauses | polite live region |
| Icon-only buttons | Standard activation | always aria-label |
Voice & formatting · money, time, truncation, tone
| Rule | Example |
|---|---|
| Card prices always show two decimals | $0.25 · $42.00 |
| Aggregates past $10,000 drop cents | $14,208 |
| Percentages show one decimal | 3.2% · never 3% or 3.24% |
| Time is relative under 24 hours | 12 minutes ago · 2 hours ago · Yesterday · June 12 · June 12, 2025 |
| Card names truncate to one line | Kiri, Mist Courser of the End… (full name in the popover) |
| Numeric columns right-align, tabular | 1,204 |
Say
- Deck saved to your collection.
- No cards found. Try another game.
- Add your first card
Don't say
- Success!! Your deck has been saved!
- ERROR: query returned 0 results
- You don't have any cards yet :(
Iconography · Lucide, three sizes only
Brandloupe · brand mark
Actions
Three button weights. Static copies show hover and disabled states without interaction.
Buttons · three weights and their states
Copy button · confirms with a moss check for two seconds
Loading state · width holds, label becomes spinner + progress verb
Forms & Inputs
The intake kit for portfolio flows: inputs, selects, steppers, the card-search combobox, variant pickers, and price alerts.
Text inputs
Select & stepper
Checkbox & radio
Form field · label + control + help / error
Tag input · Enter or comma commits, Backspace removes
Card search · combobox with results open
Origins · 042Mythic$42.00
Origins · 118Uncommon$0.85
Empire · 007Rare$6.40
Search overlay · the command layer (nav well or ⌘K)
Date picker & range slider
Auth card
Price alert
Chips & Badges
Chips filter and tag; badges mark rarity and status; the freshness chip is mandatory on every pricing surface.
Rarity ladder · six game-agnostic tiers
Rarity badge · standard wash + dense dot variant
Cards
Panel cards, content cards with the corner-notch action, feature cards, and the card-image frame.
Panel cards
Kiri, Mist Courser
Legendary mount. When Kiri attacks, draw a card for each ally that shares its clan.
Kiri, Mist Courser
Border strengthens to border-strong with a 2px lift. No shadow.
Card grid tile · the browse/search workhorse (hover reveals quick-add)
Content cards · hover any card: the notch arrow expands into Read More
Tired of set reviews that assume you have a full playset budget? We cut through the noise with 10 cards organized by deck archetype.
Whether you're new to ranked play or returning after a break, the best starting deck depends on your playstyle.
Whether you're new to ranked play or returning after a break, the best starting deck depends on your playstyle.
Feature cards · illustration well + serif caption
Club Admin
Visitor
Editorial
Article typography and the sidebar widget set.
Immersive article header · card-featured at page scale
Three spikes in twelve months is not hype, it is a supply story. We chart every reprint rumor against the price line.
Article layout · prose + sidebar widgets
The netdeck movement promised consistency and speed. But 2026 has revealed the true cost of copying lists without understanding them: stale metas, brittle play patterns, and games that feel solved before they begin.
The Origins II limited environment (which released yesterday) confirmed what judges have been signaling for months: sealed-first formats reward genuine card evaluation over memorized answers.
- Card evaluation from the ground up. Every pick gets judged in context, not against a tier list.
- Synergy as a design requirement. The pool you open enforces creative deckbuilding naturally.
- Flexible strategy without meta gaps. Whatever you open, your fundamentals carry the game.
Prose extras · blockquote, code, figure
“Sealed taught me more about card evaluation in one weekend than a year of netdecking ever did.”
Deck imports accept plain text lists, one card per line: 4 Kiri, Mist Courser. The API returns each card's variants with price history:
→ { "price": 14.91, "priceChange30d": 6.2, "priceHistory": [...] }
Accordion · FAQs, rules text, collapsible filters
Marketing
Public-site compositions: hero, section headers, pricing, and the closing CTA band.
Hero
Track prices across Magic, Pokémon, Yu-Gi-Oh!, and Sorcery. Add cards in seconds, follow every swing, and trade with confidence.
Section header
Pricing · the featured tier carries the only primary button
- 100 cards tracked
- Daily price updates
- 1 price alert
- Unlimited cards
- Portfolio P&L and cost basis
- 20 price alerts
- CSV import
- Everything in Trader
- Bulk tools and exports
- Unlimited alerts
CTA band · closes public pages
Community & Trading
Trader profiles, two-sided trade offers, fulfillment timelines, ratings, and comments.
Profile header
Trade offer · Accept is the only primary button
Trade timeline · fulfillment status
Comments · reply indented behind a hairline
Data & Tables
Tables, holdings, stat tiles, the price matrix, and position panels. Money is always tabular-numeral Geist.
Holdings table · filter bar, sortable headers, P&L, sparklines, row actions
| Card | Rarity | Cond. | Qty | Cost | Price ▼ | P&L | Trend | |
|---|---|---|---|---|---|---|---|---|
| Kiri, Mist Courser Origins · 042 |
Mythic | LP | 2 | $61.00 | $84.00 | +$23.00 | ||
| Paper Crane Scout Origins · 101 |
Common | NM | 12 | $4.80 | $3.00 | −$1.80 | ||
| Bronze Familiar Empire · 033 |
Rare | NM · Foil | 1 | $3.00 | $3.10 | +$0.10 |
Holdings row · mobile collapse below 640px
Bulk selection · checkbox column + floating action bar
| Card | Qty | Price | |
|---|---|---|---|
| Kiri, Mist Courser | 2 | $84.00 | |
| Paper Crane Scout | 12 | $3.00 | |
| Bronze Familiar | 1 | $3.10 |
Filter panel · browse-page facets
Sort control · for grids, where tables use sortable headers
Stat tiles · portfolio metrics
Price matrix · condition × printing · one language at a time (English default; others behind a language select)
| Condition | Normal | Foil |
|---|---|---|
| Near Mint | $42.00 | $96.50 |
| Lightly Played | $36.80 | $81.20 |
| Moderately Played | $29.40 | $64.00 |
Position panel · your holding on a card page
Charts & Portfolio
Lightweight Charts theme, rendered here as static token-styled mocks. Area/line only; bronze for neutral series, moss/crimson strictly for direction.
Chart baseline · day-one state (solid line at today's value, terminal dot)
Portfolio hero · dashboard lead
Price chart · single card
Comparison chart · two series max, slate joins bronze
Allocation bar · portfolio distribution
Sparklines · inline trend for tables and card rows
Feedback
Alerts (semantic wash), toast, tooltip, skeleton loading, and empty states.
Banner · page-level system strip, full-width under the nav
Progress bar · determinate loads like imports and syncs
Alerts & toast
Tooltip
Skeleton loading · paper shimmer, never gray
Empty state
Overlays
Modal for decisions; drawer for flows. Both float on surface-raised behind the warm scrim.
Modal
Delete this deck?
“Mist Riders v3” will be removed from your collection. This can't be undone.
Popover · card preview on a dotted-underline trigger
Drawer · add-card flow
Origins · 042Mythic
Settings & Pages
Settings sections, the API key row, the danger zone, error page templates, and the onboarding checklist.
Settings billing card · plan + live usage meters (free tier)
Settings section · title left, card right, Save bottom-right
Danger zone · always the last settings section
Error page · 404 and 500 share the template
Onboarding checklist · dismissable once complete
Do's and Don'ts
Do
- Set every heading in Newsreader and every functional string in Geist.
- Build depth from surface steps and hairline borders; shadows for modals, drawers, menus, and toasts only.
- Keep the paper-and-lacquer warmth: warm neutrals, brown-tinted shadows, earthy semantics.
- Use label (10px, 0.04em, uppercase) for all micro-text: table headers, badges, eyebrows.
- Give card grids catalog-like breathing room: 24px padding, 16px+ gutters.
- Show money in tabular numerals; color gains moss and losses crimson, and pair every price with a freshness chip.
Don't
- No blue-purple gradients, glassmorphism, neon glows, or generic-SaaS styling.
- No cold pure grays or stark #FFFFFF; every neutral carries the warm cast.
- No heavy shadow stacks or saturated accents; the system is quiet and flat.
- No kitsch-Japanese ornament: no cherry blossoms, torii gates, brush-script fonts.
- Never headings in Geist, body in Newsreader, or a third typeface.
- Don't over-round: cards cap at md (12px), buttons at sm (8px); pills only for chips, secondary buttons, and segmented controls.