# Meridian prototype, design system and build notes Static marketing-site prototype. Plain HTML5, vanilla CSS custom properties, vanilla JS. No framework, no build step, no package manager. Run it: `python3 -m http.server 8000` from this folder, open `http://localhost:8000`. Everything below reflects the build as it stands. It supersedes any earlier brief. Where the live site (meridianworkspaces.com) and the original spec disagree, the resolution is recorded under **Open questions**. --- ## 1. Brand palette Sampled directly from the logo file (`assets/logo/meridian-mark.svg`). These four are the entire palette. The mark is mostly ink with a coral eastern half, and the site is built to roughly that same ratio. | Token | Hex | In the logo | Used for | |---|---|---|---| | `--ink` | `#14161C` | ring and wordmark | all text, dark sections, footer | | `--coral` | `#FF7A5C` | eastern half | primary CTA fill, accent rules, chips, highlights | | `--amber` | `#F79E4B` | warm longitude | hover states, Singapore branch colour | | `--sky` | `#8FB8FF` | cool longitude | Copenhagen branch colour, link underlines, washes | `--sunflower`, `--ember` and `--teal` survive as aliases of `--coral`, `--amber` and `--sky` so the component layer did not need a 2,000-line rename. New work should use the names in the table. ### The one rule that matters **Coral, amber and sky are fills, strokes and shapes. They are never text colour on a light background.** All three fail WCAG AA as text on paper (2.30:1, 1.89:1, 1.80:1 respectively). When you want a coloured accent carrying words, invert it: put `--ink` text on a solid accent fill. Ink on coral is 7.05:1, ink on amber 8.57:1, ink on sky 9.01:1. All three accents are deliberately light enough to take ink text, because every one of them is used as a chip or a fill somewhere on the site. This rule has been broken twice during the build and caught both times by the contrast audit. Check any new accent-coloured text against it. ### Surfaces | Token | Hex | Notes | |---|---|---| | `--offwhite` | `#F5F2EC` | page background. Never pure white, it reads cold | | `--surface` | `#FCFAF6` | card faces, one step above the page | | `--surface-sunk` | `#EDE9E1` | alternating section bands, image letterboxes | | `--warmgrey` | `#6C6A73` | muted and secondary text. 4.76:1 on offwhite | | `--line` | `rgba(20,22,28,.10)` | hairlines | | `--line-strong` | `rgba(20,22,28,.18)` | input borders, ghost buttons | ### Washes, for large soft fills `--sunflower-wash` `rgba(255,122,92,.14)` · `--ember-wash` `rgba(247,158,75,.14)` · `--teal-wash` `rgba(143,184,255,.20)` Ink on any wash is 17:1 or better. Warmgrey on a wash is 4.9 to 5.2:1, which passes but leaves little headroom, so do not go lighter than warmgrey on one. --- ## 2. Typography ``` --font-head: 'Hanken Grotesk' headings, numbers, prices --font-body: 'Inter' body copy, labels, UI ``` **These are stand-ins.** The live site serves **Galano Grotesque** (headings) and **Apercu** (body), confirmed from its own `@font-face` declarations. When the licensed files arrive, change the two tokens in `css/tokens.css` and the `` in each page head. Nothing else needs touching. ### Scale | Token | Value | Used for | |---|---|---| | `--display` | `clamp(3rem, 7.5vw, 6rem)` | page-defining headlines | | `--h1` | `clamp(2.4rem, 5vw, 4rem)` | | | `--h2` | `clamp(1.8rem, 3.5vw, 2.75rem)` | section headings | | `--statement` | `clamp(1.5rem, 3.2vw, 2.5rem)` | manifesto and pull-quote type | | `--num` | `clamp(2rem, 4.5vw, 3.5rem)` | large numerals | | `--h3` | `1.35rem` | | | `--body` | `1.0625rem` | | | `--kicker` | `.8125rem` | uppercase eyebrow, +10% tracking, warmgrey. No leading rule: the tracking does that work | | `--micro` | `.75rem` | labels, meta, notes | Headings run `font-weight: 700`, `line-height: 1.08`, `letter-spacing: -0.02em`, tightening to `-0.035em` at display sizes. Body is `line-height: 1.6`. The hero on the homepage scales on **both axes**, `clamp(2.5rem, min(7.2vw, 10.5vh), 6rem)`, so a short landscape monitor shrinks the headline instead of overflowing it. ### The tittle swap The dot on the **first lowercase "i" in every `