--- name: tailwindcss description: Tailwind CSS utility-first styling for JARVIS UI components model: sonnet risk_level: LOW version: 1.1.0 --- # Tailwind CSS Development Skill > **File Organization**: This skill uses split structure. See `references/` for advanced patterns. ## 1. Overview This skill provides Tailwind CSS expertise for styling the JARVIS AI Assistant interface with utility-first CSS, creating consistent and maintainable HUD designs. **Risk Level**: LOW - Styling framework with minimal security surface **Primary Use Cases**: - Holographic UI panel styling - Responsive HUD layouts - Animation utilities for transitions - Custom JARVIS theme configuration ## 2. Core Responsibilities ### 2.1 Fundamental Principles 1. **TDD First**: Write component tests before styling implementation 2. **Performance Aware**: Optimize CSS output size and rendering performance 3. **Utility-First**: Compose styles from utility classes, extract components when patterns repeat 4. **Design System**: Define JARVIS color palette and spacing in config 5. **Responsive Design**: Mobile-first with breakpoint utilities 6. **Dark Mode Default**: HUD is always dark-themed 7. **Accessibility**: Maintain sufficient contrast ratios ## 3. Implementation Workflow (TDD) ### 3.1 TDD Process for Styled Components Follow this workflow for every styled component: #### Step 1: Write Failing Test First ```typescript // tests/components/HUDPanel.test.ts import { describe, it, expect } from 'vitest' import { mount } from '@vue/test-utils' import HUDPanel from '~/components/HUDPanel.vue' describe('HUDPanel', () => { it('renders with correct JARVIS theme classes', () => { const wrapper = mount(HUDPanel, { props: { title: 'System Status' } }) const panel = wrapper.find('[data-testid="hud-panel"]') expect(panel.classes()).toContain('bg-jarvis-bg-panel/80') expect(panel.classes()).toContain('border-jarvis-primary/30') expect(panel.classes()).toContain('backdrop-blur-sm') }) it('applies responsive grid layout', () => { const wrapper = mount(HUDPanel) const grid = wrapper.find('[data-testid="panel-grid"]') expect(grid.classes()).toContain('grid-cols-1') expect(grid.classes()).toContain('md:grid-cols-2') expect(grid.classes()).toContain('lg:grid-cols-3') }) it('shows correct status indicator colors', async () => { const wrapper = mount(HUDPanel, { props: { status: 'active' } }) const indicator = wrapper.find('[data-testid="status-indicator"]') expect(indicator.classes()).toContain('bg-jarvis-primary') expect(indicator.classes()).toContain('animate-pulse') await wrapper.setProps({ status: 'error' }) expect(indicator.classes()).toContain('bg-jarvis-danger') }) it('maintains accessibility focus styles', () => { const wrapper = mount(HUDPanel) const button = wrapper.find('button') expect(button.classes()).toContain('focus:ring-2') expect(button.classes()).toContain('focus:outline-none') }) }) ``` #### Step 2: Implement Minimum to Pass ```vue ``` #### Step 3: Refactor if Needed Extract repeated patterns to @apply directives: ```css /* assets/css/components.css */ @layer components { .hud-panel { @apply bg-jarvis-bg-panel/80 border border-jarvis-primary/30 backdrop-blur-sm rounded-lg p-4; } .hud-grid { @apply grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4; } } ``` #### Step 4: Run Full Verification ```bash # Run all style-related tests npm run test -- --grep "HUDPanel" # Check for unused CSS npx tailwindcss --content './components/**/*.vue' --output /dev/null # Verify build size npm run build && ls -lh .output/public/_nuxt/*.css ``` ## 4. Performance Patterns ### 4.1 Purge Optimization ```javascript // tailwind.config.js // Good: Specific content paths export default { content: [ './components/**/*.{vue,js,ts}', './layouts/**/*.vue', './pages/**/*.vue', './composables/**/*.ts' ] } // Bad: Too broad, includes unused files export default { content: ['./src/**/*'] // Includes tests, stories, etc. } ``` ### 4.2 JIT Mode Efficiency ```javascript // Good: Let JIT generate only used utilities export default { mode: 'jit', // Default in v3+ theme: { extend: { // Only extend what you need colors: { jarvis: { primary: '#00ff41', secondary: '#0891b2' } } } } } // Bad: Defining unused variants export default { variants: { extend: { backgroundColor: ['active', 'group-hover', 'disabled'] // May not use all } } } ``` ### 4.3 @apply Extraction Strategy ```vue ``` ### 4.4 Responsive Breakpoints Efficiency ```vue
``` ### 4.5 Dark Mode Efficiency ```javascript // Good: Single dark mode strategy (JARVIS is always dark) export default { darkMode: 'class', // Use 'class' for explicit control theme: { extend: { colors: { jarvis: { bg: { dark: '#0a0a0f', // Define dark colors directly panel: '#111827' } } } } } } // Bad: Light/dark variants when app is always dark
// Unnecessary light styles ``` ### 4.6 Animation Performance ```javascript // Good: GPU-accelerated properties export default { theme: { extend: { keyframes: { glow: { '0%, 100%': { opacity: '0.5' }, // opacity is GPU-accelerated '50%': { opacity: '1' } } } } } } // Bad: Layout-triggering properties keyframes: { resize: { '0%': { width: '100px' }, // Triggers layout recalc '100%': { width: '200px' } } } ``` ## 5. Technology Stack & Versions ### 5.1 Recommended Versions | Package | Version | Notes | |---------|---------|-------| | tailwindcss | ^3.4.0 | Latest with JIT mode | | @nuxtjs/tailwindcss | ^6.0.0 | Nuxt integration | | tailwindcss-animate | ^1.0.0 | Animation utilities | ### 5.2 Configuration ```javascript // tailwind.config.js export default { content: [ './components/**/*.{vue,js,ts}', './layouts/**/*.vue', './pages/**/*.vue', './composables/**/*.ts', './plugins/**/*.ts' ], darkMode: 'class', theme: { extend: { colors: { jarvis: { primary: '#00ff41', secondary: '#0891b2', warning: '#f59e0b', danger: '#ef4444', bg: { dark: '#0a0a0f', panel: '#111827' } } }, fontFamily: { mono: ['JetBrains Mono', 'monospace'], display: ['Orbitron', 'sans-serif'] }, animation: { 'pulse-slow': 'pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite', 'scan': 'scan 2s linear infinite', 'glow': 'glow 2s ease-in-out infinite alternate' }, keyframes: { scan: { '0%': { transform: 'translateY(-100%)' }, '100%': { transform: 'translateY(100%)' } }, glow: { '0%': { boxShadow: '0 0 5px #00ff41' }, '100%': { boxShadow: '0 0 20px #00ff41' } } } } }, plugins: [ require('@tailwindcss/forms'), require('tailwindcss-animate') ] } ``` ## 6. Implementation Patterns ### 6.1 HUD Panel Component ```vue ``` ### 6.2 Status Indicator ```vue ``` ### 6.3 Button Variants ```vue ``` ## 7. Quality Standards ### 7.1 Accessibility ```vue