Tailwind CSS Skill
Overview
Expert guidance for Tailwind CSS styling with mobile-first responsive design, custom themes, and utility-first approach. Focuses on accessibility, dark mode, and performance optimization.
When This Skill Applies
This skill triggers when users request:
Styling : "Style this KPI card", "Button component style", "Design a form"
Responsive : "Mobile-first layout", "Responsive dashboard", "Grid with breakpoints"
Themes : "Custom dark theme", "Extend tailwind theme", "Color scheme"
Layouts : "Dashboard grid", "Card layout", "Flexible container"
Core Rules
1. Mobile-First Design
// ✅ GOOD: Mobile-first progressive enhancement
<div className="w-full px-4 py-2 sm:w-1/2 sm:px-6 md:w-1/3 md:px-8 lg:w-1/4">
<KPICard />
</div>
// Breakpoints:
// sm: 640px - Small tablets/phones
// md: 768px - Tablets
// lg: 1024px - Desktops
// xl: 1280px - Large screens
// 2xl: 1536px - Extra large screens
Requirements:
Base styles for mobile (no prefix)
Progressive enhancement with sm:, md:, lg: prefixes
Start with mobile layout, enhance for larger screens
Use responsive breakpoints: sm:640px, md:768px, lg:1024px
2. Responsive Utilities
// ✅ GOOD: Fluid responsive layouts
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4">
{items.map(item => <Item key={item.id} item={item} />)}
</div>
// ✅ GOOD: Responsive spacing
<div className="p-4 sm:p-6 md:p-8 lg:p-12">
Content
</div>
// ✅ GOOD: Container queries (if needed)
<div className="@container">
<div className="@lg:grid-cols-2">
Nested responsive content
</div>
</div>
Requirements:
Use fluid utilities (w-full, flex-1) for mobile
Add breakpoints (sm:, md:, lg:) for larger screens
Consider container queries for nested responsive components
Test layouts at multiple breakpoints (375px, 768px, 1024px, 1440px)
3. Custom Themes
// tailwind.config.ts
export default {
darkMode: 'class', // or 'media'
content: ['./src/**/*.{ts,tsx}'],
theme: {
extend: {
colors: {
primary: {
50: '#eff6ff',
100: '#dbeafe',
500: '#3b82f6',
900: '#1e3a8a',
},
erp: {
'card': '#ffffff',
'card-dark': '#1f2937',
},
},
spacing: {
'18': '4.5rem',
'88': '22rem',
},
fontFamily: {
sans: ['Inter', 'sans-serif'],
},
},
},
plugins: [],
};
Requirements:
Extend theme in tailwind.config.ts, don't override
Use semantic names (primary, secondary, accent)
Define custom colors, fonts, spacing in theme
Support CSS variables for dynamic theming
Use darkMode: 'class' for manual dark mode toggle
4. Component Styling
// ✅ GOOD: Utility-first approach
export const Button = ({ variant, size, children }) => (
<button className={`
font-semibold rounded-lg
${variant === 'primary' ? 'bg-blue-500 text-white hover:bg-blue-600' : 'bg-gray-200 text-gray-800 hover:bg-gray-300'}
${size === 'sm' ? 'px-3 py-1 text-sm' : 'px-4 py-2'}
transition-colors duration-200
focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2
`}>
{children}
</button>
);
// ✅ GOOD: CVA or class-variance-authority for variants
import { cva } from 'class-variance-authority';
const buttonVariants = cva(
'font-semibold rounded-lg transition-colors',
{
variants: {
variant: {
primary: 'bg-blue-500 text-white hover:bg-blue-600',
secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',
},
size: {
sm: 'px-3 py-1 text-sm',
md: 'px-4 py-2',
},
},
}
);
Requirements:
Prefer inline utility classes over custom CSS
Use @apply sparingly (only for repeated patterns)
Extract complex variants with CVA or similar libraries
Follow shadcn/ui patterns for consistent styling
Use template literals for conditional classes
Output Requirements
Code Files
Component Styling :
Inline utility classes in JSX/TSX
Conditional classes for variants (dark/light, sizes)
Focus states and transitions
Configuration :
tailwind.config.ts updates for custom themes
globals.css for global styles and directives
Dark Mode Support :
<div className="bg-white dark:bg-gray-900 text-gray-900 dark:text-white">
Content with dark mode
</div>
Integration Requirements
shadcn/ui : Follow shadcn design tokens and patterns
Accessibility : WCAG 2.1 AA compliant colors, focus-visible states
Performance : Enable JIT mode, purge unused classes
i18n : Support RTL layouts when needed
Documentation
PHR : Create Prompt History Record for styling decisions
ADR : Document theme decisions (color schemes, breakpoints)
Comments : Document non-obvious utility combinations
Workflow
Analyze Layout Requirements
Identify mobile breakpoints
Determine responsive needs
Check dark mode requirements
Apply Mobile-First Styles
Base styles without breakpoints
Progressive enhancement for larger screens
Test on mobile viewport (375px)
Add Responsive Breakpoints
sm: for tablets (640px)
md: for tablets (768px)
lg: for desktops (1024px)
Test at each breakpoint
Apply Dark Mode
Add dark: variants for colors/backgrounds
Test in both light and dark modes
Ensure contrast ratios in both modes
Validate Accessibility
Check color contrast ratios (4.5:1 minimum)
Add focus-visible states for interactive elements
Ensure touch targets are 44px+ on mobile
Quality Checklist
Before completing any styling:
No Horizontal Scroll Mobile : Layout fits 375px without horizontal scroll
Touch Targets : All interactive elements 44px+ on mobile
Dark/Light Variants : Dark mode support with dark: classes
Utility-First : Minimal custom CSS, use Tailwind utilities
Purge Unused : No unused utility classes in production
Focus States : focus-visible or focus:ring on all interactive elements
Contrast Ratios : WCAG 2.1 AA compliant colors (4.5:1 for text)
Responsive Breakpoints : Tested at sm/md/lg breakpoints
Consistent Spacing : Use Tailwind's spacing scale (0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64)
Transitions : Add transition-* classes for smooth state changes
Common Patterns
KPI Card (Mobile-First)
export const KPICard = ({ title, value, trend, loading }) => (
<div className="
w-full p-4 bg-white dark:bg-gray-800
rounded-lg shadow-sm border border-gray-200 dark:border-gray-700
sm:p-6 md:p-8
">
{loading ? (
<Skeleton className="h-20" />
) : (
<>
<h3 className="text-sm font-medium text-gray-600 dark:text-gray-400">
{title}
</h3>
<p className="text-2xl font-bold text-gray-900 dark:text-white mt-2">
{value}
</p>
{trend && (
<span className={`
inline-flex items-center mt-2 text-sm
${trend > 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'}
`}>
{trend > 0 ? '↑' : '↓'} {Math.abs(trend)}%
</span>
)}
</>
)}
</div>
);
Responsive Dashboard Grid
export const DashboardGrid = ({ children }) => (
<div className="
w-full grid gap-4
grid-cols-1
sm:grid-cols-2
md:grid-cols-3
lg:grid-cols-4
xl:grid-cols-5
p-4
">
{children}
</div>
);
Form with Responsive Layout
export const ResponsiveForm = () => (
<form className="
w-full max-w-lg mx-auto
p-4 sm:p-6 md:p-8
bg-white dark:bg-gray-800
rounded-lg shadow-md
">
<div className="space-y-4 sm:space-y-6">
<div>
<label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
Name
</label>
<input className="
w-full px-4 py-2 text-base
border border-gray-300 dark:border-gray-600
rounded-lg
bg-white dark:bg-gray-700
text-gray-900 dark:text-white
focus:ring-2 focus:ring-blue-500 focus:border-blue-500
" />
</div>
<button className="
w-full sm:w-auto
px-6 py-3 text-base font-semibold
bg-blue-500 hover:bg-blue-600
text-white rounded-lg
transition-colors duration-200
focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2
">
Submit
</button>
</div>
</form>
);
Dark Mode Toggle Button
export const DarkModeToggle = ({ isDark, onToggle }) => (
<button
className="
p-2 rounded-lg
bg-gray-200 dark:bg-gray-700
hover:bg-gray-300 dark:hover:bg-gray-600
text-gray-800 dark:text-gray-200
transition-colors duration-200
focus:outline-none focus:ring-2 focus:ring-blue-500
"
aria-label={isDark ? 'Switch to light mode' : 'Switch to dark mode'}
>
{isDark ? '☀️' : '🌙'}
</button>
);
Tailwind Configuration Best Practices
Breakpoint Strategy
// Recommended breakpoint configuration
screens: {
'xs': '475px', // Extra small phones
'sm': '640px', // Small tablets/phones
'md': '768px', // Tablets
'lg': '1024px', // Desktops
'xl': '1280px', // Large screens
'2xl': '1536px', // Extra large screens
}
Color System
// Semantic color naming
colors: {
primary: { 50: '...', 500: '...', 900: '...' },
success: { 50: '...', 500: '...', 900: '...' },
warning: { 50: '...', 500: '...', 900: '...' },
error: { 50: '...', 500: '...', 900: '...' },
}
Spacing Scale
// Use Tailwind's scale: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64, 72, 80, 96
// 1 = 0.25rem (4px), 4 = 1rem (16px), 8 = 2rem (32px)
spacing: {
'128': '32rem',
'144': '36rem',
}
Accessibility Guidelines
Color Contrast : Minimum 4.5:1 for text, 3:1 for large text
Focus States : Always include focus:ring-2 or focus-visible
Touch Targets : Minimum 44x44px for mobile interactive elements
Skip Links : Add sr-only skip links for keyboard users
ARIA Labels : Use aria-label for icon-only buttons
Performance Optimization
JIT Mode : Enabled by default in Tailwind CSS 3+
Purge Unused : Only used classes in production
CSS Minification : Tailwind CLI or PostCSS optimization
Inline Critical CSS : Extract critical CSS for above-fold content
Lazy Load Components : Code split heavy components
References
1 --- 2 name: tailwind-css 3 description: | 4 Use when styling UI components or layouts with Tailwind CSS - mobile-first design, responsive utilities, custom themes, or component styling. 5 NOT when plain CSS, CSS-in-JS (styled-components), or non-Tailwind frameworks are involved. 6 Triggers: "style component", "responsive design", "mobile-first", "dark theme", "tailwind classes", "dashboard grid". 7 --- 8 9 # Tailwind CSS Skill 10 11 ## Overview 12 13 Expert guidance for Tailwind CSS styling with mobile-first responsive design, custom themes, and utility-first approach. Focuses on accessibility, dark mode, and performance optimization. 14 15 ## When This Skill Applies 16 17 This skill triggers when users request: 18 - **Styling**: "Style this KPI card", "Button component style", "Design a form" 19 - **Responsive**: "Mobile-first layout", "Responsive dashboard", "Grid with breakpoints" 20 - **Themes**: "Custom dark theme", "Extend tailwind theme", "Color scheme" 21 - **Layouts**: "Dashboard grid", "Card layout", "Flexible container" 22 23 ## Core Rules 24 25 ### 1. Mobile-First Design 26 27 ```jsx 28 // ✅ GOOD: Mobile-first progressive enhancement 29 <div className="w-full px-4 py-2 sm:w-1/2 sm:px-6 md:w-1/3 md:px-8 lg:w-1/4"> 30 <KPICard /> 31 </div> 32 33 // Breakpoints: 34 // sm: 640px - Small tablets/phones 35 // md: 768px - Tablets 36 // lg: 1024px - Desktops 37 // xl: 1280px - Large screens 38 // 2xl: 1536px - Extra large screens 39 ``` 40 41 **Requirements:** 42 - Base styles for mobile (no prefix) 43 - Progressive enhancement with `sm:`, `md:`, `lg:` prefixes 44 - Start with mobile layout, enhance for larger screens 45 - Use responsive breakpoints: `sm:640px`, `md:768px`, `lg:1024px` 46 47 ### 2. Responsive Utilities 48 49 ```jsx 50 // ✅ GOOD: Fluid responsive layouts 51 <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4"> 52 {items.map(item => <Item key={item.id} item={item} />)} 53 </div> 54 55 // ✅ GOOD: Responsive spacing 56 <div className="p-4 sm:p-6 md:p-8 lg:p-12"> 57 Content 58 </div> 59 60 // ✅ GOOD: Container queries (if needed) 61 <div className="@container"> 62 <div className="@lg:grid-cols-2"> 63 Nested responsive content 64 </div> 65 </div> 66 ``` 67 68 **Requirements:** 69 - Use fluid utilities (`w-full`, `flex-1`) for mobile 70 - Add breakpoints (`sm:`, `md:`, `lg:`) for larger screens 71 - Consider container queries for nested responsive components 72 - Test layouts at multiple breakpoints (375px, 768px, 1024px, 1440px) 73 74 ### 3. Custom Themes 75 76 ```typescript 77 // tailwind.config.ts 78 export default { 79 darkMode: 'class', // or 'media' 80 content: ['./src/**/*.{ts,tsx}'], 81 theme: { 82 extend: { 83 colors: { 84 primary: { 85 50: '#eff6ff', 86 100: '#dbeafe', 87 500: '#3b82f6', 88 900: '#1e3a8a', 89 }, 90 erp: { 91 'card': '#ffffff', 92 'card-dark': '#1f2937', 93 }, 94 }, 95 spacing: { 96 '18': '4.5rem', 97 '88': '22rem', 98 }, 99 fontFamily: { 100 sans: ['Inter', 'sans-serif'], 101 }, 102 }, 103 }, 104 plugins: [], 105 }; 106 ``` 107 108 **Requirements:** 109 - Extend theme in `tailwind.config.ts`, don't override 110 - Use semantic names (`primary`, `secondary`, `accent`) 111 - Define custom colors, fonts, spacing in theme 112 - Support CSS variables for dynamic theming 113 - Use `darkMode: 'class'` for manual dark mode toggle 114 115 ### 4. Component Styling 116 117 ```jsx 118 // ✅ GOOD: Utility-first approach 119 export const Button = ({ variant, size, children }) => ( 120 <button className={` 121 font-semibold rounded-lg 122 ${variant === 'primary' ? 'bg-blue-500 text-white hover:bg-blue-600' : 'bg-gray-200 text-gray-800 hover:bg-gray-300'} 123 ${size === 'sm' ? 'px-3 py-1 text-sm' : 'px-4 py-2'} 124 transition-colors duration-200 125 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 126 `}> 127 {children} 128 </button> 129 ); 130 131 // ✅ GOOD: CVA or class-variance-authority for variants 132 import { cva } from 'class-variance-authority'; 133 134 const buttonVariants = cva( 135 'font-semibold rounded-lg transition-colors', 136 { 137 variants: { 138 variant: { 139 primary: 'bg-blue-500 text-white hover:bg-blue-600', 140 secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300', 141 }, 142 size: { 143 sm: 'px-3 py-1 text-sm', 144 md: 'px-4 py-2', 145 }, 146 }, 147 } 148 ); 149 ``` 150 151 **Requirements:** 152 - Prefer inline utility classes over custom CSS 153 - Use `@apply` sparingly (only for repeated patterns) 154 - Extract complex variants with CVA or similar libraries 155 - Follow shadcn/ui patterns for consistent styling 156 - Use template literals for conditional classes 157 158 ## Output Requirements 159 160 ### Code Files 161 162 1. **Component Styling**: 163 - Inline utility classes in JSX/TSX 164 - Conditional classes for variants (dark/light, sizes) 165 - Focus states and transitions 166 167 2. **Configuration**: 168 - `tailwind.config.ts` updates for custom themes 169 - `globals.css` for global styles and directives 170 171 3. **Dark Mode Support**: 172 ```jsx 173 <div className="bg-white dark:bg-gray-900 text-gray-900 dark:text-white"> 174 Content with dark mode 175 </div> 176 ``` 177 178 ### Integration Requirements 179 180 - **shadcn/ui**: Follow shadcn design tokens and patterns 181 - **Accessibility**: WCAG 2.1 AA compliant colors, focus-visible states 182 - **Performance**: Enable JIT mode, purge unused classes 183 - **i18n**: Support RTL layouts when needed 184 185 ### Documentation 186 187 - **PHR**: Create Prompt History Record for styling decisions 188 - **ADR**: Document theme decisions (color schemes, breakpoints) 189 - **Comments**: Document non-obvious utility combinations 190 191 ## Workflow 192 193 1. **Analyze Layout Requirements** 194 - Identify mobile breakpoints 195 - Determine responsive needs 196 - Check dark mode requirements 197 198 2. **Apply Mobile-First Styles** 199 - Base styles without breakpoints 200 - Progressive enhancement for larger screens 201 - Test on mobile viewport (375px) 202 203 3. **Add Responsive Breakpoints** 204 - `sm:` for tablets (640px) 205 - `md:` for tablets (768px) 206 - `lg:` for desktops (1024px) 207 - Test at each breakpoint 208 209 4. **Apply Dark Mode** 210 - Add `dark:` variants for colors/backgrounds 211 - Test in both light and dark modes 212 - Ensure contrast ratios in both modes 213 214 5. **Validate Accessibility** 215 - Check color contrast ratios (4.5:1 minimum) 216 - Add focus-visible states for interactive elements 217 - Ensure touch targets are 44px+ on mobile 218 219 ## Quality Checklist 220 221 Before completing any styling: 222 223 - [ ] **No Horizontal Scroll Mobile**: Layout fits 375px without horizontal scroll 224 - [ ] **Touch Targets**: All interactive elements 44px+ on mobile 225 - [ ] **Dark/Light Variants**: Dark mode support with `dark:` classes 226 - [ ] **Utility-First**: Minimal custom CSS, use Tailwind utilities 227 - [ ] **Purge Unused**: No unused utility classes in production 228 - [ ] **Focus States**: `focus-visible` or `focus:ring` on all interactive elements 229 - [ ] **Contrast Ratios**: WCAG 2.1 AA compliant colors (4.5:1 for text) 230 - [ ] **Responsive Breakpoints**: Tested at sm/md/lg breakpoints 231 - [ ] **Consistent Spacing**: Use Tailwind's spacing scale (0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64) 232 - [ ] **Transitions**: Add `transition-*` classes for smooth state changes 233 234 ## Common Patterns 235 236 ### KPI Card (Mobile-First) 237 238 ```jsx 239 export const KPICard = ({ title, value, trend, loading }) => ( 240 <div className=" 241 w-full p-4 bg-white dark:bg-gray-800 242 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 243 sm:p-6 md:p-8 244 "> 245 {loading ? ( 246 <Skeleton className="h-20" /> 247 ) : ( 248 <> 249 <h3 className="text-sm font-medium text-gray-600 dark:text-gray-400"> 250 {title} 251 </h3> 252 <p className="text-2xl font-bold text-gray-900 dark:text-white mt-2"> 253 {value} 254 </p> 255 {trend && ( 256 <span className={` 257 inline-flex items-center mt-2 text-sm 258 ${trend > 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'} 259 `}> 260 {trend > 0 ? '↑' : '↓'} {Math.abs(trend)}% 261 </span> 262 )} 263 </> 264 )} 265 </div> 266 ); 267 ``` 268 269 ### Responsive Dashboard Grid 270 271 ```jsx 272 export const DashboardGrid = ({ children }) => ( 273 <div className=" 274 w-full grid gap-4 275 grid-cols-1 276 sm:grid-cols-2 277 md:grid-cols-3 278 lg:grid-cols-4 279 xl:grid-cols-5 280 p-4 281 "> 282 {children} 283 </div> 284 ); 285 ``` 286 287 ### Form with Responsive Layout 288 289 ```jsx 290 export const ResponsiveForm = () => ( 291 <form className=" 292 w-full max-w-lg mx-auto 293 p-4 sm:p-6 md:p-8 294 bg-white dark:bg-gray-800 295 rounded-lg shadow-md 296 "> 297 <div className="space-y-4 sm:space-y-6"> 298 <div> 299 <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2"> 300 Name 301 </label> 302 <input className=" 303 w-full px-4 py-2 text-base 304 border border-gray-300 dark:border-gray-600 305 rounded-lg 306 bg-white dark:bg-gray-700 307 text-gray-900 dark:text-white 308 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 309 " /> 310 </div> 311 <button className=" 312 w-full sm:w-auto 313 px-6 py-3 text-base font-semibold 314 bg-blue-500 hover:bg-blue-600 315 text-white rounded-lg 316 transition-colors duration-200 317 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 318 "> 319 Submit 320 </button> 321 </div> 322 </form> 323 ); 324 ``` 325 326 ### Dark Mode Toggle Button 327 328 ```jsx 329 export const DarkModeToggle = ({ isDark, onToggle }) => ( 330 <button 331 onClick={onToggle} 332 className=" 333 p-2 rounded-lg 334 bg-gray-200 dark:bg-gray-700 335 hover:bg-gray-300 dark:hover:bg-gray-600 336 text-gray-800 dark:text-gray-200 337 transition-colors duration-200 338 focus:outline-none focus:ring-2 focus:ring-blue-500 339 " 340 aria-label={isDark ? 'Switch to light mode' : 'Switch to dark mode'} 341 > 342 {isDark ? '☀️' : '🌙'} 343 </button> 344 ); 345 ``` 346 347 ## Tailwind Configuration Best Practices 348 349 ### Breakpoint Strategy 350 351 ```typescript 352 // Recommended breakpoint configuration 353 screens: { 354 'xs': '475px', // Extra small phones 355 'sm': '640px', // Small tablets/phones 356 'md': '768px', // Tablets 357 'lg': '1024px', // Desktops 358 'xl': '1280px', // Large screens 359 '2xl': '1536px', // Extra large screens 360 } 361 ``` 362 363 ### Color System 364 365 ```typescript 366 // Semantic color naming 367 colors: { 368 primary: { 50: '...', 500: '...', 900: '...' }, 369 success: { 50: '...', 500: '...', 900: '...' }, 370 warning: { 50: '...', 500: '...', 900: '...' }, 371 error: { 50: '...', 500: '...', 900: '...' }, 372 } 373 ``` 374 375 ### Spacing Scale 376 377 ```typescript 378 // Use Tailwind's scale: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64, 72, 80, 96 379 // 1 = 0.25rem (4px), 4 = 1rem (16px), 8 = 2rem (32px) 380 spacing: { 381 '128': '32rem', 382 '144': '36rem', 383 } 384 ``` 385 386 ## Accessibility Guidelines 387 388 - **Color Contrast**: Minimum 4.5:1 for text, 3:1 for large text 389 - **Focus States**: Always include `focus:ring-2` or `focus-visible` 390 - **Touch Targets**: Minimum 44x44px for mobile interactive elements 391 - **Skip Links**: Add `sr-only` skip links for keyboard users 392 - **ARIA Labels**: Use `aria-label` for icon-only buttons 393 394 ## Performance Optimization 395 396 1. **JIT Mode**: Enabled by default in Tailwind CSS 3+ 397 2. **Purge Unused**: Only used classes in production 398 3. **CSS Minification**: Tailwind CLI or PostCSS optimization 399 4. **Inline Critical CSS**: Extract critical CSS for above-fold content 400 5. **Lazy Load Components**: Code split heavy components 401 402 ## References 403 404 - Tailwind CSS Documentation: https://tailwindcss.com/docs 405 - Tailwind UI Patterns: https://tailwindui.com 406 - shadcn/ui Components: https://ui.shadcn.com 407 - Web Content Accessibility Guidelines (WCAG 2.1): https://www.w3.org/WAI/WCAG21/quickref/