
DESIGN.md
# Onyx — Design System ## Concept Most roasteries sell warmth: cream paper, soft daylight, a friendly cup. Onyx does the opposite. It stages First Crack Coffee Roasters as a performance held after dark — the roaster as a machine under a spotlight, the drum as an engine, the batch as a reveal. The canvas is a cathedral of true black. Beans, the bag, the drum emerge from that black under a single hard light; everything else is void. This is roasting as spectacle: high heat, the audible first crack when the beans ignite, the dark-roast theater of a nocturnal, exclusive craft. The name is **Onyx** — the black stone, and the color the whole page is cut from. First crack is the pivotal, loud moment of a roast; the design keeps that register everywhere. Type SHOUTS in uppercase at architectural scale. Corners are sharp — zero radius, non-negotiable. There is exactly one warm color in the building, **Lamborghini Gold**, and it is spent on a single thing: the button that says order. Everything else is white, gray, and darkness. The register is theatrical and technical, not cozy. No latte-art romance, no smiling-customer stock, no daylight. Darkness is the whitespace. A single origin name floating in a black viewport carries the weight of an exhibit on a gallery wall — the absence of color *is* the design. ## Palette | Token | Hex | Role | | --------------- | ---------------------- | ---------------------------------------------------------------- | | `--void` | `#000000` | True black. Dominant canvas — page floor, hero, nav, most panels.| | `--iron` | `#181818` | Deepest elevated surface. Footer and deep sections. | | `--charcoal` | `#202020` | Primary card / panel surface sitting above the void. | | `--graphite` | `#494949` | Top surface layer, 1px hairlines, dividers, hex strokes. | | `--gold` | `#FFC000` | Lamborghini Gold. **Primary CTA fill only** — nothing else. | | `--gold-press` | `#917300` | Dark gold. Active / pressed state of the gold CTA. | | `--gold-text` | `#FFCE3E` | Inline gold accent. Scarce: text links (hover), featured badge. | | `--white` | `#ffffff` | Display headlines, primary text on the void. | | `--smoke` | `#f5f5f5` | Lead paragraphs, subheads — a half-step under pure white. | | `--ash` | `#b0b0b0` | Default running body text on the void. | | `--steel` | `#8a8a8a` | Captions, metadata, spec labels, fine print (AA-safe on black). | | `--ghost-line` | `rgba(255,255,255,.5)` | Ghost secondary button border — 1px white at 50% opacity. | Rules: - Black dominates. `--gold` never exceeds roughly 3% of any viewport; there is **one** gold element per view — the primary CTA — and nothing decorative is ever gold. - No gradients on UI. No drop shadows — on a black canvas shadows are invisible. Depth is built by surface layering only: `--void` → `--iron` → `--charcoal` → `--graphite`. Elevated elements are literally lighter than their ground. - All grays stay achromatic — pure neutral, no warm or cool tint. The only warmth in the interface is the gold CTA and the gold light inside photography. - `--gold-text` is the single place gold touches running content: a text link on hover, and the roast-level word inside the featured origin's hex badge. Never a gold headline, never gold body copy. ## Typography Two faces, two jobs. Both self-hosted woff2 under `assets/fonts/` via `@font-face`; no font CDN. - **Display — Anton** 400. The shouting voice: an ultra-condensed grotesque that stands in for Lamborghini's LamboType. Uppercase always at display sizes, tight line-height, near-zero tracking (the face is already dense). Weight 400 carries every headline — Anton is distinctive enough that bold would be noise. At most one hero-scale headline per viewport. - **Body / UI — Inter** 400 and 500. Plain, legible, upright. Body copy, nav, buttons, spec labels, captions. Eyebrow labels and button text are uppercase Inter 500 with positive tracking; running body stays sentence case. Type scale (desktop / mobile): | Role | Desktop | Mobile | Face | | --------------- | ------------ | ------------ | --------- | | Hero Display | 120px / 0.92 | 56px / 0.95 | Anton 400 | | Display L | 80px / 1.0 | 44px / 1.05 | Anton 400 | | Section Title | 54px / 1.05 | 34px / 1.1 | Anton 400 | | Sub-section | 40px / 1.1 | 28px / 1.15 | Anton 400 | | Feature Heading | 27px / 1.19 | 22px / 1.25 | Anton 400 | | Body Large | 18px / 1.56 | 17px / 1.6 | Inter 400 | | Body / UI | 16px / 1.5 | 15px / 1.55 | Inter 400 | | Button | 15px / 1.0 | 15px / 1.0 | Inter 500 | | Label | 12px / 1.4 | 12px / 1.4 | Inter 500 | | Micro | 10px / 1.6 | 10px / 1.6 | Inter 400 | Principles: - **Uppercase is the default voice** at every display tier — Hero through Feature Heading. Mixed case appears only in body-size Inter. - **Tight line-heights at scale** (0.92–1.19) stamp headlines into dense, architectural blocks that read as steel, not typeset paragraphs. - Anton tracking sits near 0 (Hero `-0.5px`, Section Title `0`). Uppercase Inter **labels track `+0.16em`**, buttons `+0.04em`, Micro `+0.02em` for legibility. - Numbers matter here: brew and roast figures are set large in Anton inside the spec panel (see Components), not buried in a sentence. ## Spacing & layout - 8px base unit. Section padding 120px top/bottom desktop, 64px mobile — the generous void between blocks is the breathing room; darkness is the whitespace. - Content max-width 1280px, 12-column grid, 24px gutters. Hero and full-bleed photography break the grid to fill the viewport edge to edge. - **Border radius is 0px everywhere — buttons, cards, panels, images, the hex badge's straight edges.** Sharp rectangles and sharp vertices are the signature; there is no radius token and no exception. Images are square-cut. - Left-aligned display and content throughout. Centered text appears only in the full-bleed CTA band. - Hero and story bands use a 7/5 split (headline left, image right), collapsing to a single column on mobile — headline first, image below. - Section dividers are 1px `--graphite` rules, occasionally carrying a small uppercase Inter label (e.g. `02 — SOURCING`) sitting on the rule like a plate. ## Signature Two elements carry the identity, both direct translations of the reference's hexagonal DNA and spotlight staging into coffee. ### 1. The hex roast badge The hexagonal motif, made coffee-native. A **flat-top hexagon** (inline SVG, sharp vertices — it obeys the zero-radius law by nature) encloses the roast level: `LIGHT`, `MEDIUM`, or `DARK` in Inter 500 uppercase. A 1px `--graphite` stroke by default; on the featured origin it strokes `--gold` and the word turns `--gold-text`. A small **roast dial** rides beneath — three hex pips, filled `--white` up to the batch's level (one for light, two for medium, three for dark) — so the badge reads at a glance without color-coding. A tiny solid hex also replaces the list bullet before every eyebrow label and footer link, threading the geometry through the whole interface. ### 2. The spotlight origin card The three origins are staged like machines under a spotlight, emerging from black. Each card is a full-bleed high-contrast studio shot of the beans on the void — no visible frame, the image crushing to true black at its edges so it bleeds into the canvas — with the origin name in Anton (Section Title) laid over the dark base, the hex roast badge, tasting notes, and a spec row. The **house origin, San Agustin (medium), is featured**: it takes a 1px `--gold` hairline frame, the gold hex badge, and a 2px gold underline beneath its name. The two others stay white/graphite. On an all-dark stage, gold *is* the spotlight — that is the featured signal, the way a car reveal lights one vehicle. ## Components - **Nav.** Floats in the darkness: transparent (inherits `--void`), fixed to top, **no background, no border, no shadow** — just marks hanging in black. A small solid hex + `FIRST CRACK` wordmark (Anton, small, uppercase) at left; `BEANS` / `ABOUT` links right in Inter 500 uppercase 12px `--white`; the single gold `ORDER BEANS` button at the far right. Active page gets a 2px `--white` underline and `aria-current="page"`. - **Primary button (gold CTA).** The only gold surface on the page. `--gold` fill, `--void` text, **0px radius**, 20px/28px padding, Inter 500 uppercase, `+0.04em` tracking. Active/press darkens to `--gold-press`. Carries the content's one CTA intent — "Order beans" → the beans page. One per view. - **Ghost button (secondary).** Transparent fill, 1px `--ghost-line` border (white at 50% opacity), `--white` text at full opacity, 0px radius, 16px padding, uppercase Inter 500. Hover: border goes full-opacity white and the fill shifts to `--charcoal`. Never becomes a light-filled button — only the gold CTA fills. Used for "Read the story" / "Visit us" secondary actions. - **Text link.** `--white` with a 1px underline; hover shifts text to `--gold-text`. The one place gold appears inside running copy. - **Spotlight origin card.** As specified in Signature — image bleeding into the void, Anton origin name, hex roast badge, tasting notes in `--ash`, and a spec row of uppercase Inter labels: `WASHED · 1,950 M · GEDEO ZONE, ETHIOPIA`. Featured (San Agustin) carries the gold frame, badge, and underline. - **Brew spec panel.** Parametric data staged as a machine's technical readout. A `--charcoal` panel, 0px radius, titled `POUR-OVER` or `ESPRESSO` in Anton Sub-section. Each parameter is a stat block: the **figure large in Anton** (`250`, `94°C`, `28 S`) over a small uppercase `--steel` Inter label (`WATER`, `TEMP`, `SHOT TIME`), separated by 1px `--graphite` rules. Pour-over reads 15 g coffee · 250 g water @ 94°C · medium-fine grind · 3:00; espresso reads 18 g in · 36 g out · 28 s · 93°C. Numbers are the hero here, not prose. - **CTA band.** Full-bleed `--void` (or dark photography), centered: an Anton Display L line and the single gold CTA. The one centered moment on the site. - **Footer.** Full-width `--iron` — the deepest surface. Hex mark + `FIRST CRACK` wordmark in `--white`, uppercase Inter column links in `--steel` (each led by a small hex bullet), the 412 Foundry Lane address, cafe hours, and roast-day note. Never inverts to a light surface. ## Motion Color and opacity only — **no scale, no translate** (movement of the geometry would contradict the stamped-steel stillness). On load, the hero headline fades in (opacity 0 → 1 over 0.6s), then the gold CTA and hex badge fade in staggered just after. Everything else is hover feedback: 120ms ease on color, opacity, and border — the gold CTA darkening to `--gold-press`, a ghost border going solid, a link turning `--gold-text`. Under `prefers-reduced-motion: reduce`, all content renders complete and static with no fade. ## Image treatment Cinematic and nocturnal. Every subject emerges from true black under a single hard, warm key light — beans, the bag, the drum, the pour — with deep shadows crushing to `#000000` at the frame edges so the photograph bleeds seamlessly into the canvas with no visible border. Desaturated throughout except a gold rim-light catching bean sheen, steam, or the drum's flame-glow. High contrast, low key, 16:9 or wider for heroes and near-square for origin product shots. Square-cut, no filters or rounded frames. No latte-art, no smiling-customer cafe stock, no bright daylight flat-lays — light is the exception, darkness the rule. Needed images: - `hero-bag` — index hero. A First Crack coffee bag and a cascade of roasted beans emerging from pure black, single gold rim-light along one edge, faint steam. Full-bleed 16:9+. - `drum` — index roasting-process section. The drum roaster under a hard spotlight on black, gold flame-glow at the drum mouth, deep shadow surround. - `origin-yirgacheffe` — light-roast Yirgacheffe beans as a high-contrast studio shot on black, cool low-key light, pale bean sheen. Near-square. - `origin-san-agustin` — the featured house origin: medium-roast San Agustin beans, warmer gold rim-light, staged like a spotlighted reveal on black. - `origin-kerinci` — dark-roast Kerinci beans, oily sheen, deepest shadow, emerging from black. Near-square. - `pour` — beans page brew section. A pour-over mid-pour, dark scene, a gold-lit water stream and steam against black. - `space` — about page visit section. The 412 Foundry Lane roastery/cafe at night, industrial and low-key, a single warm light source, on black. - `cupping` — about page story section. A cupping spoon and bowls under a spotlight, dark documentary framing, steam catching the light. ## Do / Don't Do: - Anchor every page on true black `#000000`. Dark gray as a substitute reads as any other dark theme; the uncompromising void is the brand. - Spend gold on exactly one thing per view — the primary CTA. If a second gold element appears, remove it. - Set every display headline in Anton, uppercase, weight 400, with tight line-height. Let the type SHOUT. - Keep corners sharp — 0px radius on buttons, cards, panels, images, and the hex badge, everywhere, always. - Build depth by surface layering (`--void` → `--iron` → `--charcoal` → `--graphite`), never by shadow. - Thread the hexagon through the interface — roast badge, bullet, footer mark. - Let cinematic photography carry the emotion; keep the UI as infrastructure. Don't: - No second accent color — the monochrome-plus-gold system is sealed. No gold headlines, gold body, or decorative gold. - No border-radius, anywhere. No rounded buttons, cards, or images. - No bold display type — Anton stays 400; the face is loud enough. - No gradients, no drop shadows, no glows on UI. - No lowercase in display headings; uppercase is the authority. - No hover scale or translate — interactions are color and opacity only. - No light canvas as the default; light is the rare exception, darkness the rule. - No emoji, no decorative icons doing a label's job, no latte-art lifestyle photography.