design-system-builder
Applies a cohesive design system to the project. One skill, 8 moods, infinite variations.
When to use
- Right after
nextjs-scaffold has set up the project
- When user wants to change the whole site's visual direction
- When restyling an existing site to a new mood
When NOT to use
- User wants one-off style changes (just edit the file directly)
- User has a detailed design spec from a designer (follow that instead)
Inputs
From site-plan.md:
mood (one of 8 - see references/palettes.md)
vertical (for font fine-tuning)
Output
Updated files:
src/app/globals.css - palette + typography + spacing tokens
src/lib/constants.ts - brand colors as constants (optional)
- Design tokens documented in a comment block
The 8 moods
1. Warm luxury
- Palette: cream
#FDF8F0, gold #C9A96E, charcoal #2C2418, taupe #D4C5B2
- Fonts: Bodoni Moda (display) + Inter (body)
- Feel: fine dining, spa, boutique
2. Dark luxury
- Palette: near-black
#0A0A0A, gold #D4AF37, cream #F5F0E6, taupe #4A4035
- Fonts: Playfair Display (display) + Inter (body)
- Feel: cocktail bars, jewelers, fine dining
3. Coastal luxury
- Palette: white
#FEFEFE, deep navy #1B3A5B, sand #E8DCC4, seafoam #A8C8BF
- Fonts: Cormorant Garamond (display) + Inter (body)
- Feel: resorts, seafood, yacht clubs
4. Earthy luxury
- Palette: deep forest
#2D3E2C, cream #F7F3E8, terracotta #C87E4F, moss #8B9A6B
- Fonts: Playfair Display (display) + Inter (body)
- Feel: farm-to-table, wellness retreats, eco lodges
5. Modern minimal
- Palette: off-white
#FAFAFA, near-black #1A1A1A, single accent (electric blue #0057FF or neon green #00D8A8)
- Fonts: Inter (single font, multiple weights) OR Space Grotesk
- Feel: SaaS, agencies, portfolios
6. Bold editorial
- Palette: pure white
#FFFFFF, pure black #000000, single vivid accent (magenta #EC008C or electric yellow #FFD600)
- Fonts: oversized serif like Fraunces or Canela (display) + Söhne or Inter (body)
- Feel: magazines, creative studios, restaurants with attitude
7. Playful
- Palette: pastel bright - peach
#FFB89C, mint #B4E4D0, butter #FFE699, dusty rose #EDA9B9
- Fonts: DM Serif Display or Fraunces Soft + Inter or DM Sans
- Feel: cafes, kids brands, casual dining, creator economy
8. Corporate
- Palette: navy
#0B2545, slate #5C6B7D, off-white #F4F6F8, accent blue #00B4D8
- Fonts: Inter (single) OR Source Sans Pro
- Feel: B2B SaaS, finance, healthcare, law
Procedure
Step 1: Read mood from site-plan.md
If no mood picked, ask AskUserQuestion with the 8 options. Show preview colors.
Step 2: Update globals.css
Replace the @theme inline block with the palette for the chosen mood. Keep the structure from nextjs-scaffold/templates/globals.css.template. Do NOT touch the force-override !important rules at the bottom.
Step 3: Update layout.tsx fonts
Replace the next/font/google imports to match the mood's font pairing. Use the variable: prop to wire them up to CSS vars.
Step 4: Add spacing + elevation tokens
In globals.css, add these tokens (8pt grid + 3-tier elevation):
@theme inline {
/* 8pt spacing grid */
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-3: 1rem; /* 16px */
--space-4: 1.5rem; /* 24px */
--space-5: 2rem; /* 32px */
--space-6: 3rem; /* 48px */
--space-7: 4rem; /* 64px */
--space-8: 6rem; /* 96px */
--space-9: 8rem; /* 128px */
/* Elevation - adjust shadow color per mood */
--shadow-sm: 0 1px 2px rgb(0 0 0 / 0.05);
--shadow-md: 0 4px 12px rgb(0 0 0 / 0.08);
--shadow-lg: 0 12px 24px rgb(0 0 0 / 0.12);
}
Step 5: Add interactive state matrix
For each mood, document the state colors in globals.css comments:
/*
* Interactive states for this mood (warm luxury):
* default: gold
* hover: gold-dark
* focus: gold + 2px ring
* active: gold-dark + slight scale
* disabled: gold at 40% opacity
*/
Step 6: Reduced motion
Already handled in template globals.css. Verify @media (prefers-reduced-motion: reduce) block exists.
Step 7: Typography scale
Default scale for display fonts (mood-dependent):
- Hero:
text-5xl sm:text-6xl md:text-7xl lg:text-8xl
- Section heading:
text-3xl md:text-4xl lg:text-5xl
- Subsection:
text-xl md:text-2xl
- Body:
text-base (16px) with leading-relaxed
- Small:
text-sm
- Micro:
text-xs uppercase tracking-[0.2em] (for labels)
Editorial mood uses LARGER sizes (text-7xl hero minimum). Minimal uses SMALLER (text-4xl hero max).
Gotchas
The font-override !important rules are non-negotiable - see nextjs-scaffold Step 5.
Color ramp matters - always include light + dark variants of your accent color (gold + gold-dark). Single-tone accents look flat.
Don't use 8 colors - the palette limits each mood to 4-5 core colors for a reason. Adding more muddies the brand.
Test contrast - run the accessibility-performance skill to verify WCAG AA (4.5:1 for body text, 3:1 for large text and UI).
Fonts cost performance - each next/font/google import adds a request. Stick to 2 families max (display + body). Add script only if the mood requires it.
Scripts/cursive fonts look cheap unless done well. If using Dancing Script for a "luxury" brand, make sure it's sparingly (logo area only). Bodoni italic is a better substitute in most cases.
References
See references/palettes.md for full hex codes, Tailwind configs, and sample mood boards.
Source: avien19/pro-site-builder — distributed by TomeVault.
1---2name: design-system-builder3description: Generates the full visual language (color palette, typography, spacing grid, elevation, interactive states) for a website based on a chosen mood. Supports 8 design moods from warm luxury to playful to corporate. Runs after nextjs-scaffold.4---56# design-system-builder78Applies a cohesive design system to the project. One skill, 8 moods, infinite variations.910## When to use1112- Right after `nextjs-scaffold` has set up the project13- When user wants to change the whole site's visual direction14- When restyling an existing site to a new mood1516## When NOT to use1718- User wants one-off style changes (just edit the file directly)19- User has a detailed design spec from a designer (follow that instead)2021## Inputs2223From `site-plan.md`:24- `mood` (one of 8 - see `references/palettes.md`)25- `vertical` (for font fine-tuning)2627## Output2829Updated files:30- `src/app/globals.css` - palette + typography + spacing tokens31- `src/lib/constants.ts` - brand colors as constants (optional)32- Design tokens documented in a comment block3334## The 8 moods3536### 1. Warm luxury37- Palette: cream `#FDF8F0`, gold `#C9A96E`, charcoal `#2C2418`, taupe `#D4C5B2`38- Fonts: Bodoni Moda (display) + Inter (body)39- Feel: fine dining, spa, boutique4041### 2. Dark luxury42- Palette: near-black `#0A0A0A`, gold `#D4AF37`, cream `#F5F0E6`, taupe `#4A4035`43- Fonts: Playfair Display (display) + Inter (body)44- Feel: cocktail bars, jewelers, fine dining4546### 3. Coastal luxury47- Palette: white `#FEFEFE`, deep navy `#1B3A5B`, sand `#E8DCC4`, seafoam `#A8C8BF`48- Fonts: Cormorant Garamond (display) + Inter (body)49- Feel: resorts, seafood, yacht clubs5051### 4. Earthy luxury52- Palette: deep forest `#2D3E2C`, cream `#F7F3E8`, terracotta `#C87E4F`, moss `#8B9A6B`53- Fonts: Playfair Display (display) + Inter (body)54- Feel: farm-to-table, wellness retreats, eco lodges5556### 5. Modern minimal57- Palette: off-white `#FAFAFA`, near-black `#1A1A1A`, single accent (electric blue `#0057FF` or neon green `#00D8A8`)58- Fonts: Inter (single font, multiple weights) OR Space Grotesk59- Feel: SaaS, agencies, portfolios6061### 6. Bold editorial62- Palette: pure white `#FFFFFF`, pure black `#000000`, single vivid accent (magenta `#EC008C` or electric yellow `#FFD600`)63- Fonts: oversized serif like Fraunces or Canela (display) + Söhne or Inter (body)64- Feel: magazines, creative studios, restaurants with attitude6566### 7. Playful67- Palette: pastel bright - peach `#FFB89C`, mint `#B4E4D0`, butter `#FFE699`, dusty rose `#EDA9B9`68- Fonts: DM Serif Display or Fraunces Soft + Inter or DM Sans69- Feel: cafes, kids brands, casual dining, creator economy7071### 8. Corporate72- Palette: navy `#0B2545`, slate `#5C6B7D`, off-white `#F4F6F8`, accent blue `#00B4D8`73- Fonts: Inter (single) OR Source Sans Pro74- Feel: B2B SaaS, finance, healthcare, law7576## Procedure7778### Step 1: Read mood from site-plan.md7980If no mood picked, ask `AskUserQuestion` with the 8 options. Show preview colors.8182### Step 2: Update globals.css8384Replace the `@theme inline` block with the palette for the chosen mood. Keep the structure from `nextjs-scaffold/templates/globals.css.template`. Do NOT touch the force-override `!important` rules at the bottom.8586### Step 3: Update layout.tsx fonts8788Replace the `next/font/google` imports to match the mood's font pairing. Use the `variable:` prop to wire them up to CSS vars.8990### Step 4: Add spacing + elevation tokens9192In `globals.css`, add these tokens (8pt grid + 3-tier elevation):9394```css95@theme inline {96 /* 8pt spacing grid */97 --space-1: 0.25rem; /* 4px */98 --space-2: 0.5rem; /* 8px */99 --space-3: 1rem; /* 16px */100 --space-4: 1.5rem; /* 24px */101 --space-5: 2rem; /* 32px */102 --space-6: 3rem; /* 48px */103 --space-7: 4rem; /* 64px */104 --space-8: 6rem; /* 96px */105 --space-9: 8rem; /* 128px */106107 /* Elevation - adjust shadow color per mood */108 --shadow-sm: 0 1px 2px rgb(0 0 0 / 0.05);109 --shadow-md: 0 4px 12px rgb(0 0 0 / 0.08);110 --shadow-lg: 0 12px 24px rgb(0 0 0 / 0.12);111}112```113114### Step 5: Add interactive state matrix115116For each mood, document the state colors in globals.css comments:117118```css119/*120 * Interactive states for this mood (warm luxury):121 * default: gold122 * hover: gold-dark123 * focus: gold + 2px ring124 * active: gold-dark + slight scale125 * disabled: gold at 40% opacity126 */127```128129### Step 6: Reduced motion130131Already handled in template globals.css. Verify `@media (prefers-reduced-motion: reduce)` block exists.132133### Step 7: Typography scale134135Default scale for display fonts (mood-dependent):136- Hero: `text-5xl sm:text-6xl md:text-7xl lg:text-8xl`137- Section heading: `text-3xl md:text-4xl lg:text-5xl`138- Subsection: `text-xl md:text-2xl`139- Body: `text-base` (16px) with `leading-relaxed`140- Small: `text-sm`141- Micro: `text-xs uppercase tracking-[0.2em]` (for labels)142143Editorial mood uses LARGER sizes (text-7xl hero minimum). Minimal uses SMALLER (text-4xl hero max).144145## Gotchas1461471. **The font-override `!important` rules are non-negotiable** - see nextjs-scaffold Step 5.1481492. **Color ramp matters** - always include light + dark variants of your accent color (gold + gold-dark). Single-tone accents look flat.1501513. **Don't use 8 colors** - the palette limits each mood to 4-5 core colors for a reason. Adding more muddies the brand.1521534. **Test contrast** - run the accessibility-performance skill to verify WCAG AA (4.5:1 for body text, 3:1 for large text and UI).1541555. **Fonts cost performance** - each `next/font/google` import adds a request. Stick to 2 families max (display + body). Add script only if the mood requires it.1561576. **Scripts/cursive fonts look cheap unless done well.** If using Dancing Script for a "luxury" brand, make sure it's sparingly (logo area only). Bodoni italic is a better substitute in most cases.158159## References160161See `references/palettes.md` for full hex codes, Tailwind configs, and sample mood boards.162163---164> Source: [avien19/pro-site-builder](https://github.com/avien19/pro-site-builder) — distributed by [TomeVault](https://tomevault.io).165<!-- tomevault:4.0:skill_md:2026-05-22 -->