--- name: bellog-theme description: Provides theme integration guidelines and CSS variable usage patterns for the Bellog blog. Triggers when creating styled components or working with colors. --- # Bellog Theme Integration This skill defines how to properly integrate with Bellog's theme system using CSS variables and TailwindCSS utility classes. ## Theme System Architecture Bellog uses **HSL-based CSS variables** for all colors, enabling seamless dark/light mode switching. **Location:** `/src/styles/global.css` ```css :root { --background: 0 0% 98%; --foreground: 240 10% 3.9%; --primary: 262 83% 58%; /* ... more variables */ } .dark { --background: 240 10% 3.9%; --foreground: 0 0% 98%; --primary: 263 70% 50%; /* ... more variables */ } ``` ## Available CSS Variables ### Core Colors ```typescript // Background & Text --background // Main page background --foreground // Main text color // Cards & Containers --card // Card backgrounds --card-foreground // Text on cards // Interactive Elements --primary // Primary brand color (purple) --primary-foreground --secondary // Secondary accent --secondary-foreground --accent // Tertiary accent --accent-foreground --muted // Subdued elements --muted-foreground // UI Borders & Inputs --border // All border colors --input // Input field borders --ring // Focus ring color ``` ### Brand Colors ```typescript // GitHub integration --github-bg --github-border --github-text --github-subtext // Velog integration --velog-bg --velog-border --velog-text --velog-subtext ``` ### Semantic Colors ```typescript --destructive // Error, danger states --destructive-foreground // Note: Success/warning colors not defined - use primary/accent for positive states ``` ## Usage Patterns ### ✅ Correct Usage ```typescript // Background & Text className="bg-background text-foreground" // Cards className="bg-card text-card-foreground" // Primary actions className="bg-primary text-primary-foreground hover:bg-primary/90" // Borders className="border-border" // Muted/secondary text className="text-muted-foreground" ``` ### ❌ Incorrect Usage (Never Do This) ```typescript // ❌ Hardcoded colors className="bg-white text-black" className="bg-gray-100 text-gray-900" className="bg-blue-500" // ❌ Direct color values className="bg-[#ffffff]" style={{ backgroundColor: "#000000" }} // ❌ Non-semantic Tailwind colors className="bg-slate-50 text-slate-950" ``` ## Opacity Patterns Use opacity modifiers for subtle effects: ```typescript // 5% - Very subtle backgrounds className="bg-primary/5" // 10% - Hover backgrounds className="hover:bg-primary/10" // 20% - Active/selected states className="bg-primary/20" // 50% - Borders, dividers className="border-border/50" // 90% - Hover states for solid buttons className="hover:bg-primary/90" ``` ## Common Component Patterns ### Card Component ```typescript
{/* Card content */}
``` **Key elements:** - `bg-card` - Adapts to theme automatically - `border-border/50` - Subtle border - `hover:border-primary/20` - Interactive feedback ### Button Component ```typescript // Primary button // Secondary button // Ghost button ``` ### Input Component ```typescript ``` ### Navigation Component ```typescript ``` ### Tag/Badge Component ```typescript Tag // Muted version Muted Tag ``` ### Modal/Dialog Overlay ```typescript
{/* Modal content */}
``` ## Gradient Patterns When gradients are needed (sparingly): ```typescript // Primary gradient background className="bg-gradient-to-br from-primary/20 to-primary/5" // Muted gradient className="bg-gradient-to-br from-muted/50 to-background" // Border gradient (use pseudo-elements) className="relative before:absolute before:inset-0 before:rounded-3xl before:p-[1px] before:bg-gradient-to-br before:from-primary/50 before:to-transparent" ``` ## Dark Mode Handling **Important:** You DO NOT need to manually handle dark mode. CSS variables automatically adapt. ```typescript // ✅ Correct - Variables handle it className="bg-background text-foreground" // ❌ Wrong - Manual dark mode classes className="bg-white dark:bg-black text-black dark:text-white" ``` **Exception:** When you need different behavior between modes: ```typescript className="shadow-sm dark:shadow-xl" className="opacity-100 dark:opacity-80" ``` ## Hover States Standard hover patterns: ```typescript // Color shift className="text-foreground hover:text-primary" // Background change className="hover:bg-accent hover:text-accent-foreground" // Opacity change className="opacity-70 hover:opacity-100" // Border emphasis className="border-border/50 hover:border-primary/50" // Multiple effects className="hover:bg-primary/10 hover:text-primary hover:border-primary/20" ``` ## Focus States Always include focus states for accessibility: ```typescript className=" focus:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-background " ``` ## Text Hierarchy ```typescript // Headings className="text-foreground" // Body text className="text-foreground" // Secondary text className="text-muted-foreground" // Disabled text className="text-muted-foreground/50" // Links className="text-primary hover:text-primary/80" ``` ## Border Radius Conventions Bellog uses consistent border radius: ```typescript // Standard cards, containers className="rounded-3xl" // Buttons, inputs, tags className="rounded-full" // Smaller elements className="rounded-xl" // Images with subtle rounding className="rounded-2xl" ``` ## Shadow Patterns ```typescript // Default state className="shadow-sm" // Hover state className="hover:shadow-md" // Elevated elements className="shadow-lg" // Modal/dialog className="shadow-2xl" // Colored shadow (rare) className="shadow-lg shadow-primary/20" ``` ## Backdrop Blur For glass-morphism effects: ```typescript // Strong blur (modals, navbars) className="backdrop-blur-xl" // Medium blur (cards) className="backdrop-blur-lg" // Light blur (overlays) className="backdrop-blur-sm" ``` ## Theme Integration Checklist When creating a new component: - [ ] No hardcoded colors (no #hex, rgb, or specific Tailwind colors) - [ ] Uses semantic CSS variables (background, foreground, primary, etc.) - [ ] Opacity modifiers for subtle effects (/5, /10, /20, /50) - [ ] Hover states defined - [ ] Focus states for interactive elements - [ ] Consistent border radius (rounded-3xl or rounded-full) - [ ] Text hierarchy uses muted-foreground for secondary text - [ ] Works in both light and dark modes (test by toggling) ## Common Mistakes ### Mistake 1: Using Generic Tailwind Colors ```typescript // ❌ Wrong className="bg-slate-100 text-slate-900" // ✅ Correct className="bg-background text-foreground" ``` ### Mistake 2: Hardcoding Dark Mode ```typescript // ❌ Wrong className="bg-white dark:bg-gray-900" // ✅ Correct className="bg-background" ``` ### Mistake 3: Mixing Color Systems ```typescript // ❌ Wrong className="bg-card text-gray-700" // ✅ Correct className="bg-card text-card-foreground" ``` ### Mistake 4: Forgetting Opacity ```typescript // ❌ Less flexible className="bg-primary" // ✅ More subtle className="bg-primary/10" ``` ## Quick Reference ```typescript // Page background bg-background // Card background bg-card // Primary action bg-primary text-primary-foreground // Text colors text-foreground // Primary text text-muted-foreground // Secondary text text-primary // Accent text // Borders border-border // Standard border-border/50 // Subtle // Hover patterns hover:bg-primary/10 // Background highlight hover:text-primary // Text accent hover:border-primary/20 // Border accent // Focus focus-visible:ring-2 focus-visible:ring-primary // Complete card bg-card border border-border/50 text-card-foreground rounded-3xl ``` Remember: Always use CSS variables through Tailwind classes. The theme system will handle light/dark mode automatically.