@tailwind base; @tailwind components; @tailwind utilities; /* ─── Accent Color CSS Variables ──────────────────────────────────────────── Each data-accent value sets the --accent-* RGB triplets consumed by Tailwind brand-* classes. The format is "R G B" (no commas) for Tailwind opacity support. */ /* Sky Blue (default) */ :root, [data-accent="sky"] { --accent-50: 240 249 255; --accent-100: 224 242 254; --accent-200: 186 230 253; --accent-300: 125 211 252; --accent-400: 56 189 248; --accent-500: 14 165 233; --accent-600: 2 132 199; --accent-700: 3 105 161; --accent-800: 7 89 133; --accent-900: 12 74 110; } [data-accent="indigo"] { --accent-50: 238 242 255; --accent-100: 224 231 255; --accent-200: 199 210 254; --accent-300: 165 180 252; --accent-400: 129 140 248; --accent-500: 99 102 241; --accent-600: 79 70 229; --accent-700: 67 56 202; --accent-800: 55 48 163; --accent-900: 49 46 129; } [data-accent="violet"] { --accent-50: 245 243 255; --accent-100: 237 233 254; --accent-200: 221 214 254; --accent-300: 196 181 253; --accent-400: 167 139 250; --accent-500: 139 92 246; --accent-600: 124 58 237; --accent-700: 109 40 217; --accent-800: 91 33 182; --accent-900: 76 29 149; } [data-accent="emerald"] { --accent-50: 236 253 245; --accent-100: 209 250 229; --accent-200: 167 243 208; --accent-300: 110 231 183; --accent-400: 52 211 153; --accent-500: 16 185 129; --accent-600: 5 150 105; --accent-700: 4 120 87; --accent-800: 6 95 70; --accent-900: 6 78 59; } [data-accent="rose"] { --accent-50: 255 241 242; --accent-100: 255 228 230; --accent-200: 254 205 211; --accent-300: 253 164 175; --accent-400: 251 113 133; --accent-500: 244 63 94; --accent-600: 225 29 72; --accent-700: 190 18 60; --accent-800: 159 18 57; --accent-900: 136 19 55; } [data-accent="amber"] { --accent-50: 255 251 235; --accent-100: 254 243 199; --accent-200: 253 230 138; --accent-300: 252 211 77; --accent-400: 251 191 36; --accent-500: 245 158 11; --accent-600: 217 119 6; --accent-700: 180 83 9; --accent-800: 146 64 14; --accent-900: 120 53 15; } /* ─── Light Theme Surface Variables ─────────────────────────────────────── */ :root { --surface-page: 252 252 253; --surface-card: 255 255 255; --surface-elevated: 250 250 251; --surface-input: 255 255 255; --border-subtle: 219 224 232; --border-input: 197 205 218; --text-primary: 18 24 38; --text-secondary: 71 85 105; --text-muted: 100 116 139; --text-very-muted: 148 163 184; --shadow-soft: 15 23 42 / 0.05; --shadow-strong: 15 23 42 / 0.12; } /* ─── Dark Theme Surface Variables ──────────────────────────────────────── */ .dark { color-scheme: dark; --surface-page: 10 10 10; --surface-card: 17 17 17; --surface-elevated: 24 24 24; --surface-input: 14 14 14; --border-subtle: 38 38 38; --border-input: 58 58 58; --text-primary: 240 241 243; --text-secondary: 205 207 210; --text-muted: 158 160 164; --text-very-muted: 130 132 136; --shadow-soft: 0 0 0 / 0.45; --shadow-strong: 0 0 0 / 0.75; } /* ─── Base Layer: Apply variables to body ────────────────────────────────── */ @layer base { body { background-color: rgb(var(--surface-page)); color: rgb(var(--text-primary)); transition: background-color 0.15s ease, color 0.15s ease; background-image: radial-gradient(ellipse 80% 40% at 50% -5%, rgb(var(--accent-300) / 0.04) 0%, transparent 55%), radial-gradient(ellipse at 0% 0%, rgb(var(--accent-50) / 0.10), transparent 50%), radial-gradient(ellipse at 100% 100%, rgb(var(--accent-100) / 0.06), transparent 50%), linear-gradient(180deg, rgb(255 255 255 / 0.60), transparent 20rem); text-rendering: optimizeLegibility; } .dark body { background-image: radial-gradient(ellipse 80% 50% at 50% -10%, rgba(var(--accent-400), 0.07) 0%, transparent 60%), radial-gradient(circle at top left, rgb(var(--accent-600) / 0.16), transparent 26rem), linear-gradient(180deg, rgb(10 10 12 / 0.35), transparent 28rem); } input[type="checkbox"], input[type="radio"] { accent-color: rgb(var(--accent-500)); } h1, h2, h3, h4, [data-page-title="true"] { font-family: var(--font-display), system-ui, sans-serif; letter-spacing: -0.025em; } /* Smooth transition for theme changes */ *, *::before, *::after { transition-property: background-color, border-color, color; transition-duration: 0.1s; transition-timing-function: ease; } input, select, textarea, button { font: inherit; } :focus-visible { outline: 2px solid rgb(var(--accent-500)); outline-offset: 2px; border-radius: inherit; } button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 2px solid rgb(var(--accent-500)); outline-offset: 2px; box-shadow: 0 0 0 3px rgb(var(--accent-500) / 0.12); } /* Scrollbar styling for dark mode */ .dark ::-webkit-scrollbar { width: 8px; height: 8px; } .dark ::-webkit-scrollbar-track { background: rgb(var(--surface-card)); } .dark ::-webkit-scrollbar-thumb { background: rgb(var(--border-subtle)); border-radius: 4px; } } /* ─── Dark Mode Overrides for Common Tailwind Patterns ──────────────────── */ /* These override the most commonly used utility classes in the app */ .dark .bg-white { background-color: rgb(var(--surface-card)) !important; } .bg-white { box-shadow: 0 18px 42px -28px rgb(var(--shadow-strong)); } .dark .bg-gray-50 { background-color: rgb(var(--surface-elevated)) !important; } .dark .bg-gray-100 { background-color: rgb(var(--surface-elevated)) !important; } .dark .bg-gray-200 { background-color: rgb(var(--surface-elevated)) !important; } .dark .bg-gray-300 { background-color: rgb(var(--border-subtle)) !important; } .dark .bg-gray-400 { background-color: rgb(var(--border-input)) !important; } .dark .bg-gray-500 { background-color: rgb(80 80 80) !important; } .dark .bg-gray-600 { background-color: rgb(var(--border-input)) !important; } .dark .border-gray-100 { border-color: rgb(var(--border-subtle)) !important; } .dark .border-gray-200 { border-color: rgb(var(--border-subtle)) !important; } .dark .border-gray-300 { border-color: rgb(var(--border-input)) !important; } .dark .text-gray-900 { color: rgb(var(--text-primary)) !important; } .dark .text-gray-800 { color: rgb(var(--text-primary)) !important; } .dark .text-gray-700 { color: rgb(var(--text-secondary)) !important; } .dark .text-gray-600 { color: rgb(var(--text-secondary)) !important; } .dark .text-gray-500 { color: rgb(var(--text-muted)) !important; } .dark .text-gray-400 { color: rgb(var(--text-very-muted)) !important; } /* Dark variant text overrides — catches className="dark:text-gray-*" */ .dark .dark\:text-gray-100 { color: rgb(var(--text-primary)) !important; } .dark .dark\:text-gray-200 { color: rgb(var(--text-secondary)) !important; } .dark .dark\:text-gray-300 { color: rgb(var(--text-muted)) !important; } .dark .dark\:text-gray-400 { color: rgb(var(--text-very-muted)) !important; } .dark input, .dark select, .dark textarea { background-color: rgb(var(--surface-input)); border-color: rgb(var(--border-input)); color: rgb(var(--text-primary)); } .dark input::placeholder, .dark textarea::placeholder { color: rgb(var(--text-muted)); } /* Table row / interactive hover */ .dark .hover\:bg-gray-50:hover, .dark .hover\:bg-gray-100:hover, .dark .hover\:bg-gray-200:hover { background-color: rgb(var(--surface-elevated)) !important; } /* Status badge adjustments in dark mode - keep them readable */ .dark .bg-green-100 { background-color: rgb(6 78 59 / 0.4) !important; } .dark .text-green-700 { color: rgb(52 211 153) !important; } .dark .bg-yellow-100 { background-color: rgb(120 53 15 / 0.4) !important; } .dark .text-yellow-700 { color: rgb(251 191 36) !important; } .dark .bg-blue-100 { background-color: rgb(30 58 138 / 0.4) !important; } .dark .text-blue-700 { color: rgb(96 165 250) !important; } .dark .bg-red-100 { background-color: rgb(127 29 29 / 0.4) !important; } .dark .text-red-600 { color: rgb(248 113 113) !important; } .dark .text-red-700 { color: rgb(248 113 113) !important; } .dark .bg-purple-100 { background-color: rgb(76 29 149 / 0.4) !important; } .dark .text-purple-700 { color: rgb(196 181 253) !important; } /* Status/alert -50 backgrounds — covers ~250+ instances across the codebase */ .dark .bg-red-50 { background-color: rgb(127 29 29 / 0.15) !important; } .dark .bg-green-50 { background-color: rgb(6 78 59 / 0.15) !important; } .dark .bg-blue-50 { background-color: rgb(30 58 138 / 0.15) !important; } .dark .bg-yellow-50 { background-color: rgb(120 53 15 / 0.15) !important; } .dark .bg-amber-50 { background-color: rgb(120 53 15 / 0.15) !important; } .dark .bg-purple-50 { background-color: rgb(76 29 149 / 0.15) !important; } .dark .bg-indigo-50 { background-color: rgb(49 46 129 / 0.15) !important; } .dark .bg-orange-50 { background-color: rgb(124 45 18 / 0.15) !important; } .dark .bg-brand-50 { background-color: rgb(var(--accent-900) / 0.15) !important; } .dark .bg-emerald-50 { background-color: rgb(6 78 59 / 0.15) !important; } /* Colored border overrides */ .dark .border-red-200 { border-color: rgb(127 29 29 / 0.4) !important; } .dark .border-green-200 { border-color: rgb(6 78 59 / 0.4) !important; } .dark .border-blue-200 { border-color: rgb(30 58 138 / 0.4) !important; } .dark .border-yellow-200 { border-color: rgb(120 53 15 / 0.4) !important; } .dark .border-amber-200 { border-color: rgb(120 53 15 / 0.4) !important; } .dark .border-purple-200 { border-color: rgb(76 29 149 / 0.4) !important; } .dark .border-indigo-200 { border-color: rgb(49 46 129 / 0.4) !important; } .dark .border-brand-200 { border-color: rgb(var(--accent-700) / 0.4) !important; } /* Hover -50/-100 colored states */ .dark .hover\:bg-red-50:hover { background-color: rgb(127 29 29 / 0.20) !important; } .dark .hover\:bg-red-100:hover { background-color: rgb(127 29 29 / 0.30) !important; } .dark .hover\:bg-green-50:hover { background-color: rgb(6 78 59 / 0.20) !important; } .dark .hover\:bg-blue-50:hover { background-color: rgb(30 58 138 / 0.20) !important; } .dark .hover\:bg-amber-50:hover { background-color: rgb(120 53 15 / 0.20) !important; } /* Missing text color overrides */ .dark .text-amber-700 { color: rgb(251 191 36) !important; } .dark .text-amber-600 { color: rgb(251 191 36) !important; } .dark .text-orange-600 { color: rgb(251 146 60) !important; } .dark .text-green-600 { color: rgb(52 211 153) !important; } .dark .text-emerald-700 { color: rgb(52 211 153) !important; } .dark .text-brand-700 { color: rgb(var(--accent-400)) !important; } /* Interactive text — action links, errors, close buttons */ .dark .text-blue-600 { color: rgb(96 165 250) !important; } .dark .text-blue-500 { color: rgb(96 165 250) !important; } .dark .text-red-500 { color: rgb(248 113 113) !important; } .dark .text-red-400 { color: rgb(251 113 133) !important; } .dark .text-indigo-600 { color: rgb(129 140 248) !important; } .dark .text-indigo-700 { color: rgb(129 140 248) !important; } /* Hover states for action links */ .dark .hover\:text-blue-800:hover { color: rgb(147 197 253) !important; } .dark .hover\:text-red-700:hover { color: rgb(252 165 165) !important; } .dark .hover\:text-red-600:hover { color: rgb(248 113 113) !important; } .dark .hover\:text-indigo-800:hover { color: rgb(165 180 252) !important; } /* Native