Pangram Pangram — Design System
The full decoded design system for Pangram Pangram: color roles, type scale, spacing, radii and paste-ready DESIGN.md / Tailwind / CSS exports.
This is a static, crawlable rendering for search & AI engines. The interactive version — filters, live decode console, copy & export — is at https://mozaika.design/ds/pangram-pangram.
Tokens
Pangram Pangram's decoded design system: background #FAFAFA, text #000000, accent #FF2F00, link #FFB700, primary #FF2F00; type scale h1 14px / h2 194.224px / body 22.4256px; 4px spacing base; 20px base radius. The single interactive/action color is #FF2F00 — used only on interactive or must-notice elements (buttons, links, key highlights), never on large fills.
Color roles
| Role | Value |
|---|---|
| bg | #FAFAFA |
| surface | #EBEBEB |
| border | #D4D4D4 |
| text | #000000 |
| text_muted | #5F5F5F |
| primary | #FF2F00 |
| accent | #FF2F00 |
| link | #FFB700 |
| secondary | #1990C6 |
| button_bg | #FF2F00 |
| button_text | #000000 |
Using these colors
- Action color
#FF2F00— the single interactive color; only on things you click or must notice, never large fills. primary,accent,button_bgare all#FF2F00— one role, not several (the action color).- accent
#FF2F00— THE accent / action color — interactive & must-notice only (buttons, links, focus, one key highlight); never large fills or backgrounds. Scarcity is what makes it read as designed. - link
#FFB700— fails contrast on the background (~1.7:1) — this is a dark UI color, NOT a readable link; use the text or action color for links (verify against the reference). - secondary
#1990C6— optional secondary accent — LOW decode confidence; use rarely (a status color or a single decorative moment) or omit it entirely. Prefer one accent unless the reference clearly shows two.
Typography
- Heading: Neue Montreal
- Body: Neue Montreal
- h1: 14px
- h2: 194.224px
- body: 22.4256px
Spacing
- base unit: 4px
- scale: 4px, 8px, 12px, 15px, 20px, 23px, 24px, 26px, 31px, 36px
Radii
- base: 20px
- button: 20px
Shadows (elevation)
- card:
rgba(63, 63, 68, 0.4) 0px 4px 10px 0px
Motion
Micro-interactions run at 200ms (dominant) with ease.
- durations: 200ms · 500ms · 100ms
- easings:
ease·cubic-bezier(0.22, 1, 0.36, 1) - animated properties: color, background-color, transform, opacity
Native design tokens
| Token | Value |
|---|---|
--duration-short | .1s |
--duration-default | .2s |
--duration-medium | .3s |
--duration-long | .5s |
--duration-extra-long | .6s |
--duration-extra-longer | .75s |
--duration-extended | 3s |
--ease-in-cubic | cubic-bezier(.32, 0, .67, 0) |
--ease-out-cubic | cubic-bezier(.33, 1, .68, 1) |
--ease-out-sine | cubic-bezier(.61, 1, .88, 1) |
…and 21 more measured on the page.
Layout (measured)
- container max-width:
1260px - nav: 54px absolute
Motion choreography (measured)
Load order: div.loading__spinner×24 → div.mini-carousel__slider → div.section-margin → div.section-margin → div.section__section-header×4 → div.section__section-header×4
Scroll reveal: 18 elements rest at opacity 0, translateY(32px), animate in over 0.75s cubic-bezier(0.22, 1, 0.36, 1).
Stagger: li ×10 — 100ms apart.
Overlay recipe (measured)
dialog panel: #FFB700 · radius 20px
Responsive (measured)
- breakpoints: 375px · 400px · 480px · 700px · 750px · 1200px
- mobile (390px): hero 14px · nav inline
Per-section tokens (11)
- Hero — dark · bg #707879 · text #FAFAFA · 1 col · left
- Feature — dark · bg #1C2416 · text #FBFBFB · 1 col · left
- Feature — dark · bg #202C24 · text #FAFAFA · 1 col · left
- Gallery / Showcase — light · bg #EEEEEE · text #947165 · 1 col · left
- Gallery / Showcase — light · bg #FAFAFA · text #000000 · 1 col · left
- Feature — dark · bg #000000 · text #FAFAFA · 1 col · left
- Logo Wall — light · bg #FAFAFA · text #5D3C15 · 1 col · left
- Feature — dark · bg #8B000A · text #FBFBFB · 1 col · left
- Gallery / Showcase — light · bg #FAFAFA · text #77282B · 1 col · left
- Feature — dark · bg #C41F01 · text #F9F7F7 · 1 col · left
- Footer — light · bg #EEEEEE · text #A5A5A4 · 2 col · split
Export: DESIGN.md
# Pangram Pangram — Design System > light, modern, high, custom — deep decode (measured live) ## Colors | Role | Value | |------|-------| | bg | `#FAFAFA` | | surface | `#EBEBEB` | | border | `#D4D4D4` | | text | `#000000` | | text_muted | `#5F5F5F` | | primary | `#FF2F00` | | accent | `#FF2F00` | | link | `#FFB700` | | secondary | `#1990C6` | | button_bg | `#FF2F00` | | button_text | `#000000` | **Using these colors** - **Action color** `#FF2F00` — the single interactive color; it appears only on things you click or must notice (buttons, key highlights), never on large fills or backgrounds. - `primary`, `accent`, `button_bg` are all `#FF2F00` — one role, not several (your action color). - **accent** `#FF2F00` — THE accent / action color — interactive & must-notice only (buttons, links, focus, one key highlight); never large fills or backgrounds. Scarcity is what makes it read as designed. - **link** `#FFB700` — fails contrast on the background (~1.7:1) — this is a dark UI color, NOT a readable link; use the text or action color for links (verify against the reference). - **secondary** `#1990C6` — optional secondary accent — LOW decode confidence; use rarely (a status color or a single decorative moment) or omit it entirely. Prefer one accent unless the reference clearly shows two. - **Page coverage** (full-page screenshot pixels): `#6F7878` 30.3% · `#FAFAFA` 27.4% · `#752C0C` 15.3% · `#261411` 10.9% ## Typography - Heading: **Neue Montreal** _(free fallback: Space Grotesk)_ - Body: **Neue Montreal** _(free fallback: Space Grotesk)_ | Role | Size / weight · line-height · tracking | |------|------------------------------------------| | hero | 145px / 400 · lh 145px | | h2 | 121px / 600 · lh 121px | | h3 | 73px / 600 · lh 73px | | body | 14px / 400 · lh 18px | | small | 12px / 400 · lh 15px | - Weight ladder: 400 · 500 · 530 · 600 · 700 — use these exact measured weights, not the 400/600 defaults. > **Fonts —** Neue Montreal is proprietary — closest free match: Space Grotesk (Google). Load Space Grotesk; keep Neue Montreal first so licensed users still get it. ## Spacing - base unit: 4px (inferred from the measured scale) - measured scale: 4px, 8px, 12px, 15px, 20px, 23px, 24px, 26px, 31px, 36px — snap all gaps/padding to these ## Radius - base: 20px - button: 20px - card: 20px - pill: 9999px - sharp: 3px ## Buttons | Button | Fill / text | Border | Radius | Padding | Font | Shadow | |--------|-------------|--------|--------|---------|------|--------| | primary | `#000000` / `#FFFFFF` | none | 20px | 7.65104px 15.3019px 7.65104px 15.3019px | 400 14px | none | | secondary | `rgba(0, 0, 0, 0)` / `#FFFFFF` | 1px solid rgb(255, 255, 255) | 20px | 7.65104px 22.953px 7.65104px 22.953px | 400 14px | none | **States (measured, not guessed)** - transition: `background-color 0.2s ease` ## Shadows (elevation) - card: `rgba(63, 63, 68, 0.4) 0px 4px 10px 0px` ## Motion - durations: 200ms (dominant) · 500ms · 100ms - easings: `ease` (dominant) · `cubic-bezier(0.22, 1, 0.36, 1)` - animated properties: color, background-color, transform, opacity Micro-interactions use the dominant duration + easing; nothing on the page animates slower than the longest duration above — don't invent springier motion. ## Their own tokens (verbatim from :root) | Token | Value | |-------|-------| | `--duration-short` | `.1s` | | `--duration-default` | `.2s` | | `--duration-medium` | `.3s` | | `--duration-long` | `.5s` | | `--duration-extra-long` | `.6s` | | `--duration-extra-longer` | `.75s` | | `--duration-extended` | `3s` | | `--ease-in-cubic` | `cubic-bezier(.32, 0, .67, 0)` | | `--ease-out-cubic` | `cubic-bezier(.33, 1, .68, 1)` | | `--ease-out-sine` | `cubic-bezier(.61, 1, .88, 1)` | | `--ease-out-quint` | `cubic-bezier(.22, 1, .36, 1)` | | `--ease-in-quint` | `cubic-bezier(.64, 0, .78, 0)` | _…and 19 more measured on the page._ Prefer these names when extending their system — it's the brand's actual vocabulary. ## Layout (measured) - container max 1260px - nav: 54px absolute | Section (y) | Height | Cols | Gap | Pad y | Split | |---|---|---|---|---|---| | 92 | 519 | — | — | 0/0 | — | | 641 | 519 | — | — | 0/0 | — | | 1191 | 519 | — | — | 0/0 | — | | 1812 | 1414 | — | — | 0/0 | — | | 3329 | 639 | — | — | 0/0 | — | | 4071 | 408 | — | — | 0/0 | — | | 4509 | 220 | — | — | 0/0 | — | ## Motion choreography (measured) Load order: `div.loading__spinner`×24 @0ms → `div.mini-carousel__slider` @220ms → `div.section-margin` @414ms → `div.section-margin` @414ms → `div.section__section-header`×4 @414ms → `div.section__section-header`×4 @414ms - `div.mini-carousel__slider` — transform translate(0px)→translate(-50%) — 30000ms · loops - stagger: `li` ×10 — 100ms apart - scroll reveal: 18 elements rest at opacity 0, translateY(32px), animate in over 0.75s cubic-bezier(0.22, 1, 0.36, 1) (18 revealed during the drive). - overlay dialog (auto-opened): panel #FFB700 · r 20px · shadow rgba(63, 63, 68, 0.5) 0px 5px 10px 0px Rebuild the timeline, not just the durations — order, delays and staggers above are the choreography. ## Components (measured) - card ×6: pad 15.3019px 15.3019px 15.3019px 15.3019px · r 20px · bg #EDEDED - hover: font-weight `400` · letter-spacing `normal` - link: #000000 · underline ## Responsive (measured) - breakpoints: 375px · 400px · 480px · 700px · 750px · 1200px - mobile (390px): hero 14px · body 14px · nav: inline ## How to apply Paste the Tailwind `@theme` (or CSS variables) as your base, then build each section to its spec — verify every color, radius, and font against these tokens. Hover/focus states, shadows and motion timings above are measured from the live page — match them exactly, don't re-guess them. --- > **Decoded with Mozaika** — measured live, not guessed. Full decoded design system + one-command install: mozaika.design/ds/pangram-pangram
Export: Tailwind v4 (@theme)
@theme {
/* action color #FF2F00 — the one interactive color; buttons/links/emphasis only, never large fills. */
--color-bg: #FAFAFA;
--color-surface: #EBEBEB;
--color-border: #D4D4D4;
--color-text: #000000;
--color-text-muted: #5F5F5F;
--color-primary: #FF2F00; /* primary brand / action color. */
--color-accent: #FF2F00; /* THE accent / action color — interactive & must-notice only (buttons, links, focus, one key highlight); never large fills or backgrounds. Scarcity is what makes it read as designed. */
--color-link: #FFB700; /* fails contrast on the background (~1.7:1) — this is a dark UI color, NOT a readable link; use the text or action color for links (verify against the reference). */
--color-secondary: #1990C6; /* optional secondary accent — LOW decode confidence; use rarely (a status color or a single decorative moment) or omit it entirely. Prefer one accent unless the reference clearly shows two. */
--color-button-bg: #FF2F00; /* primary-button fill — the main call-to-action color. */
--color-button-text: #000000;
/* fonts: Neue Montreal is proprietary — closest free match: Space Grotesk (Google). Load Space Grotesk; keep Neue Montreal first so licensed users still get it. */
--font-heading: "Neue Montreal", "Space Grotesk", system-ui, -apple-system, 'Segoe UI', sans-serif;
--font-body: "Neue Montreal", "Space Grotesk", system-ui, -apple-system, 'Segoe UI', sans-serif;
/* measured weights: 400, 500, 530, 600, 700 — use these, not 400/600 */
--text-hero: 145px; --font-weight-hero: 400; --leading-hero: 145px;
--text-h2: 121px; --font-weight-h2: 600; --leading-h2: 121px;
--text-h3: 73px; --font-weight-h3: 600; --leading-h3: 73px;
--text-body: 14px; --font-weight-body: 400; --leading-body: 18px;
--text-small: 12px; --font-weight-small: 400; --leading-small: 15px;
--radius-base: 20px;
--radius-button: 20px;
--radius-card: 20px;
--radius-pill: 9999px;
--radius-sharp: 3px;
--shadow-card: rgba(63, 63, 68, 0.4) 0px 4px 10px 0px;
--ease-brand: ease;
--duration-fast: 100ms; /* use: duration-[var(--duration-fast)] */
--duration-base: 200ms;
--duration-slow: 500ms;
--spacing: 4px; /* measured base — drives the p-*/gap-* scale. steps seen on the page: 4, 8, 12, 15, 20, 23, 24, 26, 31, 36px */
}Export: CSS variables
:root {
/* action color #FF2F00 — the one interactive color; buttons/links/emphasis only, never large fills. */
--bg: #FAFAFA;
--surface: #EBEBEB;
--border: #D4D4D4;
--text: #000000;
--text-muted: #5F5F5F;
--primary: #FF2F00; /* primary brand / action color. */
--accent: #FF2F00; /* THE accent / action color — interactive & must-notice only (buttons, links, focus, one key highlight); never large fills or backgrounds. Scarcity is what makes it read as designed. */
--link: #FFB700; /* fails contrast on the background (~1.7:1) — this is a dark UI color, NOT a readable link; use the text or action color for links (verify against the reference). */
--secondary: #1990C6; /* optional secondary accent — LOW decode confidence; use rarely (a status color or a single decorative moment) or omit it entirely. Prefer one accent unless the reference clearly shows two. */
--button-bg: #FF2F00; /* primary-button fill — the main call-to-action color. */
--button-text: #000000;
--font-heading: "Neue Montreal", "Space Grotesk", system-ui, -apple-system, 'Segoe UI', sans-serif;
--font-body: "Neue Montreal", "Space Grotesk", system-ui, -apple-system, 'Segoe UI', sans-serif;
--text-hero: 145px; --weight-hero: 400; --leading-hero: 145px;
--text-h2: 121px; --weight-h2: 600; --leading-h2: 121px;
--text-h3: 73px; --weight-h3: 600; --leading-h3: 73px;
--text-body: 14px; --weight-body: 400; --leading-body: 18px;
--text-small: 12px; --weight-small: 400; --leading-small: 15px;
--radius: 20px;
--radius-button: 20px;
--radius-card: 20px;
--radius-pill: 9999px;
--radius-sharp: 3px;
--shadow-card: rgba(63, 63, 68, 0.4) 0px 4px 10px 0px;
--ease: ease;
--duration-fast: 100ms;
--duration-base: 200ms;
--duration-slow: 500ms;
}
/* their own tokens, verbatim from the site's :root */
:root {
--duration-short: .1s;
--duration-default: .2s;
--duration-medium: .3s;
--duration-long: .5s;
--duration-extra-long: .6s;
--duration-extra-longer: .75s;
--duration-extended: 3s;
--ease-in-cubic: cubic-bezier(.32, 0, .67, 0);
--ease-out-cubic: cubic-bezier(.33, 1, .68, 1);
--ease-out-sine: cubic-bezier(.61, 1, .88, 1);
--ease-out-quint: cubic-bezier(.22, 1, .36, 1);
--ease-in-quint: cubic-bezier(.64, 0, .78, 0);
}
/* fonts: Neue Montreal is proprietary — closest free match: Space Grotesk (Google). Load Space Grotesk; keep Neue Montreal first so licensed users still get it. */