agentleFS
marcusgollmarcusgoll/Spec-Flow/.claude/skills/shadcn-integration/SKILL.md

shadcn-integration

Skill94 starsChanged 6 months agoMITView on GitHub

Integration guide for shadcn/ui components with OKLCH design tokens. Use when setting up shadcn, customizing themes, or adding components to Next.js projects. Auto-trigger on /init --tokens --shadcn flag.

  • Installs packages

We split this skill into the rules it gives an agent

18 rules. About 0 are common, 11 are distinctive, and 7 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈11

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 7

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Step 1: Run the questionnaire (8 questions)

    line 35
  2. Very specific:

    Step 3: Import in globals.css

    line 45
  3. Distinctive:

    No systematic menu theming

    line 60
  4. Distinctive:

    Use AskUserQuestion tool with these questions in sequence:

    line 75
  5. Distinctive:

    Run the token generation script:

    line 90
  6. Very specific:

    Update app/layout.tsx with font configuration:

    line 121
  7. Distinctive:

    When user selects "Custom" for base color:

    line 265
  8. Very specific:

    Verify @import '../design/systems/shadcn-variables.css' in globals.css

    line 313
  9. Distinctive:

    Check import order (shadcn-variables before @tailwind directives)

    line 314
  10. Very specific:

    Ensure Tailwind config has cssVariables: true

    line 315
  11. Very specific:

    Add className="dark" to html element for class-based dark mode

    line 318
  12. Very specific:

    Verify .dark CSS block exists in shadcn-variables.css

    line 320
  13. Distinctive:

    Verify import path in your component

    line 325
  14. Distinctive:

    Verify correct package installed based on questionnaire choice

    line 328
  15. Distinctive:

    Check import syntax matches package (lucide vs heroicons)

    line 329
  16. Distinctive:

    Ensure tree-shaking is enabled in bundler

    line 330
  17. Very specific:

    Check --radius variable in :root

    line 333
  18. Distinctive:

    Verify Tailwind config has borderRadius extension

    line 334

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md
<objective> The shadcn-integration skill bridges the Spec-Flow OKLCH design token system with shadcn/ui components. It preserves OKLCH's superior accessibility features while enabling seamless use of shadcn's battle-tested component library.

Key Principle: OKLCH tokens remain the source of truth. shadcn CSS variables are aliases that reference OKLCH tokens, not hardcoded values.

This skill is auto-invoked when:

  • User runs /init --tokens --shadcn
  • User asks to add shadcn components to a project
  • Customizing shadcn theme colors or styles
  • Setting up Next.js with shadcn/ui

Benefits:

  • WCAG-compliant colors via OKLCH with perceptual uniformity
  • Full shadcn component library compatibility
  • 8 customization options without manual CSS editing
  • Automatic dark mode support
  • Menu-specific theming with variants</objective>

<quick_start> <trigger_pattern> Auto-invoke when:

  • /init --tokens --shadcn command is run
  • User asks to "add shadcn" or "setup shadcn"
  • User wants to customize theme colors
  • Setting up new Next.js project with components </trigger_pattern>

<basic_workflow> Step 1: Run the questionnaire (8 questions)

/init --tokens --shadcn

Step 2: Review generated files

  • design/systems/shadcn-variables.css - CSS variables
  • components.json - shadcn CLI config
  • components/ui/menu-variants.ts - Menu styling

Step 3: Import in globals.css

@import '../design/systems/shadcn-variables.css';

Step 4: Add components

npx shadcn@latest add button card dropdown-menu

</basic_workflow>

<immediate_value> Before:

  • Manual theme.css editing with hardcoded HSL values
  • Inconsistent color contrast
  • No systematic menu theming
  • Dark mode requires manual CSS duplication

After:

  • 8 questions → complete theme system
  • OKLCH ensures WCAG-compliant contrast
  • Menu variants via tailwind-variants
  • Automatic dark mode via CSS variables </immediate_value> </quick_start>
<workflow> <step number="1"> **Ask 8 Customization Questions**

Use AskUserQuestion tool with these questions in sequence:

  1. Style Preset → Determines shadcn style + density
  2. Base Color → Generates OKLCH primary scale (11 shades)
  3. Theme Mode → Configures light/dark/system preference
  4. Icon Library → Sets package and components.json config
  5. Font Family → Configures next/font
  6. Border Radius → Sets --radius CSS variable
  7. Menu Color → Generates menu background tokens
  8. Menu Accent → Generates menu active state tokens</step>
<step number="2"> **Generate Token Files**

Run the token generation script:

node .spec-flow/scripts/node/generate-shadcn-tokens.js --config answers.json

Generated files:

  • design/systems/shadcn-variables.css - shadcn CSS variable aliases
  • design/systems/tokens.json - Full token definitions
  • components.json - shadcn CLI configuration
  • components/ui/menu-variants.ts - Menu styling with tailwind-variants</step>
<step number="3"> **Install Dependencies**

Based on questionnaire answers:

# Icon library (based on choice)
pnpm add lucide-react  # or @heroicons/react or @phosphor-icons/react

# shadcn dependencies
pnpm add tailwindcss-animate class-variance-authority clsx tailwind-merge

# For menu variants
pnpm add tailwind-variants
</step><step number="4"> **Configure Next.js Layout**

Update app/layout.tsx with font configuration:

import { Inter } from 'next/font/google'

const fontSans = Inter({
  subsets: ['latin'],
  variable: '--font-sans',
})

export default function RootLayout({ children }) {
  return (
    <html lang="en" className={fontSans.variable}>
      <body>{children}</body>
    </html>
  )
}
</step><step number="5"> **Add shadcn Components**

Now users can add components that automatically use the generated theme:

npx shadcn@latest add button
npx shadcn@latest add card
npx shadcn@latest add dropdown-menu
npx shadcn@latest add dialog

Components will use CSS variables from shadcn-variables.css. </step> </workflow>

<reference> ## OKLCH → shadcn Variable Mapping
OKLCH Tokenshadcn VariableUsage
--color-neutral-50--backgroundPage background
--color-neutral-900--foregroundPrimary text
--color-primary-600--primaryBrand actions
--color-neutral-50--primary-foregroundText on primary
--color-neutral-100--mutedSubtle backgrounds
--color-neutral-500--muted-foregroundSecondary text
--color-error-fg--destructiveDelete actions
--color-neutral-200--borderDividers, inputs

Menu Token System

Menu Color Options:

ChoiceEffect
backgroundUses page background
surfaceElevated card with shadow
primaryTint5% primary color wash
glassTransparent + blur

Menu Accent Options:

ChoiceEffect
border3px left border on active
backgroundFull background highlight
iconTintOnly icon changes color
combinedBorder + subtle background

Border Radius Scale

ChoiceValueEffect
None0Sharp corners
Small0.25remMinimal
Medium0.5remModern (default)
Large0.75remSoft
Full9999pxPills

Icon Library Integration

ChoicePackageImport
Lucidelucide-reactimport { Icon } from 'lucide-react'
Heroicons@heroicons/reactimport { Icon } from '@heroicons/react/24/outline'
Phosphor@phosphor-icons/reactimport { Icon } from '@phosphor-icons/react'
</reference>

<quality_gates> FAIL (block next phase):

  • components.json missing after --shadcn flag
  • Icon library package not installed
  • shadcn CSS variable aliases missing from tokens.css
  • tailwindcss-animate not installed

WARN (non-blocking):

  • Font not configured in layout.tsx
  • Dark mode class not on html element
  • Menu variants file missing

Validation commands:

# Check components.json exists
test -f components.json && echo "✓ components.json"

# Check shadcn variables
grep -q "shadcn/ui CSS Variable Aliases" design/systems/shadcn-variables.css && echo "✓ shadcn variables"

# Check icon library
pnpm list lucide-react 2>/dev/null || pnpm list @heroicons/react 2>/dev/null && echo "✓ icon library"

</quality_gates>

<examples> <example name="Full Integration Flow"> ```bash # 1. Run questionnaire /init --tokens --shadcn

Answer 8 questions...

Style: Default

Color: Blue

Theme: System preference

Icons: Lucide

Font: Inter

Radius: Medium

Menu Color: Background

Menu Accent: Left border

2. Files generated automatically

3. Import in globals.css

@import '../design/systems/shadcn-variables.css';

4. Install icon library

pnpm add lucide-react

5. Add components

npx shadcn@latest add button card dropdown-menu

6. Use in components

import { Button } from '@/components/ui/button' <Button variant="default">Click me</Button>

</example>

<example name="Custom Primary Color">
When user selects "Custom" for base color:

```typescript
// AskUserQuestion for custom hue
{
  question: "Enter OKLCH hue value (0-360)",
  header: "Custom Hue",
  options: [
    { label: "Teal (175)", description: "Modern, tech-forward" },
    { label: "Coral (15)", description: "Warm, energetic" },
    { label: "Other", description: "Enter exact value" }
  ]
}

// Result: Full 11-shade scale generated from hue
// oklch(98% 0.045 175) → oklch(14% 0.045 175)
</example><example name="Menu Theming in Action"> ```tsx // components/sidebar.tsx import { menuStyles } from '@/components/ui/menu-variants'

export function Sidebar() { const styles = menuStyles({ menuColor: 'background', menuAccent: 'border' })

return ( <nav className={styles.root()}> <a href="/" data-active={true} className={styles.item()}> <HomeIcon className={styles.icon()} /> <span className={styles.label()}>Home</span> </a> <a href="/settings" className={styles.item()}> <SettingsIcon className={styles.icon()} /> <span className={styles.label()}>Settings</span> </a> </nav> ) }

</example>
</examples>

<troubleshooting>
## Common Issues

**Colors not applying**:
- Verify `@import '../design/systems/shadcn-variables.css'` in globals.css
- Check import order (shadcn-variables before @tailwind directives)
- Ensure Tailwind config has `cssVariables: true`

**Dark mode not working**:
- Add `className="dark"` to html element for class-based dark mode
- Or use `suppressHydrationWarning` with next-themes
- Verify `.dark` CSS block exists in shadcn-variables.css

**Menu variants not found**:
- Install tailwind-variants: `pnpm add tailwind-variants`
- Check `components/ui/menu-variants.ts` exists
- Verify import path in your component

**Icons not loading**:
- Verify correct package installed based on questionnaire choice
- Check import syntax matches package (lucide vs heroicons)
- Ensure tree-shaking is enabled in bundler

**Radius not applying**:
- Check `--radius` variable in :root
- Verify Tailwind config has borderRadius extension
- Some components use `calc(var(--radius) - 2px)` for nested elements
</troubleshooting>

<related_skills>
- `design-tokens` - Core OKLCH token system (this skill extends it)
- `theme-consistency` - Enforces token usage in prototypes
- `mockup-extraction` - Extracts component patterns from mockups
- `frontend-dev` - Uses generated tokens in implementation
</related_skills>

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.