@import "tailwindcss"; @import "tw-animate-css"; @source "../node_modules/layerchart/**/*.svelte"; @custom-variant dark (&:where(.dark, .dark *)); @theme { --radius: 0.5rem; --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --color-background: hsl(var(--background)); --color-foreground: hsl(var(--foreground)); --color-card: hsl(var(--card)); --color-card-foreground: hsl(var(--card-foreground)); --color-popover: hsl(var(--popover)); --color-popover-foreground: hsl(var(--popover-foreground)); --color-primary: hsl(var(--primary)); --color-primary-foreground: hsl(var(--primary-foreground)); --color-secondary: hsl(var(--secondary)); --color-secondary-foreground: hsl(var(--secondary-foreground)); --color-muted: hsl(var(--muted)); --color-muted-foreground: hsl(var(--muted-foreground)); --color-accent: hsl(var(--accent)); --color-accent-foreground: hsl(var(--accent-foreground)); --color-destructive: hsl(var(--destructive)); --color-destructive-foreground: hsl(var(--destructive-foreground)); --color-border: hsl(var(--border)); --color-input: hsl(var(--input)); --color-ring: hsl(var(--ring)); --color-sidebar: hsl(var(--sidebar-background)); --color-sidebar-foreground: hsl(var(--sidebar-foreground)); --color-sidebar-primary: hsl(var(--sidebar-primary)); --color-sidebar-primary-foreground: hsl(var(--sidebar-primary-foreground)); --color-sidebar-accent: hsl(var(--sidebar-accent)); --color-sidebar-accent-foreground: hsl(var(--sidebar-accent-foreground)); --color-sidebar-border: hsl(var(--sidebar-border)); --color-sidebar-ring: hsl(var(--sidebar-ring)); } /* Font size scaling - set dynamically via JavaScript */ html { font-size: calc(16px * var(--font-size-scale, 1)); } /* Grid/table font size scaling - uses px to be independent of global font size */ .data-grid, .data-grid th, .data-grid td, .data-grid span, .data-grid div, .data-grid p, .data-grid button, .data-grid code { font-size: calc(12px * var(--grid-font-size-scale, 1)) !important; } /* State badge - width scales with grid font size to stay consistent */ .state-badge { width: calc(70px * var(--grid-font-size-scale, 1)); min-width: calc(70px * var(--grid-font-size-scale, 1)); max-width: calc(70px * var(--grid-font-size-scale, 1)); text-align: center; } /* State column - width scales with grid font size */ .data-grid th.state-col, .data-grid td.state-col { width: calc(90px * var(--grid-font-size-scale, 1)) !important; min-width: calc(90px * var(--grid-font-size-scale, 1)) !important; max-width: calc(90px * var(--grid-font-size-scale, 1)) !important; } :root { --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; --background: 0 0% 100%; --foreground: 222.2 84% 4.9%; --card: 0 0% 100%; --card-foreground: 222.2 84% 4.9%; --popover: 0 0% 100%; --popover-foreground: 222.2 84% 4.9%; --primary: 221.2 83.2% 53.3%; --primary-foreground: 210 40% 98%; --secondary: 210 40% 96.1%; --secondary-foreground: 222.2 47.4% 11.2%; --muted: 210 40% 96.1%; --muted-foreground: 215.4 16.3% 46.9%; --accent: 210 40% 96.1%; --accent-foreground: 222.2 47.4% 11.2%; --destructive: 0 84.2% 60.2%; --destructive-foreground: 210 40% 98%; --border: 214.3 31.8% 91.4%; --input: 214.3 31.8% 91.4%; --ring: 221.2 83.2% 53.3%; --sidebar-background: 0 0% 98%; --sidebar-foreground: 240 5.3% 26.1%; --sidebar-primary: 240 5.9% 10%; --sidebar-primary-foreground: 0 0% 98%; --sidebar-accent: 240 4.8% 95.9%; --sidebar-accent-foreground: 240 5.9% 10%; --sidebar-border: 220 13% 91%; --sidebar-ring: 217.2 91.2% 59.8%; } .dark { --background: 214.4 61.4% 17.3%; --foreground: 210 40% 98%; --card: 214.4 61.4% 17.3%; --card-foreground: 210 40% 98%; --popover: 214.4 61.4% 17.3%; --popover-foreground: 210 40% 98%; --primary: 217.2 91.2% 59.8%; --primary-foreground: 222.2 47.4% 11.2%; --secondary: 214 50% 23%; --secondary-foreground: 210 40% 98%; --muted: 214 50% 23%; --muted-foreground: 215 20.2% 65.1%; --accent: 214 50% 23%; --accent-foreground: 210 40% 98%; --destructive: 0 91% 71%; --destructive-foreground: 210 40% 98%; --border: 214 50% 25%; --input: 214 50% 25%; --ring: 224.3 76.3% 48%; --sidebar-background: 214.4 50% 18%; --sidebar-foreground: 210 40% 98%; --sidebar-primary: 217.2 91.2% 59.8%; --sidebar-primary-foreground: 222.2 47.4% 11.2%; --sidebar-accent: 214 50% 20%; --sidebar-accent-foreground: 210 40% 98%; --sidebar-border: 214 50% 22%; --sidebar-ring: 217.2 91.2% 59.8%; } /* ============================================================================= LIGHT THEMES - Official color palettes from theme specifications ============================================================================= */ /* Catppuccin Latte - https://catppuccin.com/palette/ */ .theme-light-catppuccin { --background: 220 23% 95%; /* #eff1f5 Base */ --foreground: 234 16% 35%; /* #4c4f69 Text */ --card: 220 21% 98%; /* #fffaf3 Surface */ --card-foreground: 234 16% 35%; --popover: 220 21% 98%; --popover-foreground: 234 16% 35%; --primary: 266 85% 58%; /* #8839ef Mauve */ --primary-foreground: 220 23% 98%; --secondary: 223 16% 84%; /* #ccd0da Surface0 */ --secondary-foreground: 234 16% 35%; --muted: 223 16% 84%; --muted-foreground: 233 10% 47%; /* #6c6f85 Subtext0 */ --accent: 220 22% 87%; --accent-foreground: 234 16% 35%; --destructive: 347 87% 44%; /* #d20f39 Red */ --destructive-foreground: 220 23% 98%; --border: 223 16% 83%; --input: 223 16% 83%; --ring: 266 85% 58%; --sidebar-background: 227 15% 90%; /* #e6e9ef Mantle */ --sidebar-foreground: 234 16% 35%; --sidebar-primary: 266 85% 58%; --sidebar-primary-foreground: 220 23% 98%; --sidebar-accent: 220 22% 85%; --sidebar-accent-foreground: 234 16% 35%; --sidebar-border: 223 16% 80%; --sidebar-ring: 266 85% 58%; } /* Rose Pine Dawn - https://rosepinetheme.com/palette/ */ .theme-light-rose-pine { --background: 32 57% 95%; /* #faf4ed Base */ --foreground: 248 19% 40%; /* #575279 Text */ --card: 39 100% 98%; /* #fffaf3 Surface */ --card-foreground: 248 19% 40%; --popover: 39 100% 98%; --popover-foreground: 248 19% 40%; --primary: 267 22% 57%; /* #907aa9 Iris */ --primary-foreground: 32 57% 95%; --secondary: 35 32% 92%; /* #f2e9e1 Overlay */ --secondary-foreground: 248 19% 40%; --muted: 35 32% 92%; --muted-foreground: 250 12% 49%; /* #797593 Subtle */ --accent: 33 35% 89%; --accent-foreground: 248 19% 40%; --destructive: 343 35% 55%; /* #b4637a Love */ --destructive-foreground: 32 57% 95%; --border: 33 24% 86%; --input: 33 24% 86%; --ring: 267 22% 57%; --sidebar-background: 30 27% 94%; /* #f4ede8 Highlight Low */ --sidebar-foreground: 248 19% 40%; --sidebar-primary: 267 22% 57%; --sidebar-primary-foreground: 32 57% 95%; --sidebar-accent: 33 24% 88%; --sidebar-accent-foreground: 248 19% 40%; --sidebar-border: 33 24% 84%; --sidebar-ring: 267 22% 57%; } /* Nord Light - https://www.nordtheme.com/ */ .theme-light-nord { --background: 219 28% 96%; /* #eceff4 Nord6 */ --foreground: 220 16% 22%; /* #2e3440 Nord0 */ --card: 218 27% 94%; /* #e5e9f0 Nord5 */ --card-foreground: 220 16% 22%; --popover: 218 27% 94%; --popover-foreground: 220 16% 22%; --primary: 213 32% 52%; /* #5e81ac Nord10 */ --primary-foreground: 219 28% 96%; --secondary: 218 27% 88%; /* #d8dee9 Nord4 */ --secondary-foreground: 220 16% 22%; --muted: 218 27% 88%; --muted-foreground: 220 17% 32%; /* #434c5e Nord2 */ --accent: 218 27% 84%; --accent-foreground: 220 16% 22%; --destructive: 354 42% 56%; /* #bf616a Nord11 */ --destructive-foreground: 219 28% 96%; --border: 218 27% 85%; --input: 218 27% 85%; --ring: 213 32% 52%; --sidebar-background: 218 27% 92%; --sidebar-foreground: 220 16% 22%; --sidebar-primary: 213 32% 52%; --sidebar-primary-foreground: 219 28% 96%; --sidebar-accent: 218 27% 86%; --sidebar-accent-foreground: 220 16% 22%; --sidebar-border: 218 27% 83%; --sidebar-ring: 213 32% 52%; } /* Solarized Light - https://ethanschoonover.com/solarized/ */ .theme-light-solarized { --background: 44 87% 94%; /* #fdf6e3 Base3 */ --foreground: 192 81% 14%; /* #073642 Base02 */ --card: 44 87% 97%; --card-foreground: 192 81% 14%; --popover: 44 87% 97%; --popover-foreground: 192 81% 14%; --primary: 205 69% 49%; /* #268bd2 Blue */ --primary-foreground: 44 87% 97%; --secondary: 46 42% 88%; /* #eee8d5 Base2 */ --secondary-foreground: 192 81% 14%; --muted: 46 42% 88%; --muted-foreground: 194 14% 40%; /* #657b83 Base00 */ --accent: 46 42% 84%; --accent-foreground: 192 81% 14%; --destructive: 1 71% 52%; /* #dc322f Red */ --destructive-foreground: 44 87% 97%; --border: 46 42% 84%; --input: 46 42% 84%; --ring: 205 69% 49%; --sidebar-background: 46 42% 90%; --sidebar-foreground: 192 81% 14%; --sidebar-primary: 205 69% 49%; --sidebar-primary-foreground: 44 87% 97%; --sidebar-accent: 46 42% 82%; --sidebar-accent-foreground: 192 81% 14%; --sidebar-border: 46 42% 80%; --sidebar-ring: 205 69% 49%; } /* Gruvbox Light - https://github.com/morhetz/gruvbox */ .theme-light-gruvbox { --background: 48 87% 94%; /* #fbf1c7 bg0 */ --foreground: 0 0% 16%; /* #282828 fg0 */ --card: 49 87% 96%; --card-foreground: 0 0% 16%; --popover: 49 87% 96%; --popover-foreground: 0 0% 16%; --primary: 189 48% 40%; /* #458588 Aqua */ --primary-foreground: 48 87% 94%; --secondary: 48 45% 85%; /* #ebdbb2 bg1 */ --secondary-foreground: 0 0% 16%; --muted: 48 45% 85%; --muted-foreground: 0 0% 36%; --accent: 48 45% 80%; --accent-foreground: 0 0% 16%; --destructive: 6 96% 40%; /* #cc241d Red */ --destructive-foreground: 48 87% 94%; --border: 48 45% 80%; --input: 48 45% 80%; --ring: 189 48% 40%; --sidebar-background: 48 45% 90%; --sidebar-foreground: 0 0% 16%; --sidebar-primary: 189 48% 40%; --sidebar-primary-foreground: 48 87% 94%; --sidebar-accent: 48 45% 82%; --sidebar-accent-foreground: 0 0% 16%; --sidebar-border: 48 45% 78%; --sidebar-ring: 189 48% 40%; } /* Alucard (Dracula Light) - https://draculatheme.com/spec */ .theme-light-alucard { --background: 47 100% 96%; /* #fffbeb Background */ --foreground: 0 0% 12%; /* #1f1f1f Foreground */ --card: 47 100% 98%; --card-foreground: 0 0% 12%; --popover: 47 100% 98%; --popover-foreground: 0 0% 12%; --primary: 253 63% 54%; /* #644ac9 Purple */ --primary-foreground: 47 100% 96%; --secondary: 240 13% 87%; /* #cfcfde Selection */ --secondary-foreground: 0 0% 12%; --muted: 240 13% 87%; --muted-foreground: 45 17% 36%; /* #6c664b Comment */ --accent: 240 13% 82%; --accent-foreground: 0 0% 12%; --destructive: 8 71% 48%; /* #cb3a2a Red */ --destructive-foreground: 47 100% 96%; --border: 240 13% 82%; --input: 240 13% 82%; --ring: 253 63% 54%; --sidebar-background: 47 100% 93%; --sidebar-foreground: 0 0% 12%; --sidebar-primary: 253 63% 54%; --sidebar-primary-foreground: 47 100% 96%; --sidebar-accent: 240 13% 85%; --sidebar-accent-foreground: 0 0% 12%; --sidebar-border: 240 13% 80%; --sidebar-ring: 253 63% 54%; } /* GitHub Light - https://primer.style/primitives/colors */ .theme-light-github { --background: 210 17% 98%; /* #f6f8fa */ --foreground: 210 12% 16%; /* #24292f */ --card: 0 0% 100%; /* #ffffff */ --card-foreground: 210 12% 16%; --popover: 0 0% 100%; --popover-foreground: 210 12% 16%; --primary: 212 92% 45%; /* #0969da */ --primary-foreground: 0 0% 100%; --secondary: 210 14% 93%; /* #eaeef2 */ --secondary-foreground: 210 12% 16%; --muted: 210 14% 93%; --muted-foreground: 210 9% 40%; /* #57606a */ --accent: 210 14% 89%; --accent-foreground: 210 12% 16%; --destructive: 354 70% 44%; /* #cf222e */ --destructive-foreground: 0 0% 100%; --border: 210 14% 89%; --input: 210 14% 89%; --ring: 212 92% 45%; --sidebar-background: 210 17% 95%; --sidebar-foreground: 210 12% 16%; --sidebar-primary: 212 92% 45%; --sidebar-primary-foreground: 0 0% 100%; --sidebar-accent: 210 14% 91%; --sidebar-accent-foreground: 210 12% 16%; --sidebar-border: 210 14% 87%; --sidebar-ring: 212 92% 45%; } /* Material Light - https://material.io/design/color */ .theme-light-material { --background: 0 0% 98%; /* #fafafa */ --foreground: 0 0% 13%; /* #212121 */ --card: 0 0% 100%; /* #ffffff */ --card-foreground: 0 0% 13%; --popover: 0 0% 100%; --popover-foreground: 0 0% 13%; --primary: 187 100% 42%; /* #00acc1 Cyan 600 */ --primary-foreground: 0 0% 100%; --secondary: 0 0% 93%; /* #eeeeee */ --secondary-foreground: 0 0% 13%; --muted: 0 0% 93%; --muted-foreground: 0 0% 46%; /* #757575 */ --accent: 0 0% 88%; --accent-foreground: 0 0% 13%; --destructive: 4 90% 58%; /* #f44336 Red 500 */ --destructive-foreground: 0 0% 100%; --border: 0 0% 88%; --input: 0 0% 88%; --ring: 187 100% 42%; --sidebar-background: 0 0% 96%; --sidebar-foreground: 0 0% 13%; --sidebar-primary: 187 100% 42%; --sidebar-primary-foreground: 0 0% 100%; --sidebar-accent: 0 0% 90%; --sidebar-accent-foreground: 0 0% 13%; --sidebar-border: 0 0% 85%; --sidebar-ring: 187 100% 42%; } /* Atom One Light - https://github.com/atom/atom/tree/master/packages/one-light-syntax */ .theme-light-atom-one { --background: 230 8% 98%; /* #fafafa */ --foreground: 230 8% 24%; /* #383a42 */ --card: 0 0% 100%; --card-foreground: 230 8% 24%; --popover: 0 0% 100%; --popover-foreground: 230 8% 24%; --primary: 230 100% 66%; /* #4078f2 */ --primary-foreground: 0 0% 100%; --secondary: 230 8% 93%; /* #e5e5e6 */ --secondary-foreground: 230 8% 24%; --muted: 230 8% 93%; --muted-foreground: 230 4% 50%; /* #a0a1a7 */ --accent: 230 8% 88%; --accent-foreground: 230 8% 24%; --destructive: 5 74% 59%; /* #e45649 */ --destructive-foreground: 0 0% 100%; --border: 230 8% 88%; --input: 230 8% 88%; --ring: 230 100% 66%; --sidebar-background: 230 8% 95%; --sidebar-foreground: 230 8% 24%; --sidebar-primary: 230 100% 66%; --sidebar-primary-foreground: 0 0% 100%; --sidebar-accent: 230 8% 90%; --sidebar-accent-foreground: 230 8% 24%; --sidebar-border: 230 8% 85%; --sidebar-ring: 230 100% 66%; } /* ============================================================================= DARK THEMES - Official color palettes from theme specifications ============================================================================= */ /* Catppuccin Mocha - https://catppuccin.com/palette/ */ .dark.theme-dark-catppuccin { --background: 240 21% 15%; /* #1e1e2e Base */ --foreground: 226 64% 88%; /* #cdd6f4 Text */ --card: 240 21% 17%; /* #313244 Surface0 */ --card-foreground: 226 64% 88%; --popover: 240 21% 17%; --popover-foreground: 226 64% 88%; --primary: 267 84% 81%; /* #cba6f7 Mauve */ --primary-foreground: 240 21% 15%; --secondary: 237 16% 23%; /* #313244 Surface0 */ --secondary-foreground: 226 64% 88%; --muted: 237 16% 23%; --muted-foreground: 228 24% 72%; /* #a6adc8 Subtext0 */ --accent: 240 21% 24%; --accent-foreground: 226 64% 88%; --destructive: 343 81% 75%; /* #f38ba8 Red */ --destructive-foreground: 226 64% 88%; --border: 237 16% 25%; --input: 237 16% 25%; --ring: 267 84% 81%; --sidebar-background: 240 23% 9%; /* #11111b Crust */ --sidebar-foreground: 226 64% 88%; --sidebar-primary: 267 84% 81%; --sidebar-primary-foreground: 240 21% 15%; --sidebar-accent: 240 21% 16%; --sidebar-accent-foreground: 226 64% 88%; --sidebar-border: 237 16% 20%; --sidebar-ring: 267 84% 81%; } /* Dracula - https://draculatheme.com/spec */ .dark.theme-dark-dracula { --background: 231 15% 18%; /* #282a36 Background */ --foreground: 60 30% 96%; /* #f8f8f2 Foreground */ --card: 232 14% 21%; /* #343746 Floating */ --card-foreground: 60 30% 96%; --popover: 232 14% 21%; --popover-foreground: 60 30% 96%; --primary: 265 89% 78%; /* #bd93f9 Purple */ --primary-foreground: 231 15% 18%; --secondary: 232 14% 31%; /* #44475a Current Line */ --secondary-foreground: 60 30% 96%; --muted: 232 14% 31%; --muted-foreground: 225 14% 51%; /* #6272a4 Comment */ --accent: 232 14% 28%; --accent-foreground: 60 30% 96%; --destructive: 0 100% 67%; /* #ff5555 Red */ --destructive-foreground: 60 30% 96%; --border: 232 14% 28%; --input: 232 14% 28%; --ring: 265 89% 78%; --sidebar-background: 231 15% 14%; /* #191a21 Background Darker */ --sidebar-foreground: 60 30% 96%; --sidebar-primary: 265 89% 78%; --sidebar-primary-foreground: 231 15% 18%; --sidebar-accent: 232 14% 22%; --sidebar-accent-foreground: 60 30% 96%; --sidebar-border: 232 14% 24%; --sidebar-ring: 265 89% 78%; } /* Rose Pine - https://rosepinetheme.com/palette/ */ .dark.theme-dark-rose-pine { --background: 249 22% 12%; /* #191724 Base */ --foreground: 245 50% 91%; /* #e0def4 Text */ --card: 247 23% 15%; /* #1f1d2e Surface */ --card-foreground: 245 50% 91%; --popover: 247 23% 15%; --popover-foreground: 245 50% 91%; --primary: 267 57% 78%; /* #c4a7e7 Iris */ --primary-foreground: 249 22% 12%; --secondary: 248 25% 18%; /* #26233a Overlay */ --secondary-foreground: 245 50% 91%; --muted: 248 25% 18%; --muted-foreground: 249 12% 52%; /* #6e6a86 Muted */ --accent: 248 25% 22%; --accent-foreground: 245 50% 91%; --destructive: 343 76% 68%; /* #eb6f92 Love */ --destructive-foreground: 245 50% 91%; --border: 248 25% 22%; --input: 248 25% 22%; --ring: 267 57% 78%; --sidebar-background: 249 22% 10%; --sidebar-foreground: 245 50% 91%; --sidebar-primary: 267 57% 78%; --sidebar-primary-foreground: 249 22% 12%; --sidebar-accent: 247 23% 16%; --sidebar-accent-foreground: 245 50% 91%; --sidebar-border: 248 25% 18%; --sidebar-ring: 267 57% 78%; } /* Rose Pine Moon - https://rosepinetheme.com/palette/ */ .dark.theme-dark-rose-pine-moon { --background: 246 24% 17%; /* #232136 Base */ --foreground: 245 50% 91%; /* #e0def4 Text */ --card: 248 24% 20%; /* #2a273f Surface */ --card-foreground: 245 50% 91%; --popover: 248 24% 20%; --popover-foreground: 245 50% 91%; --primary: 267 57% 78%; /* #c4a7e7 Iris */ --primary-foreground: 246 24% 17%; --secondary: 249 22% 26%; /* #393552 Overlay */ --secondary-foreground: 245 50% 91%; --muted: 249 22% 26%; --muted-foreground: 249 12% 52%; /* #6e6a86 Muted */ --accent: 249 22% 30%; --accent-foreground: 245 50% 91%; --destructive: 343 76% 68%; /* #eb6f92 Love */ --destructive-foreground: 245 50% 91%; --border: 249 22% 28%; --input: 249 22% 28%; --ring: 267 57% 78%; --sidebar-background: 246 24% 14%; --sidebar-foreground: 245 50% 91%; --sidebar-primary: 267 57% 78%; --sidebar-primary-foreground: 246 24% 17%; --sidebar-accent: 248 24% 21%; --sidebar-accent-foreground: 245 50% 91%; --sidebar-border: 249 22% 24%; --sidebar-ring: 267 57% 78%; } /* Tokyo Night - https://github.com/tokyo-night/tokyo-night-vscode-theme */ .dark.theme-dark-tokyo-night { --background: 235 21% 14%; /* #1a1b26 Background */ --foreground: 227 16% 73%; /* #a9b1d6 Foreground */ --card: 234 22% 17%; /* #24283b Storm Background */ --card-foreground: 227 16% 73%; --popover: 234 22% 17%; --popover-foreground: 227 16% 73%; --primary: 220 91% 72%; /* #7aa2f7 Blue */ --primary-foreground: 235 21% 14%; --secondary: 234 22% 22%; --secondary-foreground: 227 16% 73%; --muted: 234 22% 22%; --muted-foreground: 221 17% 52%; /* #565f89 Comment */ --accent: 234 22% 26%; --accent-foreground: 227 16% 73%; --destructive: 348 86% 70%; /* #f7768e Red */ --destructive-foreground: 227 16% 73%; --border: 234 22% 26%; --input: 234 22% 26%; --ring: 220 91% 72%; --sidebar-background: 235 21% 11%; --sidebar-foreground: 227 16% 73%; --sidebar-primary: 220 91% 72%; --sidebar-primary-foreground: 235 21% 14%; --sidebar-accent: 234 22% 18%; --sidebar-accent-foreground: 227 16% 73%; --sidebar-border: 234 22% 20%; --sidebar-ring: 220 91% 72%; } /* Nord Dark - https://www.nordtheme.com/ */ .dark.theme-dark-nord { --background: 220 16% 22%; /* #2e3440 Nord0 */ --foreground: 219 28% 88%; /* #d8dee9 Nord4 */ --card: 222 16% 26%; /* #3b4252 Nord1 */ --card-foreground: 219 28% 88%; --popover: 222 16% 26%; --popover-foreground: 219 28% 88%; --primary: 210 34% 63%; /* #81a1c1 Nord9 */ --primary-foreground: 220 16% 22%; --secondary: 220 17% 32%; /* #434c5e Nord2 */ --secondary-foreground: 219 28% 88%; --muted: 220 17% 32%; --muted-foreground: 219 14% 64%; /* #8fbcbb Nord7 */ --accent: 220 16% 36%; --accent-foreground: 219 28% 88%; --destructive: 354 42% 56%; /* #bf616a Nord11 */ --destructive-foreground: 219 28% 88%; --border: 220 16% 30%; --input: 220 16% 30%; --ring: 210 34% 63%; --sidebar-background: 220 16% 18%; --sidebar-foreground: 219 28% 88%; --sidebar-primary: 210 34% 63%; --sidebar-primary-foreground: 220 16% 22%; --sidebar-accent: 222 16% 24%; --sidebar-accent-foreground: 219 28% 88%; --sidebar-border: 220 16% 26%; --sidebar-ring: 210 34% 63%; } /* One Dark - https://github.com/atom/one-dark-syntax */ .dark.theme-dark-one-dark { --background: 220 13% 18%; /* #282c34 Background */ --foreground: 220 14% 71%; /* #abb2bf Foreground */ --card: 220 13% 21%; --card-foreground: 220 14% 71%; --popover: 220 13% 21%; --popover-foreground: 220 14% 71%; --primary: 207 82% 66%; /* #61afef Blue */ --primary-foreground: 220 13% 18%; --secondary: 220 13% 25%; --secondary-foreground: 220 14% 71%; --muted: 220 13% 25%; --muted-foreground: 220 9% 46%; /* #5c6370 Comment */ --accent: 220 13% 28%; --accent-foreground: 220 14% 71%; --destructive: 355 65% 65%; /* #e06c75 Red */ --destructive-foreground: 220 14% 71%; --border: 220 13% 28%; --input: 220 13% 28%; --ring: 207 82% 66%; --sidebar-background: 220 13% 15%; --sidebar-foreground: 220 14% 71%; --sidebar-primary: 207 82% 66%; --sidebar-primary-foreground: 220 13% 18%; --sidebar-accent: 220 13% 22%; --sidebar-accent-foreground: 220 14% 71%; --sidebar-border: 220 13% 24%; --sidebar-ring: 207 82% 66%; } /* Gruvbox Dark - https://github.com/morhetz/gruvbox */ .dark.theme-dark-gruvbox { --background: 0 0% 16%; /* #282828 bg0 */ --foreground: 47 73% 85%; /* #ebdbb2 fg1 */ --card: 10 6% 18%; /* #3c3836 bg1 */ --card-foreground: 47 73% 85%; --popover: 10 6% 18%; --popover-foreground: 47 73% 85%; --primary: 61 66% 44%; /* #b8bb26 Green */ --primary-foreground: 0 0% 16%; --secondary: 10 6% 22%; /* #504945 bg2 */ --secondary-foreground: 47 73% 85%; --muted: 10 6% 22%; --muted-foreground: 36 33% 64%; /* #a89984 fg4 */ --accent: 10 6% 26%; --accent-foreground: 47 73% 85%; --destructive: 0 73% 59%; /* #fb4934 Red */ --destructive-foreground: 47 73% 85%; --border: 10 6% 26%; --input: 10 6% 26%; --ring: 61 66% 44%; --sidebar-background: 0 0% 13%; /* #1d2021 bg0_h */ --sidebar-foreground: 47 73% 85%; --sidebar-primary: 61 66% 44%; --sidebar-primary-foreground: 0 0% 16%; --sidebar-accent: 10 6% 20%; --sidebar-accent-foreground: 47 73% 85%; --sidebar-border: 10 6% 22%; --sidebar-ring: 61 66% 44%; } /* Solarized Dark - https://ethanschoonover.com/solarized/ */ .dark.theme-dark-solarized { --background: 192 100% 11%; /* #002b36 Base03 */ --foreground: 186 8% 55%; /* #839496 Base0 */ --card: 192 81% 14%; /* #073642 Base02 */ --card-foreground: 186 8% 55%; --popover: 192 81% 14%; --popover-foreground: 186 8% 55%; --primary: 205 69% 49%; /* #268bd2 Blue */ --primary-foreground: 192 100% 11%; --secondary: 192 81% 18%; --secondary-foreground: 186 8% 55%; --muted: 192 81% 18%; --muted-foreground: 186 13% 40%; /* #657b83 Base00 */ --accent: 192 81% 22%; --accent-foreground: 186 8% 55%; --destructive: 1 71% 52%; /* #dc322f Red */ --destructive-foreground: 186 8% 55%; --border: 192 81% 22%; --input: 192 81% 22%; --ring: 205 69% 49%; --sidebar-background: 192 100% 9%; --sidebar-foreground: 186 8% 55%; --sidebar-primary: 205 69% 49%; --sidebar-primary-foreground: 192 100% 11%; --sidebar-accent: 192 81% 16%; --sidebar-accent-foreground: 186 8% 55%; --sidebar-border: 192 81% 18%; --sidebar-ring: 205 69% 49%; } /* Everforest Dark - https://github.com/sainnhe/everforest */ .dark.theme-dark-everforest { --background: 150 10% 16%; /* #2d353b bg0 */ --foreground: 75 11% 77%; /* #d3c6aa fg */ --card: 150 9% 18%; /* #343f44 bg1 */ --card-foreground: 75 11% 77%; --popover: 150 9% 18%; --popover-foreground: 75 11% 77%; --primary: 93 37% 63%; /* #a7c080 Green */ --primary-foreground: 150 10% 16%; --secondary: 150 9% 22%; /* #3d484d bg2 */ --secondary-foreground: 75 11% 77%; --muted: 150 9% 22%; --muted-foreground: 75 6% 60%; /* #9da9a0 Grey1 */ --accent: 150 9% 26%; --accent-foreground: 75 11% 77%; --destructive: 0 43% 63%; /* #e67e80 Red */ --destructive-foreground: 75 11% 77%; --border: 150 9% 26%; --input: 150 9% 26%; --ring: 93 37% 63%; --sidebar-background: 150 10% 13%; --sidebar-foreground: 75 11% 77%; --sidebar-primary: 93 37% 63%; --sidebar-primary-foreground: 150 10% 16%; --sidebar-accent: 150 9% 19%; --sidebar-accent-foreground: 75 11% 77%; --sidebar-border: 150 9% 22%; --sidebar-ring: 93 37% 63%; } /* Kanagawa - https://github.com/rebelot/kanagawa.nvim */ .dark.theme-dark-kanagawa { --background: 225 17% 14%; /* #1f1f28 sumiInk1 */ --foreground: 39 9% 80%; /* #dcd7ba fujiWhite */ --card: 225 15% 17%; /* #2a2a37 sumiInk3 */ --card-foreground: 39 9% 80%; --popover: 225 15% 17%; --popover-foreground: 39 9% 80%; --primary: 223 47% 67%; /* #7e9cd8 crystalBlue */ --primary-foreground: 225 17% 14%; --secondary: 225 14% 21%; /* #363646 sumiInk4 */ --secondary-foreground: 39 9% 80%; --muted: 225 14% 21%; --muted-foreground: 225 7% 52%; /* #727169 fujiGray */ --accent: 225 14% 26%; --accent-foreground: 39 9% 80%; --destructive: 7 73% 66%; /* #e82424 samuraiRed */ --destructive-foreground: 39 9% 80%; --border: 225 14% 26%; --input: 225 14% 26%; --ring: 223 47% 67%; --sidebar-background: 225 17% 11%; --sidebar-foreground: 39 9% 80%; --sidebar-primary: 223 47% 67%; --sidebar-primary-foreground: 225 17% 14%; --sidebar-accent: 225 15% 18%; --sidebar-accent-foreground: 39 9% 80%; --sidebar-border: 225 14% 22%; --sidebar-ring: 223 47% 67%; } /* Monokai - https://monokai.pro/spec */ .dark.theme-dark-monokai { --background: 70 8% 15%; /* #272822 */ --foreground: 60 36% 96%; /* #f8f8f2 */ --card: 70 8% 18%; --card-foreground: 60 36% 96%; --popover: 70 8% 18%; --popover-foreground: 60 36% 96%; --primary: 338 95% 56%; /* #f92672 Pink */ --primary-foreground: 60 36% 96%; --secondary: 70 8% 22%; --secondary-foreground: 60 36% 96%; --muted: 70 8% 22%; --muted-foreground: 50 11% 53%; /* #75715e Comment */ --accent: 70 8% 28%; --accent-foreground: 60 36% 96%; --destructive: 338 95% 56%; --destructive-foreground: 60 36% 96%; --border: 70 8% 25%; --input: 70 8% 25%; --ring: 338 95% 56%; --sidebar-background: 70 8% 11%; --sidebar-foreground: 60 36% 96%; --sidebar-primary: 338 95% 56%; --sidebar-primary-foreground: 60 36% 96%; --sidebar-accent: 70 8% 18%; --sidebar-accent-foreground: 60 36% 96%; --sidebar-border: 70 8% 20%; --sidebar-ring: 338 95% 56%; } /* Monokai Pro - https://monokai.pro/ */ .dark.theme-dark-monokai-pro { --background: 220 10% 18%; /* #2d2a2e */ --foreground: 20 5% 90%; /* #fcfcfa */ --card: 220 10% 21%; --card-foreground: 20 5% 90%; --popover: 220 10% 21%; --popover-foreground: 20 5% 90%; --primary: 349 100% 73%; /* #ff6188 */ --primary-foreground: 220 10% 18%; --secondary: 220 10% 26%; --secondary-foreground: 20 5% 90%; --muted: 220 10% 26%; --muted-foreground: 220 6% 50%; /* #727072 */ --accent: 220 10% 32%; --accent-foreground: 20 5% 90%; --destructive: 349 100% 73%; --destructive-foreground: 220 10% 18%; --border: 220 10% 28%; --input: 220 10% 28%; --ring: 349 100% 73%; --sidebar-background: 220 10% 14%; --sidebar-foreground: 20 5% 90%; --sidebar-primary: 349 100% 73%; --sidebar-primary-foreground: 220 10% 18%; --sidebar-accent: 220 10% 22%; --sidebar-accent-foreground: 20 5% 90%; --sidebar-border: 220 10% 24%; --sidebar-ring: 349 100% 73%; } /* Material Dark - https://material-theme.com/ */ .dark.theme-dark-material { --background: 200 19% 18%; /* #263238 Blue Grey 900 */ --foreground: 0 0% 93%; /* #eeffff */ --card: 200 18% 21%; --card-foreground: 0 0% 93%; --popover: 200 18% 21%; --popover-foreground: 0 0% 93%; --primary: 174 42% 65%; /* #80cbc4 Teal 200 */ --primary-foreground: 200 19% 18%; --secondary: 200 18% 26%; --secondary-foreground: 0 0% 93%; --muted: 200 18% 26%; --muted-foreground: 199 18% 49%; /* #546e7a Blue Grey 500 */ --accent: 200 18% 30%; --accent-foreground: 0 0% 93%; --destructive: 1 77% 55%; /* #f07178 */ --destructive-foreground: 0 0% 93%; --border: 200 18% 28%; --input: 200 18% 28%; --ring: 174 42% 65%; --sidebar-background: 200 19% 14%; --sidebar-foreground: 0 0% 93%; --sidebar-primary: 174 42% 65%; --sidebar-primary-foreground: 200 19% 18%; --sidebar-accent: 200 18% 22%; --sidebar-accent-foreground: 0 0% 93%; --sidebar-border: 200 18% 24%; --sidebar-ring: 174 42% 65%; } /* Palenight - https://github.com/whizkydee/vscode-palenight-theme */ .dark.theme-dark-palenight { --background: 229 27% 20%; /* #292d3e */ --foreground: 229 35% 88%; /* #bfc7d5 */ --card: 229 26% 24%; --card-foreground: 229 35% 88%; --popover: 229 26% 24%; --popover-foreground: 229 35% 88%; --primary: 286 60% 67%; /* #c792ea Purple */ --primary-foreground: 229 27% 20%; --secondary: 229 24% 30%; --secondary-foreground: 229 35% 88%; --muted: 229 24% 30%; --muted-foreground: 229 20% 50%; /* #676e95 */ --accent: 229 24% 35%; --accent-foreground: 229 35% 88%; --destructive: 355 65% 65%; /* #f07178 */ --destructive-foreground: 229 35% 88%; --border: 229 24% 32%; --input: 229 24% 32%; --ring: 286 60% 67%; --sidebar-background: 229 27% 16%; --sidebar-foreground: 229 35% 88%; --sidebar-primary: 286 60% 67%; --sidebar-primary-foreground: 229 27% 20%; --sidebar-accent: 229 26% 26%; --sidebar-accent-foreground: 229 35% 88%; --sidebar-border: 229 24% 28%; --sidebar-ring: 286 60% 67%; } /* GitHub Dark - https://primer.style/primitives/colors */ .dark.theme-dark-github { --background: 215 21% 11%; /* #0d1117 */ --foreground: 210 17% 82%; /* #c9d1d9 */ --card: 215 19% 14%; /* #161b22 */ --card-foreground: 210 17% 82%; --popover: 215 19% 14%; --popover-foreground: 210 17% 82%; --primary: 212 100% 67%; /* #58a6ff */ --primary-foreground: 215 21% 11%; --secondary: 215 18% 18%; --secondary-foreground: 210 17% 82%; --muted: 215 18% 18%; --muted-foreground: 215 13% 47%; /* #8b949e */ --accent: 215 18% 22%; --accent-foreground: 210 17% 82%; --destructive: 356 72% 65%; /* #f85149 */ --destructive-foreground: 210 17% 82%; --border: 215 18% 20%; --input: 215 18% 20%; --ring: 212 100% 67%; --sidebar-background: 215 21% 8%; --sidebar-foreground: 210 17% 82%; --sidebar-primary: 212 100% 67%; --sidebar-primary-foreground: 215 21% 11%; --sidebar-accent: 215 19% 15%; --sidebar-accent-foreground: 210 17% 82%; --sidebar-border: 215 18% 16%; --sidebar-ring: 212 100% 67%; } @layer base { * { @apply border-border; } body { @apply bg-background text-foreground; font-family: var(--font-sans); } button { cursor: pointer; } } /* Custom animations */ @keyframes speedy-entrance { 0% { opacity: 0.3; transform: scale(0.9) translateY(-10px); } 40% { opacity: 1; transform: scale(1.03) translateY(0); } 70% { transform: scale(0.99); } 100% { transform: scale(1); } } @keyframes subtle-pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.02); } } @keyframes sparkle-slide { 0% { opacity: 0; transform: translateX(-20px) scale(0); } 20% { opacity: 1; transform: translateX(0) scale(1.2); } 40% { transform: translateX(0) scale(1); } 60% { opacity: 1; transform: translateX(0) scale(1); } 80%, 100% { opacity: 0; transform: translateX(0) scale(0); } } .animate-speedy { animation: speedy-entrance 0.6s cubic-bezier(0.22, 1, 0.36, 1) forwards, subtle-pulse 2s ease-in-out 0.8s infinite; position: relative; } /* Sparkle base styles */ .sparkle { position: absolute; color: rgba(251, 191, 36, 0.9); text-shadow: 0 0 4px rgba(251, 191, 36, 0.6); animation: sparkle-slide 3s ease-out infinite; pointer-events: none; font-size: 12px; opacity: 0; } /* Position sparkles around the DOCKHAND text (bottom half of logo) - sequentially from left to right */ .sparkle-1 { bottom: 10px; left: 5%; font-size: 8px; animation-delay: 1s; } .sparkle-2 { bottom: 4px; left: 18%; font-size: 10px; animation-delay: 1.2s; } .sparkle-3 { bottom: 14px; left: 30%; font-size: 7px; animation-delay: 1.4s; } .sparkle-4 { bottom: 2px; left: 42%; font-size: 11px; animation-delay: 1.6s; } .sparkle-5 { bottom: 8px; left: 52%; font-size: 9px; animation-delay: 1.8s; } .sparkle-6 { bottom: 16px; left: 65%; font-size: 6px; animation-delay: 2s; } .sparkle-7 { bottom: 6px; left: 78%; font-size: 10px; animation-delay: 2.2s; } .sparkle-8 { bottom: 12px; left: 90%; font-size: 8px; animation-delay: 2.4s; } /* Click to jump animations - 3 levels */ @keyframes jump-small { 0%, 100% { transform: translateY(0) rotate(0deg); } 30% { transform: translateY(-10px) rotate(-2deg); } 60% { transform: translateY(0) rotate(0deg); } } @keyframes jump-medium { 0%, 100% { transform: translateY(0) rotate(0deg); } 20% { transform: translateY(-20px) rotate(-3deg); } 40% { transform: translateY(0) rotate(0deg); } 60% { transform: translateY(-10px) rotate(2deg); } 80% { transform: translateY(0) rotate(0deg); } } @keyframes jump-big { 0%, 100% { transform: translateY(0) rotate(0deg); } 10% { transform: translateY(-30px) rotate(-5deg); } 20% { transform: translateY(0) rotate(0deg); } 30% { transform: translateY(-20px) rotate(5deg); } 40% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-10px) rotate(-3deg); } 60% { transform: translateY(0) rotate(0deg); } } .animate-speedy.jumping-0 { animation: jump-small 0.5s ease-out !important; cursor: pointer; } .animate-speedy.jumping-1 { animation: jump-medium 0.6s ease-out !important; cursor: pointer; } .animate-speedy.jumping-2 { animation: jump-big 0.8s ease-out !important; cursor: pointer; } @keyframes crazy-jump { 0%, 100% { transform: translateY(0) rotate(0deg) scale(1); } 5% { transform: translateY(-50px) rotate(-15deg) scale(1.1); } 10% { transform: translateY(0) rotate(10deg) scale(0.9); } 15% { transform: translateY(-40px) rotate(20deg) scale(1.15); } 20% { transform: translateY(0) rotate(-15deg) scale(0.85); } 25% { transform: translateY(-35px) rotate(-25deg) scale(1.1); } 30% { transform: translateY(0) rotate(15deg) scale(0.9); } 40% { transform: translateY(-25px) rotate(10deg) scale(1.05); } 50% { transform: translateY(0) rotate(-5deg) scale(0.95); } 60% { transform: translateY(-15px) rotate(5deg) scale(1); } 70% { transform: translateY(0) rotate(0deg) scale(1); } } .animate-speedy.crazy-jumping { animation: crazy-jump 1.2s ease-out !important; cursor: pointer; } .animate-speedy.clicked { animation: none; } .animate-speedy { cursor: pointer; } /* Easter egg popup */ .easter-egg-popup { position: absolute; top: calc(100% + 20px); left: 50%; transform: translateX(-50%); background: linear-gradient(135deg, rgba(251, 191, 36, 0.95), rgba(245, 158, 11, 0.95)); color: #1a1a1a; padding: 0.75rem 1rem; border-radius: 0.75rem; font-weight: 600; font-size: 0.85rem; text-align: center; white-space: nowrap; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2), 0 0 20px rgba(251, 191, 36, 0.3); z-index: 9999; animation: popup-jump 0.5s ease-out; } .easter-egg-popup::before { content: ''; position: absolute; top: -8px; left: 50%; transform: translateX(-50%); border-left: 8px solid transparent; border-right: 8px solid transparent; border-bottom: 8px solid rgba(251, 191, 36, 0.95); } @keyframes popup-jump { 0% { opacity: 0; transform: translateX(-50%) translateY(-20px) scale(0.5); } 50% { transform: translateX(-50%) translateY(10px) scale(1.1); } 70% { transform: translateX(-50%) translateY(-5px) scale(0.95); } 100% { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); } } /* Tagline text styling */ .tagline-text { min-height: 1.5em; } @keyframes tagline-zoom-in { 0% { opacity: 0; transform: scale(1.8); filter: blur(4px); } 30% { opacity: 1; transform: scale(1.3); filter: blur(1px); } 60% { transform: scale(0.95); filter: blur(0); } 80% { transform: scale(1.02); } 100% { opacity: 1; transform: scale(1); filter: blur(0); } } .tagline-zoom { animation: tagline-zoom-in 0.5s ease-out; } /* Stat box styling for About page */ .stat-box { display: flex; flex-direction: column; align-items: center; padding: 0.75rem 0.5rem; border-radius: 0.75rem; background: linear-gradient(135deg, hsl(var(--muted) / 0.3), hsl(var(--muted) / 0.5)); transition: all 0.2s ease; } .stat-box:hover { transform: translateY(-2px); box-shadow: 0 4px 12px hsl(var(--foreground) / 0.1); } .stat-icon-wrapper { display: flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; border-radius: 0.5rem; margin-bottom: 0.5rem; } .stat-box-blue:hover { background: linear-gradient(135deg, rgb(59 130 246 / 0.08), rgb(59 130 246 / 0.15)); } .stat-box-cyan:hover { background: linear-gradient(135deg, rgb(6 182 212 / 0.08), rgb(6 182 212 / 0.15)); } .stat-box-purple:hover { background: linear-gradient(135deg, rgb(168 85 247 / 0.08), rgb(168 85 247 / 0.15)); } .stat-box-green:hover { background: linear-gradient(135deg, rgb(34 197 94 / 0.08), rgb(34 197 94 / 0.15)); } .stat-box-orange:hover { background: linear-gradient(135deg, rgb(249 115 22 / 0.08), rgb(249 115 22 / 0.15)); } .stat-box-amber:hover { background: linear-gradient(135deg, rgb(245 158 11 / 0.08), rgb(245 158 11 / 0.15)); } /* Custom text size for very small labels (10px) */ @layer utilities { .text-2xs { font-size: 10px; line-height: 14px; } /* Icon glow utilities - standard size (4px blur, 0.6 opacity) */ .glow-green { filter: drop-shadow(0 0 4px rgba(34, 197, 94, 0.6)); } .glow-green-sm { filter: drop-shadow(0 0 3px rgba(34, 197, 94, 0.5)); } .glow-amber { filter: drop-shadow(0 0 4px rgba(245, 158, 11, 0.6)); } .glow-amber-sm { filter: drop-shadow(0 0 3px rgba(245, 158, 11, 0.5)); } .glow-blue { filter: drop-shadow(0 0 4px rgba(59, 130, 246, 0.6)); } .glow-purple { filter: drop-shadow(0 0 4px rgba(168, 85, 247, 0.6)); } .glow-cyan { filter: drop-shadow(0 0 4px rgba(6, 182, 212, 0.6)); } .glow-sky { filter: drop-shadow(0 0 4px rgba(56, 189, 248, 0.6)); } } /* Improved warning colors for dark mode readability */ @layer utilities { /* Yellow warning text - brighter in dark mode */ .dark .text-yellow-500 { color: rgb(253 224 71) !important; /* yellow-300 */ } .dark .text-yellow-600 { color: rgb(250 204 21) !important; /* yellow-400 */ } /* Amber warning text - brighter in dark mode */ .dark .text-amber-500 { color: rgb(252 211 77) !important; /* amber-300 */ } .dark .text-amber-600 { color: rgb(251 191 36) !important; /* amber-400 */ } /* Orange warning text - brighter in dark mode */ .dark .text-orange-500 { color: rgb(253 186 116) !important; /* orange-300 */ } .dark .text-orange-600 { color: rgb(251 146 60) !important; /* orange-400 */ } /* Red error text - brighter in dark mode */ .dark .text-red-500 { color: rgb(254 202 202) !important; /* red-200 */ } .dark .text-red-600 { color: rgb(252 165 165) !important; /* red-300 */ } } /* Update available icon animation */ @keyframes bounce-once { 0%, 100% { transform: scale(1); } 25% { transform: scale(1.4); } 50% { transform: scale(0.9); } 75% { transform: scale(1.15); } } .animate-bounce-once { animation: bounce-once 0.6s ease-out; } /* CodeMirror selection - override theme defaults for dark mode */ .cm-editor .cm-selectionBackground, .cm-editor.cm-focused .cm-selectionBackground, .cm-editor.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground { background-color: #3d4654 !important; } /* ============================================ Data Grid - Sticky Columns & Column Resize ============================================ */ /* Container must have horizontal scroll */ .data-grid-wrapper { overflow-x: auto; position: relative; } /* Table uses fixed layout for resize to work */ /* min-width ensures table fills container; inline style overrides when calculated */ .data-grid { table-layout: fixed; border-collapse: separate; border-spacing: 0; min-width: 100%; } /* Allow content to truncate with ellipsis when column is shrunk */ .data-grid td, .data-grid th { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Columns marked with noTruncate should not be truncated */ .data-grid td.no-truncate, .data-grid th.no-truncate { overflow: visible; text-overflow: clip; } /* Allow flex containers inside cells to shrink below content width */ .data-grid td .flex, .data-grid th .flex { min-width: 0; overflow: hidden; } /* Select column (checkbox) - fixed width, don't grow, centered */ .data-grid th.select-col, .data-grid td.select-col { width: 32px !important; min-width: 32px; max-width: 32px; text-align: center; } .data-grid th.select-col > *, .data-grid td.select-col > * { margin: 0 auto; } /* Expand column - fixed width, no border, centered */ .data-grid th.expand-col, .data-grid td.expand-col { width: 24px !important; min-width: 24px; max-width: 24px; border-right: none !important; text-align: center; } .data-grid th.expand-col > *, .data-grid td.expand-col > * { margin: 0 auto; } /* Actions column - width controlled by DataGrid component */ .data-grid .actions-col { min-width: 150px; } /* Subtle cell borders */ .data-grid td { border-right: 1px solid hsl(var(--border) / 0.3); border-bottom: 1px solid hsl(var(--border) / 0.3); } .data-grid th { border-right: 1px solid hsl(var(--border) / 0.3); border-bottom: 1px solid hsl(var(--border) / 0.5); } /* Remove right border from actions column */ .data-grid td.actions-col, .data-grid th.actions-col { border-right: none; } /* Header cells need relative positioning for resize handles */ .data-grid th { position: relative; } /* Ensure non-sticky cells don't create stacking context */ .data-grid tbody td:not(.select-col):not(.actions-col) { position: static; z-index: auto; } /* Sticky select column (checkbox) - body cells */ .data-grid td.select-col { position: sticky; left: 0; z-index: 2; } /* Sticky actions column - body cells */ .data-grid td.actions-col { position: sticky; right: 0; z-index: 2; } /* Sticky header cells need higher z-index than body */ .data-grid th.select-col, .data-grid th.actions-col { position: sticky; z-index: 12; } .data-grid th.select-col { left: 0; } .data-grid th.actions-col { right: 0; } /* Actions header extension - covers content on both sides */ .data-grid thead th.actions-col { /* Extend the cell visually to cover scrolling content */ position: sticky; right: 0; z-index: 12; background: hsl(var(--muted)); /* Use box-shadow to extend background in both directions */ box-shadow: -20px 0 0 0 hsl(var(--muted)), /* Left - covers scrolling headers */ 20px 0 0 0 hsl(var(--muted)); /* Right - covers gap to edge */ border-top-right-radius: 0.5rem; /* Clip path allows shadows but keeps rounded corner */ clip-path: inset(-1px -20px -1px -20px round 0 0.5rem 0 0); } /* Body cell backgrounds for sticky columns */ .data-grid td.select-col, .data-grid td.actions-col { background: hsl(var(--background)); } /* Header cell backgrounds for sticky columns (match header bg-muted) */ .data-grid thead th.select-col, .data-grid thead th.actions-col { background: hsl(var(--muted)); } /* Header row stays on top of everything */ .data-grid thead { position: sticky; top: 0; z-index: 10; } /* Header sticky columns need higher z-index */ .data-grid thead th.select-col, .data-grid thead th.actions-col { z-index: 11; } /* Row hover - all cells same color (including sticky columns) */ .data-grid tbody tr:hover td, .data-grid tbody tr:hover td.select-col, .data-grid tbody tr:hover td.actions-col { background: hsl(var(--muted)); } /* Selected row background - solid color using color-mix for sticky column compatibility */ .data-grid tbody tr.selected td, .data-grid tbody tr.selected td.select-col, .data-grid tbody tr.selected td.actions-col { background: color-mix(in srgb, hsl(var(--primary)) 10%, hsl(var(--background))); } /* Selected row hover - slightly stronger tint */ .data-grid tbody tr.selected:hover td, .data-grid tbody tr.selected:hover td.select-col, .data-grid tbody tr.selected:hover td.actions-col { background: color-mix(in srgb, hsl(var(--primary)) 15%, hsl(var(--background))); } /* Checkbox-selected row background - amber tint */ .data-grid tbody tr.checkbox-selected td, .data-grid tbody tr.checkbox-selected td.select-col, .data-grid tbody tr.checkbox-selected td.actions-col { background: color-mix(in srgb, #f59e0b 8%, hsl(var(--background))); } /* Checkbox-selected row hover */ .data-grid tbody tr.checkbox-selected:hover td, .data-grid tbody tr.checkbox-selected:hover td.select-col, .data-grid tbody tr.checkbox-selected:hover td.actions-col { background: color-mix(in srgb, #f59e0b 12%, hsl(var(--background))); } /* Row with expanded content below - subtle indicator */ .data-grid tbody tr.row-expanded td, .data-grid tbody tr.row-expanded td.select-col, .data-grid tbody tr.row-expanded td.actions-col { background: color-mix(in srgb, hsl(var(--muted)) 50%, hsl(var(--background))); border-bottom: none; } .data-grid tbody tr.row-expanded:hover td, .data-grid tbody tr.row-expanded:hover td.select-col, .data-grid tbody tr.row-expanded:hover td.actions-col { background: color-mix(in srgb, hsl(var(--muted)) 70%, hsl(var(--background))); } /* Expanded row - no background on td, let content control it */ .data-grid tbody tr.expanded-row td, .data-grid tbody tr.expanded-row td.select-col, .data-grid tbody tr.expanded-row td.actions-col { padding: 0; background: transparent; border-bottom: 1px solid hsl(var(--border)); overflow: hidden; } .data-grid tbody tr.expanded-row:hover td, .data-grid tbody tr.expanded-row:hover td.select-col, .data-grid tbody tr.expanded-row:hover td.actions-col { background: transparent; } /* Nested grid styling (inside expanded rows) */ .data-grid.nested-grid { border: none; min-width: 0; width: auto; } .data-grid.nested-grid thead th { background: transparent !important; border-bottom: 1px solid hsl(var(--border) / 0.5); padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .data-grid.nested-grid thead { background: transparent !important; } .data-grid.nested-grid thead th:first-child, .data-grid.nested-grid thead th:last-child, .data-grid.nested-grid thead th.actions-col { background: transparent !important; box-shadow: none !important; clip-path: none !important; } /* Nested grid first/last columns are NOT sticky - disable fixed sizing */ .data-grid.nested-grid td:first-child { width: unset !important; min-width: 0 !important; max-width: none !important; position: static !important; } /* Header cells still need relative for resize handles */ .data-grid.nested-grid th:first-child { width: unset !important; min-width: 0 !important; max-width: none !important; } .data-grid.nested-grid td:last-child { position: static !important; } .data-grid.nested-grid tbody td { background: transparent; border-right: none; border-bottom: 1px solid hsl(var(--border) / 0.3); } .data-grid.nested-grid tbody td:first-child, .data-grid.nested-grid tbody td:last-child, .data-grid.nested-grid tbody td.actions-col { background: transparent; } .data-grid.nested-grid tbody tr:hover td, .data-grid.nested-grid tbody tr:hover td:first-child, .data-grid.nested-grid tbody tr:hover td:last-child, .data-grid.nested-grid tbody tr:hover td.actions-col { background: hsl(var(--muted) / 0.3); } /* Resize handle styling */ .resize-handle { position: absolute; top: 0; right: -2px; width: 5px; height: 100%; cursor: col-resize; background: transparent; z-index: 5; } .resize-handle:hover, .resize-handle:active { background: hsl(var(--primary) / 0.4); } /* Left-side resize handle for fixed end columns */ .resize-handle-left { right: auto; left: -2px; z-index: 15; }