Frontend Design
Build distinctive UI that is both creatively intentional and design-system-compliant.
This skill bridges the Claude frontend-design plugin's creative philosophy with this repo's concrete design token system, brand language, and component library. The plugin provides the "think boldly" mindset; this skill constrains it to the actual design system.
Philosophy (from the Claude frontend-design plugin)
- Commit to a BOLD aesthetic direction before coding
- Avoid generic AI aesthetics (purple gradients, Inter/Roboto, predictable grid layouts)
- Every design choice should be intentional and defensible
- High-impact micro-interactions and motion where they serve the user
- Atmosphere and depth through composition, not through arbitrary values
Constraints (this repo's design system)
ALL design work MUST use the repo's token system. The tokens and brand dossier define the creative canvas — boldness comes from HOW you compose them, not from bypassing them.
Mandatory References
Load these before any design work:
| What |
Where |
Load when |
| Token quick-ref |
.claude/skills/tools-design-system/SKILL.md |
Always — first thing |
| Brand dossier |
docs/business-os/strategy/<BIZ>/<YYYY-MM-DD>-brand-identity-dossier.user.md |
If it exists for the business |
| Design profile |
packages/themes/<theme>/src/design-profile.ts |
Before any themed surface |
| Theme assets |
packages/themes/<theme>/src/assets.ts |
Before any themed surface |
| Recipes |
packages/themes/<theme>/src/recipes.ts |
Before any themed surface |
| Theme tokens |
packages/themes/<theme>/src/tokens.ts |
Before any design |
| Base tokens |
packages/themes/base/src/tokens.ts |
Always (fallback + reference) |
| Component catalog |
docs/design-system-handbook.md |
When composing layouts |
| Typography & color |
docs/typography-and-color.md |
When choosing fonts/colors |
| Business registry |
docs/business-os/strategy/businesses.json |
To resolve app → business |
Hard Rules
- ALL colors via semantic tokens (
bg-primary, text-fg, bg-accent, etc.) or theme asset brand colors — never arbitrary hex
- ALL typography via theme asset fonts (from
assets.ts) or font tokens (font-sans, font-heading, font-mono) — never import external fonts
- ALL spacing via profile-derived gaps (
sectionGap, componentGap, cardPadding from design-profile.ts) or 8-pt rhythm — never arbitrary px
- ALL radius via profile
defaultRadius (e.g., rounded-sm when profile says "sm") — never arbitrary. Do not default to rounded-lg when the profile specifies a different value
- ALL shadows via profile
defaultElevation — use shadow-sm for "subtle", no shadow for "flat", shadow-md for "moderate". Do not default to shadow-md when the profile says "flat"
- Use
cn() from @acme/design-system/utils/style for class merging
- Use existing
@acme/design-system components before creating new ones
- Mobile-first responsive: base →
md: (768px) → lg: (1024px) → xl: (1280px)
Precedence
Rule 1: Profile overrides component defaults.
Rule 2: Design spec overrides profile.
When in doubt, the more specific source wins.
If the design profile says defaultRadius: "sm" and the component defaults to rounded-lg, use rounded-sm. If a page-level design spec then says "use large radius for hero cards," that overrides the profile for those cards only.
Where Boldness Lives
The plugin's creative philosophy applies to:
- Composition: How you arrange components, use whitespace, create visual hierarchy — asymmetry, overlap, and diagonal flow are encouraged through layout choices (grid-cols, order, absolute positioning), not through arbitrary spacing values
- Motion: CSS transitions/animations on existing token values (opacity, transform, scale) — use
transition-* utilities and @keyframes with token-derived values
- Density context: Choose
.context-operations / .context-consumer / .context-hospitality intentionally — this changes the entire feel without breaking the system
- Brand expression: Each business has a distinct brand dossier — lean into its personality, voice, and visual identity. The dossier IS the aesthetic direction
- Component selection: Choose the right atom/molecule from the design system, don't default to the obvious choice. A
StatCard grid tells a different story than a DataGrid table
- Surface layering: Use
surface-1, surface-2, surface-3 to create depth and hierarchy — this is how the design system provides atmosphere
The plugin's creative philosophy does NOT override:
- Color values (use tokens or theme asset brand colors)
- Font choices (use theme asset fonts or font tokens)
- Spacing values (use profile-derived gaps or 8-pt rhythm)
- Border radius (use profile default radius)
- Creating custom CSS properties outside the design system
Profile, Assets, and Recipes Loading
Before building any themed surface, load the three expression layers for the target theme:
- Read
design-profile.ts — art-direction defaults (radius, elevation, border, spacing, typography scale, guidance on color strategy, whitespace, motion). State which theme you are using.
- Read
assets.ts — available fonts, gradients, shadow palettes, keyframes, named brand colors. If empty, the brand has no custom assets; fall back to base tokens.
- Read
recipes.ts — branded surface compositions (hero panels, CTA styles, content sections). If empty, compose from profile defaults and tokens.
These files live at packages/themes/<theme>/src/. If any file does not exist for the target theme, treat that layer as empty (use base defaults).
Example: For Caryina, design-profile.ts might specify defaultRadius: "sm", defaultElevation: "flat", colorStrategy: "restrained". This means: small rounded corners, no drop shadows on cards, and a primary-plus-one-accent palette. The agent applies these defaults to every surface unless a page-level design spec overrides them.
Surface Mode Selection
A single profile is too coarse for an entire app. Pick the right surface mode before building:
Mode Criteria
| Mode |
Use when building |
Key signals |
| marketing |
Hero sections, landing pages, conversion-focused flows, above-fold CTAs |
Persuasion-oriented, high visual impact, brand expression at maximum |
| editorial |
Long-form content, guides, blogs, documentation |
Readability-first, single-column prose, generous line-height |
| operations |
Dashboards, admin panels, data tables, staff-facing tools |
Information density, compact spacing, flat surfaces, restrained color |
| campaign |
Time-limited promotions, seasonal pages, launch announcements |
Bold color, dramatic motion, pervasive accent, high urgency |
How to Choose
Mode is determined in priority order:
- Design spec (explicit, authoritative). If a
/lp-design-spec output exists for the feature, its Surface-Mode field is authoritative. Use it.
- Route convention (structural). If the app maps route patterns to modes in its config, use the matching mode. Example:
/guides/* maps to editorial, /admin/* maps to operations.
- Agent inference (fallback). When no design spec exists and no route mapping applies, select a mode based on the criteria table above. State which mode you selected and why. If the operator disagrees, they specify the correct mode and you rebuild.
The selected mode merges over the baseline profile — unspecified fields inherit from baseline.
Recipe Catalogue Check
Before inventing new surface compositions, check recipes.ts for branded compositions that match the surface you are building:
- Read the recipe catalogue for the target theme.
- For each recipe, check
applicableModes — does it match your selected surface mode?
- Check
usage and doNotUseWhen — does the recipe fit the context?
- If a recipe matches, apply its
classes and css fields directly. Do not reinvent the composition.
- If no recipe matches, compose from profile defaults and tokens. Good compositions that emerge can be promoted to recipes afterward.
Example: Building a hero section for Brikette in marketing mode? Check recipes.ts for heroPanel — it provides gradient, blur, and ring classes purpose-built for that surface. Use it instead of composing from scratch.
Style Movement Translation Table
When the user or design spec requests a specific visual movement, use this table to set profile baseline and mode:
| Movement |
Profile baseline |
Mode suggestion |
Key characteristics |
| Swiss/International |
scaleRatio: 1.333, defaultRadius: "sm", defaultElevation: "flat", defaultBorder: "defined" |
marketing or editorial |
Tight tracking on labels, uppercase transforms, grid tension via asymmetry, restrained palette with spot accent, generous whitespace |
| Editorial |
scaleRatio: 1.5+, displayWeight: 300 (light) or 900 (black), bodyMeasure: "58ch" |
editorial |
Dramatic size contrast between display and body, single-column prose, full-bleed images, extreme whitespace, dramatic motion (staggered entry) |
| Minimalist |
scaleRatio: 1.125, defaultElevation: "flat", defaultBorder: "none", defaultRadius: "sm" |
editorial or marketing |
Flat everything, monochromatic palette, spot accent on CTA only, extreme whitespace, no motion or instant transitions |
| Brutalist |
scaleRatio: 1.414, displayWeight: 900, defaultRadius: "none", defaultBorder: "bold" |
marketing |
All-caps display, sharp edges, heavy borders, high-contrast colors, no shadows, no motion |
| Material/Soft |
defaultRadius: "xl", defaultElevation: "layered", defaultBorder: "none" |
any |
Rounded surfaces, layered shadows, no borders, playful motion (spring easing), expressive color |
| Glass/Atmospheric |
defaultElevation: "subtle", defaultRadius: "xl" |
campaign |
Backdrop blur, translucent surfaces, high background contrast, subtle ring borders, precise motion |
These are starting points, not prescriptions. The agent adapts based on brand identity and page context.
Workflow
Step 1: Resolve the Business
Read docs/business-os/strategy/businesses.json to find the target business for the work.
Quick-reference only (may become stale): The table below is illustrative. Always read docs/business-os/strategy/businesses.json for the authoritative app → business → theme mapping.
| Business |
Key Apps |
Theme |
| BRIK |
brikette, reception, prime |
packages/themes/prime/ |
| PLAT |
platform-core, design-system, cms, dashboard |
packages/themes/base/ |
| BOS |
business-os |
packages/themes/base/ |
| PIPE |
product-pipeline |
packages/themes/base/ |
| XA |
xa |
packages/themes/base/ |
| HEAD |
cochlearfit |
packages/themes/base/ |
| PET |
(no apps yet) |
packages/themes/base/ |
| HBAG |
cover-me-pretty, handbag-configurator |
packages/themes/base/ |
Load the brand dossier: docs/business-os/strategy/<BIZ>/<YYYY-MM-DD>-brand-identity-dossier.user.md
If no brand dossier exists (common for PLAT, BOS, PIPE, XA): use base theme tokens directly from packages/themes/base/src/tokens.ts as the design reference. No redirection needed — the design system tokens provide a complete and correct palette. Reserve /lp-assessment-bootstrap <BIZ> for operating businesses that will have a distinct brand identity.
Step 2: Load Design System Context
- Read
.claude/skills/tools-design-system/SKILL.md for the token quick-reference
- Read
packages/themes/<theme>/src/design-profile.ts for art-direction defaults and guidance
- Read
packages/themes/<theme>/src/assets.ts for available fonts, gradients, shadows, keyframes, brand colors
- Read
packages/themes/<theme>/src/recipes.ts for branded surface compositions
- Read
packages/themes/<theme>/src/tokens.ts for the business's concrete token values
- Read
docs/design-system-handbook.md for available components
- If the feature is complex, also read
docs/typography-and-color.md
Step 3: Design Direction
With the brand dossier and tokens loaded, establish a creative direction:
- What density context fits? (
operations for dashboards, consumer for marketing, hospitality for booking)
- What surface layering creates the right depth? (flat vs elevated vs deeply layered)
- What motion principles serve the user? (subtle transitions vs dramatic reveals)
- How does the brand personality translate to composition choices?
Step 4: Build
Implement using:
@acme/design-system components (atoms, molecules, primitives)
- Semantic Tailwind tokens (never arbitrary values)
cn() for conditional class merging
- Proper TypeScript types for all props
Step 5: Verify
After building, run /lp-design-qa to audit:
- Token compliance (no arbitrary values)
- Brand dossier alignment
- Accessibility (contrast ratios, keyboard navigation, ARIA)
- Responsive behavior across breakpoints
Step 6: Document (optional)
For significant features that benefit from visual documentation, suggest /tools-bos-design-page to create diagrams showing the component architecture, state flows, or interaction patterns.
Integration
- Upstream:
lp-design-spec (design spec document — provides layout, component, and token decisions); lp-do-plan (IMPLEMENT task with Execution-Track: code and UI component scope).
- Downstream:
lp-design-qa (design and token compliance audit of the built UI); lp-do-build (built components committed and verified before QA).
- Loop position: S9A (UI Build) — post-design-spec, pre-design-qa.
Anti-Patterns
| Do NOT |
Do instead |
bg-[#FF6B35] |
bg-primary (resolved from theme tokens) |
font-['Plus Jakarta Sans'] |
font-heading (resolved from theme tokens) |
p-[13px] |
p-3 (8-pt rhythm: 12px) |
rounded-[7px] |
rounded-md (token scale) |
| Import Google Fonts |
Use font-sans, font-heading, font-mono |
| Create new CSS custom properties |
Add tokens to packages/themes/base/src/tokens.ts |
style={{ color: '#333' }} |
className="text-fg" |
| Build a custom button |
Use @acme/design-system/shadcn/Button |
1---2name: tools-ui-frontend-design3description: Create distinctive, production-grade frontend interfaces grounded in this repo's design system. Use when asked to build web components, pages, or applications. Combines bold creative direction with token-constrained implementation.4---5
6# Frontend Design
7
8Build distinctive UI that is both creatively intentional and design-system-compliant.
9
10This skill bridges the Claude `frontend-design` plugin's creative philosophy with this repo's concrete design token system, brand language, and component library. The plugin provides the "think boldly" mindset; this skill constrains it to the actual design system.
11
12## Philosophy (from the Claude frontend-design plugin)
13
14- Commit to a BOLD aesthetic direction before coding
15- Avoid generic AI aesthetics (purple gradients, Inter/Roboto, predictable grid layouts)
16- Every design choice should be intentional and defensible
17- High-impact micro-interactions and motion where they serve the user
18- Atmosphere and depth through composition, not through arbitrary values
19
20## Constraints (this repo's design system)
21
22ALL design work MUST use the repo's token system. The tokens and brand dossier define the creative canvas — boldness comes from HOW you compose them, not from bypassing them.
23
24### Mandatory References
25
26Load these before any design work:
27
28| What | Where | Load when |
29|------|-------|-----------|
30| Token quick-ref | `.claude/skills/tools-design-system/SKILL.md` | Always — first thing |
31| Brand dossier | `docs/business-os/strategy/<BIZ>/<YYYY-MM-DD>-brand-identity-dossier.user.md` | If it exists for the business |
32| Design profile | `packages/themes/<theme>/src/design-profile.ts` | Before any themed surface |
33| Theme assets | `packages/themes/<theme>/src/assets.ts` | Before any themed surface |
34| Recipes | `packages/themes/<theme>/src/recipes.ts` | Before any themed surface |
35| Theme tokens | `packages/themes/<theme>/src/tokens.ts` | Before any design |
36| Base tokens | `packages/themes/base/src/tokens.ts` | Always (fallback + reference) |
37| Component catalog | `docs/design-system-handbook.md` | When composing layouts |
38| Typography & color | `docs/typography-and-color.md` | When choosing fonts/colors |
39| Business registry | `docs/business-os/strategy/businesses.json` | To resolve app → business |
40
41### Hard Rules
42
431. ALL colors via semantic tokens (`bg-primary`, `text-fg`, `bg-accent`, etc.) or theme asset brand colors — never arbitrary hex
442. ALL typography via theme asset fonts (from `assets.ts`) or font tokens (`font-sans`, `font-heading`, `font-mono`) — never import external fonts
453. ALL spacing via profile-derived gaps (`sectionGap`, `componentGap`, `cardPadding` from `design-profile.ts`) or 8-pt rhythm — never arbitrary px
464. ALL radius via profile `defaultRadius` (e.g., `rounded-sm` when profile says `"sm"`) — never arbitrary. Do not default to `rounded-lg` when the profile specifies a different value
475. ALL shadows via profile `defaultElevation` — use `shadow-sm` for `"subtle"`, no shadow for `"flat"`, `shadow-md` for `"moderate"`. Do not default to `shadow-md` when the profile says `"flat"`
486. Use `cn()` from `@acme/design-system/utils/style` for class merging
497. Use existing `@acme/design-system` components before creating new ones
508. Mobile-first responsive: base → `md:` (768px) → `lg:` (1024px) → `xl:` (1280px)
51
52### Precedence
53
54> **Rule 1:** Profile overrides component defaults.
55> **Rule 2:** Design spec overrides profile.
56> When in doubt, the more specific source wins.
57
58If the design profile says `defaultRadius: "sm"` and the component defaults to `rounded-lg`, use `rounded-sm`. If a page-level design spec then says "use large radius for hero cards," that overrides the profile for those cards only.
59
60### Where Boldness Lives
61
62The plugin's creative philosophy applies to:
63- **Composition**: How you arrange components, use whitespace, create visual hierarchy — asymmetry, overlap, and diagonal flow are encouraged through layout choices (grid-cols, order, absolute positioning), not through arbitrary spacing values
64- **Motion**: CSS transitions/animations on existing token values (opacity, transform, scale) — use `transition-*` utilities and `@keyframes` with token-derived values
65- **Density context**: Choose `.context-operations` / `.context-consumer` / `.context-hospitality` intentionally — this changes the entire feel without breaking the system
66- **Brand expression**: Each business has a distinct brand dossier — lean into its personality, voice, and visual identity. The dossier IS the aesthetic direction
67- **Component selection**: Choose the right atom/molecule from the design system, don't default to the obvious choice. A `StatCard` grid tells a different story than a `DataGrid` table
68- **Surface layering**: Use `surface-1`, `surface-2`, `surface-3` to create depth and hierarchy — this is how the design system provides atmosphere
69
70The plugin's creative philosophy does NOT override:
71- Color values (use tokens or theme asset brand colors)
72- Font choices (use theme asset fonts or font tokens)
73- Spacing values (use profile-derived gaps or 8-pt rhythm)
74- Border radius (use profile default radius)
75- Creating custom CSS properties outside the design system
76
77## Profile, Assets, and Recipes Loading
78
79Before building any themed surface, load the three expression layers for the target theme:
80
811. **Read `design-profile.ts`** — art-direction defaults (radius, elevation, border, spacing, typography scale, guidance on color strategy, whitespace, motion). State which theme you are using.
822. **Read `assets.ts`** — available fonts, gradients, shadow palettes, keyframes, named brand colors. If empty, the brand has no custom assets; fall back to base tokens.
833. **Read `recipes.ts`** — branded surface compositions (hero panels, CTA styles, content sections). If empty, compose from profile defaults and tokens.
84
85These files live at `packages/themes/<theme>/src/`. If any file does not exist for the target theme, treat that layer as empty (use base defaults).
86
87**Example:** For Caryina, `design-profile.ts` might specify `defaultRadius: "sm"`, `defaultElevation: "flat"`, `colorStrategy: "restrained"`. This means: small rounded corners, no drop shadows on cards, and a primary-plus-one-accent palette. The agent applies these defaults to every surface unless a page-level design spec overrides them.
88
89## Surface Mode Selection
90
91A single profile is too coarse for an entire app. Pick the right surface mode before building:
92
93### Mode Criteria
94
95| Mode | Use when building | Key signals |
96|------|------------------|-------------|
97| **marketing** | Hero sections, landing pages, conversion-focused flows, above-fold CTAs | Persuasion-oriented, high visual impact, brand expression at maximum |
98| **editorial** | Long-form content, guides, blogs, documentation | Readability-first, single-column prose, generous line-height |
99| **operations** | Dashboards, admin panels, data tables, staff-facing tools | Information density, compact spacing, flat surfaces, restrained color |
100| **campaign** | Time-limited promotions, seasonal pages, launch announcements | Bold color, dramatic motion, pervasive accent, high urgency |
101
102### How to Choose
103
104Mode is determined in priority order:
105
1061. **Design spec (explicit, authoritative).** If a `/lp-design-spec` output exists for the feature, its `Surface-Mode` field is authoritative. Use it.
1072. **Route convention (structural).** If the app maps route patterns to modes in its config, use the matching mode. Example: `/guides/*` maps to `editorial`, `/admin/*` maps to `operations`.
1083. **Agent inference (fallback).** When no design spec exists and no route mapping applies, select a mode based on the criteria table above. **State which mode you selected and why.** If the operator disagrees, they specify the correct mode and you rebuild.
109
110The selected mode merges over the baseline profile — unspecified fields inherit from baseline.
111
112## Recipe Catalogue Check
113
114Before inventing new surface compositions, check `recipes.ts` for branded compositions that match the surface you are building:
115
1161. Read the recipe catalogue for the target theme.
1172. For each recipe, check `applicableModes` — does it match your selected surface mode?
1183. Check `usage` and `doNotUseWhen` — does the recipe fit the context?
1194. If a recipe matches, apply its `classes` and `css` fields directly. Do not reinvent the composition.
1205. If no recipe matches, compose from profile defaults and tokens. Good compositions that emerge can be promoted to recipes afterward.
121
122**Example:** Building a hero section for Brikette in `marketing` mode? Check `recipes.ts` for `heroPanel` — it provides gradient, blur, and ring classes purpose-built for that surface. Use it instead of composing from scratch.
123
124## Style Movement Translation Table
125
126When the user or design spec requests a specific visual movement, use this table to set profile baseline and mode:
127
128| Movement | Profile baseline | Mode suggestion | Key characteristics |
129|----------|-----------------|-----------------|---------------------|
130| **Swiss/International** | `scaleRatio: 1.333`, `defaultRadius: "sm"`, `defaultElevation: "flat"`, `defaultBorder: "defined"` | marketing or editorial | Tight tracking on labels, uppercase transforms, grid tension via asymmetry, restrained palette with spot accent, generous whitespace |
131| **Editorial** | `scaleRatio: 1.5+`, `displayWeight: 300` (light) or `900` (black), `bodyMeasure: "58ch"` | editorial | Dramatic size contrast between display and body, single-column prose, full-bleed images, extreme whitespace, dramatic motion (staggered entry) |
132| **Minimalist** | `scaleRatio: 1.125`, `defaultElevation: "flat"`, `defaultBorder: "none"`, `defaultRadius: "sm"` | editorial or marketing | Flat everything, monochromatic palette, spot accent on CTA only, extreme whitespace, no motion or instant transitions |
133| **Brutalist** | `scaleRatio: 1.414`, `displayWeight: 900`, `defaultRadius: "none"`, `defaultBorder: "bold"` | marketing | All-caps display, sharp edges, heavy borders, high-contrast colors, no shadows, no motion |
134| **Material/Soft** | `defaultRadius: "xl"`, `defaultElevation: "layered"`, `defaultBorder: "none"` | any | Rounded surfaces, layered shadows, no borders, playful motion (spring easing), expressive color |
135| **Glass/Atmospheric** | `defaultElevation: "subtle"`, `defaultRadius: "xl"` | campaign | Backdrop blur, translucent surfaces, high background contrast, subtle ring borders, precise motion |
136
137These are starting points, not prescriptions. The agent adapts based on brand identity and page context.
138
139## Workflow
140
141### Step 1: Resolve the Business
142
143Read `docs/business-os/strategy/businesses.json` to find the target business for the work.
144
145**Quick-reference only (may become stale):** The table below is illustrative. Always read `docs/business-os/strategy/businesses.json` for the authoritative app → business → theme mapping.
146
147| Business | Key Apps | Theme |
148|----------|----------|-------|
149| BRIK | brikette, reception, prime | `packages/themes/prime/` |
150| PLAT | platform-core, design-system, cms, dashboard | `packages/themes/base/` |
151| BOS | business-os | `packages/themes/base/` |
152| PIPE | product-pipeline | `packages/themes/base/` |
153| XA | xa | `packages/themes/base/` |
154| HEAD | cochlearfit | `packages/themes/base/` |
155| PET | (no apps yet) | `packages/themes/base/` |
156| HBAG | cover-me-pretty, handbag-configurator | `packages/themes/base/` |
157
158Load the brand dossier: `docs/business-os/strategy/<BIZ>/<YYYY-MM-DD>-brand-identity-dossier.user.md`
159
160**If no brand dossier exists** (common for PLAT, BOS, PIPE, XA): use base theme tokens directly from `packages/themes/base/src/tokens.ts` as the design reference. No redirection needed — the design system tokens provide a complete and correct palette. Reserve `/lp-assessment-bootstrap <BIZ>` for operating businesses that will have a distinct brand identity.
161
162### Step 2: Load Design System Context
163
1641. Read `.claude/skills/tools-design-system/SKILL.md` for the token quick-reference
1652. Read `packages/themes/<theme>/src/design-profile.ts` for art-direction defaults and guidance
1663. Read `packages/themes/<theme>/src/assets.ts` for available fonts, gradients, shadows, keyframes, brand colors
1674. Read `packages/themes/<theme>/src/recipes.ts` for branded surface compositions
1685. Read `packages/themes/<theme>/src/tokens.ts` for the business's concrete token values
1696. Read `docs/design-system-handbook.md` for available components
1707. If the feature is complex, also read `docs/typography-and-color.md`
171
172### Step 3: Design Direction
173
174With the brand dossier and tokens loaded, establish a creative direction:
175
176- What density context fits? (`operations` for dashboards, `consumer` for marketing, `hospitality` for booking)
177- What surface layering creates the right depth? (flat vs elevated vs deeply layered)
178- What motion principles serve the user? (subtle transitions vs dramatic reveals)
179- How does the brand personality translate to composition choices?
180
181### Step 4: Build
182
183Implement using:
184- `@acme/design-system` components (atoms, molecules, primitives)
185- Semantic Tailwind tokens (never arbitrary values)
186- `cn()` for conditional class merging
187- Proper TypeScript types for all props
188
189### Step 5: Verify
190
191After building, run `/lp-design-qa` to audit:
192- Token compliance (no arbitrary values)
193- Brand dossier alignment
194- Accessibility (contrast ratios, keyboard navigation, ARIA)
195- Responsive behavior across breakpoints
196
197### Step 6: Document (optional)
198
199For significant features that benefit from visual documentation, suggest `/tools-bos-design-page` to create diagrams showing the component architecture, state flows, or interaction patterns.
200
201## Integration
202
203- **Upstream:** `lp-design-spec` (design spec document — provides layout, component, and token decisions); `lp-do-plan` (IMPLEMENT task with `Execution-Track: code` and UI component scope).
204- **Downstream:** `lp-design-qa` (design and token compliance audit of the built UI); `lp-do-build` (built components committed and verified before QA).
205- **Loop position:** S9A (UI Build) — post-design-spec, pre-design-qa.
206
207## Anti-Patterns
208
209| Do NOT | Do instead |
210|--------|------------|
211| `bg-[#FF6B35]` | `bg-primary` (resolved from theme tokens) |
212| `font-['Plus Jakarta Sans']` | `font-heading` (resolved from theme tokens) |
213| `p-[13px]` | `p-3` (8-pt rhythm: 12px) |
214| `rounded-[7px]` | `rounded-md` (token scale) |
215| Import Google Fonts | Use `font-sans`, `font-heading`, `font-mono` |
216| Create new CSS custom properties | Add tokens to `packages/themes/base/src/tokens.ts` |
217| `style={{ color: '#333' }}` | `className="text-fg"` |
218| Build a custom button | Use `@acme/design-system/shadcn/Button` |