/* ════════════════════════════════════════════════════════════════════
   ORIZON1 · DESIGN TOKENS & THEME SYSTEM
   ════════════════════════════════════════════════════════════════════
   All colors, surfaces, and semantic tokens live here.
   To change a color globally, edit the value in :root (dark mode) and
   the matching override in [data-theme="light"] below.

   STRUCTURE
   ─────────────────────────────────────────────────────────────────────
   1. :root              — Dark mode tokens (default)
   2. [data-theme="light"] — Light mode token overrides
   3. [data-theme="light"] component overrides — surface/border
      corrections for components that use hardcoded colors
   ════════════════════════════════════════════════════════════════════ */

/* ════════════════════════════════════════════════════════════════════
   CANONICAL TOKEN REFERENCE (55 tokens)
   ════════════════════════════════════════════════════════════════════
   Use `var(--token)` when building new components. Avoid hardcoding
   colors, sizes, timings, or shadows — pick from this set so theme
   swaps and global tweaks work correctly.

   ┌─── COLOR — SURFACES ──────────────────────────────────────────────┐
   │ --navy          #0a0d10      Page background — warm charcoal       │
   │ --navy2         #10151b      Modal / panel background              │
   │ --navy3         #161c24      Card / sidebar item / elevated        │
   │ --navy4         #131820      Input background / nested surface     │
   │ --slate         #1c2530      Dividers / subtle borders             │
   │ --surface       navy2        Semantic alias for primary surface    │
   │ --surface2      navy3        Semantic alias for raised surface     │
   │ --header-bg     rgba frosted Sticky header background              │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── COLOR — BRAND ─────────────────────────────────────────────────┐
   │ --amber         #f0a126      Primary accent — logo "ORIZON",       │
   │                              active states, section headers        │
   │ --amber2        #fbc465      Lighter amber for hover/emphasis      │
   │ --amber-dim     #4a2e06      Deep amber for dark-on-amber fills    │
   │ --amber-rgb     240,161,38   Triplet for rgba() — glow/shadow fx   │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── COLOR — SEMANTIC ──────────────────────────────────────────────┐
   │ --cyan          #32ade6      Info, secondary accent, logo "1"      │
   │ --green         #3dd68c      Pass / success (CRT-phosphor)         │
   │ --red           #e54f4f      Fail / danger (Soyuz desat)           │
   │ --purple        #bf5af2      Commissioning-stage indicator         │
   │ --indigo        #5e5ce6      Integration / secondary purple        │
   │ --cyan-rgb      50,173,230   Triplet for rgba()                    │
   │ --green-rgb     61,214,140   Triplet for rgba()                    │
   │ --red-rgb       229,79,79    Triplet for rgba() — danger glows     │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── COLOR — TEXT ──────────────────────────────────────────────────┐
   │ --text          #f1ede4      Primary text — warm cream phosphor    │
   │ --text2         #b8b3a8      Secondary text — captions, meta       │
   │ --text3         #7a756a      Tertiary text — placeholders, muted   │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── COLOR — BORDERS & INPUTS ──────────────────────────────────────┐
   │ --border        rgba white 7%   Subtle dividers, card outlines     │
   │ --border2       rgba amber 16%  Console-bezel — inputs, chips      │
   │ --input-bg      rgba white 4%   Input field background tint        │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── COLOR — CATEGORY (compliance engine, 8 categories) ────────────┐
   │ --c-params      #32ade6      Parameters / setpoints                │
   │ --c-occ         #f5a623      Occupancy sensing                     │
   │ --c-ts          #bf5af2      Time schedule                         │
   │ --c-day         #30d158      Daylight harvesting                   │
   │ --c-man         #ff453a      Manual control                        │
   │ --c-add         #ffd60a      Addressable / advanced                │
   │ --c-int         #5e5ce6      Integration (BMS, ADR, fire)          │
   │ --c-notes       #8e8e93      Notes / supplemental                  │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── COLOR — GLASS EFFECTS ─────────────────────────────────────────┐
   │ --glass         rgba white 4%   Subtle frosted surface overlay     │
   │ --glass2        rgba white 7%   Stronger frosted overlay           │
   │ --glass-border  rgba white 10%  Glass-edge outline color           │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── SHAPE — BORDER RADIUS ─────────────────────────────────────────┐
   │ --r             4px          Default — cards, buttons, panels      │
   │ --r-sm          2px          Small — inputs, chips, badges         │
   │ --r-lg          8px          Large — modals, hero cards            │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── TYPOGRAPHY ────────────────────────────────────────────────────┐
   │ --sans          Electrolize… Primary UI font stack                 │
   │ --mono          Electrolize… Monospace stack (labels, data, meta)  │
   │ --base-size     13px         Root font-size                        │
   │ --ls-ui         0.06em       Letter-spacing for UI labels (console)│
   │ --fs            1            User-adjustable font-scale multiplier │
   │                              (set via Settings → Text Size)        │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── ELEVATION — SHADOWS ───────────────────────────────────────────┐
   │ --shadow-sm     2-layer soft  Subtle lift — hovered cards, chips   │
   │ --shadow-md     2-layer med   Card elevation — panels, dropdowns   │
   │ --shadow-lg     2-layer lg    Modal / overlay elevation            │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── ANIMATION — TIMING ────────────────────────────────────────────┐
   │ --dur-fast      120ms        Hover tints, small UI shifts          │
   │ --dur-base      150ms        Default button/input state changes    │
   │ --dur-slow      280ms        Modal fades, large transitions        │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── ANIMATION — EASINGS ───────────────────────────────────────────┐
   │ --ease-out      cubic(.4,0,.2,1)      Standard material ease       │
   │ --ease-bounce   cubic(.34,1.56,.64,1) Playful overshoot            │
   └────────────────────────────────────────────────────────────────────┘

   ┌─── BRAND ORNAMENT ────────────────────────────────────────────────┐
   │ --wm-orizon     #f0a126      Wordmark "ORIZON" stroke (amber)      │
   │ --wm-one        #24a8e6      Wordmark "1" stroke (cyan)            │
   └────────────────────────────────────────────────────────────────────┘

   LIGHT THEME NOTE
   ─────────────────────────────────────────────────────────────────────
   [data-theme="light"] overrides the color tokens above. Shape,
   typography, elevation, and animation tokens are theme-neutral —
   they do NOT get overridden.

   RGB TRIPLET CONVENTION
   ─────────────────────────────────────────────────────────────────────
   Use --amber-rgb (etc.) when you need alpha transparency:
     background: rgba(var(--amber-rgb), 0.15);     ✓ correct
     background: rgba(var(--amber),     0.15);     ✗ invalid CSS
   ════════════════════════════════════════════════════════════════════ */

/* ════════════════════════════════════════════════════════════════════
   CANONICAL BREAKPOINTS (Session 5 consolidation, April 2026)
   ════════════════════════════════════════════════════════════════════
   When writing new responsive rules, PICK FROM THIS SET.

   ┌─────────────────────────────────────────────────────────────────┐
   │ Size → Intent                     │ Media query                 │
   ├─────────────────────────────────────────────────────────────────┤
   │ ≤480px   phone                    │ (max-width: 480px)          │
   │ ≤768px   phone + tablet portrait  │ (max-width: 768px)          │
   │ ≤1024px  phone + tablet           │ (max-width: 1024px)         │
   │ ≥769px   tablet landscape + up    │ (min-width: 769px)          │
   │ ≥1025px  desktop                  │ (min-width: 1025px)         │
   │ ≥1440px  wide desktop             │ (min-width: 1440px)         │
   │ ≥1920px  ultrawide                │ (min-width: 1920px)         │
   ├─────────────────────────────────────────────────────────────────┤
   │ Compound ranges (tablet-only rules)                             │
   │ (min-width: 481px) and (max-width: 768px)  → tablet portrait    │
   │ (min-width: 769px) and (max-width: 1024px) → tablet landscape   │
   │ (min-width: 481px) and (max-width: 1024px) → tablets overall    │
   ├─────────────────────────────────────────────────────────────────┤
   │ Legitimate edge cases (use sparingly, only when truly needed)   │
   │ (max-width: 375px) — iPhone SE / tiny phone                     │
   │ (max-width: 600px) — wizard-modal-specific mobile overrides     │
   ├─────────────────────────────────────────────────────────────────┤
   │ Feature queries (not breakpoints — don't consolidate)           │
   │ (hover: none) and (pointer: coarse) — touch devices             │
   │ (prefers-reduced-motion: reduce)    — motion accessibility      │
   │ (orientation: landscape)            — tablet landscape physical │
   │ print                               — print context             │
   └─────────────────────────────────────────────────────────────────┘

   PANE WIDTH OPT-IN
   ─────────────────────────────────────────────────────────────────────
   .pane-content has a 1100px cap at ≥1025px for prose readability.
   Add class "pane-wide" to an .out-pane to opt into wider layout
   (min(1600px, 100%) at ≥1025px, 1800px at ≥1920px). Prose panes
   (CIN, SOO, Spec, O&M) MUST stay uncapped-opted-out.

   RATIONALE: Before consolidation there were 21 distinct @media
   expressions across 111 blocks. Many were near-duplicates (700/768,
   900/1024, 1100/1024, 1200/1025) and compound ranges used 601 as a
   boundary inconsistently with the 481/769 canonical splits. This
   set maps cleanly to device classes and avoids the 1px gap problem
   (max: 1024 complements min: 1025).
   ════════════════════════════════════════════════════════════════════ */

/* ── 1. DARK MODE TOKENS (default) ────────────────────────────────── */
:root {

  /* ════════════════════════════════════════════════════════════════
     CANONICAL COLOR TOKENS (post-rename, post-consolidation)
     ════════════════════════════════════════════════════════════════
     These are the 10 colors that drive the entire app surface. The
     legacy tokens below (--navy, --amber, --text, surface-*, etc.)
     are being deprecated. Phase 1 (current): new tokens are aliases
     of old via var(), so per-theme overrides of the old tokens
     cascade through to the new ones — visual identical to before.
     Phase 2 will migrate every consumer to the new names and delete
     the old declarations.

     Naming rationale:
       --background-color   page background (lowest layer)
       --midground-color    panels, modals, soft surfaces (mid layer)
       --foreground-color   cards, sidebar items, elevated surfaces
       --button-color       primary action color (was --amber)
       --button-click-color brighter action (was --amber2 / hover)
       --button-dim-color   muted action (was --amber-dim)
       --button-rgb-color   "r,g,b" triplet for rgba() composition
       --text-light-color   primary text on dark bg
       --text-mid-color     secondary / supporting / meta text
       --text-dark-color    muted / placeholder / disabled / labels

     Combined consolidations (multiple old → one new):
       foreground = navy3 + navy4 + slate + surface + surface2
       midground  = navy2 + surface-soft-light
       text-mid   = text2 + page-bg-dark + surface-darker
                  + surface-neutral-light + card-bg-light
                  + text-secondary-dark + text-meta-light
       text-dark  = text3 + text-disabled-dark + text-muted-dark

     Phase 2 (shipped): canonical tokens carry the hex values; the
     legacy --navy / --amber / --text / etc. names below are kept
     as REVERSE aliases pointing back at the canonical tokens. They
     exist for the PDF subsystem (_pdf.css and pdf/templates/*) which
     was scoped out of the rename. App-surface CSS uses canonical
     names everywhere. Per-theme overrides redeclare canonical
     tokens directly; legacy tokens cascade via the alias chain.   */
  --background-color:    #1a252e;
  --midground-color:     #242f38;
  --foreground-color:    #364049;
  --button-color:        #f0a126;
  --button-click-color:  #fbc465;
  --button-dim-color:    #4a2e06;
  --button-rgb-color:    240,161,38;
  --text-light-color:    #faf8f5;
  --text-mid-color:      #e8e5de;
  --text-dark-color:     #ded9ce;

  /* ── Tint base tokens (post-rename Phase 3) ─────────────────────
     Separated from --text-light-color and --cyan so that edits to
     the text/accent color don't simultaneously change every
     translucent wash, scrim, and zebra-stripe in the app. Each
     defaults to the same value as its source so the visual is
     identical at install — but editing the tint base alone now
     adjusts only the rgba(from ...) overlay surfaces.

     Convention: a `*-tint-color` token is consumed only inside
     `rgb(from var(--*-tint-color) r g b / α)` expressions. Direct
     fills should still use the source token.                       */
  --text-light-tint-color: #c2c2c2;   /* decoupled from --text-light-color (Matt 2026-05-10) */
  --cyan-tint-color:       #32ade6;   /* defaults to --cyan */

  /* ── Page / App surfaces ─────────────────────────────────────────
     Reverse aliases for PDF subsystem (scoped out of rename).        */
  --navy:       var(--background-color);
  --navy2:      var(--midground-color);
  --navy3:      var(--foreground-color);
  --navy4:      var(--foreground-color);   /* consolidated */
  --slate:      var(--foreground-color);   /* consolidated */
  /* ── Sidebar zone-header card ───────────────────────────────────
     The sidebar's collapsible zone cards (Space 1 etc) use a
     bright surface that contrasts against the dark navy chrome.
     Default white preserves the historical look; per-firm or per-
     theme overrides can soften this (e.g., #faf8f5 to match the
     warm cream of --text-light-color).                              */
  --zone-card:  white;

  /* ── Sidebar collapsable section background ─────────────────────
     Used by the Rooms / Tools / Templates collapsable areas inside
     the sidebar. Aliased to --navy3 so every theme that overrides
     --navy3 (which is all of them) also gets the matching section
     background for free — no per-theme duplication. To customize a
     specific theme's sidebar section independently from --navy3,
     redeclare --sidebar-section inside that theme's block.          */
  --sidebar-section: var(--navy3);

  /* ── Content card background ────────────────────────────────────
     For "white-style" content cards inside panes — the Circuit
     Calculator on the Voltage Drop tab is the canonical user.
     Defaults to --navy3 in dark mode (matching the existing card
     surface tone). Light themes override to actual white so cards
     visually contrast as a paper-on-page. Other consumers can
     reference this token to opt into the same treatment. */
  --content-card-bg: var(--navy3);

  /* ── Header ─────────────────────────────────────────────────────
     Sticky top bar. Uses a separate var so light mode can swap it   */
  --header-bg:  rgba(17,30,42,0.92);   /* dark frosted glass         */
  /* Header height in mobile/tablet collapsed layout. Used by
     `.sidebar { top: var(--hdr-h, 48px) }` to position the off-canvas
     sidebar drawer just below the header. 48px is the rendered
     header height on small viewports (smaller than desktop because
     the project-meta row is condensed). Promoted from inline
     fallback to a defined token on 2026-05-19 so the value has a
     single source of truth. */
  --hdr-h: 48px;

  /* ── Accent — Brand ─────────────────────────────────────────────
     Primary amber used for logo, active states, CTA buttons         */
  --amber:      var(--button-color);            /* reverse alias for PDF subsystem */
  --amber-rgb:  var(--button-rgb-color);         /* reverse alias for PDF subsystem */
  --red-rgb:    229,79,79;  /* RGB components for rgba(var(--red-rgb),0.x)   */
  --cyan-rgb:   50,173,230; /* RGB components for rgba(var(--cyan-rgb),0.x)  */
  --green-rgb:  61,214,140; /* RGB components for rgba(var(--green-rgb),0.x) */
  --amber2:     var(--button-click-color);       /* reverse alias for PDF subsystem */
  --amber-dim:  var(--button-dim-color);          /* reverse alias for PDF subsystem */

  /* ── Validation banner level colors ─────────────────────────────
     The status bar (validation banner) at the top of the project
     view uses dedicated tokens for each severity level so that
     changes to the global --red / --amber / --cyan / --green tokens
     don't drift its colors. Hardcoded literals here match the
     dark-theme values of those base tokens at the time of split.
     Override per theme in _theme-overrides.css if light/contrast
     themes need different banner accents.                            */
  --vb-fail:    #e54f4f;   /* fail level — red (Soyuz desat)         */
  --vb-warn:    #f0a126;   /* warning level — amber                  */
  --vb-info:    #32ade6;   /* info level — cyan                      */
  --vb-pass:    #3dd68c;   /* pass level — CRT-phosphor green        */

  /* ── Semantic / Status colors ───────────────────────────────────
     Used for compliance badges, charts, status indicators           */
  --cyan:       #32ade6;   /* info / photometrics / sync indicators  */
  --green:      #3dd68c;   /* pass / success / approved (CRT phosphor) */
  --red:        #e54f4f;   /* fail / error / critical (Soyuz desat)  */
  --purple:     #bf5af2;   /* time-switch category color             */
  --indigo:     #5e5ce6;   /* integration category color             */

  /* ── Cyan-derived semantic accents ─────────────────────────────
     These all default to var(--cyan) so themes that don't override
     them get unchanged behavior. Override per-theme to recolor a
     specific surface family without disturbing the others.

     --info               status / sync / saving / answered / in-review
     --accent-data        tag column, budget line totals, Grand Total
     --accent-zone        zone bands, zone-name editable, room-item drop affordance
     --accent-tmpl        template chips in sidebar
     --accent-photometric photometrics tab UI: IES upload, calc buttons, fixture cards
     --accent-protocol    fallback color for one-line diagrams when no DALI/DMX/BT
     --accent-compare     code-comparison "compare" column tint, headers, bg
     ───────────────────────────────────────────────────────────── */
  /* ── Master info accent ─────────────────────────────────────────
     Single knob driving all info/status/data/zone/photometric/
     template/protocol/compare UI. Decoupled from --cyan so the
     literal cyan color (used directly via the .color-cyan class
     and a few specific surfaces) and the broader "info-themed UI"
     family can be tuned independently. The seven semantic aliases
     below are kept for source-readability and backwards compat —
     consumer CSS that references --info, --accent-data, etc. keeps
     working without changes.                                       */
  --accent-info:        #32ade6;
  --info:               var(--accent-info);
  --accent-data:        var(--accent-info);
  --accent-zone:        var(--accent-info);
  --accent-tmpl:        var(--accent-info);
  --accent-photometric: #32ade6;       /* uncoupled from --accent-info 2026-05-10 — independent knob */
  --accent-protocol:    var(--accent-info);
  --accent-compare:     var(--accent-info);

  /* ── Typography ─────────────────────────────────────────────────
     Three levels of text hierarchy                                  */
  --text:       var(--text-light-color);   /* reverse alias for PDF subsystem */
  --text2:      var(--text-mid-color);      /* reverse alias for PDF subsystem */
  --text3:      var(--text-dark-color);     /* reverse alias for PDF subsystem */

  /* ── Borders ────────────────────────────────────────────────────
     Two strengths — use --border for large containers, --border2
     for inputs, chips, and tighter UI elements                      */
  --border:     rgba(255,255,255,0.07);   /* subtle container border */
  --border2:    rgba(250,255,255,0.3);    /* neutral white-tinted edge — input/chip */

  /* ── Input fields ───────────────────────────────────────────────  */
  --input-bg:   rgba(155,155,155,0.2);    /* text input background   */

  /* ── Surface aliases ─────────────────────────────────────────────
     Convenience aliases — point at navy values for easy reskinning  */
  /* ── Room editor category accent colors ─────────────────────────
     Each section of the room editor has its own accent color.
     Used for section headers, active pills, and sidebar dots.       */
  --c-params:   #32ade6;   /* Parameters section                     */
  --c-occ:      #f5a623;   /* Occupancy Sensor section               */
  --c-ts:       #bf5af2;   /* Time-Switch / Scheduling section       */
  --c-day:      #30d158;   /* Daylight Response section              */
  --c-man:      #ff453a;   /* Manual Control section                 */
  --c-add:      #ffd60a;   /* Additional Settings section            */
  --c-int:      #5e5ce6;   /* Integration section                    */
  --c-notes:    #8e8e93;   /* Notes / misc section                   */

  /* ── Border radius ──────────────────────────────────────────────  */
  --r:    4px;   /* default radius — cards, modals (hard-edged)     */
  --r-sm: 2px;   /* small radius — chips, badges, inputs            */
  --r-lg: 8px;   /* large radius — floating panels, drawers         */

  /* ── Typography stacks ──────────────────────────────────────────  */
  --mono:  'Electrolize', 'SF Mono', ui-monospace, monospace;
  /* ── Wordmark colors — control logo independently from accent colors ── */
  --wm-orizon:  #f0a126;            /* "Orizon" wordmark text                            */
  --wm-one:     #24a8e6;            /* "1" in Orizon1 logo                               */
  --wm-stroke:  rgba(0, 0, 0, 0.65); /* outline color for Orizon1 letters (header + onboard-logo) */

  --sans:  'Electrolize', -apple-system, sans-serif;

  /* ── Scale & spacing ────────────────────────────────────────────  */
  --base-size: 13px;
  --ls-ui: 0.06em;   /* tracking on Electrolize UI text (console)    */
  --fs: 1;           /* font scale multiplier — controlled by Settings */

  /* ── Glass / frosted effects ────────────────────────────────────
     Used for the header, modals, and floating panels               */
  --glass:         rgba(255,255,255,0.04);
  --glass2:        rgba(255,255,255,0.07);
  --glass-border:  rgba(255,255,255,0.10);

  /* ── Elevation shadows ──────────────────────────────────────────  */
  --shadow-sm:     0 1px 3px rgba(0,0,0,0.45), 0 1px 2px rgba(0,0,0,0.3);
  --shadow-md:     0 4px 16px rgba(0,0,0,0.55), 0 2px 6px rgba(0,0,0,0.3);
  --shadow-lg:     0 12px 40px rgba(0,0,0,0.65), 0 4px 16px rgba(0,0,0,0.4);

  /* ── Animation tokens (Session 6) ──────────────────────────────
     Canonical timing + easings. Pick from these when writing new
     transitions. Audit before adding new values.
     --dur-fast   = 120ms  hover tints, small UI shifts
     --dur-base   = 150ms  default button/input states, most UI
     --dur-slow   = 280ms  modal fade, larger transitions
     --ease-out   = material-style standard ease
     --ease-bounce = playful overshoot for interactions         */
  --dur-fast:      120ms;
  --dur-base:      150ms;
  --dur-slow:      280ms;
  --ease-out:      cubic-bezier(0.4, 0, 0.2, 1);
  --ease-bounce:   cubic-bezier(0.34, 1.56, 0.64, 1);

  /* ── Protocol colors (one-line diagrams) ────────────────────────
     Used in 22-oneline.js to tint BT Mesh / DALI / DMX nodes and
     their wire colors in the one-line SVG output. These are
     protocol identities, not brand colors — they stay semantic
     across theme changes (a DALI node is still DALI regardless
     of the app theme).                                              */
  --proto-bt-mesh:  #60ffcc;   /* Bluetooth Mesh / Casambi — cyan-green */
  --proto-dali:     #60c8ff;   /* DALI — sky blue                       */
  --proto-dmx:      #c060ff;   /* DMX — magenta                         */

  /* ── Button accent tokens ──────────────────────────────────────
     Sidebar action buttons that should be independently themeable
     from the main brand. Default to the brand amber so the visual
     is unchanged if you never touch these; override in theme editor
     to differentiate without ripple effects elsewhere.              */
  --btn-takeoff-bg:   var(--amber);   /* Design Takeoff button base  */
  --btn-takeoff-ink:  #000;           /* Text/icon on the takeoff btn */
  --btn-room-add-bg:  var(--amber);   /* + Room button base           */
  --btn-room-add-ink: #000;           /* Text on the + Room button    */

  /* Sidebar primary-add buttons (+ Add Room / + Add Space). One shared
     token because the two buttons read as a single visual pair. Default
     aliases --navy to preserve the historical hardcoded value; override
     in Theme Studio (e.g. to #000) to improve light-mode readability. */
  --sb-primary-add-ink: var(--navy);

  /* Avatar (top-right user menu button). Dedicated tokens so the avatar
     pill can be reskinned independently from the rest of the amber
     surfaces. Default to the same values they replaced so visual
     behavior is unchanged until a theme overrides them. */
  --avatar-bg:  var(--amber);
  --avatar-ink: var(--btn-primary-ink);

  /* Header bottom edge — separates the sticky header from the rest
     of the app. Two dedicated tokens so each can be tuned without
     touching the other or the rest of the app's borders/shadows.

     --header-border-bottom: the 1px hairline at the very bottom of
       the header. Default is theme-aware via rgb(from var(--text)…)
       so it reads as "darker than bg" in both light and dark mode.
     --header-shadow: the soft drop shadow that gives depth below
       the header. Default is black at low alpha — shadows are dark
       in both light and dark themes (shadows fall AWAY from light
       regardless of background). Slightly more visible in light
       mode by design.                                                */
  --header-border-bottom: rgb(from var(--text) r g b / 0.18);
  --header-shadow:        0 2px 8px rgba(0, 0, 0, 0.10);

  /* ── Status indicators (pass / warn / fail) ────────────────────
     Semantic pairs used across compliance chips, punch list, Cx,
     device validation, RFI status. Editor's "Link to base" toggle
     swaps between literal hex and rgb(from var(--base) r g b / α).  */
  --status-pass-ink:        #15803d;
  --status-pass-bg:         #dcfce7;
  --status-warn-ink:        #92400e;
  --status-warn-bg:         #fef3c7;
  --status-fail-ink:        #b91c1c;
  --status-fail-bg:         #fee2e2;

  /* ── Surface tints (3 alpha tiers × 5 semantic roles) ────────── */
  --surface-success-subtle: rgb(from var(--green) r g b / 0.07);
  --surface-success-soft:   rgb(from var(--green) r g b / 0.14);
  --surface-success-strong: rgb(from var(--green) r g b / 0.22);
  --surface-warning-subtle: rgb(from var(--amber) r g b / 0.07);
  --surface-warning-soft:   rgb(from var(--amber) r g b / 0.14);
  --surface-warning-strong: rgb(from var(--amber) r g b / 0.22);
  --surface-danger-subtle:  rgb(from var(--red)   r g b / 0.07);
  --surface-danger-soft:    rgb(from var(--red)   r g b / 0.14);
  --surface-danger-strong:  rgb(from var(--red)   r g b / 0.22);
  --surface-info-subtle:    rgb(from var(--info)  r g b / 0.07);
  --surface-info-soft:      rgb(from var(--info)  r g b / 0.14);
  --surface-info-strong:    rgb(from var(--info)  r g b / 0.22);
  --surface-accent-subtle:  rgb(from var(--amber) r g b / 0.07);
  --surface-accent-soft:    rgb(from var(--amber) r g b / 0.14);
  --surface-accent-strong:  rgb(from var(--amber) r g b / 0.22);

  /* ── Field states (form inputs) — aliases for editor UX ──────── */
  --field-bg:               var(--navy4);
  --field-bg-hover:         var(--navy3);
  --field-border:           var(--border2);
  --field-border-hover:     var(--border);
  --field-border-focus:     var(--amber);
  --field-focus-ring:       rgb(from var(--amber) r g b / 0.14);

  /* ── Button extension (primary / ghost) ─────────────────────── */
  --btn-primary-bg:         var(--amber);
  --btn-primary-ink:        #000;
  --btn-ghost-bg:           rgb(from var(--text) r g b / 0.04);
  --btn-ghost-ink:          var(--text2);

  /* ── Canvas select ring (on-screen only, never in PDFs) ──────── */
  --canvas-select-ring:     rgb(from var(--amber) r g b / 0.55);

  /* ════════════════════════════════════════════════════════════════
     PHASE 1 TOKENS — added 2026-04-26 by the color tokenization
     project. Defined-but-unused: code still hardcodes these values.
     Phases 2-4 migrate hardcoded uses to var() calls. See
     COLOR_INVENTORY.md in repo root for the full inventory + plan.
     ════════════════════════════════════════════════════════════════ */

  /* ── Surfaces (additional) — reverse aliases for PDF subsystem ─ */
  --page-bg-dark:           var(--text-mid-color);    /* consolidated → text-mid */
  --surface-darker:         var(--text-mid-color);    /* consolidated → text-mid */
  --surface-neutral-light:  var(--text-mid-color);    /* consolidated → text-mid */
  --surface-soft-light:     var(--midground-color);   /* consolidated → midground */
  --surface:                var(--foreground-color);  /* consolidated → foreground */
  --surface2:               var(--foreground-color);  /* consolidated → foreground */
  --card-bg-light:          var(--text-mid-color);    /* consolidated → text-mid */

  /* ── Borders (additional weights) ──────────────────────────── */
  --border-subtle-light:    #e0e0e5;   /* subtle dividers, room editor */
  --border-medium-dark:     #dddddd;   /* medium border in dark theme */
  --border-strong-dark:     #cccccc;   /* stronger border for emphasis */

  /* ── Text (additional shades) — reverse aliases per consolidation ─ */
  --text-disabled-dark:     var(--text-dark-color);   /* consolidated → text-dark */
  --text-muted-dark:        var(--text-dark-color);   /* consolidated → text-dark */
  --text-secondary-dark:    var(--text-mid-color);    /* consolidated → text-mid */
  --text-meta-light:        var(--text-mid-color);    /* consolidated → text-mid */
  /* ── Status (additional shades) ────────────────────────────── */
  --status-error:           #ef4444;   /* error/fail (Tailwind red-500) */
  --status-success-bright:  #7fd086;   /* light-theme success bright */
  --accent-success-subtle:  rgb(from var(--green) r g b / 0.15);
  --accent-cyan-subtle:     rgb(from var(--cyan-tint-color)  r g b / 0.08);

  /* ── Space-type palette (used in 03-dom-init.js SPACE_TYPE_COLORS) ──
     Themed as a coordinated palette — all eight tokens should be
     edited together for visual coherence. */
  --space-type-office:          #4eb8c8;
  --space-type-healthcare:      #52c97a;
  --space-type-hospital:        #e05252;
  --space-type-manufacturing:   #9b7fe8;
  --space-type-dining:          #e8a430;
  --space-type-retail:          #e8c430;
  --space-type-residential:     #60a8e0;
  --space-type-other:           #92a8bb;

  /* ── Drawing/Takeoff markers (canvas) ──────────────────────── */
  --takeoff-marker-fill-active: #f5c060;

  /* ── Shadow / scrim alpha tokens
     All alpha-linked to --text so they automatically darken/lighten
     with theme switches. RGB pickable + alpha slider in the editor. */
  --shadow-subtle-low:      rgb(from var(--text) r g b / 0.04);
  --shadow-subtle-med:      rgb(from var(--text) r g b / 0.12);
  --shadow-subtle-high:     rgb(from var(--text) r g b / 0.15);
  --shadow-soft:            rgb(from var(--text) r g b / 0.20);
  --scrim-medium:           rgb(from var(--text) r g b / 0.50);
  --scrim-strong:           rgb(from var(--text) r g b / 0.60);
  --scrim-extra-strong:     rgb(from var(--text) r g b / 0.70);
  --scrim-near-opaque:      rgb(from var(--text) r g b / 0.75);

  /* ── Glass tints (light alpha on dark surfaces) ────────────── */
  --surface-glass-faint:    rgba(255,255,255,0.06);
  --surface-glass-medium:   rgba(255,255,255,0.10);

  /* ── White paper-card surface ────────────────────────────────
     Pure white card on theme background — used for sidebar zone
     blocks, zone headers, empty-state cards, and the engineering-
     drawing aesthetic where cards read as "paper pinned to the
     workspace." Deliberately not a navy variant: the contrast
     against the colored surface is the point. */
}


/* ── 2. LIGHT MODE TOKEN OVERRIDES ────────────────────────────────── */
/* All tokens not listed here inherit the dark mode values above.
   Only values that differ in light mode need to appear here.         */
[data-theme="light"] {
  /* ── v26.05.05: palette swap ──────────────────────────────────
     Light theme uses a slate (#7e8c9a) primary + cool off-white
     (#f0f8ff) page background. This palette became the canonical
     light look in v26.05.05 (replacing an earlier higher-contrast
     light theme). The previous one-off light variant that this
     palette derives from has been removed in v26.05.06.

     Three categories of token live in this block:

       1. Palette tokens — direct overrides of color values.
          These are the "look" of the theme.

       2. Semantic & validation tokens (--green, --red, --vb-fail,
          --vb-warn, etc) — kept light-readable so error banners /
          pass states / etc don't inherit dark-theme values that
          would read poorly on a light background.

       3. Phase-1 dark→light bridge tokens (--text-muted-dark,
          --border-medium-dark, etc) — preserved so shared CSS
          that references the dark-suffixed names still resolves
          to sensible values in light mode.
     ─────────────────────────────────────────────────────────── */

  /* ── 1. Palette tokens ────────────────────────────────────── */

  /* Page / App surfaces — cool off-white with subtle blue tint */
  --background-color:       #f0f8ff;
  --midground-color:      #e7f0f8;
  --foreground-color:      #e7f0f8;
  --header-bg:  rgba(110, 157, 201, 0.92);

  /* Accent — Brand. Note: --amber is the primary action color
     across the app (buttons, focus rings, etc). In this theme
     the "amber" tokens map to slate so the primary action color
     is slate, not orange. The actual amber color (#f0a126)
     persists in the wordmark via --wm-orizon below. */
  --button-color:      #7e8c9a;
  --button-click-color:     #6e9dc9;
  --button-dim-color:  #7e8c9a;
  --button-rgb-color:  110, 157, 201;

  /* Brand cyan — used for accent highlights, NOT for the validation-
     info banner (those use --vb-info, kept dark-readable below). */
  --cyan:             #62b0fe;
  --cyan-tint-color:  #62b0fe;   /* defaults to --cyan */

  /* Typography */
  --text-light-color:       #232425;
  --text-light-tint-color:  #232425;   /* defaults to --text-light-color */
  --text-mid-color:      #404245;
  --text-dark-color:      #404245;

  /* Borders */
  --border:     rgba(126, 140, 154, 0.5);
  --border2:    rgba(126, 140, 154, 0.9);

  /* Inputs */
  --input-bg:   rgba(231, 240, 248, 0.9);

  /* Buttons */
  --btn-takeoff-bg:        #7e8c9a;
  --btn-room-add-bg:       #7e8c9a;
  --sb-primary-add-ink:    #f0f8ff;
  --btn-primary-bg:        #7e8c9a;
  /* Override base #000 — primary button text on slate #7e8c9a
     lacks contrast in black. Cool off-white reads cleaner. */
  --btn-primary-ink:       #f0f8ff;
  --btn-ghost-bg:          rgb(from #232425 r g b / 0.04);
  --btn-ghost-ink:         #404245;

  /* Surface tinting (banners, callouts, tabs). Derived from the
     slate/cyan accents at low opacity. */
  --surface-warning-subtle: rgb(from #7e8c9a r g b / 0.07);
  --surface-warning-soft:   rgb(from #7e8c9a r g b / 0.14);
  --surface-warning-strong: rgb(from #7e8c9a r g b / 0.22);
  --surface-info-subtle:    rgb(from #62b0fe r g b / 0.07);
  --surface-info-soft:      rgb(from #62b0fe r g b / 0.14);
  --surface-info-strong:    rgb(from #62b0fe r g b / 0.22);
  --surface-accent-subtle:  rgb(from #7e8c9a r g b / 0.07);
  --surface-accent-soft:    rgb(from #7e8c9a r g b / 0.14);
  --surface-accent-strong:  rgb(from #7e8c9a r g b / 0.22);

  /* Field treatments */
  --field-bg:           #e7f0f8;
  --field-bg-hover:     #e7f0f8;
  --field-border:       rgba(126, 140, 154, 0.9);
  --field-border-hover: rgba(126, 140, 154, 0.5);
  --field-border-focus: #7e8c9a;
  --field-focus-ring:   rgb(from #7e8c9a r g b / 0.14);
  --canvas-select-ring: rgb(from #7e8c9a r g b / 0.55);
  --accent-cyan-subtle: rgb(from #62b0fe r g b / 0.08);

  /* Shadow alphas — derived from --text. Note these are alpha-only
     values for use inside shadow shorthand strings, NOT replacements
     for --shadow-sm/md/lg below (those are full box-shadow declarations
     used by elevation primitives). */
  --shadow-subtle-low:   rgb(from #232425 r g b / 0.04);
  --shadow-subtle-med:   rgb(from #232425 r g b / 0.12);
  --shadow-subtle-high:  rgb(from #232425 r g b / 0.15);
  --shadow-soft:         rgb(from #232425 r g b / 0.20);

  /* Scrims (modal overlays) */
  --scrim-medium:        rgb(from #232425 r g b / 0.50);
  --scrim-strong:        rgb(from #232425 r g b / 0.60);
  --scrim-extra-strong:  rgb(from #232425 r g b / 0.70);
  --scrim-near-opaque:   rgb(from #232425 r g b / 0.75);

  /* ── 2. Semantic & validation tokens ────────────────────────────
     v26.05.05: REMOVED previous overrides. Light previously kept
     its own darker, more muted versions of --green/red/purple/indigo
     and --vb-fail/warn/info/pass for "better contrast on light
     surfaces." That made the saved-status dot read forest green in
     light vs Apple green in the rest of the UI, and similar
     inconsistencies. Light now falls through to :root for these
     tokens. Wordmark colors below are the only semantic overrides
     retained — they're brand identity, not status indicators. */

  /* Wordmark — kept the original brand colors (amber + cyan) so the
     Orizon1 logo doesn't lose its identity even though --amber the
     button color shifted to slate. Wordmark identity > UI palette. */
  --wm-one:     #24a8e6;
  --wm-orizon:  #f0a126;

  /* v26.05.05: glass tokens (--glass, --glass2, --glass-border) and
     full elevation shadows (--shadow-sm, --shadow-md, --shadow-lg)
     used to be overridden here for "tuned for light backgrounds"
     reasons. Removed — they now fall through to :root values. The
     :root glass values are 4-10% white opacity (essentially invisible
     on light bg, so glass effects are null in light theme). The
     :root shadow values are heavier alpha (designed for dark
     backgrounds) but render acceptably on light. If we ever want
     subtler shadows on light backgrounds we'll re-add the override. */

  /* ── 3. Phase 1 dark→light bridge tokens ────────────────────
     Added 2026-04-26. Most Phase 1 tokens auto-adapt via rgb(from
     var(--text) r g b / α) so they don't need light overrides.
     Only tokens that are explicitly dark-theme-named but might be
     referenced in shared CSS get explicit light values here. */
  --border-medium-dark:     var(--border);
  --border-strong-dark:     var(--border2);
}




/* ════════════════════════════════════════════════════════════════════
   THEME COMPONENT OVERRIDES
   ════════════════════════════════════════════════════════════════════
   Light-theme component-specific overrides. These are rules scoped
   to [data-theme="light"] that tweak specific components whose base
   colors are not fully tokenized. Build concatenates this file AFTER
   _tokens.css so the theme-attribute selectors resolve correctly.
   ════════════════════════════════════════════════════════════════════ */

/* ── 3. LIGHT MODE COMPONENT OVERRIDES ────────────────────────────── */
/* Components that use hardcoded colors (not CSS vars) need explicit
   overrides in light mode. Grouped by UI section for easy editing.   */

/* ── Header ───────────────────────────────────────────────────────
   v26.05.05: removed the [data-theme="light"] .header override.
   Previously set border-bottom-color: var(--button-color) and a custom
   box-shadow. With the palette swap (--amber is now slate), the
   border read as a strong slate line. Light now falls through to
   the base rule's --header-border-bottom (subtle text-colored) and
   --header-shadow. */

/* ── Sidebar ───────────────────────────────────────────────────────
   v26.05.05: All sidebar overrides removed. They set values that
   diverged from the base-rule fall-through (e.g. sidebar bg --navy
   vs base --navy2). With the new palette, the base rules already
   produce the correct visual; the overrides were vestigial from the
   previous light palette where --navy was a real blue. */

/* ── Cards / Output area ─────────────────────────────────────────────
   v26.04.27: .output-card is now a transparent layout wrapper; its
   former card styling now lives on each of its three floating children
   (.output-card-header, .out-tabs, .pane-content). The light-theme
   override mirrors that split.
   v26.05.05: REMOVED all card / output-card-header / out-tabs /
   pane-content overrides for light theme. They produced different
   backgrounds and shadows than the base-rule fall-through, causing
   visible edge divergence. Light now uses base rules. */
[data-theme="light"] .narrative-doc       { color: var(--text-mid-color); }

/* ── Output tabs ───────────────────────────────────────────────────
   v26.05.05: REMOVED the .out-tab / .out-tab.active / .out-tab:hover
   overrides. They set solid navy3/navy2/navy4 backgrounds on each
   individual tab, filling the whole strip with --navy3 (#e7f0f8).
   Tabs now use the base rule (background: none), letting the page
   color show through with only the strip's border defining the bar. */

/* ── Compliance bars ─────────────────────────────────────────────── */
[data-theme="light"] .comp-bar-pass       { background: rgba(30,122,68,0.12);  border-color: rgba(30,122,68,0.4); }
[data-theme="light"] .comp-bar-warn       { background: rgba(192,122,16,0.12); border-color: rgba(192,122,16,0.4); }
[data-theme="light"] .comp-bar-fail       { background: rgba(192,57,43,0.12);  border-color: rgba(192,57,43,0.4); }

/* ── Pills / toggles ─────────────────────────────────────────────── */
[data-theme="light"] .pill                { background: var(--foreground-color); border-color: var(--border2); color: var(--text-mid-color); }
/* v26.05.05: pill on-state was hardcoded amber-orange. Updated to slate
   to track the new primary action color. Uses --amber so a future palette
   tweak propagates without touching this rule again. */
[data-theme="light"] .pill.on             { background: rgb(from var(--button-color) r g b / 0.15); border-color: var(--button-color); color: var(--button-color); }

/* ── Modals ──────────────────────────────────────────────────────── */
[data-theme="light"] .modal               { background: var(--text-mid-color); border-color: var(--border); box-shadow: 0 8px 40px var(--shadow-subtle-high); }
[data-theme="light"] .modal-bg            { background: rgb(from var(--text-light-tint-color) r g b / 0.3); }

/* ── Tables (matrix, controls schedule, setpoints) ───────────────── */
[data-theme="light"] .ctable th           { background: var(--midground-color); }
[data-theme="light"] .zone-row td         { background: var(--midground-color); color: var(--text-mid-color); }
[data-theme="light"] .cat-section         { border-color: var(--border); }
[data-theme="light"] .cat-hdr             { border-bottom-color: var(--border); }
[data-theme="light"] .sp-table thead th   { background: var(--foreground-color); }
[data-theme="light"] .sp-table tbody tr.sp-zone td { background: var(--midground-color); color: var(--text-mid-color); }

/* ── Revisions / CX checklist ────────────────────────────────────── */
[data-theme="light"] .rev-entry:nth-child(even),
[data-theme="light"] .cx-item:nth-child(even)  { background: var(--foreground-color); }
[data-theme="light"] .cx-room-hdr             { background: var(--foreground-color); border-color: var(--border); }
[data-theme="light"] .cx-signoff              { background: var(--foreground-color); border-color: var(--border); }

/* ── Bulk edit panel ─────────────────────────────────────────────── */
[data-theme="light"] .bulk-scope           { background: var(--foreground-color); }
[data-theme="light"] .bulk-preview         { background: var(--foreground-color); }

/* ── Tooltips ────────────────────────────────────────────────────── */
[data-theme="light"] .tip-icon             { background: var(--foreground-color); border-color: var(--border2); }
[data-theme="light"] .tip-icon::after      { background: var(--text-mid-color); color: var(--midground-color); box-shadow: 0 4px 16px var(--shadow-subtle-high); }

/* ── Punch list ──────────────────────────────────────────────────── */
[data-theme="light"] .pl-item             { background: var(--text-mid-color); }
[data-theme="light"] .pl-item:hover       { background: var(--background-color); }
[data-theme="light"] .pl-add-card         { background: var(--foreground-color); }
[data-theme="light"] .pl-sort-bar         { background: var(--foreground-color); }

/* ── RFI log ─────────────────────────────────────────────────────── */
[data-theme="light"] .rfi-item            { background: var(--text-mid-color); }
[data-theme="light"] .rfi-item:hover      { background: var(--background-color); }
[data-theme="light"] .rfi-add-card        { background: var(--foreground-color); }
[data-theme="light"] .rfi-sort-bar        { background: var(--foreground-color); }
[data-theme="light"] .rfi-q-block         { background: var(--shadow-subtle-low); }

/* ── Misc UI ──────────────────────────────────────────────────────── */
[data-theme="light"] body::before         { display: none; }   /* hide dark-mode grain texture */
[data-theme="light"] #themeToggle         { color: var(--button-color); border-color: var(--button-dim-color); }


/* ════════════════════════════════════════════════════════════════════
   DISTANT BLUE — RETRO NASA / APOLLO-ERA THEME
   Token overrides for [data-theme="distant-blue"].
   All colors reference the same CSS variable names as dark/light mode.
   ════════════════════════════════════════════════════════════════════ */

[data-theme="distant-blue"] {

  /* ── Page / App surfaces ────────────────────────────────────────── */
  --background-color:       #c8c8cc;   /* page background — warm mid-gray         */
  --midground-color:      #d8d8dc;   /* panel / modal background                */
  --foreground-color:      #e4e4e8;   /* card / sidebar item / elevated surface  */
  /* Content card background — white for paper-on-page contrast      */
  --content-card-bg: #ffffff;

  /* ── Header ─────────────────────────────────────────────────────── */
  --header-bg:  rgba(0,123,154,0.50);

  /* ── Accent — NASA red replaces amber ──────────────────────────── */
  --button-color:      #cc0000;
  --button-rgb-color:  204,0,0;
  --button-click-color:     #aa0000;
  --button-dim-color:  #f5c0c0;

  /* ── Semantic / Status ──────────────────────────────────────────── */
  --cyan:             #006b8a;
  --cyan-tint-color:  #006b8a;   /* defaults to --cyan */
  --cyan-rgb:   0,107,138;
  --accent-info:      #006b8a;   /* master info accent — drives 7 derived semantic tokens */
  --accent-photometric: #006b8a; /* uncoupled — mirrors theme's accent-info to preserve prior behavior */
  --green:      #1a6b2e;
  --green-rgb:  26,107,46;
  --red:        #cc0000;
  --red-rgb:    204,0,0;
  --purple:     #6a3d8f;
  --indigo:     #2e2c8a;

  /* Validation banner — NASA red is also the brand --amber here, so
     pick a distinct warm color for --vb-warn so users can still
     distinguish warn-from-fail in the status bar. The other three
     map to the theme's semantic colors as you'd expect. */
  --vb-fail:    #cc0000;
  --vb-warn:    #c97500;   /* warm orange, distinct from NASA red    */
  --vb-info:    #006b8a;
  --vb-pass:    #1a6b2e;

  /* ── Typography ─────────────────────────────────────────────────── */
  --text-light-color:       #0a0a0e;
  --text-light-tint-color:  #0a0a0e;   /* defaults to --text-light-color */
  --text-mid-color:      #2a2a32;
  --text-dark-color:      #5a5a68;

  /* ── Borders — red-tinted ───────────────────────────────────────── */
  --border:     rgba(160,0,0,0.22);
  --border2:    rgba(160,0,0,0.42);

  /* ── Input fields ───────────────────────────────────────────────── */
  --input-bg:   rgba(0,0,0,0.04);

  /* ── Surface aliases ─────────────────────────────────────────────── */
  --c-params:   #006b8a;
  --c-occ:      #cc0000;
  --c-ts:       #6a3d8f;
  --c-day:      #1a6b2e;
  --c-man:      #aa0000;
  --c-add:      #b87800;
  --c-int:      #2e2c8a;
  --c-notes:    #5a5a68;

  /* ── Glass / frosted ────────────────────────────────────────────── */
  --glass:         rgba(255,255,255,0.45);
  --glass2:        rgba(255,255,255,0.70);
  --glass-border:  rgba(160,0,0,0.18);

  /* ── Elevation shadows ──────────────────────────────────────────── */
  --shadow-sm:  0 1px 3px rgba(0,0,0,0.15), 0 1px 2px rgba(0,0,0,0.10);
  --shadow-md:  0 4px 16px rgba(0,0,0,0.18), 0 2px 6px rgba(0,0,0,0.10);
  --shadow-lg:  0 12px 40px rgba(0,0,0,0.22), 0 4px 16px rgba(0,0,0,0.12);
}

/* ── Distant Blue component overrides ───────────────────────────── */

/* Distant Blue wordmark — white "Orizon" + white "1" on teal header */
[data-theme="distant-blue"] .header .wordmark em  { color: var(--wm-orizon); }
[data-theme="distant-blue"] .header .wordmark .wm-ver { color: var(--wm-one); }

/* In non-header contexts (wizard, onboard, auth) use red + white */
[data-theme="distant-blue"] {
  --wm-one:    #24a8e6;
  --wm-orizon: #f0a126;
}

[data-theme="distant-blue"] .header {
  background: var(--header-bg);
  border-bottom: 2px solid var(--button-color);
  box-shadow: 0 1px 8px var(--shadow-subtle-med);
}

[data-theme="distant-blue"] .sidebar {
  background: var(--background-color);
  border-right: 1px solid var(--border2);
}
[data-theme="distant-blue"] .zone-header         { background: var(--foreground-color); border-bottom: 1px solid var(--border); }
[data-theme="distant-blue"] .zone-header:hover   { background: var(--foreground-color); }
[data-theme="distant-blue"] .room-item:hover     { background: var(--foreground-color); }
[data-theme="distant-blue"] .room-item.active    { background: rgba(160,0,0,0.10); border-color: var(--button-color); }
[data-theme="distant-blue"] .tmpl-bar            { background: var(--foreground-color); border-top: 1px solid var(--border2); }
[data-theme="distant-blue"] .sb-search           { background: var(--input-bg); border-color: var(--border2); }

[data-theme="distant-blue"] .card,
[data-theme="distant-blue"] .output-card-header,
[data-theme="distant-blue"] .out-tabs,
[data-theme="distant-blue"] .pane-content {
  background: var(--midground-color);
  border: 1px solid var(--border2);
  box-shadow: 0 1px 4px rgb(from var(--text-light-tint-color) r g b / 0.10);
}
[data-theme="distant-blue"] .output-card-header  { background: var(--foreground-color); }
[data-theme="distant-blue"] .narrative-doc       { color: var(--text-mid-color); }

[data-theme="distant-blue"] .out-tab             { background: var(--foreground-color); color: var(--text-mid-color); border-color: var(--border); }
[data-theme="distant-blue"] .out-tab.active      { background: var(--foreground-color); color: var(--button-color); }
[data-theme="distant-blue"] .out-tab:hover       { background: var(--foreground-color); }

[data-theme="distant-blue"] .comp-bar-pass       { background: rgba(26,107,46,0.12);  border-color: rgba(26,107,46,0.40); }
[data-theme="distant-blue"] .comp-bar-warn       { background: rgba(184,120,0,0.12);  border-color: rgba(184,120,0,0.40); }
[data-theme="distant-blue"] .comp-bar-fail       { background: rgba(160,0,0,0.10);    border-color: rgba(160,0,0,0.35); }

[data-theme="distant-blue"] .pill                { background: var(--foreground-color); border-color: var(--border2); color: var(--text-mid-color); }
[data-theme="distant-blue"] .pill.on             { background: rgba(160,0,0,0.12); border-color: var(--button-color); color: var(--button-color); }

[data-theme="distant-blue"] .modal               { background: var(--midground-color); border-color: var(--border2); }
[data-theme="distant-blue"] .modal-bg            { background: rgb(from var(--text-light-tint-color) r g b / 0.35); }

[data-theme="distant-blue"] .cat-section         { border-color: var(--border2); }
[data-theme="distant-blue"] .cat-hdr             { border-bottom-color: var(--border); }
[data-theme="distant-blue"] .cat-body            { background: var(--foreground-color); }

[data-theme="distant-blue"] .ctable th           { background: var(--foreground-color); }
[data-theme="distant-blue"] .zone-row td         { background: var(--background-color); color: var(--text-light-color); }
[data-theme="distant-blue"] .sp-table thead th   { background: var(--foreground-color); }
[data-theme="distant-blue"] .sp-table tbody tr.sp-zone td { background: var(--background-color); color: var(--text-light-color); }

[data-theme="distant-blue"] .rev-entry:nth-child(even),
[data-theme="distant-blue"] .cx-item:nth-child(even)  { background: var(--foreground-color); }
[data-theme="distant-blue"] .cx-room-hdr              { background: var(--foreground-color); border-color: var(--border); }
[data-theme="distant-blue"] .cx-signoff               { background: var(--foreground-color); border-color: var(--border); }

[data-theme="distant-blue"] .bulk-scope          { background: var(--foreground-color); }
[data-theme="distant-blue"] .bulk-preview        { background: var(--foreground-color); }
[data-theme="distant-blue"] .tip-icon            { background: var(--foreground-color); border-color: var(--border2); }

/* Auth gate in Distant Blue */
[data-theme="distant-blue"] #authGate           { background: var(--background-color); }
[data-theme="distant-blue"] .auth-input         { background: var(--input-bg); border-color: var(--border2); color: var(--text-light-color); }
[data-theme="distant-blue"] .auth-input:focus   { border-color: var(--button-color); }

/* Inner tabs */
[data-theme="distant-blue"] .inner-tab          { color: var(--text-dark-color); }
[data-theme="distant-blue"] .inner-tab.active   { color: var(--button-color); border-bottom-color: var(--button-color); }
[data-theme="distant-blue"] .inner-tabs         { border-bottom-color: var(--border2); }

/* Wordmark — keep Orizon red, 1 cyan */
[data-theme="distant-blue"] .auth-gate-o        { color: var(--wm-orizon); }
[data-theme="distant-blue"] .auth-gate-v        { color: var(--wm-one); }

/* hdr-btn variants */
[data-theme="distant-blue"] .hdr-btn-ghost      { color: var(--text-mid-color); }
[data-theme="distant-blue"] .hdr-btn-ghost:hover { background: rgb(from var(--text-light-tint-color) r g b / 0.08); color: var(--text-light-color); }
[data-theme="distant-blue"] .hdr-btn-outline    { border-color: var(--border2); color: var(--text-mid-color); }
[data-theme="distant-blue"] .hdr-btn-outline:hover { background: rgb(from var(--text-light-tint-color) r g b / 0.06); border-color: var(--button-color); }

/* Wizard */
[data-theme="distant-blue"] .wizard-shell       { background: var(--midground-color); border-color: var(--border2); }
[data-theme="distant-blue"] .wizard-option      { background: var(--foreground-color); border-color: var(--border2); }
[data-theme="distant-blue"] .wizard-option:hover { background: var(--foreground-color); border-color: var(--button-color); }
[data-theme="distant-blue"] .wizard-option.selected { border-color: var(--button-color); background: rgba(160,0,0,0.08); }


/* ══════════════════════════════════════════════════════════════════
   LCA THEME — data-theme="lca"
   Light slate base with deep teal accent.
   Default theme for LCA Free tier users.
   ══════════════════════════════════════════════════════════════════ */

[data-theme="lca"] {

  /* ── Page / App surfaces ────────────────────────────────────────── */
  --background-color:       #b6b9c9;   /* page background — light slate           */
  --midground-color:      #c0c3dd;   /* panel / modal background                */
  --foreground-color:      #d0d0e2;   /* card / sidebar item / elevated surface  */
  /* Content card background — white for paper-on-page contrast      */
  --content-card-bg: #ffffff;

  /* ── Header ─────────────────────────────────────────────────────── */
  --header-bg:  rgba(16,27,86,0.94);

  /* ── Accent — deep teal replaces amber ─────────────────────────── */
  --button-color:      #00878a;
  --button-rgb-color:  0,135,138;
  --button-click-color:     #69e5e8;
  --button-dim-color:  #cceaea;

  /* ── Semantic / Status ──────────────────────────────────────────── */
  --cyan:             #375758;
  --cyan-tint-color:  #375758;   /* defaults to --cyan */
  --cyan-rgb:   55,87,88;
  --accent-info:      #375758;   /* master info accent — drives 7 derived semantic tokens */
  --accent-photometric: #375758; /* uncoupled — mirrors theme's accent-info to preserve prior behavior */
  --green:      #0da566;
  --green-rgb:  13,165,102;
  --red:        #b62525;
  --red-rgb:    182,37,37;
  --purple:     #7d4ab0;
  --indigo:     #5553d0;

  /* Validation banner — LCA's --amber is teal (close to --cyan), so
     pick a distinct warm orange for --vb-warn that won't merge into
     the info/pass tints. The other three map to LCA's semantic
     colors so theme parity is maintained.                            */
  --vb-fail:    #b62525;
  --vb-warn:    #c97500;   /* warm orange, distinct from teal accent */
  --vb-info:    #375758;
  --vb-pass:    #0da566;

  /* ── Typography ─────────────────────────────────────────────────── */
  --text-light-color:       #020622;
  --text-light-tint-color:  #020622;   /* defaults to --text-light-color */
  --text-mid-color:      #02072c;
  --text-dark-color:      #19235c;

  /* ── Borders ────────────────────────────────────────────────────── */
  --border:     #393c51;
  --border2:    #6f738b;

  /* ── Input fields ───────────────────────────────────────────────── */
  --input-bg:   rgba(0,0,0,0.06);

  /* ── Surface aliases ────────────────────────────────────────────── */
  --c-params:   #00878a;
  --c-occ:      #0da566;
  --c-ts:       #7d4ab0;
  --c-day:      #375758;
  --c-man:      #5553d0;
  --c-add:      #00878a;
  --c-int:      #5553d0;
  --c-notes:    #19235c;

  /* ── Glass / frosted ────────────────────────────────────────────── */
  --glass:         rgba(0,0,0,0.05);
  --glass2:        rgba(0,0,0,0.09);
  --glass-border:  rgba(0,135,138,0.25);

  /* ── Elevation shadows ──────────────────────────────────────────── */
  --shadow-sm:  0 1px 3px rgba(2,6,34,0.18), 0 1px 2px rgba(2,6,34,0.10);
  --shadow-md:  0 4px 16px rgba(2,6,34,0.20), 0 2px 6px rgba(2,6,34,0.12);
  --shadow-lg:  0 12px 40px rgba(2,6,34,0.28), 0 4px 16px rgba(2,6,34,0.16);

  /* ── Wordmark ───────────────────────────────────────────────────── */
  --wm-one:     #24a8e6;
  --wm-orizon:  #f0a126;
}

/* ── LCA component overrides ─────────────────────────────────────── */

[data-theme="lca"] .header {
  background: var(--header-bg);
  border-bottom: 1px solid rgba(50,203,205,0.30);
  box-shadow: 0 1px 12px rgb(from var(--text-light-tint-color) r g b / 0.40);
}

[data-theme="lca"] .header .wordmark em  { color: var(--wm-orizon); }
[data-theme="lca"] .header .wordmark .wm-ver { color: var(--wm-one); }
[data-theme="lca"] .auth-gate-o        { color: var(--wm-orizon); }
[data-theme="lca"] .auth-gate-v        { color: var(--wm-one); }

[data-theme="lca"] .sidebar {
  background: var(--midground-color);
  border-right: 1px solid var(--border);
}

[data-theme="lca"] .zone-header         { background: var(--foreground-color); border-bottom: 1px solid var(--border); }
[data-theme="lca"] .zone-header:hover   { background: rgba(50,203,205,0.08); }
[data-theme="lca"] .room-item:hover     { background: rgba(50,203,205,0.08); }
[data-theme="lca"] .room-item.active    { background: rgba(50,203,205,0.12); border-color: var(--button-color); }
[data-theme="lca"] .tmpl-bar            { background: var(--foreground-color); border-top: 1px solid var(--border); }
[data-theme="lca"] .sb-search           { background: var(--input-bg); border-color: var(--border2); }

[data-theme="lca"] .card,
[data-theme="lca"] .output-card-header,
[data-theme="lca"] .out-tabs,
[data-theme="lca"] .pane-content {
  background: var(--midground-color);
  border: 1px solid var(--border);
  box-shadow: var(--shadow-md);
}
[data-theme="lca"] .output-card-header  { background: rgba(50,203,205,0.08); }
[data-theme="lca"] .narrative-doc       { color: var(--text-mid-color); background: var(--shadow-soft); }

[data-theme="lca"] .out-tab             { background: var(--foreground-color); color: var(--text-dark-color); border-color: var(--border); }
[data-theme="lca"] .out-tab.active      { background: rgba(50,203,205,0.10); color: var(--button-color); border-color: var(--button-color); }
[data-theme="lca"] .out-tab:hover       { background: rgba(50,203,205,0.08); color: var(--text-mid-color); }

[data-theme="lca"] .pill                { background: var(--surface-glass-faint); border-color: var(--border2); color: var(--text-mid-color); }
[data-theme="lca"] .pill.on             { background: rgba(50,203,205,0.15); border-color: var(--button-color); color: var(--button-color); }

[data-theme="lca"] .btn-amber           { background: var(--button-color); color: #050a0e; border-color: var(--button-color); }
[data-theme="lca"] .btn-amber:hover     { background: var(--button-click-color); border-color: var(--button-click-color); }

[data-theme="lca"] .modal               { background: var(--midground-color); border-color: var(--border); }
[data-theme="lca"] .modal-bg            { background: var(--scrim-strong); }

[data-theme="lca"] .cat-section         { border-color: var(--border); }
[data-theme="lca"] .cat-hdr             { border-bottom-color: var(--border); }
[data-theme="lca"] .cat-body            { background: var(--shadow-subtle-high); }

[data-theme="lca"] .ctable th           { background: rgba(50,203,205,0.08); color: var(--text-mid-color); }
[data-theme="lca"] .ctable td           { background: var(--midground-color); }
[data-theme="lca"] .ctable tr:nth-child(even) td { background: var(--shadow-subtle-high); }
[data-theme="lca"] .zone-row td         { background: rgba(50,203,205,0.10) !important; color: var(--button-color) !important; }

[data-theme="lca"] .comp-bar-pass       { background: rgba(46,204,138,0.12);  border-color: rgba(46,204,138,0.40); }
[data-theme="lca"] .comp-bar-warn       { background: rgba(50,203,205,0.10);  border-color: rgba(50,203,205,0.35); }
[data-theme="lca"] .comp-bar-fail       { background: rgba(255,95,95,0.10);   border-color: rgba(255,95,95,0.35); }

[data-theme="lca"] .inner-tab          { color: var(--text-dark-color); }
[data-theme="lca"] .inner-tab.active   { color: var(--button-color); border-bottom-color: var(--button-color); }
[data-theme="lca"] .inner-tabs         { border-bottom-color: var(--border); }

[data-theme="lca"] #authGate           { background: var(--background-color); }
[data-theme="lca"] .auth-input         { background: var(--input-bg); border-color: var(--border2); color: var(--text-light-color); }
[data-theme="lca"] .auth-input:focus   { border-color: var(--button-color); }

[data-theme="lca"] .rev-entry:nth-child(even),
[data-theme="lca"] .cx-item:nth-child(even)  { background: var(--shadow-subtle-high); }
[data-theme="lca"] .cx-room-hdr              { background: var(--foreground-color); border-color: var(--border); }

[data-theme="lca"] .out-pane-hdr        { background: rgba(50,203,205,0.06); }
[data-theme="lca"] .out-pane-title      { color: var(--button-color); }

[data-theme="lca"] .wizard-shell        { background: var(--midground-color); border-color: var(--border); }
[data-theme="lca"] .wizard-option       { background: var(--foreground-color); border-color: var(--border); }
[data-theme="lca"] .wizard-option:hover { border-color: var(--button-color); background: rgba(50,203,205,0.08); }
[data-theme="lca"] .wizard-option-hero  { border-color: var(--button-color); }


/* ── Offline read-only mode ──────────────────────────────────── */
[data-offline="true"] .btn:not(#offlineBanner button),
[data-offline="true"] input:not([type="hidden"]),
[data-offline="true"] select,
[data-offline="true"] textarea,
[data-offline="true"] [contenteditable] {
  pointer-events: none;
  opacity: 0.6;
}

[data-offline="true"] .hdr-btn-primary {
  pointer-events: none;
  opacity: 0.5;
}

[data-offline="true"] #offlineBanner button {
  pointer-events: all;
  opacity: 1;
}

/* ── Viewer mode (share link) ────────────────────────────────── */
[data-viewer="true"] input:not([type="hidden"]),
[data-viewer="true"] select,
[data-viewer="true"] textarea,
[data-viewer="true"] [contenteditable] {
  pointer-events: none;
  opacity: 0.7;
}

[data-viewer="true"] .btn {
  pointer-events: none;
  opacity: 0.5;
}

/* Keep PDF export and viewer banner buttons active */
[data-viewer="true"] .hdr-btn-primary,
[data-viewer="true"] #viewerBanner a,
[data-viewer="true"] #viewerBanner button {
  pointer-events: all;
  opacity: 1;
}

/* Hide edit-only UI elements entirely in viewer mode */
[data-viewer="true"] .room-add-btn,
[data-viewer="true"] .zone-add-btn,
[data-viewer="true"] .tmpl-bar,
[data-viewer="true"] .rev-add-row,
[data-viewer="true"] .dirty-indicator,
[data-viewer="true"] [data-action="auth-save-now"],
[data-viewer="true"] [data-action="auth-new-project"],
[data-viewer="true"] #shareLinkBtn {
  display: none !important;
}

/* Sidebar rooms — no hover edit affordance in viewer mode */
[data-viewer="true"] .room-item {
  cursor: default;
}


/* ════════════════════════════════════════════════════════════════════
   ORIZON1 · COMPONENTS & LAYOUT
   ════════════════════════════════════════════════════════════════════
   Base reset + all component styles. Build concatenates CSS in this
   order: _tokens.css → _theme-overrides.css → main.css

   When editing:
   • Token values (colors, shadows, etc.)  → _tokens.css
   • Light-theme component tweaks          → _theme-overrides.css
   • Everything else                       → this file
   ════════════════════════════════════════════════════════════════════ */

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

body {
  font-family: var(--sans);
  background: var(--background-color);
  color: var(--text-light-color);
  min-height: 100vh;
  overflow-x: clip; /* clip instead of hidden — does not create stacking context, fixed modals work correctly */
  font-size: var(--base-size);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  transition: background var(--dur-slow), color var(--dur-slow);
  /* Reserve vertical scrollbar space at all times to prevent UI jumping
     when content reflow briefly toggles the scrollbar on/off (e.g. when
     toast notifications fire aria-live announcements, or when tab
     switches reveal content taller vs shorter than the viewport). */
  scrollbar-gutter: stable;
}

/* Subtle noise grain */
body::before {
  content: '';
  position: fixed; inset: 0;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
  pointer-events: none; z-index: 9999; opacity: 0.6;
}

/* ── HEADER ── */
/* ── Header: CSS Grid two-row layout ── */
.header {
  background: var(--header-bg);
  backdrop-filter: blur(28px) saturate(200%);
  -webkit-backdrop-filter: blur(28px) saturate(200%);
  border-bottom: 1px solid var(--header-border-bottom);
  padding: 6px 20px 0;
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-rows: auto auto;
  align-items: center;
  position: sticky; top: 0; z-index: 200;
  box-shadow: var(--header-shadow);
}
.header-brand   { grid-column: 1; grid-row: 1; display: flex; align-items: center; gap: 14px; }
.header-actions { grid-column: 2; grid-row: 1; display: flex; align-items: center; gap: 5px; }
/* Progress bar — always row 2, full width */
.hdr-progress-row {
  grid-column: 1 / -1;
  grid-row: 2;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  padding: 4px 0 6px;
}

.header-brand .wordmark {
  font-family: var(--sans);
  font-size: calc(22px * var(--fs, 1)); font-weight: 700;
  color: var(--text-light-color); letter-spacing: -0.5px;
}
.header-brand .wordmark em { color: var(--wm-orizon); font-style: normal; -webkit-text-stroke: 1px var(--wm-stroke); paint-order: stroke fill; }
.header-brand .wordmark .wm-ver { color: var(--wm-one); font-style: normal; -webkit-text-stroke: 1px var(--wm-stroke); paint-order: stroke fill; }
.wm-release {
  /* Set font-size in absolute units so "distant blue" renders at a
     predictable size regardless of how the parent wordmark's em
     chain resolves at runtime. Earlier attempts using `0.5em` on
     the inner .brand-distant-blue (with `font-size: inherit` on
     this wrap) were correct in theory but produced an invisible
     render in some themes — likely interaction between inline-flex
     baseline alignment and inherited line-height collapse. Hard-
     coding a pixel size eliminates the cascade dependency. The
     calc() honors the user's --fs scale token. */
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  color: var(--text-dark-color);
  letter-spacing: 0.5px;
  align-self: center;
  margin-left: 6px;
  white-space: nowrap;
}

/* ── Canonical brand lockup ──────────────────────────────────────
   Used everywhere ORIZON1 and "distant blue" appear together as a
   product/company pair. Centralized so sizing, tracking, and font
   choice stay consistent across header and other lockup placements. */
.brand-lockup {
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
}
.brand-orizon1 {
  letter-spacing: 0.2em;
  padding-right: 0.05em;
}
.brand-distant-blue {
  font-family: 'Orbitron', var(--sans);
  font-weight: 500;
  text-transform: lowercase;
  letter-spacing: 0.04em;
}
.brand-sep {
  color: var(--text-dark-color);
  font-weight: 400;
  opacity: 0.7;
  padding: 0 2px;
}
/* Distant Blue tagline rendered at a fixed pixel size, scaled by --fs.
   Previously used `0.5em` against an "inherit" parent, which the cascade
   resolved invisibly small in some themes. The inner brand-sep stays at
   the parent .wm-release size (11px scaled) for proportion; only the
   tagline lowercases and uses Orbitron. */
.header-brand .brand-distant-blue { opacity: 0.85; }
.header-brand .sub {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color);
  letter-spacing: 0.3px; padding: 2px 8px;
  background: var(--glass); border: 1px solid var(--glass-border); border-radius: 20px;
}
.header-brand .dot { width: 4px; height: 4px; border-radius: 50%; background: var(--border2); }

/* ── Project block in header — name + meta line, sized to meta width ──
   Sits to the right of the brand lockup. JS measures .project-meta width
   and applies it as max-width on .project-name so the name truncates to
   exactly the meta line's width. See _renderProjectMeta in 24-auth.js. */
.brand-divider {
  width: 1px; background: var(--border2);
  margin: 4px 4px;
  /* Stretch to brand area height — set via flex parent */
  min-height: 32px; align-self: stretch;
}
.project-block {
  display: flex; flex-direction: column;
  gap: 1px; min-width: 0;
}
.project-name {
  font-family: var(--sans);
  font-size: calc(14px * var(--fs, 1));
  font-weight: 600; color: var(--text-light-color);
  letter-spacing: -0.1px; line-height: 1.25;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  /* max-width set by _renderProjectMeta() to match .project-meta width */
}
.project-name--placeholder {
  font-style: italic; color: var(--text-dark-color); font-weight: 500;
}
.project-meta {
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color);
  display: inline-flex; align-items: center; gap: 7px;
  line-height: 1.4; white-space: nowrap;
  width: max-content;
}
.project-meta .dot-sep {
  width: 3px; height: 3px; border-radius: 50%;
  background: var(--text-dark-color); opacity: 0.5; flex-shrink: 0;
}
.project-meta .hdr-saved {
  display: inline-flex; align-items: center; gap: 5px;
  color: var(--text-dark-color);
}
.project-meta .hdr-saved .live-dot {
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--green);
  box-shadow: 0 0 4px rgb(from var(--green) r g b / 0.4);
  flex-shrink: 0;
}
.project-meta .hdr-saved.unsaved { color: var(--button-color); }
.project-meta .hdr-saved.unsaved .live-dot {
  background: var(--button-color);
  box-shadow: 0 0 4px rgb(from var(--button-color) r g b / 0.5);
}
.project-meta .hdr-saved.saving { color: var(--info); }
.project-meta .hdr-saved.saving .live-dot {
  background: var(--info);
  box-shadow: 0 0 4px rgb(from var(--info) r g b / 0.5);
}
.project-meta .hdr-saved.error { color: var(--red); }
.project-meta .hdr-saved.error .live-dot {
  background: var(--red);
  box-shadow: 0 0 4px rgb(from var(--red) r g b / 0.5);
}
/* Phase segment in meta line — picks up the same color the badge used */
.project-meta .phase {
  cursor: pointer; transition: color var(--dur-fast);
}
.project-meta .phase:hover { color: var(--text-mid-color); }

/* ── Header icon button (? for help) ──────────────────────────── */
.hdr-btn-icon {
  width: 30px; height: 30px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--mono);
  font-size: calc(14px * var(--fs, 1));
  font-weight: 600; line-height: 1;
}

/* Header dropdown menu */
.hdr-menu-wrap { position: relative; }
.hdr-menu {
  display: none;
  position: absolute; top: calc(100% + 6px); right: 0;
  background: var(--midground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  box-shadow: var(--shadow-lg);
  min-width: 170px;
  z-index: 400;
  overflow: hidden;
  animation: menuFadeIn 0.12s ease;
}
.hdr-menu.open { display: block; }
@keyframes menuFadeIn {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}
.hdr-menu-item {
  display: block; width: 100%;
  padding: 9px 14px;
  background: none; border: none;
  font-family: var(--sans); font-size: calc(12px * var(--fs, 1)); font-weight: 500;
  color: var(--text-mid-color); text-align: left; cursor: pointer;
  transition: background var(--dur-fast), color var(--dur-fast);
  white-space: nowrap;
}
.hdr-menu-item:hover { background: var(--glass2); color: var(--text-light-color); }
.hdr-menu-item + .hdr-menu-item { border-top: 1px solid var(--border); }

/* Global select option dark-mode fix */
select option { background: var(--foreground-color); color: var(--text-light-color); }

/* ── BUTTONS ── */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  padding: 6px 14px; border-radius: 20px; border: 1px solid transparent;
  font-family: var(--sans); font-size: calc(12px * var(--fs, 1)); font-weight: 500;
  letter-spacing: var(--ls-ui); cursor: pointer;
  transition: all var(--dur-slow) var(--ease-bounce);
  white-space: nowrap; -webkit-font-smoothing: antialiased;
}
.btn:active { transform: scale(0.96) !important; transition: transform var(--dur-fast) var(--ease-out); }
.btn-amber {
  background: var(--button-color); color: var(--btn-primary-ink); border-color: var(--button-color);
  font-weight: 600; box-shadow: 0 1px 4px rgb(from var(--button-color) r g b / 0.3);
}
.btn-amber:hover { background: var(--button-click-color); box-shadow: 0 2px 10px rgb(from var(--button-color) r g b / 0.45); }
.btn-ghost {
  background: var(--glass); color: var(--text-mid-color); border-color: var(--glass-border);
}
.btn-ghost:hover { background: var(--glass2); color: var(--text-light-color); border-color: var(--border2); }
/* .btn-secondary — self-contained alias used in 12 places across
   index.html (project info: Set Location on Map / Set Password /
   Clear Location / Rotate Password / Recent Access Log / Manage
   Notices), 40-project-location.js (map modal Cancel button), and
   42-field-audit.js (toolbar buttons). These call sites use the
   class standalone (not as a modifier on .btn), so it has to bring
   its own base button styling. Visual matches .btn + .btn-ghost
   for consistency. Define here rather than sweep-rename so the
   12 call sites don't all need touching. */
.btn-secondary {
  display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  padding: 6px 14px; border-radius: 20px;
  border: 1px solid var(--glass-border);
  background: var(--glass); color: var(--text-mid-color);
  font-family: var(--sans); font-size: calc(12px * var(--fs, 1)); font-weight: 500;
  letter-spacing: var(--ls-ui); cursor: pointer;
  transition: all var(--dur-slow) var(--ease-bounce);
  white-space: nowrap; -webkit-font-smoothing: antialiased;
}
.btn-secondary:hover { background: var(--glass2); color: var(--text-light-color); border-color: var(--border2); }
.btn-secondary:active { transform: scale(0.96); transition: transform var(--dur-fast) var(--ease-out); }
.btn-secondary:disabled { opacity: 0.35; cursor: not-allowed; transform: none; }
/* .btn-primary — single-use alias at 40-project-location.js:210
   (map modal Save button). Acts as the canonical primary action,
   visually identical to .btn + .btn-amber. Self-contained because
   the call site uses the class standalone, not as a modifier. */
.btn-primary {
  display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  padding: 6px 14px; border-radius: 20px;
  border: 1px solid var(--button-color);
  background: var(--button-color); color: var(--btn-primary-ink);
  font-family: var(--sans); font-size: calc(12px * var(--fs, 1)); font-weight: 600;
  letter-spacing: var(--ls-ui); cursor: pointer;
  transition: all var(--dur-slow) var(--ease-bounce);
  white-space: nowrap; -webkit-font-smoothing: antialiased;
  box-shadow: 0 1px 4px rgb(from var(--button-color) r g b / 0.3);
}
.btn-primary:hover { background: var(--button-click-color); border-color: var(--button-click-color); box-shadow: 0 2px 10px rgb(from var(--button-color) r g b / 0.45); }
.btn-primary:active { transform: scale(0.96); transition: transform var(--dur-fast) var(--ease-out); }
.btn-primary:disabled { opacity: 0.35; cursor: not-allowed; transform: none; }
/* .btn-green — single-use class at 28-field-activity.js:298 for
   the RFI triage "Accept" button. Positive-action variant of .btn,
   same visual treatment as .btn-cyan / .btn-danger. Self-contained
   because the call site combines it as `btn btn-green btn-sm` —
   .btn supplies base layout, .btn-sm shrinks it, .btn-green
   provides the green color. Defined here as a thin layer on top
   of .btn assumptions (call site brings .btn). */
.btn-green {
  background: rgb(from var(--green) r g b / 0.10);
  color: var(--green);
  border-color: rgb(from var(--green) r g b / 0.22);
}
.btn-green:hover { background: rgb(from var(--green) r g b / 0.2); }
.btn-danger { background: rgb(from var(--red) r g b / 0.10); color: var(--red); border-color: rgb(from var(--red) r g b / 0.22); }
.btn-danger:hover { background: rgb(from var(--red) r g b / 0.2); }
.btn-cyan { background: rgb(from var(--cyan-tint-color) r g b / 0.10); color: var(--cyan); border-color: rgb(from var(--cyan-tint-color) r g b / 0.22); }
.btn-cyan:hover { background: rgb(from var(--cyan-tint-color) r g b / 0.2); }
.btn-sm { padding: 4px 11px; font-size: clamp(10px, calc(11px * var(--fs, 1)), 13px); border-radius: 16px; min-width: 0; white-space: nowrap; }
.btn:disabled { opacity: 0.35; cursor: not-allowed; transform: none !important; }

/* ── LAYOUT ── */
.layout { display: grid; grid-template-columns: 252px 1fr; min-height: calc(100vh - 80px); }

/* ── SIDEBAR ── */
/* Free-standing card treatment: full border + 16px corner radius mirror
   the .output-card on the right. The sticky-top of 90px (52 header +
   38 visual gap) plus matching margin-top: 38px parks the sidebar's top
   edge at the same viewport y-coordinate as the .output-card's top edge
   (.main padding-top 22 + .output-card margin-top 16 = 38), so the two
   panels visually align below the header at all scroll positions.
   12px left margin gives the rounded left corners somewhere to breathe;
   16px bottom margin matches the corner radius for symmetric framing.
   Mobile media queries below override these for the fixed-drawer mode. */
.sidebar {
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  position: sticky; top: 90px;
  margin: 38px 0 16px 12px;
  height: calc(100vh - 106px);
  display: flex; flex-direction: column;
  /* overflow-y:auto so users can scroll the sidebar to reach Tools and
     Templates sections when content exceeds the sidebar's visible height
     (e.g. on shorter viewports or with many expanded sections). The inner
     .sidebar-scroll on the zone list still has its own scroll for the
     rooms list itself; scroll chaining handles both naturally. */
  overflow-y: auto;
  overscroll-behavior: contain;
}
/* ── Undo/Redo pill group ─────────────────────────────────── */
.hdr-undo-group {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--border2);
  border-radius: var(--r);
  overflow: hidden;
  background: var(--foreground-color);
  flex-shrink: 0;
}
.hdr-undo-group button {
  background: none;
  border: none;
  color: var(--text-mid-color);
  font-size: 13px;
  padding: 5px 11px;
  cursor: pointer;
  line-height: 1;
  font-family: var(--mono);
  transition: background var(--dur-base), color var(--dur-base);
}
.hdr-undo-group button:hover:not(:disabled) {
  background: var(--surface-glass-faint);
  color: var(--text-light-color);
}
.hdr-undo-group button:disabled {
  opacity: 0.28;
  cursor: default;
}
.hdr-undo-group button:first-child {
  border-right: 1px solid var(--border2);
}

/* ── Takeoff outlined button ──────────────────────────────── */
.btn-outline {
  background: transparent;
  border-color: var(--button-color);
  color: var(--button-color);
}
.btn-outline:hover {
  background: var(--button-color);
  color: var(--background-color);
}
.hdr-takeoff-btn {
  font-weight: 600;
  letter-spacing: 0.02em;
}

.sidebar-top {
  padding: 14px 12px; border-bottom: 1px solid var(--border); flex-shrink: 0;
}
.sidebar-label {
  font-family: var(--sans); font-size: calc(10px * var(--fs, 1)); font-weight: 600;
  letter-spacing: 0.5px; color: var(--text-dark-color); text-transform: uppercase; margin-bottom: 8px;
}
.sb-select {
  width: 100%; padding: 7px 10px;
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color);
  font-family: var(--sans); font-size: calc(12px * var(--fs, 1));
  /* margin-bottom was 6px originally; later "Desktop polish" section
     set this to 0 unconditionally (no media query). Consolidating
     2026-05-19 — current effective value is 0. */
  margin-bottom: 0;
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%238e8e93'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center; cursor: pointer;
  transition: border-color var(--dur-base), box-shadow var(--dur-base);
}
.sb-select option { background: var(--foreground-color); color: var(--text-light-color); }
.sb-select:focus { outline: none; border-color: var(--button-color); box-shadow: 0 0 0 3px rgb(from var(--button-color) r g b / 0.14); }
.sb-btn-row {
  /* Grid replaces an earlier flex+wrap version (2026-05-19 consolidation).
     The grid layout was added later in the file and was already winning
     via cascade order; consolidating here to make it source-of-truth. */
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 4px;
  margin-top: 6px;
}
.sidebar-scroll {
  flex: 1; overflow-y: auto;
  padding: 6px 6px;
  /* Drafting-paper treatment: faint cyan-dot grid on a paper-tone bg.
     Reinforces the engineering / CAD aesthetic from the brand voice
     and the referral landing page without being distracting (dots are
     0.06 opacity at 14px spacing). The zone blocks become "items pinned
     onto a drawing sheet" via their cyan accent stripe (see .zone-group). */
  background:
    radial-gradient(circle at 1px 1px, rgb(from var(--accent-photometric) r g b / 0.06) 1px, transparent 1px),
    var(--midground-color);
  background-size: 14px 14px, 100% 100%;
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}
.sidebar-scroll::-webkit-scrollbar { width: 3px; }
.sidebar-scroll::-webkit-scrollbar-thumb { background: var(--foreground-color); border-radius: 3px; }

/* ── Sidebar v2 — sectioned layout (Rooms / Tools / Templates) ──────
   Each section is collapsible via the chevron in its header. The
   Rooms section grows to fill remaining space; Tools and Templates
   sit at fixed heights below it. */
.sb-section {
  display: flex; flex-direction: column; min-height: 0;
  background: var(--sidebar-section);
  border-radius: var(--r-sm);
  margin: 6px 8px;
  /* The previous version used border-bottom hairlines to separate
     adjacent sections. With the new --sidebar-section background
     creating its own visual separation against the sidebar shell
     (--navy2), the hairlines became redundant noise. The 6px gap
     between sections (margin top+bottom) plus the bg contrast
     reads as a cleaner card stack. First and last sections still
     get even spacing because each has its own margin. */
}
.sb-section--grow { flex: 1; min-height: 0; }
.sb-section-hdr {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 12px; cursor: pointer; user-select: none;
  transition: background var(--dur-fast);
}
.sb-section-hdr:hover { background: var(--glass); }
.sb-section-toggle {
  font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color);
  transition: transform var(--dur-base);
  width: 10px; flex-shrink: 0;
}
.sb-section-toggle.closed { transform: rotate(-90deg); }
.sb-section-title {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  font-weight: 600; letter-spacing: 1.4px; color: var(--text-dark-color);
  text-transform: uppercase; flex: 1;
}
.sb-section-action {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color);
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r-sm);
  cursor: pointer; padding: 4px 8px;
  letter-spacing: 0.8px;
  transition: border-color var(--dur-fast) ease, color var(--dur-fast) ease;
}
.sb-section-action:hover {
  border-color: var(--button-color);
  color: var(--text-mid-color);
}
.sb-section-body {
  padding: 0 10px 12px;
  transition: max-height var(--dur-slow), opacity var(--dur-base);
  overflow: hidden;
}
.sb-section-body--collapsed {
  max-height: 0 !important; opacity: 0;
  padding-top: 0 !important; padding-bottom: 0 !important;
}

/* Primary add buttons (amber, full-width). Used for both + Add Room
   and + Add Space at the top of the Rooms section. Text color is one
   shared token (--sb-primary-add-ink) so the two buttons stay visually
   in sync — set once, applies to both. */
.sb-primary-add {
  width: 100%; background: var(--button-color); color: var(--sb-primary-add-ink);
  font-family: var(--mono); font-size: calc(12px * var(--fs, 1));
  font-weight: 600; padding: 9px 10px; border-radius: var(--r-sm);
  border: 1px solid var(--button-color); cursor: pointer;
  letter-spacing: 0.3px;
  transition: background var(--dur-base), border-color var(--dur-base);
}
.sb-primary-add + .sb-primary-add { margin-top: 6px; }
.sb-primary-add:hover { background: var(--button-click-color); border-color: var(--button-click-color); }

/* Search input with icon prefix — replaces .sb-search-wrap.
   The icon sits inside the input via absolute positioning. */
.sb-search-v2 { position: relative; margin-top: 10px; }
.sb-search-v2 input {
  width: 100%; padding: 7px 28px 7px 30px;
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color);
  font-family: var(--sans); font-size: calc(11px * var(--fs, 1));
  outline: none; transition: border-color var(--dur-base);
}
.sb-search-v2 input:focus { border-color: var(--button-color); }
.sb-search-v2 input::placeholder { color: var(--text-dark-color); }
.sb-search-v2-icon {
  position: absolute; left: 10px; top: 50%; transform: translateY(-50%);
  color: var(--text-dark-color); font-size: calc(11px * var(--fs, 1));
  pointer-events: none; font-family: var(--mono);
}
.sb-search-v2-clear {
  position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  background: none; border: none; color: var(--text-dark-color); cursor: pointer;
  font-size: 14px; line-height: 1; padding: 2px 6px;
  display: none;
}
.sb-search-v2-clear.visible { display: block; }

/* Tools section — icon + label rows. Hover gives a subtle bg + border. */
.sb-tool-btn {
  display: block; width: 100%;
  background: var(--glass);
  border: 1px solid var(--border2);
  border-radius: var(--r-sm);
  padding: 7px 10px;
  color: var(--text-mid-color);
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  letter-spacing: 0.4px;
  cursor: pointer; text-align: center;
  transition: border-color var(--dur-base) ease, color var(--dur-base) ease, background var(--dur-base) ease;
  white-space: nowrap;
}
.sb-tool-btn + .sb-tool-btn { margin-top: 6px; }
.sb-tool-btn:hover {
  border-color: var(--button-color);
  color: var(--button-color);
  background: var(--glass2);
}
.sb-tool-label { display: inline; }

/* Templates section — chip list + mini button row, scoped to v2 layout. */
.sb-tmpl-chip-list {
  display: flex; gap: 5px; flex-wrap: wrap;
  margin-bottom: 8px; min-height: 16px;
}
.sb-tmpl-empty {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); font-style: italic;
}
.sb-tmpl-actions { display: flex; gap: 4px; }
.sb-tmpl-mini-btn {
  flex: 1; font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-mid-color); background: var(--glass);
  border: 1px solid var(--border2); border-radius: var(--r-sm);
  padding: 5px 6px; cursor: pointer; text-align: center;
  transition: all var(--dur-base); white-space: nowrap;
}
.sb-tmpl-mini-btn:hover { border-color: var(--button-color); color: var(--button-color); }
/* Hide the Import file input — its label triggers the file picker */
.sb-tmpl-mini-btn input[type="file"] { display: none; }

.zone-group {
  margin-bottom: 8px;
  background: var(--zone-card);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  overflow: hidden;
  box-shadow: 0 1px 2px var(--shadow-subtle-low);
  position: relative;
}
/* Cyan accent stripe on the left edge — reads like drafting tape pinning
   the card onto the paper background. Drives the engineering/CAD voice
   without needing a heavy border. */
.zone-group::before {
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
  background: var(--accent-zone);
  opacity: 0.7;
  pointer-events: none;
}
.zone-header {
  display: flex; align-items: center; gap: 6px; padding: 8px 10px 8px 13px;
  background: var(--zone-card);
  border-bottom: 1px dashed var(--border);
  cursor: pointer; user-select: none;
  transition: background var(--dur-fast) ease;
}
.zone-header:hover { background: rgb(from var(--accent-zone) r g b / 0.04); }
.zone-name-edit {
  flex: 1; font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); font-weight: 600;
  color: var(--accent-zone); background: none; border: none; outline: none; cursor: text; min-width: 0;
}
.zone-name-edit::placeholder { color: var(--text-dark-color); }
.zone-toggle { font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color); transition: transform var(--dur-slow); }
.zone-toggle.closed { transform: rotate(-90deg); }
.zone-rooms { padding: 4px 4px 4px 9px; display: flex; flex-direction: column; gap: 2px; }
.zone-rooms.hidden { display: none; }
.zone-add { padding: 4px 6px; }

.room-item {
  display: flex; align-items: center; gap: 6px; padding: 6px 8px;
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-radius: var(--r-sm); cursor: pointer;
  transition: background var(--dur-base), border-color var(--dur-base), box-shadow var(--dur-base);
}
.room-item:hover { background: var(--foreground-color); border-color: var(--accent-zone); }
.room-item.active {
  background: rgb(from var(--button-color) r g b / 0.09);
  border-color: rgb(from var(--button-color) r g b / 0.28);
  box-shadow: inset 2px 0 0 var(--button-color);
}
.room-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; transition: background-color var(--dur-slow) ease, box-shadow var(--dur-slow) ease; }
.room-label { flex: 1; font-size: calc(11px * var(--fs, 1)); font-family: var(--sans); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.room-label .rname { color: var(--text-light-color); font-weight: 500; }
.room-label .rtype { color: var(--text-dark-color); font-size: calc(9px * var(--fs, 1)); display: block; }
.room-acts { display: flex; gap: 1px; opacity: 0; transition: opacity var(--dur-base); }
.room-item:hover .room-acts { opacity: 1; }
.room-acts button {
  background: none; border: none; cursor: pointer; color: var(--text-dark-color);
  font-size: calc(10px * var(--fs, 1)); padding: 2px 5px; border-radius: var(--r-sm); transition: all var(--dur-fast);
}
.room-acts button:hover { background: var(--glass2); color: var(--text-light-color); }
.room-acts button.del:hover { color: var(--red); }

/* ── MAIN ── */
.main {
  padding: 22px 26px;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  min-height: 0;
}

/* ── CARD ── */
.card {
  background: var(--midground-color); border: 1px solid var(--border);
  border-radius: var(--r-lg); margin-bottom: 12px;
  box-shadow: var(--shadow-sm); overflow: hidden; transition: box-shadow var(--dur-slow);
}
.card:hover { box-shadow: var(--shadow-md); }
.card-header {
  padding: 12px 18px; border-bottom: 1px solid var(--border);
  display: flex; align-items: center; gap: 10px; background: var(--glass);
}
.card-header h2 {
  font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); font-weight: 600;
  letter-spacing: 0.4px; text-transform: uppercase; color: var(--text-dark-color); flex: 1;
}
.card-body { padding: 18px; }

/* ── PROJECT INFO GRID ── */
.proj-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 12px; }
.proj-grid.full { grid-template-columns: 1fr; }

.fg { display: flex; flex-direction: column; gap: 4px; }
.fg label {
  font-family: var(--sans); font-size: calc(10px * var(--fs, 1)); font-weight: 600;
  letter-spacing: 0.3px; text-transform: uppercase; color: var(--text-dark-color);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.fg input, .fg select, .fg textarea {
  padding: 8px 11px; background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color); font-family: var(--sans);
  font-size: calc(13px * var(--fs, 1)); line-height: 1.5; width: 100%;
  transition: border-color var(--dur-base), box-shadow var(--dur-base), background var(--dur-base);
}
.fg input:hover:not(:focus), .fg select:hover:not(:focus), .fg textarea:hover:not(:focus) {
  border-color: var(--border2);
  background-color: var(--foreground-color);
}
.fg select option { background: var(--foreground-color); color: var(--text-light-color); }
.fg input:focus, .fg select:focus, .fg textarea:focus {
  outline: none; border-color: var(--button-color); box-shadow: 0 0 0 3px rgb(from var(--button-color) r g b / 0.14);
}
.fg textarea { resize: vertical; min-height: 72px; line-height: 1.65; }
.fg select {
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%238e8e93'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center; cursor: pointer;
}

/* ── TOGGLE PILLS ── */
.pill-group { display: flex; gap: 5px; flex-wrap: wrap; }
.pill {
  padding: 5px 13px; border-radius: 20px; border: 1px solid var(--border2);
  background: var(--glass); font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); font-weight: 500;
  cursor: pointer; transition: background var(--dur-base), border-color var(--dur-base), color var(--dur-base), transform var(--dur-fast); color: var(--text-mid-color);
}
.pill:hover { border-color: rgb(from var(--button-color) r g b / 0.4); color: var(--button-color); background: var(--glass2); }
.pill:active { transform: scale(0.95); }
.pill.on { background: rgb(from var(--button-color) r g b / 0.13); border-color: var(--button-color); color: var(--button-color); }
.pill.on:hover { background: rgb(from var(--button-color) r g b / 0.2); }

/* ── DIVIDER ── */
.hr { border: none; border-top: 1px solid var(--border); margin: 14px 0; }

/* ── CAT SECTIONS ── */
.cat-section { border: 1px solid var(--border2); border-radius: var(--r); margin-bottom: 10px; overflow: hidden; box-shadow: var(--shadow-sm); }
.cat-hdr {
  display: flex; align-items: center; gap: 10px; padding: 10px 14px;
  cursor: pointer; user-select: none; border-radius: var(--r-sm);
  transition: background var(--dur-fast) ease;
}
.cat-hdr:hover { background: rgb(from var(--text-mid-color) r g b / 0.03); }
.cat-pip { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.cat-title { font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); font-weight: 600; letter-spacing: 0.2px; text-transform: uppercase; flex: 1; color: var(--text-light-color); }
.cat-sup { font-size: calc(9px * var(--fs, 1)); font-family: var(--mono); opacity: 0.55; font-style: italic; }
.cat-arr { font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); transition: transform var(--dur-slow); }
.cat-arr.open { transform: rotate(180deg); }
.cat-body {
  padding: 14px;
  border-top: 1px solid var(--border);
  background: var(--midground-color);
  overflow: hidden;
  max-height: 0;
  opacity: 0;
  transition: max-height var(--dur-slow) var(--ease-out),
              opacity var(--dur-slow) ease,
              padding var(--dur-slow) ease;
  padding-top: 0; padding-bottom: 0;
}
.cat-body.open {
  max-height: 2000px;
  opacity: 1;
  padding-top: 14px;
  padding-bottom: 14px;
}
.cat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 10px; align-items: start; }
.cat-grid.two { grid-template-columns: 1fr 1fr; align-items: start; }
.cat-grid.one { grid-template-columns: 1fr; }

.cat-alert { padding: 8px 12px; border-radius: var(--r-sm); font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); margin-bottom: 10px; }

.chk-row { display: flex; align-items: center; gap: 8px; padding: 5px 0; }
.chk-row input[type=checkbox] { width: 15px; height: 15px; cursor: pointer; accent-color: var(--button-color); flex-shrink: 0; }
.chk-row label { font-family: var(--sans); font-size: calc(12px * var(--fs, 1)); cursor: pointer; color: var(--text-mid-color); line-height: 1.5; }

/* ── ROOM EDITOR HEADER ── */
.room-editor-top { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; padding-bottom: 16px; border-bottom: 1px solid var(--border); }
.re-name {
  font-family: var(--sans); font-size: calc(20px * var(--fs, 1)); font-weight: 700; color: var(--text-light-color);
  background: none; border: none; border-bottom: 2px solid var(--border2); outline: none;
  padding: 2px 4px; transition: border-color var(--dur-base); min-width: 200px; letter-spacing: -0.3px;
}
.re-name:focus { border-bottom-color: var(--button-color); }
.re-tag { font-family: var(--sans); font-size: calc(10px * var(--fs, 1)); font-weight: 600; letter-spacing: 0.2px; text-transform: uppercase; padding: 3px 10px; border-radius: 20px; border: 1px solid; }

/* ── EMPTY STATE ── */
.empty { text-align: center; padding: 80px 20px; }
.empty .e-title { font-family: var(--sans); font-size: calc(22px * var(--fs, 1)); font-weight: 700; color: var(--text-light-color); letter-spacing: -0.5px; margin-bottom: 8px; }
.empty .e-sub { font-size: calc(14px * var(--fs, 1)); color: var(--text-dark-color); margin-bottom: 32px; }

/* Onboarding */
/* Onboard hero — the welcome-card wordmark + tagline + slogan
   shown on the empty editor state. Wordmark must visually match
   the header's .brand-orizon1 lockup (uppercase, 0.2em tracking,
   stroked letters). v26.05.05: previously the bottom wordmark
   was rendered as "Orizon1" mixed-case at -0.5px tracking and
   without a stroke, so it didn't read as the same mark as the
   header. text-transform:uppercase here is the right place to
   force casing — the source string from appWordmark() is mixed-
   case ("Orizon"), and we don't want to change APP_NAME_PART1
   because it's also used in plain-text contexts (toasts, alerts,
   etc) where uppercase would look shouty. */
.onboard-hero { margin-bottom: 36px; }
.onboard-logo {
  font-family: var(--sans);
  font-size: calc(32px * var(--fs, 1));
  font-weight: 700;
  color: var(--text-light-color);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  /* The 0.2em tracking adds visual whitespace AFTER the last
     letter; pull it back a fraction so the lockup doesn't drift
     right of true center. Matches .brand-orizon1's 0.05em pad. */
  padding-right: 0.05em;
  margin-bottom: 6px;
}
.onboard-logo em      { color: var(--wm-orizon); font-style: normal; -webkit-text-stroke: 1px var(--wm-stroke); paint-order: stroke fill; }
.onboard-logo .wm-ver { color: var(--wm-one);    font-style: normal; -webkit-text-stroke: 1px var(--wm-stroke); paint-order: stroke fill; }
.onboard-tagline { font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); color: var(--button-color); letter-spacing: 1px; text-transform: uppercase; margin-bottom: 12px; }
.onboard-desc { font-size: calc(14px * var(--fs, 1)); color: var(--text-dark-color); max-width: 540px; margin: 0 auto; line-height: 1.6; }
.onboard-steps { display: flex; align-items: stretch; justify-content: center; gap: 0; flex-wrap: wrap; margin-bottom: 40px; max-width: 860px; margin-left: auto; margin-right: auto; }
.onboard-step { background: var(--glass); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 20px 18px; flex: 1; min-width: 160px; max-width: 200px; text-align: left; display: flex; flex-direction: column; cursor: pointer; transition: border-color var(--dur-base), background var(--dur-base), transform var(--dur-fast); user-select: none; }
@media (hover: hover) {
  .onboard-step:hover { border-color: var(--button-color); background: rgb(from var(--button-color) r g b / 0.07); transform: translateY(-2px); }
}
.onboard-step:active { transform: translateY(0); background: rgb(from var(--button-color) r g b / 0.12); }
.onboard-step-arrow { align-self: center; color: var(--text-dark-color); font-size: calc(18px * var(--fs, 1)); padding: 0 8px; flex-shrink: 0; }
.onboard-step-num { width: 26px; height: 26px; border-radius: 50%; background: var(--button-color); color: var(--btn-primary-ink); font-family: var(--sans); font-size: calc(13px * var(--fs, 1)); font-weight: 700; display: flex; align-items: center; justify-content: center; margin-bottom: 10px; }
.onboard-step-title { font-family: var(--sans); font-size: calc(13px * var(--fs, 1)); font-weight: 700; color: var(--text-light-color); margin-bottom: 6px; }
.onboard-step-sub { font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); color: var(--text-dark-color); line-height: 1.5; }
.onboard-step-sub strong { color: var(--text-mid-color); font-weight: 600; }
.onboard-divider { display: flex; align-items: center; gap: 14px; margin-bottom: 24px; color: var(--text-dark-color); font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); letter-spacing: 0.5px; text-transform: uppercase; }
.onboard-divider::before, .onboard-divider::after { content: ''; flex: 1; height: 1px; background: var(--border); }
.onboard-hint { margin-top: 28px; font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); background: var(--glass); border: 1px solid var(--border); border-radius: var(--r); padding: 8px 16px; display: inline-block; }
kbd { display: inline-block; background: var(--glass2); border: 1px solid var(--border2); border-radius: 4px; padding: 1px 6px; font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-mid-color); }

.version-badge {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); font-weight: 500;
  color: var(--text-dark-color); letter-spacing: 0.3px;
  padding: 2px 6px; border-radius: 20px;
  background: var(--glass); border: 1px solid var(--glass-border);
  align-self: center; margin-left: 2px;
}

/* Save indicator */
.save-indicator { width: 7px; height: 7px; border-radius: 50%; background: transparent; border: 1.5px solid transparent; transition: all 0.3s; flex-shrink: 0; cursor: default; }
.save-indicator.unsaved { background: var(--button-color); border-color: var(--button-color); box-shadow: 0 0 6px rgb(from var(--button-color) r g b / 0.5); animation: savePulse 1.2s ease infinite; }
.save-indicator.error { background: var(--red); border-color: var(--red); box-shadow: 0 0 6px rgb(from var(--red) r g b / 0.6); animation: none; cursor: pointer; width: auto; height: auto; border-radius: 3px; padding: 2px 7px; font-family: var(--mono); font-size: 9px; letter-spacing: 0.5px; color: var(--text-mid-color); border-width: 1px; }
@keyframes savePulse { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } }
.preset-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 8px; max-width: 680px; margin: 0 auto; }
.preset-tile {
  background: var(--midground-color); border: 1px solid var(--border); border-radius: var(--r);
  padding: 16px 10px; cursor: pointer; text-align: center; box-shadow: var(--shadow-sm);
  transition: all var(--dur-slow) var(--ease-bounce);
}
@media (hover: hover) {
  .preset-tile:hover { border-color: var(--button-color); transform: translateY(-3px) scale(1.02); box-shadow: var(--shadow-md); }
}
.preset-tile .pt-icon { font-size: calc(24px * var(--fs, 1)); margin-bottom: 6px; }
.preset-tile .pt-name { font-family: var(--sans); font-size: calc(10px * var(--fs, 1)); font-weight: 600; letter-spacing: 0.3px; color: var(--text-mid-color); text-transform: uppercase; }

/* ── OUTPUT SECTION ──
   .output-card was a single rounded container holding the documentation
   header, tab strip, and content panes. v26.04.27 split this into THREE
   independently floating rounded cards: .output-card-header, the tabs
   row (.out-tabs sitting in .out-tabs-wrap), and .pane-content. The
   .output-card itself is now a transparent vertical layout wrapper —
   children carry their own bg/border/radius/shadow. Print rules in
   _pdf.css are unaffected: they hide .output-card-header, .out-tabs,
   and the new .out-tabs-wrap entry, and reset .output-card to neutral. */
.output-card {
  background: transparent;
  border: none;
  border-radius: 0;
  margin-top: 16px;
  margin-bottom: 32px;
  overflow: visible;
  box-shadow: none;
  display: block;
  min-width: 0;
  /* v26.04.27 polish: cap the entire output area at 1600px and center
     on wider viewports. Without this, on 4K monitors the floating bars
     stretched to fill ~3000+px while .pane-content was capped at 1600px
     internally — leaving the bars visibly wider than their content. By
     capping the parent .output-card, every floating descendant (bars
     and panes alike) is constrained to the same width and they always
     line up. The viewport-edge scrollbar stays where it is — only the
     inner content is centered. The 1600px cap is a comfortable upper
     bound: wide enough that data-dense panes (Matrix, Schedule, Budget)
     still get plenty of horizontal room; narrow enough that on a 4K
     monitor the form fields fill their pane instead of tiling 8 wide. */
  max-width: 1600px;
  margin-left: auto;
  margin-right: auto;
}
.output-card-header {
  padding: 13px 20px;
  background: var(--glass);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-sm);
  margin: 0 12px 12px 12px;
  display: flex; align-items: center; gap: 10px;
  flex-shrink: 0;
}
.output-card-header h2 { font-family: var(--sans); font-size: calc(12px * var(--fs, 1)); font-weight: 700; letter-spacing: 0.2px; text-transform: uppercase; color: var(--button-color); flex: 1; }
/* Consistent pane title — matches // Project Documentation header */
.out-pane-title { font-family: var(--sans); font-size: calc(12px * var(--fs, 1)); font-weight: 700; letter-spacing: 0.2px; text-transform: uppercase; color: var(--button-color); margin: 0; white-space: nowrap; flex-shrink: 0; }
.out-pane-hdr {
  display: flex; align-items: center; gap: 12px;
  padding: 14px 20px 12px; flex-wrap: nowrap; flex-shrink: 0;
  /* Rounded-square card with full border + soft shadow.
     Sits as an elevated card above the tab strip, with breathing room
     on both sides. Top margin pulls it away from the wordmark header's
     bottom edge so its rounded corners don't visually clash with the
     hairline above. Bottom margin creates the gap before the tab strip. */
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  background: var(--glass);
  margin: 12px 12px 12px;
  box-shadow:
    0 1px 0 rgb(from var(--text-mid-color) r g b / 0.4) inset,
    0 1px 2px rgb(from var(--text-light-tint-color) r g b / 0.05),
    0 2px 4px var(--shadow-subtle-low);
  width: auto;
  box-sizing: border-box;
}
/* Stacked variant — title above subtitle on separate lines.
   Used by panes where the subtitle is a longer descriptive sentence
   that doesn't fit cleanly inline. Apply by adding the modifier class
   to the .out-pane-hdr element:
       <div class="out-pane-hdr out-pane-hdr--stacked">
         <h2 class="out-pane-title">// Title</h2>
         <span class="out-pane-sub">Longer subtitle goes here…</span>
       </div>
   The modifier overrides the base flex layout so the children stack
   vertically, and lets the subtitle wrap naturally instead of truncating
   with an ellipsis. Title still keeps its own line. */
.out-pane-hdr--stacked {
  flex-direction: column;
  align-items: flex-start;
  gap: 4px;
}
.out-pane-hdr--stacked > .out-pane-sub {
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
}
/* Compact variant — reduced padding + inline layout. Used for
   panes that have many sub-tabs (e.g., Project Admin sub-panes)
   where the standard stacked header eats too much vertical real
   estate. Title and subtitle on one line; subtitle truncates
   with ellipsis if the row gets tight. Apply with:
       <div class="out-pane-hdr out-pane-hdr--compact">
         <h2 class="out-pane-title">// Title</h2>
         <span class="out-pane-sub">Subtitle…</span>
       </div>
   The compact variant inherits the standard horizontal flex
   layout from .out-pane-hdr; we just override padding and the
   title's font size. */
.out-pane-hdr--compact {
  padding: 8px 16px 6px;
  margin: 8px 12px 8px;
  gap: 14px;
}
.out-pane-hdr--compact > .out-pane-title {
  font-size: calc(13px * var(--fs, 1));
  letter-spacing: 0.4px;
}
/* ── Pass D — Type designator badge (Lighting + Controls Legends) ──
   Editable counterpart to the legacy static circular type-mark badge.
   Visual: 32px amber-bordered circle, amber centered text, monospace.
   Behavior: text input (not contenteditable) so onchange fires
   reliably on blur and Enter, validation toasts run via the
   set-type-mark CONTENT_CHANGES handler. Up to 6 chars; longer
   designators get truncated by maxlength on the input itself. */
.type-mark-input {
  width: 36px;
  height: 32px;
  border: 2px solid var(--button-color);
  border-radius: 50%;
  background: transparent;
  color: var(--button-color);
  font-family: var(--mono);
  font-size: calc(9px * var(--fs, 1));
  font-weight: 700;
  text-align: center;
  text-transform: uppercase;
  padding: 0 2px;
  letter-spacing: 0.3px;
  outline: none;
  transition: background var(--dur-fast), box-shadow var(--dur-fast);
  box-sizing: border-box;
}
.type-mark-input:hover {
  background: rgb(from var(--button-color) r g b / 0.08);
}
.type-mark-input:focus {
  background: rgb(from var(--button-color) r g b / 0.12);
  box-shadow: 0 0 0 2px rgb(from var(--button-color) r g b / 0.30);
}
.type-mark-input::placeholder {
  color: var(--text-dark-color);
  font-weight: 400;
  text-transform: none;
}
.out-pane-sub {
  font-family: var(--mono); font-size: calc(10px * var(--fs,1));
  color: var(--text-dark-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 1; min-width: 0;
}
.out-tabs-wrap {
  position: relative;
  display: flex;
  align-items: stretch;
  gap: 10px;
  padding: 0;
  margin: 0 12px 12px 12px;
  background: transparent;
  flex-shrink: 0;
}
.out-tabs-wrap::after { display: none; }
.out-tabs {
  display: flex;
  flex: 1;
  border-top: 1px solid var(--border);
  border-left: 1px solid var(--border);
  border-right: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  border-radius: var(--r-sm);
  box-shadow: var(--shadow-sm);
  background: var(--glass);
  overflow-x: auto;
  scrollbar-width: none;
  /* No inner padding — first/last tabs sit flush against the strip's
     rounded corners. Previously had `padding: 0 6px`, which left a 6px
     strip-bg gap visible on each side at most viewport widths (the
     "light blue leaking through" reported in v26.04.27 polish review).
     Active-tab corner-rounding rules below already curve the first/last
     tab tops to match the strip's outer curve, so the seam stays clean. */
  padding: 0;
  scroll-behavior: smooth;
  -webkit-overflow-scrolling: touch;
  min-width: 0;
}
/* .out-tabs scrollbar is hidden entirely later in this file
   (search ".out-tabs::-webkit-scrollbar { display: none; }").
   Earlier styled-scrollbar rules removed 2026-05-19 as dead. */
.out-tab { letter-spacing: var(--ls-ui); padding: 11px 14px; background: none; border: none; font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); font-weight: 500; text-transform: uppercase; cursor: pointer; color: var(--text-dark-color); border-bottom: 2px solid transparent; margin-bottom: -1px; transition: all var(--dur-base); white-space: nowrap; flex-shrink: 0; }
.out-tab:hover { color: var(--text-mid-color); background: var(--surface-glass-faint); }
.out-tab.active { color: var(--button-color); border-bottom-color: var(--button-color); font-weight: 600; border-radius: var(--r-sm) var(--r-sm) 0 0; }
/* End-tab corner rounding: when the first or last tab is active, its
   top corner needs to match the tab strip's outer curve so the visual
   doesn't kink at the strip's edge. */
.out-tab:first-child { border-top-left-radius: var(--r-sm); }
.out-tab:last-child  { border-top-right-radius: var(--r-sm); }
.out-tab-divider { width: 1px; background: var(--border); margin: 8px 4px; flex-shrink: 0; align-self: stretch; }
.help-nav-btn { display:block; width:100%; text-align:left; background:none; border:none; padding:6px 16px; font-family:var(--mono); font-size:11px; color:var(--text-dark-color); cursor:pointer; transition:all var(--dur-fast); white-space:nowrap; }
.help-nav-btn:hover { color:var(--text-light-color); background:var(--glass); }
.help-nav-btn.active { color:var(--button-color); background:rgb(from var(--button-color) r g b / 0.08); border-left:2px solid var(--button-color); padding-left:14px; }
/* Help nav section headers — red left-bar separator between groups (Getting Started, Room Editor, etc.) */
.u-menu-section-hdr { display:block; font-family:var(--mono); font-size:9px; font-weight:700; letter-spacing:1.5px; text-transform:uppercase; color:var(--text-dark-color); padding:14px 14px 6px; margin-top:10px; border-left:3px solid var(--red); background:rgba(var(--red-rgb), 0.04); }
.u-menu-section-hdr:first-child { margin-top:0; }
.help-h1 { font-family:var(--sans); font-size:18px; font-weight:700; color:var(--red); margin:0 0 6px; letter-spacing:-0.3px; }
.help-h2 { font-family:var(--mono); font-size:11px; font-weight:700; color:var(--red); letter-spacing:1.5px; text-transform:uppercase; margin:22px 0 10px; padding-bottom:5px; border-bottom:1px solid var(--border); }
.help-p  { margin:0 0 12px; color:var(--text-mid-color); font-size:13px; line-height:1.65; }
.help-tip { background:rgb(from var(--info) r g b / 0.08); border-left:3px solid var(--info); padding:10px 14px; border-radius:0 4px 4px 0; margin:12px 0; font-size:12px; color:var(--text-mid-color); }
.help-warn { background:rgb(from var(--button-color) r g b / 0.08); border-left:3px solid var(--button-color); padding:10px 14px; border-radius:0 4px 4px 0; margin:12px 0; font-size:12px; color:var(--text-mid-color); }
.help-kbd { display:inline-block; background:var(--foreground-color); border:1px solid var(--border2); border-radius:3px; padding:1px 6px; font-family:var(--mono); font-size:11px; color:var(--text-light-color); margin:0 2px; }
.help-table { width:100%; border-collapse:collapse; margin:12px 0; font-size:12px; }
.help-table th { text-align:left; padding:6px 10px; background:var(--foreground-color); color:var(--text-dark-color); font-family:var(--mono); font-size:10px; letter-spacing:0.5px; text-transform:uppercase; border:1px solid var(--border2); }
.help-table td { padding:7px 10px; border:1px solid var(--border2); color:var(--text-mid-color); vertical-align:top; }
.help-table tr:nth-child(even) td { background:var(--glass); }
.help-li { padding:3px 0 3px 0; color:var(--text-mid-color); font-size:13px; }
.out-pane {
  display: none;
  margin: 0;
  min-width: 0;
}
.out-pane.active {
  display: block;
  margin: 0;
  animation: paneIn 0.15s cubic-bezier(0.4,0,0.2,1) both;
}

/* ── One-line diagram tab — screen styles ── */
.old-wrap { padding: 0 20px 16px; }
.old-tab-controls { display: flex; align-items: center; gap: 6px; padding: 0 0 14px; flex-wrap: wrap; }
/* Filter pills and Export button now use canonical .rfi-filter and
   .btn.btn-amber.btn-sm classes respectively (see Track 2 restyle).
   Old .old-filter-btn / .old-export-btn rules removed as dead code. */
.old-room-block { margin-bottom: 20px; background: var(--midground-color); border: 1px solid var(--border); border-radius: var(--r); overflow: hidden; }
.old-room-hdr { display: flex; align-items: center; gap: 10px; padding: 10px 16px; background: var(--foreground-color); border-bottom: 1px solid var(--border); font-family: var(--mono); font-size: calc(11px * var(--fs,1)); color: var(--text-mid-color); }
.old-room-hdr .old-room-name { font-weight: 700; font-size: calc(12px * var(--fs,1)); color: var(--button-color); }
.old-room-hdr .old-room-zone { color: var(--text-dark-color); font-size: calc(10px * var(--fs,1)); margin-left: auto; }
.old-svg-wrap {
  background: var(--background-color); border-radius: 0 0 var(--r) var(--r);
  padding: 16px 20px;
  overflow-x: auto;
  /* pan-x pan-y: horizontal swipe scrolls the diagram (it's wider than
     mobile screens — SVG natural width is 1160px), vertical swipe still
     bubbles to the page so users can scroll past the diagram normally.
     Earlier `touch-action: pan-y` blocked horizontal touch scrolling. */
  touch-action: pan-x pan-y;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
}
.old-svg-wrap svg { pointer-events: none; display: block; }

.narrative-wrap {
  display: block;
  padding: 0;
}
.narrative-doc {
  background: var(--glass); border: 1px solid var(--border); border-radius: var(--r);
  padding: 24px; font-family: var(--mono);
  /* Phase 4 typography decisions (was calc(12px*var(--fs,1)) and 1.85): */
  font-size: 13px; line-height: 1.65;
  color: var(--text-light-color); white-space: pre-wrap;
  min-height: 200px; max-height: 70vh; overflow-y: auto;
  margin: 12px; box-shadow: var(--shadow-sm);
  scroll-behavior: smooth;
}
.narrative-doc .nd-placeholder { color: var(--text-dark-color); font-style: italic; }

.table-wrap {
  overflow-x: auto;
}
.ctable { width: 100%; border-collapse: collapse; font-size: calc(10px * var(--fs, 1)); font-family: var(--mono); min-width: 1000px; }
.ctable th { padding: 8px 10px; font-size: calc(9px * var(--fs, 1)); font-weight: 600; letter-spacing: 0.8px; text-transform: uppercase; border: 1px solid var(--border); white-space: nowrap; text-align: left; }
.ctable td { padding: 7px 10px; border: 1px solid var(--border); vertical-align: top; font-size: calc(10px * var(--fs, 1)); line-height: 1.4; background: var(--midground-color); overflow-wrap: break-word; max-width: 220px; }
.ctable tr:nth-child(even) td { background: var(--foreground-color); }
.ctable .zone-row td { background: var(--foreground-color) !important; font-weight: 600; color: var(--accent-zone); letter-spacing: 1px; font-size: calc(10px * var(--fs, 1)); }

/* ── Rotated sub-category headers ──────────────────────────────
   25 narrow sub-columns need rotated labels to stay legible without
   overflow. Colored category backgrounds remain visible on the th. */
.ctable thead .th-sub {
  height: 96px;
  padding: 0 !important;
  vertical-align: bottom;
  min-width: 28px;
  max-width: 48px;
  text-align: left;
  position: relative;
}
.ctable thead .th-sub .th-rotate {
  display: inline-block;
  transform-origin: left bottom;
  transform: translate(50%, -4px) rotate(-50deg);
  white-space: nowrap;
  font-size: calc(9px * var(--fs, 1));
  font-weight: 600;
  letter-spacing: 0.3px;
  text-transform: uppercase;
  line-height: 1;
  padding: 2px 4px;
  pointer-events: none;
}

/* ── Per-room notes row ──────────────────────────────────────── */
.ctable .notes-row td {
  background: var(--background-color) !important;
  border-top: 1px dashed var(--border2);
  font-size: calc(9px * var(--fs, 1));
  line-height: 1.5;
  padding: 6px 10px;
  white-space: normal;
  max-width: none;
}
.ctable .notes-row td.notes-label {
  color: var(--text-dark-color);
  font-weight: 600;
  letter-spacing: 1px;
  text-transform: uppercase;
  font-size: calc(8px * var(--fs, 1));
  width: 80px;
  white-space: nowrap;
  background: var(--foreground-color) !important;
}
.ctable .notes-row td.notes-content {
  color: var(--text-mid-color);
}

/* Category header colours */
.th-p  { background: rgb(from var(--cyan-tint-color) r g b / 0.15);  color: var(--c-params); }
.th-o  { background: rgb(from var(--button-color) r g b / 0.15);  color: var(--c-occ); }
.th-t  { background: rgb(from var(--c-ts) r g b / 0.15);  color: var(--c-ts); }
.th-d  { background: rgb(from var(--green) r g b / 0.15);   color: var(--c-day); }
.th-m  { background: rgb(from var(--red) r g b / 0.15);   color: var(--c-man); }
.th-a  { background: rgb(from var(--c-add) r g b / 0.15);  color: var(--c-add); }
.th-i  { background: rgb(from var(--c-int) r g b / 0.15);   color: var(--c-int); }
.th-n  { background: rgb(from var(--c-notes) r g b / 0.12); color: var(--c-notes); }

/* ── STACKED MATRIX LAYOUT (Phase 1, polished in Phase 4) ────
   Replaces the old wide table. Each room is a self-contained
   vertical block. Uses the same color tokens as the old table
   so visual continuity is preserved across the app. */
#matrixStack { padding: 4px 12px 12px; }
.mx-zone-header {
  display: flex;
  align-items: baseline;
  gap: 12px;
  padding: 14px 12px 8px;
  margin-top: 18px;
  border-bottom: 2px solid var(--border);
  font-family: var(--mono);
}
#matrixStack > .mx-zone-header:first-child { margin-top: 4px; }
.mx-zone-label {
  font-size: calc(9px * var(--fs, 1));
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--text-dark-color);
}
.mx-zone-name {
  font-size: calc(13px * var(--fs, 1));
  font-weight: 700;
  color: var(--accent-zone);
  letter-spacing: 0.5px;
}
.mx-room-block {
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-radius: var(--r);
  margin: 12px 0;
  overflow: hidden;
}
/* First room block in a zone gets extra top breathing room */
.mx-zone-header + .mx-room-block { margin-top: 14px; }
.mx-row {
  display: grid;
  /* Label column: 180px on desktop, shrinks to 110px on narrow screens.
     Using minmax so the value column never collapses below readable width. */
  grid-template-columns: minmax(110px, 180px) minmax(0, 1fr);
  gap: 0;
  border-bottom: 1px solid var(--border);
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  min-height: 28px;
  align-items: stretch;
}
.mx-row:last-child { border-bottom: none; }
.mx-row-room { background: var(--foreground-color); }
.mx-row-room .mx-row-value { font-size: calc(11px * var(--fs, 1)); }
.mx-row-notes { background: rgb(from var(--c-notes) r g b / 0.06); }
.mx-row-label {
  padding: 7px 12px;
  background: var(--foreground-color);
  color: var(--text-dark-color);
  font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.3px;
  border-right: 1px solid var(--border);
  display: flex;
  align-items: center;
}
.mx-row-value {
  padding: 7px 12px;
  display: flex;
  align-items: center;
  color: var(--text-light-color);
  line-height: 1.4;
  min-width: 0;     /* prevents long values from forcing column overflow */
  overflow-wrap: break-word;
}
.mx-row-value.mx-editable { cursor: pointer; transition: background var(--dur-fast); }
.mx-row-value.mx-editable:hover { background: rgb(from var(--button-color) r g b / 0.06); }
/* Section headers — full-width band that introduces a parameter group.
   Single border-bottom only; the row above this header already provides
   visual closure via its own border-bottom. */
.mx-section-header {
  padding: 6px 12px;
  font-family: var(--mono);
  font-size: calc(9px * var(--fs, 1));
  font-weight: 700;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  border-bottom: 1px solid var(--border);
}
.mx-section-p { background: rgb(from var(--cyan-tint-color) r g b / 0.12);  color: var(--c-params); }
.mx-section-o { background: rgb(from var(--button-color) r g b / 0.12); color: var(--c-occ); }
.mx-section-t { background: rgb(from var(--c-ts) r g b / 0.12);                color: var(--c-ts); }
.mx-section-d { background: rgb(from var(--green) r g b / 0.12); color: var(--c-day); }
.mx-section-m { background: rgb(from var(--red) r g b / 0.12);   color: var(--c-man); }
.mx-section-a { background: rgb(from var(--c-add) r g b / 0.12);                color: var(--c-add); }
.mx-section-i { background: rgb(from var(--c-int) r g b / 0.12);                 color: var(--c-int); }

/* ── MATRIX SCORECARDS ───────────────────────────────────────
   Replaces the old two-row chip filter. Two stacked scorecards:
   parent (always visible) and sub (conditional on a parent being
   selected). Cell visuals are inline-styled to mirror the
   .sub-scorecard pattern from the Submittals tab. */
/* Matrix scorecards: filter rail above the room blocks. Two scorecards
   stack vertically — parent (sections) and conditional sub (parameters
   within the active section). v26.04.27 polish: previously the outer
   .mx-scorecards wrapper had only a bottom border and no horizontal
   margin, leaving it full-bleed inside the pane. Now matches the rest
   of the floating-card visual language — 12px outer margin, full
   border, glass bg, var(--r-sm) radius. The inner .mx-scorecard rows
   keep their amber-left-edge accent. */
.mx-scorecards {
  background: var(--glass);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  box-shadow: var(--shadow-sm);
  margin: 0 12px 12px 12px;
  padding: 8px;
  flex-shrink: 0;
}
/* Hide the wrapper when empty (no rooms → renderMatrixScorecards still
   runs but every cell shows 0, which is meaningless; the empty-state
   inside #matrixStack already explains there's nothing to show). The
   :empty selector matches when the wrapper has no children — JS clears
   it via wrap.innerHTML = '' in the no-rooms branch. */
.mx-scorecards:empty { display: none; }
.mx-scorecard {
  display: flex;
  flex-wrap: wrap;
  background: var(--foreground-color);
  border: 1px solid var(--border);
  border-left: 3px solid var(--button-color);
  border-radius: var(--r-lg);
  overflow: hidden;
}
.mx-scorecard-parent { margin-bottom: 8px; }
.mx-scorecard-sub    { margin-bottom: 0; }
.mx-score-cell { transition: background var(--dur-base); }
.mx-score-cell:hover { background: rgb(from var(--button-color) r g b / 0.04); }

/* Badges */
.b { display: inline-block; padding: 2px 7px; border-radius: 20px; font-size: calc(9px * var(--fs, 1)); font-weight: 600; letter-spacing: 0.3px; }
.b-y  { background: rgb(from var(--green) r g b / 0.15);   color: var(--green); }
.b-n  { background: rgb(from var(--red) r g b / 0.15);   color: var(--red); }
.b-a  { background: rgb(from var(--info) r g b / 0.15);  color: var(--info); }
.b-m  { background: rgb(from var(--button-color) r g b / 0.18);  color: var(--button-color); }

/* ── TOAST ── */
@keyframes toastIn  { from { transform: translateY(16px); opacity:0; } to { transform: translateY(0); opacity:1; } }
@keyframes toastOut { from { transform: translateY(0);   opacity:1; } to { transform: translateY(16px); opacity:0; } }
/* ══════════════════════════════════════════════════════════════
   TOAST — severity-aware, queue-capable stack
   #toast is now a stack container; each notification is a .toast-item
   ══════════════════════════════════════════════════════════════ */
#toast {
  position: fixed; bottom: 24px; right: 24px;
  display: flex; flex-direction: column-reverse; /* newest on top */
  gap: 8px;
  max-width: min(420px, calc(100vw - 48px));
  z-index: 9999;
  pointer-events: none; /* let clicks through the empty container */
}
.toast-item {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 11px 14px;
  border-radius: 6px;
  font-family: var(--mono);
  font-size: calc(12px * var(--fs, 1));
  font-weight: 600;
  letter-spacing: 0.3px;
  line-height: 1.4;
  box-shadow: 0 6px 20px rgb(from var(--text-light-tint-color) r g b / 0.35), 0 2px 6px rgb(from var(--text-light-tint-color) r g b / 0.25);
  opacity: 0;
  transform: translateY(12px);
  transition: opacity var(--dur-slow) ease-out, transform var(--dur-slow) var(--ease-out);
  pointer-events: auto;
  border: 1px solid transparent;
  max-width: 100%;
  overflow-wrap: break-word;
}
.toast-item.show {
  opacity: 1;
  transform: translateY(0);
}
.toast-item.hiding {
  opacity: 0;
  transform: translateX(20px);
  transition: opacity var(--dur-slow) ease-in, transform var(--dur-slow) cubic-bezier(0.4,0,1,1);
}
.toast-icon {
  flex-shrink: 0;
  font-size: 14px;
  line-height: 1.4;
  font-weight: 700;
}
.toast-msg {
  flex: 1;
  min-width: 0;
}
.toast-close {
  flex-shrink: 0;
  background: none; border: none;
  font-family: inherit;
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
  padding: 0 4px;
  margin-left: 4px;
  opacity: 0.7;
  color: inherit;
  transition: opacity var(--dur-base);
}
.toast-close:hover { opacity: 1; }
.toast-close:focus-visible { outline: 1px solid currentColor; outline-offset: 2px; }

/* Severity variants */
.toast-success {
  background: var(--green);
  color: var(--text-light-color);
  border-color: var(--shadow-subtle-med);
}
.toast-info {
  background: var(--button-color);
  color: var(--background-color);
  border-color: var(--shadow-subtle-med);
}
.toast-error {
  background: var(--red);
  color: var(--text-mid-color);
  border-color: rgb(from var(--text-mid-color) r g b / 0.15);
}


/* ── MODAL ── */
.modal-bg {
  display: none;
  position: fixed;
  top: 0; right: 0; bottom: 0; left: 0; /* explicit instead of inset — better Android support */
  width: 100%;
  height: 100%;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  z-index: 500;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  box-sizing: border-box;
}
.modal-bg.open { display: flex; }
@keyframes modalIn  { from { opacity:0; transform:scale(0.96) translateY(6px); } to { opacity:1; transform:scale(1) translateY(0); } }
.modal-bg.open > .modal,
.modal-bg.open > div { animation: modalIn 0.2s cubic-bezier(0.4,0,0.2,1) both; }
.modal {
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-left: 3px solid var(--button-color);
  border-radius: var(--r-lg);
  padding: 24px; width: 460px; max-width: 90vw;
}
.modal h3 { font-family: var(--mono); font-size: calc(13px * var(--fs, 1)); font-weight: 600; letter-spacing: 1.5px; text-transform: uppercase; color: var(--button-color); margin-bottom: 16px; }
.modal-footer { display: flex; gap: 8px; justify-content: flex-end; margin-top: 20px; }

/* ══════════════════════════════════════════════════════════════
   CANONICAL MODAL SHELL — header + body + footer pattern
   Replaces the legacy .modal class on a per-modal basis. New
   modals should use this structure; legacy .modal still works.
   See modal-mockup-v2.html for the design.
   ══════════════════════════════════════════════════════════════ */

/* Shell — replaces the inner .modal div. Border-left amber accent
   matches the .mx-scorecard pattern. Flex column for header/body/footer
   slot stacking. */
.modal-shell {
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-left: 3px solid var(--button-color);
  border-radius: var(--r-lg);
  width: 460px; max-width: 100%;
  box-shadow: var(--shadow-lg, 0 8px 32px rgba(0,0,0,0.4));
  display: flex; flex-direction: column;
  overflow: hidden;
  max-height: min(90dvh, 900px);
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}
.modal-shell--sm { width: 380px; }
.modal-shell--lg { width: 640px; }
.modal-shell--xl { width: 820px; }

/* Header slot — title + close X button */
.modal-hdr {
  display: flex; align-items: center; gap: 12px;
  padding: 14px 18px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.modal-hdr-title {
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  font-weight: 700; letter-spacing: 1.5px;
  text-transform: uppercase; color: var(--button-color);
  flex: 1; line-height: 1.2;
}
.modal-hdr-close {
  background: none; border: none;
  color: var(--text-dark-color); cursor: pointer;
  font-family: var(--mono);
  font-size: calc(16px * var(--fs, 1));
  padding: 4px 6px; border-radius: var(--r-sm);
  line-height: 1; transition: all var(--dur-fast);
}
.modal-hdr-close:hover {
  background: var(--glass2); color: var(--text-light-color);
}

/* Optional subheader — instructional context strip */
.modal-subhdr {
  padding: 10px 18px;
  background: var(--foreground-color);
  border-bottom: 1px solid var(--border);
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  color: var(--text-dark-color); line-height: 1.5;
  flex-shrink: 0;
}

/* Body — scrollable content area */
.modal-body {
  padding: 18px;
  overflow-y: auto;
  flex: 1;
  -webkit-overflow-scrolling: touch;
}

/* Field group — replaces ad-hoc .fg with style="margin-bottom" */
.modal-fg { margin-bottom: 14px; }
.modal-fg:last-child { margin-bottom: 0; }
.modal-label {
  display: block;
  font-family: var(--mono);
  font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); text-transform: uppercase;
  letter-spacing: 0.5px; margin-bottom: 5px;
  font-weight: 600;
}

/* Canonical input — replaces inline-styled inputs/selects in modals */
.modal-input {
  width: 100%;
  padding: 8px 12px;
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r-sm);
  color: var(--text-light-color);
  font-family: var(--mono);
  font-size: calc(12px * var(--fs, 1));
  outline: none;
  box-sizing: border-box;
  transition: border-color var(--dur-fast), box-shadow var(--dur-fast);
}
.modal-input:focus {
  border-color: var(--button-color);
  box-shadow: 0 0 0 3px rgb(from var(--button-color) r g b / 0.14);
}
.modal-input::placeholder { color: var(--text-dark-color); }
/* Variant: textarea-style (resize vertical, larger) */
textarea.modal-input { min-height: 80px; resize: vertical; line-height: 1.5; }

/* Footer slot — action buttons with tinted background */
.modal-footer-canon {
  display: flex; gap: 8px; justify-content: flex-end;
  padding: 14px 18px;
  border-top: 1px solid var(--border);
  background: var(--foreground-color);
  flex-shrink: 0;
}
.modal-footer-canon .modal-footer-spacer { flex: 1; }

/* Global scrollbar styling is canonicalized later in this file
   (search for "Scrollbar styling — thin, consistent"). */

/* ══════════════════════════════════════════════════════════════
   A11Y — FIELD VALIDATION + EMPTY STATES
   Added Session 1 of UI polish plan. Used by 04-a11y.js.
   ══════════════════════════════════════════════════════════════ */

/* ── Inline field error — appears below invalid fields ──────── */
.field-error {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--red);
  margin-top: 4px;
  padding-left: 2px;
  line-height: 1.4;
  animation: fieldErrorIn 0.18s ease-out both;
}
@keyframes fieldErrorIn {
  from { opacity: 0; transform: translateY(-3px); }
  to   { opacity: 1; transform: translateY(0); }
}
/* Invalid field styling — amber-red border signals needs attention */
[aria-invalid="true"] {
  border-color: var(--red) !important;
  box-shadow: 0 0 0 1px rgba(var(--red-rgb), 0.15) !important;
}
[aria-invalid="true"]:focus {
  box-shadow: 0 0 0 2px rgba(var(--red-rgb), 0.25) !important;
  outline: none;
}

/* ── Empty state — consistent pattern across all tabs ───────── */
/* ══════════════════════════════════════════════════════════════
   CONFIRM DIALOG — destructive action confirmation
   Used by confirmDanger() / confirmWarn() in 04-a11y.js
   ══════════════════════════════════════════════════════════════ */
.confirm-modal {
  width: min(440px, 92vw);
  padding: 24px 24px 20px;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0;
}
.confirm-modal.confirm-modal--danger {
  border-top: 2px solid var(--red);
}
.confirm-modal.confirm-modal--warn {
  border-top: 2px solid var(--button-color);
}
.confirm-icon {
  font-size: 32px;
  line-height: 1;
  margin-bottom: 12px;
  filter: grayscale(0.2);
}
.confirm-modal--danger .confirm-icon { color: var(--red); }
.confirm-modal--warn .confirm-icon { color: var(--button-color); }
.confirm-title {
  font-family: var(--sans);
  font-size: 16px;
  font-weight: 700;
  color: var(--text-light-color);
  margin: 0 0 10px;
  letter-spacing: -0.2px;
  line-height: 1.35;
}
.confirm-body {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--text-mid-color);
  line-height: 1.65;
  margin-bottom: 18px;
  max-width: 360px;
  white-space: pre-wrap;
}
.confirm-type-wrap {
  width: 100%;
  margin: 4px 0 18px;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 6px;
}
.confirm-type-label {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
  text-align: left;
  letter-spacing: 0.3px;
}
.confirm-type-label strong {
  color: var(--red);
  font-family: var(--mono);
  background: rgba(var(--red-rgb), 0.08);
  padding: 1px 5px;
  border-radius: 3px;
  border: 1px solid rgba(var(--red-rgb), 0.25);
}
.confirm-type-input {
  width: 100%;
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r-sm);
  color: var(--text-light-color);
  font-family: var(--mono);
  font-size: 12px;
  padding: 9px 12px;
  outline: none;
  box-sizing: border-box;
  transition: border-color var(--dur-base);
}
.confirm-type-input:focus {
  border-color: var(--red);
  box-shadow: 0 0 0 2px rgba(var(--red-rgb), 0.15);
}
.confirm-actions {
  display: flex;
  gap: 10px;
  justify-content: center;
  width: 100%;
}
.confirm-actions .btn {
  min-width: 100px;
  padding: 9px 18px;
  font-weight: 600;
}
.confirm-btn-cancel { flex: 0 1 auto; }
.confirm-btn-ok { flex: 0 1 auto; }
.confirm-btn-ok:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

/* Danger button variant — reuses existing .btn shape */
.btn-danger {
  background: var(--red);
  color: var(--text-mid-color);
  border: 1px solid var(--red);
}
.btn-danger:hover:not(:disabled) {
  filter: brightness(1.1);
}
.btn-danger:focus-visible {
  outline: 2px solid rgba(var(--red-rgb), 0.5);
  outline-offset: 2px;
}

/* ══════════════════════════════════════════════════════════════
   UTILITY CLASSES — Session 8 extraction
   High-frequency inline-style patterns consolidated here.
   When adding new components, prefer composing these over
   writing inline styles. Audit before duplicating.
   ══════════════════════════════════════════════════════════════ */

/* Muted mono metadata labels — graded by size. Used for timestamps,
   counts, status text, and other secondary information.
   Phase A extraction. */
.u-meta-xs {
  color: var(--text-dark-color);
  font-family: var(--mono);
  font-size: 9px;
}
.u-meta-sm {
  color: var(--text-dark-color);
  font-family: var(--mono);
  font-size: 10px;
}
.u-meta {
  color: var(--text-dark-color);
  font-family: var(--mono);
  font-size: 11px;
}

/* Section divider heading — amber caps label with underline.
   Used to separate content blocks within panels. */
.u-section-hdr {
  font-size: 9px;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--button-color);
  margin: 20px 0 8px;
  padding-bottom: 6px;
  border-bottom: 1px solid var(--border);
}

/* Field label — small uppercase mono caption above form inputs.
   Block-level, 3px margin below. For 5px variant use .u-field-label--5. */
.u-field-label {
  display: block;
  font-family: var(--mono);
  font-size: 9px;
  color: var(--text-dark-color);
  text-transform: uppercase;
  letter-spacing: 1px;
  margin-bottom: 3px;
}
.u-field-label--5 {
  margin-bottom: 5px;
}

/* Uppercase mono body label — Phase C.
   Smaller muted caps used inline (not block-level like u-field-label).
   No margin by default — add inline margin-* if needed. */
.u-label {
  font-family: var(--mono);
  font-size: 9px;
  color: var(--text-dark-color);
  text-transform: uppercase;
  letter-spacing: 1px;
}

/* Stacked metadata block — Phase C.
   Flex column of muted mono-font metadata lines (project info, sidebars). */
.u-stack-meta {
  display: flex;
  flex-direction: column;
  gap: 3px;
  font-family: var(--mono);
  font-size: 9px;
  color: var(--text-dark-color);
}

/* Table-style header cell — Phase C.
   Used for grid/table headers with left-aligned semibold small labels. */
.u-tbl-hdr {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.5px;
  color: var(--text-dark-color);
  padding: 6px 10px;
  border: 1px solid var(--border2);
  text-align: left;
}

/* Menu section header — Phase D.
   Muted uppercase label used inside dropdown menus / settings panels,
   preceded by section padding. */
.u-menu-section-hdr {
  color: var(--text-dark-color);
  font-family: var(--mono);
  font-size: 9px;
  letter-spacing: 1.5px;
  margin-top: 4px;
  padding: 10px 14px 6px;
  text-transform: uppercase;
}

/* Panel section header — Phase D.
   Amber uppercase section label inside settings/help panels. */
.u-panel-section-hdr {
  color: var(--button-color);
  font-family: var(--mono);
  font-size: 9px;
  letter-spacing: 1.5px;
  padding: 12px 10px 6px;
  text-transform: uppercase;
}

/* Amber mono emphasis label — Phase D.
   Used inline for small attention-drawing text (counts, statuses). */
.u-emph-mono {
  color: var(--button-color);
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 700;
}

/* Panel card — Phase D.
   Elevated surface used for content blocks within pages.
   Background + border + radius + padding. */
.u-card {
  background: var(--foreground-color);
  border: 1px solid var(--border);
  border-radius: var(--r);
  padding: 16px 18px;
}

/* Mono heavy label — Phase D.
   Slightly larger mono label with weight, used as subheading above content. */
.u-label-heavy {
  color: var(--text-light-color);
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 600;
  margin-bottom: 3px;
}

/* Mono body paragraph — Phase D.
   Small mono text with relaxed line-height for short explanatory copy. */
.u-body-mono {
  color: var(--text-dark-color);
  font-family: var(--mono);
  font-size: 10px;
  line-height: 1.6;
}

/* Mono input field component — Phase B extraction.
   Use as: class="field-mono" (base sm size, full width)
   With modifiers: class="field-mono field-mono--md"
                   class="field-mono field-mono--narrow"
                   class="field-mono field-mono--lg"
                   class="field-mono field-mono--select"  (for <select> elements)
   The base covers 95%+ of mono-styled text inputs in the app. */
.field-mono {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  color: var(--text-light-color);
  font-family: var(--mono);
  font-size: 11px;
  padding: 5px 8px;
  border-radius: 3px;
  width: 100%;
}
.field-mono--md {
  font-size: 12px;
  padding: 7px 10px;
  border-radius: var(--r);
}
.field-mono--narrow {
  width: 80px;
  padding: 3px 6px;
}
.field-mono--lg {
  background: var(--input-bg);
  font-size: 13px;
  padding: 7px 10px;
  border-radius: var(--r);
}
.field-mono--select {
  font-size: 12px;
  padding: 7px 10px;
  border-radius: var(--r);
  appearance: none;
  -webkit-appearance: none;
}
.field-mono:focus {
  outline: none;
  border-color: var(--button-color);
}
.field-mono:hover:not(:focus) {
  border-color: var(--border);
  background-color: var(--foreground-color);
}


/* ─── Deep-link target flash (Phase 2) ───────────────────────────
 * Applied for ~2.4s after a deep-link consumer scrolls a row into
 * view, so the user can see what was linked. Uses an inset
 * box-shadow for the pulse — doesn't displace layout, doesn't
 * fight existing border styles, and degrades gracefully if the
 * row already has its own background.
 */
@keyframes dlTargetFlash {
  0%   { box-shadow: inset 0 0 0 2px rgb(from var(--button-color) r g b / 0.95); background-color: rgb(from var(--button-color) r g b / 0.18); }
  50%  { box-shadow: inset 0 0 0 2px rgb(from var(--button-color) r g b / 0.55); background-color: rgb(from var(--button-color) r g b / 0.10); }
  100% { box-shadow: inset 0 0 0 2px rgb(from var(--button-color) r g b / 0); background-color: transparent; }
}
.dl-target-flash {
  animation: dlTargetFlash 2.4s ease-out 1;
  /* Keep the row visually elevated for the duration so subsequent
   * sibling content doesn't overlap the box-shadow halo. */
  position: relative;
  z-index: 1;
}

/* ══════════════════════════════════════════════════════════════
   LOADING STATES — inline button spinner + global overlay
   Session 4: consistent async feedback across the app.
   ══════════════════════════════════════════════════════════════ */

/* ── Inline button spinner ──────────────────────────────────── */
.btn-loading {
  position: relative;
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  gap: 8px;
  opacity: 0.85;
  cursor: wait !important;
  pointer-events: none;
}
.btn-spinner {
  width: 12px;
  height: 12px;
  border: 2px solid currentColor;
  border-top-color: transparent;
  border-right-color: transparent;
  border-radius: 50%;
  animation: btnSpin 0.65s linear infinite;
  flex-shrink: 0;
  opacity: 0.85;
}
.btn-loading-label {
  font-family: inherit;
  font-size: inherit;
  letter-spacing: inherit;
}
@keyframes btnSpin {
  to { transform: rotate(360deg); }
}

/* Respect prefers-reduced-motion — pulse instead of rotation */
@media (prefers-reduced-motion: reduce) {
  .btn-spinner {
    animation: btnPulse 1.2s ease-in-out infinite;
  }
  @keyframes btnPulse {
    0%, 100% { opacity: 0.5; }
    50%      { opacity: 1; }
  }
}

/* ── Global loading overlay — for long ops without a button ─── */
.loading-overlay {
  position: fixed;
  inset: 0;
  background: rgb(from var(--text-light-tint-color) r g b / 0.55);
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 9998;
  opacity: 0;
  transition: opacity var(--dur-slow) ease-out;
}
.loading-overlay.open {
  opacity: 1;
}
.loading-overlay-card {
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-top: 2px solid var(--button-color);
  border-radius: 12px;
  padding: 28px 36px;
  text-align: center;
  min-width: 260px;
  max-width: min(440px, 92vw);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
  box-shadow: 0 12px 32px rgb(from var(--text-light-tint-color) r g b / 0.4);
}
.loading-overlay-spinner {
  width: 28px;
  height: 28px;
  border: 3px solid var(--foreground-color);
  border-top-color: var(--button-color);
  border-radius: 50%;
  animation: btnSpin 0.8s linear infinite;
  margin-bottom: 4px;
}
.loading-overlay-title {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--button-color);
  letter-spacing: 1.5px;
  text-transform: uppercase;
  font-weight: 700;
}
.loading-overlay-msg {
  font-family: var(--mono);
  font-size: 12px;
  color: var(--text-mid-color);
  line-height: 1.5;
  min-height: 18px;
}

/* ══ COMPLIANCE ENGINE ══ */
.comp-bar { display:flex; align-items:center; gap:10px; padding:10px 14px; border-radius:6px; border:1px solid; margin-bottom:12px; cursor:pointer; transition:filter var(--dur-base); user-select:none; }
.comp-bar:hover { filter:brightness(1.08); }
.comp-bar.pass { background:rgba(var(--green-rgb),0.10); border-color:rgba(var(--green-rgb),0.35); }
.comp-bar.warn { background:rgba(var(--button-rgb-color),0.10); border-color:rgba(var(--button-rgb-color),0.40); }
.comp-bar.fail { background:rgba(var(--red-rgb),0.10); border-color:rgba(var(--red-rgb),0.35); }
.comp-bar .cb-ico  { font-size: calc(15px * var(--fs, 1)); flex-shrink:0; }
.comp-bar .cb-lbl  { font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight:600; letter-spacing:1px; text-transform:uppercase; flex:1; }
.comp-bar.pass .cb-lbl { color:var(--green); }
.comp-bar.warn .cb-lbl { color:var(--button-color); }
.comp-bar.fail .cb-lbl { color:var(--red); }
.comp-bar .cb-cnt  { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); }
.comp-bar .cb-arr  { font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); transition:transform var(--dur-slow); }
.comp-bar .cb-arr.open { transform:rotate(180deg); }
.comp-panel { display:none; flex-direction:column; gap:5px; margin-bottom:14px; padding:10px; background:var(--shadow-soft); border:1px solid var(--border); border-radius:6px; }
.comp-panel.open { display:flex; }
.ci { display:flex; gap:8px; align-items:flex-start; padding:8px 10px; border-radius:5px; border-left:3px solid; background:var(--shadow-subtle-med); }
.ci.fail { border-left-color:var(--red); }
.ci.warn { border-left-color:var(--button-color); }
.ci.pass { border-left-color:var(--green); }
.ci-ico  { font-size: calc(12px * var(--fs, 1)); flex-shrink:0; margin-top:2px; }
.ci-body { flex:1; }
.ci-rule { font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight:600; margin-bottom:3px; }
.ci.fail .ci-rule { color:var(--red); }
.ci.warn .ci-rule { color:var(--button-color); }
.ci.pass .ci-rule { color:var(--green); }
.ci-desc { font-size: calc(11px * var(--fs, 1)); color:var(--text-mid-color); line-height:1.5; }
.ci-fix  { margin-top:5px; padding:5px 8px; background:var(--surface-glass-faint); border-radius:4px; font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); line-height:1.5; }
.ci-fix strong { color:var(--button-color); }
.ci-ref  { margin-top:4px; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); letter-spacing:0.5px; }
.rdot-wrap { position:relative; width:10px; height:10px; flex-shrink:0; }
.rdot-main { width:8px; height:8px; border-radius:50%; position:absolute; top:1px; left:1px; }
.rdot-comp { position:absolute; top:-2px; right:-2px; width:6px; height:6px; border-radius:50%; border:1px solid var(--midground-color); }
.rdot-comp.pass { background:var(--green); }
.rdot-comp.warn { background:var(--button-color); }
.rdot-comp.fail { background:var(--red); }
.comp-sum { padding: 0 20px 20px; }
.comp-scorecard { display:flex; gap:10px; flex-wrap:wrap; margin-bottom:20px; }
/* polish-5 (Item 2): card container standardization.
 * Previously .score-tile used var(--shadow-soft) bg + 6px radius,
 * .sub-tile used var(--foreground-color) + 6px, .sched-score-card used
 * var(--foreground-color) + var(--r). Three different surfaces for the same
 * conceptual element (metric card). Unified on var(--foreground-color) (the
 * canonical elevated-card token from _tokens.css) + var(--r) (default
 * card radius). Variant color + typography rules below remain
 * unchanged — tile prominence hierarchy is preserved (30pt, 20pt,
 * 22pt numbers for compliance / submittals / schedule respectively).
 */
.score-tile { flex:1; min-width:90px; background:var(--foreground-color); border:1px solid var(--border); border-radius:var(--r); padding:14px; text-align:center; }
.score-tile .stn { font-family:var(--mono); font-size: calc(30px * var(--fs, 1)); font-weight:700; line-height:1; }
.score-tile .stl { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing:1.5px; text-transform:uppercase; color:var(--text-dark-color); margin-top:4px; }
.score-tile.stf .stn { color:var(--red); }
.score-tile.stw .stn { color:var(--button-color); }
.score-tile.stp .stn { color:var(--green); }
.score-tile.stt .stn { color:var(--text-mid-color); }
@keyframes paneIn { from { opacity:0; transform:translateY(4px); } to { opacity:1; transform:translateY(0); } }

.crr { background:var(--shadow-subtle-high); border:1px solid var(--border); border-radius:6px; margin-bottom:8px; overflow:hidden; }
.crr-hdr { display:flex; align-items:center; gap:8px; padding:10px 14px; cursor:pointer; transition:background var(--dur-fast); }
.crr-hdr:hover { background:rgb(from var(--text-mid-color) r g b / 0.03); }
.crr-dot { width:8px; height:8px; border-radius:50%; flex-shrink:0; }
.crr-nm  { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; flex:1; }
.crr-zn  { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); }
.crr-badges { display:flex; gap:6px; }
.crr-badge { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); padding:2px 7px; border-radius:10px; }
.crr-badge.f { background:rgb(from var(--red) r g b / 0.2); color:var(--red); }
.crr-badge.w { background:rgb(from var(--button-color) r g b / 0.2); color:var(--button-color); }
.crr-badge.p { background:rgb(from var(--green) r g b / 0.2); color:var(--green); }
.crr-body { padding:0 14px 10px; display:none; }
.crr-body.open { display:block; }


/* ── ROOM STATUS BADGES ── */
.status-dot { display:inline-flex; align-items:center; gap:4px; padding:2px 7px; border-radius:10px; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); font-weight:600; letter-spacing:0.5px; cursor:pointer; user-select:none; border:1px solid; transition:opacity var(--dur-base); }
.status-dot:hover { opacity:0.8; }
.status-dot.ns  { background:rgb(from var(--foreground-color) r g b / 0.2); border-color:rgb(from var(--foreground-color) r g b / 0.4); color:var(--text-dark-color); }
.status-dot.ip  { background:rgb(from var(--info) r g b / 0.15); border-color:rgb(from var(--info) r g b / 0.4); color:var(--info); }
.status-dot.done{ background:rgb(from var(--button-color) r g b / 0.15); border-color:rgb(from var(--button-color) r g b / 0.4); color:var(--button-color); }
.status-dot.appr{ background:rgb(from var(--green) r g b / 0.15); border-color:rgb(from var(--green) r g b / 0.4); color:var(--green); }
.progress-bar-wrap { display:flex; align-items:center; gap:8px; padding:4px 0; }
.progress-bar { flex:1; min-width:80px; height:3px; background:var(--foreground-color); border-radius:2px; overflow:hidden; }
.progress-bar-fill { height:100%; background:linear-gradient(90deg,var(--info),var(--green)); border-radius:2px; transition:width 0.5s var(--ease-out); }

/* ── CX CHECKLIST ── */
.cx-room-hdr { display:flex; align-items:center; gap:10px; padding:12px 16px; background:var(--foreground-color); border:1px solid var(--border); border-radius:6px; margin-bottom:8px; cursor:pointer; }
.cx-room-hdr:hover { background:var(--foreground-color); }
.cx-room-body { padding:0 4px 16px; }
.cx-section { margin-bottom:14px; }
.cx-sec-title { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); letter-spacing:1.5px; text-transform:uppercase; color:var(--text-dark-color); padding:6px 0 8px; border-bottom:1px solid var(--border); margin-bottom:8px; }
.cx-item { display:grid; grid-template-columns:24px 1fr 90px 90px 100px; gap:8px; align-items:start; padding:8px 10px; border-radius:5px; background:var(--shadow-subtle-med); margin-bottom:5px; }
.cx-item:nth-child(even) { background:var(--foreground-color); }
.cx-chk { width:16px; height:16px; accent-color:var(--green); cursor:pointer; margin-top:2px; }
.cx-label { font-size: calc(11px * var(--fs, 1)); color:var(--text-mid-color); line-height:1.5; }
.cx-label strong { color:var(--text-light-color); font-weight:500; }
.cx-input-sm { background:var(--foreground-color); border:1px solid var(--border); border-radius:4px; color:var(--text-light-color); font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); padding:4px 6px; width:100%; }
.cx-input-sm:focus { outline:none; border-color:var(--button-color); }
.cx-status-sel { background:var(--foreground-color); border:1px solid var(--border); border-radius:4px; color:var(--text-light-color); font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); padding:4px 5px; width:100%; }
.cx-signoff { background:var(--foreground-color); border:1px solid var(--border2); border-radius:6px; padding:18px; margin-top:20px; }
.cx-signoff-title { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); letter-spacing:1.5px; text-transform:uppercase; color:var(--button-color); margin-bottom:14px; }
.cx-signoff-grid { display:grid; grid-template-columns:1fr 1fr; gap:12px; }
.cx-sig-block { border:1px solid var(--border2); border-radius:4px; padding:12px; }
.cx-sig-label { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); letter-spacing:1px; margin-bottom:8px; }
.cx-sig-line { border-bottom:1px solid var(--border2); margin-bottom:6px; height:28px; }
.cx-scorecard { display:flex; gap:8px; flex-wrap:wrap; margin-bottom:16px; }
.cx-tile { flex:1; min-width:70px; background:var(--foreground-color); border:1px solid var(--border); border-radius:6px; padding:10px 12px; text-align:center; }
.cx-tile .ctn { font-family:var(--mono); font-size: calc(24px * var(--fs, 1)); font-weight:700; line-height:1; }
.cx-tile .ctl { font-family:var(--mono); font-size: calc(8px * var(--fs, 1)); letter-spacing:1.5px; text-transform:uppercase; color:var(--text-dark-color); margin-top:3px; }
.cx-tile.ctf .ctn { color:var(--red); } .cx-tile.ctw .ctn { color:var(--button-color); } .cx-tile.ctp .ctn { color:var(--green); } .cx-tile.ctt .ctn { color:var(--text-mid-color); }

/* ── CX FIELD EVENTS (B.3c: refresh button, attribution, badges) ── */
.cx-toolbar { display:flex; align-items:center; gap:10px; margin-bottom:10px; flex-wrap:wrap; }
.cx-refresh-btn { background:var(--foreground-color); border:1px solid var(--border2); border-radius:4px; color:var(--text-mid-color); font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); padding:6px 12px; letter-spacing:0.5px; cursor:pointer; min-height:28px; }
.cx-refresh-btn:hover:not([disabled]) { background:var(--foreground-color); color:var(--text-light-color); border-color:var(--button-color); }
.cx-refresh-btn[disabled] { opacity:0.5; cursor:wait; }
.cx-field-activity-badge { background:rgba(var(--cyan-rgb), 0.12); border:1px solid var(--accent-tmpl); color:var(--accent-tmpl); font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); letter-spacing:0.5px; padding:5px 10px; border-radius:10px; }
.cx-attribution { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); margin-top:4px; letter-spacing:0.3px; }
.cx-item-field-touched { border-left:2px solid var(--accent-tmpl); padding-left:8px; }
.cx-item-field-touched .cx-attribution { color:var(--accent-tmpl); }

/* ── REVISION HISTORY ── */
.rev-entry { display:grid; grid-template-columns:110px 60px 1fr auto; gap:10px; align-items:center; padding:10px 12px; border-radius:5px; background:var(--shadow-subtle-med); margin-bottom:6px; }
.rev-entry { display:flex; flex-direction:column; gap:3px; padding:10px 12px; border-radius:5px; background:var(--shadow-subtle-med); margin-bottom:6px; }
.rev-entry:nth-child(even) { background:rgb(from var(--text-light-tint-color) r g b / 0.06); }
.rev-date { font-family:var(--mono); font-size:calc(10px * var(--fs,1)); color:var(--text-dark-color); }
.rev-ver  { font-family:var(--mono); font-size:calc(11px * var(--fs,1)); font-weight:600; color:var(--button-color); }
.rev-desc { font-family:var(--mono); font-size:calc(11px * var(--fs,1)); color:var(--text-mid-color); margin-bottom:2px; }
.rev-actions { display:flex; gap:6px; align-items:center; margin-top:4px; flex-wrap:wrap; }
.rev-restore-btn { background:none; border:1px solid var(--border2); border-radius:4px; color:var(--info); font-family:var(--mono); font-size:calc(9px * var(--fs,1)); padding:3px 9px; cursor:pointer; white-space:nowrap; }
.rev-restore-btn:hover { border-color:var(--info); background:rgb(from var(--info) r g b / 0.1); }
.rev-del { background:none; border:1px solid var(--border2); border-radius:4px; color:var(--text-dark-color); font-family:var(--mono); font-size:calc(9px * var(--fs,1)); padding:3px 9px; cursor:pointer; white-space:nowrap; }
.rev-del:hover { color:var(--red); border-color:rgb(from var(--red) r g b / 0.4); background:rgb(from var(--red) r g b / 0.08); }
.rev-add-row { display:flex; gap:8px; align-items:center; margin-top:10px; padding-top:10px; border-top:1px solid var(--border); }
.rev-add-row input { flex:1; }


/* ════════════════════════════════════════════════════════════
   PRINT / PDF STYLESHEET
   Triggered by window.print() or browser Ctrl+P
   Hides UI chrome, renders a clean document layout
   ════════════════════════════════════════════════════════════ */
@media print {
  /* ── Reset for print ── */
  *, *::before, *::after { box-sizing: border-box; }

  body {
    background: #fff !important;
    color: #111 !important;
    font-family: 'IBM Plex Sans', Arial, sans-serif !important;
    font-size: 9pt !important;
    margin: 0; padding: 0;
  }
  body::before { display: none !important; }   /* kill scanline */

  /* ── ONE-LINE DIAGRAM ── */
  .old-wrap {
    padding: 16px 0;
  }
  .old-room-block {
    margin-bottom: 28px;
    background: var(--navy2, var(--navy2));
    border: 1px solid var(--border, rgba(255,255,255,0.08));
    border-radius: 10px;
    overflow: hidden;
  }
  .old-room-hdr {
    display: flex; align-items: center; gap: 10px;
    padding: 10px 16px;
    background: var(--navy3, var(--navy2));
    border-bottom: 1px solid var(--border, rgba(255,255,255,0.08));
    font-family: var(--mono); font-size: 11px; color: var(--text);
  }
  .old-room-hdr .old-room-name { font-weight: 700; font-size: 12px; color: var(--amber); }
  .old-room-hdr .old-room-zone { color: var(--text3); font-size: 10px; margin-left: auto; }
  .old-svg-wrap {
    padding: 20px 24px;
    overflow-x: auto;
  }
  .old-svg-wrap svg {
    display: block;
    min-width: 100%;
  }
  /* mini preview inside room editor */
  .old-preview-wrap {
    margin-top: 14px;
    background: var(--navy3, var(--navy2));
    border: 1px solid var(--border, rgba(255,255,255,0.08));
    border-radius: 8px;
    overflow: hidden;
  }
  .old-preview-hdr {
    display: flex; align-items: center; gap: 8px;
    padding: 8px 14px;
    border-bottom: 1px solid var(--border, rgba(255,255,255,0.08));
    font-family: var(--mono); font-size: 10px; color: var(--text3);
    letter-spacing: 1px; text-transform: uppercase;
  }
  .old-preview-hdr span { color: var(--amber); }
  .old-preview-svg { padding: 14px 18px; overflow-x: auto; }
  .old-tab-controls {
    display: flex; align-items: center; gap: 10px;
    padding: 12px 0 4px;
    flex-wrap: wrap;
  }
  .old-filter-btn {
    font-family: var(--mono); font-size: 10px;
    background: var(--navy3); border: 1px solid var(--border);
    color: var(--text3); padding: 4px 12px; border-radius: 20px; cursor: pointer;
  }
  .old-filter-btn.active { background: var(--amber); color: #000; border-color: var(--amber); font-weight: 700; }
  .old-export-btn {
    margin-left: auto;
    font-family: var(--mono); font-size: 10px;
    background: none; border: 1px solid var(--border);
    color: var(--text3); padding: 4px 12px; border-radius: 20px; cursor: pointer;
  }
  .old-export-btn:hover { border-color: var(--amber); color: var(--amber); }

  /* ── Hide everything except the print container ── */
  .header, .sidebar, #editorArea, .out-tabs, .out-tabs-wrap,
  .output-card-header, .btn, button, .doc-toolbar,
  .modal-bg, #toast, .sidebar-top,
  .out-pane:not(.active),
  #pane-cin .narrative-wrap,
  #pane-soo .narrative-wrap,
  .nd-placeholder { display: none !important; }

  /* ── Layout: single column ── */
  .layout { display: block !important; }
  .main   { padding: 0 !important; overflow: visible !important; }
  .card, .output-card, .pane-content { box-shadow: none !important; border: none !important; background: #fff !important; }
  .card-header { display: none !important; }
  .card-body { padding: 0 !important; }

  /* ── Print container is injected dynamically ── */
  #printDoc {
    display: block !important;
    font-family: 'IBM Plex Sans', Arial, sans-serif;
    color: #111;
    font-size: 9pt;
    line-height: 1.5;
  }

  /* ── Cover page ── */
  .p-cover {
    break-after: always;
    padding: 60px 50px;
    border-bottom: 3px solid var(--navy);
  }
  .p-firm { font-size: 10pt; color: var(--text2); letter-spacing: 2px; text-transform: uppercase; margin-bottom: 40px; }
  .p-title { font-size: 22pt; font-weight: 700; color: var(--navy); margin-bottom: 6px; line-height: 1.2; }
  .p-subtitle { font-size: 12pt; color: var(--text2); margin-bottom: 40px; }
  .p-meta-grid { display: grid; grid-template-columns: 140px 1fr; gap: 8px 16px; font-size: 9pt; margin-bottom: 40px; }
  .p-meta-label { color: var(--text3); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; font-size: 8pt; }
  .p-meta-value { color: #111; }
  .p-rev-block { border-top: 1px solid var(--border2); padding-top: 16px; }
  .p-rev-table { width: 100%; border-collapse: collapse; font-size: 8pt; }
  .p-rev-table th { background: var(--border2); padding: 5px 8px; text-align: left; border: 1px solid var(--border2); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; font-size: 7pt; }
  .p-rev-table td { padding: 5px 8px; border: 1px solid #ddd; }

  /* ── Section headers ── */
  .p-section { break-before: always; padding: 30px 50px; }
  .p-section:first-child { break-before: avoid; }
  .p-sec-title {
    font-size: 13pt; font-weight: 700; color: var(--navy);
    border-bottom: 2px solid var(--navy);
    padding-bottom: 6px; margin-bottom: 16px;
    text-transform: uppercase; letter-spacing: 1px;
  }
  .p-sec-sub { font-size: 8pt; color: var(--text3); margin-top: -12px; margin-bottom: 16px; text-transform: uppercase; letter-spacing: 1px; }

  /* ── CIN narrative ── */
  .p-cin-block { margin-bottom: 20px; break-inside: avoid; }
  .p-zone-hdr { background: var(--border2); padding: 6px 10px; font-weight: 700; font-size: 9pt; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; border-left: 4px solid var(--navy); }
  .p-room-hdr { font-weight: 700; font-size: 9pt; margin-bottom: 4px; color: var(--navy); }
  .p-room-type { font-size: 8pt; color: var(--text3); margin-bottom: 6px; }
  .p-room-text { font-size: 9pt; line-height: 1.6; margin-bottom: 8px; }
  .p-room-note { font-size: 8pt; color: var(--text2); font-style: italic; border-left: 2px solid var(--border2); padding-left: 8px; }

  /* ── SOO ── */
  .p-soo-room { break-inside: avoid; margin-bottom: 20px; border: 1px solid var(--border2); border-radius: 4px; overflow: hidden; }
  .p-soo-room-hdr { background: var(--navy); color: #fff; padding: 8px 12px; font-weight: 700; font-size: 9pt; }
  .p-soo-room-hdr span { font-size: 8pt; font-weight: 400; color: #aaa; margin-left: 8px; }
  .p-soo-table { width: 100%; border-collapse: collapse; font-size: 8pt; }
  .p-soo-table tr:nth-child(even) td { background: var(--navy3); }
  .p-soo-table td { padding: 5px 10px; border-bottom: 1px solid var(--border2); vertical-align: top; }
  .p-soo-table td:first-child { font-weight: 600; color: var(--text); width: 160px; white-space: nowrap; }
  .p-soo-cat { background: var(--border2); font-size: 7pt; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: var(--text3); padding: 4px 10px; }

  /* ── Matrix table ── */
  .p-matrix { break-before: always; padding: 20px 15px; }
  .p-matrix table { width: 100%; border-collapse: collapse; font-size: 6.5pt; }
  .p-matrix th { background: var(--navy); color: #fff; padding: 4px 4px; text-align: center; font-size: 6pt; font-weight: 600; border: 1px solid var(--text2); }
  .p-matrix td { padding: 4px 4px; border: 1px solid var(--border2); text-align: center; }
  .p-matrix tr:nth-child(even) td { background: var(--navy3); }
  .p-matrix .zone-row td { background: var(--navy); color: #fff; font-weight: 700; text-align: left; font-size: 7pt; }

  /* ── Cx checklist ── */
  .p-cx-item { display: grid; grid-template-columns: 16px 1fr 100px 100px 80px; gap: 6px; align-items: start; padding: 5px 8px; border-bottom: 1px solid var(--border2); font-size: 8pt; break-inside: avoid; }
  .p-cx-chk { width: 12px; height: 12px; border: 1px solid var(--text3); border-radius: 2px; margin-top: 2px; background: #fff; flex-shrink: 0; }
  .p-cx-chk.done { background: var(--navy); border-color: var(--navy); }
  .p-cx-col-hdr { font-weight: 700; font-size: 7pt; color: var(--text3); text-align: center; }
  .p-cx-val { font-size: 8pt; color: var(--text); text-align: center; border-bottom: 1px dotted var(--border2); min-height: 14px; }
  .p-cx-notes { font-size: 7pt; color: var(--text3); font-style: italic; }
  .p-signoff { break-before: always; padding: 40px 50px; }
  .p-sig-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 30px 50px; margin-top: 20px; }
  .p-sig-block { border-bottom: 1px solid #000; padding-bottom: 2px; margin-bottom: 4px; height: 36px; display:flex; align-items:flex-end; }
  .p-sig-label { font-size: 8pt; color: var(--text3); }
  .p-sig-val { font-size: 9pt; }

  /* ── Compliance section ── */
  .p-comp-room { break-inside: avoid; margin-bottom: 12px; border: 1px solid var(--border2); border-radius: 3px; }
  .p-comp-room-hdr { padding: 6px 10px; font-weight: 700; font-size: 9pt; background: var(--border2); }
  .p-comp-issue { display: flex; gap: 8px; padding: 5px 10px; border-bottom: 1px solid var(--border2); font-size: 8pt; }
  .p-comp-ico { font-size: 10pt; flex-shrink: 0; }
  .p-comp-rule { font-weight: 600; }
  .p-comp-desc { color: var(--text2); }
  .p-comp-fail .p-comp-rule { color: var(--red); }
  .p-comp-warn .p-comp-rule { color: var(--amber); }
  .p-comp-pass .p-comp-rule { color: #27ae60; }

  /* ── Page numbers via CSS counter ── */
  @page { margin: 15mm 15mm 20mm; size: letter; }
  @page { @bottom-center { content: counter(page) ' / ' counter(pages); font-size: 8pt; color: var(--text3); } }

  /* ── Live matrix table print styles ── */
  #pane-matrix.active { display: block !important; }
  #matrixTable { font-size: 6pt !important; min-width: unset !important; }
  #matrixTable th, #matrixTable td { padding: 3px 4px !important; font-size: 6pt !important; white-space: normal !important; }
  /* Hide lower-priority columns in print: Color, Suppl, ADR, Emg Lvl, Fade↑, Fade↓, OccTS */
  #matrixTable th:nth-child(16),
  #matrixTable th:nth-child(17),
  #matrixTable th:nth-child(18),
  #matrixTable th:nth-child(19),
  #matrixTable th:nth-child(20),
  #matrixTable th:nth-child(21),
  #matrixTable th:nth-child(23),
  #matrixTable td:nth-child(16),
  #matrixTable td:nth-child(17),
  #matrixTable td:nth-child(18),
  #matrixTable td:nth-child(19),
  #matrixTable td:nth-child(20),
  #matrixTable td:nth-child(21),
  #matrixTable td:nth-child(23) { display: none !important; }
  .ctable .zone-row td { background: var(--navy) !important; color: #fff !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
}



/* ── ROOM TEMPLATES ── */
.tmpl-bar { display:flex; flex-direction:column; gap:4px; padding:8px 10px; background:var(--foreground-color); border-top:1px solid var(--border); }
.tmpl-label { font-family:var(--mono); font-size:clamp(8px, calc(9px * var(--fs, 1)), 11px); letter-spacing:1px; text-transform:uppercase; color:var(--text-dark-color); flex-shrink:0; }
.tmpl-list { display:flex; gap:5px; flex-wrap:wrap; flex:1 1 80px; min-width:80px; overflow:visible; }
.tmpl-chip { display:inline-flex; align-items:center; gap:4px; padding:2px 8px; background:var(--foreground-color); border:1px solid var(--border2); border-radius:10px; font-family:var(--mono); font-size:clamp(8px, calc(9px * var(--fs, 1)), 11px); color:var(--accent-tmpl); cursor:pointer; white-space:nowrap; }
.tmpl-chip:hover { border-color:var(--accent-tmpl); background:rgb(from var(--accent-tmpl) r g b / 0.1); }
.tmpl-chip .tc-del { color:var(--text-dark-color); margin-left:2px; font-size:clamp(9px, calc(10px * var(--fs, 1)), 12px); cursor:pointer; }
.tmpl-chip .tc-del:hover { color:var(--red); }
.tmpl-save-btn { font-family:var(--mono); font-size:clamp(8px, calc(9px * var(--fs, 1)), 11px); color:var(--button-color); background:none; border:1px solid var(--button-dim-color); border-radius:4px; padding:3px 8px; cursor:pointer; white-space:nowrap; flex-shrink:0; }
.tmpl-save-btn:hover { background:rgb(from var(--button-color) r g b / 0.1); }


/* ── SETPOINTS TABLE ── */
.sp-wrap { padding: 0 20px 20px; }
.sp-header { display:flex; align-items:center; gap:12px; margin-bottom:16px; }
.sp-header h2 { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; letter-spacing:2px; text-transform:uppercase; color:var(--button-color); flex:1; }
.sp-table { width:100%; border-collapse:collapse; font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); }
.sp-table thead th { padding:7px 10px; text-align:left; font-size: calc(8px * var(--fs, 1)); letter-spacing:1.5px; text-transform:uppercase; color:var(--text-dark-color); border-bottom:2px solid var(--border2); background:var(--foreground-color); white-space:nowrap; }
.sp-table thead th.sp-cat { color:var(--button-color); border-bottom-color:var(--button-dim-color); }
.sp-table tbody td { padding:6px 10px; border-bottom:1px solid var(--border); color:var(--text-mid-color); vertical-align:top; }
.sp-table tbody tr:hover td { background:rgb(from var(--text-mid-color) r g b / 0.02); }
.sp-table tbody tr.sp-zone td { background:var(--foreground-color); color:var(--text-dark-color); font-size: calc(9px * var(--fs, 1)); letter-spacing:1px; text-transform:uppercase; padding:4px 10px; border-bottom:1px solid var(--border2); }
.sp-room { font-weight:600; color:var(--text-light-color); white-space:nowrap; }
.sp-type { font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); }
.sp-val { color:var(--text-light-color); font-weight:500; }
.sp-adj { color:var(--accent-tmpl); font-size: calc(9px * var(--fs, 1)); }   /* adj = field-adjustable */
.sp-tbd { color:var(--button-color); }                  /* TBD = needs entry */
.sp-na  { color:var(--text-dark-color); }                  /* N/A */
.sp-range { font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); display:block; margin-top:1px; }

/* Print: setpoints */
.p-sp-table { width:100%; border-collapse:collapse; font-size:7.5pt; }
.p-sp-table th { background:var(--background-color); color:#fff; padding:4px 7px; text-align:left; font-size:6.5pt; font-weight:600; border:1px solid var(--text-light-color); white-space:nowrap; }
.p-sp-table td { padding:4px 7px; border:1px solid var(--border2); vertical-align:top; }
.p-sp-table tr:nth-child(even) td { background:var(--foreground-color); }
.p-sp-table .sp-zone-row td { background:var(--background-color); color:#fff; font-weight:700; font-size:7pt; }
.p-sp-adj { color:#1a6fa3; font-size:7pt; }
.p-sp-tbd { color:var(--red); font-weight:600; }


/* ── THEME TOGGLE ── *//* no scanline in light mode */


/* ── SIDEBAR SEARCH ── */
.sb-search-wrap {
  padding: 8px 10px 0;
  position: relative;
}
.sb-search {
  width: 100%;
  padding: 5px 28px 5px 9px;
  background: var(--input-bg);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  color: var(--text-light-color);
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  transition: border-color var(--dur-base);
}
.sb-search:focus { outline: none; border-color: var(--button-color); }
.sb-search::placeholder { color: var(--text-dark-color); }
.sb-search-clear {
  position: absolute; right: 18px; top: 50%; transform: translateY(-50%);
  background: none; border: none; color: var(--text-dark-color); cursor: pointer;
  font-size: calc(13px * var(--fs, 1)); padding: 0; line-height: 1;
  display: none;
}
.sb-search-clear.visible { display: block; }
.sb-search-count {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color);
  padding: 3px 10px 6px; text-align: right;
}

/* ── INCOMPLETE INDICATOR ── */
.rdot-inc {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--button-color); flex-shrink: 0;
  display: none;
}
.rdot-inc.visible { display: block; }
.room-item .inc-badge {
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1)); color: var(--button-color);
  background: rgb(from var(--button-color) r g b / 0.12); border: 1px solid rgb(from var(--button-color) r g b / 0.3);
  border-radius: 3px; padding: 0 4px; white-space: nowrap; line-height: 1.6;
  display: none;
}
.room-item .inc-badge.visible { display: inline-block; }

/* ── BULK EDIT MODAL ── */
.bulk-modal { max-width: 520px; }
.bulk-field-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 14px; }
.bulk-scope {
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r); padding: 10px 12px; margin-bottom: 14px;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); color: var(--text-mid-color);
}
.bulk-scope strong { color: var(--button-color); }
.bulk-field-row { display: flex; align-items: center; gap: 8px; padding: 7px 0; border-bottom: 1px solid var(--border); }
.bulk-field-row:last-child { border-bottom: none; }
.bulk-chk { width: 14px; height: 14px; cursor: pointer; accent-color: var(--button-color); flex-shrink: 0; }
.bulk-field-label { font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); color: var(--text-mid-color); flex: 1; }
.bulk-field-input { flex: 1; }
.bulk-preview { background: var(--foreground-color); border: 1px solid var(--border); border-radius: 4px; padding: 8px 12px; font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); margin-top: 8px; line-height: 1.7; }
.bulk-preview strong { color: var(--accent-data); }
.bulk-field-row:hover { background: var(--foreground-color); }
.bulk-field-input:focus { border-color: var(--button-color); outline: none; }



/* ── TOOLTIPS ── */
.tip-wrap { display:inline-flex; align-items:center; gap:4px; }
.tip-icon {
  display:inline-flex; align-items:center; justify-content:center;
  width:14px; height:14px; border-radius:50%;
  background:var(--foreground-color); border:1px solid var(--border2);
  font-family:var(--mono); font-size: calc(8px * var(--fs, 1)); font-weight:700;
  color:var(--text-dark-color); cursor:help; flex-shrink:0;
  transition:all var(--dur-base); position:relative;
}
.tip-icon:hover { background:var(--foreground-color); border-color:var(--button-color); color:var(--button-color); }
.tip-icon::after {
  content: attr(data-tip);
  position:absolute; bottom:calc(100% + 8px); left:50%; transform:translateX(-50%);
  background:var(--midground-color); color:var(--text-light-color); border:1px solid var(--button-color);
  border-radius:6px; padding:10px 12px; font-size:11px; font-weight:400;
  font-family:var(--sans); line-height:1.6; white-space:normal;
  width:260px; text-align:left; z-index:9000; pointer-events:none;
  opacity:0; transition: opacity var(--dur-fast) ease;
  box-shadow:0 4px 20px var(--scrim-medium);
}
.tip-icon:hover::after { opacity:1; }
/* Prevent tooltip clipping at right edge */
.tip-icon:hover::after {
  left: auto;
  right: 0;
  transform: none;
}

/* ── DEFAULTS MODAL ── */
.def-modal { max-width: 480px; }
.def-section { margin-bottom:16px; }
.def-section-title { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing:2px; text-transform:uppercase; color:var(--text-dark-color); margin-bottom:10px; padding-bottom:5px; border-bottom:1px solid var(--border); }
.def-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.def-reset { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); cursor:pointer; background:none; border:none; padding:0; text-decoration:underline; }
.def-reset:hover { color:var(--red); }

/* ── COLLAPSE ALL button in sidebar ── */
.zone-collapse-row { display:flex; gap:5px; justify-content:flex-end; padding:4px 10px 0; }
.zone-collapse-btn { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); background:none; border:none; cursor:pointer; padding:2px 5px; border-radius:3px; transition:all var(--dur-fast); }
.zone-collapse-btn:hover { background:var(--foreground-color); color:var(--text-mid-color); }

/* ── NOTES CALLOUT in print ── */
.p-note-callout { border-left:3px solid var(--background-color); background:#f5f7fa; padding:7px 12px; margin-top:8px; border-radius:0 4px 4px 0; font-size:8.5pt; color:var(--text-light-color); font-style:italic; }
.p-note-label { font-size:7pt; font-weight:700; text-transform:uppercase; letter-spacing:1px; color:var(--text-dark-color); margin-bottom:3px; }


/* ── RESPONSIVE ── */
@media (max-width: 1024px) {
  /* .layout grid-template-columns set canonically at ~line 3618 (200px 1fr) */
  .hdr-takeoff-btn { display: none !important; }
  .header-actions > .btn-ghost                { display: inline-flex !important; }
  .header-actions .hdr-menu-wrap              { display: flex !important; }
  .header-actions .hdr-menu-wrap > .btn-ghost { display: inline-flex !important; }
  #themeToggle { display: flex !important; }
}
@media (max-width: 768px) {
  .layout { grid-template-columns: 1fr; grid-template-rows: auto 1fr; }
  /* Sidebar uses drawer pattern — see rules at lines ~3651 and ~4449 below.
     Legacy `.sidebar { max-height: 220px }` was removed (Session 7) because
     it conflicted with the fixed-position drawer and clipped the open state. */
  .main { padding: 12px; }
  .header { padding: 0 12px; }
  .header-brand .wordmark { font-size: calc(18px * var(--fs, 1)); }
  .onboard-steps { flex-direction: column; align-items: center; }
  .onboard-step-arrow { transform: rotate(90deg); }
  .out-tabs { gap: 0; }
  .out-tabs-wrap::after { display: none; }
  .out-tab { letter-spacing: 0; padding: 7px 10px; font-size: calc(9.5px * var(--fs, 1)); }
  .out-tab-divider { margin: 6px 2px; }
}


/* ── DRAG AND DROP ── */
.room-item[draggable="true"] { cursor: default; }
.room-item[draggable="true"]:active { cursor: grabbing; }
.drag-handle { cursor: grab; }
.room-item.dragging {
  opacity: 0.4;
  background: rgb(from var(--button-color) r g b / 0.08) !important;
  border: 1px dashed var(--button-color) !important;
}
.zone-rooms.drag-over {
  background: rgb(from var(--accent-zone) r g b / 0.06);
  outline: 2px dashed var(--accent-zone);
  outline-offset: -2px;
  border-radius: 4px;
}
/* Drop indicator line between rooms */
.room-item.drop-above { border-top: 2px solid var(--accent-zone) !important; }
.room-item.drop-below { border-bottom: 2px solid var(--accent-zone) !important; }
/* Drag handle — subtle grip dots on left edge */
.drag-handle {
  display: flex; flex-direction: column; gap: 2px;
  padding: 0 2px; opacity: 0; transition: opacity var(--dur-fast);
  cursor: grab; flex-shrink: 0;
}
.room-item:hover .drag-handle { opacity: 0.5; }
.room-item.dragging .drag-handle { opacity: 0; }
.drag-handle span {
  display: flex; gap: 2px;
}
.drag-handle span::before,
.drag-handle span::after {
  content: ''; width: 2px; height: 2px;
  border-radius: 50%; background: var(--text-dark-color);
}


/* ══ PUNCH LIST ══════════════════════════════════════════════ */
.pl-wrap { padding: 0 20px 20px; }

/* toolbar */
/* ────────────────────────────────────────────────────────────
 * Punch List — toolbar + scorecard + filters
 * Section header is shared with RFI (.rfi-section-header).
 * ──────────────────────────────────────────────────────────── */
.pl-filter-row { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:12px; }
.pl-filter { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); padding:3px 10px; border-radius:12px; border:1px solid var(--border2); background:var(--foreground-color); color:var(--text-dark-color); cursor:pointer; white-space:nowrap; transition:all var(--dur-base); }
.pl-filter.on { background:rgb(from var(--button-color) r g b / 0.15); border-color:var(--button-color); color:var(--button-color); }
.pl-filter:hover { border-color:var(--button-color); }

/* Scorecard — combined card: amber left edge, outer border, internal
   vertical dividers between cells (cells emitted inline by render). */
.pl-scorecard {
  display:flex;
  flex-wrap:wrap;
  background:var(--foreground-color);
  border:1px solid var(--border);
  border-left:3px solid var(--button-color);
  border-radius:var(--r-lg);
  overflow:hidden;
  margin-bottom:14px;
}

/* Sort bar under filter chips — uses .rfi-sort-bar (shared) */
/* No new rules needed; existing .rfi-sort-bar styling applies. */

/* Legacy classes kept as no-op — print code in 10b-print.js still
   references .pl-add-card to strip it before printing. Now harmless. */
.pl-add-card { /* form no longer wrapped, but keep selector for print stripper */ }
.pl-add-title { display:none; }
.pl-add-grid { display:grid; grid-template-columns:1fr 1fr 1fr; gap:10px; margin-bottom:10px; }
.pl-add-grid.full { grid-template-columns:1fr; }
.pl-add-row { display:grid; grid-template-columns:2fr 1fr 1fr 1fr; gap:10px; margin-bottom:10px; }

/* Old .pl-toolbar / .pl-tile / .pl-filter-group — superseded above. */

/* priority sort header */
.pl-sort-bar { display:flex; align-items:center; gap:12px; padding:6px 12px; background:var(--foreground-color); border:1px solid var(--border); border-radius:6px 6px 0 0; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); text-transform:uppercase; letter-spacing:1px; }
.pl-sort-btn { cursor:pointer; padding:2px 6px; border-radius:3px; transition:background var(--dur-fast); }
.pl-sort-btn:hover { background:var(--foreground-color); color:var(--text-mid-color); }
.pl-sort-btn.active { color:var(--button-color); }

/* deficiency cards */
.pl-list { border:1px solid var(--border); border-top:none; border-radius:0 0 6px 6px; overflow:hidden; }
.pl-item { padding:12px 14px; border-bottom:1px solid var(--border); background:var(--midground-color); transition:background var(--dur-fast); }
.pl-item:last-child { border-bottom:none; }
.pl-item:hover { background:var(--foreground-color); }
.pl-item.pl-closed { opacity:0.55; }

/* item header row */
.pl-item-hdr { display:flex; align-items:flex-start; gap:10px; margin-bottom:8px; }
.pl-num { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); flex-shrink:0; min-width:28px; padding-top:1px; }
.pl-priority { display:inline-flex; align-items:center; gap:3px; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); font-weight:700; padding:2px 7px; border-radius:3px; flex-shrink:0; white-space:nowrap; }
.pl-priority.P1 { background:rgb(from var(--red) r g b / 0.15);   color:var(--red);   border:1px solid rgb(from var(--red) r g b / 0.3); }
.pl-priority.P2 { background:rgb(from var(--button-color) r g b / 0.15);  color:var(--button-color); border:1px solid rgb(from var(--button-color) r g b / 0.3); }
.pl-priority.P3 { background:rgb(from var(--space-type-other) r g b / 0.12); color:var(--text-mid-color); border:1px solid var(--border2); }
.pl-title-wrap { flex:1; min-width:0; }
.pl-item-title { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; color:var(--text-light-color); margin-bottom:2px; }
.pl-item-meta  { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); }
.pl-status-badge { display:inline-flex; align-items:center; gap:3px; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); font-weight:600; padding:2px 8px; border-radius:3px; flex-shrink:0; white-space:nowrap; }
.pl-status-badge.open     { background:rgb(from var(--red) r g b / 0.12);  color:var(--red);   border:1px solid rgb(from var(--red) r g b / 0.25); }
.pl-status-badge.progress { background:rgb(from var(--button-color) r g b / 0.12); color:var(--button-color); border:1px solid rgb(from var(--button-color) r g b / 0.25); }
.pl-status-badge.resolved { background:rgb(from var(--green) r g b / 0.12); color:var(--green); border:1px solid rgb(from var(--green) r g b / 0.25); }
.pl-status-badge.closed   { background:rgb(from var(--space-type-other) r g b / 0.10);color:var(--text-dark-color); border:1px solid var(--border2); }

/* item detail row */
.pl-item-detail { display:grid; grid-template-columns:1fr 1fr 1fr; gap:8px; margin-bottom:8px; }
.pl-detail-field { display:flex; flex-direction:column; gap:3px; }
.pl-detail-label { font-family:var(--mono); font-size: calc(8px * var(--fs, 1)); letter-spacing:1px; text-transform:uppercase; color:var(--text-dark-color); }
.pl-detail-val   { font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); color:var(--text-mid-color); }

/* notes and actions */
.pl-item-notes { font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); color:var(--text-mid-color); line-height:1.6; padding:6px 10px; background:var(--foreground-color); border-radius:4px; margin-bottom:8px; white-space:pre-wrap; }
.pl-item-actions { display:flex; gap:6px; align-items:center; flex-wrap:wrap; }
.pl-action-btn { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); padding:3px 9px; border-radius:4px; border:1px solid var(--border2); background:none; color:var(--text-dark-color); cursor:pointer; transition:all var(--dur-fast); white-space:nowrap; }
.pl-action-btn:hover { border-color:var(--button-color); color:var(--button-color); }
.pl-action-btn.danger:hover { border-color:var(--red); color:var(--red); }
.pl-action-btn.primary { border-color:var(--button-color); color:var(--button-color); }

/* add deficiency form classes — see top of file. The "duplicate" defs
   used to live here but were superseded by the no-op redeclarations
   at the top after the form lost its card wrapper. */

/* print punch list */
.p-pl-table { width:100%; border-collapse:collapse; font-size:7.5pt; }
.p-pl-table th { background:var(--background-color); color:#fff; padding:4px 8px; text-align:left; font-size:7pt; border:1px solid var(--text-light-color); }
.p-pl-table td { padding:5px 8px; border:1px solid var(--border2); vertical-align:top; font-size:7.5pt; }
.p-pl-table tr:nth-child(even) td { background:var(--foreground-color); }
.p-pl-p1 { color:var(--red); font-weight:700; }
.p-pl-p2 { color:var(--button-color); font-weight:700; }
.p-pl-p3 { color:var(--text-mid-color); }
.p-pl-open     { color:var(--red); font-weight:600; }
.p-pl-progress { color:var(--button-color); font-weight:600; }
.p-pl-resolved { color:#1e7a44; font-weight:600; }
.p-pl-closed   { color:var(--text-dark-color); }




/* ── CONTROLS SCHEDULE & BUDGET ESTIMATE ── */
.sched-wrap { padding: 0 16px 16px; }
/* B.7p-3: catalog table needs its own horizontal scroll because
   .pane-content no longer has overflow-x:auto (see scroll-fix note
   at .pane-content). Without this, wide tables would truncate. */
#catalogTableWrap { overflow-x: auto; }
/* Schedule scorecard — canonical pattern: single combined card with amber
   left edge, internal vertical dividers between cells. Matches the
   .sub-scorecard / .mx-scorecard pattern from Submittals and Matrix. */
.sched-scorecard {
  display: flex;
  flex-wrap: wrap;
  background: var(--foreground-color);
  border: 1px solid var(--border);
  border-left: 3px solid var(--button-color);
  border-radius: var(--r-lg);
  overflow: hidden;
  margin-bottom: 16px;
}
.sched-score-card {
  flex: 1;
  min-width: 130px;
  padding: 14px 18px;
  text-align: center;
  background: transparent;
  border: 0;
  border-radius: 0;
}
.sched-score-card + .sched-score-card { border-left: 1px solid var(--border2); }
.sched-score-card .sc-label { font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; }
.sched-score-card .sc-val { font-family: var(--mono); font-size: calc(20px * var(--fs, 1)); font-weight: 700; color: var(--button-color); line-height: 1; }
.catalog-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
.catalog-header .ch-title { font-family: var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight: 600; color: var(--text-mid-color); }
.catalog-table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }
.catalog-table th { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); font-weight: 600; color: var(--text-dark-color); text-transform: uppercase; letter-spacing: .05em; padding: 6px 8px; text-align: left; border-bottom: 1px solid var(--border2); }
.catalog-table td { padding: 4px 6px; border-bottom: 1px solid var(--border); vertical-align: middle; }
.catalog-table input[type=text], .catalog-table input[type=number] { background: var(--input-bg); border: 1px solid var(--border); border-radius: 3px; color: var(--text-light-color); font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); padding: 3px 6px; width: 100%; }
.catalog-table input:focus { outline: none; border-color: var(--button-color); }
.catalog-table .del-btn { background: none; border: none; cursor: pointer; color: var(--text-dark-color); font-size: calc(11px * var(--fs, 1)); padding: 2px 5px; border-radius: 3px; font-family: var(--mono); }
.catalog-table .del-btn:hover { color: var(--red); background: rgb(from var(--red) r g b / .12); }
.room-qty-block { background: var(--foreground-color); border: 1px solid var(--border); border-radius: var(--r); margin-bottom: 12px; overflow: hidden; }
.room-qty-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; background: var(--foreground-color); cursor: pointer; border-bottom: 1px solid var(--border); }
.room-qty-header .rqh-name { font-family: var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight: 600; color: var(--text-light-color); }
.room-qty-header .rqh-sub { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); }
.room-qty-header .rqh-total { font-family: var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight: 600; color: var(--button-color); }
.room-qty-body { display: block; }
.room-qty-body.hidden { display: none; }
.qty-table { width: 100%; border-collapse: collapse; }
.qty-table th { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); text-transform: uppercase; padding: 5px 10px; text-align: left; border-bottom: 1px solid var(--border); }
.qty-table td { padding: 4px 10px; border-bottom: 1px solid var(--border); vertical-align: middle; }
.qty-table .qt-tag { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); font-weight: 600; color: var(--accent-data); white-space: nowrap; }
.qty-table .qt-desc { font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); color: var(--text-light-color); }
.qty-table .qt-unit { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); }
.qty-table .qt-cost { font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); color: var(--text-mid-color); text-align: right; }
.qty-table .qt-total { font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight: 600; color: var(--text-light-color); text-align: right; }
.qty-table .qty-input { background: var(--input-bg); border: 1px solid var(--border); border-radius: 3px; color: var(--text-light-color); font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); padding: 2px 6px; width: 58px; text-align: right; }
.qty-table .qty-input:focus { outline: none; border-color: var(--button-color); }
.qty-table tr.room-subtotal td { background: var(--foreground-color); font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight: 600; color: var(--button-color); border-top: 1px solid var(--border2); padding: 6px 10px; }
.suggested-badge { display: inline-block; font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); font-weight: 600; color: var(--green); background: rgb(from var(--green) r g b / .13); border: 1px solid rgb(from var(--green) r g b / .3); border-radius: 3px; padding: 1px 5px; margin-left: 5px; vertical-align: middle; }
.budget-wrap { padding: 16px; }
.budget-controls { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin-bottom: 16px; }
.budget-controls label { font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); color: var(--text-mid-color); }
.contingency-input { background: var(--input-bg); border: 1px solid var(--border2); border-radius: var(--r); color: var(--button-color); font-family: var(--mono); font-size: calc(13px * var(--fs, 1)); font-weight: 600; padding: 5px 10px; width: 80px; text-align: right; }
.contingency-input:focus { outline: none; border-color: var(--button-color); }
.budget-room-block { background: var(--foreground-color); border: 1px solid var(--border); border-radius: var(--r); margin-bottom: 10px; overflow: hidden; }
.budget-room-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; background: var(--foreground-color); cursor: pointer; border-bottom: 1px solid var(--border); }
.budget-room-header .brh-name { font-family: var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight: 600; color: var(--text-light-color); }
.budget-room-header .brh-sub { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); }
.budget-room-header .brh-total { font-family: var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight: 600; color: var(--button-color); }
.budget-room-body { display: block; }
.budget-room-body.hidden { display: none; }
.budget-cat-label { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); font-weight: 600; color: var(--text-dark-color); text-transform: uppercase; letter-spacing: .05em; padding: 4px 10px; background: var(--foreground-color); border-bottom: 1px solid var(--border); }
.budget-line-table { width: 100%; border-collapse: collapse; }
.budget-line-table th { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); text-transform: uppercase; padding: 5px 10px; text-align: left; border-bottom: 1px solid var(--border); }
.budget-line-table td { padding: 4px 10px; border-bottom: 1px solid var(--border); }
.budget-line-table td:last-child { text-align: right; }
.budget-line-table .bl-tag { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--accent-data); }
.budget-line-table .bl-desc { font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); color: var(--text-light-color); }
.budget-line-table .bl-num { font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); color: var(--text-mid-color); text-align: right; }
.budget-line-table .bl-total { font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight: 600; color: var(--text-light-color); text-align: right; }
.budget-cat-sub { background: var(--foreground-color); font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight: 600; color: var(--accent-data); padding: 5px 10px; border-bottom: 1px solid var(--border2); text-align: right; }
/* Budget category subtotal row — used inside <tfoot> of budget-line-table
   so the subtotal is part of the table flow (column-aligned) rather than
   a floating div below. Mirrors the .qty-table .room-subtotal treatment. */
.budget-line-table tfoot tr.budget-cat-sub-row td {
  background: var(--foreground-color);
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  font-weight: 600;
  color: var(--accent-data);
  border-top: 1px solid var(--border2);
  padding: 6px 10px;
}
.budget-grand-total-row { background: var(--foreground-color); font-family: var(--mono); font-size: calc(13px * var(--fs, 1)); font-weight: 700; color: var(--button-color); padding: 10px 14px; display: flex; justify-content: space-between; align-items: center; border-top: 2px solid var(--button-dim-color); border-radius: 0 0 var(--r) var(--r); }
.budget-contingency-row { background: var(--foreground-color); font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); color: var(--text-mid-color); padding: 6px 14px; display: flex; justify-content: space-between; align-items: center; border-top: 1px solid var(--border); }


/* ══ RFI MANAGER ════════════════════════════════════════════ */
.rfi-wrap { padding: 20px; }

.rfi-toolbar { display:flex; align-items:center; gap:8px; margin-bottom:12px; flex-wrap:wrap; }
.rfi-toolbar h2 { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; letter-spacing:2px; text-transform:uppercase; color:var(--button-color); flex:1; }

/* Section header — used for "Log New RFI" above the form: heading on
   the left, deliverable-producing button (Export CSV) on the right. */
.rfi-section-header { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:12px; flex-wrap:wrap; }
.rfi-section-header h2 { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; letter-spacing:2px; text-transform:uppercase; color:var(--button-color); margin:0; }

/* Filter chip row — appears directly under "RFI Log" heading so the
   chips modify what's below them, left-aligned (scans in reading order). */
.rfi-filter-row { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:16px; }

/* ── Export dropdown ─────────────────────────────────────────────
   Used in section headers where multiple deliverables share a
   single amber CTA — keeps amber signaling exclusive to the one
   "produce a deliverable" control on the row.
   `.export-menu` is hidden by default; toggleExportMenu() flips
   the .open class on the wrapping `.export-dropdown`. */
.export-dropdown { position:relative; display:inline-block; }
.export-menu {
  position:absolute;
  top:calc(100% + 4px);
  right:0;
  min-width:160px;
  background:var(--foreground-color);
  border:1px solid var(--border);
  border-radius:var(--r);
  box-shadow:var(--shadow-md);
  display:none;
  z-index:50;
  padding:4px 0;
}
.export-dropdown.open .export-menu { display:block; }
.export-menu button {
  display:block;
  width:100%;
  text-align:left;
  background:none;
  border:none;
  padding:8px 14px;
  font-family:var(--mono);
  font-size:11px;
  color:var(--text-light-color);
  cursor:pointer;
  white-space:nowrap;
}
.export-menu button:hover { background:var(--foreground-color); color:var(--button-color); }

/* Kept around in case anything else uses it, but the new layout uses
   .rfi-filter-row above. */
.rfi-filter-group { display:flex; gap:5px; flex-wrap:wrap; }
.rfi-filter { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); padding:3px 10px; border-radius:12px; border:1px solid var(--border2); background:var(--foreground-color); color:var(--text-dark-color); cursor:pointer; white-space:nowrap; transition:all var(--dur-base); }
.rfi-filter.on { background:rgb(from var(--button-color) r g b / 0.15); border-color:var(--button-color); color:var(--button-color); }
.rfi-filter:hover { border-color:var(--button-color); }
/* When .rfi-filter chips sit inside a .pane-action-bar (One-Line tab,
   v26.04.27 polish), the parent is a light-glass card — the dark
   --navy4 chip background reads as an alien dark pill. Re-skin the
   inactive chip to inherit the parent's lightness while keeping the
   amber on-state intact (the on-state is identity, not chrome). */
.pane-action-bar .rfi-filter {
  background: rgb(from var(--text-light-tint-color) r g b / 0.04);
  color: var(--text-mid-color);
  border-color: var(--border);
}
.pane-action-bar .rfi-filter:hover {
  background: rgb(from var(--button-color) r g b / 0.06);
  border-color: var(--button-color);
  color: var(--button-color);
}

/* Scorecard — combined card: one wide panel, amber left-edge accent,
   internal vertical dividers between cells (the cells themselves are
   emitted by renderRFIScorecard as plain <div>s with inline styles). */
.rfi-scorecard {
  display:flex;
  flex-wrap:wrap;
  background:var(--foreground-color);
  border:1px solid var(--border);
  border-left:3px solid var(--button-color);
  border-radius:var(--r-lg);
  overflow:hidden;
  margin-bottom:16px;
}

.rfi-sort-bar { display:flex; align-items:center; gap:12px; padding:6px 12px; background:var(--foreground-color); border:1px solid var(--border); border-radius:6px 6px 0 0; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); text-transform:uppercase; letter-spacing:1px; }
.rfi-sort-btn { cursor:pointer; padding:2px 6px; border-radius:3px; transition:background var(--dur-fast); }
.rfi-sort-btn:hover { background:var(--foreground-color); color:var(--text-mid-color); }
.rfi-sort-btn.active { color:var(--button-color); }

/* Form grids — previously lived inside .rfi-add-card for RFI; now flow
   directly on the pane background there. Other tabs (Change Orders,
   Warranties) still use the .rfi-add-card wrapper below. */
.rfi-add-grid  { display:grid; grid-template-columns:1fr 1fr 1fr; gap:10px; margin-bottom:10px; }
.rfi-add-grid.two  { grid-template-columns:1fr 1fr; }
.rfi-add-grid.full { grid-template-columns:1fr; }

/* Card wrapper + title — used by Change Orders and Warranties tabs.
   Previously used by RFI too, but RFI's form now flows without a card. */
.rfi-add-card { background:var(--foreground-color); border:1px solid var(--border2); border-radius:8px; padding:16px; margin-bottom:16px; }
.rfi-add-title { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing:2px; text-transform:uppercase; color:var(--button-color); margin-bottom:12px; }

.rfi-status { display:inline-flex; align-items:center; gap:3px; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); font-weight:600; padding:2px 8px; border-radius:3px; white-space:nowrap; }
.rfi-status.open     { background:rgb(from var(--red) r g b / 0.12);  color:var(--red);   border:1px solid rgb(from var(--red) r g b / 0.25); }
.rfi-status.pending  { background:rgb(from var(--button-color) r g b / 0.12); color:var(--button-color); border:1px solid rgb(from var(--button-color) r g b / 0.25); }
.rfi-status.answered { background:rgb(from var(--info) r g b / 0.12); color:var(--info);  border:1px solid rgb(from var(--info) r g b / 0.25); }
.rfi-status.closed   { background:rgb(from var(--green) r g b / 0.12); color:var(--green); border:1px solid rgb(from var(--green) r g b / 0.25); }

.rfi-list { border:1px solid var(--border); border-top:none; border-radius:0 0 6px 6px; overflow:hidden; }
.rfi-item { padding:14px 16px; border-bottom:1px solid var(--border); background:var(--midground-color); transition:background var(--dur-fast); }
.rfi-item:last-child { border-bottom:none; }
.rfi-item:hover { background:var(--foreground-color); }

.rfi-item-hdr { display:flex; align-items:flex-start; gap:10px; margin-bottom:8px; }
.rfi-num { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); flex-shrink:0; min-width:42px; padding-top:2px; }
.rfi-title-wrap { flex:1; min-width:0; }
.rfi-item-title { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; color:var(--text-light-color); margin-bottom:3px; }
.rfi-item-meta  { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); display:flex; gap:12px; flex-wrap:wrap; }
.rfi-meta-chip .mc-label { color:var(--text-dark-color); }
.rfi-meta-chip .mc-val   { color:var(--text-mid-color); }

.rfi-refs-row { display:flex; gap:16px; flex-wrap:wrap; margin-bottom:6px; }
.rfi-ref-item { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); }
.rfi-ref-item strong { color:var(--text-mid-color); }

.rfi-q-block { background:rgb(from var(--text-light-tint-color) r g b / 0.18); border-left:3px solid var(--border2); border-radius:0 4px 4px 0; padding:8px 12px; margin-bottom:8px; font-size: calc(11px * var(--fs, 1)); line-height:1.6; color:var(--text-mid-color); white-space:pre-wrap; }
.rfi-q-block .qb-label { font-family:var(--mono); font-size: calc(8px * var(--fs, 1)); letter-spacing:1.5px; text-transform:uppercase; color:var(--text-dark-color); margin-bottom:4px; }

.rfi-item-actions { display:flex; gap:6px; align-items:center; flex-wrap:wrap; margin-top:8px; }
.rfi-action-btn { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); padding:3px 9px; border-radius:4px; border:1px solid var(--border2); background:none; color:var(--text-dark-color); cursor:pointer; transition:all var(--dur-fast); white-space:nowrap; }
.rfi-action-btn:hover { border-color:var(--button-color); color:var(--button-color); }
.rfi-action-btn.danger:hover { border-color:var(--red); color:var(--red); }
.rfi-action-btn.primary { border-color:var(--button-color); color:var(--button-color); }


/* CO list rows: differ from RFI rows visually — each row is its own
   rounded card with margin between, instead of a flat stack with
   only border-bottom dividers. Also no hover background change.
   Scoped to #coList so RFI rows in #rfiList are unaffected. */
#coList .rfi-item {
  border: 1px solid var(--border);
  border-radius: 6px;
  margin-bottom: 8px;
}
#coList .rfi-item:last-child { margin-bottom: 0; }
#coList .rfi-item:hover { background: var(--midground-color); /* same as default — overrides .rfi-item:hover */ }



/* ══ DRAWING TAKEOFF MODAL ══════════════════════════════════
   v26.04.27 redesign: full-screen workspace adopts the rounded-card
   visual language from the rest of the app — page-blue backdrop with
   three floating cards (toolbar / sidebar / canvas), each with its
   own border, radius, and shadow. Sidebar is collapsible to a 40px
   icon rail; collapsed state persists in localStorage.
   Layout: 8px outer padding around the cards, 8px gap between cards.
   Heights: toolbar ~40px, sidebar+canvas fill the rest of the modal.
   Original chrome-heavy 48px-tall full-bleed top bar with stacked
   group labels is gone — clusters now separated only by .to-tb-sep
   dividers and tooltips replace the inline labels. */
#takeoutModal {
  display: none; position: fixed; inset: 0; z-index: 800;
  /* Same backdrop the rest of the app uses — adapts to all themes
     (light → light blue, dark → navy, etc.) via theme overrides. */
  background: var(--background-color);
  flex-direction: column;
  padding: 8px;
  gap: 8px;
}
#takeoutModal.open { display: flex; }

/* ── top bar — single-row floating card ── */
.to-topbar {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 12px; flex-shrink: 0;
  background: var(--glass);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-sm);
  overflow-x: auto; -webkit-overflow-scrolling: touch;
  flex-wrap: nowrap;
  /* Hide horizontal scrollbar — toolbar should appear seamless */
  scrollbar-width: none;
}
.to-topbar::-webkit-scrollbar { display: none; }
.to-topbar h2 {
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight: 600;
  letter-spacing: 1.4px; text-transform: uppercase; color: var(--button-color); flex: 1;
}
.to-tb-group {
  display: flex; align-items: center;
  gap: 6px; flex-shrink: 0;
}
/* Group labels removed in v26.04.27 — kept rule for any leftover usage */
.to-tb-label { display: none; }
.to-tb-title {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); font-weight: 700;
  letter-spacing: 1.2px; text-transform: uppercase; color: var(--button-color);
  white-space: nowrap;
  /* Amber pip before title — matches the aesthetic accent */
  padding-left: 10px;
  border-left: 4px solid var(--button-color);
}
.to-tb-sep {
  width: 1px; height: 22px; background: var(--border2);
  flex-shrink: 0; margin: 0 2px;
}
.to-tool-group { display: flex; gap: 3px; }
.to-tool-btn {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  padding: 0 9px; height: 26px;
  border-radius: var(--r-sm); border: 1px solid var(--border2);
  background: var(--foreground-color); color: var(--text-mid-color); cursor: pointer;
  transition: all var(--dur-fast); white-space: nowrap;
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 26px;
}
.to-tool-btn svg { display: block; flex-shrink: 0; }
.to-tool-btn:hover { border-color: var(--button-color); color: var(--button-color); }
.to-tool-btn.active { background: var(--button-color); border-color: var(--button-color); color: var(--background-color); }
.to-tool-btn.active svg { stroke: var(--background-color); }
#toToolEgress.active { background: var(--green); border-color: var(--green); color: var(--background-color); }
#toToolEgress.active svg { stroke: var(--background-color); }
.to-tool-btn.danger:hover { border-color: var(--red); color: var(--red); }

/* ── body layout — sidebar + canvas ── */
.to-body {
  display: grid;
  grid-template-columns: 200px 1fr;
  flex: 1; min-height: 0; gap: 8px;
  /* Smooth column transition when sidebar collapses */
  transition: grid-template-columns var(--dur-base) var(--ease-out);
}
/* Two paths to the collapsed grid: modern :has() walks the DOM, class
   on .to-body is a defensive fallback set by toToggleSidebar() for
   older browsers without :has() support (Chrome <105, Safari <15.4,
   Firefox <121). Either match wins — selectors don't compound. */
.to-body:has(.to-left.collapsed),
.to-body.sidebar-collapsed {
  grid-template-columns: 40px 1fr;
}

/* ── left sidebar — floating card with rail + content ── */
.to-left {
  background: var(--glass);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-sm);
  display: flex; flex-direction: column;
  overflow: hidden;
  position: relative;
}
/* Two siblings — rail visible only when collapsed, content otherwise */
.to-left-rail {
  display: none;
  flex-direction: column;
  align-items: center;
  padding: 4px 0;
  gap: 4px;
  flex-shrink: 0;
}
.to-left.collapsed .to-left-rail { display: flex; }
.to-left.collapsed .to-left-content { display: none; }
.to-left-content {
  display: flex; flex-direction: column;
  flex: 1; min-height: 0; overflow: hidden;
}
.to-left-tabs {
  /* Two-row grid: row 1 has 3 tab columns + a 30px collapse-caret
     reserve column; row 2 spans the same width with 2 tab columns.
     Replaces the prior flex single-row layout that smushed labels at
     the 200px sidebar width. Each tab cell stacks icon over uppercase
     mono label; active tab gets the existing amber pill fill. */
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 30px;
  grid-template-rows: auto auto;
  flex-shrink: 0;
  padding: 4px;
  gap: 2px;
  border-bottom: 1px solid rgb(from var(--border) r g b / 0.5);
  position: relative;
}
/* Row 2 cells (BOM, Wiring) — first cell starts at col 1 and spans
   2 columns; second cell starts at col 3 and spans 2 columns
   (overlapping the caret-reserve column on row 2 since it's empty).
   Result: row 2 has two equal-width tabs that span the full strip. */
.to-left-tabs > .to-ltab:nth-child(4) {
  grid-row: 2;
  grid-column: 1 / span 2;
}
.to-left-tabs > .to-ltab:nth-child(5) {
  grid-row: 2;
  grid-column: 3 / span 2;
}
/* Collapse caret anchored top-right of row 1, occupying the reserved
   30px column. Position: relative parent allows absolute positioning
   for a precise top-right placement that matches the prior design. */
.to-left-tabs > .to-left-collapse-btn {
  grid-row: 1;
  grid-column: 4;
  align-self: start;
  justify-self: end;
}
.to-ltab {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 3px;
  font-family: var(--mono); font-size: 9px;
  padding: 6px 2px; background: transparent; border: none; cursor: pointer;
  color: var(--text-dark-color); letter-spacing: 0.5px; text-transform: uppercase;
  border-radius: var(--r-sm); white-space: nowrap; min-width: 0;
  transition: all var(--dur-fast);
}
.to-ltab > svg {
  display: block;
  flex-shrink: 0;
}
.to-ltab-label {
  font-weight: 500;
  line-height: 1;
}
.to-ltab:hover { color: var(--text-mid-color); background: rgb(from var(--text-light-tint-color) r g b / 0.04); }
.to-ltab.active {
  background: var(--button-color); color: var(--background-color);
  font-weight: 600;
}
.to-left-collapse-btn {
  /* Positioned via the parent .to-left-tabs grid (row 1, col 4).
     Previously used absolute positioning relative to the strip, but
     the new two-row grid layout assigns it a dedicated cell instead. */
  width: 22px; height: 22px;
  background: rgb(from var(--text-light-tint-color) r g b / 0.04);
  border: 1px solid var(--border2); border-radius: var(--r-sm);
  cursor: pointer; padding: 0;
  display: flex; align-items: center; justify-content: center;
  color: var(--text-mid-color);
  transition: all var(--dur-fast);
}
.to-left-collapse-btn:hover { border-color: var(--button-color); color: var(--button-color); }
.to-rail-toggle {
  width: 28px; height: 26px;
  background: var(--button-color); border: none; border-radius: var(--r-sm);
  cursor: pointer; padding: 0;
  display: flex; align-items: center; justify-content: center;
  color: var(--background-color);
  transition: all var(--dur-fast);
}
.to-rail-toggle:hover { background: var(--button-click-color); }
.to-rail-sep {
  width: 24px; height: 1px;
  background: rgb(from var(--border) r g b / 0.6);
  margin: 2px 0;
}
.to-rail-icon {
  width: 28px; height: 28px;
  background: transparent;
  border: 1px solid transparent; border-radius: var(--r-sm);
  cursor: pointer; padding: 0;
  display: flex; align-items: center; justify-content: center;
  color: var(--text-mid-color);
  transition: all var(--dur-fast);
  position: relative;
}
.to-rail-icon:hover { background: rgb(from var(--text-light-tint-color) r g b / 0.04); color: var(--button-color); }
.to-rail-icon.active { background: var(--button-color); color: var(--background-color); }
.to-rail-badge {
  position: absolute; top: -3px; right: -3px;
  background: var(--button-color); color: var(--background-color);
  border-radius: 8px; min-width: 14px; height: 14px;
  padding: 0 4px;
  font-family: var(--mono); font-size: 8px; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
  pointer-events: none;
}
.to-lpane { display: none; flex: 1; overflow-y: auto; padding-top: 8px; }
.to-lpane.active { display: flex; flex-direction: column; }

/* page thumbnails inside Load PDF tab */
.to-page-thumb {
  border: 2px solid var(--border2); border-radius: 4px;
  cursor: pointer; overflow: hidden; background: var(--text-mid-color);
  transition: border-color var(--dur-fast); flex-shrink: 0;
}
.to-page-thumb:hover  { border-color: var(--button-click-color); }
.to-page-thumb.active { border-color: var(--button-color); }
.to-page-thumb canvas { display: block; width: 100%; height: auto; }
.to-page-label {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color);
  text-align: center; padding: 3px 0;
}
.to-upload-btn {
  display: flex; align-items: center; justify-content: center;
  gap: 6px; padding: 12px; border: 1.5px dashed var(--border2);
  border-radius: var(--r); cursor: pointer; color: var(--text-dark-color);
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); transition: all var(--dur-fast);
  flex-shrink: 0;
}
.to-upload-btn:hover { border-color: var(--button-color); color: var(--button-color); }

/* ── canvas area — own floating card ── */
.to-canvas-wrap {
  position: relative; overflow: hidden;
  background: var(--foreground-color);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-sm);
  cursor: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48bGluZSB4MT0iMTYiIHkxPSIyIiB4Mj0iMTYiIHkyPSIxNCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48bGluZSB4MT0iMTYiIHkxPSIxOCIgeDI9IjE2IiB5Mj0iMzAiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PGxpbmUgeDE9IjIiIHkxPSIxNiIgeDI9IjE0IiB5Mj0iMTYiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PGxpbmUgeDE9IjE4IiB5MT0iMTYiIHgyPSIzMCIgeTI9IjE2IiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjxsaW5lIHgxPSIxNiIgeTE9IjIiIHgyPSIxNiIgeTI9IjE0IiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PGxpbmUgeDE9IjE2IiB5MT0iMTgiIHgyPSIxNiIgeTI9IjMwIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PGxpbmUgeDE9IjIiIHkxPSIxNiIgeDI9IjE0IiB5Mj0iMTYiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48bGluZSB4MT0iMTgiIHkxPSIxNiIgeDI9IjMwIiB5Mj0iMTYiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIyLjUiIGZpbGw9ImJsYWNrIi8+PGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMS41IiBmaWxsPSJ3aGl0ZSIvPjwvc3ZnPg==') 16 16, crosshair;
}
.to-canvas-wrap.tool-pan    { cursor: grab; }
.to-canvas-wrap.tool-pan.panning { cursor: grabbing; }
.to-canvas-wrap.tool-select { cursor: default; }
#toCanvas  { position: absolute; top: 0; left: 0; pointer-events: none; }
#toOverlay { position: absolute; top: 0; left: 0; pointer-events: none; }

/* zoom indicator */
.to-zoom-bar {
  position: absolute; bottom: 12px; left: 50%; transform: translateX(-50%);
  display: flex; align-items: center; gap: 10px;
  background: var(--scrim-strong); border-radius: 16px; padding: 5px 14px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--border2);
}
.to-zoom-bar button {
  background: none; border: none; color: var(--border2); cursor: pointer;
  font-size: calc(13px * var(--fs, 1)); padding: 0 3px; line-height: 1;
}
.to-zoom-bar button:hover { color: var(--button-color); }

/* status bar */
.to-status {
  position: absolute; bottom: 12px; right: 12px;
  background: var(--scrim-strong); border-radius: 4px; padding: 4px 10px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--border2);
}

/* vertex hint */
.to-hint {
  position: absolute; top: 12px; left: 50%; transform: translateX(-50%);
  background: rgb(from var(--button-color) r g b / 0.9); border-radius: 4px; padding: 4px 12px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--background-color);
  font-weight: 600; pointer-events: none;
}

/* to-right panel removed — content moved to to-left sidebar */

/* palette */
.to-palette-section { margin-bottom: 12px; }
.to-palette-label {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing: 1.5px;
  text-transform: uppercase; color: var(--text-dark-color); padding: 4px 0 6px;
  border-bottom: 1px solid var(--border); margin-bottom: 6px;
  display: flex; align-items: center; gap: 6px;
  cursor: pointer; user-select: none;
  transition: color var(--dur-fast);
}
.to-palette-label:hover { color: var(--button-color); }
.to-palette-caret {
  display: inline-block;
  font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color);
  transition: transform var(--dur-fast);
  width: 8px;
}
.to-palette-section.is-collapsed .to-palette-caret { transform: rotate(-90deg); }
.to-palette-section.is-collapsed .to-palette-grid,
.to-palette-section.is-collapsed .to-palette-mfg-group { display: none; }
.to-palette-mfg-group { margin-bottom: 8px; }
.to-palette-mfg-group:last-child { margin-bottom: 0; }
.to-palette-mfg-subhead {
  font-family: var(--mono); font-size: calc(8.5px * var(--fs, 1)); letter-spacing: 1px;
  color: var(--text-dark-color); padding: 2px 0 4px; opacity: 0.75;
  text-transform: uppercase;
}
.to-palette-mfg-subhead.is-generic { color: var(--text-dark-color); font-style: italic; }
.to-palette-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; }
/* Generic-catalog toggle directly under the search box */
.to-palette-generic-toggle {
  display: flex; align-items: center; gap: 6px;
  padding: 5px 8px; margin-top: 4px;
  border: 1px solid var(--border); border-radius: 4px;
  background: var(--foreground-color); cursor: pointer;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-mid-color); user-select: none;
  transition: all var(--dur-base);
  width: 100%; box-sizing: border-box;
}
.to-palette-generic-toggle:hover { border-color: var(--button-color); color: var(--button-color); }
.to-palette-generic-toggle .check {
  display: inline-flex; align-items: center; justify-content: center;
  width: 14px; height: 14px;
  border: 1px solid var(--border2); border-radius: 3px;
  background: var(--foreground-color);
  font-size: 11px; line-height: 1;
}
.to-palette-generic-toggle.is-on .check {
  background: var(--button-color); border-color: var(--button-color); color: var(--background-color);
}
.to-palette-generic-toggle.is-on .check::before { content: '✓'; }
/* IES drop zone — Pass B */
.to-ies-dropzone {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
  padding: 14px 10px;
  margin-top: 6px;
  border: 1.5px dashed var(--border2); border-radius: 5px;
  background: var(--foreground-color);
  color: var(--text-dark-color); font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  letter-spacing: 0.5px; text-align: center; line-height: 1.4;
  cursor: pointer; user-select: none;
  transition: all var(--dur-base);
}
.to-ies-dropzone:hover {
  border-color: var(--button-color); color: var(--button-color);
  background: rgb(from var(--button-color) r g b / 0.06);
}
.to-ies-dropzone.is-drag {
  border-color: var(--button-color); border-style: solid;
  background: rgb(from var(--button-color) r g b / 0.12);
  color: var(--button-color);
  box-shadow: 0 0 0 2px rgb(from var(--button-color) r g b / 0.25);
}
.to-ies-dropzone .to-ies-icon {
  font-size: calc(18px * var(--fs, 1));
  line-height: 1;
}
/* IES upload modal — Pass B */
.to-ies-modal-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 10px 14px;
}
.to-ies-modal-grid .full { grid-column: 1 / -1; }
.to-ies-modal-meta {
  padding: 10px 12px; margin-top: 8px;
  background: var(--foreground-color); border: 1px solid var(--border);
  border-radius: 4px; font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); line-height: 1.5;
}
.to-ies-modal-meta strong { color: var(--text-mid-color); font-weight: 600; }
.to-ies-modal-required::after { content: ' *'; color: var(--button-color); }
.to-device-chip {
  display: flex; align-items: center; gap: 5px;
  padding: 5px 7px; border: 1px solid var(--border2);
  border-radius: 4px; background: var(--foreground-color);
  cursor: pointer; font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-mid-color);
  user-select: none; transition: all var(--dur-base);
  -webkit-user-drag: none; -khtml-user-drag: none; -moz-user-drag: none;
}
.to-device-chip:hover { border-color: var(--button-color); color: var(--button-color); background: rgb(from var(--button-color) r g b / 0.08); }
.to-device-chip.to-chip-active {
  border-color: var(--button-color); background: rgb(from var(--button-color) r g b / 0.15);
  color: var(--button-color); box-shadow: 0 0 0 2px rgb(from var(--button-color) r g b / 0.3);
}
.to-device-chip.to-chip-active .dc-tag { color: var(--button-color); }
/* Stamp indicator banner */
.to-stamp-bar {
  display: none; align-items: center; gap: 8px;
  padding: 5px 10px; background: rgb(from var(--button-color) r g b / 0.12);
  border: 1px solid rgb(from var(--button-color) r g b / 0.35); border-radius: 4px;
  margin: 6px 0; font-family: var(--mono); font-size: 10px; color: var(--button-color);
}
.to-stamp-bar.active { display: flex; }
.to-stamp-bar-tag { font-weight: 700; color: var(--button-color); }
.to-stamp-bar-hint { color: var(--text-dark-color); flex: 1; }
.to-stamp-bar-close { background: none; border: none; color: var(--text-dark-color); cursor: pointer;
  font-size: 12px; padding: 0 2px; line-height: 1; }
.to-stamp-bar-close:hover { color: var(--button-color); }
.to-device-chip .dc-icon { font-size: calc(13px * var(--fs, 1)); flex-shrink: 0; }
.to-device-chip .dc-tag  { font-weight: 600; color: var(--accent-data); }

/* room list in right panel */
.to-room-row {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 8px; border: 1px solid var(--border);
  border-radius: 4px; margin-bottom: 5px; background: var(--foreground-color);
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); cursor: pointer;
  transition: border-color var(--dur-fast);
}
.to-room-row:hover { border-color: var(--button-color); }
.to-room-row.active { border-color: var(--button-color); background: rgb(from var(--button-color) r g b / 0.08); }
.to-room-row .tr-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.to-room-row .tr-name { flex: 1; color: var(--text-light-color); }
.to-room-row .tr-count { color: var(--text-dark-color); font-size: calc(9px * var(--fs, 1)); }
.to-room-del { background: none; border: none; color: var(--text-dark-color); cursor: pointer; font-size: calc(11px * var(--fs, 1)); padding: 1px 4px; }
.to-room-del:hover { color: var(--red); }

/* BOM panel */
.to-bom-header {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); font-weight: 600;
  color: var(--accent-data); padding: 6px 0; border-bottom: 1px solid var(--border);
  margin-bottom: 8px; letter-spacing: 1px; text-transform: uppercase;
}
.to-bom-row {
  display: flex; align-items: center; gap: 8px;
  padding: 4px 6px; border-bottom: 1px solid var(--border);
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
}
.to-bom-row .tb-tag  { color: var(--accent-data); width: 50px; flex-shrink: 0; }
.to-bom-row .tb-desc { flex: 1; color: var(--text-mid-color); font-size: calc(9px * var(--fs, 1)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.to-bom-row .tb-qty  { color: var(--button-color); font-weight: 600; width: 28px; text-align: right; flex-shrink: 0; }
.to-bom-total {
  display: flex; justify-content: space-between;
  padding: 6px 6px; font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  font-weight: 600; color: var(--button-color); border-top: 1px solid var(--border2);
  margin-top: 4px;
}

/* link/create dialog */
#toRoomDialog {
  display: none; position: fixed; z-index: 1100;
  background: var(--midground-color); border: 1px solid var(--button-color);
  border-radius: 8px; padding: 16px; width: 300px;
  box-shadow: 0 8px 32px var(--scrim-medium);
}
#toRoomDialog h4 {
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight: 600;
  color: var(--button-color); letter-spacing: 1px; text-transform: uppercase;
  margin-bottom: 12px;
}
.to-dialog-input {
  width: 100%; background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r); color: var(--text-light-color); font-family: var(--mono);
  font-size: calc(12px * var(--fs, 1)); padding: 6px 10px; margin-bottom: 8px;
}
.to-dialog-input:focus { outline: none; border-color: var(--button-color); }
.to-dialog-row { display: flex; gap: 6px; margin-top: 10px; }


/* ── Scale calibration ── */
.to-scale-bar {
  position: absolute; top: 12px; right: 12px;
  background: rgb(from var(--text-light-tint-color) r g b / 0.72); border: 1px solid var(--border2);
  border-radius: 6px; padding: 6px 10px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--border2);
  display: flex; align-items: center; gap: 8px; z-index: 10;
}
.to-scale-bar input {
  background: var(--surface-glass-medium); border: 1px solid var(--border2);
  border-radius: 3px; color: var(--border2); font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  padding: 2px 5px; width: 64px; text-align: right;
}
.to-scale-bar input:focus { outline: none; border-color: var(--button-color); }
.to-scale-bar select {
  background: var(--surface-glass-medium); border: 1px solid var(--border2);
  border-radius: 3px; color: var(--border2); font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  padding: 2px 4px;
}
.to-scale-btn {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); padding: 2px 7px;
  border-radius: 3px; border: 1px solid var(--border2);
  background: none; color: var(--border2); cursor: pointer;
}
.to-scale-btn:hover { border-color: var(--button-color); color: var(--button-color); }
.to-scale-btn.active { border-color: var(--button-color); color: var(--button-color); background: rgb(from var(--button-color) r g b / 0.15); }

/* ── Undo/redo toolbar buttons ── */
.to-undo-btn {
  font-family: var(--mono); font-size: calc(12px * var(--fs, 1)); padding: 4px 10px;
  border-radius: var(--r); border: 1px solid var(--border2);
  background: var(--foreground-color); color: var(--text-mid-color); cursor: pointer;
  transition: all var(--dur-fast);
}
.to-undo-btn:hover:not(:disabled) { border-color: var(--button-color); color: var(--button-color); }
.to-undo-btn:disabled { opacity: 0.3; cursor: not-allowed; }

/* ── Inline room editor in dialog ── */
#toRoomDialog { width: 360px; max-height: 80vh; overflow-y: auto; }
.to-room-editor { margin-top: 12px; border-top: 1px solid var(--border); padding-top: 12px; }
.to-room-editor-title {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing: 1.5px;
  text-transform: uppercase; color: var(--button-color); margin-bottom: 10px;
}
.to-re-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 8px; }
.to-re-grid.full { grid-template-columns: 1fr; }
.to-re-field { display: flex; flex-direction: column; gap: 3px; }
.to-re-field label {
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1)); letter-spacing: 1px;
  text-transform: uppercase; color: var(--text-dark-color);
}
.to-re-field select, .to-re-field input {
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: 3px; color: var(--text-light-color); font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1)); padding: 5px 8px; width: 100%;
}
.to-re-field select:focus, .to-re-field input:focus {
  outline: none; border-color: var(--button-color);
}
.to-re-pill-row { display: flex; gap: 5px; flex-wrap: wrap; margin-top: 2px; }
.to-re-pill {
  padding: 3px 9px; border-radius: 12px; border: 1px solid var(--border2);
  background: var(--foreground-color); font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); cursor: pointer; transition: all var(--dur-fast);
}
.to-re-pill.on { background: rgb(from var(--button-color) r g b / 0.18); border-color: var(--button-color); color: var(--button-color); }

/* ── Area label on room ── */
/* (rendered on canvas, no CSS needed) */

/* ── Export progress overlay ── */
#toExportOverlay {
  display: none; position: absolute; inset: 0;
  background: var(--scrim-strong); z-index: 50;
  align-items: center; justify-content: center;
  font-family: var(--mono); font-size: calc(13px * var(--fs, 1)); color: var(--button-color);
}
#toExportOverlay.show { display: flex; }


/* ── Full inline room editor in takeout dialog ── */
#toRoomDialog {
  width: 520px;
  max-width: 95vw;
  max-height: 82vh;
  overflow-y: auto;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
/* Backdrop for dialog */
#toRoomDialogBackdrop {
  display: none; position: fixed; inset: 0; z-index: 1090;
  background: var(--scrim-medium);
}
#toRoomDialogBackdrop.open { display: block; }
.to-re-section {
  border: 1px solid var(--border);
  border-radius: 6px;
  margin-bottom: 8px;
  overflow: hidden;
}
.to-re-hdr {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 10px; cursor: pointer;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); font-weight: 600;
  letter-spacing: 1px; text-transform: uppercase;
  user-select: none;
}
.to-re-hdr .re-pip {
  width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0;
}
.to-re-hdr .re-arr { margin-left: auto; font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color); transition: transform var(--dur-base); }
.to-re-hdr .re-arr.open { transform: rotate(0deg); }
.to-re-hdr .re-arr:not(.open) { transform: rotate(-90deg); }
.to-re-body { padding: 10px; border-top: 1px solid var(--border); }
.to-re-body.hidden { display: none; }

.to-re-grid3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 7px; margin-bottom: 7px; }
.to-re-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; margin-bottom: 7px; }
.to-re-grid1 { display: grid; grid-template-columns: 1fr; gap: 7px; margin-bottom: 7px; }
.to-re-chk-row {
  display: flex; align-items: center; gap: 7px;
  padding: 4px 0; font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-mid-color);
}
.to-re-chk-row input[type=checkbox] { width: 13px; height: 13px; accent-color: var(--button-color); flex-shrink: 0; }
.to-re-alert {
  padding: 5px 8px; border-radius: 4px; margin-bottom: 7px;
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); line-height: 1.5;
}
.to-re-textarea {
  width: 100%; background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: 3px; color: var(--text-light-color); font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1)); padding: 5px 8px; resize: vertical;
  min-height: 48px; line-height: 1.6;
}
.to-re-textarea:focus { outline: none; border-color: var(--button-color); }


/* ── PDF reload banner ── */
.to-reload-banner {
  position: absolute; top: 0; left: 0; right: 0; z-index: 30;
  background: rgb(from var(--button-color) r g b / 0.92); padding: 7px 14px;
  display: flex; align-items: center; gap: 10px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--background-color);
  font-weight: 600;
}
.to-reload-banner label {
  display: flex; align-items: center; gap: 6px; cursor: pointer;
  padding: 3px 10px; border-radius: 4px;
  background: var(--shadow-subtle-high); color: var(--background-color);
  transition: background var(--dur-fast);
}
.to-reload-banner label:hover { background: rgb(from var(--text-light-tint-color) r g b / 0.25); }
.to-reload-banner .dismiss {
  margin-left: auto; background: none; border: none;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--background-color);
  cursor: pointer; opacity: 0.7;
}
.to-reload-banner .dismiss:hover { opacity: 1; }

/* ── Palette search ── */
.to-palette-search {
  width: 100%; background: var(--foreground-color);
  border: 1px solid var(--border2); border-radius: var(--r);
  color: var(--text-light-color); font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  padding: 6px 10px; margin-bottom: 10px;
}
.to-palette-search:focus { outline: none; border-color: var(--button-color); }
.to-palette-empty {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color);
  text-align: center; padding: 16px 8px;
}

/* ── Room edit popover ── */
.to-room-edit-btn {
  background: none; border: none; color: var(--text-dark-color);
  cursor: pointer; font-size: calc(11px * var(--fs, 1)); padding: 1px 5px;
  border-radius: 3px; transition: all var(--dur-fast);
}
.to-room-edit-btn:hover { color: var(--button-color); background: rgb(from var(--button-color) r g b / 0.1); }

#toRoomEditPopover {
  display: none; position: absolute; z-index: 910;
  background: var(--midground-color); border: 1px solid var(--border2);
  border-radius: 8px; padding: 14px; width: 260px;
  box-shadow: 0 6px 24px var(--scrim-medium);
}
#toRoomEditPopover h5 {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing: 2px;
  text-transform: uppercase; color: var(--button-color); margin-bottom: 10px;
}
.to-swatches { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px; }
.to-swatch {
  width: 22px; height: 22px; border-radius: 4px; cursor: pointer;
  border: 2px solid transparent; transition: border-color var(--dur-fast); flex-shrink: 0;
}
.to-swatch:hover, .to-swatch.active { border-color: var(--text-mid-color); }

/* ── Sync diff modal ── */
#toSyncModal,
#toSyncPhotoModal {
  display: none; position: fixed; inset: 0; z-index: 950;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65); align-items: center; justify-content: center;
}
#toSyncModal.open,
#toSyncPhotoModal.open { display: flex; }
.to-sync-box {
  background: var(--midground-color); border: 1px solid var(--border);
  border-radius: 10px; padding: 20px; width: 580px; max-width: 94vw;
  max-height: 80vh; display: flex; flex-direction: column;
  box-shadow: 0 12px 48px var(--scrim-medium);
}
.to-sync-box h3 {
  font-family: var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight: 700;
  letter-spacing: 2px; text-transform: uppercase; color: var(--button-color);
  margin-bottom: 4px;
}
.to-sync-sub {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color);
  margin-bottom: 14px;
}
.to-sync-scroll { flex: 1; overflow-y: auto; margin-bottom: 14px; }
.to-sync-room-hdr {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 8px; background: var(--foreground-color);
  border: 1px solid var(--border); border-radius: 5px 5px 0 0;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); font-weight: 600;
  color: var(--text-light-color); margin-top: 10px;
}
.to-sync-room-hdr:first-child { margin-top: 0; }
.to-sync-room-hdr input[type=checkbox] { accent-color: var(--button-color); width: 13px; height: 13px; }
.to-sync-diff-table {
  width: 100%; border-collapse: collapse;
  border: 1px solid var(--border); border-top: none;
  border-radius: 0 0 5px 5px; margin-bottom: 2px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
}
.to-sync-diff-table th {
  background: var(--foreground-color); color: var(--text-dark-color); font-weight: 600;
  padding: 4px 8px; text-align: left; border-bottom: 1px solid var(--border);
  font-size: calc(9px * var(--fs, 1)); text-transform: uppercase; letter-spacing: 1px;
}
.to-sync-diff-table td {
  padding: 4px 8px; border-bottom: 1px solid var(--border); color: var(--text-mid-color);
}
.to-sync-diff-table tr:last-child td { border-bottom: none; }
.to-sync-new  { color: var(--green) !important; font-weight: 600; }
.to-sync-chg  { color: var(--button-color) !important; font-weight: 600; }
.to-sync-same { color: var(--text-dark-color) !important; }
.to-sync-footer { display: flex; gap: 8px; justify-content: flex-end; }
.to-sync-legend {
  display: flex; gap: 12px; font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); margin-bottom: 8px;
}




/* ══ AS-BUILT LAYER ═══════════════════════════════════════════ */
.to-layer-toggle { display:flex; align-items:center; gap:4px; background:var(--foreground-color); border:1px solid var(--border2); border-radius:6px; padding:2px; }
.to-layer-btn { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); padding:3px 10px; border-radius:4px; border:none; cursor:pointer; background:none; color:var(--text-dark-color); transition:all var(--dur-fast); }
.to-layer-btn.active { background:var(--button-color); color:var(--background-color); font-weight:600; }
.to-asbuilt-legend { display:flex; gap:10px; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); align-items:center; }
.to-abl-dot { width:8px; height:8px; border-radius:50%; display:inline-block; margin-right:3px; }


/* ══ SUBMITTAL LOG ════════════════════════════════════════════ */
.sub-wrap { padding: 20px; }
/* Submittal scorecard — combined card: amber left edge, outer border,
   internal vertical dividers between cells (cells emitted by render). */
.sub-scorecard {
  display:flex;
  flex-wrap:wrap;
  background:var(--foreground-color);
  border:1px solid var(--border);
  border-left:3px solid var(--button-color);
  border-radius:var(--r-lg);
  overflow:hidden;
  margin-bottom:16px;
}
/* Transmittal scorecard — same pattern, fewer cells. */
.transmittal-scorecard {
  display:flex;
  flex-wrap:wrap;
  background:var(--foreground-color);
  border:1px solid var(--border);
  border-left:3px solid var(--button-color);
  border-radius:var(--r-lg);
  overflow:hidden;
  margin-bottom:14px;
}
/* Change Order scorecard — Total / Approved / Pending / Rejected
   counts plus Total Cost / Approved $ figures. */
.co-scorecard {
  display:flex;
  flex-wrap:wrap;
  background:var(--foreground-color);
  border:1px solid var(--border);
  border-left:3px solid var(--button-color);
  border-radius:var(--r-lg);
  overflow:hidden;
  margin-bottom:16px;
}

.sub-add-card { background:var(--foreground-color); border:1px solid var(--border2); border-radius:8px; padding:16px; margin-bottom:16px; }
.sub-add-title { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing:2px; text-transform:uppercase; color:var(--button-color); margin-bottom:12px; }
.sub-grid3 { display:grid; grid-template-columns:1fr 1fr 1fr; gap:10px; margin-bottom:10px; }
.sub-grid2 { display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:10px; }

.sub-status { display:inline-flex; align-items:center; gap:3px; font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); font-weight:600; padding:2px 8px; border-radius:3px; white-space:nowrap; }
.sub-status.submitted  { background:rgb(from var(--button-color) r g b / 0.12); color:var(--button-color); border:1px solid rgb(from var(--button-color) r g b / 0.25); }
.sub-status.review     { background:rgb(from var(--info) r g b / 0.12);  color:var(--info);  border:1px solid rgb(from var(--info) r g b / 0.25); }
.sub-status.approved   { background:rgb(from var(--green) r g b / 0.12);  color:var(--green); border:1px solid rgb(from var(--green) r g b / 0.25); }
.sub-status.rejected   { background:rgb(from var(--red) r g b / 0.12);   color:var(--red);   border:1px solid rgb(from var(--red) r g b / 0.25); }
.sub-status.rr         { background:rgb(from var(--purple) r g b / 0.12); color:var(--purple);      border:1px solid rgb(from var(--purple) r g b / 0.25); }

.sub-list { border:1px solid var(--border); border-radius:6px; overflow:hidden; }
.sub-item { padding:12px 16px; border-bottom:1px solid var(--border); background:var(--midground-color); }
.sub-item:last-child { border-bottom:none; }
.sub-item-hdr { display:flex; align-items:flex-start; gap:10px; margin-bottom:6px; }
.sub-num  { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); flex-shrink:0; min-width:48px; }
.sub-title-wrap { flex:1; }
.sub-item-title { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; color:var(--text-light-color); margin-bottom:2px; }
.sub-item-meta  { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); display:flex; gap:12px; flex-wrap:wrap; }
.sub-action-btn { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); padding:3px 9px; border-radius:4px; border:1px solid var(--border2); background:none; color:var(--text-dark-color); cursor:pointer; transition:all var(--dur-fast); }
.sub-action-btn:hover { border-color:var(--button-color); color:var(--button-color); }
.sub-action-btn.danger:hover { border-color:var(--red); color:var(--red); }

/* ══ VOLTAGE DROP ═════════════════════════════════════════════ */
.vd-wrap {
  /* Updated for visual width parity with the .pane-action-bar above
     it. Previously used `padding: 20px` which created a different
     inner edge from the 12px margin on the action bar — content
     looked indented relative to the bar. Now using 0 padding here,
     and the inner card siblings (.vd-card etc.) carry their own
     12px lateral margin to match canon. */
  padding: 0;
}
.vd-card { background:var(--content-card-bg); border:1px solid var(--border2); border-radius:8px; padding:16px; margin:0 12px 12px 12px; }
.vd-card-title { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing:2px; text-transform:uppercase; color:var(--accent-data); margin-bottom:12px; }
.vd-grid4 { display:grid; grid-template-columns:1fr 1fr 1fr 1fr; gap:10px; margin-bottom:10px; }
/* Voltage-Drop calculator: 4-col grid is too dense for narrow viewports.
   Drop to 2 cols on tablet-landscape and below, 1 col on portrait phones
   so labels and inputs both stay readable. */
@media (max-width: 768px) {
  .vd-grid4 { grid-template-columns: 1fr 1fr; gap: 12px; }
  .vd-wrap  { padding: 14px; }
}
@media (max-width: 480px) {
  .vd-grid4 { grid-template-columns: 1fr; }
}
.vd-grid3 { display:grid; grid-template-columns:1fr 1fr 1fr; gap:10px; margin-bottom:10px; }
.vd-result-box { background:var(--foreground-color); border:1px solid var(--border); border-radius:6px; padding:14px; margin-top:10px; display:flex; align-items:center; gap:16px; flex-wrap:wrap; }
.vd-result-val { font-family:var(--mono); font-size: calc(28px * var(--fs, 1)); font-weight:700; }
.vd-result-val.pass { color:var(--green); }
.vd-result-val.warn { color:var(--button-color); }
.vd-result-val.fail { color:var(--red); }
.vd-result-label { font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); color:var(--text-dark-color); }
.vd-result-detail { font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); color:var(--text-mid-color); }
.vd-saved-list { border:1px solid var(--border); border-radius:6px; overflow:hidden; }
.vd-saved-row { display:flex; align-items:center; gap:10px; padding:8px 14px; border-bottom:1px solid var(--border); font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); background:var(--midground-color); }
.vd-saved-row:last-child { border-bottom:none; }
.vd-saved-row .vr-name { flex:1; color:var(--text-mid-color); }
.vd-saved-row .vr-drop { font-weight:700; }
.vd-saved-row .vr-drop.pass { color:var(--green); }
.vd-saved-row .vr-drop.warn { color:var(--button-color); }
.vd-saved-row .vr-drop.fail { color:var(--red); }
.vd-warn-badge { display:inline-flex; align-items:center; gap:3px; font-family:var(--mono); font-size: calc(8px * var(--fs, 1)); font-weight:700; padding:1px 5px; border-radius:3px; background:rgb(from var(--button-color) r g b / 0.15); color:var(--button-color); border:1px solid rgb(from var(--button-color) r g b / 0.3); margin-left:4px; }

/* ══ COMMISSIONING REPORT ═════════════════════════════════════ */
.cx-rep-wrap { padding: 20px; }
.cx-rep-controls { display:flex; align-items:center; gap:8px; margin-bottom:16px; }
.cx-rep-controls h2 { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; letter-spacing:2px; text-transform:uppercase; color:var(--button-color); flex:1; }
.cx-report-doc { background:var(--foreground-color); border:1px solid var(--border); border-radius:6px; padding:24px; font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); line-height:1.8; color:var(--text-mid-color); max-height:65vh; overflow-y:auto; white-space:pre-wrap; }
.cx-report-doc h1 { font-size: calc(14px * var(--fs, 1)); font-weight:700; color:var(--button-color); letter-spacing:2px; text-transform:uppercase; margin-bottom:4px; }
.cx-report-doc h2 { font-size: calc(12px * var(--fs, 1)); font-weight:600; color:var(--accent-data); letter-spacing:1px; margin:12px 0 4px; border-bottom:1px solid var(--border); padding-bottom:4px; }
.cx-report-doc h3 { font-size: calc(11px * var(--fs, 1)); font-weight:600; color:var(--text-light-color); margin:8px 0 2px; }
.cx-report-doc .pass { color:var(--green); }
.cx-report-doc .fail { color:var(--red); }
.cx-report-doc .warn { color:var(--button-color); }

/* ══ SPEC WRITER ══════════════════════════════════════════════ */.spec-controls { display:flex; align-items:center; gap:8px; margin-bottom:16px; flex-wrap:wrap; }
.spec-controls h2 { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; letter-spacing:2px; text-transform:uppercase; color:var(--button-color); flex:1; }
.spec-doc { background:var(--foreground-color); border:1px solid var(--border); border-radius:6px; padding:24px; font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); line-height:1.8; color:var(--text-mid-color); max-height:65vh; overflow-y:auto; white-space:pre-wrap; }

/* ══ CODE COMPARISON ══════════════════════════════════════════ */
.cc-wrap { padding: 0 20px 20px; }

/* Controls row */
.cc-controls { display:flex; align-items:center; gap:8px; margin-bottom:16px; flex-wrap:wrap; }
.cc-controls h2 { font-family:var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight:600; letter-spacing:2px; text-transform:uppercase; color:var(--button-color); flex:1; }
.cc-ctrl-label { font-family:var(--mono); font-size:9px; color:var(--text-dark-color); text-transform:uppercase; letter-spacing:1px; white-space:nowrap; }
.cc-room-sel { background:var(--foreground-color); border:1px solid var(--border2); border-radius:var(--r); color:var(--text-light-color); font-family:var(--mono); font-size: calc(11px * var(--fs, 1)); padding:6px 10px; }

/* Score bar */
.cc-scorebar { margin-bottom:16px; }
.cc-scorebar-inner { display:flex; align-items:center; gap:10px; }
.cc-vs { font-family:var(--mono); font-size:11px; color:var(--text-dark-color); font-weight:700; flex-shrink:0; }
.cc-sum-tile { flex:1; background:var(--foreground-color); border:1px solid var(--border); border-radius:var(--r); padding:12px 14px; }
.cc-tile-current { border-color:var(--border2); }
.cc-tile-compare { border-color:var(--accent-compare); background:rgb(from var(--accent-compare) r g b / 0.05); }
.cst-code { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--button-color); text-transform:uppercase; letter-spacing:1px; margin-bottom:4px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cc-tile-compare .cst-code { color:var(--accent-compare); }
.cst-score { font-family:var(--mono); font-size: calc(20px * var(--fs, 1)); font-weight:700; line-height:1; margin-bottom:2px; }
.cst-label { font-family:var(--mono); font-size: calc(9px * var(--fs, 1)); color:var(--text-dark-color); }

/* Table */
.cc-table-wrap { overflow-x:auto; }
.cc-table { width:100%; border-collapse:collapse; font-family:var(--mono); font-size: calc(10px * var(--fs, 1)); }
.cc-table th { background:var(--foreground-color); color:var(--text-dark-color); font-weight:600; padding:8px 12px; text-align:left; border:1px solid var(--border); font-size: calc(9px * var(--fs, 1)); text-transform:uppercase; letter-spacing:1px; position:sticky; top:0; }
.cc-table th.cc-col-current { color:var(--button-color); background:rgb(from var(--button-color) r g b / 0.06); width:35%; }
.cc-table th.cc-col-compare { color:var(--accent-compare); background:rgb(from var(--accent-compare) r g b / 0.06); width:35%; }
.cc-table td { padding:6px 12px; border:1px solid var(--border); color:var(--text-mid-color); vertical-align:top; }
.cc-table td.cc-col-current { background:rgb(from var(--button-color) r g b / 0.03); }
.cc-table td.cc-col-compare { background:rgb(from var(--accent-compare) r g b / 0.03); }
.cc-table tr:nth-child(even) td { background:var(--shadow-subtle-low); }
.cc-table tr:nth-child(even) td.cc-col-current { background:rgb(from var(--button-color) r g b / 0.05); }
.cc-table tr:nth-child(even) td.cc-col-compare { background:rgb(from var(--accent-compare) r g b / 0.05); }
/* Row where the two codes produce different results */
.cc-row-diff td { background:rgba(255,200,0,0.04) !important; }
.cc-row-diff td:first-child { border-left:2px solid var(--button-color); }
.cc-pass { color:var(--green); font-weight:600; }
.cc-fail { color:var(--red); font-weight:600; }
.cc-warn { color:var(--button-color); font-weight:600; }
.cc-na   { color:var(--text-dark-color); }


/* ══════════════════════════════════════════════════════════════
   PHOTOMETRICS MODULE
   ══════════════════════════════════════════════════════════════ */

/* Tab inside takeoff topbar */
.to-photo-tab-btn {
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); padding: 4px 14px;
  border-radius: var(--r); border: 1px solid var(--border2);
  background: var(--foreground-color); color: var(--text-mid-color); cursor: pointer;
  transition: all var(--dur-fast); white-space: nowrap; margin-left: 12px;
}
.to-photo-tab-btn:hover { border-color: var(--accent-photometric); color: var(--accent-photometric); }
.to-photo-tab-btn.active { background: rgb(from var(--accent-photometric) r g b / 0.15); border-color: var(--accent-photometric); color: var(--accent-photometric); }

/* Full-screen photometrics panel inside takeout modal */
#photoPanel {
  display: none; position: absolute; inset: 48px 0 0 0;
  background: var(--background-color); z-index: 10; flex-direction: column;
  overflow: hidden;
}
#photoPanel.open { display: flex; }

.photo-layout {
  display: grid;
  grid-template-columns: 260px 1fr 300px;
  flex: 1; min-height: 0;
}

/* Left: fixture library */
.photo-lib {
  background: var(--midground-color); border-right: 1px solid var(--border);
  display: flex; flex-direction: column; overflow: hidden;
}
.photo-lib-hdr {
  padding: 10px 12px 8px; border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.photo-lib-title {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing: 2px;
  text-transform: uppercase; color: var(--accent-photometric); margin-bottom: 8px;
}
.photo-lib-actions { display: flex; gap: 5px; flex-wrap: wrap; }
.photo-lib-btn {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); padding: 4px 9px;
  border-radius: var(--r-sm); border: 1px solid var(--border2);
  background: var(--foreground-color); color: var(--text-mid-color); cursor: pointer;
  transition: all var(--dur-fast); white-space: nowrap;
}
.photo-lib-btn:hover { border-color: var(--accent-photometric); color: var(--accent-photometric); }
.photo-lib-scroll { flex: 1; overflow-y: auto; padding: 8px; }
.photo-fixture-card {
  border: 1px solid var(--border); border-radius: var(--r);
  background: var(--foreground-color); margin-bottom: 6px; overflow: hidden;
  transition: border-color var(--dur-fast);
}
.photo-fixture-card:hover { border-color: var(--border2); }
.photo-fixture-card.selected { border-color: var(--accent-photometric); background: rgb(from var(--accent-photometric) r g b / 0.06); }
.photo-fx-hdr {
  display: flex; align-items: center; gap: 8px; padding: 8px 10px;
  cursor: pointer;
}
.photo-fx-icon { font-size: calc(16px * var(--fs, 1)); flex-shrink: 0; }
.photo-fx-name { font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); font-weight: 600; color: var(--text-light-color); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.photo-fx-generic { font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color); padding: 1px 5px; background: var(--glass); border-radius: 8px; flex-shrink: 0; }
.photo-fx-actions { display: flex; gap: 4px; flex-shrink: 0; }
.photo-fx-btn {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); padding: 2px 7px;
  border-radius: 4px; border: 1px solid var(--border2);
  background: none; color: var(--text-dark-color); cursor: pointer; transition: all var(--dur-fast);
}
.photo-fx-btn:hover { color: var(--text-light-color); border-color: var(--text-dark-color); }
.photo-fx-btn.danger:hover { color: var(--red); border-color: var(--red); }
.photo-fx-detail {
  padding: 0 10px 8px; display: none;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
}
.photo-fx-detail.open { display: block; }
.photo-fx-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 10px; }
.photo-fx-row { display: flex; justify-content: space-between; }
.photo-fx-lbl { color: var(--text-dark-color); }
.photo-fx-val { color: var(--text-mid-color); font-weight: 600; }
.photo-fx-ies-badge {
  display: inline-flex; align-items: center; gap: 4px; margin-top: 6px;
  font-size: calc(9px * var(--fs, 1)); padding: 2px 7px; border-radius: 8px;
  background: rgb(from var(--green) r g b / 0.12); color: var(--green); border: 1px solid rgb(from var(--green) r g b / 0.2);
}

/* Center: room calc area */
.photo-center {
  display: flex; flex-direction: column; overflow: hidden; background: var(--background-color);
}
#photoHeatmapWrap { min-width: 0; }
.photo-center-tabs {
  display: flex; border-bottom: 1px solid var(--border); flex-shrink: 0;
  background: var(--midground-color); padding: 0 12px;
}
.photo-ctab {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); padding: 9px 14px;
  background: none; border: none; cursor: pointer; color: var(--text-dark-color);
  letter-spacing: 0.5px; border-bottom: 2px solid transparent; margin-bottom: -1px;
  transition: color var(--dur-fast);
}
.photo-ctab:hover { color: var(--text-mid-color); }
.photo-ctab.active { color: var(--accent-photometric); border-bottom-color: var(--accent-photometric); }
.photo-cpane { display: none; flex: 1; overflow-y: auto; padding: 16px; }
.photo-cpane.active { display: flex; flex-direction: column; gap: 14px; }
/* When children have default flex-shrink:1 they collapse instead of letting
   the parent overflow-y:auto kick in. Pin them to their natural height. */
.photo-cpane > * { flex-shrink: 0; }

/* Room selector + params */
.photo-room-bar {
  display: flex; align-items: center; gap: 10px; flex-shrink: 0;
  padding: 10px 16px; background: var(--midground-color); border-bottom: 1px solid var(--border);
}
.photo-room-bar select {
  font-family: var(--sans); font-size: calc(12px * var(--fs, 1)); padding: 5px 10px;
  background: var(--foreground-color); border: 1px solid var(--border2); border-radius: var(--r-sm);
  color: var(--text-light-color); flex: 1;
}
.photo-room-bar select option { background: var(--foreground-color); color: var(--text-light-color); }
.photo-calc-btn {
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); padding: 6px 16px;
  border-radius: 20px; border: 1px solid var(--accent-photometric);
  background: rgb(from var(--accent-photometric) r g b / 0.12); color: var(--accent-photometric); cursor: pointer;
  transition: all var(--dur-base); white-space: nowrap; font-weight: 600;
}
.photo-calc-btn:hover { background: rgb(from var(--accent-photometric) r g b / 0.22); }

/* Loading state: pure-CSS animated dots so they continue animating
   even while the main thread is busy with synchronous calc work.
   JS-driven setInterval can't animate during a lock-up, but CSS
   animations run on the compositor thread and are unaffected. */
.photo-calc-btn.is-loading,
.photo-calc-btn[data-loading="true"] {
  cursor: progress;
  opacity: 0.85;
  pointer-events: none;
}
.photo-calc-btn.is-loading::after,
.photo-calc-btn[data-loading="true"]::after {
  content: '';
  display: inline-block;
  width: 1.2em;
  text-align: left;
  animation: photoLoadingDots 1.4s steps(4, end) infinite;
}
@keyframes photoLoadingDots {
  0%   { content: ''; }
  25%  { content: '.'; }
  50%  { content: '..'; }
  75%  { content: '...'; }
  100% { content: ''; }
}
/* Same pattern for the recommend "Compute" / "Run" affordances and
   any element marked data-loading="true". The selector above already
   covers it via data-loading; this lighter variant is for non-button
   contexts (e.g., a status line). */
[data-loading="true"]:not(.photo-calc-btn)::after {
  content: '';
  display: inline-block;
  width: 1.2em;
  text-align: left;
  animation: photoLoadingDots 1.4s steps(4, end) infinite;
}

/* Params card */
.photo-params-card {
  background: var(--midground-color); border: 1px solid var(--border); border-radius: var(--r);
  padding: 12px 14px;
}
.photo-params-title {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing: 1.5px;
  text-transform: uppercase; color: var(--text-dark-color); margin-bottom: 10px;
}
.photo-params-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
  gap: 10px;
}
.photo-param-field { display: flex; flex-direction: column; gap: 4px; }
.photo-param-field label {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color);
  letter-spacing: 0.3px; text-transform: uppercase;
}
.photo-param-field input, .photo-param-field select {
  padding: 6px 9px; background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color); font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1)); transition: border-color var(--dur-fast);
}
.photo-param-field input:focus, .photo-param-field select:focus {
  outline: none; border-color: var(--accent-photometric);
}
.photo-param-field select option { background: var(--foreground-color); }

/* Fixture assignment table */
.photo-assign-card {
  background: var(--midground-color); border: 1px solid var(--border); border-radius: var(--r);
  overflow: hidden;
}
.photo-assign-hdr {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 12px; background: var(--glass); border-bottom: 1px solid var(--border);
}
.photo-assign-hdr-title { font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing: 1.5px; text-transform: uppercase; color: var(--text-dark-color); }
.photo-add-row-btn {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); padding: 3px 10px;
  border-radius: var(--r-sm); border: 1px solid var(--border2);
  background: none; color: var(--text-dark-color); cursor: pointer; transition: all var(--dur-fast);
}
.photo-add-row-btn:hover { border-color: var(--accent-photometric); color: var(--accent-photometric); }
.photo-assign-table { width: 100%; border-collapse: collapse; font-size: calc(10px * var(--fs, 1)); }
.photo-assign-table th {
  padding: 6px 10px; font-family: var(--mono); font-size: calc(8px * var(--fs, 1)); font-weight: 600;
  letter-spacing: 0.8px; text-transform: uppercase; color: var(--text-dark-color);
  border-bottom: 1px solid var(--border); text-align: left; background: var(--glass);
}
.photo-assign-table td {
  padding: 5px 8px; border-bottom: 1px solid var(--border); vertical-align: middle;
}
.photo-assign-table tr:last-child td { border-bottom: none; }
.photo-assign-table select, .photo-assign-table input[type=number] {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); padding: 3px 6px;
  background: var(--foreground-color); border: 1px solid var(--border2); border-radius: 4px;
  color: var(--text-light-color); width: 100%;
}
.photo-assign-table select option { background: var(--foreground-color); }
.photo-del-row { background: none; border: none; color: var(--text-dark-color); cursor: pointer; font-size: calc(12px * var(--fs, 1)); padding: 2px 4px; }
.photo-del-row:hover { color: var(--red); }

/* Results */
.photo-results-card {
  background: var(--midground-color); border: 1px solid var(--border); border-radius: var(--r); overflow: hidden;
}
.photo-results-hdr {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 12px; border-bottom: 1px solid var(--border); background: var(--glass);
}
.photo-results-title { font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing: 1.5px; text-transform: uppercase; color: var(--text-dark-color); flex: 1; }
.photo-view-toggle {
  display: flex; gap: 3px; background: var(--foreground-color); border-radius: 6px; padding: 2px;
}
.photo-view-btn {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); padding: 3px 9px;
  border-radius: 4px; border: none; background: none; color: var(--text-dark-color); cursor: pointer; transition: all var(--dur-fast);
}
.photo-view-btn.active { background: var(--midground-color); color: var(--accent-photometric); }

/* Metrics scorecard */
.photo-metrics-row {
  display: grid; grid-template-columns: repeat(4, 1fr);
  border-bottom: 1px solid var(--border);
}
.photo-metric {
  padding: 12px; text-align: center; border-right: 1px solid var(--border);
}
.photo-metric:last-child { border-right: none; }
.photo-metric-val { font-family: var(--mono); font-size: calc(20px * var(--fs, 1)); font-weight: 700; color: var(--text-light-color); line-height: 1; margin-bottom: 4px; }
.photo-metric-lbl { font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color); text-transform: uppercase; letter-spacing: 0.5px; }
.photo-metric-val.pass { color: var(--green); }
.photo-metric-val.warn { color: var(--button-color); }
.photo-metric-val.fail { color: var(--red); }

/* Heat map canvas */
.photo-heatmap-wrap {
  padding: 14px; display: flex; justify-content: center; align-items: flex-start;
}
#photoHeatmapCanvas {
  border-radius: var(--r); border: 1px solid var(--border);
  display: block; max-width: 100%;
}

/* Tabular grid */
.photo-grid-table {
  width: 100%; border-collapse: collapse;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  margin: 0;
}
.photo-grid-table th {
  padding: 5px 8px; font-size: calc(8px * var(--fs, 1)); font-weight: 700; letter-spacing: 0.5px;
  text-transform: uppercase; color: var(--text-dark-color); border-bottom: 1px solid var(--border);
  background: var(--glass); text-align: center;
}
.photo-grid-table td {
  padding: 4px 8px; border: 1px solid var(--border); text-align: center;
  font-size: calc(10px * var(--fs, 1)); font-weight: 600;
}
.photo-cell-pass { background: rgb(from var(--green) r g b / 0.12); color: var(--green); }
.photo-cell-warn { background: rgb(from var(--button-color) r g b / 0.12); color: var(--button-color); }
.photo-cell-fail { background: rgb(from var(--red) r g b / 0.12); color: var(--red); }

/* Compliance band */
.photo-compliance-band {
  display: flex; align-items: stretch; gap: 0; border-top: 1px solid var(--border);
}
.photo-comp-item {
  flex: 1; padding: 10px 12px; border-right: 1px solid var(--border);
  display: flex; flex-direction: column; gap: 3px;
}
.photo-comp-item:last-child { border-right: none; }
.photo-comp-label { font-family: var(--mono); font-size: calc(8px * var(--fs, 1)); text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-dark-color); }
.photo-comp-status { font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); font-weight: 700; }
.photo-comp-status.pass { color: var(--green); }
.photo-comp-status.warn { color: var(--button-color); }
.photo-comp-status.fail { color: var(--red); }
.photo-comp-detail { font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color); }

/* Right panel: project summary */
.photo-right {
  background: var(--midground-color); border-left: 1px solid var(--border);
  display: flex; flex-direction: column; overflow: hidden;
}
.photo-right-hdr {
  padding: 10px 12px; border-bottom: 1px solid var(--border); flex-shrink: 0;
}
.photo-right-title { font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); letter-spacing: 2px; text-transform: uppercase; color: var(--accent-photometric); margin-bottom: 4px; }
.photo-right-scroll { flex: 1; overflow-y: auto; padding: 8px; }
.photo-summary-room {
  border: 1px solid var(--border); border-radius: var(--r); margin-bottom: 6px;
  background: var(--foreground-color); overflow: hidden; cursor: pointer; transition: border-color var(--dur-fast);
}
.photo-summary-room:hover { border-color: var(--border2); }
.photo-summary-room.active { border-color: var(--accent-photometric); }
.photo-sum-hdr {
  display: flex; align-items: center; gap: 8px; padding: 7px 10px;
}
.photo-sum-name { font-family: var(--sans); font-size: calc(11px * var(--fs, 1)); font-weight: 600; color: var(--text-light-color); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.photo-sum-badge {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); font-weight: 700; padding: 1px 7px;
  border-radius: 8px;
}
.photo-sum-badge.pass { background: rgb(from var(--green) r g b / 0.15); color: var(--green); }
.photo-sum-badge.warn { background: rgb(from var(--button-color) r g b / 0.15); color: var(--button-color); }
.photo-sum-badge.fail { background: rgb(from var(--red) r g b / 0.15); color: var(--red); }
.photo-sum-badge.none { background: var(--glass); color: var(--text-dark-color); }
.photo-sum-fc { font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--text-dark-color); padding: 0 10px 7px; }
.photo-right-export-btn {
  margin: 10px; font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); padding: 8px;
  border-radius: var(--r); border: 1px solid var(--accent-photometric);
  background: rgb(from var(--accent-photometric) r g b / 0.1); color: var(--accent-photometric); cursor: pointer;
  transition: all var(--dur-base); text-align: center; font-weight: 600;
}
.photo-right-export-btn:hover { background: rgb(from var(--accent-photometric) r g b / 0.2); }

/* Fixture edit modal */
#photoFxModal {
  display: none; position: fixed; inset: 0; z-index: 9000;
  background: var(--scrim-strong); backdrop-filter: blur(6px);
  align-items: center; justify-content: center;
}
#photoFxModal.open { display: flex; }
.photo-fx-modal-card {
  background: var(--midground-color); border: 1px solid var(--border2); border-radius: var(--r-lg);
  padding: 24px; width: 540px; max-width: 96vw; max-height: 90vh; overflow-y: auto;
  box-shadow: var(--shadow-lg);
}
.photo-fx-modal-title {
  font-family: var(--sans); font-size: calc(16px * var(--fs, 1)); font-weight: 700; color: var(--text-light-color);
  margin-bottom: 16px; letter-spacing: -0.3px;
}
.photo-fx-modal-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 16px; }
.photo-fx-modal-grid .fg { display: flex; flex-direction: column; gap: 5px; }
.photo-fx-modal-grid label { font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color); text-transform: uppercase; letter-spacing: 0.5px; }
.photo-fx-modal-grid input, .photo-fx-modal-grid select, .photo-fx-modal-grid textarea {
  padding: 7px 10px; background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color); font-family: var(--mono); font-size: calc(12px * var(--fs, 1));
}
.photo-fx-modal-grid select option { background: var(--foreground-color); color: var(--text-light-color); }
.photo-fx-modal-grid textarea { resize: vertical; min-height: 60px; }
.photo-ies-upload-area {
  border: 1px dashed var(--border2); border-radius: var(--r);
  padding: 14px; text-align: center; cursor: pointer; transition: all var(--dur-fast);
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1)); color: var(--text-dark-color); margin-bottom: 16px;
}
.photo-ies-upload-area:hover { border-color: var(--accent-photometric); color: var(--accent-photometric); }
.photo-ies-parsed { background: rgb(from var(--green) r g b / 0.08); border: 1px solid rgb(from var(--green) r g b / 0.2); border-radius: var(--r); padding: 10px 12px; font-family: var(--mono); font-size: calc(10px * var(--fs, 1)); color: var(--green); margin-bottom: 16px; }
.photo-fx-modal-footer { display: flex; gap: 8px; justify-content: flex-end; }

/* ═══════════════════════════════════════════════════════════════
   PROJECT WIZARD
   ═══════════════════════════════════════════════════════════════ */
.wizard-shell {
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  width: min(600px, 94vw);
  max-width: 100vw;
  max-height: 90vh;
  overflow-y: auto;
  overflow-x: hidden;
  box-shadow: 0 24px 64px var(--scrim-strong);
  display: flex;
  flex-direction: column;
}
.wizard-header {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 16px 24px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.wizard-logo {
  font-family: var(--sans);
  font-size: 16px;
  font-weight: 700;
  color: var(--text-light-color);
}
.wizard-logo em { color: var(--wm-orizon); font-style: normal; }
.wizard-logo .wm-ver { color: var(--wm-one); }
.wizard-step-indicator {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
  letter-spacing: 0.5px;
  flex: 1;
}
.wizard-skip {
  background: none;
  border: none;
  color: var(--text-dark-color);
  font-family: var(--mono);
  font-size: 11px;
  cursor: pointer;
  padding: 4px 8px;
  border-radius: var(--r);
  transition: color var(--dur-base);
}
.wizard-skip:hover { color: var(--text-mid-color); }
.wizard-step { padding: 28px 28px 20px; }
.wizard-step-title {
  font-family: var(--sans);
  font-size: 20px;
  font-weight: 700;
  color: var(--text-light-color);
  margin-bottom: 6px;
  letter-spacing: -0.3px;
}
.wizard-step-sub {
  font-family: var(--sans);
  font-size: 13px;
  color: var(--text-dark-color);
  margin-bottom: 24px;
  line-height: 1.5;
}
.wizard-options {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 28px;
}
.wizard-options-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.wizard-option {
  background: var(--foreground-color);
  border: 2px solid var(--border);
  border-radius: var(--r-lg);
  padding: 16px 18px;
  cursor: pointer;
  transition: border-color var(--dur-base), background var(--dur-base), transform var(--dur-fast);
  display: flex;
  align-items: center;
  gap: 14px;
}
@media (hover: hover) {
  .wizard-option:hover {
    border-color: var(--button-color);
    background: rgb(from var(--button-color) r g b / 0.06);
    transform: translateY(-1px);
  }
}
.wizard-option.selected {
  border-color: var(--button-color);
  background: rgb(from var(--button-color) r g b / 0.10);
}
.wizard-option-sm {
  padding: 14px 16px;
  flex-direction: column;
  align-items: flex-start;
  gap: 6px;
}
.wizard-option-icon {
  font-size: 22px;
  flex-shrink: 0;
  line-height: 1;
}
.wizard-option-sm .wizard-option-icon { font-size: 20px; }
.wizard-option-label {
  font-family: var(--sans);
  font-size: 14px;
  font-weight: 600;
  color: var(--text-light-color);
}
.wizard-option-sm .wizard-option-label { font-size: 12px; }
.wizard-option-desc {
  font-family: var(--sans);
  font-size: 12px;
  color: var(--text-dark-color);
  line-height: 1.4;
}
.wizard-nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-top: 16px;
  border-top: 1px solid var(--border);
  margin-top: 4px;
}
.wizard-fields { display: flex; flex-direction: column; gap: 14px; margin-bottom: 24px; }
.wizard-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.wizard-field { display: flex; flex-direction: column; gap: 5px; }
.wizard-field label {
  font-family: var(--mono);
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--text-dark-color);
}
.wizard-field input,
.wizard-field select {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  color: var(--text-light-color);
  font-family: var(--mono);
  font-size: 12px;
  padding: 8px 10px;
  width: 100%;
  outline: none;
  transition: border-color var(--dur-base);
}
.wizard-field input:focus,
.wizard-field select:focus { border-color: var(--button-color); }

/* Session 24x: collapsed "advanced" section in wizard step 3.
   Defaults to closed so visual density matches "just a name to start." */
.wizard-advanced {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  padding: 10px 12px;
}
.wizard-advanced > summary {
  cursor: pointer;
  font-family: var(--mono);
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  color: var(--text-light-color);
  outline: none;
  user-select: none;
}
.wizard-advanced > summary::-webkit-details-marker { color: var(--text-dark-color); }
.wizard-advanced-hint {
  font-family: var(--sans);
  font-size: 10px;
  font-weight: normal;
  text-transform: none;
  letter-spacing: 0;
  color: var(--text-dark-color);
  margin-left: 4px;
}
.wizard-advanced[open] > summary { margin-bottom: 4px; }

@media (max-width: 480px) {
  .wizard-field-row { grid-template-columns: 1fr; }
  .wizard-options-grid { grid-template-columns: 1fr; }
}

/* ═══════════════════════════════════════════════════════════════
   AUTH — Login / Signup / User Menu
   ═══════════════════════════════════════════════════════════════ */
.auth-shell {
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  width: min(420px, 94vw);
  box-shadow: 0 24px 64px var(--scrim-strong);
  overflow: hidden;
}
.auth-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 20px;
  border-bottom: 1px solid var(--border);
}
.auth-tabs {
  display: flex;
  border-bottom: 1px solid var(--border);
}
.auth-tab {
  flex: 1;
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  padding: 12px;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.5px;
  color: var(--text-dark-color);
  cursor: pointer;
  transition: color var(--dur-base), border-color var(--dur-base);
  text-transform: uppercase;
}
.auth-tab:hover { color: var(--text-light-color); }
.auth-tab.active { color: var(--button-color); border-bottom-color: var(--button-color); }
.auth-pane { padding: 24px 24px 20px; }
.auth-pane-title {
  font-family: var(--sans);
  font-size: 15px;
  font-weight: 600;
  color: var(--text-light-color);
  margin-bottom: 16px;
}
.auth-field {
  display: flex;
  flex-direction: column;
  gap: 5px;
  margin-bottom: 14px;
}
.auth-field label {
  font-family: var(--mono);
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--text-dark-color);
}
.auth-field input {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  color: var(--text-light-color);
  font-family: var(--mono);
  font-size: 13px;
  padding: 9px 11px;
  outline: none;
  transition: border-color var(--dur-base);
  width: 100%;
}
.auth-field input:focus { border-color: var(--button-color); }
.auth-error-msg {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--red, #ff6b6b);
  min-height: 16px;
  margin-bottom: 10px;
  line-height: 1.4;
}
.auth-submit {
  width: 100%;
  padding: 11px;
  font-size: 13px;
  margin-bottom: 12px;
}
.auth-footer-link { text-align: center; }
.auth-link {
  background: none;
  border: none;
  color: var(--text-dark-color);
  font-family: var(--mono);
  font-size: 11px;
  cursor: pointer;
  padding: 4px;
}
.auth-link:hover { color: var(--button-color); }

/* User avatar button */
.auth-user-menu-wrap { position: relative; }
.auth-avatar {
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--avatar-bg);
  color: var(--avatar-ink);
  font-family: var(--sans);
  font-size: 11px;
  font-weight: 700;
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: opacity var(--dur-base);
  flex-shrink: 0;
}
.auth-avatar:hover { opacity: 0.85; }

/* ── Collapsible menu sections (Project Defaults, Appearance) ────
   Header button + body pair inside the avatar dropdown. The button
   carries .hdr-menu-section-toggle and the body carries
   .hdr-menu-section-body. Adding .collapsed to the body hides it;
   the caret rotation is handled inline in the toggle handler so it
   tracks state immediately without waiting for class transitions. */
.hdr-menu-section-toggle:hover {
  background: rgb(from var(--text-light-tint-color) r g b / 0.04);
}
.hdr-menu-section-body.collapsed {
  display: none !important;
}

/* User dropdown menu */
.auth-user-menu {
  display: none;
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  min-width: 220px;
  box-shadow: 0 8px 32px var(--scrim-medium);
  z-index: 500;
  overflow: hidden;
}
.auth-user-menu.open { display: block; }
.auth-menu-name {
  padding: 12px 14px 2px;
  font-family: var(--sans);
  font-size: 13px;
  font-weight: 600;
  color: var(--text-light-color);
}
.auth-menu-role {
  padding: 0 14px 10px;
  font-family: var(--mono);
  font-size: 10px;
  color: var(--button-color);
  letter-spacing: 0.3px;
  text-transform: capitalize;
}
.auth-menu-divider {
  height: 1px;
  background: var(--border2);
  margin: 2px 0;
}

/* Project list */
.project-list-item {
  padding: 12px 16px;
  cursor: pointer;
  border-radius: var(--r);
  margin: 2px 4px;
  transition: background var(--dur-fast), transform var(--dur-fast), box-shadow var(--dur-fast);
}
@media (hover: hover) {
  .project-list-item:hover {
    background: var(--glass);
    transform: translateY(-1px);
    box-shadow: 0 2px 8px rgb(from var(--text-light-tint-color) r g b / 0.25);
  }
}
.pli-name {
  font-family: var(--sans);
  font-size: 13px;
  font-weight: 600;
  color: var(--text-light-color);
  margin-bottom: 3px;
}
.pli-meta {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
}
.auth-loading, .auth-empty, .auth-error {
  padding: 28px 20px;
  text-align: center;
  font-family: var(--mono);
  font-size: 11px;
  color: var(--text-dark-color);
}
.auth-error { color: var(--red, #ff6b6b); }

/* ── Storage meter ───────────────────────────────────────────── */
.auth-storage-meter {
  padding: 8px 14px 10px;
  border-bottom: 1px solid var(--border2);
}
.auth-storage-bar-wrap {
  height: 4px;
  background: var(--foreground-color);
  border-radius: 2px;
  overflow: hidden;
  margin-bottom: 5px;
}
.auth-storage-bar {
  height: 100%;
  border-radius: 2px;
  width: 0%;
  transition: width 0.4s ease, background 0.3s;
}
.auth-storage-label {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
}

/* ── Avatar menu row ─────────────────────────────────────────── */
.auth-menu-avatar-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px 10px;
}
.auth-menu-avatar-thumb {
  position: relative;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--button-color);
  color: var(--btn-primary-ink);
  font-family: var(--sans);
  font-size: 14px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  flex-shrink: 0;
  overflow: hidden;
}
.auth-menu-avatar-edit {
  position: absolute;
  inset: 0;
  background: rgb(from var(--text-light-tint-color) r g b / 0.45);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-mid-color);
  font-size: 14px;
  opacity: 0;
  transition: opacity var(--dur-base);
  border-radius: 50%;
}
.auth-menu-avatar-thumb:hover .auth-menu-avatar-edit { opacity: 1; }

/* ── Project list delete button ──────────────────────────────── */
.project-list-item {
  display: flex;
  align-items: center;
  gap: 0;
}
.pli-main {
  flex: 1;
  padding: 12px 16px;
  cursor: pointer;
  border-radius: var(--r);
  transition: background var(--dur-fast);
}
.pli-main:hover { background: var(--glass); }
.pli-delete {
  background: none;
  border: none;
  color: var(--text-dark-color);
  font-size: 12px;
  padding: 8px 12px;
  cursor: pointer;
  border-radius: var(--r);
  opacity: 0;
  transition: opacity var(--dur-base), color var(--dur-base);
  flex-shrink: 0;
}
.project-list-item:hover .pli-delete { opacity: 1; }
.pli-delete:hover { color: var(--red, #e05252); }

/* Archive action — amber rather than red since it's reversible.
   Matches .pli-delete sizing/opacity-on-hover; styled inline as
   "⌄" (downward chevron) which reads as "tuck away below". */
.pli-archive {
  background: none;
  border: none;
  color: var(--text-dark-color);
  font-size: 16px;
  line-height: 1;
  padding: 8px 10px;
  cursor: pointer;
  border-radius: var(--r);
  opacity: 0;
  transition: opacity var(--dur-base), color var(--dur-base);
  flex-shrink: 0;
}
.project-list-item:hover .pli-archive { opacity: 1; }
.pli-archive:hover { color: var(--button-color); }

/* Archived row — dimmed but still readable. The ARCHIVED chip
   inside .pli-meta carries the explicit signal; opacity is the
   secondary cue. Buttons on archived rows stay full-strength so
   the Restore action is clearly clickable. */
.project-list-item.is-archived .pli-main { opacity: 0.55; }
.project-list-item.is-archived:hover .pli-main { opacity: 0.8; }

/* Same treatment for the team panel project card. The card itself
   dims rather than just .pli-main because the team panel card
   structure is different (no equivalent sub-element to dim
   independently). Buttons inherit the dim too — at 0.6 they remain
   clearly visible and clickable, and the unified dim reads as
   "this whole card is in a backgrounded state." */
.team-proj-card.is-archived { opacity: 0.6; transition: opacity var(--dur-base); }
.team-proj-card.is-archived:hover { opacity: 0.85; }

/* Deleted (soft-deleted) row — shown only in the Recently Deleted
   view. Italics + reduced opacity + non-interactive name area. */
.project-list-item.is-deleted .pli-main {
  opacity: 0.7;
  font-style: italic;
}
.project-list-item.is-deleted .pli-name {
  text-decoration: line-through;
  text-decoration-color: var(--text-dark-color);
}

/* ── Subscribe modal tier/period buttons ─────────────────────── */
.sub-tier-btn.selected,
.sub-period-btn.selected {
  border-color: var(--button-color) !important;
  background: rgb(from var(--button-color) r g b / 0.1) !important;
  color: var(--text-light-color) !important;
}

/* ── Validation banner ───────────────────────────────────────── */
#validationBanner {
  /* v26.04.28 polish: was a flat full-bleed border-bottom strip; now
     a floating rounded card sitting in the 12px outer-margin gutter
     between the doc-header and the tab strip. Symmetric vertical
     spacing inherits from the parent's margin pattern.

     v26.04.28b: severity segments now lay out horizontally inside
     the card (highest severity leftmost). Each segment retains its
     own colored 3px left border + tinted background. The rightmost
     segment (.vb-last) is flex:1 so its tint fills any remaining
     width — non-rightmost segments are sized to their content and
     use compact text. Below 768px viewport, segments fall back to
     vertical stacking (legacy behavior) since the editor isn't
     mobile-first and three side-by-side segments don't fit. */
  margin: 0 12px 12px 12px;
  background: var(--glass);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
  flex-shrink: 0;
  /* The display: flex is set inline by the JS at show time so it
     can coexist with the JS's display:none when there are no items;
     no rule needed here. */
}
.vb-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  font-family: var(--mono);
  font-size: 11px;
  border-left: 3px solid transparent;
  transition: background var(--dur-base);
  /* Sized to content by default; .vb-last opts into flex:1 below. */
  flex-shrink: 0;
  min-width: 0;
}
/* The rightmost segment fills remaining width with its severity tint. */
.vb-item.vb-last { flex: 1; }
/* Adjacent segments separated by a thin vertical rule — the colored
   left border of the next segment provides the primary boundary, this
   keeps the card border tone visible between segments. */
.vb-item + .vb-item {
  border-top: none;
}
.vb-item[onclick]:hover { background: var(--glass); }
.vb-fail  { border-left-color: var(--vb-fail);  background: rgb(from var(--vb-fail) r g b / 0.06); }
.vb-warn  { border-left-color: var(--vb-warn);  background: rgb(from var(--vb-warn) r g b / 0.06); }
.vb-info  { border-left-color: var(--vb-info);  background: rgb(from var(--vb-info) r g b / 0.04); }
.vb-pass  { border-left-color: var(--vb-pass);  background: rgb(from var(--vb-pass) r g b / 0.05); }
.vb-icon  { font-size: 12px; flex-shrink: 0; }
.vb-fail  .vb-icon { color: var(--vb-fail); }
.vb-warn  .vb-icon { color: var(--vb-warn); }
.vb-info  .vb-icon { color: var(--vb-info); }
.vb-pass  .vb-icon { color: var(--vb-pass); }
.vb-msg   { color: var(--text-mid-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.vb-item.vb-last .vb-msg { flex: 1; }
.vb-rooms { color: var(--text-dark-color); }
.vb-link  { color: var(--button-color); font-size: 10px; flex-shrink: 0; }

/* Narrow viewport fallback: stack segments vertically again so each
   one has the full bar width to show its message. The editor is not
   designed for mobile, but this keeps the bar from looking cramped
   on tablets in portrait or in dev tools at narrow widths. */
@media (max-width: 768px) {
  #validationBanner { display: block !important; }
  .vb-item { width: 100%; flex-shrink: 1; }
  .vb-item + .vb-item { border-top: 1px solid var(--border); }
  .vb-item.vb-last { flex: 0 0 auto; }
}

/* ── Accessibility ───────────────────────────────────────────── */
.skip-link {
  position: absolute;
  top: -100px;
  left: 16px;
  background: var(--button-color);
  color: var(--btn-primary-ink);
  padding: 8px 16px;
  border-radius: 0 0 var(--r) var(--r);
  font-weight: 700;
  font-size: 13px;
  z-index: 9999;
  text-decoration: none;
  transition: top var(--dur-base);
}
.skip-link:focus { top: 0; }

/* Ensure focus indicators are visible */
:focus-visible {
  outline: 2px solid var(--button-color);
  outline-offset: 2px;
}
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  outline: 2px solid var(--button-color);
  outline-offset: 2px;
}

/* ── Auth gate (full screen login) ──────────────────────────── */
#authGate {
  position: fixed;
  inset: 0;
  background: var(--background-color);
  z-index: 2000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}
.auth-gate-inner {
  width: 100%;
  max-width: 380px;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.auth-gate-logo {
  font-family: var(--sans);
  font-size: 42px;
  font-weight: 700;
  letter-spacing: -1px;
  margin-bottom: 6px;
}
.auth-gate-o { color: var(--wm-orizon); }
.auth-gate-v { color: var(--wm-one); }
.auth-gate-tag {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--text-dark-color);
  margin-bottom: 40px;
  text-align: center;
}

/* Auth gate */
#appBody { display: none; }

/* ── Wizard step 2 tile descriptions ── */
.wizard-option-sm .wizard-option-desc {
  font-family: var(--sans);
  font-size: 10px;
  color: var(--text-dark-color);
  line-height: 1.4;
  margin-top: 2px;
}
/* ── Wizard step progress dots ── */
.wizard-progress {
  display: flex;
  align-items: center;
  gap: 6px;
}
.wizard-progress-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--border2);
  transition: background var(--dur-slow);
}
.wizard-progress-dot.active {
  background: var(--button-color);
}
/* ── First-use guide overlay ── */
#_fugOverlay {
  font-family: var(--sans, -apple-system, Arial, sans-serif);
}


/* ═══════════════════════════════════════════════════════════════
   TABLET & TOUCH RESPONSIVE (F-01)
   Breakpoints:
     1024px — landscape tablet (iPad, Surface)
      768px — portrait tablet + large phone landscape
      480px — phone portrait (existing, extended below)
   ═══════════════════════════════════════════════════════════════ */

/* ── Sidebar drawer overlay (hidden by default, shown on tablet) ── */
.sidebar-backdrop {
  position: fixed; inset: 0;
  background: rgb(from var(--text-light-tint-color) r g b / 0.55);
  z-index: 149;
  -webkit-tap-highlight-color: transparent;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--dur-slow) ease;
}
.sidebar-backdrop.open {
  opacity: 1;
  pointer-events: auto;
}

/* ── Sidebar toggle bar (sits above tab bar on tablet/phone) ── */
.sidebar-toggle-bar { display: none !important; }
.sidebar-toggle { display: none !important; }

/* ── Hamburger toggle button (shown on tablet/phone) ── */
.sidebar-toggle {
  display: flex;
  background: none; border: none;
  color: var(--text-light-color); cursor: pointer;
  padding: 8px 10px;
  border-radius: var(--r);
  min-height: 44px;
  align-items: center; justify-content: flex-start;
  -webkit-tap-highlight-color: transparent;
}
.sidebar-toggle:active { background: var(--glass); }

/* ── Landscape tablet (1024px) ── */
@media (max-width: 1024px) {
  /* Slightly narrower sidebar */
  .layout { grid-template-columns: 200px 1fr; }

  /* Larger touch targets on tabs */
  .out-tab { padding: 13px 11px; min-height: 44px; }

  /* Header: hide low-priority items */
  .hdr-release { display: none; }
  /* Note: `.wm-release` (containing "| distant blue") used to be hidden here,
     but with the v2 header layout there's plenty of room at this breakpoint.
     It only gets hidden at the 768px mobile breakpoint below. */

  /* Larger touch area on sidebar room items */
  .room-item, .zone-header { min-height: 40px; }
  .btn { min-height: 36px; }

  /* Output card header: shrink PDF button text */
  .hdr-btn-primary { font-size: 11px; padding: 6px 12px; }

  /* Tab bar: allow horizontal scroll before wrapping */
  .out-tabs-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .out-tabs { flex-wrap: nowrap; min-width: max-content; }

  /* Scrollable inner tabs */
  .inner-tabs { overflow-x: auto; flex-wrap: nowrap; }
  .inner-tab { white-space: nowrap; flex-shrink: 0; }
}

/* ── Portrait tablet / large phone landscape (768px) ── */
@media (max-width: 768px) {
  /* Show hamburger, hide sidebar by default */
  .sidebar-toggle { display: flex; }

  /* Show sidebar float button */
  #sidebarFloatBtn { display: flex !important; }

  /* Sidebar becomes a fixed drawer */
  .layout { grid-template-columns: 1fr; }
  .sidebar {
    position: fixed;
    top: 0; left: 0; bottom: 0;
    width: min(300px, 85vw);
    height: 100dvh;
    z-index: 150;
    transform: translateX(-100%);
    transition: transform var(--dur-slow) var(--ease-out);
    box-shadow: 4px 0 24px rgb(from var(--text-light-tint-color) r g b / 0.4);
    overflow-y: auto;
    /* Reset desktop free-standing-card styles — drawer is full-bleed */
    border: none;
    border-radius: 0;
    margin: 0;
  }
  .sidebar.open {
    transform: translateX(0);
  }

  /* Main takes full width */
  .main { padding: 12px 14px; }

  /* Header compact */
  .header { padding: 0 14px; overflow: visible; }
  .header-brand .wordmark { font-size: 16px; }
  .wm-release { display: none; }
  .header-brand { flex-shrink: 1; min-width: 0; overflow: hidden; }
  .header-actions { flex-shrink: 0; overflow: visible; }

  /* Tab bar — scrollable, larger touch targets */
  .out-tab { padding: 13px 11px; min-height: 44px; font-size: 10px; }
  .out-tab-divider { display: none; }

  /* Progress bar — hide label, keep bar */
  #progressLbl { display: none; }

  /* Hide text size menu on tablet */
  #hdr-text-size, .hdr-text-size-group { display: none; }

  /* Room editor — wider touch zones */
  .pill-btn, .pill-label { min-height: 40px; padding: 8px 12px; }

  /* Buttons — full minimum touch target */
  .btn { min-height: 44px; padding: 8px 14px; }
  .btn-sm { min-height: 38px; padding: 6px 12px; }

  /* Form fields — larger tap targets */
  select, input[type="text"], input[type="number"], textarea {
    min-height: 40px; font-size: 16px; /* prevents iOS zoom */
  }

  /* Modal fullscreen on tablet */
  .modal-bg > div {
    width: 100vw !important;
    max-width: 100vw !important;
    max-height: 100dvh !important;
    border-radius: 0 !important;
    margin: 0 !important;
  }

  /* Compliance panel — stack cards */
  .crr { margin-bottom: 8px; }

  /* Matrix table — horizontal scroll */
  #matrixOut, #matrixWrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }

  /* Takeoff canvas — ensure it fills correctly */
  #toCanvas, #toOverlay { touch-action: none; }

  /* ── Output card header: stack vertically on tablet ── */
  .output-card-header {
    flex-direction: column;
    align-items: flex-start;
    gap: 8px;
    padding: 10px 14px;
  }
  .output-card-header .hdr-undo-group {
    width: 100%;
    justify-content: flex-end;
  }
  .output-card-header .hdr-btn-primary {
    width: 100%;
    justify-content: center;
    font-size: 11px;
    padding: 8px 0;
  }
  .pdf-btn-full { display: none; }
  .pdf-btn-short { display: inline !important; }

  /* ── Progress label: show abbreviated on tablet ── */
  #progressLbl {
    display: block;
    font-size: 10px;
    font-weight: 700;
  }

  /* ── Header: compress word mark, hide subtitle ── */
  .header-brand .wordmark { font-size: 15px; }

  /* ── Tab bar: always scrollable with fade indicator ── */
  .out-tabs-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .out-tabs { flex-wrap: nowrap; min-width: max-content; }
  .out-tabs-wrap::after { display: none; }

  /* ── Room editor pills: wrap with tighter gap ── */
  .pill-group { flex-wrap: wrap; gap: 4px; }
  .pill { min-width: calc(50% - 4px); }

  /* ── Onboarding steps: always vertical ── */
  .onboard-steps { flex-direction: column; align-items: stretch; gap: 8px; }
  .onboard-step-arrow { transform: rotate(90deg); align-self: center; }
  .onboard-card { padding: 12px; }

  /* ── Sidebar float button: keep above tab bar ── */
  #sidebarFloatBtn { bottom: 20px; left: 12px; }

  /* ── Dashboard score tiles: 2-column on tablet ── */
  .dash-score-grid { grid-template-columns: repeat(2, 1fr) !important; }

  /* ── Budget controls: stack on tablet ── */
  .budget-controls, .ec-controls { flex-direction: column; align-items: flex-start; gap: 8px; }

  /* ── Inner tabs: scrollable ── */
  .inner-tabs { overflow-x: auto; -webkit-overflow-scrolling: touch; flex-wrap: nowrap; }
  .inner-tab { white-space: nowrap; flex-shrink: 0; }

  /* ── CX checklist: stack room header ── */
  .cx-room-hdr { flex-wrap: wrap; gap: 6px; }

  /* ── Spec writer / O&M: comfortable reading width ── */
  #specOut, #omDoc, #cinDoc, #sooDoc { max-width: 100%; padding: 16px; font-size: 12px; line-height: 1.7; }

  /* O&M pane wrapper — full width, no clipping on tablet */
  #pane-om > div { padding: 12px 14px; }
  #omDoc { max-height: calc(100dvh - 180px); border-radius: var(--r); }

  /* O&M header row — wrap gracefully */
  #pane-om > div > div:first-child {
    flex-wrap: wrap;
    gap: 8px;
  }
  #pane-om > div > div:first-child .btn { margin-left: 0 !important; }
}

/* ── Phone portrait (480px) — extend existing ── */
@media (max-width: 480px) {
  .header { padding: 0 10px; }
  .out-tab { padding: 11px 9px; font-size: 9.5px; }

  /* Stack header actions vertically */
  .header-actions { gap: 4px; }
  .header-actions .btn-sm { padding: 5px 8px; font-size: 10px; }

  /* Full-width modals */
  .modal-bg > div {
    width: 100vw !important;
    max-width: 100vw !important;
    border-radius: 0 0 var(--r-lg) var(--r-lg) !important;
  }

  /* Avatar menu full width */
  .auth-user-menu-wrap { width: calc(100vw - 20px) !important; right: 10px !important; left: 10px !important; }

  /* Larger touch targets */
  .btn { min-height: 44px; }
  select, input[type="text"], input[type="number"], textarea {
    min-height: 44px; font-size: 16px;
  }
}

/* ── Takeoff canvas touch handling ── */
.takeout-wrap, .to-wrap, #toCanvas, #toOverlay {
  touch-action: none; /* Pointer events handle all touch - no browser interference */
  -webkit-user-select: none;
  user-select: none;
}

/* ── iOS safe area insets ── */
@supports (padding-bottom: env(safe-area-inset-bottom)) {
  .main { padding-bottom: calc(22px + env(safe-area-inset-bottom)); }
  @media (max-width: 768px) {
    .main { padding-bottom: calc(12px + env(safe-area-inset-bottom)); }
    .header { padding-top: env(safe-area-inset-top); }
  }
}

/* ════════════════════════════════════════════════════════════════════
   PHASE 1-8 POLISH — Header, Sidebar, Editor, Output, Compliance,
   Motion, Copy cleanup. Added: hdr-btn system, editor-section,
   comp polish, transitions, mobile touch targets.
   ════════════════════════════════════════════════════════════════════ */

/* ── Header button system ────────────────────────────────────────── */
.hdr-btn {
  height: 30px;
  padding: 0 11px;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  border-radius: var(--r-sm);
  font-size: 11px;
  font-family: var(--mono);
  letter-spacing: var(--ls-ui);
  cursor: pointer;
  border: none;
  white-space: nowrap;
  transition: background var(--dur-fast) ease, color var(--dur-fast) ease, border-color var(--dur-fast) ease, transform var(--dur-fast) ease;
}
.hdr-btn:active {
  /* Was scale(0.94); changed to translateY(1px) in later "Button active
     states (desktop too)" polish section to match sibling .btn:active.
     Consolidated 2026-05-19. */
  transform: translateY(1px);
}
.hdr-btn-ghost {
  background: transparent;
  color: var(--text-mid-color);
  border: 1px solid transparent;
}
.hdr-btn-ghost:hover {
  background: var(--glass2);
  color: var(--text-light-color);
  border-color: var(--glass-border);
}
.hdr-btn-outline {
  background: transparent;
  color: var(--text-mid-color);
  border: 1px solid var(--border2);
}
.hdr-btn-outline:hover {
  background: var(--glass);
  color: var(--text-light-color);
  border-color: var(--button-color);
}
.hdr-btn-primary {
  background: var(--button-color);
  /* Use --sb-primary-add-ink (the sidebar Add Room button's text token)
     so the two header export buttons (Sign and Export, Print / Save PDF)
     stay visually consistent with the sidebar's primary action button.
     Both buttons that carry .hdr-btn-primary are these export/print
     actions — no other element uses the class. */
  color: var(--sb-primary-add-ink);
  font-weight: 700;
  border: 1px solid transparent;
}
.hdr-btn-primary:hover {
  background: var(--button-click-color);
}

/* ── Progress label ──────────────────────────────────────────────── */
#progressLbl {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 700;
  color: var(--text-mid-color);
  letter-spacing: 0.5px;
}

/* ── Sidebar additions ───────────────────────────────────────────── */
.sidebar-label--mt {
  margin-top: 8px;
}
.sb-add-room-btn {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Takeoff sidebar button — uses --btn-takeoff-bg/ink so the
   color can be customized in the theme editor independently from
   the overall amber brand. Hover state uses relative color syntax
   (`rgb(from ...)`) to derive a brighter tint without another token. */
.sb-takeoff-btn {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  background: var(--btn-takeoff-bg);
  color: var(--btn-takeoff-ink);
  border-color: var(--btn-takeoff-bg);
}
.sb-takeoff-btn:hover {
  background: rgb(from var(--btn-takeoff-bg) calc(r + 35) calc(g + 35) calc(b + 35));
  box-shadow: 0 2px 10px rgb(from var(--btn-takeoff-bg) r g b / 0.45);
}

/* + Room sidebar button — same pattern as the takeoff button above,
   but with its own independent token so admins can differentiate the
   two buttons visually without wiring up a third class. */
.sb-add-room-btn {
  background: var(--btn-room-add-bg);
  color: var(--btn-room-add-ink);
  border-color: var(--btn-room-add-bg);
}
.sb-add-room-btn:hover {
  background: rgb(from var(--btn-room-add-bg) calc(r + 35) calc(g + 35) calc(b + 35));
  box-shadow: 0 2px 10px rgb(from var(--btn-room-add-bg) r g b / 0.45);
}

.tmpl-bar-top {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
}
.tmpl-bar-actions {
  display: flex;
  gap: 6px;
  padding-top: 2px;
}
.sb-empty-state {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
  text-align: center;
  padding: 24px 0;
}

/* ── Sidebar active + hover ──────────────────────────────────────── */
.room-item.active {
  background: rgba(var(--button-rgb-color), 0.10);
  border-left: 3px solid var(--button-color);
}
.room-item:hover:not(.active) {
  background: var(--foreground-color);
}

/* ── Room editor section modules ─────────────────────────────────── */
.editor-section {
  background: var(--foreground-color);
  border: 1px solid var(--border);
  border-radius: var(--r);
  padding: 12px 14px;
}
.editor-section + .editor-section {
  margin-top: 10px;
}
.field-label {
  font-size: 10px;
  text-transform: uppercase;
  color: var(--text-dark-color);
  letter-spacing: 0.8px;
  margin-bottom: 4px;
  font-family: var(--mono);
}

/* ── Output / document surface ───────────────────────────────────── */
.doc-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 12px;
}
.doc-meta {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
}

/* ── Output tab active state ─────────────────────────────────────── */
.out-tab.active {
  border-bottom: 2px solid var(--button-color);
  color: var(--text-light-color);
}

/* ── Compliance surface ──────────────────────────────────────────── */
.comp-bar-pass {
  background: rgba(var(--green-rgb), 0.10);
}
.comp-bar-fail {
  background: rgba(var(--red-rgb), 0.10);
}
.comp-bar-warn {
  background: rgb(from var(--button-color) r g b / 0.10);
}
.comp-summary {
  border-radius: var(--r);
  padding: 10px 14px;
  background: var(--foreground-color);
}

/* ── Phase 6 — Motion ────────────────────────────────────────────── */
.room-item,
.out-tab,
.hdr-menu-item,
.btn,
.hdr-btn {
  transition: background var(--dur-fast) ease, color var(--dur-fast) ease,
              border-color var(--dur-fast) ease, opacity var(--dur-fast) ease;
}
.save-indicator {
  transition: all var(--dur-slow) ease;
}

/* ── Phase 8 — Mobile touch targets ─────────────────────────────── */
@media (max-width: 768px) {
  .hdr-btn {
    min-height: 44px;
    padding: 0 14px;
  }
  .btn {
    min-height: 44px;
  }
  .hdr-undo-group button {
    min-height: 44px;
    min-width: 44px;
  }
}

/* ── Phase 3: Editor input consistency ───────────────────────────── */
.cat-body select,
.cat-body input[type="text"],
.cat-body input[type="number"] {
  height: 32px;
  box-sizing: border-box;
}
.cat-body textarea {
  min-height: 64px;
  resize: vertical;
}

/* ── Phase 5: Compliance summary card ───────────────────────────── */
.comp-summary {
  border-radius: var(--r);
  padding: 10px 14px;
  background: var(--foreground-color);
  border: 1px solid var(--border);
}

/* ── Phase 4 narrative typography: now merged into the canonical
   .narrative-doc rule earlier in this file. Paragraph spacing
   stays here since it's the only narrative-doc descendant rule. */
.narrative-doc p {
  margin: 0 0 10px;
}

/* ── Wizard: hero option (demo as primary CTA) ───────────────────── */
.wizard-option-hero {
  border-color: var(--button-color);
  background: rgba(var(--button-rgb-color), 0.06);
  position: relative;
}
.wizard-option-hero:hover {
  border-color: var(--button-color);
  background: rgba(var(--button-rgb-color), 0.12);
}
.wizard-option-hero.selected {
  border-color: var(--button-color);
  background: rgba(var(--button-rgb-color), 0.14);
}
.wizard-option-hero-badge {
  position: absolute;
  top: -1px;
  right: 14px;
  background: var(--button-color);
  color: var(--btn-primary-ink);
  font-family: var(--mono);
  font-size: 8px;
  font-weight: 700;
  letter-spacing: 1px;
  text-transform: uppercase;
  padding: 2px 8px;
  border-radius: 0 0 var(--r-sm) var(--r-sm);
}

/* ── Wizard: LCA banner ──────────────────────────────────────────── */
.wizard-lca-banner {
  background: rgba(var(--button-rgb-color), 0.10);
  border: 1px solid rgba(var(--button-rgb-color), 0.35);
  border-radius: var(--r-sm);
  padding: 10px 14px;
  margin-bottom: 16px;
  font-family: var(--mono);
  font-size: 10px;
  color: var(--button-color);
  line-height: 1.5;
  letter-spacing: 0.3px;
}
.wizard-lca-banner strong {
  font-weight: 700;
}

/* ── Wizard: skip button de-emphasized ───────────────────────────── */
.wizard-skip {
  background: none;
  border: none;
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
  cursor: pointer;
  padding: 4px 8px;
  border-radius: var(--r-sm);
  letter-spacing: 0.5px;
  transition: color var(--dur-fast) ease;
}

/* ── Wizard: wiring hint ─────────────────────────────────────────── */
.wizard-wiring-hint {
  font-family: var(--mono);
  font-size: 9px;
  color: var(--text-dark-color);
  margin-top: 4px;
  line-height: 1.5;
  min-height: 1em;
}

/* ── Wizard: field hint span ─────────────────────────────────────── */
.wizard-field-hint {
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0;
  color: var(--text-dark-color);
  font-size: 9px;
}

/* ── Wizard: LCA secondary option (de-emphasize New Project for LCA) */
.wizard-option-lca-secondary {
  opacity: 0.75;
}

/* ── Inner tabs (sub-tabs within combined panes) ─────────────────── */
/* ── Inner tabs (sub-tabs within a top-level pane) ──────────────────
   v26.04.27 redesign: was a flat full-bleed underline-tab strip; now a
   floating rounded pill segmented control matching the Drawing Takeoff
   Design/As-Built toggle. Active tab gets the amber fill; inactive
   stays transparent. Sits as a free-standing card with 12px outer
   margin like every other floating element in the app.
   The .segmented modifier is now redundant (default IS segmented) but
   kept defined below for backward compat in case any callers pass it. */
.inner-tabs {
  display: flex;
  align-items: center;
  /* Canon migration v26.05.04: flex-wrap added so the Project Admin
     strip (9 buttons inside the pane-action-bar) gracefully wraps on
     narrow viewports rather than overflowing. Electrical (2 buttons)
     is unaffected — wrap only kicks in when content actually exceeds
     available width. */
  flex-wrap: wrap;
  gap: 2px;
  padding: 4px;
  margin: 0 12px 12px 12px;
  background: var(--glass);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  box-shadow: var(--shadow-sm);
  flex-shrink: 0;
  overflow-x: auto;
  scrollbar-width: none;
  /* Previously `display: inline-flex` sized the strip to its content
     width, leaving the bar visibly narrower than the pane-action-bar
     and pane-content cards above/below. Switched to `flex` so the
     strip spans full canonical width (12px gutter on each side via
     the margin), matching the action bar's edge alignment. The inner
     buttons keep their natural width via flex-shrink: 0 below — they
     don't stretch to fill, just left-align inside a full-width bar. */
}
.inner-tabs::-webkit-scrollbar { display: none; }
.inner-tabs.segmented { /* alias of default; left in place for back-compat */ }
.inner-tab {
  padding: 6px 14px;
  font-family: var(--mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.5px;
  color: var(--text-mid-color);
  background: transparent;
  border: none;
  border-radius: var(--r-sm);
  margin-bottom: 0;
  cursor: pointer;
  white-space: nowrap;
  flex-shrink: 0;
  transition: background var(--dur-fast) ease, color var(--dur-fast) ease;
}
.inner-tab:hover {
  color: var(--button-color);
  background: rgb(from var(--button-color) r g b / 0.08);
}
.inner-tab.active {
  color: var(--btn-primary-ink);
  background: var(--button-color);
  font-weight: 600;
}
/* Canon migration v26.05.04: data-dynamic-header pattern is no longer
   used — Project Admin now follows the Electrical pattern where each
   sub-pane carries its own visible header + its own pane-action-bar.
   The hiding rule that previously suppressed sub-pane headers under a
   parent [data-dynamic-header] block has been removed; if the
   attribute is reintroduced in some future pane, the rule should be
   added back along with that decision. */
/* Old segmented-modifier rules are obsolete (default rule above already
   produces the segmented look). Leaving the rules harmless: they used
   border-radius corners + amber fill, which now matches the default. */
.inner-tabs.segmented .inner-tab { border: none; background: transparent; border-radius: var(--r-sm); }
.inner-tabs.segmented .inner-tab:first-child { border-radius: var(--r-sm); }
.inner-tabs.segmented .inner-tab:last-child  { border-radius: var(--r-sm); border-left: none; }
.inner-tabs.segmented .inner-tab.active { background: var(--button-color); color: var(--btn-primary-ink); border-color: var(--button-color); }
.inner-pane {
  display: none;
  flex: 1;
  overflow-y: auto;
}
@keyframes innerPaneIn { from { opacity:0; transform:translateY(3px); } to { opacity:1; transform:translateY(0); } }
/* Headers nested inside an .inner-pane sit with extra vertical space
   above them compared to top-level headers (e.g. // One-Line) because
   .inner-pane has `overflow-y: auto`, establishing a block formatting
   context that prevents the header's 12px margin-top from collapsing
   through. Zero the top margin specifically when nested so spacing
   matches top-level pane headers. The 12px bottom margin is preserved
   so the gap to the action-bar below the header stays unchanged. */
.inner-pane > .out-pane-hdr:first-child {
  margin-top: 0;
}
.inner-pane.active {
  display: block;
  animation: innerPaneIn 0.14s cubic-bezier(0.4,0,0.2,1) both;
}
/* VE pane needs to be a flex column (form + result viewer) — override
   the default .inner-pane.active block layout when this specific pane
   is active. Replaces the inline style that used to leak when the pane
   wasn't active.                                                       */
#ipane-projectadmin-ve.active {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  height: 100%;
}


/* ════════════════════════════════════════════════════════════════════
   P7 — MOBILE / TABLET LAYOUT FIXES
   Breakpoints: 1024px (tablet landscape), 768px (tablet portrait),
   480px (large phone), 375px (small phone)
   ════════════════════════════════════════════════════════════════════ */

/* ── Tablet landscape (1024px) — tighten header, preserve two-column ──
   .layout grid-template-columns already set to 200px 1fr at line ~3618 */
@media (max-width: 1024px) {
  .output-card-header { flex-wrap: wrap; gap: 6px; }
  /* Collapse header overflow buttons */
  .hdr-btn-label { display: none; }
}

/* ── Tablet portrait (768px) — sidebar slides, main takes full width ── */
@media (max-width: 768px) {
  /* Layout: stack sidebar over content with overlay */
  .layout {
    grid-template-columns: 1fr;
    grid-template-rows: auto 1fr;
    position: relative;
  }
  .sidebar {
    position: fixed;
    top: var(--hdr-h, 48px);
    left: 0;
    bottom: 0;
    width: 260px;
    z-index: 500;
    transform: translateX(-100%);
    transition: transform var(--dur-slow) ease;
    box-shadow: 4px 0 24px rgb(from var(--text-light-tint-color) r g b / 0.3);
    overflow-y: auto;
    /* Reset desktop free-standing-card styles — drawer is full-bleed */
    border: none;
    border-radius: 0;
    margin: 0;
    height: auto;
  }
  .sidebar.open { transform: translateX(0); }
  .sidebar-backdrop {
    display: none;
    position: fixed;
    inset: 0;
    background: rgb(from var(--text-light-tint-color) r g b / 0.4);
    z-index: 499;
  }
  .sidebar-backdrop.visible { display: block; }
  /* Sidebar inner tightening on tablet */
  .sb-select { font-size: 11px; padding: 5px 8px; }
  .sidebar-label { font-size: 8px; }
  .sb-btn-row { gap: 3px; }
  .btn.btn-sm { padding: 5px 8px; font-size: 10px; }
  .tmpl-save-btn { font-size: 9px; padding: 3px 7px; }
  .tmpl-label { font-size: 9px; }

  /* Main fills full width */
  .main { padding: 0; min-width: 0; }
  /* Mobile full-bleed: the three floating children of .output-card lose
     their side margins, rounded corners, and side borders so the
     documentation pane reads edge-to-edge on phones. */
  .output-card-header,
  .out-tabs-wrap,
  .pane-content { margin-left: 0; margin-right: 0; border-radius: 0; border-left: none; border-right: none; }

  /* Tab bar: horizontal scroll */
  .out-tabs-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .out-tabs { flex-wrap: nowrap; min-width: max-content; }
  .out-tab { padding: 8px 12px; font-size: 10px; white-space: nowrap; }

  /* Editor: full width, comfortable padding */
  .editor-section { padding: 12px 14px; }
  .fg-grid-2, .fg-grid-3, .fg-grid-4 { grid-template-columns: 1fr; }
  .cat-hdr { padding: 10px 14px; }

  /* Modals: full screen on small displays */
  .modal {
    width: 100% !important;
    max-width: 100% !important;
    margin: 0;
    border-radius: 0;
    max-height: 100dvh !important;
  }
  .modal-bg { align-items: flex-end; }

  /* Wizard: full-width bottom sheet on all phones */
  .wizard-shell {
    width: 100% !important;
    max-width: 100vw !important;
    border-radius: 16px 16px 0 0 !important;
    max-height: 88dvh !important;
    overflow-x: hidden !important;
    box-sizing: border-box;
  }
  .wizard-step { padding: 20px 18px; }
  .wizard-header { padding: 12px 18px; }
  .wizard-fields { gap: 12px; }
  .wizard-field-row { grid-template-columns: 1fr; }
  .wizard-options { grid-template-columns: 1fr; gap: 8px; }
  .wizard-options-grid { grid-template-columns: 1fr 1fr; gap: 8px; }
  .wizard-nav { padding: 12px 18px; }
  .wizard-option { padding: 12px 14px; }
  .wizard-option-hero { padding: 16px 14px; }
  .wizard-option-desc { font-size: 11px; }
  .wizard-step-title { font-size: 20px; }

  /* Header: tighten */
  .header { padding: 0 10px; gap: 6px; }
  .header-brand .wordmark { font-size: 16px; }

  /* Room editor pills: wrap */
  .pill-group { flex-wrap: wrap; }
  .pill { min-width: 0; }

  /* Compliance scorecard: 2 cols */
  .comp-scorecard { grid-template-columns: repeat(2, 1fr); }

  /* Budget/schedule grid: collapse */
  .budget-controls { flex-direction: column; align-items: flex-start; gap: 8px; }

  /* Inner tabs */
  .inner-tabs { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .inner-tab { white-space: nowrap; }

  /* Bulk edit modal */
  .bulk-field-row { grid-template-columns: 20px 1fr; }
  .bulk-field-row .bulk-field-input { grid-column: 1 / -1; }
}

/* ── Large phone (480px) ─────────────────────────────────────────── */
@media (max-width: 480px) {
  :root { --fs: 0.95; }

  /* Header: icon-only mode */
  .hdr-btn { padding: 8px; min-width: 36px; }
  .hdr-btn-text { display: none; }
  .hdr-btn-primary { display: inline-flex !important; padding: 8px 12px; }
  .hdr-btn-primary .hdr-btn-text { display: inline !important; font-size: 10px; }
  .pdf-btn-full { display: none; }
  .pdf-btn-short { display: inline !important; }
  .header-brand .wordmark { font-size: 14px; }

  /* Takeoff: hidden on phone — canvas interaction requires desktop pointer */
  .sb-takeoff-btn { display: none !important; }
  #toTab, .to-tab { display: none !important; }

  /* Compliance scorecard: 2-col tight */
  .comp-scorecard { gap: 6px; }
  .score-tile { padding: 8px; }
  .stn { font-size: 20px; }

  /* Wizard: full width bottom sheet */
  .wizard-shell {
    width: 100%;
    max-width: 100vw;
    border-radius: 12px 12px 0 0;
    max-height: 85dvh;
  }
  .wizard-options { grid-template-columns: 1fr; }
  .wizard-step { padding: 20px 16px; }
  .wizard-fields { gap: 12px; }
  .wizard-field-row { grid-template-columns: 1fr; }

  /* Project list items */
  .project-list-item { gap: 6px; }
  .pli-meta { font-size: 9px; }

  /* Matrix table: horizontal scroll */
  .ctable-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }

  /* FUG overlay: compact */
  .fug-card { padding: 20px 16px; max-width: 100%; }

  /* Revision entries: stack on phone */
  .rev-entry { grid-template-columns: 1fr auto; grid-template-rows: auto auto; }
  .rev-date { grid-column: 1; font-size: 9px; }
  .rev-ver  { grid-column: 1; }
  .rev-desc { grid-column: 1 / -1; }
  .rev-actions { grid-column: 2; grid-row: 1 / 3; align-self: center; }

  /* CX checklist grid: stack on phone */
  .cx-item { grid-template-columns: 24px 1fr; }
  .cx-item > *:nth-child(3),
  .cx-item > *:nth-child(4),
  .cx-item > *:nth-child(5) { grid-column: 2; }

  /* cat-grid two-column: single column on phone */
  .cat-grid.two { grid-template-columns: 1fr; }

  /* Editor project fields: single col on phone */
  .proj-grid { grid-template-columns: 1fr; }

  /* Code/wiring pills: wrap tighter */
  .pill-group { gap: 3px; }
  .pill { font-size: 9px; padding: 4px 7px; min-width: calc(50% - 3px); }

  /* Output card header: stack PDF button */
  .output-card-header { flex-direction: column; gap: 6px; padding: 10px 12px; }
  .output-card-header h2 { font-size: 10px; }
  .hdr-print-btn { width: 100%; justify-content: center; }

  /* Main padding: tighter on phone */
  .main { padding: 10px 10px; }

  /* Sidebar float button: higher above bottom edge */
  #sidebarFloatBtn { bottom: 16px; left: 10px; }

  /* Auth menus: full screen */
  .auth-user-menu-wrap { width: calc(100vw - 16px) !important; left: 8px !important; right: 8px !important; }

  /* Compliance fix rows: stack action button */
  .crr-row { flex-wrap: wrap; }
  .crr-fix { font-size: 9px; padding: 3px 7px; }

  /* Wizard bottom sheet: taller on phones with notches */
  .wizard-shell { max-height: 90dvh; }

  /* Compliance scorecard: tight 3-col on phone */
  .comp-scorecard { grid-template-columns: repeat(3, 1fr); gap: 5px; }
  .score-tile { padding: 7px 5px; }
  .stn { font-size: 18px; }
  .stl { font-size: 8px; }

  /* FUG tooltip: don't overflow */
  .fug-card { left: 8px !important; right: 8px !important; width: auto !important; max-width: calc(100vw - 16px) !important; }
  .fug-card::before, .fug-card::after { display: none; }
}

/* ── Small phone (375px) ─────────────────────────────────────────── */
@media (max-width: 375px) {
  .comp-scorecard { grid-template-columns: 1fr 1fr; }
  .out-tab { padding: 7px 7px; font-size: 8.5px; }
  .header { gap: 3px; }
  .hdr-btn { padding: 7px; min-width: 32px; }
  .header-brand .wordmark { font-size: 13px; }
  /* Pill: three per row at 375 */
  .pill { min-width: calc(33.3% - 4px); font-size: 8.5px; }
  /* Editor fields: tighter label */
  .fg > label { font-size: 9px; }
}

/* ── Touch targets: ensure 44px minimum on all interactive elements ── */
@media (hover: none) and (pointer: coarse) {
  .out-tab { min-height: 44px; }
  .room-item { min-height: 44px; padding: 10px 8px; }
  .hdr-btn { min-height: 44px; min-width: 44px; }
  .btn { min-height: 40px; }
  .inner-tab { min-height: 40px; }
  .pli-delete, .pli-archive { min-width: 40px; min-height: 40px; }
  /* Increase checkbox tap target */
  .pli-chk, .bulk-chk { width: 20px; height: 20px; }
}


/* ══════════════════════════════════════════════════════════════
   LIVE COLLABORATION
   ══════════════════════════════════════════════════════════════ */

/* Presence avatar dot: pulse when first joining */
@keyframes collabJoin {
  0%   { transform: scale(0.6); opacity: 0; }
  60%  { transform: scale(1.15); }
  100% { transform: scale(1); opacity: 1; }
}
#collabPresenceBar > div {
  animation: collabJoin 0.3s ease;
}

/* Presence dot on sidebar room items */
.collab-presence-dot {
  animation: collabJoin 0.25s ease;
}

/* Collab status bar: shown in header when others are present */
#collabPresenceBar {
  align-items: center;
  gap: 3px;
}

/* Conflict toast: amber tint */
/* (uses existing toast system) */

/* Mobile: smaller presence avatars */
@media (max-width: 480px) {
  #collabPresenceBar > div {
    width: 24px !important;
    height: 24px !important;
    font-size: 8px !important;
  }
}


/* ══════════════════════════════════════════════════════════════
 * ONBOARDING — First-run banner and Print button pulse
 *
 * Rendered by src/modules/30-onboarding.js when
 * users.onboarding_state is 'demo_seeded' or 'first_pdf'.
 *
 * Uses existing design tokens (--amber, --navy2, --text, etc.)
 * so all four themes (dark/light/lca/distant-blue) render cleanly
 * without additional theme-overrides.
 * ══════════════════════════════════════════════════════════════ */

/* ── Welcome banner ──────────────────────────────────────────── */
.onb-banner {
  position: relative;
  z-index: 50;
  background: linear-gradient(
    135deg,
    color-mix(in srgb, var(--button-color) 12%, var(--midground-color)) 0%,
    var(--midground-color) 100%
  );
  border-bottom: 1px solid var(--border2);
  border-left: 3px solid var(--button-color);
  color: var(--text-light-color);
  font-family: var(--mono);
  animation: onbBannerSlideIn 320ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
}

.onb-banner-inner {
  display: flex;
  align-items: center;
  gap: 20px;
  padding: 14px 24px;
  max-width: 1600px;
  margin: 0 auto;
}

.onb-banner-copy {
  flex: 1;
  min-width: 0;
}

.onb-banner-title {
  font-size: calc(14px * var(--fs, 1));
  font-weight: 700;
  letter-spacing: 0.5px;
  color: var(--button-color);
  margin-bottom: 3px;
}

.onb-banner-body {
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.55;
  color: var(--text-mid-color);
}

.onb-banner-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
}

.onb-btn {
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  font-weight: 700;
  letter-spacing: 0.5px;
  padding: 8px 14px;
  border-radius: var(--r);
  border: 1px solid transparent;
  cursor: pointer;
  transition: background 120ms, border-color 120ms, color 120ms;
  white-space: nowrap;
}

.onb-btn-primary {
  background: var(--button-color);
  color: var(--background-color);
  border-color: var(--button-color);
}
.onb-btn-primary:hover {
  background: color-mix(in srgb, var(--button-color) 85%, white);
}

.onb-btn-ghost {
  background: transparent;
  color: var(--text-dark-color);
  border-color: var(--border2);
}
.onb-btn-ghost:hover {
  color: var(--text-light-color);
  border-color: var(--text-dark-color);
}

@keyframes onbBannerSlideIn {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Mobile — stack copy above actions, tighter padding */
@media (max-width: 640px) {
  .onb-banner-inner {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    padding: 12px 14px;
  }
  .onb-banner-actions {
    justify-content: flex-end;
  }
}

/* ── Print button pulse ──────────────────────────────────────── */
/* Added to [data-action="export-pdf"] while in demo_seeded state,
 * removed after first PDF export. Uses a ring rather than scaling
 * so header layout doesn't jump. */
.onb-print-pulse {
  position: relative;
}
.onb-print-pulse::after {
  content: '';
  position: absolute;
  inset: -4px;
  border-radius: calc(var(--r) + 4px);
  border: 2px solid var(--button-color);
  pointer-events: none;
  opacity: 0;
  animation: onbPrintPulse 1600ms cubic-bezier(0.2, 0.8, 0.2, 1) infinite;
}

@keyframes onbPrintPulse {
  0%   { opacity: 0.9; transform: scale(0.98); }
  70%  { opacity: 0;   transform: scale(1.08); }
  100% { opacity: 0;   transform: scale(1.08); }
}

/* Respect reduced-motion preference — still draw a static ring so
 * the call-to-action is visible, just without the animation. */
@media (prefers-reduced-motion: reduce) {
  .onb-print-pulse::after {
    animation: none;
    opacity: 0.6;
  }
}

/* ══════════════════════════════════════════════════════════════
 * PROOF-OF-VALUE COUNTER — avatar menu block
 *
 * Rendered by src/modules/31-counters.js into #authProofCounter.
 * Sits above the storage meter in the avatar menu. Shows spaces
 * documented and estimated hours saved.
 * ══════════════════════════════════════════════════════════════ */

.auth-proof-counter {
  /* Container is always present in markup but empty until first render.
     Keep padding minimal so the menu doesn't grow if counter is hidden. */
  margin-bottom: 10px;
}

.auth-proof-counter:empty {
  margin-bottom: 0;
}

.pvc-block {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 12px;
  background: color-mix(in srgb, var(--button-color) 8%, transparent);
  border: 1px solid color-mix(in srgb, var(--button-color) 25%, var(--border2));
  border-radius: var(--r);
}

.pvc-number {
  font-family: var(--mono);
  font-size: calc(24px * var(--fs, 1));
  font-weight: 700;
  line-height: 1;
  color: var(--button-color);
  flex-shrink: 0;
  min-width: 40px;
  text-align: center;
}

.pvc-labels {
  flex: 1;
  min-width: 0;
}

.pvc-label {
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  color: var(--text-light-color);
  line-height: 1.2;
}

.pvc-sub {
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color);
  margin-top: 2px;
}

.pvc-hint {
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color);
  padding: 6px 12px;
  text-align: center;
  font-style: italic;
}

/* ════════════════════════════════════════════════════════════════
   DESKTOP & TABLET POLISH
   ════════════════════════════════════════════════════════════════ */

/* ── Sidebar: tighten section spacing on desktop ── */
.sidebar-label { margin-bottom: 3px; }

/* ── Output card header: align PDF button right, prevent shrink ── */
.output-card-header { flex-wrap: nowrap; }
.output-card-header .hdr-btn-primary { flex-shrink: 0; }

/* ── Tab bar: prevent text truncation on desktop ── */
.out-tab { white-space: nowrap; }

/* ── Compliance rows: tighten on desktop ── */
.crr-row { transition: background var(--dur-fast); }
.crr-row:hover { background: rgb(from var(--text-mid-color) r g b / 0.03); }

/* ── Auth user menu: min-width so content doesn't cramp ── */
.auth-user-menu { min-width: 260px; }

/* ── Sidebar room items: tighter gap between status dot and name ── */
.room-name { gap: 5px; }

/* ── Progress label: don't let it wrap ── */
#progressLbl { white-space: nowrap; }

/* ── hdr-progress-row: distribute space better ── */
.hdr-progress-row { gap: 6px; }

/* ── Output pane: give it breathing room at bottom ── */
.out-pane { padding-bottom: 40px; }

/* ── Takeoff topbar: consistent group alignment ── */
.to-tb-group { justify-content: flex-end; }

/* ── Modal: slightly more padding on desktop ── */
@media (min-width: 769px) {
  .modal-bg > .modal { padding: 24px 28px; }
  .auth-user-menu { max-height: 85vh; overflow-y: auto; }
}

/* ── doc-toolbar: action buttons inside content area (below out-pane-hdr) ──
   v26.04.27 polish: previously a full-bleed sharp-edged bar — this made the
   CIN/Sequence/Spec/Compare/O&M panes feel inconsistent with the rounded
   .out-pane-hdr above them. The toolbar now mirrors that header's
   inset (12px margin) and radius (var(--r-sm)) so both bars line up at
   the same width and read as a matched pair. The bottom-of-toolbar
   border is dropped because it no longer divides anything — the toolbar
   is now its own self-contained pill. */
.doc-toolbar {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  background: var(--glass);
  margin: 0 12px 12px 12px;
  flex-shrink: 0;
  min-width: 0;
}
/* When the toolbar is followed directly by a narrative-doc, the doc's
   own margin-top:12px would compound with the toolbar's margin-bottom
   to leave a 24px gap — looks loose and uneven against the 12px gap
   above the toolbar. Collapse the toolbar's bottom margin in that case
   so the rhythm stays at 12px throughout. */
.doc-toolbar + .narrative-doc { margin-top: 0; }
.doc-toolbar select {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r-sm);
  color: var(--text-light-color);
  font-family: var(--mono);
  font-size: 10px;
  padding: 3px 8px;
}

/* ── pane-action-bar: floating bar for pane-level actions ─────────────────
   Same visual treatment as .doc-toolbar — same height, padding, and gap —
   so the two classes render identically. They diverged in v26.04.27 polish
   but the role is identical: a floating action bar above the pane-content.
   Layout is natural flex flow (no justify-content): write left-aligned
   content first, then put `style="margin-left:auto"` on the right-pinned
   element. This is the same idiom .doc-toolbar uses (margin-left:auto on
   .export-dropdown in CIN/SOO/Spec/O&M), and it's bulletproof at all widths
   — no flex-wrap surprises, no need for pa-spread/pa-left/pa-right
   modifier classes (those were dropped in v26.04.27.1346+). */
.pane-action-bar {
  display: flex;
  align-items: center;
  /* Canon migration v26.05.04: flex-wrap added so the bar wraps to
     multiple rows on narrow viewports when its contents (e.g. the
     9-button inner-tabs strip in Project Admin sub-panes plus the
     pane's own action buttons) exceed available width. Most panes
     have 1-3 action buttons that fit comfortably without wrap; this
     only activates when content actually overflows. row-gap added
     to space wrapped rows. */
  flex-wrap: wrap;
  gap: 6px;
  padding: 8px 14px;
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  background: var(--glass);
  margin: 0 12px 12px 12px;
  flex-shrink: 0;
  min-width: 0;
}
/* Margin-collapse trick mirrors .doc-toolbar's: don't compound the bar's
   bottom margin with the following pane-content's natural top margin. */
.pane-action-bar + .pane-content { margin-top: 0; }

/* Vertical divider for use INSIDE a .pane-action-bar — separates a
   leading control group (e.g. Electrical's Circuit Map / Voltage Drop
   inner-tabs pill) from the action buttons that follow. Tone matches
   the bar's border. */
.pa-divider {
  display: inline-block;
  width: 1px;
  height: 22px;
  background: var(--border);
  margin: 0 4px;
  flex-shrink: 0;
}

/* When .inner-tabs sits inside a .pane-action-bar (the Electrical
   tab's Circuit Map / Voltage Drop pill control shares the bar with
   the page actions), the inner-tabs control doesn't need its own
   floating-card chrome — the parent bar already provides it. Reset
   the standalone styling and let it sit inline with the buttons. */
.pane-action-bar .inner-tabs {
  background: transparent;
  border: none;
  border-radius: 0;
  box-shadow: none;
  padding: 0;
  max-width: none;
  margin: 0;
}


/* ── pane-content: unified content body matching CIN narrative-doc ── */
.pane-content {
  background: var(--content-card-bg);
  border: 1px solid var(--border);
  border-radius: var(--r);
  box-shadow: var(--shadow-sm);
  /* As of v26.04.27 the tab strip became its own floating card with
     all four corners rounded — there's no longer a strip-bottom edge to
     tuck this content under. Margin is a clean 12px gutter on all
     visible sides; top is 0 because the .out-tabs-wrap sibling above
     supplies the 12px gap via its own margin-bottom. */
  margin: 0 12px 12px 12px;
  /* B.7p-3 (scroll fix): previously had `overflow-x: auto` here, which
     per CSS2 spec promotes overflow-y to auto too — making this element
     a vertical scroll container even when content fits. Wheel events
     got trapped here instead of bubbling up to .main (which IS the
     intended scroll container for tab content).
     Wide tables in Schedule/Budget/Schedule-catalog use their OWN inner
     wrappers (#catalogTableWrap, etc.) with overflow-x:auto where
     horizontal scroll is actually needed. */
}

/* Canonical breathing room: the inner wrap classes (.old-wrap, .sp-wrap,
   .comp-sum, etc.) historically have padding-top:0 because their first
   piece of content was expected to provide its own top spacing via the
   header strip / scorecard / etc. that sat above it. For panes where
   that's not true (One-Line — diagrams sit directly), the first room
   block gets crammed against the top inner edge of pane-content. This
   ensures every direct child of an inner wrap inside pane-content has
   a consistent top margin, so the visual rhythm of "card sits inside
   pane with breathing room" is uniform. Subsequent siblings already
   have margin-bottom on the previous block, so this only affects the
   first one. */
.pane-content > *:first-child,
.pane-content > .old-wrap > *:first-child,
.pane-content > .sp-wrap > *:first-child,
.pane-content > .sched-wrap > *:first-child,
.pane-content > .cc-wrap > *:first-child,
.pane-content > .comp-sum > *:first-child,
.pane-content > .pl-wrap > *:first-child,
.pane-content > .budget-wrap > *:first-child {
  margin-top: 14px;
}

/* ── out-content: flex wrapper for all panes ─────────────────── */
.out-content {
  display: block;
}


/* ══════════════════════════════════════════════════════════════
   MOBILE & FIELD READINESS
   Target: read-only document review on phones and tablets
   Editor, takeoff, and complex inputs remain desktop-only
   ══════════════════════════════════════════════════════════════ */

@media (max-width: 768px) {

  /* Output card: tighter vertical margins on mobile (it's a transparent
     wrapper now; per-child full-bleed handled in earlier media block). */
  .output-card {
    margin-top: 8px;
    margin-bottom: 16px;
  }

  /* Pane header: tighter */
  .out-pane-hdr {
    padding: 10px 14px 8px;
  }
  .out-pane-title { font-size: 13px; }
  .out-pane-sub   { display: none; }

  /* Narrative docs: full width, comfortable line length, no max-height clip */
  .narrative-doc {
    margin: 8px;
    padding: 16px;
    font-size: 12px;
    line-height: 1.9;
    max-height: none;
    min-height: 200px;
    border-radius: 6px;
    white-space: pre-wrap;
    overflow-wrap: break-word;
  }

  /* Toolbar: wrap gracefully, smaller buttons */
  .doc-toolbar {
    padding: 6px 14px;
    flex-wrap: wrap;
    gap: 4px;
  }
  .doc-toolbar .btn { font-size: 10px; padding: 4px 8px; }

  /* Pane content: tighter margins */
  .pane-content { margin: 8px; }

  /* Tab bar: allow horizontal scroll instead of wrapping */
  .out-tabs-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .out-tabs      { flex-wrap: nowrap; min-width: max-content; }
  .out-tab       { flex-shrink: 0; }

  /* Schedule / Matrix / Circuit tables: horizontal scroll with sticky first col */
  .ctable-wrap,
  .table-wrap,
  .sched-wrap,
  .cc-wrap,
  .sp-wrap {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    border-radius: 6px;
  }

  .ctable { min-width: 640px; }

  /* Sticky first column for context while scrolling */
  .ctable td:first-child,
  .ctable th:first-child {
    position: sticky;
    left: 0;
    z-index: 1;
    background: var(--midground-color);
    border-right: 2px solid var(--border);
    min-width: 110px;
    max-width: 140px;
    white-space: normal;
    overflow-wrap: break-word;
  }
  .ctable tr:nth-child(even) td:first-child { background: var(--foreground-color); }
  .ctable .zone-row td:first-child          { background: var(--foreground-color) !important; }

  /* Project info card: single column */
  .proj-grid { grid-template-columns: 1fr; gap: 10px; }

  /* Output card header: hide subtitle breadcrumb */
  .output-card-header .hdr-proj-info { display: none; }

  /* Print button: full width on small screens */
  #pdfPrintBtn { width: 100%; justify-content: center; }

  /* Validation banner: smaller text */
  #validationBanner { font-size: 11px; padding: 8px 12px; }

  /* Summary tiles: 2-col grid on mobile */
  .comp-scorecard { grid-template-columns: 1fr 1fr; gap: 6px; }

  /* Budget wrap: horizontal scroll */
  .budget-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }

  /* Setpoints: horizontal scroll */
  .sp-wrap table { min-width: 600px; }

}

/* ── Very small phones (375px) ────────────────────────────────── */
@media (max-width: 375px) {
  .narrative-doc { padding: 12px; font-size: 11px; }
  .out-tab       { padding: 7px 8px; font-size: 9px; }
  .ctable td:first-child,
  .ctable th:first-child { min-width: 80px; }
}

/* ── Takeoff canvas: desktop-only gate ────────────────────────── */
@media (max-width: 768px) {
  #takeoutModal .takeout-inner,
  #toCanvasWrap {
    display: none;
  }
  #toMobileGate {
    display: flex !important;
  }
}

/* ── PDF export button: always visible on mobile ──────────────── */
/* NOTE: exclude #signExportBtn — its visibility is controlled by JS
   (_syncSignButtonVisibility) based on EOR assignment. Using
   :not(#signExportBtn) prevents the !important from overriding the
   inline display:none when no EOR is set. */
@media (max-width: 768px) {
  .hdr-print-btn:not(#signExportBtn) {
    display: inline-flex !important;
  }
}

/* ── Wizard mobile polish ─────────────────────────────────────── */
@media (max-width: 600px) {
  .wizard-option-desc { font-size: 11px; line-height: 1.5; }
  .wizard-option { padding: 12px 14px; }
  .wizard-option-hero { padding: 16px 14px; }
  .wizard-option-hero-badge { font-size: 9px; padding: 2px 7px; }
  .wizard-nav { padding: 12px 16px; }
  .wizard-step-title { font-size: 18px; }
  .wizard-step-sub { font-size: 12px; }
  .wizard-header { padding: 12px 16px; }
  .wizard-options { gap: 8px; }
  .wizard-options-grid { grid-template-columns: 1fr 1fr; gap: 8px; }
  .wizard-option-sm { padding: 10px 12px; }
  .wizard-option-label { font-size: 12px; }
  .wizard-option-sm .wizard-option-desc { font-size: 10px; }
  .wizard-field input, .wizard-field select { font-size: 14px; }
}

/* ── Header menus: constrain to viewport on mobile ───────────── */
@media (max-width: 768px) {
  /* Viewport-safe dropdowns:
     Use fixed positioning so menus can never clip outside the screen.
     JS (_positionMobileMenu) sets top/left after open. */
  .hdr-menu {
    position: fixed;
    top: 52px;         /* fallback — JS overrides */
    left: 8px;         /* fallback — JS overrides */
    right: 8px;
    width: auto;
    min-width: 0;
    max-width: calc(100vw - 16px);
    border-radius: 10px;
    z-index: 2000;
    max-height: 70vh;
    overflow-y: auto;
  }

  /* Override any inline right:0 set by Settings menu */
  #settingsMenu { right: 8px !important; left: 8px !important; }

  .hdr-menu-item {
    padding: 13px 16px;
    font-size: 13px;
    min-height: 44px;
  }

  /* Auth user menu: also fixed, pinned to right edge */
  .auth-user-menu {
    position: fixed !important;
    top: 52px !important;
    right: 8px !important;
    left: 8px !important;
    width: auto !important;
    min-width: 0 !important;
    max-width: calc(100vw - 16px) !important;
    border-radius: 10px !important;
    max-height: 75vh !important;
    overflow-y: auto !important;
  }
}

/* ══════════════════════════════════════════════════════════
   SKELETON + EMPTY STATES
   ══════════════════════════════════════════════════════════ */

/* ── Skeleton ghost cards ── */
@keyframes shimmer {
  0%   { background-position: -400px 0; }
  100% { background-position: 400px 0; }
}
.pli-skeleton {
  padding: 12px 16px;
  border-radius: var(--r);
  margin: 2px 4px;
  border: 1px solid var(--border);
  background: var(--midground-color, var(--bg2));
}
.pli-sk-name, .pli-sk-meta {
  border-radius: 3px;
  background: linear-gradient(90deg,
    var(--foreground-color, var(--bg3)) 25%,
    var(--foreground-color, var(--bg4)) 50%,
    var(--foreground-color, var(--bg3)) 75%
  );
  background-size: 800px 100%;
  animation: shimmer 1.4s ease-in-out infinite;
}
.pli-sk-name { height: 13px; width: 60%; margin-bottom: 7px; }
.pli-sk-meta { height: 10px; width: 35%; opacity: 0.6; }

/* Light theme empty states */
[data-theme="light"] .pli-sk-name,
[data-theme="light"] .pli-sk-meta {
  background: linear-gradient(90deg, #c8d8e8 25%, #dbeeff 50%, #c8d8e8 75%);
  background-size: 800px 100%;
}


/* ── Help modal — mobile-first responsive ─────────────────── */
.help-modal-box {
  background: var(--midground-color);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  width: min(860px, 95vw);
  max-height: 88vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  box-shadow: 0 24px 64px var(--scrim-strong);
}
.help-modal-hdr {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.help-modal-sub {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.help-modal-body {
  display: flex;
  flex: 1;
  overflow: hidden;
}
.help-modal-nav {
  width: 190px;
  flex-shrink: 0;
  border-right: 1px solid var(--border);
  overflow-y: auto;
  padding: 12px 0;
}
.help-modal-content {
  flex: 1;
  overflow-y: auto;
  padding: 24px 28px;
  font-family: var(--sans);
  font-size: 13px;
  color: var(--text-light-color);
  line-height: 1.65;
}

/* Mobile: collapse to full-screen with horizontal nav strip */
@media (max-width: 600px) {
  .help-modal-box {
    width: 100vw;
    max-width: 100vw;
    max-height: 100vh;
    border-radius: 0;
    border-left: none;
    border-right: none;
    border-bottom: none;
    /* Slide up from bottom */
    margin-top: auto;
  }
  .modal-bg#helpModal {
    align-items: flex-end;
    padding: 0;
  }
  .help-modal-hdr {
    padding: 12px 14px;
  }
  .help-modal-sub {
    display: none; /* too cramped on phone */
  }
  .help-modal-body {
    flex-direction: column;
    overflow: hidden;
  }
  .help-modal-nav {
    width: 100%;
    border-right: none;
    border-bottom: 1px solid var(--border);
    /* Horizontal scrolling strip */
    display: flex;
    flex-direction: row;
    overflow-x: auto;
    overflow-y: hidden;
    padding: 0;
    flex-shrink: 0;
    max-height: 40px;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .help-modal-nav::-webkit-scrollbar { display: none; }
  /* Hide section labels on mobile nav */
  .help-modal-nav > div { display: none; }
  .help-nav-btn {
    display: inline-flex !important;
    width: auto;
    white-space: nowrap;
    padding: 10px 14px;
    font-size: 11px;
    flex-shrink: 0;
    border-left: none !important;
    border-bottom: 2px solid transparent;
  }
  .help-nav-btn.active {
    background: none;
    border-left: none !important;
    border-bottom: 2px solid var(--button-color) !important;
    padding-left: 14px !important;
    color: var(--button-color);
  }
  .help-modal-content {
    padding: 16px 14px;
    font-size: 13px;
    flex: 1;
    min-height: 0;
  }
}

/* Small tablets (601–768px) — narrower sidebar */
@media (min-width: 481px) and (max-width: 768px) {
  .help-modal-box {
    width: 96vw;
    max-height: 92vh;
  }
  .help-modal-nav {
    width: 150px;
  }
  .help-nav-btn {
    font-size: 10px;
    padding: 5px 10px;
  }
  .help-modal-content {
    padding: 16px 18px;
  }
}

/* LCA upgrade pane — inside out-content, hides/shows with .active like other panes */
.lca-upgrade-pane { display: none; align-items: center; justify-content: center; min-height: 400px; }
.lca-upgrade-pane.active { display: flex; }

/* ═══════════════════════════════════════════════════════════════
   MOBILE RESPONSIVE PASS — v26.04 targeted fixes
   ═══════════════════════════════════════════════════════════════ */

/* ── Help modal: hide search on very small screens ── */
@media (max-width: 480px) {
  #helpSearchInput { width: 100px !important; }
  .help-modal-hdr { flex-wrap: wrap; gap: 6px; padding: 10px 12px; }
  .help-modal-sub { display: none; }
}
@media (max-width: 375px) {
  #helpSearchInput { display: none; }
  #helpSearchResults { display: none !important; }
}

/* ── Photometrics panel: stack on tablet/phone ── */
@media (max-width: 1024px) {
  .photo-layout {
    grid-template-columns: 1fr;
    grid-template-rows: auto 1fr auto;
    overflow-y: auto;
  }
  .photo-lib {
    border-right: none;
    border-bottom: 1px solid var(--border);
    max-height: 200px;
    overflow-y: auto;
  }
  .photo-right {
    border-left: none;
    border-top: 1px solid var(--border);
    max-height: 220px;
  }
  .photo-center { min-height: 300px; }
  .photo-center-tabs { overflow-x: auto; flex-wrap: nowrap; }
  .photo-ctab { white-space: nowrap; flex-shrink: 0; }
}

/* ── Setpoints table: horizontal scroll on mobile ── */
@media (max-width: 768px) {
  #spArea { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  #spArea table { min-width: 900px; }
  #spMainTable { min-width: 900px; }
}

/* ── Site lighting panel: single column on phone ── */
@media (max-width: 600px) {
  #siteLightingPanel .sz-grid-2 { grid-template-columns: 1fr !important; }
  #siteLightingPanel [style*="grid-template-columns: 1fr 1fr 1fr"] {
    display: flex !important;
    flex-direction: column !important;
    gap: 8px !important;
  }
  #siteLightingPanel [style*="grid-template-columns: 1fr 1fr"] {
    display: flex !important;
    flex-direction: column !important;
    gap: 8px !important;
  }
}

/* ── CX checklist: tighter on phone ── */
@media (max-width: 480px) {
  .cx-scorecard { grid-template-columns: repeat(2, 1fr); gap: 6px; }
  .cx-room-hdr { padding: 10px 12px; }
  .cx-room-body { padding: 0 2px 12px; }
  .cx-item { grid-template-columns: 20px 1fr; gap: 6px; }
  .cx-item > *:nth-child(3),
  .cx-item > *:nth-child(4),
  .cx-item > *:nth-child(5) { grid-column: 1 / -1; }
}

/* ── Matrix table: prevent layout break on small screens ── */
@media (max-width: 768px) {
  .table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  #matrixTable { min-width: 1200px; table-layout: auto !important; }
}

/* ── Compliance: stack items on phone ── */
@media (max-width: 480px) {
  .crr-hdr { padding: 10px 12px; flex-wrap: wrap; gap: 6px; }
  .comp-scorecard { grid-template-columns: repeat(2, 1fr) !important; }
  .score-tile { padding: 8px 6px; }
  .stn { font-size: 20px; }
}

/* ── Dashboard score grid: 2-col on phone ── */
@media (max-width: 480px) {
  .dash-score-grid { grid-template-columns: repeat(2, 1fr) !important; }
  .dash-tile { padding: 10px 8px; }
}

/* ── Project admin / submittals: stack on phone ── */
@media (max-width: 600px) {
  .sub-item { flex-direction: column; align-items: flex-start; gap: 8px; }
  .sub-item-actions { width: 100%; justify-content: flex-start; }
  .rfi-item { flex-direction: column; gap: 6px; }
}

/* ── Budget: single column on phone ── */
@media (max-width: 480px) {
  .budget-room-grid { grid-template-columns: 1fr !important; }
  .budget-cat-row { flex-wrap: wrap; gap: 4px; }
}

/* ── Sidebar float button: safe area aware ── */
@supports (padding-bottom: env(safe-area-inset-bottom)) {
  @media (max-width: 768px) {
    #sidebarFloatBtn {
      bottom: calc(16px + env(safe-area-inset-bottom));
    }
  }
}

/* ── Input font-size: prevent iOS zoom on all inputs ── */
@media (max-width: 768px) {
  input[type="text"],
  input[type="email"],
  input[type="number"],
  input[type="password"],
  input[type="search"],
  select, textarea {
    font-size: 16px !important;
  }
}

/* ── Auth modal: full-screen on phone ── */
@media (max-width: 480px) {
  .auth-shell {
    width: 100vw !important;
    max-width: 100vw !important;
    border-radius: 16px 16px 0 0 !important;
    margin-top: auto;
  }
  .modal-bg#authModal { align-items: flex-end; }
}

/* ── Header actions: hide low-priority items on phone ── */
@media (max-width: 480px) {
  .hdr-menu-wrap:not(:first-child):not(:last-child):not(.hdr-avatar-wrap) {
    display: none;
  }
}

/* ── Submittal Markup Tools ─────────────────────────────────── */
.mk-tool {
  background: none; border: none; border-radius: 4px;
  color: var(--text-dark-color); font-size: 13px; cursor: pointer;
  padding: 4px 8px; min-width: 28px; min-height: 28px;
  display: inline-flex; align-items: center; justify-content: center;
  transition: all var(--dur-fast);
}
.mk-tool:hover { background: var(--foreground-color); color: var(--text-light-color); }
.mk-tool.active { background: var(--button-color); color: var(--btn-primary-ink); }
.mk-color {
  width: 20px; height: 20px; border-radius: 50%;
  border: 2px solid transparent; cursor: pointer;
  padding: 0; transition: transform var(--dur-fast);
}
@media (hover: hover) {
  .mk-color:hover { transform: scale(1.2); }
}
.mk-color.active { border-color: var(--text-light-color) !important; transform: scale(1.15); }
@media (max-width: 600px) {
  #subMarkupToolbar { gap: 4px; padding: 6px 8px; }
  .mk-tool { padding: 4px 6px; font-size: 12px; min-width: 26px; }
  #mkStrokeSize { width: 50px; }
}

/* ═══════════════════════════════════════════════════════════════
   TABLET LAYOUT PASS — 769px–1024px targeted fixes
   ═══════════════════════════════════════════════════════════════ */

/* ── Room editor: 2-col grid on tablet (not 1-col) ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .cat-grid { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
  .cat-grid.two { grid-template-columns: 1fr 1fr; }
  .editor-section { padding: 12px 16px; }

  /* Pill groups: wrap comfortably */
  .pill-group { flex-wrap: wrap; gap: 5px; }
  .pill { min-width: 0; flex-shrink: 1; }

  /* Room name / space type header in editor */
  .cat-hdr { padding: 10px 16px; }
}

/* ── Output pane headers: keep compact on tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .out-pane-hdr { padding: 10px 16px 8px; }
  .out-pane-sub { font-size: 10px; }
  .doc-toolbar  { padding: 6px 16px; }

  /* Narrative docs: full height on tablet */
  .narrative-doc { max-height: calc(100dvh - 160px); font-size: 12px; line-height: 1.8; }

  /* CIN/SOO/Spec/OM: comfortable reading */
  #cinDoc, #sooDoc, #specOut, #omDoc {
    font-size: 12px;
    line-height: 1.8;
    max-height: calc(100dvh - 180px);
    padding: 18px 20px;
  }
}

/* ── Matrix table: horizontal scroll at tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .table-wrap  { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  #matrixTable { min-width: 1100px; }
}

/* ── Setpoints table: horizontal scroll at tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  #spArea        { overflow-x: auto; }
  #spArea table  { min-width: 800px; }
}

/* ── Photometrics: sensible layout at 769–900px ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .photo-layout  { grid-template-columns: 220px 1fr; }
  .photo-right   { display: none; } /* hide project summary panel — too cramped */
}
@media (min-width: 769px) and (max-width: 1024px) {
  .photo-layout  { grid-template-columns: 220px 1fr 240px; }
}

/* ── Compliance scorecard: 3-col on tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .comp-scorecard { grid-template-columns: repeat(3, 1fr); }
}

/* ── Budget: keep 2-col on tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .budget-controls { flex-direction: row; flex-wrap: wrap; }
}

/* ── Dashboard score tiles: 3-col on tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .dash-score-grid { grid-template-columns: repeat(3, 1fr) !important; }
}

/* ── CX checklist: comfortable on tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .cx-item { grid-template-columns: 24px 1fr 100px 100px 100px; gap: 6px; }
  .cx-scorecard { grid-template-columns: repeat(4, 1fr); }
}

/* ── Help modal: keep 2-column on tablet ── */
@media (min-width: 481px) and (max-width: 1024px) {
  .help-modal-box  { width: min(760px, 96vw); max-height: 90vh; }
  .help-modal-nav  { width: 160px; }
  .help-modal-content { padding: 18px 20px; font-size: 12.5px; }
}

/* ── Auth modal: comfortable width on tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .auth-shell { width: min(420px, 92vw) !important; }
}

/* ── Submittal markup modal: toolbar wraps on tablet ── */
@media (min-width: 481px) and (max-width: 1024px) {
  #subMarkupToolbar { gap: 5px; padding: 6px 10px; }
  #mkStrokeSize { width: 60px; }
}

/* ── Wizard: comfortable on tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .wizard-shell {
    width: min(560px, 92vw) !important;
    max-height: 88dvh !important;
  }
  .wizard-options { grid-template-columns: 1fr 1fr; gap: 10px; }
  .wizard-options-grid { grid-template-columns: 1fr 1fr 1fr; }
}

/* ── Inner tabs: no overflow on tablet — just scroll ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .inner-tabs { overflow-x: auto; -webkit-overflow-scrolling: touch; flex-wrap: nowrap; }
  .inner-tab  { white-space: nowrap; flex-shrink: 0; }
}

/* ── Project admin (submittals/RFIs): 2-col grid on tablet ── */
@media (min-width: 769px) and (max-width: 1024px) {
  .sub-grid  { grid-template-columns: 1fr 1fr !important; }
}

/* ── Sidebar: slightly wider on landscape tablet ── */
@media (min-width: 769px) and (max-width: 1024px) and (orientation: landscape) {
  .sidebar { width: 280px !important; }
}

/* ── Out-pane: ensure proper overflow on tablet ── */
@media (min-width: 481px) and (max-width: 1024px) {
  .out-pane { overflow-x: hidden; overflow-y: auto; }
  .pane-content { margin: 10px 12px; }
}

/* ── Circuit map CTRL GROUP inline edit ─────────────────────── */
[data-action="circ-ctrl-group"]:hover { background: var(--foreground-color); }
[data-action="circ-ctrl-group"]:focus-visible { background: var(--foreground-color); outline: 1px solid var(--button-color); color: var(--text-light-color); }


/* ═══════════════════════════════════════════════════════════════
   PHASE 1 — TAB BAR & NAVIGATION — ALL VIEWPORTS
   v26.04.52000
   ═══════════════════════════════════════════════════════════════ */

/* Tab bar scroll fade indicators — DISABLED.
   Was meant to show a gradient fade on the strip's edges when content
   overflows, but in practice the gradient was rendering as a visible
   light-blue rectangle in the 10px gap between the strip and the right
   scroll button (light mode). The .tab-scroll-btn arrows on each side
   already provide the "more content to scroll" affordance, so the
   gradient is redundant. Force opacity:0 even when .scroll-left /
   .scroll-right classes are added so it doesn't reappear. */
.out-tabs-wrap {
  position: relative;
  display: flex;
  align-items: stretch;
}
.out-tabs-wrap::before,
.out-tabs-wrap::after {
  content: none;
  display: none;
}
.out-tabs-wrap.scroll-left::before,
.out-tabs-wrap.scroll-right::after {
  display: none;
  opacity: 0;
}

/* ── Tab scroll arrow buttons ──────────────────────────────────
   Always visible per spec. Dimmed at 35% when there's nothing to
   scroll in that direction; full opacity when scrollable. Clicking
   at a boundary is a harmless no-op. */
.tab-scroll-btn {
  flex-shrink: 0;
  width: 32px; height: 32px;
  /* Anchored near the top of the wrap, nudged 1.5px down so the arrow's
     visual center aligns with the tab text center (the wrap has 8px top
     padding, and tab text sits at ~25.5px from wrap top — splitting the
     difference with a 32px button puts its center at ~17px, so we offset
     to land it on the text row). */
  align-self: flex-start;
  margin-top: 1.5px;
  margin-bottom: 0;
  background: var(--glass2, rgba(255,255,255,0.85));
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--text-mid-color);
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  user-select: none;
  box-shadow: var(--shadow-sm);
  transition: color var(--dur-base), background var(--dur-base),
              border-color var(--dur-base), transform 150ms ease,
              box-shadow var(--dur-base);
  z-index: 3;
}
.tab-scroll-btn:hover {
  color: var(--text-mid-color);
  background: var(--button-color);
  border-color: var(--button-color);
  transform: scale(1.06);
  box-shadow: var(--shadow-md);
}
.tab-scroll-btn:active { transform: scale(0.96); }
.tab-scroll-btn:focus-visible {
  outline: 2px solid var(--button-color);
  outline-offset: 2px;
}
.out-tabs-wrap.scroll-left  .tab-scroll-btn-left,
.out-tabs-wrap.scroll-right .tab-scroll-btn-right { opacity: 1; }

/* ── Tab bar: always use smooth scroll ───────────────────────── */
.out-tabs {
  flex: 1;
  min-width: 0;
  scroll-behavior: smooth;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  overscroll-behavior-x: contain;
}
.out-tabs::-webkit-scrollbar { display: none; }

/* ── Tab active state: stronger visual on all screens ────────── */
.out-tab.active {
  color: var(--button-color);
  border-bottom-color: var(--button-color);
}
.out-tab:focus-visible {
  outline: 2px solid var(--button-color);
  outline-offset: -2px;
  border-radius: 3px;
}

/* ── Touch coarse: larger tap targets on touch devices ───────── */
@media (hover: none) and (pointer: coarse) {
  .out-tab {
    padding: 13px 12px;
    min-height: 44px;
    display: flex;
    align-items: center;
  }
  .inner-tab {
    min-height: 40px;
    display: flex;
    align-items: center;
    padding: 8px 14px;
  }
}

/* ── Desktop (> 1200px): pane-content fills its parent ─────────
   v26.04.27: previously capped .pane-content at 1100px (or 1600px
   for .pane-wide opt-in) for prose readability — but the floating
   bars above it were never capped, creating a visible width
   mismatch where bars extended past the content pane on wide
   monitors. The cap now lives on .output-card (the parent), so
   bars and content always share the same width. These per-element
   rules are now redundant and removed. */
@media (min-width: 1025px) {
  /* (intentionally empty — .output-card carries the cap) */
}

/* ── Ultrawide (> 1920px): no special handling needed; .output-card
   cap of 1600px applies uniformly at all desktop widths. ──── */

/* ── Tablet landscape (769–1024px): tighten tab padding ─────── */
@media (min-width: 769px) and (max-width: 1024px) {
  .out-tab {
    padding: 10px 10px;
    font-size: calc(10px * var(--fs, 1));
  }
}

/* ── Mobile (≤ 768px): compact tabs, keep readable ──────────── */
@media (max-width: 768px) {
  .out-tab {
    padding: 10px 10px;
    font-size: calc(10px * var(--fs, 1));
    letter-spacing: 0;
  }
  /* Show tab bar scroll hint arrow */
  .out-tabs-wrap::after {
    width: 40px;
  }
}

/* ── Mobile (≤ 480px): minimal tabs ─────────────────────────── */
@media (max-width: 480px) {
  .out-tab {
    padding: 10px 8px;
    font-size: 9px;
    letter-spacing: 0;
  }
  /* Inner tabs (Project Admin sub-tabs, Electrical sub-tabs) */
  .inner-tab {
    padding: 7px 10px;
    font-size: 9px;
  }
  /* Dividers between tab groups — show on mobile */
  .out-tab-divider {
    width: 1px;
    height: 18px;
    background: var(--border2);
    flex-shrink: 0;
    align-self: center;
  }
}

/* ── Very small (≤ 375px): ultra-compact ────────────────────── */
@media (max-width: 375px) {
  .out-tab {
    padding: 9px 7px;
    font-size: 8.5px;
  }
}

/* ── Header: safe-area insets for notched phones ────────────── */
.header {
  padding-left: max(12px, env(safe-area-inset-left));
  padding-right: max(12px, env(safe-area-inset-right));
  padding-top: env(safe-area-inset-top);
}

/* ── Auth gate: safe-area-aware ─────────────────────────────── */
#authGate {
  padding-top: max(20px, env(safe-area-inset-top));
  padding-bottom: max(20px, env(safe-area-inset-bottom));
}

/* ── Sidebar float button: above bottom nav on iOS ───────────── */
#sidebarFloatBtn {
  bottom: max(16px, calc(16px + env(safe-area-inset-bottom)));
}



/* ═══════════════════════════════════════════════════════════════
   PHASE 2 — MODALS & OVERLAYS — MOBILE SCROLLABILITY
   v26.04.52000
   ═══════════════════════════════════════════════════════════════ */

/* ── Base modal: always scrollable, never taller than viewport ── */
.modal {
  max-height: min(90dvh, 900px);
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}

/* ── modal-bg padding on small screens so modals don't edge-to-edge ── */
@media (max-width: 768px) {
  .modal-bg {
    padding: 12px;
    align-items: flex-start;
    padding-top: max(16px, env(safe-area-inset-top));
    overflow-y: auto;
  }
  .modal {
    width: 100% !important;
    max-width: 100% !important;
    max-height: min(92dvh, 800px);
    border-radius: 10px;
    padding: 18px 16px;
  }
}

@media (max-width: 480px) {
  .modal {
    padding: 14px 12px;
    max-height: min(94dvh, 700px);
    border-radius: 8px;
  }
}

/* ── Room editor modal ────────────────────────────────────────── */
/* Full-screen on mobile with scrollable body */
#roomEditorModal {
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}
#roomEditorModal > div {
  max-height: min(96dvh, 1000px);
  display: flex;
  flex-direction: column;
}
#remBody {
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  flex: 1;
  min-height: 0;
}

@media (max-width: 768px) {
  #roomEditorModal > div {
    width: 100vw !important;
    max-width: 100vw !important;
    margin: 0;
    border-radius: 12px 12px 0 0;
    max-height: 96dvh;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
  }
  #roomEditorModal {
    align-items: flex-end !important;
    padding: 0 !important;
  }
}

/* ── Project list modal ──────────────────────────────────────── */
@media (max-width: 768px) {
  #projectListModal > div {
    width: 100% !important;
    max-width: 100% !important;
    margin: 0 12px;
    max-height: min(88dvh, 700px);
    overflow-y: auto;
  }
  #projectListBody {
    overflow-y: auto;
    max-height: 55dvh;
    -webkit-overflow-scrolling: touch;
  }
}

/* ── Help modal ──────────────────────────────────────────────── */
@media (max-width: 480px) {
  .help-modal-box {
    max-height: 92dvh !important;
    overflow-y: auto !important;
  }
  .help-modal-body {
    max-height: 60dvh !important;
    overflow-y: auto !important;
  }
}

/* ── Wizard modal ─────────────────────────────────────────────── */
@media (max-width: 768px) {
  .wizard-shell {
    max-height: 92dvh;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }
}

/* ── Subscription/auth modals ────────────────────────────────── */
@media (max-width: 480px) {
  #subscribeModal .modal,
  #authModal .modal,
  .modal-bg#authModal > div,
  .auth-shell {
    max-height: 92dvh;
    overflow-y: auto;
  }
}

/* ── TOS modal: scrollable body ──────────────────────────────── */
#tosModal > div {
  max-height: min(90dvh, 800px);
  display: flex;
  flex-direction: column;
}
#tosBody {
  overflow-y: auto;
  flex: 1;
  min-height: 0;
  -webkit-overflow-scrolling: touch;
}

@media (max-width: 480px) {
  #tosModal > div {
    width: min(100%, 460px);
    max-height: 92dvh;
  }
}

/* ── Bulk modal ──────────────────────────────────────────────── */
@media (max-width: 768px) {
  #bulkModal > div,
  #firmDashboardModal > div {
    width: 100% !important;
    max-width: calc(100% - 24px) !important;
    max-height: min(90dvh, 700px);
    overflow-y: auto;
  }
}

/* ── Submittal markup modal — full-screen on all sizes ─────────── */
/* Already positioned with inset:0, just ensure inner content scrolls */
#subMarkupModal {
  overflow: hidden;
}

/* ── Sub-sheet markup toolbar: scroll on small screens ─────────── */
@media (max-width: 480px) {
  #subMarkupToolbar {
    overflow-x: auto;
    flex-wrap: nowrap;
    -webkit-overflow-scrolling: touch;
  }
}

/* ── Photo tag map / photo count modals ──────────────────────── */
@media (max-width: 768px) {
  #photoTagMapModal > div,
  #photoCountAllModal > div {
    width: 100% !important;
    max-width: calc(100% - 24px) !important;
    max-height: min(88dvh, 600px);
    overflow-y: auto;
  }
}

/* ── Tab visibility modal ─────────────────────────────────────── */
@media (max-width: 768px) {
  #tabVisibilityModal > div {
    width: 100% !important;
    max-width: calc(100% - 24px) !important;
    max-height: min(88dvh, 600px);
    overflow-y: auto;
  }
  #tabVisibilityBody {
    max-height: 60dvh;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }
}

/* ── Avatar modal ─────────────────────────────────────────────── */
@media (max-width: 480px) {
  #avatarModal > div {
    width: 100% !important;
    max-width: calc(100% - 24px) !important;
  }
}

/* ── Room new/template modal ─────────────────────────────────── */
@media (max-width: 480px) {
  #roomModal > div {
    width: 100% !important;
    max-width: calc(100% - 24px) !important;
    max-height: min(88dvh, 600px);
    overflow-y: auto;
  }
}



/* ═══════════════════════════════════════════════════════════════
   PHASE 3 — MAIN CONTENT PANES — MOBILE READABILITY
   v26.04.52000
   ═══════════════════════════════════════════════════════════════ */

/* ── proj-grid: minimum column width on small screens ─────────── */
/* Default minmax(190px,1fr) clips at 375px — reduce to 140px */
@media (max-width: 480px) {
  .proj-grid {
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: 8px;
  }
  /* Full-width fields on mobile */
  .proj-grid .fg[style*="grid-column:1/-1"],
  .proj-grid .fg[style*="grid-column: 1/-1"] {
    grid-column: 1 / -1;
  }
}

/* ── Dashboard KPI tiles: 1 column on mobile ─────────────────── */
@media (max-width: 480px) {
  .dash-score-grid {
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 8px;
  }
  .dash-tile {
    padding: 12px 10px;
  }
  .dash-tile-value {
    font-size: 22px;
  }
}
@media (max-width: 375px) {
  .dash-score-grid {
    grid-template-columns: 1fr !important;
  }
}

/* ── Tables: horizontal scroll wrapper ───────────────────────── */
/* Matrix, CX checklist, budget table, compliance table */
.table-wrap,
.ctable-wrap,
#matrixTable,
.cx-room-body,
.budget-room-grid {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
}

/* ── Prevent table collapse on mobile ────────────────────────── */
@media (max-width: 768px) {
  .ctable { min-width: 480px; }
  #matrixTable table { min-width: 500px; }
}

@media (max-width: 480px) {
  /* Pane content padding — reduce on small screens */
  .pane-content {
    padding: 12px !important;
  }
  .out-pane-hdr {
    padding: 12px 12px 8px !important;
  }
  .out-pane-title {
    font-size: 14px !important;
  }
  .out-pane-sub {
    font-size: 10px !important;
  }

  /* Project info form */
  .proj-grid {
    gap: 8px;
  }
  .fg > label {
    font-size: 10px;
  }
  .fg > input,
  .fg > select,
  .fg > textarea {
    font-size: 16px !important; /* Prevent iOS zoom */
    padding: 8px 10px;
  }
}

/* ── CIN / SOO / Spec writer narrative docs ──────────────────── */
@media (max-width: 480px) {
  .narrative-doc {
    padding: 16px 14px !important;
    font-size: 13px !important;
  }
  .doc-toolbar {
    flex-wrap: wrap;
    gap: 6px;
  }
  .doc-toolbar .btn {
    font-size: 10px;
    padding: 6px 10px;
  }
}

/* ── Compliance scorecard ────────────────────────────────────── */
@media (max-width: 480px) {
  .comp-scorecard {
    grid-template-columns: 1fr 1fr !important;
    gap: 6px;
  }
  .score-tile {
    padding: 10px 8px;
  }
  .stn {
    font-size: 9px;
  }
}

/* ── CX checklist ────────────────────────────────────────────── */
@media (max-width: 480px) {
  .cx-item {
    grid-template-columns: 1fr auto !important;
    gap: 6px;
  }
  .cx-item > *:nth-child(3),
  .cx-item > *:nth-child(4),
  .cx-item > *:nth-child(5) {
    display: none; /* Hide non-essential columns on mobile */
  }
  .cx-room-hdr {
    font-size: 11px;
    padding: 8px 10px;
  }
}

/* ── Budget table ────────────────────────────────────────────── */
@media (max-width: 480px) {
  .budget-room-grid {
    grid-template-columns: 1fr auto !important;
  }
  .budget-cat-row {
    font-size: 11px;
  }
}

/* ── Setpoints table ─────────────────────────────────────────── */
@media (max-width: 768px) {
  #spArea {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  #spMainTable {
    min-width: 480px;
  }
}

/* ── Submittal list ──────────────────────────────────────────── */
@media (max-width: 480px) {
  .sub-item {
    flex-direction: column;
    gap: 8px;
    align-items: flex-start;
  }
  .sub-item-actions {
    align-self: flex-end;
  }
}

/* ── RFI items ───────────────────────────────────────────────── */
@media (max-width: 480px) {
  .rfi-item {
    padding: 12px;
  }
  .rfi-item-hdr {
    flex-wrap: wrap;
    gap: 6px;
  }
}

/* ── Dashboard lifecycle status bar ─────────────────────────── */
@media (max-width: 480px) {
  /* Status bar labels — very tight on mobile, shorten via font size */
  .dash-status-label {
    font-size: 7px;
  }
}

/* ── Project list items (pli) ────────────────────────────────── */
@media (max-width: 480px) {
  .pli {
    padding: 10px 10px;
  }
  .pli-name {
    font-size: 13px;
  }
  .pli-meta {
    font-size: 10px;
    flex-wrap: wrap;
    gap: 4px;
  }
  .pli-actions {
    gap: 4px;
  }
}

/* ── Catalog / fixture table ─────────────────────────────────── */
@media (max-width: 768px) {
  #catalogTableWrap {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  .cat-grid {
    overflow-x: auto;
  }
}

/* ── Legend items ────────────────────────────────────────────── */
@media (max-width: 480px) {
  .legend-grid {
    grid-template-columns: 1fr !important;
  }
}

/* ── One-line diagram ────────────────────────────────────────── */
/* Already has canvas — ensure wrapper scrolls */
@media (max-width: 768px) {
  #pane-oneline {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
}

/* ── Output cards (general) ──────────────────────────────────── */
@media (max-width: 480px) {
  .output-card {
    margin-bottom: 12px;
  }
  .output-card-header {
    padding: 10px 12px;
  }
  .output-card-header h3 {
    font-size: 11px;
  }
}

/* ── Cat sections in room editor ─────────────────────────────── */
@media (max-width: 480px) {
  .cat-hdr {
    font-size: 9px;
    padding: 8px 10px;
  }
  .cat-section {
    padding: 10px;
  }
}

/* ── Pill groups (code selectors) ────────────────────────────── */
@media (max-width: 480px) {
  .pill-group {
    flex-wrap: wrap;
    gap: 4px;
  }
  .pill {
    font-size: 10px;
    padding: 5px 10px;
  }
}

/* ── Min font size floor — nothing below 11px on mobile ──────── */
@media (max-width: 480px) {
  [style*="font-size:9px"],
  [style*="font-size: 9px"] {
    font-size: 10px !important;
  }
  [style*="font-size:8px"],
  [style*="font-size: 8px"],
  [style*="font-size:8.5px"] {
    font-size: 10px !important;
  }
}



/* ═══════════════════════════════════════════════════════════════
   PHASE 4 — SIDEBAR & TABLET (769–1024px)
   v26.04.52000
   ═══════════════════════════════════════════════════════════════ */

/* ── Tablet portrait: sidebar slightly narrower ─────────────── */
@media (min-width: 769px) and (max-width: 1024px) {
  .layout {
    grid-template-columns: 210px 1fr;
  }
  .sidebar {
    width: 210px;
  }
}

/* ── Tablet (769–1024px): compact sidebar elements ───────────── */
@media (min-width: 769px) and (max-width: 1024px) {
  .zone-header {
    padding: 7px 8px;
    font-size: 10px;
  }
  .room-item {
    padding: 7px 8px;
  }
  .rname {
    font-size: 11px;
  }
  .rtype {
    font-size: 9px;
  }
  /* Sidebar buttons */
  .sb-btn-row .btn {
    font-size: 10px;
    padding: 6px 10px;
  }
}

/* ── Tablet: room editor inner tabs don't overflow ───────────── */
@media (min-width: 769px) and (max-width: 1024px) {
  #remBody .inner-tabs {
    overflow-x: auto;
    flex-wrap: nowrap;
  }
  #remBody .inner-tab {
    font-size: 9px;
    padding: 6px 10px;
    flex-shrink: 0;
  }
}

/* ── Tablet landscape: takeoff canvas usable ─────────────────── */
@media (min-width: 769px) and (max-width: 1024px) and (orientation: landscape) {
  #takeoutModal .takeout-inner {
    flex-direction: row;
  }
}


/* ═══════════════════════════════════════════════════════════════
   PHASE 5 — DESKTOP POLISH (≥ 1200px)
   v26.04.52000
   ═══════════════════════════════════════════════════════════════ */

/* ── Wide screen: previously capped narrative-doc at 860px for line
   length readability, but that made content panes visibly narrower
   than the .doc-toolbar above them (which has no equivalent cap),
   producing an unintended right-side cutoff. Removed in favor of
   width parity with the toolbar — readability is preserved on
   narrower screens by container width, and users can resize windows
   if a wide-screen line-length becomes uncomfortable. */
@media (min-width: 1025px) {
  .proj-grid {
    max-width: 1000px;
  }
}

/* ── Very wide (≥ 1440px): clamp layout columns ─────────────── */
@media (min-width: 1440px) {
  .layout {
    grid-template-columns: 260px 1fr;
  }
}

/* ── Project list modal: wider on desktop ────────────────────── */
@media (min-width: 769px) {
  #projectListModal .modal {
    width: min(700px, 90vw);
  }
  #projectListBody {
    max-height: min(60vh, 600px);
    overflow-y: auto;
  }
}

/* ── Help modal: wider on desktop ────────────────────────────── */
@media (min-width: 1025px) {
  .help-modal-box {
    width: min(860px, 90vw);
  }
}

/* ── Firm dashboard modal: wider on desktop ──────────────────── */
@media (min-width: 769px) {
  #firmDashboardModal .modal,
  #firmDashboardModal > div > div {
    width: min(760px, 90vw);
    max-height: min(85vh, 900px);
    overflow-y: auto;
  }
}

/* ── Modals: align-items center on desktop (flex-start on mobile above) */
@media (min-width: 769px) {
  .modal-bg {
    align-items: center;
    padding: 20px;
  }
}


/* ═══════════════════════════════════════════════════════════════
   PHASE 6 — INTERACTION QUALITY (ALL VIEWPORTS)
   v26.04.52000
   ═══════════════════════════════════════════════════════════════ */

/* ── Touch press feedback ────────────────────────────────────── */
/* Visual press state for all interactive elements on touch devices */
@media (hover: none) and (pointer: coarse) {
  .btn:active,
  .hdr-btn:active,
  .out-tab:active,
  .inner-tab:active,
  .room-item:active,
  .zone-header:active,
  .pli:active,
  .hdr-menu-item:active {
    opacity: 0.7;
    transform: scale(0.97);
  }
  /* Instant transitions for touch — no hover delay */
  .btn,
  .hdr-btn,
  .out-tab,
  .inner-tab,
  .room-item,
  .pli {
    transition: opacity var(--dur-fast), transform var(--dur-fast);
    -webkit-tap-highlight-color: transparent;
  }
}

/* ── Tap highlight: remove default blue flash everywhere ──────── */
* {
  -webkit-tap-highlight-color: transparent;
}
/* Restore for form elements */
input, select, textarea {
  -webkit-tap-highlight-color: rgb(from var(--button-color) r g b / 0.1);
}

/* ── Scroll momentum on all scrollable containers ────────────── */
.out-tabs,
.sidebar,
#projectListBody,
#remBody,
#tosBody,
.help-modal-body,
.help-modal-nav,
.pane-content,
.out-pane,
.hdr-menu,
.auth-user-menu,
.inner-tabs,
.cat-section,
#auditLogContent,
#toBomContent,
#toPaletteContent {
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}

/* ── Focus states: visible for keyboard navigation ───────────── */
:focus-visible {
  outline: 2px solid var(--button-color);
  outline-offset: 1px;
  border-radius: 3px;
}
/* Don't show focus ring on click, only keyboard */
:focus:not(:focus-visible) {
  outline: none;
}

/* ── Button active states (desktop too) ──────────────────────── */
.btn:active {
  transform: translateY(1px);
  opacity: 0.85;
}

/* ── Smooth transitions on interactive elements ──────────────── */
.btn,
.hdr-btn,
.out-tab,
.inner-tab,
.room-item,
.pli,
.zone-header {
  transition: background var(--dur-base), color var(--dur-base), border-color var(--dur-base), opacity var(--dur-fast), transform var(--dur-fast);
}

/* ── Input/select focus glow ─────────────────────────────────── */
input:focus,
select:focus,
textarea:focus {
  outline: none;
  border-color: var(--button-color) !important;
  box-shadow: 0 0 0 2px rgb(from var(--button-color) r g b / 0.15);
}

/* ── Scrollbar styling — thin, consistent ────────────────────── */
::-webkit-scrollbar {
  width: 4px;
  height: 4px;
}
::-webkit-scrollbar-track {
  background: transparent;
}
::-webkit-scrollbar-thumb {
  background: var(--border2, #334155);
  border-radius: 2px;
}
::-webkit-scrollbar-thumb:hover {
  background: var(--text-dark-color, #64748b);
}

/* ── Sidebar transition: smooth open/close ───────────────────── */
@media (max-width: 768px) {
  .sidebar {
    transition: transform var(--dur-slow) var(--ease-out),
                box-shadow var(--dur-slow) ease;
    will-change: transform;
  }
  .sidebar-backdrop {
    transition: opacity var(--dur-slow) ease;
    will-change: opacity;
  }
}

/* ── Notification banners: respect safe areas ────────────────── */
#newShareBanner,
[id^="referralBanner_"] {
  top: calc(52px + env(safe-area-inset-top));
}

/* ── Prevent text selection on interactive elements ──────────── */
.out-tab,
.inner-tab,
.hdr-btn,
.room-item .room-acts,
.zone-header {
  user-select: none;
  -webkit-user-select: none;
}

/* ── Print: hide all responsive-only UI ─────────────────────── */
@media print {
  #sidebarFloatBtn,
  .sidebar-backdrop,
  #newShareBanner,
  [id^="referralBanner_"],
  #projectStatusBadge,
  .out-tabs-wrap::before,
  .out-tabs-wrap::after {
    display: none !important;
  }
}


/* ══════════════════════════════════════════════════════════════
   Field Activity — banner + pending RFI triage (B.4b/B.5b)
   ══════════════════════════════════════════════════════════════ */

.field-activity-banner {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 14px 18px;
  background: var(--foreground-color);
  border: 1px solid var(--info);
  border-radius: 8px;
  margin: 12px 12px 16px;
  box-shadow: 0 0 0 1px rgba(var(--cyan-rgb), 0.1);
}

.fa-banner-pending {
  background: rgba(var(--button-rgb-color), 0.08);
  border-color: var(--button-color);
  box-shadow: 0 0 0 1px rgba(var(--button-rgb-color), 0.1);
}

.fa-banner-icon {
  font-size: 24px;
  color: var(--info);
  line-height: 1;
  flex-shrink: 0;
}

.fa-banner-pending .fa-banner-icon {
  color: var(--button-color);
}

.fa-banner-text {
  flex: 1;
  min-width: 0;
}

.fa-banner-title {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--info);
  font-weight: 700;
  margin-bottom: 2px;
}

.fa-banner-pending .fa-banner-title {
  color: var(--button-color);
}

.fa-banner-summary {
  font-family: var(--sans);
  font-size: 13px;
  color: var(--text-light-color);
}

.fa-banner-actions {
  display: flex;
  gap: 8px;
  flex-shrink: 0;
}

.fa-banner-btn {
  font-family: var(--mono);
  font-size: 11px;
  padding: 7px 14px;
  border-radius: 4px;
  background: var(--foreground-color);
  color: var(--text-mid-color);
  border: 1px solid var(--border2);
  cursor: pointer;
  white-space: nowrap;
  transition: all 0.15s;
}

.fa-banner-btn:hover {
  background: var(--midground-color);
  color: var(--text-light-color);
}

.fa-banner-btn-primary {
  background: var(--button-color);
  color: var(--btn-primary-ink);
  border-color: var(--button-color);
  font-weight: 600;
}

.fa-banner-btn-primary:hover {
  background: var(--button-click-color);
  color: var(--btn-primary-ink);
}

/* ── Pending Field RFIs panel ── */

.fa-pending-wrap {
  background: rgba(var(--button-rgb-color), 0.05);
  border: 1px solid rgba(var(--button-rgb-color), 0.3);
  border-radius: 8px;
  padding: 16px;
  margin-bottom: 20px;
}

.fa-pending-header {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 12px;
  padding-bottom: 10px;
  border-bottom: 1px solid rgba(var(--button-rgb-color), 0.2);
}

.fa-pending-title {
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--button-color);
  font-weight: 700;
}

.fa-pending-count {
  background: var(--button-color);
  color: var(--btn-primary-ink);
  font-family: var(--mono);
  font-size: 10px;
  font-weight: 700;
  padding: 2px 8px;
  border-radius: 10px;
}

.fa-pending-desc {
  font-family: var(--sans);
  font-size: 11px;
  color: var(--text-dark-color);
  flex: 1;
}

.fa-pending-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.fa-pending-item {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-left: 3px solid var(--button-color);
  border-radius: 6px;
  padding: 12px 14px;
}

.fa-pending-item-head {
  display: flex;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 8px;
  flex-wrap: wrap;
}

.fa-pending-subject {
  font-family: var(--sans);
  font-size: 14px;
  font-weight: 600;
  color: var(--text-light-color);
  flex: 1;
  min-width: 0;
}

.fa-pending-meta {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
  letter-spacing: 0.3px;
}

.fa-pending-body {
  font-family: var(--sans);
  font-size: 13px;
  color: var(--text-mid-color);
  line-height: 1.5;
  white-space: pre-wrap;
  background: var(--midground-color);
  padding: 10px;
  border-radius: 4px;
  margin-bottom: 10px;
}

.fa-pending-context {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 10px;
}

.fa-pending-chip {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
  background: var(--foreground-color);
  border: 1px solid var(--border);
  padding: 3px 8px;
  border-radius: 3px;
}

.fa-pending-contact {
  display: flex;
  gap: 14px;
  flex-wrap: wrap;
  font-family: var(--mono);
  font-size: 10px;
  color: var(--text-dark-color);
  margin-bottom: 10px;
}

.fa-pending-contact-item {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

.fa-pending-contact a {
  color: var(--info);
  text-decoration: none;
}

.fa-pending-contact a:hover {
  text-decoration: underline;
}

.fa-pending-actions {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  padding-top: 10px;
  border-top: 1px solid var(--border);
}

/* ══════════════════════════════════════════════════════════════
   GLOBAL TOUCH-SCROLL FOR HORIZONTAL TABLE WRAPPERS
   ══════════════════════════════════════════════════════════════
   Every wrapper across the app that uses overflow-x:auto for wide
   tables (Schedule, Compare, Budget, Setpoints, Matrix, Circuit
   Map, Code Comparison) needs explicit `touch-action: pan-x pan-y`
   to engage horizontal swipe on mobile — the default `auto` allows
   browser to pick `pan-y` only and silently swallow horizontal
   swipes. Also adds momentum scroll on iOS and prevents back-nav
   gesture when swiping past the edge.
   Applied via a single shared selector list so every wrapper gets
   the same treatment without per-component patching. New table
   wrappers added later just need to use one of these classes/IDs
   to inherit the behavior.
   ══════════════════════════════════════════════════════════════ */
#catalogTableWrap,
.ctable-wrap,
.table-wrap,
.sched-wrap,
.cc-wrap,
.cc-table-wrap,
.sp-wrap,
.old-svg-wrap,
.matrix-wrap,
#matrixOut,
#matrixWrap,
.budget-line-wrap {
  touch-action: pan-x pan-y;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
}

/* ── CX Export PDF dropdown ────────────────────────────────────── */
/* Single button + dropdown menu in the CX pane action bar.
   Mirrors the visual feel of .auth-user-menu but scoped to CX.
   Kept compact since there are only two menu items.                */
.cx-export-wrap { /* set via inline style in markup; kept here for any future overrides */ }
.cx-export-menu {
  position: absolute;
  top: 100%;
  right: 0;
  margin-top: 4px;
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r-sm);
  box-shadow: 0 4px 14px rgba(0,0,0,0.25);
  padding: 4px;
  min-width: 180px;
  z-index: 100;
}
.cx-export-menu-item {
  display: block;
  width: 100%;
  background: none;
  border: none;
  text-align: left;
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color);
  padding: 7px 10px;
  border-radius: var(--r-sm);
  cursor: pointer;
  letter-spacing: 0.3px;
}
.cx-export-menu-item:hover {
  background: var(--foreground-color);
  color: var(--button-color);
}

/* ── Auto Layout / Solve modal ─────────────────────────────────────────── */
.photo-solve-row-btn {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1)); padding: 3px 9px;
  border-radius: var(--r-sm); border: 1px solid var(--border2);
  background: none; color: var(--accent-photometric); cursor: pointer;
  margin-right: 4px; letter-spacing: 0.5px; transition: all var(--dur-fast);
}
.photo-solve-row-btn:hover {
  border-color: var(--accent-photometric);
  background: rgb(from var(--accent-photometric) r g b / 0.10);
}

#photoSolveModal {
  display: none; position: fixed; inset: 0; z-index: 950;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoSolveModal.open { display: flex; }

.photo-solve-box {
  background: var(--midground-color); border: 1px solid var(--border);
  border-radius: 10px; padding: 22px; width: 620px; max-width: 94vw;
  max-height: 88vh; overflow-y: auto;
  box-shadow: 0 12px 48px var(--scrim-medium);
}
.photo-solve-box h3 {
  font-family: var(--mono); font-size: calc(12px * var(--fs, 1)); font-weight: 700;
  letter-spacing: 1.5px; text-transform: uppercase;
  color: var(--accent-photometric); margin: 0 0 4px;
}
.photo-solve-sub {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); margin-bottom: 16px; line-height: 1.5;
}

.photo-solve-form {
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: 12px; margin-bottom: 14px;
}
.photo-solve-field { display: flex; flex-direction: column; gap: 4px; }
.photo-solve-field label {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.6px; text-transform: uppercase; color: var(--text-dark-color);
}
.photo-solve-field-opt {
  text-transform: none; letter-spacing: 0; color: var(--text-dark-color); opacity: 0.7;
  font-size: 9px;
}
.photo-solve-field input {
  padding: 7px 10px; background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color); font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
}
.photo-solve-field input:focus { outline: none; border-color: var(--accent-photometric); }

.photo-solve-compute-row {
  display: flex; justify-content: flex-end; margin-bottom: 14px;
}

.photo-solve-error {
  background: rgb(from var(--red) r g b / 0.10);
  border: 1px solid rgb(from var(--red) r g b / 0.30);
  border-radius: var(--r-sm); padding: 10px 14px; margin-bottom: 12px;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--red);
}
.photo-solve-warning {
  background: rgb(from var(--button-color) r g b / 0.10);
  border: 1px solid rgb(from var(--button-color) r g b / 0.30);
  border-radius: var(--r-sm); padding: 10px 14px; margin-bottom: 12px;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--button-color); line-height: 1.5;
}

.photo-solve-headline {
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r); padding: 14px 16px; margin-bottom: 12px;
}
.photo-solve-headline-qty {
  font-family: var(--mono); font-size: calc(20px * var(--fs, 1));
  font-weight: 700; color: var(--text-light-color); letter-spacing: 0.5px;
}
.photo-solve-headline-grid {
  font-size: calc(13px * var(--fs, 1)); font-weight: 400; color: var(--text-dark-color);
  letter-spacing: 0;
}
.photo-solve-headline-spacing {
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--text-dark-color); margin-top: 4px; letter-spacing: 0.4px;
}

.photo-solve-metrics {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 8px; margin-bottom: 12px;
}
.photo-solve-metric {
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r); padding: 10px 12px;
  display: flex; flex-direction: column; gap: 4px;
}
.photo-solve-metric-label {
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1));
  letter-spacing: 0.8px; text-transform: uppercase; color: var(--text-dark-color);
}
.photo-solve-metric-val {
  font-family: var(--mono); font-size: calc(18px * var(--fs, 1));
  font-weight: 700; color: var(--text-light-color);
}
.photo-solve-unit {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); margin-top: -2px;
}
.photo-solve-badge {
  display: inline-block; padding: 2px 6px; border-radius: 3px;
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1));
  letter-spacing: 0.4px; line-height: 1.3;
}
.photo-solve-badge.ok {
  background: rgb(from var(--green) r g b / 0.15);
  color: var(--green);
  border: 1px solid rgb(from var(--green) r g b / 0.3);
}
.photo-solve-badge.fail {
  background: rgb(from var(--red) r g b / 0.15);
  color: var(--red);
  border: 1px solid rgb(from var(--red) r g b / 0.3);
}
.photo-solve-badge.muted {
  background: var(--foreground-color); color: var(--text-dark-color);
  border: 1px solid var(--border2);
}

.photo-solve-meta {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); padding: 8px 10px; background: var(--foreground-color);
  border-radius: var(--r-sm); border: 1px solid var(--border2);
  letter-spacing: 0.3px; line-height: 1.5;
}

.photo-solve-footer {
  display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px;
  padding-top: 14px; border-top: 1px solid var(--border);
}

/* ── Fixture category labels + mount-height visual states ───────────────── */
.photo-fx-cat {
  display: inline-block; padding: 1px 6px; margin-left: 4px;
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1));
  letter-spacing: 0.4px; line-height: 1.4;
  background: var(--foreground-color); color: var(--text-dark-color);
  border: 1px solid var(--border2); border-radius: 3px;
}
.photo-fx-cat.unspec {
  background: rgb(from var(--button-color) r g b / 0.10);
  color: var(--button-color);
  border-color: rgb(from var(--button-color) r g b / 0.30);
}

/* Mount-height field — visual differentiation between override and inherit */
.photo-mount-default {
  /* Empty input showing the placeholder (room default). Subtle, faded. */
  font-style: italic; color: var(--text-dark-color);
  border-style: dashed !important;
}
.photo-mount-default::placeholder { color: var(--text-dark-color); opacity: 0.85; }
.photo-mount-override {
  /* Explicit override — solid, full opacity. */
  border-style: solid !important;
}

/* ── Layout Recommender modal ──────────────────────────────────────────── */
#photoRecommendModal {
  display: none; position: fixed; inset: 0; z-index: 950;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoRecommendModal.open { display: flex; }

.photo-rec-box {
  background: var(--midground-color); border: 1px solid var(--border);
  border-radius: 10px; padding: 22px; width: 760px; max-width: 96vw;
  max-height: 92vh; overflow-y: auto;
  box-shadow: 0 12px 48px var(--scrim-medium);
}
.photo-rec-box h3 {
  font-family: var(--mono); font-size: calc(12px * var(--fs, 1));
  font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase;
  color: var(--accent-photometric); margin: 0 0 4px;
}
.photo-rec-sub {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); margin-bottom: 16px; line-height: 1.5;
}

.photo-rec-form {
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: 12px; margin-bottom: 12px;
}
.photo-rec-field { display: flex; flex-direction: column; gap: 4px; }
.photo-rec-field label {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.6px; text-transform: uppercase; color: var(--text-dark-color);
}
.photo-rec-field-opt {
  text-transform: none; letter-spacing: 0; color: var(--text-dark-color); opacity: 0.7;
  font-size: 9px;
}
.photo-rec-field input {
  padding: 7px 10px; background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color); font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
}
.photo-rec-field input:focus { outline: none; border-color: var(--accent-photometric); }

.photo-rec-toggle-row { margin-bottom: 12px; }
.photo-rec-toggle {
  display: flex; align-items: center; gap: 8px; cursor: pointer;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-mid-color);
}
.photo-rec-toggle input { width: 14px; height: 14px; cursor: pointer; }

.photo-rec-compute-row {
  display: flex; justify-content: flex-end; margin-bottom: 14px;
}

#photoRecProgress {
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); padding: 10px 14px; margin-bottom: 12px;
}
.photo-rec-progress-label {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); margin-bottom: 6px; letter-spacing: 0.4px;
}
.photo-rec-progress-bar {
  height: 4px; background: var(--foreground-color); border-radius: 2px; overflow: hidden;
}
.photo-rec-progress-fill {
  height: 100%; background: var(--accent-photometric);
  transition: width 200ms ease;
}

#photoRecResults {
  display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px;
}

.photo-rec-empty {
  background: rgb(from var(--button-color) r g b / 0.08);
  border: 1px solid rgb(from var(--button-color) r g b / 0.25);
  border-radius: var(--r-sm); padding: 14px 16px;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color); line-height: 1.6;
}
.photo-rec-empty-meta {
  margin-top: 8px; font-size: calc(9px * var(--fs, 1)); color: var(--text-dark-color);
}

.photo-rec-row {
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r); padding: 12px 14px;
  display: flex; flex-direction: column; gap: 8px;
}
.photo-rec-row-hdr {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 12px;
}
.photo-rec-row-name {
  font-family: var(--mono); font-size: calc(12px * var(--fs, 1));
  font-weight: 700; color: var(--text-light-color); letter-spacing: 0.3px;
}
.photo-rec-cat {
  display: inline-block; padding: 1px 6px; margin-left: 4px;
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1));
  letter-spacing: 0.4px; line-height: 1.4;
  background: var(--foreground-color); color: var(--text-dark-color);
  border: 1px solid var(--border2); border-radius: 3px;
}
.photo-rec-cat.unspec {
  background: rgb(from var(--button-color) r g b / 0.10);
  color: var(--button-color);
  border-color: rgb(from var(--button-color) r g b / 0.30);
}

/* Session 13 — composite score badge + comparison */
.photo-rec-score {
  display: inline-block; min-width: 32px; padding: 2px 8px;
  margin-right: 8px; vertical-align: middle;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  font-weight: 700; letter-spacing: 0.2px; text-align: center;
  border-radius: 4px; cursor: help;
}
.photo-rec-score.good {
  background: rgb(from var(--green, #48d158) r g b / 0.18);
  color: var(--green, #48d158);
  border: 1px solid rgb(from var(--green, #48d158) r g b / 0.40);
}
.photo-rec-score.mid {
  background: rgb(from var(--button-color) r g b / 0.18);
  color: var(--button-color);
  border: 1px solid rgb(from var(--button-color) r g b / 0.40);
}
.photo-rec-score.poor {
  background: rgb(from var(--red, #ff3b30) r g b / 0.18);
  color: var(--red, #ff3b30);
  border: 1px solid rgb(from var(--red, #ff3b30) r g b / 0.40);
}
.photo-rec-compare-lbl {
  display: inline-flex; align-items: center; gap: 4px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-mid-color); letter-spacing: 0.3px; cursor: pointer;
  margin-right: 12px;
}
.photo-rec-compare-lbl input[type="checkbox"] {
  cursor: pointer; accent-color: var(--cyan);
}
.photo-rec-compare-status {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.3px; margin-right: 10px;
}

/* Comparison modal */
#photoRecCompareModal {
  display: none; position: fixed; inset: 0; z-index: 960;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoRecCompareModal.open { display: flex; }

/* Session 15 — stamp-on-canvas confirmation prompt */
#photoStampPromptModal {
  display: none; position: fixed; inset: 0; z-index: 970;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoStampPromptModal.open { display: flex; }
.photo-stamp-prompt-body {
  padding: 12px 4px 4px;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color); line-height: 1.6;
}
.photo-stamp-prompt-body p { margin: 0 0 10px; }
.photo-stamp-prompt-body ul { margin: 0; padding-left: 18px; }
.photo-stamp-prompt-body li { margin-bottom: 6px; }
.photo-stamp-prompt-body strong { color: var(--text-light-color); }

/* Session 23 — auto-layout preview modal */
#photoAutoLayoutModal {
  display: none; position: fixed; inset: 0; z-index: 970;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoAutoLayoutModal.open { display: flex; }
.photo-al-body {
  padding: 8px 4px 4px;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color);
}
.photo-al-row {
  display: flex; align-items: baseline; justify-content: space-between;
  padding: 6px 4px;
  border-bottom: 1px solid rgb(from var(--text-light-tint-color) r g b / 0.06);
}
.photo-al-row:last-child { border-bottom: none; }
.photo-al-row span { color: var(--text-mid-color); }
.photo-al-row strong { color: var(--text-light-color); font-weight: 600; }
.photo-al-ok { color: var(--green); }
.photo-al-warn { color: var(--button-color); }

/* Session 23 — palette context menu (right-click / long-press on chip) */
.palette-ctx-menu {
  display: none; position: fixed; z-index: 1000;
  min-width: 220px;
  background: var(--foreground-color);
  border: 1px solid var(--border);
  border-radius: var(--r-sm, 4px);
  box-shadow: 0 4px 12px rgb(from var(--text-light-tint-color) r g b / 0.20);
  padding: 4px 0;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
}
.palette-ctx-menu.open { display: block; }
.palette-ctx-item {
  display: flex; align-items: center; gap: 10px;
  width: 100%; padding: 8px 12px;
  background: transparent; border: none; cursor: pointer;
  color: var(--text-light-color); text-align: left;
  font-family: inherit; font-size: inherit;
}
.palette-ctx-item:hover {
  background: rgb(from var(--text-light-tint-color) r g b / 0.06);
}
.palette-ctx-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px;
  color: var(--button-color);
  font-size: 14px;
}

.photo-rec-compare-body {
  flex: 1; overflow-y: auto; max-height: 60vh;
  border: 1px solid var(--border2); border-radius: var(--r-sm);
  background: var(--foreground-color); margin-bottom: 12px;
}
.photo-rec-cmp-scroll { overflow-x: auto; padding: 8px; }
.photo-rec-cmp-table {
  width: 100%; border-collapse: collapse;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
}
.photo-rec-cmp-table th, .photo-rec-cmp-table td {
  padding: 8px 12px; text-align: left;
  border-bottom: 1px solid var(--border2);
  color: var(--text-light-color);
}
.photo-rec-cmp-table thead th {
  background: var(--midground-color); color: var(--text-mid-color);
  font-weight: 700; letter-spacing: 0.3px;
  border-bottom: 2px solid var(--border);
  vertical-align: top;
}
.photo-rec-cmp-table tbody th {
  font-weight: 500; color: var(--text-dark-color);
  letter-spacing: 0.3px; white-space: nowrap;
}
.photo-rec-cmp-meta {
  display: block; font-weight: 400; font-size: 9px;
  color: var(--text-dark-color); margin-top: 2px;
}
.photo-rec-cmp-best {
  background: rgb(from var(--cyan-tint-color) r g b / 0.12);
  color: var(--cyan); font-weight: 700;
}
.photo-rec-cmp-worst {
  background: rgb(from var(--red, #ff3b30) r g b / 0.10);
  color: var(--text-mid-color);
}
.photo-rec-cmp-section-row td {
  background: var(--midground-color);
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.5px; text-transform: uppercase;
  color: var(--text-dark-color); padding: 6px 12px;
}
.photo-rec-meta {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.3px;
}
.photo-rec-row-est {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-mid-color); letter-spacing: 0.3px;
}
.photo-rec-refining {
  color: var(--accent-photometric); font-style: italic;
}
.photo-rec-row-detail {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-mid-color); letter-spacing: 0.3px;
}
.photo-rec-row-metrics {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.3px; line-height: 1.8;
}
.photo-rec-row-metrics span {
  margin-right: 4px; color: var(--text-mid-color);
}
.photo-rec-row-err {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--red); letter-spacing: 0.3px;
}
.photo-rec-badge {
  display: inline-block; padding: 1px 6px; margin-right: 6px;
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1));
  letter-spacing: 0.4px; line-height: 1.4; border-radius: 3px;
}
.photo-rec-badge.ok {
  background: rgb(from var(--green) r g b / 0.15); color: var(--green);
  border: 1px solid rgb(from var(--green) r g b / 0.3);
}
.photo-rec-badge.fail {
  background: rgb(from var(--red) r g b / 0.15); color: var(--red);
  border: 1px solid rgb(from var(--red) r g b / 0.3);
}
.photo-rec-badge.muted {
  background: var(--foreground-color); color: var(--text-dark-color);
  border: 1px solid var(--border2);
}
.photo-rec-row-footer {
  display: flex; justify-content: flex-end;
}

.photo-rec-footer {
  display: flex; justify-content: flex-end; gap: 8px; margin-top: 8px;
  padding-top: 14px; border-top: 1px solid var(--border);
}

/* ── Fixture editor modal — extras on top of the existing photo-fx-modal-* ── */
.photo-fx-modal-title-row {
  display: flex; justify-content: space-between; align-items: center;
  margin-bottom: 16px;
}
.photo-fx-modal-x {
  background: none; border: none; color: var(--text-dark-color); cursor: pointer;
  font-size: 24px; line-height: 1; padding: 0 8px;
  transition: color var(--dur-fast);
}
.photo-fx-modal-x:hover { color: var(--text-light-color); }

/* Allow grid items to span both columns */
.photo-fx-modal-grid .fg.full { grid-column: 1 / -1; }

/* Section divider headings inside the modal */
.photo-fx-section-title {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  text-transform: uppercase; letter-spacing: 0.8px; color: var(--text-dark-color);
  margin: 4px 0 10px; padding-bottom: 4px;
  border-bottom: 1px solid var(--border);
}
.photo-fx-section-hint {
  text-transform: none; letter-spacing: 0; color: var(--text-dark-color); opacity: 0.7;
  font-weight: normal;
}

/* Required-field marker */
.photo-fx-req { color: var(--accent-photometric); font-weight: 600; }

/* Checkbox row alignment */
.photo-fx-checkbox {
  display: flex; align-items: center; gap: 8px;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color); cursor: pointer;
  text-transform: none; letter-spacing: 0;
}
.photo-fx-checkbox input { width: 14px; height: 14px; cursor: pointer; }

/* Tighter spacing between sections */
.photo-fx-modal-card .photo-fx-modal-grid:not(:last-child) { margin-bottom: 12px; }

/* Optgroup styling for the category select */
.photo-fx-modal-grid select optgroup { background: var(--foreground-color); color: var(--text-dark-color); font-style: normal; }

/* Rotation hints in solve/recommender — small cyan badge */
.photo-solve-rot, .photo-rec-rot {
  display: inline-block; padding: 1px 7px;
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  background: rgb(from var(--cyan-tint-color) r g b / 0.10);
  color: var(--cyan);
  border: 1px solid rgb(from var(--cyan-tint-color) r g b / 0.30);
  border-radius: 3px; letter-spacing: 0.4px;
}

/* ── Mix Solver modal ─────────────────────────────────────────────── */
#photoMixModal {
  display: none; position: fixed; inset: 0; z-index: 950;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoMixModal.open { display: flex; }

/* Per-Zone Targets modal — was missing the overlay CSS, so the modal
   rendered inline at the bottom of the page instead of as a centered
   overlay. JS (photoZonesOpen / photoZonesCancel) was already wired for
   the .open class pattern; this rule completes the contract. */
#photoZonesModal {
  display: none; position: fixed; inset: 0; z-index: 950;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoZonesModal.open { display: flex; }

.photo-mix-box {
  background: var(--midground-color); border: 1px solid var(--border);
  border-radius: 10px; padding: 22px; width: 720px; max-width: 96vw;
  max-height: 92vh; overflow-y: auto;
  box-shadow: 0 12px 48px var(--scrim-medium);
}
.photo-mix-box h3 {
  font-family: var(--mono); font-size: calc(12px * var(--fs, 1));
  font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase;
  color: var(--accent-photometric); margin: 0 0 4px;
}
.photo-mix-sub {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); margin-bottom: 16px; line-height: 1.5;
}

.photo-mix-form {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: 12px; margin-bottom: 12px;
}
.photo-mix-field { display: flex; flex-direction: column; gap: 4px; }
.photo-mix-field.full { grid-column: 1 / -1; }
.photo-mix-field label {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.6px; text-transform: uppercase; color: var(--text-dark-color);
}
.photo-mix-field input,
.photo-mix-field select {
  padding: 7px 10px; background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color); font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
}
.photo-mix-field input:focus,
.photo-mix-field select:focus { outline: none; border-color: var(--accent-photometric); }

.photo-mix-compute-row {
  display: flex; justify-content: flex-end; margin-bottom: 14px;
}

/* Session 12 — N-fixture Mix: extra layers (3+) */
.photo-mix-extra-slots {
  display: flex; flex-direction: column; gap: 10px;
  margin-top: 4px;
}
.photo-mix-extra-slot {
  background: var(--foreground-color);
  border: 1px solid rgb(from var(--cyan-tint-color) r g b / 0.22);
  border-radius: var(--r); padding: 10px 12px;
}
.photo-mix-extra-slot-hdr {
  display: flex; justify-content: space-between; align-items: center;
  margin-bottom: 4px;
}
.photo-mix-extra-slot-label {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.6px; text-transform: uppercase;
  color: var(--cyan);
}
.photo-mix-extra-slot-remove {
  background: none; border: none; color: var(--text-dark-color);
  cursor: pointer; padding: 2px 6px; font-size: 14px;
  line-height: 1; border-radius: 3px;
  transition: color var(--dur-fast), background var(--dur-fast);
}
.photo-mix-extra-slot-remove:hover {
  color: var(--red); background: rgb(from var(--red) r g b / 0.10);
}
.photo-mix-add-layer-row {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 0; margin-top: 4px;
}
.photo-mix-add-hint {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.3px;
  flex: 1; min-width: 0;
}
.photo-mix-secondary {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.2px;
}

#photoMixResults { display: flex; flex-direction: column; gap: 10px; }

.photo-mix-computing,
.photo-mix-error {
  background: rgb(from var(--button-color) r g b / 0.08);
  border: 1px solid rgb(from var(--button-color) r g b / 0.25);
  border-radius: var(--r-sm); padding: 12px 14px;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color); line-height: 1.5;
}
.photo-mix-error { border-color: rgb(from var(--red) r g b / 0.30); color: var(--red); }

.photo-mix-section {
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r); padding: 12px 14px;
}
.photo-mix-section-hdr {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.6px; text-transform: uppercase;
  color: var(--accent-photometric); margin-bottom: 8px;
}
.photo-mix-section-row {
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color); letter-spacing: 0.3px; margin-bottom: 6px;
}
.photo-mix-section-metrics {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.3px;
}
.photo-mix-section-metrics span { margin-right: 6px; color: var(--text-mid-color); }

.photo-mix-combined {
  background: rgb(from var(--accent-photometric) r g b / 0.08);
  border: 1px solid rgb(from var(--accent-photometric) r g b / 0.30);
  border-radius: var(--r); padding: 12px 14px;
}
.photo-mix-combined-hdr {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.7px; text-transform: uppercase;
  color: var(--accent-photometric); margin-bottom: 8px; font-weight: 700;
}
.photo-mix-combined-row {
  display: flex; align-items: baseline; gap: 14px;
  margin-bottom: 6px; flex-wrap: wrap;
}
.photo-mix-big {
  font-family: var(--mono); font-size: calc(16px * var(--fs, 1));
  font-weight: 700; color: var(--text-light-color);
}
.photo-mix-target {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color);
}
.photo-mix-combined-metrics {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.3px;
}
.photo-mix-combined-metrics span { color: var(--text-mid-color); }

.photo-mix-badge {
  display: inline-block; padding: 1px 6px;
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1));
  letter-spacing: 0.4px; line-height: 1.4; border-radius: 3px;
}
.photo-mix-badge.ok {
  background: rgb(from var(--green) r g b / 0.15); color: var(--green);
  border: 1px solid rgb(from var(--green) r g b / 0.3);
}
.photo-mix-badge.fail {
  background: rgb(from var(--red) r g b / 0.15); color: var(--red);
  border: 1px solid rgb(from var(--red) r g b / 0.3);
}
.photo-mix-rot {
  display: inline-block; padding: 1px 6px;
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1));
  background: rgb(from var(--cyan-tint-color) r g b / 0.10);
  color: var(--cyan);
  border: 1px solid rgb(from var(--cyan-tint-color) r g b / 0.30);
  border-radius: 3px; letter-spacing: 0.4px;
}

.photo-mix-footer {
  display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px;
  padding-top: 14px; border-top: 1px solid var(--border);
}

/* ── Pattern B: drag-from-library visuals + intent picker ───────────── */

/* + Use button on each library card */
.photo-fx-btn.use {
  background: rgb(from var(--accent-photometric) r g b / 0.15);
  border: 1px solid rgb(from var(--accent-photometric) r g b / 0.40);
  color: var(--accent-photometric);
  font-family: var(--mono); font-weight: 600;
  padding: 2px 8px; border-radius: 3px; cursor: pointer;
  letter-spacing: 0.4px; font-size: calc(9px * var(--fs, 1));
  transition: background var(--dur-fast);
}
.photo-fx-btn.use:hover {
  background: rgb(from var(--accent-photometric) r g b / 0.28);
}

/* While dragging a library card, dim non-target areas slightly so the
   drop zone is the obvious focal point. */
body.photo-dragging-fixture .photo-fixture-card {
  opacity: 0.7;
}

/* Drop-zone highlight on the assignments card */
.photo-assign-card.photo-drop-target {
  background: rgb(from var(--accent-photometric) r g b / 0.06);
  outline: 2px dashed var(--accent-photometric);
  outline-offset: -4px;
  transition: background var(--dur-fast), outline-color var(--dur-fast);
}
.photo-assign-card.photo-drop-target::before {
  content: 'Drop fixture here to add to room';
  display: block; position: absolute; top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--accent-photometric);
  letter-spacing: 0.6px; text-transform: uppercase; font-weight: 700;
  background: var(--midground-color); padding: 8px 14px;
  border: 1px solid var(--accent-photometric); border-radius: var(--r-sm);
  pointer-events: none; z-index: 5;
}
.photo-assign-card { position: relative; }

/* Intent picker modal */
#photoUseModal {
  display: none; position: fixed; inset: 0; z-index: 950;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoUseModal.open { display: flex; }

.photo-use-box {
  background: var(--midground-color); border: 1px solid var(--border);
  border-radius: 10px; padding: 22px; width: 540px; max-width: 96vw;
  max-height: 92vh; overflow-y: auto;
  box-shadow: 0 12px 48px var(--scrim-medium);
}
.photo-use-hdr {
  display: flex; justify-content: space-between; align-items: flex-start;
  margin-bottom: 14px; gap: 12px;
}
.photo-use-title {
  font-family: var(--sans); font-size: calc(15px * var(--fs, 1));
  font-weight: 700; color: var(--text-light-color); letter-spacing: -0.2px;
}
.photo-use-meta {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); margin-top: 3px; letter-spacing: 0.3px;
}
.photo-use-x {
  background: none; border: none; color: var(--text-dark-color); cursor: pointer;
  font-size: 24px; line-height: 1; padding: 0 8px;
  transition: color var(--dur-fast);
}
.photo-use-x:hover { color: var(--text-light-color); }

.photo-use-existing-note {
  background: rgb(from var(--cyan-tint-color) r g b / 0.08);
  border: 1px solid rgb(from var(--cyan-tint-color) r g b / 0.25);
  border-radius: var(--r-sm); padding: 8px 12px; margin-bottom: 12px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--cyan); line-height: 1.5;
}

.photo-use-prompt {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); margin-bottom: 12px; letter-spacing: 0.5px;
  text-transform: uppercase;
}

.photo-use-options {
  display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px;
}

.photo-use-option {
  display: flex; align-items: stretch; gap: 12px;
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r); padding: 12px 14px;
  cursor: pointer; text-align: left;
  transition: background var(--dur-fast), border-color var(--dur-fast);
  font-family: inherit; color: inherit; width: 100%;
}
.photo-use-option:hover:not(.no-hover) {
  background: var(--foreground-color);
  border-color: var(--accent-photometric);
}
.photo-use-option.no-hover { cursor: default; }
.photo-use-option.primary {
  background: rgb(from var(--accent-photometric) r g b / 0.06);
  border-color: rgb(from var(--accent-photometric) r g b / 0.30);
}
.photo-use-option.primary:hover {
  background: rgb(from var(--accent-photometric) r g b / 0.12);
  border-color: var(--accent-photometric);
}

.photo-use-option-icon {
  flex-shrink: 0; width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--mono); font-size: calc(16px * var(--fs, 1));
  color: var(--accent-photometric);
  background: var(--midground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm);
}
.photo-use-option-body { flex: 1; min-width: 0; }
.photo-use-option-title {
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  font-weight: 700; color: var(--text-light-color);
  letter-spacing: 0.3px; margin-bottom: 3px;
}
.photo-use-option-sub {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-dark-color); line-height: 1.5;
}
.photo-use-option-qty-row {
  display: flex; gap: 8px; align-items: center; margin-top: 4px;
}
.photo-use-qty-input {
  width: 80px; padding: 5px 8px;
  background: var(--midground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color);
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
}
.photo-use-qty-input:focus { outline: none; border-color: var(--accent-photometric); }

.photo-use-footer {
  display: flex; justify-content: flex-end; gap: 8px; margin-top: 8px;
  padding-top: 14px; border-top: 1px solid var(--border);
}

/* ════════════════════════════════════════════════════════════════
   Categorize bulk-edit modal — Library-level "set fixture roles"
   ──────────────────────────────────────────────────────────────── */
#photoCategorizeModal {
  display: none; position: fixed; inset: 0; z-index: 950;
  background: rgb(from var(--text-light-tint-color) r g b / 0.65);
  align-items: center; justify-content: center;
}
#photoCategorizeModal.open { display: flex; }

.photo-cat-box {
  background: var(--midground-color); border: 1px solid var(--border);
  border-radius: 10px; padding: 22px; width: 760px; max-width: 96vw;
  max-height: 92vh; display: flex; flex-direction: column;
  box-shadow: 0 12px 48px var(--scrim-medium);
}
.photo-cat-hdr {
  display: flex; justify-content: space-between; align-items: flex-start;
  margin-bottom: 14px; gap: 12px;
}
.photo-cat-title {
  font-family: var(--sans); font-size: calc(15px * var(--fs, 1));
  font-weight: 700; color: var(--text-light-color); letter-spacing: -0.2px;
}
.photo-cat-meta {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); margin-top: 3px; letter-spacing: 0.3px;
  line-height: 1.5; max-width: 600px;
}
.photo-cat-x {
  background: none; border: none; color: var(--text-dark-color); cursor: pointer;
  font-size: 24px; line-height: 1; padding: 0 8px;
  transition: color var(--dur-fast);
}
.photo-cat-x:hover { color: var(--text-light-color); }

.photo-cat-toolbar {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; margin-bottom: 12px;
  background: var(--foreground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm);
}
.photo-cat-filter {
  display: flex; align-items: center; gap: 6px;
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-mid-color); cursor: pointer;
  letter-spacing: 0.3px;
}
.photo-cat-filter input[type="checkbox"] {
  cursor: pointer;
  accent-color: var(--accent-photometric);
}

.photo-cat-list {
  flex: 1; overflow-y: auto; min-height: 200px; max-height: 50vh;
  border: 1px solid var(--border2); border-radius: var(--r-sm);
  background: var(--foreground-color);
}

.photo-cat-empty {
  padding: 40px 20px; text-align: center;
  font-family: var(--mono); font-size: calc(11px * var(--fs, 1));
  color: var(--text-dark-color); line-height: 1.6;
}

.photo-cat-row {
  display: grid;
  grid-template-columns: minmax(180px, 1.6fr) 130px 70px minmax(220px, 1.4fr);
  gap: 10px; align-items: center;
  padding: 10px 12px;
  border-bottom: 1px solid var(--border2);
  transition: background var(--dur-fast);
}
.photo-cat-row:last-child { border-bottom: none; }
.photo-cat-row:hover { background: var(--foreground-color); }

.photo-cat-row-name {
  display: flex; align-items: center; gap: 8px;
  min-width: 0;
}
.photo-cat-row-icon {
  flex-shrink: 0; width: 22px; height: 22px;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--mono); font-size: calc(13px * var(--fs, 1));
  color: var(--accent-photometric);
  background: var(--midground-color); border: 1px solid var(--border2);
  border-radius: 4px;
}
.photo-cat-row-title {
  font-family: var(--sans); font-size: calc(12px * var(--fs, 1));
  color: var(--text-light-color); font-weight: 500;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  min-width: 0; flex: 1;
}
.photo-cat-row-badge {
  flex-shrink: 0;
  font-family: var(--mono); font-size: calc(8px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.4px;
  padding: 1px 6px; border-radius: 3px;
  background: var(--midground-color); border: 1px solid var(--border2);
  text-transform: uppercase;
}
.photo-cat-row-meta {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color); letter-spacing: 0.2px;
  white-space: nowrap;
}
.photo-cat-row-role {
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  color: var(--text-mid-color); letter-spacing: 0.5px;
  text-transform: uppercase; text-align: center;
  padding: 3px 6px; border-radius: 3px;
  background: rgb(from var(--accent-photometric) r g b / 0.08);
  border: 1px solid rgb(from var(--accent-photometric) r g b / 0.20);
}
.photo-cat-row-select {
  display: flex; align-items: center; gap: 6px; min-width: 0;
}
.photo-cat-row-select select {
  flex: 1; min-width: 0;
  padding: 5px 8px;
  background: var(--midground-color); border: 1px solid var(--border2);
  border-radius: var(--r-sm); color: var(--text-light-color);
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  cursor: pointer;
}
.photo-cat-row-select select:focus {
  outline: none; border-color: var(--accent-photometric);
}
.photo-cat-suggest-btn {
  flex-shrink: 0;
  background: rgb(from var(--cyan-tint-color) r g b / 0.10);
  border: 1px solid rgb(from var(--cyan-tint-color) r g b / 0.30);
  color: var(--cyan); cursor: pointer;
  padding: 4px 8px; border-radius: var(--r-sm);
  font-family: var(--mono); font-size: calc(9px * var(--fs, 1));
  letter-spacing: 0.3px;
  white-space: nowrap;
  max-width: 120px; overflow: hidden; text-overflow: ellipsis;
  transition: background var(--dur-fast), border-color var(--dur-fast);
}
.photo-cat-suggest-btn:hover {
  background: rgb(from var(--cyan-tint-color) r g b / 0.20);
  border-color: var(--cyan);
}

.photo-cat-footer {
  display: flex; align-items: center; gap: 8px; margin-top: 12px;
  padding-top: 14px; border-top: 1px solid var(--border);
}
.photo-cat-status {
  font-family: var(--mono); font-size: calc(10px * var(--fs, 1));
  color: var(--cyan); letter-spacing: 0.3px;
  min-height: 14px;
}

/* ═══════════════════════════════════════════════════════════════
   ENERGY MODELING — Session 25a
   Lives in the Budget tab, below EC Wiring Estimates.
   Visual pattern mirrors the EC Wiring Estimates Unit Rates box.
   ═══════════════════════════════════════════════════════════════ */
.em-bignums {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  margin: 12px 0 16px;
}
.em-bignum {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  padding: 12px 14px;
}
.em-bignum-label {
  font-family: var(--mono);
  font-size: calc(9px * var(--fs, 1));
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--text-dark-color);
  margin-bottom: 4px;
}
.em-bignum-value {
  font-family: var(--mono);
  font-size: calc(18px * var(--fs, 1));
  font-weight: 600;
  color: var(--button-color);
}

.em-inputs {
  display: flex; flex-wrap: wrap; gap: 10px;
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  padding: 12px 14px;
  margin-bottom: 16px;
}
.em-inputs label.u-stack-meta { min-width: 110px; }
.em-auto {
  font-family: var(--sans);
  font-size: calc(9px * var(--fs, 1));
  font-weight: normal;
  text-transform: none;
  letter-spacing: 0;
  color: var(--cyan);
  margin-left: 4px;
}

.em-zone-table-wrap { margin-top: 8px; }
.em-zone-header {
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--text-dark-color);
  padding: 8px 0 6px;
}
.em-table {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
}
.em-table thead th.em-th {
  background: var(--midground-color);
  color: var(--text-dark-color);
  text-align: left;
  padding: 8px 10px;
  font-weight: 600;
  font-size: calc(9px * var(--fs, 1));
  text-transform: uppercase;
  letter-spacing: 1px;
  border-bottom: 1px solid var(--border2);
  cursor: pointer;
  user-select: none;
  transition: color var(--dur-fast);
}
.em-table thead th.em-th:hover { color: var(--text-light-color); }
.em-table thead th.em-th-active { color: var(--button-color); }
.em-table tbody td {
  padding: 6px 10px;
  border-bottom: 1px solid var(--border);
  color: var(--text-light-color);
}
.em-table tbody tr:last-child td { border-bottom: none; }

@media (max-width: 700px) {
  .em-bignums { grid-template-columns: repeat(2, 1fr); }
}

/* ── Baseline comparison block (session 25b) ───────────────── */
.em-baseline {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  padding: 14px 16px;
  margin: 8px 0 16px;
}
.em-baseline-header {
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--button-color);
  margin-bottom: 10px;
}
.em-baseline-method {
  font-family: var(--sans);
  font-size: calc(9px * var(--fs, 1));
  font-weight: normal;
  text-transform: none;
  letter-spacing: 0;
  color: var(--text-dark-color);
  margin-left: 6px;
}
.em-baseline-grid {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.em-baseline-row {
  display: grid;
  grid-template-columns: 1fr 1fr 2fr;
  align-items: baseline;
  gap: 12px;
  padding: 4px 0;
}
.em-baseline-row-emph {
  border-top: 1px solid var(--border);
  padding-top: 10px;
  margin-top: 4px;
}
.em-baseline-label {
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color);
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.em-baseline-value {
  font-family: var(--mono);
  font-size: calc(14px * var(--fs, 1));
  font-weight: 600;
  color: var(--text-light-color);
}
.em-baseline-aux {
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color);
}
.em-savings-pos { color: var(--cyan, #24A8E6); }
.em-savings-neg { color: var(--button-color); }
.em-baseline-warn {
  margin-top: 10px;
  padding: 8px 10px;
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color);
  background: var(--midground-color);
  border-radius: var(--r);
}
.em-baseline-unavailable .em-baseline-body {
  font-family: var(--sans);
  font-size: calc(12px * var(--fs, 1));
  color: var(--text-mid-color);
  line-height: 1.5;
}

@media (max-width: 700px) {
  .em-baseline-row {
    grid-template-columns: 1fr;
    gap: 2px;
  }
}

/* ── Demand block (session 25c) ─────────────────────────────── */
.em-demand {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  padding: 14px 16px;
  margin: 0 0 16px;
}
.em-demand-header {
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--button-color);
  margin-bottom: 10px;
}
.em-demand-rate {
  font-family: var(--sans);
  font-size: calc(9px * var(--fs, 1));
  font-weight: normal;
  text-transform: none;
  letter-spacing: 0;
  color: var(--text-dark-color);
  margin-left: 6px;
}
.em-input-hint {
  font-family: var(--sans);
  font-size: calc(9px * var(--fs, 1));
  font-weight: normal;
  color: var(--text-dark-color);
  margin-left: 4px;
}

.em-methodology {
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid var(--border);
}
.em-methodology > summary {
  cursor: pointer;
  font-family: var(--mono);
  font-size: calc(10px * var(--fs, 1));
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--text-dark-color);
  outline: none;
  user-select: none;
}
.em-methodology > summary::-webkit-details-marker { color: var(--text-dark-color); }
.em-methodology[open] > summary { color: var(--text-light-color); margin-bottom: 8px; }
.em-methodology-body {
  font-family: var(--sans);
  font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color);
  line-height: 1.5;
}
.em-methodology-body p { margin: 6px 0; }
.em-methodology-body ul { margin: 6px 0 6px 22px; padding: 0; }
.em-methodology-body li { margin: 2px 0; }
.em-methodology-disclaimer {
  font-size: calc(10px * var(--fs, 1));
  color: var(--text-dark-color);
  font-style: italic;
}

/* ── Carbon footprint block (session 25d) ────────────────────── */
.em-carbon {
  background: var(--foreground-color);
  border: 1px solid var(--border2);
  border-radius: var(--r);
  padding: 14px 16px;
  margin: 0 0 16px;
}
.em-carbon-header {
  font-family: var(--mono);
  font-size: calc(11px * var(--fs, 1));
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--button-color);
  margin-bottom: 12px;
}
.em-carbon-region {
  font-family: var(--sans);
  font-size: calc(9px * var(--fs, 1));
  font-weight: normal;
  text-transform: none;
  letter-spacing: 0;
  color: var(--text-dark-color);
  margin-left: 6px;
}
.em-carbon-controls {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
  align-items: end;
}
.em-carbon-controls select {
  width: 100%;
  min-width: 200px;
}
.em-carbon-factor {
  padding: 8px 10px;
  background: var(--midground-color);
  border-radius: var(--r);
}
.em-carbon-factor-label {
  font-family: var(--mono);
  font-size: calc(9px * var(--fs, 1));
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--text-dark-color);
}
.em-carbon-factor-value {
  font-family: var(--mono);
  font-size: calc(13px * var(--fs, 1));
  color: var(--text-light-color);
  margin-top: 2px;
}
.em-carbon-factor-sub {
  color: var(--text-dark-color);
  font-size: calc(10px * var(--fs, 1));
}

.em-carbon-equiv {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-top: 12px;
}
.em-carbon-equiv-item {
  background: var(--midground-color);
  border-radius: var(--r);
  padding: 12px 14px;
  text-align: left;
}
.em-carbon-equiv-num {
  font-family: var(--mono);
  font-size: calc(20px * var(--fs, 1));
  font-weight: 600;
  color: var(--cyan, #24A8E6);
}
.em-carbon-equiv-label {
  font-family: var(--sans);
  font-size: calc(11px * var(--fs, 1));
  color: var(--text-mid-color);
  margin-top: 4px;
  line-height: 1.4;
}

@media (max-width: 700px) {
  .em-carbon-controls { grid-template-columns: 1fr; }
  .em-carbon-equiv { grid-template-columns: 1fr; }
}
