334 lines
7.8 KiB
CSS
334 lines
7.8 KiB
CSS
@import "tailwindcss";
|
||
|
||
@theme {
|
||
--font-sans: var(--font-sans), ui-sans-serif, system-ui, sans-serif;
|
||
--font-display: var(--font-display), var(--font-sans), ui-sans-serif, sans-serif;
|
||
--font-mono: var(--font-mono), ui-monospace, monospace;
|
||
|
||
--color-bg: var(--bg);
|
||
--color-surface: var(--surface);
|
||
--color-surface-hover: var(--surface-hover);
|
||
--color-border: var(--border);
|
||
--color-border-strong: var(--border-strong);
|
||
--color-text: var(--text);
|
||
--color-text-muted: var(--text-muted);
|
||
--color-text-faint: var(--text-faint);
|
||
|
||
--color-accent: var(--accent);
|
||
--color-accent-hover: var(--accent-hover);
|
||
--color-accent-soft: var(--accent-soft);
|
||
--color-accent-soft-text: var(--accent-soft-text);
|
||
|
||
--color-danger: var(--danger);
|
||
--color-danger-soft: var(--danger-soft);
|
||
--color-danger-soft-text: var(--danger-soft-text);
|
||
|
||
--color-warning: var(--warning);
|
||
--color-warning-soft: var(--warning-soft);
|
||
--color-warning-soft-text: var(--warning-soft-text);
|
||
|
||
--color-success: var(--success);
|
||
--color-success-soft: var(--success-soft);
|
||
--color-success-soft-text: var(--success-soft-text);
|
||
|
||
--color-info: var(--info);
|
||
--color-info-soft: var(--info-soft);
|
||
--color-info-soft-text: var(--info-soft-text);
|
||
|
||
--color-rose: var(--rose);
|
||
--color-rose-soft: var(--rose-soft);
|
||
--color-rose-soft-text: var(--rose-soft-text);
|
||
|
||
/* Chart marks — validated categorical set (dataviz skill), distinct from
|
||
the softer *-soft badge tokens which are too light for dark-mode marks. */
|
||
--color-chart-1: var(--chart-1);
|
||
--color-chart-2: var(--chart-2);
|
||
--color-chart-3: var(--chart-3);
|
||
--color-chart-4: var(--chart-4);
|
||
--color-chart-muted: var(--chart-muted);
|
||
|
||
--radius-sm: var(--radius-sm-val);
|
||
--radius-md: var(--radius-md-val);
|
||
--radius-lg: var(--radius-lg-val);
|
||
}
|
||
|
||
:root {
|
||
--bg: #f8f7fb;
|
||
--surface: #ffffff;
|
||
--surface-hover: #f2effa;
|
||
--border: #e5e0f2;
|
||
--border-strong: #cec4e8;
|
||
--text: #171325;
|
||
--text-muted: #635d7a;
|
||
--text-faint: #9891ad;
|
||
|
||
--accent: #6d28d9;
|
||
--accent-hover: #5b21b6;
|
||
--accent-soft: #f0e8fe;
|
||
--accent-soft-text: #5b21b6;
|
||
|
||
--danger: #dc2626;
|
||
--danger-soft: #fef2f2;
|
||
--danger-soft-text: #b91c1c;
|
||
|
||
--warning: #d97706;
|
||
--warning-soft: #fffbeb;
|
||
--warning-soft-text: #b45309;
|
||
|
||
--success: #0d9488;
|
||
--success-soft: #ecfdf9;
|
||
--success-soft-text: #0f766e;
|
||
|
||
--info: #2563eb;
|
||
--info-soft: #eff6ff;
|
||
--info-soft-text: #1d4ed8;
|
||
|
||
--rose: #e11d48;
|
||
--rose-soft: #fff1f2;
|
||
--rose-soft-text: #be123c;
|
||
|
||
/* Chart marks — fixed categorical order, CVD-validated (accent/success/
|
||
info/warning); reorder only after re-running the validator. */
|
||
--chart-1: #6d28d9;
|
||
--chart-2: #0d9488;
|
||
--chart-3: #2563eb;
|
||
--chart-4: #d97706;
|
||
--chart-muted: var(--border-strong);
|
||
|
||
--radius-sm-val: 8px;
|
||
--radius-md-val: 12px;
|
||
--radius-lg-val: 18px;
|
||
|
||
--bg-glow: none;
|
||
--card-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
|
||
|
||
color-scheme: light;
|
||
}
|
||
|
||
@media (prefers-color-scheme: dark) {
|
||
:root:not([data-theme="light"]) {
|
||
--bg: #0b0a12;
|
||
--surface: #161320;
|
||
--surface-hover: #1d1929;
|
||
--border: #2d2640;
|
||
--border-strong: #453c60;
|
||
--text: #f1eefb;
|
||
--text-muted: #a79fc4;
|
||
--text-faint: #6f6790;
|
||
|
||
--accent: #8b5cf6;
|
||
--accent-hover: #7c3aed;
|
||
--accent-soft: #251c3f;
|
||
--accent-soft-text: #c4b5fd;
|
||
|
||
--danger: #f87171;
|
||
--danger-soft: #2a1517;
|
||
--danger-soft-text: #fca5a5;
|
||
|
||
--warning: #fbbf24;
|
||
--warning-soft: #2a2110;
|
||
--warning-soft-text: #fcd34d;
|
||
|
||
--success: #2dd4bf;
|
||
--success-soft: #0f2320;
|
||
--success-soft-text: #5eead4;
|
||
|
||
--info: #60a5fa;
|
||
--info-soft: #12203a;
|
||
--info-soft-text: #93c5fd;
|
||
|
||
--rose: #fb7185;
|
||
--rose-soft: #2a1420;
|
||
--rose-soft-text: #fda4af;
|
||
|
||
/* Darker/more saturated than the badge tokens above — validated
|
||
separately for the dark-mode lightness band (L 0.48–0.67). */
|
||
--chart-1: #8b5cf6;
|
||
--chart-2: #0d9488;
|
||
--chart-3: #3b82f6;
|
||
--chart-4: #d97706;
|
||
--chart-muted: var(--border-strong);
|
||
|
||
--bg-glow: radial-gradient(ellipse 80% 50% at 50% -10%, rgba(139, 92, 246, 0.12), transparent 60%);
|
||
--card-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 8px 24px rgba(0, 0, 0, 0.35);
|
||
|
||
color-scheme: dark;
|
||
}
|
||
}
|
||
|
||
:root[data-theme="dark"] {
|
||
--bg: #0b0a12;
|
||
--surface: #161320;
|
||
--surface-hover: #1d1929;
|
||
--border: #2d2640;
|
||
--border-strong: #453c60;
|
||
--text: #f1eefb;
|
||
--text-muted: #a79fc4;
|
||
--text-faint: #6f6790;
|
||
|
||
--accent: #8b5cf6;
|
||
--accent-hover: #7c3aed;
|
||
--accent-soft: #251c3f;
|
||
--accent-soft-text: #c4b5fd;
|
||
|
||
--danger: #f87171;
|
||
--danger-soft: #2a1517;
|
||
--danger-soft-text: #fca5a5;
|
||
|
||
--warning: #fbbf24;
|
||
--warning-soft: #2a2110;
|
||
--warning-soft-text: #fcd34d;
|
||
|
||
--success: #2dd4bf;
|
||
--success-soft: #0f2320;
|
||
--success-soft-text: #5eead4;
|
||
|
||
--info: #60a5fa;
|
||
--info-soft: #12203a;
|
||
--info-soft-text: #93c5fd;
|
||
|
||
--rose: #fb7185;
|
||
--rose-soft: #2a1420;
|
||
--rose-soft-text: #fda4af;
|
||
|
||
--chart-1: #8b5cf6;
|
||
--chart-2: #0d9488;
|
||
--chart-3: #3b82f6;
|
||
--chart-4: #d97706;
|
||
--chart-muted: var(--border-strong);
|
||
|
||
--bg-glow: radial-gradient(ellipse 80% 50% at 50% -10%, rgba(139, 92, 246, 0.12), transparent 60%);
|
||
--card-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 8px 24px rgba(0, 0, 0, 0.35);
|
||
|
||
color-scheme: dark;
|
||
}
|
||
|
||
/* Theme-toggle icon: both render always, CSS picks which shows — same
|
||
data-theme cascade the palette above uses, so it never needs JS state. */
|
||
.theme-toggle-btn .theme-icon-sun {
|
||
display: none;
|
||
}
|
||
.theme-toggle-btn .theme-icon-moon {
|
||
display: inline;
|
||
}
|
||
@media (prefers-color-scheme: dark) {
|
||
:root:not([data-theme="light"]) .theme-toggle-btn .theme-icon-sun {
|
||
display: inline;
|
||
}
|
||
:root:not([data-theme="light"]) .theme-toggle-btn .theme-icon-moon {
|
||
display: none;
|
||
}
|
||
}
|
||
:root[data-theme="dark"] .theme-toggle-btn .theme-icon-sun {
|
||
display: inline;
|
||
}
|
||
:root[data-theme="dark"] .theme-toggle-btn .theme-icon-moon {
|
||
display: none;
|
||
}
|
||
|
||
* {
|
||
border-color: var(--border);
|
||
}
|
||
|
||
html,
|
||
body {
|
||
height: 100%;
|
||
overflow-x: hidden;
|
||
}
|
||
|
||
body {
|
||
background: var(--bg);
|
||
background-image: var(--bg-glow, none);
|
||
background-attachment: fixed;
|
||
color: var(--text);
|
||
font-family: var(--font-sans);
|
||
-webkit-font-smoothing: antialiased;
|
||
text-rendering: optimizeLegibility;
|
||
}
|
||
|
||
::selection {
|
||
background: var(--accent-soft);
|
||
color: var(--accent-soft-text);
|
||
}
|
||
|
||
:focus-visible {
|
||
outline: 2px solid var(--accent);
|
||
outline-offset: 2px;
|
||
border-radius: 4px;
|
||
}
|
||
|
||
::-webkit-scrollbar {
|
||
width: 10px;
|
||
height: 10px;
|
||
}
|
||
::-webkit-scrollbar-thumb {
|
||
background: var(--border-strong);
|
||
border-radius: 999px;
|
||
}
|
||
::-webkit-scrollbar-track {
|
||
background: transparent;
|
||
}
|
||
|
||
.card {
|
||
background: var(--surface);
|
||
border: 1px solid var(--border);
|
||
border-radius: var(--radius-md);
|
||
box-shadow: var(--card-shadow);
|
||
}
|
||
|
||
.btn {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
border-radius: var(--radius-sm);
|
||
font-weight: 600;
|
||
font-size: 0.875rem;
|
||
padding: 0.5rem 0.9rem;
|
||
transition: background-color 150ms ease, color 150ms ease, border-color 150ms ease, transform 100ms ease;
|
||
}
|
||
.btn:active {
|
||
transform: translateY(1px);
|
||
}
|
||
.btn-primary {
|
||
background: var(--accent);
|
||
color: white;
|
||
}
|
||
.btn-primary:hover {
|
||
background: var(--accent-hover);
|
||
}
|
||
.btn-ghost {
|
||
background: transparent;
|
||
color: var(--text-muted);
|
||
border: 1px solid var(--border);
|
||
}
|
||
.btn-ghost:hover {
|
||
background: var(--surface-hover);
|
||
color: var(--text);
|
||
}
|
||
|
||
.badge {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 0.35rem;
|
||
font-size: 0.75rem;
|
||
font-weight: 600;
|
||
padding: 0.15rem 0.55rem;
|
||
border-radius: 999px;
|
||
}
|
||
.badge-new {
|
||
background: var(--accent-soft);
|
||
color: var(--accent-soft-text);
|
||
}
|
||
.badge-open {
|
||
background: var(--success-soft);
|
||
color: var(--success-soft-text);
|
||
}
|
||
.badge-pending {
|
||
background: var(--warning-soft);
|
||
color: var(--warning-soft-text);
|
||
}
|
||
.badge-closed {
|
||
background: var(--border);
|
||
color: var(--text-muted);
|
||
}
|