Files
dockhand/app.css
Jarek Krochmalski 62e3c6439e Initial commit
2025-12-28 21:16:03 +01:00

1718 lines
47 KiB
CSS

@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;
}