Background
#030303
Page canvas · Observed
Abel Fragrance builds a Control-dense composition and Media-heavy content structure visual language around a dark foundation and Founders Grotesk typography. Its commerce experience puts editorial rhythm and content narrative at the center of the composition.
/ 01 . Color
Visual system extracted from computed styles, CSS variables and repeated foreground/background usage across the analyzed page.
#030303
Page canvas · Observed
#ffffff
Primary text · Observed
#121110
Borders and separators · Observed
#000000
Observed palette family
#807e81
Observed palette family
rgba(0, 0, 0, 0.2)
Observed palette family
/ 02 . Typography
body
Aa Design language
button
Aa Design language
caption
Aa Design language
headingSmall
Aa Design language
label
Aa Design language
/ 03 . System
controlGap1
12px
controlGap2
64px
contentGap1
73px
contentGap2
121px
sectionGap1
80px
sectionGap2
97px
pageGutter
40px
space-xs
3px
No repeated tokens detected.
defaultBorder
1px solid rgb(246, 234, 218)
/ 04 . Components
Text navigation embedded in compact content flow.
Supporting linked text whose more specific role remains uncertain.
Supporting linked text whose more specific role remains uncertain.
Direct interface action.
Direct interface action.
Reusable select pattern.
# DESIGN.md
## 1. Overview
Interface guided by clear visual hierarchy, consistent surfaces, and a controlled semantic palette.
Use the tokens and contracts below as the normative source for accessible, responsive implementation.
> Normative implementation contract: preserve semantic token names, responsive rules, and interaction states when extending the interface.
## 2. Colors and accessibility
### Semantic color tokens
| Token | Hex value | Purpose |
|---|---|---|
| background | `#030303` | Primary canvas |
| surface | `#030303` | Raised surfaces |
| text-primary | `#ffffff` | Primary text |
| text-secondary | `#ffffff` | Secondary text |
| text-muted | `#ffffff` | Supporting text |
| text-on-brand | `#ffffff` | Text on brand |
| border | `#121110` | Borders and dividers |
| brand | `#2563eb` | Primary brand action |
| success | `#166534` | Positive state |
| danger | `#b91c1c` | Destructive state |
| warning | `#92400e` | Warning state |
| info | `#075985` | Informational state |
| focus | `#1d4ed8` | Focus ring |
### WCAG AA rules
- Normal text must reach a minimum contrast ratio of 4.5:1.
- Large text and interface elements must reach a minimum contrast ratio of 3:1.
- Visible focus must maintain a minimum contrast ratio of 3:1 and must not rely on color alone.
- Use only semantic token combinations that meet these ratios.
## 3. Typography
### Family
| Token | Family | Usage |
|---|---|---|
| font-bodyfont | `'Founders Grotesk', sans-serif` | Body and interface text |
| font-monofont | `'Founders Grotesk Mono', sans-serif` | Metadata and code |
### Type scale
| Token | Family | Size | Weight | Line height |
|---|---|---:|---:|---:|
| type-body | `'Founders Grotesk', sans-serif` | `16px` | `500` | `18.4px` |
| type-button | `'Founders Grotesk Mono', sans-serif` | `13px` | `400` | `13px` |
| type-caption | `'Founders Grotesk Mono', sans-serif` | `13px` | `400` | `14.3px` |
| type-headingsmall | `'Founders Grotesk Mono', sans-serif` | `16px` | `400` | `17.6px` |
| type-label | `'Founders Grotesk', sans-serif` | `13px` | `300` | `17.55px` |
## 4. Layout and spacing
### Breakpoints
- **Mobile:** `< 768px` — one-column grid, 16px/24px gutters, and stacked navigation.
- **Tablet:** `768px–1023px` — adaptive grid and 32px/48px gutters.
- **Desktop:** `>= 1024px` — 120px gutters and a container max-width defined by the layout.
### Responsive rules
- **Header:** stack navigation and actions on mobile; keep primary navigation inline from tablet upward.
- **Hero:** use one column on mobile, a balanced two-column composition on tablet, and the full container on desktop.
- **Cards:** stretch to the grid width on mobile, use two columns on tablet, and the defined card grid on desktop.
- **Navigation grid: use one column on mobile, adaptive columns on tablet, and the complete navigation grid on desktop.
### Spacing scale
| Token | Value | Usage |
|---|---:|---|
| space-xs | `3px` | Layout scale |
| space-sm | `5.625px` | Layout scale |
| space-md | `10px` | Layout scale |
| space-lg | `12px` | Layout scale |
| space-xl | `14.6406px` | Layout scale |
## 5. Shapes, borders and depth
### Radii
| Token | Value | Usage |
|---|---:|---|
| radius-sm | `4px` | Compact controls |
| radius-md | `12px` | Cards and surfaces |
| radius-full | `9999px` | Pills and circular controls |
### Borders and depth
- Border width: `var(--ds-border-width)`.
- Border style: `solid`.
- Border color: `var(--ds-color-border)`.
- Use `var(--ds-shadow-sm)` for low elevation and `var(--ds-shadow-inner)` for inner separation.
## 6. Component specification
### Inline Text Link
- **Component:** Text navigation embedded in compact content flow.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-brand)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-md)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
### Linked Text — Variant A
- **Component:** Supporting linked text whose more specific role remains uncertain.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-brand)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-md)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
### Button — Variant A
- **Component:** Direct interface action.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-brand)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-full)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
### Select
- **Component:** Reusable select pattern.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-text-primary)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-md)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
### Footer
- **Component:** Reusable footer pattern.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-text-primary)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-md)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
## 7. Interaction contract
### Universal state rules
| State | Visual behavior |
|---|---|
| Initial state | Use `var(--ds-color-surface)`, `var(--ds-color-text-primary)`, `var(--ds-color-border)`, `var(--ds-type-body)` and `var(--ds-radius-md)`. |
| `:hover` | Increase emphasis with `var(--ds-color-brand-hover)` or `var(--ds-color-surface-hover)`; preserve geometry and layout. |
| `:active` | Apply `var(--ds-color-brand-active)` or `var(--ds-color-surface-active)`; preserve dimensions. |
| `:focus-visible` | Show a ring of `var(--ds-focus-ring-width)` using `var(--ds-color-focus)`, with offset `var(--ds-focus-ring-offset)`. |
| `:disabled` | Use `var(--ds-state-disabled-opacity)`, `cursor: not-allowed` and `pointer-events: none`; remove pointer events. |
## 8. Design tokens
```css
:root {
--ds-color-background: #030303;
--ds-color-surface: #030303;
--ds-color-text-primary: #ffffff;
--ds-color-text-secondary: #ffffff;
--ds-color-text-muted: #ffffff;
--ds-color-text-on-brand: #ffffff;
--ds-color-border: #121110;
--ds-color-brand: #2563eb;
--ds-color-brand-hover: color-mix(in srgb, var(--ds-color-brand) 86%, var(--ds-color-text-primary));
--ds-color-brand-active: color-mix(in srgb, var(--ds-color-brand) 72%, var(--ds-color-text-primary));
--ds-color-surface-hover: color-mix(in srgb, var(--ds-color-surface) 92%, var(--ds-color-text-primary));
--ds-color-surface-active: color-mix(in srgb, var(--ds-color-surface) 84%, var(--ds-color-text-primary));
--ds-color-success: #166534;
--ds-color-danger: #b91c1c;
--ds-color-warning: #92400e;
--ds-color-info: #075985;
--ds-color-focus: #1d4ed8;
--ds-font-body: 'Founders Grotesk', sans-serif;
--ds-type-body: 'Founders Grotesk', sans-serif 16px 400 / 24px;
--ds-type-heading-large: 'Founders Grotesk', sans-serif 48px 700 / 1.1;
--ds-type-heading-medium: 'Founders Grotesk', sans-serif 32px 600 / 1.2;
--ds-type-heading-small: 'Founders Grotesk', sans-serif 24px 600 / 1.25;
--ds-type-caption: 'Founders Grotesk', sans-serif 12px 500 / 16px;
--ds-space-xs: 4px;
--ds-space-sm: 8px;
--ds-space-md: 16px;
--ds-space-lg: 24px;
--ds-space-xl: 40px;
--ds-border-width: 1px;
--ds-radius-sm: 4px;
--ds-radius-md: 12px;
--ds-radius-full: 9999px;
--ds-shadow-sm: 0 2px 8px rgb(0 0 0 / 0.12);
--ds-shadow-inner: inset 0 1px 2px rgb(0 0 0 / 0.12);
--ds-breakpoint-tablet: 768px;
--ds-breakpoint-desktop: 1024px;
--ds-gutter-mobile: 16px;
--ds-gutter-mobile-large: 24px;
--ds-gutter-tablet: 32px;
--ds-gutter-tablet-large: 48px;
--ds-gutter-desktop: 120px;
--ds-focus-ring-width: 2px;
--ds-focus-ring-offset: 2px;
--ds-state-disabled-opacity: 0.5;
--ds-transition-fast: 150ms ease-out;
}
```