# HoffDesk Blog Design Tokens — v2
**Author:** Daedalus 🎨
**Date:** 2026-04-22
**Status:** Draft — for Matt review
**Based on:** `design-v2-spec.md` (Content Pipeline v2)
---
## Design Philosophy
Functional Luxury applied to reading. Roman spa for the mind — calm, intentional, luxurious in restraint. Every pixel earns its place.
If Aundrea can't read it at 7 AM half-awake on her phone, it's wrong.
---
## Color Palette
### Base (Dark Mode — Refined)
| Token | Value | Usage |
|-------|-------|-------|
| `bg-primary` | `#0a0c10` | Page background — deeper black |
| `bg-secondary` | `#111318` | Elevated surfaces, cards |
| `bg-tertiary` | `#1a1d24` | Hover states, subtle elevation |
| `bg-card` | `rgba(17, 19, 24, 0.8)` | Glassmorphism cards |
### Borders
| Token | Value | Usage |
|-------|-------|-------|
| `border-default` | `rgba(255, 255, 255, 0.08)` | Default borders |
| `border-subtle` | `rgba(255, 255, 255, 0.04)` | Subtle separators |
| `border-hover` | `rgba(255, 255, 255, 0.12)` | Hover state borders |
### Text
| Token | Value | Usage |
|-------|-------|-------|
| `text-primary` | `#f0f1f5` | Headlines, primary content |
| `text-secondary` | `#9ca3af` | Secondary labels, timestamps |
| `text-tertiary` | `#6b7280` | Muted info, placeholders |
### Accent
| Token | Value | Usage |
|-------|-------|-------|
| `accent-primary` | `#818cf8` | Primary accent (indigo) |
| `accent-glow` | `rgba(129, 140, 248, 0.15)` | Subtle glow effects |
### Category Colors (Semantic)
| Token | Value | Usage |
|-------|-------|-------|
| `cat-homelab` | `#f97316` | Home Lab category |
| `cat-openclaw` | `#8b5cf6` | OpenClaw category |
| `cat-ai` | `#06b6d4` | AI News category |
---
## Typography
### Font Stack
| Token | Value | Usage |
|-------|-------|-------|
| `font-display` | `'Source Serif 4', Georgia, serif` | Article body, elegant reading |
| `font-body` | `'Inter', system-ui, sans-serif` | UI elements, headings, navigation |
| `font-mono` | `'JetBrains Mono', 'SF Mono', monospace` | Code blocks |
**Note:** Fonts loaded via Google Fonts. See implementation below.
### Fluid Type Scale
| Token | Value | Usage |
|-------|-------|-------|
| `text-hero` | `clamp(2rem, 5vw, 3rem)` | Article titles |
| `text-h1` | `clamp(1.75rem, 4vw, 2.5rem)` | Page headlines |
| `text-h2` | `clamp(1.5rem, 3vw, 2rem)` | Section headers |
| `text-h3` | `clamp(1.25rem, 2vw, 1.5rem)` | Subsection headers |
| `text-body` | `clamp(1rem, 1.5vw, 1.125rem)` | Body text |
| `text-caption` | `0.875rem` | Labels, meta |
### Body Text Settings
| Token | Value |
|-------|-------|
| `body-line-height` | `1.75` |
| `body-font-weight` | `400` |
| `h2-margin-top` | `6rem` |
| `h3-margin-top` | `4rem` |
| `p-margin-bottom` | `2rem` |
| `blockquote-margin` | `4rem 0` |
| `blockquote-padding` | `2rem 3rem` |
---
## Spacing Scale (Extended)
| Token | Value | PX | Usage |
|-------|-------|----|-------|
| `space-1` | `0.25rem` | 4px | Tight gaps |
| `space-2` | `0.5rem` | 8px | Inner padding small |
| `space-3` | `0.75rem` | 12px | Inner padding medium |
| `space-4` | `1rem` | 16px | Standard padding |
| `space-5` | `1.5rem` | 24px | Card padding |
| `space-6` | `2rem` | 32px | Section gaps |
| `space-8` | `3rem` | 48px | Large gaps |
| `space-10` | `4rem` | 64px | Page margins |
| `space-12` | `6rem` | 96px | Hero spacing |
| `space-16` | `8rem` | 128px | Page breathing room |
### Content Width
| Token | Value | Usage |
|-------|-------|-------|
| `content-max` | `680px` | Article body width for optimal readability |
---
## Layout
| Token | Value | Usage |
|-------|-------|-------|
| `header-height` | `64px` | Fixed header |
| `header-blur` | `blur(20px) saturate(180%)` | Glassmorphism effect |
---
## Animation & Transitions
| Token | Value | Usage |
|-------|-------|-------|
| `transition-fast` | `150ms ease` | Hover states |
| `transition-base` | `250ms cubic-bezier(0.4, 0, 0.2, 1)` | Card interactions |
| `transition-slow` | `350ms cubic-bezier(0.4, 0, 0.2, 1)` | Larger animations |
### Animation Keyframes
| Keyframe | Effect |
|----------|--------|
| `fadeInUp` | `opacity 0→1, translateY(20px→0), 600ms` |
---
## Border Radius
| Token | Value | Usage |
|-------|-------|-------|
| `radius-sm` | `0.375rem` | Pills, tags |
| `radius-md` | `0.75rem` | Cards |
| `radius-lg` | `1rem` | Large containers |
---
## Breakpoints
| Token | Value | Usage |
|-------|-------|-------|
| `mobile` | `< 640px` | Primary target |
| `tablet` | `640px – 1024px` | Secondary |
| `desktop` | `> 1024px` | Nice-to-have |
---
## Google Fonts Implementation
```html
```
---
## CSS Variables Summary
```css
:root {
/* Colors */
--bg-primary: #0a0c10;
--bg-secondary: #111318;
--bg-tertiary: #1a1d24;
--bg-card: rgba(17, 19, 24, 0.8);
--border-default: rgba(255, 255, 255, 0.08);
--border-subtle: rgba(255, 255, 255, 0.04);
--border-hover: rgba(255, 255, 255, 0.12);
--text-primary: #f0f1f5;
--text-secondary: #9ca3af;
--text-tertiary: #6b7280;
--accent-primary: #818cf8;
--accent-glow: rgba(129, 140, 248, 0.15);
/* Typography */
--font-display: 'Source Serif 4', Georgia, serif;
--font-body: 'Inter', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'SF Mono', monospace;
--text-hero: clamp(2rem, 5vw, 3rem);
--text-h1: clamp(1.75rem, 4vw, 2.5rem);
--text-h2: clamp(1.5rem, 3vw, 2rem);
--text-h3: clamp(1.25rem, 2vw, 1.5rem);
--text-body: clamp(1rem, 1.5vw, 1.125rem);
/* Spacing */
--space-1: 0.25rem;
--space-2: 0.5rem;
--space-3: 0.75rem;
--space-4: 1rem;
--space-5: 1.5rem;
--space-6: 2rem;
--space-8: 3rem;
--space-10: 4rem;
--space-12: 6rem;
--space-16: 8rem;
--content-max: 680px;
/* Transitions */
--transition-fast: 150ms ease;
--transition-base: 250ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1);
}
```
---
## Aundrea Test
> Would Aundrea enjoy reading this at 7 AM, half-awake, on her phone?
**Target:** Yes. Serif body text feels like a real article, not a doc page. Generous spacing lets her skim without effort.
---
_Tokens are the contract between design and implementation. If you change a value here, it changes everywhere._
— Daedalus 🎨