Design System (Mercury)
This skill turns "design system for a fintech onboarding app" into concrete
Figma output: a Variable collection for tokens, Paint Styles, Text Styles,
and a Components page scaffold with buttons/inputs/cards using those tokens.
It refuses to give generic defaults — every recommendation is sourced from
the bundled reference data and justified out loud.
If the designer also asks for a radical / 2030 / anti-SaaS aesthetic, layer
the radical-2030 skill on top of this one. This skill is aesthetically
neutral; radical-2030 biases the style selection toward the forward-looking
end of the catalog.
Reference data (bundled)
All files are in ${CLAUDE_SKILL_DIR}/data/. Read them with standard shell
tools when you need them; do not paste the full CSVs into the conversation.
| File |
Rows |
Purpose |
products.csv |
161 |
Product type → primary/secondary style, landing pattern, dashboard style, color focus |
ui-reasoning.csv |
161 |
Product type → recommended_pattern, style_priority, color_mood, typography_mood, key_effects, anti_patterns |
styles.csv |
85 |
Style catalog + era_2030: yes/no/neutral flag + AI prompt keywords + design system variables |
colors.csv |
161 |
Per-product-type palette: primary, on-primary, secondary, accent, background, foreground, card, muted, border, destructive |
typography.csv |
57 |
Heading + body font pairings with Google Fonts URLs and mood tags |
ux-figma.md |
— |
Distilled UX rules that matter for Figma output (the 99-rule set filtered to what a static frame can express) |
Useful one-liners (run from the skill dir):
# Palette for fintech
python3 -c "import csv; [print(r) for r in csv.DictReader(open('data/colors.csv')) if 'fintech' in r['Product Type'].lower()]"
# Styles flagged era_2030=yes, sorted by No
python3 -c "import csv; [print(r['No'], r['Style Category']) for r in csv.DictReader(open('data/styles.csv')) if r['era_2030']=='yes']"
# Reasoning rule for a given product type
python3 -c "import csv; [print(r) for r in csv.DictReader(open('data/ui-reasoning.csv')) if r['UI_Category']=='Fintech']"
The reasoning flow
Follow this exact order. Don't skip steps and don't generate before reading.
1. Resolve product type
From the designer's brief, pick the single closest match in products.csv
(column Product Type). If they say "budgeting app" → Fintech or Personal
Finance. If they say "language learning app" → EdTech / Language. If you're
not sure, ask — don't guess, because every subsequent step cascades from this
choice.
2. Pull the reasoning rule
Read the matching row in ui-reasoning.csv. This gives:
Recommended_Pattern — the landing / dashboard / app spine
Style_Priority — the default style(s) for this product type
Color_Mood — the brief for how colors should feel
Typography_Mood — the brief for how typography should feel
Key_Effects — the interaction vocabulary (hover durations, transitions,
shadow usage, parallax, etc.)
Anti_Patterns — what to avoid for this product type
3. Select the style
Two different rules depending on whether radical-2030 is loaded:
Without radical-2030 — use Style_Priority from step 2 as the candidate
pool. Pull the matching row(s) from styles.csv.
With radical-2030 — Style_Priority is a 2022-defaults signal and is
precisely what radical-2030 exists to override. Do NOT use it as the pool.
Instead:
- Filter
styles.csv to era_2030 == "yes" — that is the candidate pool.
- Rank candidates by overlap between their
Keywords / AI Prompt Keywords
and the reasoning row's Color_Mood + Typography_Mood + the product
type's own keywords.
- Pick the top match. Cite which
Style_Priority defaults were discarded
and why, so the designer can see the override is deliberate.
- Hard-reject anything with
era_2030 == "no" regardless of signal fit.
In both cases, from the selected style row pull:
Primary Colors and Secondary Colors
Effects & Animation
Design System Variables (the variable names and default values)
AI Prompt Keywords (useful for describing the aesthetic out loud)
4. Select the palette
Pull the matching row from colors.csv. The columns map 1:1 onto shadcn-style
semantic tokens but translate cleanly to Figma Variables:
Primary + On Primary → color/primary + color/on-primary
Secondary + On Secondary
Accent + On Accent
Background + Foreground → color/surface + color/on-surface
Card + Card Foreground
Muted + Muted Foreground
Border, Destructive + On Destructive, Ring
Verify contrast before accepting: primary/on-primary ≥ 4.5:1 for text.
5. Select the type pairing
Scan typography.csv for a pairing whose Mood/Style Keywords overlap the
Typography_Mood from step 2 and the style's mood from step 3. Take the
Heading Font + Body Font + the Google Fonts URL.
6. Emit Figma output
Build in this order (skip any already present — query op:"find" to check):
- Variables collection named after the product (
FinPal / tokens). Create
one mode for light, one for dark. Use variable op:"create-collection",
then create-mode, then create for each token.
- Color tokens: every semantic key from step 4 (primary, on-primary, …).
- Number tokens: spacing scale (4, 8, 12, 16, 24, 32, 48, 64), radius scale
(0, 4, 8, 12, 16, 999 for pill), and elevation levels (0, 1, 2, 3).
- Paint Styles for each color that needs styling beyond variables (e.g. a
brand gradient, an ambient-depth fill). Use
style op:"create-paint".
- Text Styles for h1, h2, h3, body, body-small, label, caption. Set
fontFamily = heading font for h*, body font for body/label/caption.
Use style op:"create-text".
- Components page (
page op:"create" name:"Components"). Scaffold the
minimum useful set, all bound to the variables from step 1:
- Button (variant: primary / secondary / ghost, state: default / hover /
disabled — see
variant-component-setup)
- Input (variant: default / focus / error)
- Card (variant: resting / raised)
- Status bar + tab bar (if mobile)
- Batch it. Group the work into
mcp__mercury__batch calls of ≤40 ops
each (see mercury-gotchas). Export the Components page at the end and
visually confirm.
7. Report
One terse paragraph: "Product type: X. Style: Y (reason: Z). Palette: [brief].
Typography: [heading] + [body]. Scaffolded variables + 4 components on
Components page. Ready to build screens."
What this skill is NOT
- Not a screen builder. It creates the foundation. Screens come next (see
tab-metaphors, ambient-depth).
- Not an AI generator. No Gemini / logo synthesis / Chart.js. The reference
data informs recommendations; all output is vanilla Figma nodes.
- Not a blind copy of the ui-ux-pro-max ecosystem. It drops the web-stack
layer (Tailwind classes, shadcn components, React examples). The underlying
intelligence — product-type reasoning, palette/type/style curation — is
what got ported.
Example invocation
Designer: "design system for a fintech onboarding app" (radical-2030 loaded)
You:
- Product type → "Fintech" in
products.csv
- Reasoning → Style_Priority: "Flat Design + Glassmorphism" (both fall in
the 2022 defaults that radical-2030 overrides), Color_Mood: "trust + bold
contrast", Typography_Mood: "precise, data-forward"
- Style pick → Style_Priority ignored (radical-2030 loaded). Pool =
era_2030=yes. Rank by overlap with "trust + bold contrast + precise +
data-forward" → winner: HUD / Sci-Fi FUI (edge-aligned, monospace,
data-as-ornament matches data-forward; high-contrast matches trust + bold
contrast). Runner-up: Swiss Modernism 2.0. Cite: "Flat Design and
Glassmorphism discarded per radical-2030."
- Palette → Fintech row in colors.csv, but swap the default blue primary for
a HUD-appropriate accent (acid lime or radioactive amber on near-black
surface) — or pick from the style's own
Primary Colors column
- Type → Scan typography.csv for mono + display pairing → "JetBrains Mono +
Space Grotesk" or similar
- Emit → Fintech / tokens variables (light + dark modes), Paint Styles for
the accent + data-grid hairlines, Text Styles (mono for data, display for
headings), 4 components (button / input / card / data-row)
- Report: "Fintech. HUD / Sci-Fi FUI (discarded Flat + Glassmorphism per
radical-2030). Near-black + acid-lime accent. JetBrains Mono + Space
Grotesk. Scaffolded — ready for screens."
1---2name: design-system3description: Turn a product brief into a Figma design system — color palette, type pairing, aesthetic/style, layout spine, and component scaffold — as real Figma Variables, Paint Styles, Text Styles, and Components. Use when the designer asks to "set up a design system", "pick colors and fonts for a new app", "build a brand foundation in Figma", "give me a palette and type scale", "start a new project", "scaffold a design system", or anything that needs a coherent visual foundation before screens get built. Reads from bundled reference data (161 palettes, 57 type pairings, 85 styles, 161 product-type rules) to make opinionated recommendations, not defaults.4---56# Design System (Mercury)78This skill turns "design system for a fintech onboarding app" into concrete9Figma output: a Variable collection for tokens, Paint Styles, Text Styles,10and a Components page scaffold with buttons/inputs/cards using those tokens.11It refuses to give generic defaults — every recommendation is sourced from12the bundled reference data and justified out loud.1314If the designer also asks for a radical / 2030 / anti-SaaS aesthetic, layer15the `radical-2030` skill on top of this one. This skill is aesthetically16neutral; `radical-2030` biases the style selection toward the forward-looking17end of the catalog.1819## Reference data (bundled)2021All files are in `${CLAUDE_SKILL_DIR}/data/`. Read them with standard shell22tools when you need them; do not paste the full CSVs into the conversation.2324| File | Rows | Purpose |25|------|------|---------|26| `products.csv` | 161 | Product type → primary/secondary style, landing pattern, dashboard style, color focus |27| `ui-reasoning.csv` | 161 | Product type → recommended_pattern, style_priority, color_mood, typography_mood, key_effects, anti_patterns |28| `styles.csv` | 85 | Style catalog + `era_2030: yes/no/neutral` flag + AI prompt keywords + design system variables |29| `colors.csv` | 161 | Per-product-type palette: primary, on-primary, secondary, accent, background, foreground, card, muted, border, destructive |30| `typography.csv` | 57 | Heading + body font pairings with Google Fonts URLs and mood tags |31| `ux-figma.md` | — | Distilled UX rules that matter for Figma output (the 99-rule set filtered to what a static frame can express) |3233Useful one-liners (run from the skill dir):3435```bash36# Palette for fintech37python3 -c "import csv; [print(r) for r in csv.DictReader(open('data/colors.csv')) if 'fintech' in r['Product Type'].lower()]"3839# Styles flagged era_2030=yes, sorted by No40python3 -c "import csv; [print(r['No'], r['Style Category']) for r in csv.DictReader(open('data/styles.csv')) if r['era_2030']=='yes']"4142# Reasoning rule for a given product type43python3 -c "import csv; [print(r) for r in csv.DictReader(open('data/ui-reasoning.csv')) if r['UI_Category']=='Fintech']"44```4546## The reasoning flow4748Follow this exact order. Don't skip steps and don't generate before reading.4950### 1. Resolve product type5152From the designer's brief, pick the single closest match in `products.csv`53(column `Product Type`). If they say "budgeting app" → Fintech or Personal54Finance. If they say "language learning app" → EdTech / Language. If you're55not sure, ask — don't guess, because every subsequent step cascades from this56choice.5758### 2. Pull the reasoning rule5960Read the matching row in `ui-reasoning.csv`. This gives:6162- `Recommended_Pattern` — the landing / dashboard / app spine63- `Style_Priority` — the default style(s) for this product type64- `Color_Mood` — the brief for how colors should feel65- `Typography_Mood` — the brief for how typography should feel66- `Key_Effects` — the interaction vocabulary (hover durations, transitions,67 shadow usage, parallax, etc.)68- `Anti_Patterns` — what to avoid for this product type6970### 3. Select the style7172Two different rules depending on whether `radical-2030` is loaded:7374**Without `radical-2030`** — use `Style_Priority` from step 2 as the candidate75pool. Pull the matching row(s) from `styles.csv`.7677**With `radical-2030`** — `Style_Priority` is a 2022-defaults signal and is78precisely what radical-2030 exists to override. Do NOT use it as the pool.79Instead:80811. Filter `styles.csv` to `era_2030 == "yes"` — that is the candidate pool.822. Rank candidates by overlap between their `Keywords` / `AI Prompt Keywords`83 and the reasoning row's `Color_Mood` + `Typography_Mood` + the product84 type's own keywords.853. Pick the top match. Cite which `Style_Priority` defaults were discarded86 and why, so the designer can see the override is deliberate.874. Hard-reject anything with `era_2030 == "no"` regardless of signal fit.8889In both cases, from the selected style row pull:9091- `Primary Colors` and `Secondary Colors`92- `Effects & Animation`93- `Design System Variables` (the variable names and default values)94- `AI Prompt Keywords` (useful for describing the aesthetic out loud)9596### 4. Select the palette9798Pull the matching row from `colors.csv`. The columns map 1:1 onto shadcn-style99semantic tokens but translate cleanly to Figma Variables:100101- `Primary` + `On Primary` → `color/primary` + `color/on-primary`102- `Secondary` + `On Secondary`103- `Accent` + `On Accent`104- `Background` + `Foreground` → `color/surface` + `color/on-surface`105- `Card` + `Card Foreground`106- `Muted` + `Muted Foreground`107- `Border`, `Destructive` + `On Destructive`, `Ring`108109Verify contrast before accepting: primary/on-primary ≥ 4.5:1 for text.110111### 5. Select the type pairing112113Scan `typography.csv` for a pairing whose `Mood/Style Keywords` overlap the114`Typography_Mood` from step 2 and the style's mood from step 3. Take the115`Heading Font` + `Body Font` + the Google Fonts URL.116117### 6. Emit Figma output118119Build in this order (skip any already present — `query op:"find"` to check):1201211. **Variables collection** named after the product (`FinPal / tokens`). Create122 one `mode` for light, one for dark. Use `variable op:"create-collection"`,123 then `create-mode`, then `create` for each token.124 - Color tokens: every semantic key from step 4 (primary, on-primary, …).125 - Number tokens: spacing scale (4, 8, 12, 16, 24, 32, 48, 64), radius scale126 (0, 4, 8, 12, 16, 999 for pill), and elevation levels (0, 1, 2, 3).1272. **Paint Styles** for each color that needs styling beyond variables (e.g. a128 brand gradient, an ambient-depth fill). Use `style op:"create-paint"`.1293. **Text Styles** for h1, h2, h3, body, body-small, label, caption. Set130 `fontFamily` = heading font for h*, body font for body/label/caption.131 Use `style op:"create-text"`.1324. **Components page** (`page op:"create" name:"Components"`). Scaffold the133 minimum useful set, all bound to the variables from step 1:134 - Button (variant: primary / secondary / ghost, state: default / hover /135 disabled — see `variant-component-setup`)136 - Input (variant: default / focus / error)137 - Card (variant: resting / raised)138 - Status bar + tab bar (if mobile)1395. **Batch it.** Group the work into `mcp__mercury__batch` calls of ≤40 ops140 each (see `mercury-gotchas`). Export the Components page at the end and141 visually confirm.142143### 7. Report144145One terse paragraph: "Product type: X. Style: Y (reason: Z). Palette: [brief].146Typography: [heading] + [body]. Scaffolded variables + 4 components on147Components page. Ready to build screens."148149## What this skill is NOT150151- Not a screen builder. It creates the foundation. Screens come next (see152 `tab-metaphors`, `ambient-depth`).153- Not an AI generator. No Gemini / logo synthesis / Chart.js. The reference154 data informs *recommendations*; all output is vanilla Figma nodes.155- Not a blind copy of the ui-ux-pro-max ecosystem. It drops the web-stack156 layer (Tailwind classes, shadcn components, React examples). The underlying157 intelligence — product-type reasoning, palette/type/style curation — is158 what got ported.159160## Example invocation161162Designer: "design system for a fintech onboarding app" (radical-2030 loaded)163164You:1651. Product type → "Fintech" in `products.csv`1662. Reasoning → Style_Priority: "Flat Design + Glassmorphism" (both fall in167 the 2022 defaults that radical-2030 overrides), Color_Mood: "trust + bold168 contrast", Typography_Mood: "precise, data-forward"1693. Style pick → Style_Priority ignored (radical-2030 loaded). Pool =170 era_2030=yes. Rank by overlap with "trust + bold contrast + precise +171 data-forward" → winner: **HUD / Sci-Fi FUI** (edge-aligned, monospace,172 data-as-ornament matches data-forward; high-contrast matches trust + bold173 contrast). Runner-up: Swiss Modernism 2.0. Cite: "Flat Design and174 Glassmorphism discarded per radical-2030."1754. Palette → Fintech row in colors.csv, but swap the default blue primary for176 a HUD-appropriate accent (acid lime or radioactive amber on near-black177 surface) — or pick from the style's own `Primary Colors` column1785. Type → Scan typography.csv for mono + display pairing → "JetBrains Mono +179 Space Grotesk" or similar1806. Emit → Fintech / tokens variables (light + dark modes), Paint Styles for181 the accent + data-grid hairlines, Text Styles (mono for data, display for182 headings), 4 components (button / input / card / data-row)1837. Report: "Fintech. HUD / Sci-Fi FUI (discarded Flat + Glassmorphism per184 radical-2030). Near-black + acid-lime accent. JetBrains Mono + Space185 Grotesk. Scaffolded — ready for screens."