[object Object]

← back to Norma

defensive: explicit body[data-inbox-theme='classic-dense'] selector

44cdbed57a883e749ab71e3a129e164526ec6351 · 2026-05-21 20:08:00 -0700 · Steve Abrams

Previously the classic-dense theme relied on the :root base via *absence*
of an override — switching FROM another theme BACK to classic-dense
worked because CSS cascade restores :root values when overrides aren't
matched, but it's fragile: if a future theme sets a var that no other
theme touches, switching back to classic-dense would leak that var.

Now classic-dense is a positive reset (32 explicit selectors + the :root
base = 33 layers of belt-and-suspenders). All token values mirror the
:root defaults exactly.

Files touched

Diff

commit 44cdbed57a883e749ab71e3a129e164526ec6351
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu May 21 20:08:00 2026 -0700

    defensive: explicit body[data-inbox-theme='classic-dense'] selector
    
    Previously the classic-dense theme relied on the :root base via *absence*
    of an override — switching FROM another theme BACK to classic-dense
    worked because CSS cascade restores :root values when overrides aren't
    matched, but it's fragile: if a future theme sets a var that no other
    theme touches, switching back to classic-dense would leak that var.
    
    Now classic-dense is a positive reset (32 explicit selectors + the :root
    base = 33 layers of belt-and-suspenders). All token values mirror the
    :root defaults exactly.
---
 app/globals.css | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/app/globals.css b/app/globals.css
index 8b76c50..b6be5c9 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1541,3 +1541,21 @@ body[data-inbox-theme="botanical"] {
   --color-border: #8a9a78; --color-primary: #2a5028; --color-primary-hover: #1a3a18;
   font-family: "Cormorant Garamond", "EB Garamond", Georgia, serif;
 }
+
+/* v1 Classic Dense — defensive explicit selector. Restores :root tokens in case
+   a previously-applied theme set any vars not overridden by a sibling theme.
+   Without this, switching FROM (say) ottoman-tile BACK TO classic-dense relies
+   on CSS cascade alone — works in practice but fragile if any base var is ever
+   left unset by another theme. With this, classic-dense is a positive reset. */
+body[data-inbox-theme="classic-dense"] {
+  --color-bg:             #f5f5f7;
+  --color-surface:        #ffffff;
+  --color-surface-el:     #f0f0f2;
+  --color-text:           #1a1a2e;
+  --color-text-secondary: #4a4a5e;
+  --color-text-muted:     #585e6b;
+  --color-border:         #e2e4e9;
+  --color-primary:        #0a7c59;
+  --color-primary-hover:  #065f46;
+  font-family: -apple-system, BlinkMacSystemFont, "Inter", "Plus Jakarta Sans", system-ui, sans-serif;
+}

← 76b8e92 feat(theme): hoist InboxThemeBanner + AgeThemeSlider into ap  ·  back to Norma  ·  norma-scraper: load .env.local via interpreter_args so SESSI 0713748 →