frontend: Iris palette — graphite neutrals + indigo-violet accent
Tokens in globals.css, Tailwind gray/indigo scales remapped so the ~350 legacy raw-class uses follow the palette, light-mode override sheet moved off slate, map accent hexes updated. Severity hues retuned for AA. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
f4d78aba77
commit
7cd289874a
@@ -4,6 +4,8 @@
|
||||
|
||||
@import 'leaflet/dist/leaflet.css';
|
||||
|
||||
/* Palette: "Iris" (2026-11) — graphite neutrals + one indigo-violet accent.
|
||||
* Tailwind's gray/indigo scales are remapped to match in tailwind.config.ts. */
|
||||
/* ── Design tokens ────────────────────────────────────────────────────────────
|
||||
* Single source of truth for surface, ink and encoding colour. `:root` is the
|
||||
* LIGHT theme; `.dark` on <html> (set by ThemeProvider, darkMode: ["class"])
|
||||
@@ -16,43 +18,43 @@
|
||||
* Do not add a hue here for a category; add a glyph.
|
||||
*/
|
||||
:root {
|
||||
--page: #F4F6F9;
|
||||
--page: #F7F7F8;
|
||||
--surface: #FFFFFF;
|
||||
--raised: #F7F9FB;
|
||||
--line: rgba(11,17,27,.11);
|
||||
--line-strong: rgba(11,17,27,.22);
|
||||
--ink: #101620;
|
||||
--ink-2: #46536A;
|
||||
--ink-muted: #6B788C;
|
||||
--raised: #F2F2F5;
|
||||
--line: rgba(24,24,27,.10);
|
||||
--line-strong: rgba(24,24,27,.20);
|
||||
--ink: #18181B;
|
||||
--ink-2: #52525B;
|
||||
--ink-muted: #6B6B76;
|
||||
|
||||
--accent: #2A78D6;
|
||||
--sev-moderate: #B07800;
|
||||
--sev-major: #C0281F;
|
||||
--accent: #5E6AD2;
|
||||
--sev-moderate: #B54708;
|
||||
--sev-major: #D92D20;
|
||||
|
||||
--map-bg: #E8ECF1;
|
||||
--map-block: #DFE4EB;
|
||||
--map-bg: #ECECF0;
|
||||
--map-block: #E1E1E8;
|
||||
--map-road: #FFFFFF;
|
||||
--map-water: #D3E2EE;
|
||||
--map-water: #DADDF2;
|
||||
}
|
||||
|
||||
.dark {
|
||||
--page: #0B0E13;
|
||||
--surface: #141922;
|
||||
--raised: #1B2230;
|
||||
--line: rgba(255,255,255,.09);
|
||||
--line-strong: rgba(255,255,255,.17);
|
||||
--ink: #E8EBF0;
|
||||
--ink-2: #A5B0C2;
|
||||
--ink-muted: #8C98AE; /* was #77839A: 4.2:1 on raised, failed AA at the 10-12px it's used at (#136) */
|
||||
--page: #08090A;
|
||||
--surface: #111214;
|
||||
--raised: #1A1B1F;
|
||||
--line: rgba(255,255,255,.08);
|
||||
--line-strong: rgba(255,255,255,.16);
|
||||
--ink: #EDEDEF;
|
||||
--ink-2: #A9A9B3;
|
||||
--ink-muted: #8B8B96; /* 5.3:1 on raised — holds AA at 10-12px (#136) */
|
||||
|
||||
--accent: #3987E5;
|
||||
--sev-moderate: #C98500;
|
||||
--sev-major: #F05252; /* was #D03B3B: 3.7:1 as text on surface (#136) */
|
||||
--accent: #8B93F0;
|
||||
--sev-moderate: #FDB022;
|
||||
--sev-major: #F97066; /* 6.6:1 as text on surface (#136) */
|
||||
|
||||
--map-bg: #0E131B;
|
||||
--map-block: #161C26;
|
||||
--map-road: #232C3A;
|
||||
--map-water: #12202E;
|
||||
--map-bg: #0D0E11;
|
||||
--map-block: #16171B;
|
||||
--map-road: #26272D;
|
||||
--map-water: #141729;
|
||||
}
|
||||
|
||||
/* ── Base ─────────────────────────────────────────────────────────────────── */
|
||||
@@ -69,7 +71,7 @@ html, body {
|
||||
|
||||
/* Dark mode: raw gray-600/700 text sits ~2.4:1 on the near-black page — below
|
||||
* readable. Lift both to gray-500 (~4:1). */
|
||||
.dark .text-gray-600, .dark .text-gray-700 { color: #6b7280; }
|
||||
.dark .text-gray-600, .dark .text-gray-700 { color: #7A7A85; }
|
||||
|
||||
/* ── Light mode overrides ─────────────────────────────────────────────────── */
|
||||
/*
|
||||
@@ -80,34 +82,34 @@ html, body {
|
||||
|
||||
/* Structural backgrounds */
|
||||
html:not(.dark),
|
||||
html:not(.dark) body { background-color: #f1f5f9; color: #0f172a; }
|
||||
html:not(.dark) .bg-gray-950 { background-color: #f1f5f9 !important; }
|
||||
html:not(.dark) .bg-gray-950\/95 { background-color: rgba(241,245,249,0.95) !important; }
|
||||
html:not(.dark) body { background-color: #f2f2f5; color: #18181b; }
|
||||
html:not(.dark) .bg-gray-950 { background-color: #f2f2f5 !important; }
|
||||
html:not(.dark) .bg-gray-950\/95 { background-color: rgba(242,242,245,0.95) !important; }
|
||||
html:not(.dark) .bg-gray-900 { background-color: #ffffff !important; }
|
||||
html:not(.dark) .bg-gray-900\/60 { background-color: rgba(255,255,255,0.85) !important; }
|
||||
html:not(.dark) .bg-gray-900\/50 { background-color: rgba(255,255,255,0.75) !important; }
|
||||
html:not(.dark) .bg-gray-900\/30 { background-color: rgba(255,255,255,0.50) !important; }
|
||||
html:not(.dark) .bg-gray-800 { background-color: #f1f5f9 !important; }
|
||||
html:not(.dark) .bg-gray-800\/60 { background-color: rgba(226,232,240,0.70) !important; }
|
||||
html:not(.dark) .bg-gray-800\/40 { background-color: rgba(241,245,249,0.60) !important; }
|
||||
html:not(.dark) .bg-gray-800\/30 { background-color: rgba(241,245,249,0.50) !important; }
|
||||
html:not(.dark) .bg-gray-700 { background-color: #e2e8f0 !important; }
|
||||
html:not(.dark) .bg-gray-800 { background-color: #f2f2f5 !important; }
|
||||
html:not(.dark) .bg-gray-800\/60 { background-color: rgba(228,228,231,0.70) !important; }
|
||||
html:not(.dark) .bg-gray-800\/40 { background-color: rgba(242,242,245,0.60) !important; }
|
||||
html:not(.dark) .bg-gray-800\/30 { background-color: rgba(242,242,245,0.50) !important; }
|
||||
html:not(.dark) .bg-gray-700 { background-color: #e4e4e7 !important; }
|
||||
|
||||
/* Borders */
|
||||
html:not(.dark) .border-gray-800 { border-color: #e2e8f0 !important; }
|
||||
html:not(.dark) .border-gray-700 { border-color: #cbd5e1 !important; }
|
||||
html:not(.dark) .border-gray-600 { border-color: #94a3b8 !important; }
|
||||
html:not(.dark) .border-gray-800\/60 { border-color: #e2e8f0 !important; }
|
||||
html:not(.dark) .divide-gray-800 > * + * { border-color: #e2e8f0 !important; }
|
||||
html:not(.dark) .border-gray-800 { border-color: #e4e4e7 !important; }
|
||||
html:not(.dark) .border-gray-700 { border-color: #d4d4d8 !important; }
|
||||
html:not(.dark) .border-gray-600 { border-color: #a1a1aa !important; }
|
||||
html:not(.dark) .border-gray-800\/60 { border-color: #e4e4e7 !important; }
|
||||
html:not(.dark) .divide-gray-800 > * + * { border-color: #e4e4e7 !important; }
|
||||
|
||||
/* Text */
|
||||
html:not(.dark) .text-white { color: #0f172a !important; }
|
||||
html:not(.dark) .text-gray-100 { color: #1e293b !important; }
|
||||
html:not(.dark) .text-gray-200 { color: #1e293b !important; }
|
||||
html:not(.dark) .text-gray-300 { color: #334155 !important; }
|
||||
html:not(.dark) .text-gray-400 { color: #475569 !important; }
|
||||
html:not(.dark) .text-gray-500 { color: #64748b !important; }
|
||||
html:not(.dark) .text-gray-600 { color: #94a3b8 !important; }
|
||||
html:not(.dark) .text-white { color: #18181b !important; }
|
||||
html:not(.dark) .text-gray-100 { color: #27272a !important; }
|
||||
html:not(.dark) .text-gray-200 { color: #27272a !important; }
|
||||
html:not(.dark) .text-gray-300 { color: #3f3f46 !important; }
|
||||
html:not(.dark) .text-gray-400 { color: #52525b !important; }
|
||||
html:not(.dark) .text-gray-500 { color: #6b6b76 !important; }
|
||||
html:not(.dark) .text-gray-600 { color: #a1a1aa !important; }
|
||||
|
||||
/* …except on saturated fills (primary/danger/success buttons), where the fill
|
||||
* stays dark in both themes — remapping to navy made their labels unreadable. */
|
||||
@@ -116,15 +118,15 @@ html:not(.dark) .text-white:is(.bg-accent, .bg-sev-major, .bg-sev-moderate,
|
||||
.bg-green-600, .bg-green-700, .bg-yellow-700, .bg-yellow-800, .bg-gray-600) { color: #ffffff !important; }
|
||||
|
||||
/* Hover states */
|
||||
html:not(.dark) .hover\:bg-gray-900:hover { background-color: #f8fafc !important; }
|
||||
html:not(.dark) .hover\:bg-gray-900:hover { background-color: #fafafa !important; }
|
||||
html:not(.dark) .hover\:bg-gray-900\/50:hover { background-color: rgba(255,255,255,0.75) !important; }
|
||||
html:not(.dark) .hover\:bg-gray-800:hover { background-color: #f1f5f9 !important; }
|
||||
html:not(.dark) .hover\:bg-gray-700:hover { background-color: #e2e8f0 !important; }
|
||||
html:not(.dark) .active\:bg-gray-800:active { background-color: #f1f5f9 !important; }
|
||||
html:not(.dark) .hover\:bg-gray-800:hover { background-color: #f2f2f5 !important; }
|
||||
html:not(.dark) .hover\:bg-gray-700:hover { background-color: #e4e4e7 !important; }
|
||||
html:not(.dark) .active\:bg-gray-800:active { background-color: #f2f2f5 !important; }
|
||||
|
||||
/* Hover text */
|
||||
html:not(.dark) .hover\:text-gray-300:hover { color: #334155 !important; }
|
||||
html:not(.dark) .hover\:text-gray-200:hover { color: #1e293b !important; }
|
||||
html:not(.dark) .hover\:text-gray-300:hover { color: #3f3f46 !important; }
|
||||
html:not(.dark) .hover\:text-gray-200:hover { color: #27272a !important; }
|
||||
|
||||
/* ── Accent badge palette (dark → light) ─────────────────────────────────── */
|
||||
|
||||
@@ -162,11 +164,11 @@ html:not(.dark) .text-green-400 { color: #16a34a !important; }
|
||||
html:not(.dark) .border-green-800 { border-color: #86efac !important; }
|
||||
|
||||
/* Unconfigured / Info */
|
||||
html:not(.dark) .bg-indigo-950 { background-color: #eef2ff !important; }
|
||||
html:not(.dark) .bg-indigo-900 { background-color: #eef2ff !important; }
|
||||
html:not(.dark) .text-indigo-300 { color: #4338ca !important; }
|
||||
html:not(.dark) .text-indigo-400 { color: #6366f1 !important; }
|
||||
html:not(.dark) .border-indigo-800 { border-color: #a5b4fc !important; }
|
||||
html:not(.dark) .bg-indigo-950 { background-color: #f0f1fd !important; }
|
||||
html:not(.dark) .bg-indigo-900 { background-color: #f0f1fd !important; }
|
||||
html:not(.dark) .text-indigo-300 { color: #4e58b8 !important; }
|
||||
html:not(.dark) .text-indigo-400 { color: #5e6ad2 !important; }
|
||||
html:not(.dark) .border-indigo-800 { border-color: #c8ccf6 !important; }
|
||||
|
||||
/* ── Pulsing ring for recording nodes ────────────────────────────────────── */
|
||||
@keyframes pulse-ring {
|
||||
@@ -203,7 +205,7 @@ html:not(.dark) .border-indigo-800 { border-color: #a5b4fc !important; }
|
||||
* gray-900), so the theme's muted ink — light grey in dark mode, ~2.9:1 on
|
||||
* white — is pinned to a grey that holds AA on white (~6:1). */
|
||||
.leaflet-popup-content .text-ink-muted {
|
||||
color: #5B6577;
|
||||
color: #5F5F69;
|
||||
}
|
||||
|
||||
/* Pinned 511 camera tiles (MapView DotCameraLayer): strip Leaflet's tooltip
|
||||
@@ -224,17 +226,17 @@ html:not(.dark) .border-indigo-800 { border-color: #a5b4fc !important; }
|
||||
* "Ossining / Westchester" next to "no area set"). Dimmer + italic in dark. */
|
||||
.dark input::placeholder,
|
||||
.dark textarea::placeholder {
|
||||
color: #5F6B80;
|
||||
color: #6E6E78;
|
||||
font-style: italic;
|
||||
}
|
||||
html:not(.dark) input:not([type="submit"]):not([type="button"]):not([type="reset"]),
|
||||
html:not(.dark) select,
|
||||
html:not(.dark) textarea {
|
||||
color: #0f172a;
|
||||
color: #18181b;
|
||||
}
|
||||
html:not(.dark) input::placeholder,
|
||||
html:not(.dark) textarea::placeholder {
|
||||
color: #94a3b8;
|
||||
color: #a1a1aa;
|
||||
}
|
||||
|
||||
/* ── Marketing/product surface additions (2026-08 overhaul) ─────────────────
|
||||
@@ -245,8 +247,8 @@ html:not(.dark) textarea::placeholder {
|
||||
*/
|
||||
|
||||
/* Tinted accent surfaces (plan highlight cards, "included" checks, danger zones) */
|
||||
html:not(.dark) .bg-indigo-600\/10 { background-color: rgba(79,70,229,0.08) !important; }
|
||||
html:not(.dark) .border-indigo-600\/40 { border-color: rgba(79,70,229,0.35) !important; }
|
||||
html:not(.dark) .bg-indigo-600\/10 { background-color: rgba(94,106,210,0.08) !important; }
|
||||
html:not(.dark) .border-indigo-600\/40 { border-color: rgba(94,106,210,0.35) !important; }
|
||||
html:not(.dark) .bg-green-600\/10 { background-color: rgba(22,163,74,0.08) !important; }
|
||||
html:not(.dark) .bg-red-600\/10 { background-color: rgba(220,38,38,0.08) !important; }
|
||||
html:not(.dark) .border-red-600\/40 { border-color: rgba(220,38,38,0.35) !important; }
|
||||
@@ -255,10 +257,10 @@ html:not(.dark) .border-yellow-600\/40 { border-color: rgba(202,138,4,0.35) !imp
|
||||
|
||||
/* Marketing hero background — subtle radial glow, brand-neutral in both themes */
|
||||
.marketing-hero-bg {
|
||||
background-image: radial-gradient(ellipse 80% 50% at 50% -10%, rgba(99,102,241,0.25), transparent 60%);
|
||||
background-image: radial-gradient(ellipse 80% 50% at 50% -10%, rgba(94,106,210,0.25), transparent 60%);
|
||||
}
|
||||
html:not(.dark) .marketing-hero-bg {
|
||||
background-image: radial-gradient(ellipse 80% 50% at 50% -10%, rgba(99,102,241,0.12), transparent 60%);
|
||||
background-image: radial-gradient(ellipse 80% 50% at 50% -10%, rgba(94,106,210,0.12), transparent 60%);
|
||||
}
|
||||
|
||||
/* Skeleton loading shimmer */
|
||||
|
||||
Reference in New Issue
Block a user