From ce11b60ca0ca6d4288a51ffce915ce95261ed63a Mon Sep 17 00:00:00 2001 From: Patrick Mulligan Date: Fri, 31 Jul 2026 21:47:14 +0200 Subject: [PATCH 1/2] feat(deck): light/dark mode via semantic tokens + toggle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor the deck off the bespoke ink/sand palette and literal white/x overlays onto flipping semantic tokens (fg, fg-muted, surface[-2..4], line[-2..3], and mode-aware accent text) defined once under the shadcn :root/.dark blocks in style.css. A single `.dark` class on the deck root now flips the entire theme. Add a Sun/Moon toggle in the top bar — dark by default, persisted to localStorage. Accent TEXT darkens in light mode for contrast; solid accent fills (bars/dots/badges) stay saturated for both. The lightbox stays an always-dark overlay with fixed light chrome. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/deck/Deck.vue | 39 ++++++++--- src/deck/components/EntityDetail.vue | 16 ++--- src/deck/components/Lightbox.vue | 10 +-- src/deck/components/MyceliumNetwork.vue | 12 ++-- src/deck/components/PlaceholderBadge.vue | 2 +- src/deck/components/SlideFrame.vue | 6 +- src/deck/slides/AskSlide.vue | 26 ++++---- src/deck/slides/EcosystemSlide.vue | 12 ++-- src/deck/slides/EntitiesSlide.vue | 18 ++--- src/deck/slides/GallerySlide.vue | 18 ++--- src/deck/slides/MembershipSlide.vue | 22 +++---- src/deck/slides/PartnershipSlide.vue | 18 ++--- src/deck/slides/PnlSlide.vue | 54 +++++++-------- src/deck/slides/RoadmapSlide.vue | 12 ++-- src/deck/slides/SpacesSlide.vue | 10 +-- src/deck/slides/TechSlide.vue | 8 +-- src/deck/slides/TenantsSlide.vue | 12 ++-- src/deck/slides/TitleSlide.vue | 20 +++--- src/deck/slides/VisionSlide.vue | 10 +-- src/style.css | 83 +++++++++++++++++++----- 20 files changed, 239 insertions(+), 169 deletions(-) diff --git a/src/deck/Deck.vue b/src/deck/Deck.vue index bd36b45..cdb5270 100644 --- a/src/deck/Deck.vue +++ b/src/deck/Deck.vue @@ -1,9 +1,17 @@ @@ -226,8 +226,8 @@ const festivalCaps = [ - + @@ -306,12 +306,12 @@ const festivalCaps = [ .myc-label-tag { font-size: 10px; letter-spacing: 0.22em; - fill: var(--color-sand-dim); + fill: var(--color-fg-muted); } .myc-zone { font-size: 11px; letter-spacing: 0.24em; - fill: var(--color-sand-dim); + fill: var(--color-fg-muted); opacity: 0.7; } diff --git a/src/style.css b/src/style.css index 2c40e40..5607b96 100644 --- a/src/style.css +++ b/src/style.css @@ -42,6 +42,15 @@ --deck-rose: hsl(346 72% 48%); --deck-clay: hsl(14 70% 44%); --deck-amber: hsl(30 90% 38%); + + /* mycelium diagram · LIGHT — darker/saturated so it doesn't wash out */ + --myc-glow: hsl(162 55% 42%); + --myc-thread: hsl(162 58% 32%); + --myc-node: hsl(162 62% 30%); + --myc-sky-top: hsl(160 35% 74%); + --myc-sky-bot: hsl(160 38% 66%); + --myc-soil-top: hsl(32 48% 56%); + --myc-soil-bot: hsl(32 42% 64%); } .dark { @@ -81,6 +90,15 @@ --deck-rose: hsl(342 95% 76%); --deck-clay: hsl(14 72% 62%); --deck-amber: hsl(38 96% 70%); + + /* mycelium diagram · DARK — the original light-on-dark palette */ + --myc-glow: hsl(160 60% 40%); + --myc-thread: hsl(159 45% 50%); + --myc-node: hsl(158 42% 62%); + --myc-sky-top: hsl(160 40% 10%); + --myc-sky-bot: hsl(160 45% 12%); + --myc-soil-top: hsl(28 40% 10%); + --myc-soil-bot: hsl(28 45% 6%); } @theme inline {