Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Provides design token system and theming framework for consistent, customizable UI styling across all components. Covers complete token taxonomy (color, typography, spacing, shadows, borders, motion, z-index), theme switching (CSS custom properties, theme providers), RTL/i18n support (CSS logical properties), and accessibility (WCAG contrast, high contrast themes, reduced motion). This is the foundational styling layer referenced by ALL component skills. Use when theming components, implementing
.claude/skills/ancoleman-theming-components/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 131% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-04 | ✓→✗ | ▼ Worse | 68% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 104% | 0% |
Comprehensive design token system providing the foundational styling architecture for all component skills, enabling brand customization, theme switching, RTL support, and consistent visual design.
Design tokens are the single source of truth for all visual design decisions. This skill provides:
Critical Architectural Principle:
Component Skills (Behavior + Structure) → Use tokens for ALL visual styling
Design Tokens (Styling Variables) → Define colors, spacing, typography
Theme Files (Token Overrides) → Light, dark, brand-specific valuesStep 1: Reference tokens in your component:
css.button { background-color: var(--button-bg-primary); color: var(--button-text-primary); padding-inline: var(--button-padding-inline); padding-block: var(--button-padding-block); border-radius: var(--button-border-radius); transition: var(--transition-fast); }
Step 2: Themes automatically apply:
html<!-- Light theme --> <html data-theme="light"> <button class="button">Primary Button</button> </html> <!-- Dark theme (same component, different appearance) --> <html data-theme="dark"> <button class="button">Primary Button</button> </html>
No code changes needed - theme switching is automatic!
javascriptfunction setTheme(themeName) { document.documentElement.setAttribute('data-theme', themeName); localStorage.setItem('theme', themeName); } function toggleTheme() { const current = document.documentElement.getAttribute('data-theme'); setTheme(current === 'dark' ? 'light' : 'dark'); } // Load saved theme on page load setTheme(localStorage.getItem('theme') || 'light');
3-tier hierarchy: Primitive → Semantic → Component
css/* Primitive (9-shade scales) */ --color-blue-500: #3B82F6; /* Semantic (purpose-based) */ --color-primary: var(--color-blue-500); --color-success: var(--color-green-500); --color-error: var(--color-red-500); /* Component-specific */ --button-bg-primary: var(--color-primary);
Complete color system: See references/color-system.md
4px base scale:
css--space-1: 4px; --space-2: 8px; --space-4: 16px; --space-6: 24px; --space-8: 32px; --space-12: 48px; /* Semantic */ --spacing-sm: var(--space-2); /* 8px */ --spacing-md: var(--space-4); /* 16px */ --spacing-lg: var(--space-6); /* 24px */
css--font-sans: 'Inter', -apple-system, sans-serif; --font-mono: 'Fira Code', monospace; --font-size-sm: 14px; --font-size-base: 16px; --font-size-lg: 18px; --font-weight-normal: 400; --font-weight-semibold: 600; --font-weight-bold: 700;
css--border-width-thin: 1px; --border-width-medium: 2px; --radius-sm: 4px; --radius-md: 8px; --radius-lg: 12px; --radius-full: 9999px;
css--shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.07); --shadow-md: 0 4px 8px rgba(0, 0, 0, 0.1); --shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.12); --shadow-focus-primary: 0 0 0 3px rgba(59, 130, 246, 0.3);
css--duration-fast: 150ms; --duration-normal: 200ms; --ease-out: cubic-bezier(0, 0, 0.2, 1); --transition-fast: all var(--duration-fast) var(--ease-out);
Reduced motion support:
css@media (prefers-reduced-motion: reduce) { :root { --transition-fast: none; } }
css--z-dropdown: 1000; --z-modal-backdrop: 1040; --z-modal: 1050; --z-tooltip: 1070;
css/* themes/light.css */ :root { --color-primary: #3B82F6; --color-background: #FFFFFF; --color-text-primary: #1F2937; } /* themes/dark.css */ :root[data-theme="dark"] { --color-primary: #60A5FA; --color-background: #111827; --color-text-primary: #F9FAFB; }
css:root[data-theme="my-brand"] { --color-primary: #FF6B35; --font-sans: 'Poppins', sans-serif; --radius-md: 12px; }
Complete theme guide: See references/theme-switching.md
Use logical properties for automatic RTL language support:
| Physical (Avoid) | Logical (Use) | |------------------|---------------| | margin-left | margin-inline-start | | padding-right | padding-inline-end | | text-align: left | text-align: start |
css/* Correct - auto-flips in RTL */ .button { padding-inline: var(--button-padding-inline); margin-inline-start: var(--spacing-sm); }
Complete RTL guide: See references/logical-properties.md
All component skills use this naming convention:
--{component}-{property}-{variant?}-{state?}Examples:
css--button-bg-primary --button-bg-primary-hover --input-border-color-focus --chart-color-1
Components use tokens for ALL styling:
css.button { background-color: var(--button-bg-primary); border-radius: var(--button-border-radius); }
Theme changes automatically update all components.
Complete integration guide: See references/component-integration.md
css:root[data-theme="high-contrast"] { --color-primary: #0000FF; --color-text-primary: #000000; /* 7:1 contrast (WCAG AAA) */ }
css@media (prefers-reduced-motion: reduce) { :root { --duration-fast: 0ms; --transition-fast: none; } }
Complete accessibility guide: See references/accessibility-tokens.md
Transform tokens to any platform:
JSON Tokens → Style Dictionary → CSS Variables
→ iOS Swift
→ Android XML
→ JavaScriptbashnpm run build-tokens
Complete setup guide: See references/style-dictionary-setup.md
json{ "color": { "primary": { "$value": "#3B82F6", "$type": "color" } } }
bash# Generate color scale from base color python scripts/generate_color_scale.py --base "#3B82F6" # Validate token structure python scripts/validate_tokens.py # Check WCAG contrast ratios python scripts/validate_contrast.py # Build all platforms npm run build-tokens
Core Systems:
references/color-system.md - Complete color scales and semanticsreferences/typography-system.md - Type scales and fontsreferences/spacing-system.md - Spacing scale and rhythmImplementation:
references/theme-switching.md - Light/dark mode, custom themesreferences/component-integration.md - How skills use tokensreferences/logical-properties.md - RTL support patternsTools & Accessibility:
references/style-dictionary-setup.md - Multi-platform buildreferences/accessibility-tokens.md - WCAG complianceProgressive disclosure: This SKILL.md provides overview and quick start. Detailed documentation in references/ directory.
Skill chaining architecture: See SKILL_CHAINING_ARCHITECTURE.md
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 9,593 | 5,466 | -43% | 1 | 1 | 0% | 1,602 | 3,563 | +122% | 0 | 0 | — |
case-01 | pass→pass | 15,180 | 15,257 | +1% | 1 | 1 | 0% | 2,629 | 5,364 | +104% | 0 | 0 | — |
case-02 | pass→pass | 10,223 | 6,752 | -34% | 1 | 1 | 0% | 1,850 | 3,790 | +105% | 0 | 0 | — |
case-03 | pass→pass | 3,918 | 4,778 | +22% | 1 | 1 | 0% | 713 | 3,536 | +396% | 0 | 0 | — |
case-04 | pass→fail | 15,634 | 11,272 | -28% | 1 | 1 | 0% | 2,816 | 4,719 | +68% | 0 | 0 | — |
case-10 | pass→pass | 19,450 | 13,661 | -30% | 1 | 1 | 0% | 2,466 | 5,065 | +105% | 0 | 0 | — |
case-06 | pass→pass | 5,302 | 5,826 | +10% | 1 | 1 | 0% | 1,078 | 3,628 | +237% | 0 | 0 | — |
case-07 | pass→pass | 5,056 | 1,956 | -61% | 1 | 1 | 0% | 883 | 2,932 | +232% | 0 | 0 | — |
case-08 | pass→pass | 10,237 | 11,710 | +14% | 1 | 1 | 0% | 1,694 | 4,202 | +148% | 0 | 0 | — |
case-09 | pass→pass | 2,855 | 3,960 | +39% | 1 | 1 | 0% | 507 | 3,335 | +558% | 0 | 0 | — |
case-11 | pass→pass | 16,786 | 27,129 | +62% | 1 | 1 | 0% | 2,867 | 5,568 | +94% | 0 | 0 | — |
case-12 | pass→pass | 12,903 | 12,797 | -1% | 1 | 1 | 0% | 2,361 | 5,068 | +115% | 0 | 0 | — |
case-13 | fail→pass | 11,553 | 8,791 | -24% | 1 | 1 | 0% | 1,852 | 4,269 | +131% | 0 | 0 | — |
case-14 | pass→pass | 5,632 | 4,819 | -14% | 1 | 1 | 0% | 1,013 | 3,504 | +246% | 0 | 0 | — |
case-15 | pass→pass | 15,650 | 19,678 | +26% | 1 | 1 | 0% | 2,784 | 6,136 | +120% | 0 | 0 | — |
case-16 | pass→pass | 11,766 | 12,495 | +6% | 1 | 1 | 0% | 2,146 | 5,054 | +136% | 0 | 0 | — |
case-17 | fail→pass | 13,867 | 9,418 | -32% | 1 | 1 | 0% | 2,574 | 4,411 | +71% | 0 | 0 | — |
case-18 | fail→fail | 15,136 | 17,590 | +16% | 1 | 1 | 0% | 2,997 | 5,966 | +99% | 0 | 0 | — |
case-19 | pass→pass | 12,350 | 12,051 | -2% | 1 | 1 | 0% | 2,345 | 4,622 | +97% | 0 | 0 | — |
case-20 | pass→pass | 3,720 | 3,930 | +6% | 1 | 1 | 0% | 595 | 3,325 | +459% | 0 | 0 | — |
case-21 | pass→pass | 4,409 | 5,555 | +26% | 1 | 1 | 0% | 604 | 3,590 | +494% | 0 | 0 | — |
case-22 | pass→pass | 11,681 | 13,682 | +17% | 1 | 1 | 0% | 2,144 | 4,878 | +128% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.