Strengthen visible theme mode styling

This commit is contained in:
2026-03-21 13:34:24 +01:00
parent 4934c39f9f
commit 52585dd3e7
2 changed files with 71 additions and 21 deletions

View File

@@ -47,6 +47,7 @@ It is intentionally implementation-focused:
| 2026-03-21 | P1.7 | Completed | Added a shell-level skip link and tightened the top-level header, navigation, and main landmarks around the new shell structure. | | 2026-03-21 | P1.7 | Completed | Added a shell-level skip link and tightened the top-level header, navigation, and main landmarks around the new shell structure. |
| 2026-03-21 | P1.8 | Completed | Introduced a cooler tooling emphasis for `Tools`, diagnostics, and API surfaces, and styled the `Tools` destination as distinct without splitting the shell. | | 2026-03-21 | P1.8 | Completed | Introduced a cooler tooling emphasis for `Tools`, diagnostics, and API surfaces, and styled the `Tools` destination as distinct without splitting the shell. |
| 2026-03-21 | Post-P1 fix 1 | Completed | Closed the 768px-1023px navigation gap by adding a shell hamburger menu and drawer so primary navigation never disappears at tablet widths. | | 2026-03-21 | Post-P1 fix 1 | Completed | Closed the 768px-1023px navigation gap by adding a shell hamburger menu and drawer so primary navigation never disappears at tablet widths. |
| 2026-03-21 | Post-P1 fix 2 | Completed | Replaced the most visible light-only surface and control colors with theme-aware tokens so switching between `Light`, `Dark`, and `System` produces a clear visual change. |
### Lessons Learned ### Lessons Learned
@@ -63,6 +64,7 @@ It is intentionally implementation-focused:
- Accessibility work is cheaper when the shell owns the landmarks. Adding skip links and nav/main structure at the shell layer avoids repeating that work page by page. - Accessibility work is cheaper when the shell owns the landmarks. Adding skip links and nav/main structure at the shell layer avoids repeating that work page by page.
- Tooling can feel distinct through cooler surfaces and labeling alone. A separate app shell is unnecessary and would undermine the shared-product goal. - Tooling can feel distinct through cooler surfaces and labeling alone. A separate app shell is unnecessary and would undermine the shared-product goal.
- Responsive shell design needs an explicit tablet state, not just desktop and phone states. The original breakpoints left a navigation dead zone between the top nav and bottom nav layouts. - Responsive shell design needs an explicit tablet state, not just desktop and phone states. The original breakpoints left a navigation dead zone between the top nav and bottom nav layouts.
- Theme infrastructure is not enough on its own. Any surface that keeps hardcoded light values will make the theme switch feel broken even when the selector logic is correct.
## Target Outcomes ## Target Outcomes

View File

@@ -35,6 +35,22 @@
--info-1: #e5eef4; --info-1: #e5eef4;
--info-2: #9fb8c8; --info-2: #9fb8c8;
--info-3: #4f7086; --info-3: #4f7086;
--bg-radial-glow: rgba(240, 223, 185, 0.55);
--bg-canvas-end: #e2d3b7;
--surface-card: rgba(255, 255, 255, 0.72);
--surface-card-strong: rgba(255, 255, 255, 0.85);
--surface-inline: rgba(255, 250, 240, 0.72);
--surface-input: rgba(255, 252, 247, 0.92);
--surface-input-hover: rgba(255, 248, 236, 0.98);
--surface-subtle-accent: rgba(255, 250, 242, 0.84);
--surface-chip: rgba(238, 223, 193, 0.65);
--surface-callout: rgba(255, 247, 230, 0.76);
--field-label-color: #75562f;
--link-hover: #6e4320;
--button-secondary-bg: rgba(255, 248, 236, 0.9);
--button-secondary-bg-hover: rgba(250, 236, 210, 0.95);
--button-secondary-text: #6a4b28;
--button-secondary-border: rgba(127, 96, 55, 0.18);
--font-display: "Fraunces", Georgia, serif; --font-display: "Fraunces", Georgia, serif;
--font-body: "IBM Plex Sans", "Segoe UI", sans-serif; --font-body: "IBM Plex Sans", "Segoe UI", sans-serif;
--font-ui: "IBM Plex Sans", "Segoe UI", sans-serif; --font-ui: "IBM Plex Sans", "Segoe UI", sans-serif;
@@ -95,6 +111,22 @@
--info-1: #18252f; --info-1: #18252f;
--info-2: #45677d; --info-2: #45677d;
--info-3: #9ec0d5; --info-3: #9ec0d5;
--bg-radial-glow: rgba(237, 181, 109, 0.12);
--bg-canvas-end: #090807;
--surface-card: rgba(32, 28, 25, 0.9);
--surface-card-strong: rgba(24, 21, 19, 0.94);
--surface-inline: rgba(40, 34, 30, 0.9);
--surface-input: rgba(29, 25, 22, 0.94);
--surface-input-hover: rgba(39, 33, 29, 0.98);
--surface-subtle-accent: rgba(48, 39, 32, 0.84);
--surface-chip: rgba(78, 62, 46, 0.76);
--surface-callout: rgba(56, 42, 28, 0.8);
--field-label-color: #d2b28b;
--link-hover: #f5c487;
--button-secondary-bg: rgba(40, 34, 30, 0.94);
--button-secondary-bg-hover: rgba(52, 44, 38, 0.98);
--button-secondary-text: #f0ddc8;
--button-secondary-border: rgba(209, 188, 163, 0.2);
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
@@ -137,14 +169,30 @@
--info-1: #18252f; --info-1: #18252f;
--info-2: #45677d; --info-2: #45677d;
--info-3: #9ec0d5; --info-3: #9ec0d5;
--bg-radial-glow: rgba(237, 181, 109, 0.12);
--bg-canvas-end: #090807;
--surface-card: rgba(32, 28, 25, 0.9);
--surface-card-strong: rgba(24, 21, 19, 0.94);
--surface-inline: rgba(40, 34, 30, 0.9);
--surface-input: rgba(29, 25, 22, 0.94);
--surface-input-hover: rgba(39, 33, 29, 0.98);
--surface-subtle-accent: rgba(48, 39, 32, 0.84);
--surface-chip: rgba(78, 62, 46, 0.76);
--surface-callout: rgba(56, 42, 28, 0.8);
--field-label-color: #d2b28b;
--link-hover: #f5c487;
--button-secondary-bg: rgba(40, 34, 30, 0.94);
--button-secondary-bg-hover: rgba(52, 44, 38, 0.98);
--button-secondary-text: #f0ddc8;
--button-secondary-border: rgba(209, 188, 163, 0.2);
} }
} }
html, body { html, body {
min-height: 100%; min-height: 100%;
background: background:
radial-gradient(circle at top, rgba(240, 223, 185, 0.55), transparent 28%), radial-gradient(circle at top, var(--bg-radial-glow), transparent 28%),
linear-gradient(180deg, var(--bg-canvas-strong) 0%, var(--bg-canvas) 38%, #e2d3b7 100%); linear-gradient(180deg, var(--bg-canvas-strong) 0%, var(--bg-canvas) 38%, var(--bg-canvas-end) 100%);
color: var(--text-primary); color: var(--text-primary);
font-family: var(--font-body); font-family: var(--font-body);
font-weight: 400; font-weight: 400;
@@ -203,7 +251,7 @@ a, .btn-link {
} }
a:hover { a:hover {
color: #6e4320; color: var(--link-hover);
} }
button, button,
@@ -288,16 +336,16 @@ pre,
font-size: 0.85rem; font-size: 0.85rem;
letter-spacing: 0.08em; letter-spacing: 0.08em;
text-transform: uppercase; text-transform: uppercase;
color: #75562f; color: var(--field-label-color);
} }
.input-shell { .input-shell {
width: 100%; width: 100%;
border-radius: 14px; border-radius: 14px;
border: 1px solid rgba(127, 96, 55, 0.2); border: 1px solid var(--button-secondary-border);
background: rgba(255, 252, 247, 0.92); background: var(--surface-input);
padding: 0.8rem 0.9rem; padding: 0.8rem 0.9rem;
color: var(--ink); color: var(--text-primary);
box-sizing: border-box; box-sizing: border-box;
} }
@@ -331,14 +379,14 @@ pre,
flex: 0 0 auto; flex: 0 0 auto;
min-width: 4.5rem; min-width: 4.5rem;
border-radius: 14px; border-radius: 14px;
border: 1px solid rgba(127, 96, 55, 0.18); border: 1px solid var(--button-secondary-border);
background: rgba(255, 248, 236, 0.9); background: var(--button-secondary-bg);
color: #6a4b28; color: var(--button-secondary-text);
padding: 0.8rem 0.95rem; padding: 0.8rem 0.95rem;
} }
.roll-button:hover { .roll-button:hover {
background: rgba(250, 236, 210, 0.95); background: var(--button-secondary-bg-hover);
} }
.lookup-roll-note { .lookup-roll-note {
@@ -361,8 +409,8 @@ pre,
border-radius: 999px; border-radius: 999px;
border: 1px solid rgba(143, 90, 47, 0.18); border: 1px solid rgba(143, 90, 47, 0.18);
padding: 0.4rem 0.7rem; padding: 0.4rem 0.7rem;
background: rgba(255, 250, 242, 0.84); background: var(--surface-subtle-accent);
color: #5d4429; color: var(--text-primary);
font-size: 0.82rem; font-size: 0.82rem;
} }
@@ -375,7 +423,7 @@ pre,
.result-card { .result-card {
border-radius: 20px; border-radius: 20px;
padding: 1rem; padding: 1rem;
background: rgba(255, 255, 255, 0.72); background: var(--surface-card);
border: 1px solid rgba(127, 96, 55, 0.14); border: 1px solid rgba(127, 96, 55, 0.14);
} }
@@ -397,12 +445,12 @@ pre,
gap: 0.15rem; gap: 0.15rem;
padding: 0.65rem 0.75rem; padding: 0.65rem 0.75rem;
border-radius: 14px; border-radius: 14px;
background: rgba(255, 250, 240, 0.72); background: var(--surface-inline);
border: 1px solid rgba(127, 96, 55, 0.12); border: 1px solid rgba(127, 96, 55, 0.12);
} }
.detail-label { .detail-label {
color: #75562f; color: var(--field-label-color);
font-size: 0.76rem; font-size: 0.76rem;
letter-spacing: 0.08em; letter-spacing: 0.08em;
text-transform: uppercase; text-transform: uppercase;
@@ -418,8 +466,8 @@ pre,
.stat-pill { .stat-pill {
border-radius: 999px; border-radius: 999px;
padding: 0.35rem 0.65rem; padding: 0.35rem 0.65rem;
background: rgba(238, 223, 193, 0.65); background: var(--surface-chip);
color: #5b4327; color: var(--text-primary);
font-size: 0.85rem; font-size: 0.85rem;
} }
@@ -427,9 +475,9 @@ pre,
margin-top: 0.9rem; margin-top: 0.9rem;
padding: 0.85rem 0.95rem; padding: 0.85rem 0.95rem;
border-radius: 16px; border-radius: 16px;
background: rgba(255, 247, 230, 0.76); background: var(--surface-callout);
border: 1px solid rgba(184, 121, 59, 0.18); border: 1px solid rgba(184, 121, 59, 0.18);
color: #5b4327; color: var(--text-primary);
} }
.branch-list { .branch-list {
@@ -862,7 +910,7 @@ pre,
.table-shell { .table-shell {
border-radius: 20px; border-radius: 20px;
padding: 1.2rem; padding: 1.2rem;
background: rgba(255, 255, 255, 0.85); background: var(--surface-card-strong);
border: 1px solid rgba(127, 96, 55, 0.2); border: 1px solid rgba(127, 96, 55, 0.2);
box-shadow: 0 18px 30px rgba(41, 22, 11, 0.08); box-shadow: 0 18px 30px rgba(41, 22, 11, 0.08);
} }