
Tailwind Ui
- 25 installs
- 15 repo stars
- Updated August 3, 2026
- boise-state-development/agentcore-public-stack
tailwind-ui is a Claude Code skill that applies Tailwind CSS v4.1 best practices with WCAG 2.1 AA accessibility, theming, and dark mode support.
About
tailwind-ui is a Claude Code skill for Tailwind CSS v4.1 development with WCAG 2.1 AA accessibility, theming, and dark mode support. It provides a quick reference of v4.1 breaking changes, deprecated-to-replacement utility mappings, essential patterns, and pointers to reference files on migration, accessibility, theming, and components. A developer uses it when styling components or building accessible UI patterns. It complements the angular-best-practices skill for Angular frontends.
- Applies Tailwind CSS v4.1 best practices with WCAG 2.1 AA accessibility baked in
- Maps deprecated v4 utilities to their current replacements
- Covers theming, dark mode, and accessible component patterns via reference files
Tailwind Ui by the numbers
- 25 all-time installs (skills.sh)
- Ranked #1,503 of 2,245 Frontend Development skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
tailwind-ui capabilities & compatibility
- Capabilities
- style with tailwind · build accessible components · configure dark mode · apply theming
- Use cases
- frontend · ui design
- Runs
- Runs locally
- Pricing
- Free
What tailwind-ui says it does
Tailwind CSS v4.1 best practices with WCAG 2.1 AA accessibility, theming, and dark mode support.
Tailwind CSS v4.1 development with accessibility and theming baked in.
**Never use @apply** — Use CSS variables or framework components
npx skills add https://github.com/boise-state-development/agentcore-public-stack --skill tailwind-uiAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 25 |
|---|---|
| repo stars | ★ 15 |
| Last updated | August 3, 2026 |
| Repository | boise-state-development/agentcore-public-stack ↗ |
What it does
Style components with Tailwind CSS v4.1 following accessibility, theming, and dark mode best practices.
Who is it for?
Developers styling components or building accessible UI patterns with Tailwind CSS v4.1
Skip if: Using deprecated Tailwind utilities like bg-opacity-* or @apply, which the skill forbids
When should I use this skill?
working with Tailwind CSS, styling components, or building accessible buttons, forms, cards, or navigation
What you get
Components use current v4.1 utilities with proper contrast, focus states, theming, and dark mode.
- accessible Tailwind components
- themed light and dark mode styles
- v4.1-compliant utility usage
By the numbers
- Tailwind CSS v4.1
- WCAG 2.1 AA
- 4 reference files (v4-migration, accessibility, theming, components)
Files
Tailwind UI Skill
Tailwind CSS v4.1 development with accessibility and theming baked in.
Quick Reference
v4.1 Critical Changes
Never use deprecated utilities — always use replacements:
| Deprecated | Replacement |
|---|---|
bg-opacity-* | bg-black/50 (opacity modifier) |
bg-gradient-* | bg-linear-* |
shadow-sm | shadow-xs |
shadow | shadow-sm |
rounded-sm | rounded-xs |
rounded | rounded-sm |
ring | ring-3 |
outline-none | outline-hidden |
leading-* | Use text-base/7 line-height modifiers |
flex-shrink-* / flex-grow-* | shrink-* / grow-* |
space-x-* in flex/grid | Use gap-* instead |
Essential Patterns
<!-- Gap over space utilities -->
<div class="flex gap-4">...</div>
<!-- Opacity modifiers -->
<div class="bg-primary-500/60">...</div>
<!-- Line height modifiers -->
<p class="text-base/7">...</p>
<!-- Dynamic viewport height (mobile-safe) -->
<div class="min-h-dvh">...</div>
<!-- Size utility for equal dimensions -->
<div class="size-12">...</div>Reference Files
Load these based on the task:
- [references/v4-migration.md](references/v4-migration.md) — Full v4.1 breaking changes, upgrade process, new features
- [references/accessibility.md](references/accessibility.md) — WCAG 2.1 AA patterns: contrast, focus, screen readers
- [references/theming.md](references/theming.md) — @theme setup, CSS variables, light/dark mode
- [references/components.md](references/components.md) — Accessible component patterns (buttons, forms, cards, nav)
Theme Asset
- [assets/theme-starter.css](assets/theme-starter.css) — Starter @theme with primary/secondary/tertiary color scales
Core Principles
1. Use Tailwind's scale — Avoid arbitrary values like ml-[16px]; use ml-4 2. Never use @apply — Use CSS variables or framework components 3. Gap over margins — Use gap-* in flex/grid, not space-* or child margins 4. Test both modes — Always verify light AND dark mode appearance 5. Accessibility first — Every interactive element needs visible focus states and proper contrast
@import 'tailwindcss';
/* Support both class-based toggle and system preference */
@variant dark (&:where(.dark, .dark *));
@variant dark (@media (prefers-color-scheme: dark));
@theme {
/* ========================================
Primary Color Scale - Boise State Blue
Base: #0033a0
======================================== */
--color-primary-50: oklch(from #0033a0 calc(l + 0.4) c h);
--color-primary-100: oklch(from #0033a0 calc(l + 0.35) c h);
--color-primary-200: oklch(from #0033a0 calc(l + 0.3) c h);
--color-primary-300: oklch(from #0033a0 calc(l + 0.2) c h);
--color-primary-400: oklch(from #0033a0 calc(l + 0.1) c h);
--color-primary-500: #0033a0;
--color-primary-600: oklch(from #0033a0 calc(l - 0.1) c h);
--color-primary-700: oklch(from #0033a0 calc(l - 0.15) c h);
--color-primary-800: oklch(from #0033a0 calc(l - 0.2) c h);
--color-primary-900: oklch(from #0033a0 calc(l - 0.25) c h);
--color-primary-950: oklch(from #0033a0 calc(l - 0.3) c h);
/* ========================================
Secondary Color Scale - Boise State Orange
Base: #d64309
======================================== */
--color-secondary-50: oklch(from #d64309 calc(l + 0.4) c h);
--color-secondary-100: oklch(from #d64309 calc(l + 0.35) c h);
--color-secondary-200: oklch(from #d64309 calc(l + 0.3) c h);
--color-secondary-300: oklch(from #d64309 calc(l + 0.2) c h);
--color-secondary-400: oklch(from #d64309 calc(l + 0.1) c h);
--color-secondary-500: #d64309;
--color-secondary-600: oklch(from #d64309 calc(l - 0.1) c h);
--color-secondary-700: oklch(from #d64309 calc(l - 0.15) c h);
--color-secondary-800: oklch(from #d64309 calc(l - 0.2) c h);
--color-secondary-900: oklch(from #d64309 calc(l - 0.25) c h);
--color-secondary-950: oklch(from #d64309 calc(l - 0.3) c h);
/* ========================================
Tertiary Color Scale - Accent Blue
Base: #0072ce
======================================== */
--color-tertiary-50: oklch(from #0072ce calc(l + 0.4) c h);
--color-tertiary-100: oklch(from #0072ce calc(l + 0.35) c h);
--color-tertiary-200: oklch(from #0072ce calc(l + 0.3) c h);
--color-tertiary-300: oklch(from #0072ce calc(l + 0.2) c h);
--color-tertiary-400: oklch(from #0072ce calc(l + 0.1) c h);
--color-tertiary-500: #0072ce;
--color-tertiary-600: oklch(from #0072ce calc(l - 0.1) c h);
--color-tertiary-700: oklch(from #0072ce calc(l - 0.15) c h);
--color-tertiary-800: oklch(from #0072ce calc(l - 0.2) c h);
--color-tertiary-900: oklch(from #0072ce calc(l - 0.25) c h);
--color-tertiary-950: oklch(from #0072ce calc(l - 0.3) c h);
/* ========================================
Status Colors
======================================== */
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
--color-info: #3b82f6;
/* ========================================
Surface Colors (for semantic usage)
======================================== */
--color-surface: #ffffff;
--color-surface-dim: #f9fafb;
--color-surface-bright: #ffffff;
--color-surface-dark: #111827;
--color-surface-dark-dim: #1f2937;
--color-surface-dark-bright: #374151;
}
Accessibility Reference (WCAG 2.1 AA)
Color Contrast
Minimum Ratios (AA)
- Normal text: 4.5:1
- Large text (18px+ or 14px+ bold): 3:1
- UI components & graphics: 3:1
Safe Color Combinations
For text on backgrounds, ensure sufficient contrast:
<!-- ✅ High contrast patterns -->
<p class="bg-white text-gray-900">Dark on light</p>
<p class="bg-gray-900 text-white">Light on dark</p>
<p class="bg-primary-500 text-white">White on primary (verify contrast)</p>
<!-- ⚠️ Test these combinations -->
<p class="bg-gray-100 text-gray-600">May fail contrast</p>Testing Contrast
Use browser DevTools or tools like:
- axe DevTools extension
- WAVE extension
- Chrome's built-in contrast checker (inspect element → color picker)
Opacity and Contrast
Opacity reduces contrast — always verify:
<!-- ⚠️ Opacity affects readability -->
<p class="text-gray-900/70">Verify this passes 4.5:1</p>Focus States
Every interactive element must have a visible focus indicator.
Focus Ring Pattern
<!-- ✅ Standard focus ring -->
<button class="focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2">
Click me
</button>
<!-- ✅ For dark backgrounds -->
<button class="focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-offset-2 focus-visible:ring-offset-gray-900">
Click me
</button>Focus-Visible vs Focus
Use focus-visible: for keyboard-only focus states (hides ring on mouse click):
<!-- ✅ Keyboard-only focus ring -->
<a href="#" class="focus-visible:ring-2 focus-visible:ring-primary-500">Link</a>
<!-- Use focus: when you want ring on all focus (including mouse) -->
<input class="focus:ring-2 focus:ring-primary-500" />Focus Within
Style parent when child is focused:
<div class="focus-within:ring-2 focus-within:ring-primary-500">
<input type="text" class="border-0 focus:ring-0" />
</div>Custom Focus Styles
Ensure 3:1 contrast for focus indicators:
<!-- ✅ High-visibility focus -->
<button class="
focus-visible:outline-2
focus-visible:outline-offset-2
focus-visible:outline-primary-500
">
Accessible button
</button>Screen Reader Support
Visually Hidden Content
Use sr-only for screen-reader-only text:
<!-- Icon button with accessible label -->
<button>
<svg class="size-5" aria-hidden="true">...</svg>
<span class="sr-only">Close menu</span>
</button>
<!-- Skip link -->
<a href="#main" class="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4">
Skip to main content
</a>Hiding from Screen Readers
Use aria-hidden="true" for decorative elements:
<!-- Decorative icon -->
<span aria-hidden="true">🎉</span>
<!-- Decorative SVG -->
<svg aria-hidden="true" class="size-5">...</svg>Live Regions
For dynamic content updates:
<!-- Polite announcement (waits for pause) -->
<div aria-live="polite" class="sr-only">
{{ statusMessage }}
</div>
<!-- Assertive announcement (interrupts) -->
<div aria-live="assertive" class="sr-only">
{{ errorMessage }}
</div>Form Labels
Always associate labels with inputs:
<!-- ✅ Explicit association -->
<label for="email" class="block text-sm/6 font-medium">Email</label>
<input id="email" type="email" class="..." />
<!-- ✅ Implicit association -->
<label class="block">
<span class="text-sm/6 font-medium">Email</span>
<input type="email" class="..." />
</label>
<!-- ✅ Hidden label for icon inputs -->
<label for="search" class="sr-only">Search</label>
<input id="search" type="search" placeholder="Search..." />Error States
Announce errors to screen readers:
<input
id="email"
type="email"
aria-invalid="true"
aria-describedby="email-error"
class="border-red-500 focus:ring-red-500"
/>
<p id="email-error" class="text-sm text-red-600" role="alert">
Please enter a valid email address
</p>Motion and Animation
Reduced Motion
Respect user preferences:
<!-- ✅ Disable animations when preferred -->
<div class="transition-transform motion-reduce:transition-none motion-reduce:transform-none">
Animated content
</div>
<!-- ✅ Alternative: reduce animation intensity -->
<div class="duration-300 motion-reduce:duration-0">
Fade in
</div>Safe Animation Patterns
<!-- ✅ Opacity is generally safe -->
<div class="transition-opacity">...</div>
<!-- ⚠️ Transform can cause vestibular issues -->
<div class="transition-transform motion-reduce:transition-none">...</div>Interactive Elements
Minimum Target Size
Interactive elements should be at least 44×44px:
<!-- ✅ Adequate touch target -->
<button class="min-h-11 min-w-11 p-3">
<svg class="size-5">...</svg>
</button>
<!-- ✅ Adequate link target -->
<a href="#" class="inline-block py-3 px-4">Link</a>Disabled States
Communicate disabled state visually and semantically:
<button
disabled
class="bg-gray-300 text-gray-500 cursor-not-allowed"
aria-disabled="true"
>
Disabled
</button>Semantic Structure
Heading Hierarchy
Use proper heading levels (don't skip):
<h1>Page Title</h1>
<h2>Section</h2>
<h3>Subsection</h3>
<h2>Another Section</h2>Landmarks
Use semantic HTML for landmarks:
<header>...</header>
<nav aria-label="Main">...</nav>
<main id="main">...</main>
<aside>...</aside>
<footer>...</footer>Checklist
Before shipping, verify:
- [ ] Color contrast meets 4.5:1 for text, 3:1 for UI
- [ ] All interactive elements have visible focus states
- [ ] Icon buttons have accessible labels
- [ ] Form inputs have associated labels
- [ ] Error messages are announced to screen readers
- [ ] Animations respect
prefers-reduced-motion - [ ] Touch targets are at least 44×44px
- [ ] Heading hierarchy is logical
- [ ] Skip link is present for keyboard users
Accessible Component Patterns
Accessible, theme-aware component patterns for Tailwind CSS v4.1.
Buttons
Primary Button
<button class="
inline-flex items-center justify-center gap-2
px-4 py-2 min-h-11
bg-primary-500 text-white font-medium
rounded-sm shadow-xs
hover:bg-primary-600
focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500
disabled:bg-gray-300 disabled:text-gray-500 disabled:cursor-not-allowed
dark:disabled:bg-gray-700 dark:disabled:text-gray-400
">
Button text
</button>Secondary Button
<button class="
inline-flex items-center justify-center gap-2
px-4 py-2 min-h-11
bg-white text-gray-900 font-medium
border border-gray-300
rounded-sm shadow-xs
hover:bg-gray-50
focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500
dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700
">
Button text
</button>Icon Button
<button class="
inline-flex items-center justify-center
size-11 p-2
text-gray-500 hover:text-gray-700
rounded-sm
hover:bg-gray-100
focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500
dark:text-gray-400 dark:hover:text-white dark:hover:bg-gray-800
">
<svg class="size-5" aria-hidden="true">...</svg>
<span class="sr-only">Close</span>
</button>Form Inputs
Text Input
<div>
<label for="email" class="block text-sm/6 font-medium text-gray-900 dark:text-white">
Email
</label>
<input
type="email"
id="email"
class="
mt-2 block w-full
px-3 py-2
bg-white text-gray-900 placeholder-gray-400
border border-gray-300 rounded-sm shadow-xs
focus:ring-2 focus:ring-primary-500 focus:border-primary-500
dark:bg-gray-800 dark:text-white dark:placeholder-gray-500
dark:border-gray-600 dark:focus:ring-primary-400
"
placeholder="you@example.com"
/>
</div>Input with Error
<div>
<label for="email-error" class="block text-sm/6 font-medium text-gray-900 dark:text-white">
Email
</label>
<input
type="email"
id="email-error"
aria-invalid="true"
aria-describedby="email-error-message"
class="
mt-2 block w-full
px-3 py-2
bg-white text-gray-900
border-2 border-red-500 rounded-sm
focus:ring-2 focus:ring-red-500 focus:border-red-500
dark:bg-gray-800 dark:text-white
"
/>
<p id="email-error-message" class="mt-2 text-sm text-red-600 dark:text-red-400" role="alert">
Please enter a valid email address.
</p>
</div>Select
<div>
<label for="country" class="block text-sm/6 font-medium text-gray-900 dark:text-white">
Country
</label>
<select
id="country"
class="
mt-2 block w-full
px-3 py-2
bg-white text-gray-900
border border-gray-300 rounded-sm shadow-xs
focus:ring-2 focus:ring-primary-500 focus:border-primary-500
dark:bg-gray-800 dark:text-white dark:border-gray-600
"
>
<option>United States</option>
<option>Canada</option>
</select>
</div>Checkbox
<div class="flex items-center gap-3">
<input
type="checkbox"
id="remember"
class="
size-4
rounded-xs border-gray-300
text-primary-500
focus:ring-2 focus:ring-primary-500 focus:ring-offset-2
dark:border-gray-600 dark:bg-gray-800
dark:focus:ring-offset-gray-900
"
/>
<label for="remember" class="text-sm/6 text-gray-900 dark:text-white">
Remember me
</label>
</div>Cards
Basic Card
<article class="
bg-white rounded-sm shadow-sm
border border-gray-200
overflow-hidden
dark:bg-gray-800 dark:border-gray-700
">
<div class="p-6">
<h3 class="text-lg/7 font-semibold text-gray-900 dark:text-white">
Card Title
</h3>
<p class="mt-2 text-sm/6 text-gray-600 dark:text-gray-300">
Card description text goes here.
</p>
</div>
</article>Interactive Card
<a
href="#"
class="
block
bg-white rounded-sm shadow-sm
border border-gray-200
overflow-hidden
hover:shadow-md hover:border-gray-300
focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500
transition-shadow
dark:bg-gray-800 dark:border-gray-700
dark:hover:border-gray-600
"
>
<div class="p-6">
<h3 class="text-lg/7 font-semibold text-gray-900 dark:text-white">
Clickable Card
</h3>
<p class="mt-2 text-sm/6 text-gray-600 dark:text-gray-300">
The entire card is clickable.
</p>
</div>
</a>Card with Image
<article class="
bg-white rounded-sm shadow-sm
border border-gray-200
overflow-hidden
dark:bg-gray-800 dark:border-gray-700
">
<img
src="image.jpg"
alt="Description of image"
class="w-full h-48 object-cover"
/>
<div class="p-6">
<h3 class="text-lg/7 font-semibold text-gray-900 dark:text-white">
Card Title
</h3>
<p class="mt-2 text-sm/6 text-gray-600 dark:text-gray-300">
Card description text.
</p>
</div>
</article>Navigation
Primary Navigation
<nav aria-label="Main navigation" class="bg-white border-b border-gray-200 dark:bg-gray-900 dark:border-gray-700">
<div class="max-w-7xl mx-auto px-4">
<div class="flex items-center justify-between h-16">
<a href="/" class="text-xl font-bold text-gray-900 dark:text-white">
Logo
</a>
<ul class="flex items-center gap-1">
<li>
<a
href="#"
class="
px-4 py-2 rounded-sm
text-sm/6 font-medium
text-gray-900 hover:bg-gray-100
focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500
dark:text-white dark:hover:bg-gray-800
"
aria-current="page"
>
Home
</a>
</li>
<li>
<a
href="#"
class="
px-4 py-2 rounded-sm
text-sm/6 font-medium
text-gray-600 hover:text-gray-900 hover:bg-gray-100
focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500
dark:text-gray-300 dark:hover:text-white dark:hover:bg-gray-800
"
>
About
</a>
</li>
</ul>
</div>
</div>
</nav>Skip Link
Always include a skip link for keyboard users:
<a
href="#main-content"
class="
sr-only focus:not-sr-only
focus:absolute focus:top-4 focus:left-4 focus:z-50
focus:px-4 focus:py-2
focus:bg-primary-500 focus:text-white
focus:rounded-sm focus:shadow-lg
"
>
Skip to main content
</a>Breadcrumbs
<nav aria-label="Breadcrumb">
<ol class="flex items-center gap-2 text-sm/6">
<li>
<a href="#" class="text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white">
Home
</a>
</li>
<li aria-hidden="true" class="text-gray-400">/</li>
<li>
<a href="#" class="text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white">
Products
</a>
</li>
<li aria-hidden="true" class="text-gray-400">/</li>
<li>
<span class="text-gray-900 font-medium dark:text-white" aria-current="page">
Current Page
</span>
</li>
</ol>
</nav>Alerts
Info Alert
<div
role="alert"
class="
flex gap-3 p-4
bg-blue-50 text-blue-800
border border-blue-200 rounded-sm
dark:bg-blue-900/20 dark:text-blue-300 dark:border-blue-800
"
>
<svg class="size-5 shrink-0 mt-0.5" aria-hidden="true">...</svg>
<div>
<h4 class="font-medium">Information</h4>
<p class="mt-1 text-sm/6">This is an informational message.</p>
</div>
</div>Error Alert
<div
role="alert"
class="
flex gap-3 p-4
bg-red-50 text-red-800
border border-red-200 rounded-sm
dark:bg-red-900/20 dark:text-red-300 dark:border-red-800
"
>
<svg class="size-5 shrink-0 mt-0.5" aria-hidden="true">...</svg>
<div>
<h4 class="font-medium">Error</h4>
<p class="mt-1 text-sm/6">Something went wrong. Please try again.</p>
</div>
</div>Modals/Dialogs
Dialog Structure
<!-- Backdrop -->
<div
class="fixed inset-0 bg-black/50 dark:bg-black/70"
aria-hidden="true"
></div>
<!-- Dialog -->
<div
role="dialog"
aria-modal="true"
aria-labelledby="dialog-title"
class="
fixed inset-0 flex items-center justify-center p-4
"
>
<div class="
w-full max-w-md
bg-white rounded-sm shadow-xl
dark:bg-gray-800
">
<div class="p-6">
<h2 id="dialog-title" class="text-lg/7 font-semibold text-gray-900 dark:text-white">
Dialog Title
</h2>
<p class="mt-2 text-sm/6 text-gray-600 dark:text-gray-300">
Dialog content goes here.
</p>
</div>
<div class="flex justify-end gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-900/50">
<button class="px-4 py-2 text-sm font-medium text-gray-700 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white">
Cancel
</button>
<button class="px-4 py-2 text-sm font-medium bg-primary-500 text-white rounded-sm hover:bg-primary-600">
Confirm
</button>
</div>
</div>
</div>Loading States
Spinner
<div role="status" class="flex items-center gap-2">
<svg
class="size-5 animate-spin text-primary-500"
viewBox="0 0 24 24"
aria-hidden="true"
>
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" fill="none"/>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"/>
</svg>
<span class="sr-only">Loading...</span>
</div>Skeleton
<div class="animate-pulse">
<div class="h-4 bg-gray-200 rounded-sm w-3/4 dark:bg-gray-700"></div>
<div class="mt-2 h-4 bg-gray-200 rounded-sm w-1/2 dark:bg-gray-700"></div>
</div>Accessibility Checklist per Component
- [ ] Visible focus states with adequate contrast
- [ ] Proper ARIA attributes where needed
- [ ] Screen reader text for icon-only buttons
- [ ] Labels associated with form inputs
- [ ] Error states announced with
role="alert" - [ ] Light and dark mode both styled
- [ ] Minimum 44×44px touch targets
- [ ] Motion respects
prefers-reduced-motion
Theming Reference
@theme Configuration
Define custom theme values in your CSS:
@import 'tailwindcss';
@theme {
/* Custom colors become utilities: bg-brand, text-brand, etc. */
--color-brand: #0033a0;
/* Color scales */
--color-primary-500: #0033a0;
--color-primary-600: oklch(from #0033a0 calc(l - 0.1) c h);
/* Custom spacing */
--spacing-18: 4.5rem;
/* Custom radius */
--radius-pill: 9999px;
}CSS Variables Access
Access theme values in custom CSS:
.custom-element {
background: var(--color-primary-500);
border-radius: var(--radius-lg);
padding: var(--spacing-4);
}
/* Spacing function for calculations */
.custom-layout {
margin-top: calc(100vh - --spacing(16));
}Light/Dark Mode Setup
Supporting Both Mechanisms
Support class-based toggle AND system preference:
@import 'tailwindcss';
/* Dark mode activates with .dark class OR system preference */
@variant dark (&:where(.dark, .dark *));
@variant dark (@media (prefers-color-scheme: dark));Theme-Aware Colors
Define colors that adapt to light/dark:
@theme {
/* Semantic colors that flip in dark mode */
--color-surface: white;
--color-surface-dark: #1a1a1a;
--color-text: #111827;
--color-text-dark: #f3f4f6;
}<div class="bg-surface text-text dark:bg-surface-dark dark:text-text-dark">
Content adapts to mode
</div>Dark Mode Patterns
Basic Pattern
Light styles first, then dark overrides:
<div class="bg-white text-gray-900 dark:bg-gray-900 dark:text-white">
Mode-aware content
</div>Ensuring Neither Mode Is Neglected
Always test both modes. Common oversights:
<!-- ❌ Forgot dark mode -->
<div class="bg-white text-gray-900">
Invisible in dark mode
</div>
<!-- ❌ Forgot light mode -->
<div class="dark:bg-gray-900 dark:text-white">
Unstyled in light mode
</div>
<!-- ✅ Both modes covered -->
<div class="bg-white text-gray-900 dark:bg-gray-900 dark:text-white">
Works in both modes
</div>Systematic Approach
1. Design light mode first with full styling 2. Add dark: variants for every color utility 3. Test by toggling modes frequently during development
Border and Divide Colors
Don't forget borders:
<div class="border border-gray-200 dark:border-gray-700">
<div class="divide-y divide-gray-200 dark:divide-gray-700">
<div>Item 1</div>
<div>Item 2</div>
</div>
</div>Ring and Focus Colors
<button class="
focus-visible:ring-2
focus-visible:ring-primary-500
focus-visible:ring-offset-2
focus-visible:ring-offset-white
dark:focus-visible:ring-offset-gray-900
">
Button
</button>Shadows in Dark Mode
Shadows are less visible on dark backgrounds:
<!-- ✅ Adjusted shadow for dark mode -->
<div class="shadow-lg dark:shadow-2xl dark:shadow-black/25">
Card
</div>Form Inputs
<input class="
bg-white border-gray-300 text-gray-900 placeholder-gray-400
dark:bg-gray-800 dark:border-gray-600 dark:text-white dark:placeholder-gray-500
focus:ring-primary-500 focus:border-primary-500
"/>Color Palette Strategy
Using oklch for Scales
Generate consistent color scales from a base color:
@theme {
/* Base color */
--color-primary-500: #0033a0;
/* Lighter shades (increase lightness) */
--color-primary-400: oklch(from #0033a0 calc(l + 0.1) c h);
--color-primary-300: oklch(from #0033a0 calc(l + 0.2) c h);
/* Darker shades (decrease lightness) */
--color-primary-600: oklch(from #0033a0 calc(l - 0.1) c h);
--color-primary-700: oklch(from #0033a0 calc(l - 0.15) c h);
}Semantic Color Naming
Consider semantic names for common use cases:
@theme {
/* Action colors */
--color-action-primary: var(--color-primary-500);
--color-action-secondary: var(--color-secondary-500);
/* Status colors */
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
/* Surface colors */
--color-surface-1: white;
--color-surface-2: #f9fafb;
--color-surface-3: #f3f4f6;
}Theme Toggle Implementation
Angular Example
// theme.service.ts
@Injectable({ providedIn: 'root' })
export class ThemeService {
private darkMode = signal(false);
constructor() {
// Check system preference on init
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const stored = localStorage.getItem('theme');
this.darkMode.set(stored === 'dark' || (!stored && prefersDark));
this.applyTheme();
}
toggle() {
this.darkMode.update(v => !v);
localStorage.setItem('theme', this.darkMode() ? 'dark' : 'light');
this.applyTheme();
}
private applyTheme() {
document.documentElement.classList.toggle('dark', this.darkMode());
}
}<!-- Theme toggle button -->
<button (click)="themeService.toggle()" class="p-2 rounded-sm">
<svg class="size-5 dark:hidden"><!-- sun icon --></svg>
<svg class="size-5 hidden dark:block"><!-- moon icon --></svg>
<span class="sr-only">Toggle theme</span>
</button>Checklist
- [ ] Both light and dark modes have complete styling
- [ ] Borders and dividers adapt to mode
- [ ] Focus rings have appropriate offset colors
- [ ] Form inputs are styled for both modes
- [ ] Shadows are visible in dark mode
- [ ] Text contrast meets WCAG AA in both modes
- [ ] Theme toggle persists preference
- [ ] System preference is respected as default
Tailwind CSS v4.1 Migration Reference
Upgrade Process
1. Ensure clean git state 2. Run: npx @tailwindcss/upgrade@latest 3. Review all changes for false positives 4. Test thoroughly
Removed Utilities
These utilities no longer exist — use the replacement:
| Removed | Replacement |
|---|---|
bg-opacity-* | bg-black/50 |
text-opacity-* | text-black/50 |
border-opacity-* | border-black/50 |
divide-opacity-* | divide-black/50 |
ring-opacity-* | ring-black/50 |
placeholder-opacity-* | placeholder-black/50 |
flex-shrink-* | shrink-* |
flex-grow-* | grow-* |
overflow-ellipsis | text-ellipsis |
decoration-slice | box-decoration-slice |
decoration-clone | box-decoration-clone |
Renamed Utilities
| v3 Name | v4 Name |
|---|---|
bg-gradient-* | bg-linear-* |
shadow-sm | shadow-xs |
shadow | shadow-sm |
drop-shadow-sm | drop-shadow-xs |
drop-shadow | drop-shadow-sm |
blur-sm | blur-xs |
blur | blur-sm |
backdrop-blur-sm | backdrop-blur-xs |
backdrop-blur | backdrop-blur-sm |
rounded-sm | rounded-xs |
rounded | rounded-sm |
outline-none | outline-hidden |
ring | ring-3 |
Layout and Spacing
Gap Over Space
Always use gap-* in flex/grid layouts:
<!-- ❌ Never -->
<div class="flex space-x-4">...</div>
<!-- ✅ Always -->
<div class="flex gap-4">...</div>Space utilities break with flex-wrap and add margins to children. Gap works correctly in all cases.
Viewport Units
Use dynamic viewport height for mobile compatibility:
<!-- ❌ Buggy on mobile Safari -->
<div class="min-h-screen">...</div>
<!-- ✅ Works everywhere -->
<div class="min-h-dvh">...</div>Size Utility
Use size-* for equal width and height:
<!-- ❌ Verbose -->
<div class="h-12 w-12">...</div>
<!-- ✅ Concise -->
<div class="size-12">...</div>Typography
Line Height Modifiers
Never use separate leading-* classes:
<!-- ❌ Old pattern -->
<p class="text-base leading-7">...</p>
<!-- ✅ v4 pattern -->
<p class="text-base/7">...</p>Font Size Reference
text-xs= 12pxtext-sm= 14pxtext-base= 16pxtext-lg= 18pxtext-xl= 20px
Gradients
Linear Gradients
<!-- ✅ v4 syntax -->
<div class="bg-linear-to-r from-primary-500 to-secondary-500">...</div>Radial Gradients
<div class="bg-radial from-primary-500 to-transparent">...</div>
<div class="bg-radial-[at_50%_75%] from-sky-200 to-indigo-900">...</div>Conic Gradients
<div class="bg-conic from-primary-500 via-secondary-500 to-primary-500">...</div>New v4.1 Features
Container Queries
<article class="@container">
<div class="flex flex-col @md:flex-row @lg:gap-8">
<img class="w-full @md:w-48" />
<div class="mt-4 @md:mt-0">...</div>
</div>
</article>Text Shadows
<h1 class="text-shadow-lg">Large shadow</h1>
<p class="text-shadow-sm/50">With opacity</p>Masking
<div class="mask-t-from-50%">Top fade</div>
<div class="mask-radial-[100%_100%] mask-radial-from-75%">Radial mask</div>CSS Variables
Accessing Theme Values
.custom {
background: var(--color-primary-500);
border-radius: var(--radius-lg);
}Spacing Function
.custom {
margin-top: calc(100vh - --spacing(16));
}Responsive Design
Only add breakpoint variants when values change:
<!-- ❌ Redundant -->
<div class="px-4 md:px-4 lg:px-4">...</div>
<!-- ✅ Efficient -->
<div class="px-4 lg:px-8">...</div>Common Pitfalls
1. Using old opacity utilities instead of /opacity syntax 2. Redundant breakpoint classes 3. space-* in flex/grid instead of gap-* 4. Separate leading-* instead of line-height modifiers 5. min-h-screen instead of min-h-dvh 6. Using @apply instead of CSS variables or components 7. Arbitrary values when scale values exist
PK��[�wTn�S
tailwind-ui/SKILL.mduV�nG��WT�C$b��d�G0!�N�q"9.�
Ζ�Rt�G��%y5��5]��j�Z�RQ�3���m���Q�����2�"����A�����^Д}���$=�mXП��t �xL:�۩Mm����|���nIYa�|U��C����i]�%.6�??��1�1��I��YY���S}q�9�+�Zju�p��p�̓�>�4+��P�d�u�
;�cij�P����ieS#�t�L_~�R��.��\2.�P�^Թ��o����εDvH�b(g^��)�����6M����98Ĺ��H!��I�$�r/���8o�W��(lb�D1��M��
�|����ɒ��;FX�v�@�:#uJ�X�>�>A��
95\:NiCU���Ͽ�ӵ�����2�I��(z��^� �\z������A�I��\�N��L�!L!��:��i˓TڙewF���ic���sc$B�r�/�)��g5�==�=�.��(,WT�a�IvǭhK�c��HD���z�R�*�u*G%����p��J�E��H
l�1���<�aB�w����o$g)?*��ΥH�Z����A��sK�#��z���I�FsgMg�\�
��������xC��"���d�Y��N)��K*�Q��;oI��荱+JR��O/D!���7��������� ���H{�l��F�:?�>?����Q�j���ىsPv�w�Z����ZZ_u�(AV^����.ԣZ(�Z�so��Ⱪ�U!�Ƣb<Ẕ���r
���|[��� ]7�N�1T�u�
�/Q������Օ�,J��m��v�<�l0���
��)��u�O�>SUJY2�L!M*���4c*���u�C��N�������8�G�ۖy��'w��
s�CU�MW��jL�N��v�i�gߡ�=N�k�O�-�R��(���-<Ԗ�Q��M����+<Ԡ�����N��t��7���z�6�h��
��i'��L�7[n��-'�eM�� i(݄��7�;�Wz�vS�<q�ӊ��<�R���u��m�c=��p5�.�]ouY��OT�eK�����$��V��m���s������Q/B�:��ue�����AV�i�����0�� �2;۴K����Β?0�d�^ �xo�Ϭ��z�
,C"d�X1q�����@�m���U�(В�+�PK%�[@�Q��$tailwind-ui/assets/theme-starter.css��ێ�0���#U�����)�J�>@+�p���IѪ��!l�Ġ�7������??k�
Q�SIxz�yL�|ZY�������r4%R:�,����R$�A�ɒep,a�����Z�!������W�?/�{���_����h�߸�X� �M6��"-�#�ely�SCֺ��_@��;�ڭ�/�3"��G����>�\2ؖ�d�I+��ݨf���u���ͣ{��Sp�����]B�ҽ��"{��%���p�'#��WM��ޤ��0�߁��m��'�io������3svǜ}~m��6nLxm(�/��=ӏ�e�h��f��$�]&�M7|D0�&�&�
�\pM4:���@�
���k��y�~\xM::�\�����D��|�+���kBx�5 � �#�D����d�'xHF��(����2e}���}��Oy.�N���zZq�>������x�xNG�E�#��Ǒ{��۞���n�ݴ8�;n.b<}�4�y4�T��>���(s�d����TJfR����(\x�n�D�<ߩX2
�ucL�B�K&ju#<O
����>�]%��մv�~$��?aN��d�F��|J_�uZ+=��<��aB��G����U
,��O^����-�6�ky�Ûڂ�|�M�9���PK��[���{'tailwind-ui/references/accessibility.md��n#I����p$6���e��H&�ىH`gfR��ew)�U�U�I�j�}Y$^@BHH >�w�d~>�s����ċծ:���2�2f_p��\�%�Lf��~:�}E��l��$;;�L ��WZM�ţr�%/�\S˕!�6%/^�B�
b٣}�bB��_O��%�+����O�� {p�%� 9
�.H��JI&�!?$+M��g)"�aN����\p��H�$o��%ɂfw+�j����ISkFL�\�m�╚$���maK�L����_�'���hHE�eZ���ɴ"��Ɯ������+�������^�N�P}����q��=��0:�DXD�y�Ҽ�z���@���Z ��L�庑}��
��������
�l�CC7��V� z9�_�~WtM������6��A�\�:A�X-�z0L�7��F)a���}~�&�z���[�������y��Ъd_����)�����ew�f�KS��&X�����?L�b��ˊf�T���fy
�Ғ��ݟtm�7�V�x7d�K�!�Ӑn};�bg�c0�G�A[p�g�w�Ե2y��ڐ���Aԟ�0k�%D)�,�g��e
RN(����2��J�{Kx����>��J��<����Y��B���D�Vp�R ��� ��á�n�\���0��NB����,��=�&�AT��L�2���`>՟陻�6K��sB�18����A�}���O�;�^(pH��X�d��9>uKUc�#��J�))4[��vF���:�2'����'T��
y(�$kU�
a��BQ �3Q�x�4��rqYնv]Q�E �Ms�Or
�}n�`�jL'OVp��CG��]����o�G�o��Y�Av���/�iJ�L���:xɧc`�Q��[�M5���VͲ-\+yo�j|��Xy����Ύ�~H��j2�I���g�8��c<���!�L3p�5�X���
dR
1���`�ăwCB��g�qTR���$@�l�"���Kh+��&��rn6��h4����#B5�i�D��:����t���������3�@h��5��Vٛ��
ک���ْr9ڠbK*��O��(Q�R7��J�÷`K�;�8VV$����2��M09f�zu�E��m[�{"g�Ҵ�ƶB�M��!N_g����o��]4����Wܴ��Ṏ�=/��5[�h����Y���+����B����~��@�5�m�'�f'��an��9�o\���D%����oc��\g0Qh�z���t]Y3̓F������\;�V��S�4�C�Q���1>�\a,O�40nD��s�v2b��-�BA�uc�)�_��i�r^���s��r�Mx���ŹOB���V���y������y�|�nt�a�=��ܕ��8>[�}��f�Y��;�R��R���+`�c@�#G�`8�`i��Y�DC�/�ė�^,x�`����_�2�߅.��T �K�x
cQ����u�Hc�`X�I�7�p4J�n�o�$6��qpu"Z L%���`J!��� �%��y�!�����\l�2�%�E�7�[U��$���?5.]��+�`V��b������G�ۂ���1M��s�t�S�4M: n�E,w�[����v�)[(�L�Z���$�f��n�A��-i�Z;��\ٗ���3�[�6 �U��{Cc� �[���������a�*��KW밲76ΰn`c����E-($�153�'u�!w��*�C;����%sh�Ir����FR����yK��������q(g9��Ʀ`U��z�Ch�eZ�?�J�FOL]��=�/6L��幽�p�U�Z�uzD�G���� ��ZyS��TY�'pF�x�66������m�
HppеQ0��;E+����l�~e�6J�8�A���2�F����C�v��ufa��j��qp?T���*�*(@E����n���"{�hqp���n���/��8��a���!����^���(��@���.J;��maø3h�2ywsu���=�\�����q>¾x2��)������C���'����ܟ��d�T�F�1��j �OS?c %^���lߡR�+���(��}%c6�9�0,^���}�X3س���:�?�煀�Y���>!��&g���G���0"�vRͷ'��@ۺt�|��}�P��ԗ�ۀqө-��fm
�1���X܅Zar�v��G;�G������&�PK�[�@;aI
K)$tailwind-ui/references/components.md�Z�n���`�+��\N��朢l�����)
��h�JTI*��E�@}�ouq�m�=�
b�x�73���I"%]1�ny^�
}�JQ�Ѩy�G�2��o� (����/Zs�>cʶ�H���=zZ�g����;��R����A㓠9{G�2���re(aXʫh�--H�fd��"��X����������e<���.^�r�QN�8�g3 �6qiW�O�S��N�����$�U������̑�pʷ�N9�OD\��M�@^��5���2����z-�:�:��N���6Ջn��'�vM4��iHN*!���b�ߒTτ��eo�s=����sD�0Ԃc�5ZN,2�*��=Ix�~_-h
�?�>���Ha"�����:y�1�Z�~�B���C�����f��H�>F�����+8�ũ���ņv�|Oܳ7��Z�^�Cav��f�x)�6^Vf���8�iJ��H��D���x9��vH�k�J����[�%�>���39�P��r^�3�g v)}2+0�"L;ܫ���r#�܊���"#��Yh��(��,B����
��Y�&�[�/�_�h�j6:��\e���1G�>1���L�d8!g�5,�fĠ��r�}���x屍�d�d7i[��s�����N0d���Za�^E{^���p^22�cX��h�2���F
m���/Bpq��Dw��uɱa���h�~ml���D&��H�ڷ��R�
y}�l韞���t�-|A�����9��Vk����ʯ��ٹC�����f�мv�̈P�O�`I�=02� ��i*`������=a$y��% :%���|�v���IˉW7������:~��&+�%/���oHѽ���Q[]nq�S��CΈ���IW|�V/�~�#h�q$n��wHN�Ch��{�^�;9)���B�38�샕�t}�S�ԫ����j!x4t���ꆣ������b��(�=�41�S,M �l0������@�>7��A��n��Ñux*W��=.���p�frn$9]�!{����5�L��x9�N�
��mA�v�^��S��͘��6�H�A�n�Қ�g9qbo�`E8Q��0�J� ����i�B{1no��np{�!�|
��S���&`��j�Ɩ��a��U��g�w�H���P>F�Gl�6��V�ϙ9ꩮ�h]�ft+о���!&���C�#��o�[�"���fs���D�����~쏯���:\l`��xq���yq��j<���:�����'��zT���k�(�
��Qs�aZ����ă^M���F������s!ǻx���w1�7�'�Գщ/����R���j����u�>�w�B�
0#��o��W��Y��C�Y0ŒѦa�Z�IЦ��(�4��^����}�O����P���q�<��r�4i���rR 0���.�>��9 1i�5��f�~��j?$�M)�[���\���Yq��8�A��T����ς�#�&͏�Di�8ݰ-�KD��U)��[�w��Gs��H�+��u%����<��8��9��"�K^���4��%^I�*sk�����H�7#kU7��:�f����Y�K`��N}å@Md` .>`�:�2��w��.;A�{Ap��*_�gΟ��=*�>68]������͏.[�=p$��5Z
��������5�{o��i�(��� ����z��ko8��t�Iǻ�{[�7��pֵut��lҧlkn �"���r6�i�%�t�����cU�4.|5�V�w�~��T�=h2a5ԓN��i��
���W<�U�����*u켨���*��b� !^����P?g����mFbm�t�
r�u,SP5�lݷ)��c�
�~�B�u M��Ӭ��1;�{�d*��m�5m/6c_{V�D�
x�g�Aw<�LN~���3+�@��|�*���c�'���%���H��#�:��Z��ޓ�i`�p>� �E5�v�٥'~�ZaRC����&���b���v����zj����{w��������6M�S���R�kieF
�TMJ�5gn���}�N���̛T�$��z��9]��p�G�TWg�A�7�^z`H�z7���t��@�W
�Lt��c�z� �����E���(���9< q�Vo�_t���r'P���sBnx��"d�����G�S��퇋�KZ�s��,XB�JF/ċ�W������A�X�2�k��?Q�}�wW�M�|��h����9 AՍ�8�
��=��fs���������Q_�ذ�3}1l��*��xN���&c�u:?�]���-�l�/�lf:��/~�ޞ�O�Ot�_�y��j�x�3�=�ܷ���G�H����=e�$�U���ۇ18ʓɢm����(YXu�~���f����:��ѣ�m/��
��s�7}�Q�����~���ͤ�4�mk�8%���i���R���n~�p��R��
�1ڽ������O�.��
�;��R��&�+����Q�g�I���E��C�c��OalGo9^qQ����!����t�)�"8Lu�zK�g5�w�?�X��_�E���J2��ؐz�;nꟂȒ@f�JH� �ցT\�I�;<��PK��[��NH�&tailwind-ui/references/v4-migration.md�WKs�6��Wl��L�H�-'��h��Izȫ~��Ʉ ����غ3���c���/�|���I���]����\S.�\����
V����DS˕�K�d�Ɉ����H���*b��t/�)4�H0*!����Gc�,��2�����������lƆ�1r�gk�B@�R�0K�aI�a�+�-_1��p�"`S�U����V]�L�X7��D��:e(Y4�
�B�؆����rؔ�f��˘�gApߪs����I�o���L�H��i�mI�
�",P�nrr�g�lcw�<i�m�t����������kM�a�\�Z�I;l��T�}�';BK�6Ĥ��f�|��V�����1�z)�����f�Ż�"U�%1�G��̆��G��A��.$I�~!����"eW���`)4e���c�l�@pɨn6)��]�ա�_�;�yF�V9�KwI��q��U��n��߭��ڒ��s��'�#nUt���Rlc��Q�|��jB�V�u�%��mCHy3٩�m�7�~MKd��w�
]&�|�h�$=Q�X��x���,r ��'��1�� r�a��L������2���yp�M�I�y:r�`�r�!��|<�O�|Ԓ������Έ�����-4�w��6��o�izwiCFu¥�p��������w�=4��(����af\E��:W��[�C��9<�Us�2��֣x�\��PY�=�p�C���H�p��WtI5�B�%I��4cr8z�.��:����*������j(+�B�$�y����#ch]8+O��ez����)�����\Ɉ�y#�B��p]�
q'O�ʅ���S��7*�K�4f�*HWʆ�]ñ��@��=l��߉0{�iYٕ7VU#�MOj�S��_��t��\�T8z}B:��ǃC��0=�7-�a�f��퉏;D�x�i���tt�$�W5��mD��R�1�\4��t�������Z�UFrͱ Krrx�]H�$ׄ���ě���,�_�+ơ[����h�w* �P������''>V��]I�*M���D��`,�0���m�<ߞ�+N�qWv�z�-.�~y}ɨōԴ���)��.��3���j�#M�=Q�;�{��q4R.����"9s�|�P�gI#�&�BT�k2;���邑%3ρ?z�![��Imh'��X�p�gzףt��z�d4���}� �t�׃킀��h��M�z��j���Ji����P����Z���l��<oSk�C�4��#t�^�h^��;�I�{��⤠�$�Y�'h%�C7�[*�:�� �Qa���w��[L�Z�����eX�n�=���U���0
k���E�?:�Z(�e!#�e^\�`D��ǫ��������N?�*F4���B�#3<A��$i7����G�\�``�N?�_���]5��,F�Q`�r\P+���e�qay�\�ȵ���J�t�m��,Ù��[|��Iy�S�o��;�
n-
�%���8���?:[o:�'�{j��굻�u�Vk�{m^
��k�mVs6k�� ���Rz"a�|��������({��1ޔ5���(�t�>�3���l�m��XC�O��PK�[,O2�!tailwind-ui/references/theming.md�X�r����SK3&��ۢ,U��d4��i.:��X������&��]�}�>I�9��RTyF&w���~G��u.*���H-�H��>\Z<�p�g���ZX�gAp-�I�Jc�8��HKi@e��K
W��(noo#c�K�(rm�c�J�U�a�,�����Wp��Ey�kS�xWZ�*���tN����`僭>K����Cfu#�����o�|���lqZ-�^�'�A�o��
��wi4�&M���"�n
!��D0�5�:�L!"
��뿆�w#8�h����"Vem��*MGp�?��Y���y�p�_�VbJ�Hb���V�|�Z)��P�H�Y��TDw3��ͥ���bG�����&V���t�$��c�����?�:=��I�,�"�sEq-S.:Ded*�Ɯ�h�Le�͋�K�p0X�1����M��j6��B���<�0��,�f&eA�J�|��>�h.2eLQ*� ���l>��Ɵ�����(t�?\��6[� +��3t�Ps?����-��q���c����rt?��.���^����+]'������d�4��õϓA��{���!���W�\X�(,FR�/�i�����@kT��ORUPu�uHZ=jJ��*�ϕ�g�7!k������*�t7�;|{�qQq&G�q�.�5��4x������ ��
!����7,��4|�w��q�Zj0��x�����rQ��:�J����`��Yp)��+��Dic_S�� �K���qv>�ӹ2�b��;��arv�l�D�<�pa>fj��+Zj�ύ���4��1N��^�0
�X#X���(-8�C>�\x��������,��� Ëg8���dKeN�V�U>l���ޭ�Y��)�$Ťm-kCݿ���Ê�#��z^�~��?�Xo�m£FP{��B�"����3Ѵ��WI��\�����8�[����1<�%:�r}���Upԇ�\+7P�f\--���Į�b���Q�#��|��Z-���3*�:��Τ�oԣ������CxXǴq��WO+��5D݇6w��v�74ч>�������L����]�ob�r�۴��Ǜ�r�}͏(��!�>o<�P�Ib�
���C
��dU��l7��h��\��=o=�Q��4�R�:UW羫�f{�`���_R`��%��<qD�i�S���C��>MQ����B�[�á�� T���3E��Սެ�#LJ��T'�yZ�c0�=��*�7�C�}ߒx�9��%⎽��E�w�~����7�\0��I���E�'C�̰��?a���L=0F~5�&�g.����xo|�)���?�8(�����HK��#0�j��w��������}��܇�KuD��X>���o���~��[��+��Ⳡ�3�(�4�Mu���t�F��@IyD��c�����ʖς�*��h6x�Y��U�|�ZaK��S�JFPt0=}7l*C0������y�@��er�?
U������� �|H�N�Lw�m��j��n��Ync�����nm>>��T�U!M�Ua�������K�>N�˛�����v�5'�W3��F��yn;�ȇ��匘8�|L!�O<�h���v�Y��f��eds��1#����2�۱ea-�LY&cVi�
:����>¥h����n穵��s�Ҝ5D�NK@��[g���L���v8X���se���Aۭ��ϡC��w���/_6-�5���HW�.sr;m��²�1��%�_�����2۴�~��b�\������y�QUv�����*�~��+�>��p��KN�E^���G�����=�bP�?w�TEw��=�(�J]o�z��Z�Ad��C�f9�a���O��;Wq,��VoJ,���|��p:&��c6�<�"�w
(D
��,]�]�~fG�I.�a��c!�
��������X�\� ���v���Ѹca�L_�? �j��%��
ZI������f@h�HʁB�v���ym<���W��i���u!%���j�=�����oMA�A��P��o
��JS�j�ஓ�2���PK��[�wTn�S
��tailwind-ui/SKILL.mdPK%�[@�Q��$���tailwind-ui/assets/theme-starter.cssPK��[���{'���tailwind-ui/references/accessibility.mdPK�[�@;aI
K)$���tailwind-ui/references/components.mdPK��[��NH�&��qtailwind-ui/references/v4-migration.mdPK�[,O2�!���!tailwind-ui/references/theming.mdPK�n*Related skills
FAQ
What replaces bg-opacity-* in Tailwind v4.1?
Use the opacity modifier syntax like bg-black/50 instead of bg-opacity-*.
Should I use @apply?
No, the skill says never use @apply; use CSS variables or framework components instead.