/* SplitWatt styles — extracted from index.html.
   Plain CSS, no build step: index.html links this directly. */

  @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');

  /* ════════════════════════════════════════════════════════════════════════
     SplitWatt semantic colour system
     ════════════════════════════════════════════════════════════════════════
     LIGHT IS THE DEFAULT and lives on :root, so an unclassed <body> renders
     light — the theme most people see needs no class and cannot flash.
     Dark is opt-in via body.dark-mode.

     Only semantic names are used in new code. The legacy aliases at the foot
     of each block keep the ~250 existing var(--bg) / var(--text2) call sites
     working, so this is a rename, not a rewrite.

     Three values differ from the supplied palette. Each failed the brief's own
     AA bar and was corrected by the smallest in-hue step that clears it:
       --text-muted    #718295 -> #5F7185   (3.94:1 -> 5.02:1 on surface)
       --border-strong #AABBC8 -> #8496A6   (1.97:1 -> 3.05:1; it is the
                                             INPUT border, so 1.4.11 applies)
       dark button ink white   -> #04222A   (2.42:1 -> 6.84:1 on --brand;
                                             the brief allows a dark ink here)
     --border stays at 1.34:1 deliberately: it is a decorative hairline between
     rows, never a control boundary. Anything a user operates uses
     --border-strong. */
  :root {
    --background:     #F7F9FC;
    --surface:        #FFFFFF;
    --surface-muted:  #F1F5F9;
    --surface-hover:  #E8F1F4;

    --border:         #D7E0E8;   /* decorative separators only */
    --border-strong:  #8496A6;   /* every control boundary — 3.05:1 on surface */

    --text-primary:   #17212B;
    --text-secondary: #526474;
    --text-muted:     #5F7185;   /* hint text — still AA, 5.02:1 */

    --brand:          #007C91;
    --brand-hover:    #00697B;
    --brand-soft:     #E1F3F5;
    --brand-text:     #005B6B;
    --brand-ink:      #FFFFFF;   /* text ON --brand: 4.89:1 */
    --brand-rgb:      0,124,145;

    --info:           #2563A8;   --info-soft:    #E7F0FF;
    --success:        #137A4B;   --success-soft: #E7F6ED;
    --warning:        #A85A00;   --warning-soft: #FFF3DB;
    --danger:         #C3374A;   --danger-soft:  #FCEAEC;

    --focus-ring:     #0B8AA0;
    --focus-shadow:   0 0 0 3px rgba(11,138,160,0.16);

    /* ── legacy aliases ──────────────────────────────────────────────────
       Repeated verbatim in body.dark-mode, and that repetition is load-bearing.
       A custom property whose value is var(...) is substituted where it is
       DECLARED, so `--bg: var(--background)` on :root computes to the light
       hex there and then inherits that literal into every element — including
       under .dark-mode. Declaring the aliases again inside the dark block lets
       them resolve against the dark values instead. Do not "de-duplicate". */
    --bg: var(--background);
    --surface2: var(--surface-muted);
    --surface3: var(--surface-hover);
    --border2: var(--border-strong);
    --field-border: var(--border-strong);
    --text: var(--text-primary);
    --text2: var(--text-secondary);
    --text3: var(--text-muted);
    --accent: var(--brand);
    --accent2: var(--brand-hover);
    --accent-rgb: var(--brand-rgb);
    --ink: var(--brand-ink);
    --green: var(--success);
    --red: var(--danger);
    --warn: var(--warning);
    --yellow: var(--warning);
    --gold: var(--warning);
    --orange: var(--warning);
    --pink: var(--danger);
    --muted: var(--text-secondary);
    --paper: var(--background);
    --warm: var(--surface-muted);

    --r-sm: 12px;
    --r-md: 22px;
    --r-lg: 28px;
    --r-xl: 36px;

    /* Borders separate first; shadow is reserved for things that float. */
    --shadow-card:  0 1px 2px rgba(23,33,43,0.04), 0 2px 8px rgba(23,33,43,0.06);
    --shadow-float: 0 8px 28px rgba(23,33,43,0.14), 0 2px 8px rgba(23,33,43,0.08);
    --shadow-glow:  0 0 0 3px rgba(var(--brand-rgb),0.14);
  }

  /* ── DARK ─────────────────────────────────────────────────────────────── */
  body.dark-mode {
    --background:     #101820;
    --surface:        #17232D;
    --surface-muted:  #1F303B;
    --surface-hover:  #29404C;

    --border:         #344A57;
    --border-strong:  #587180;   /* 3.11:1 on surface */

    --text-primary:   #F3F7FA;
    --text-secondary: #B9C8D1;
    --text-muted:     #8DA2AE;

    --brand:          #27B7C5;
    --brand-hover:    #54CAD4;
    --brand-soft:     #163F49;
    --brand-text:     #83E4EB;
    --brand-ink:      #04222A;   /* white on this brand is 2.42:1; this is 6.84:1 */
    --brand-rgb:      39,183,197;

    --info:           #73B7FF;   --info-soft:    #1C3656;
    --success:        #4ED08D;   --success-soft: #153F31;
    --warning:        #FFB454;   --warning-soft: #4B3216;
    --danger:         #FF7B8C;   --danger-soft:  #4A202A;

    --focus-ring:     #5AD7E2;
    --focus-shadow:   0 0 0 3px rgba(90,215,226,0.24);

    --bg: var(--background);
    --surface2: var(--surface-muted);
    --surface3: var(--surface-hover);
    --border2: var(--border-strong);
    --field-border: var(--border-strong);
    --text: var(--text-primary);
    --text2: var(--text-secondary);
    --text3: var(--text-muted);
    --accent: var(--brand);
    --accent2: var(--brand-hover);
    --accent-rgb: var(--brand-rgb);
    --ink: var(--brand-ink);
    --green: var(--success);
    --red: var(--danger);
    --warn: var(--warning);
    --yellow: var(--warning);
    --gold: var(--warning);
    --orange: var(--warning);
    --pink: var(--danger);
    --muted: var(--text-secondary);
    --paper: var(--background);
    --warm: var(--surface-muted);

    --shadow-card:  0 1px 2px rgba(0,0,0,0.40), 0 2px 10px rgba(0,0,0,0.30);
    --shadow-float: 0 10px 32px rgba(0,0,0,0.55), 0 2px 8px rgba(0,0,0,0.35);
  }

  /* The texture overlay is barely-there on light, a touch stronger on dark. */
  body::before { opacity: 0.015; }
  body.dark-mode::before { opacity: 0.03; }

  /* These used to need a light-mode override each. Now that the tokens carry
     the theme, one token-driven rule serves both. */
  .sidebar {
    background: var(--surface);
    border-right-color: var(--border);
  }

  .topbar {
    background: var(--surface);
    border-bottom-color: var(--border);
  }

  .landing, .landing-hero { background: var(--background); }

  .modal-overlay, #ocr-modal-overlay { background: rgba(16,24,32,0.55); }
  body.dark-mode .modal-overlay,
  body.dark-mode #ocr-modal-overlay { background: rgba(0,0,0,0.68); }

  /* ── Active navigation ──────────────────────────────────────────────────
     Was a large pale rounded rectangle with low-contrast text. Now: a soft
     brand tint, brand-coloured label, and a 3px left accent bar — so the
     active item is marked by POSITION and a bar as well as by colour. */
  .nav-item.active {
    background: var(--brand-soft);
    color: var(--brand-text);
    border-color: transparent;
    border-left: 3px solid var(--brand);
    border-radius: 0 var(--r-sm) var(--r-sm) 0;
    font-weight: 600;
  }
  .nav-item.active .nav-icon { color: var(--brand-text); opacity: 1; }

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

  body {
    font-family: 'Plus Jakarta Sans', sans-serif;
    background: var(--bg);
    color: var(--text);
    height: 100vh;
    height: 100svh;
    overflow: hidden;
    display: flex;
    flex-direction: column;
  }

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

  /* NOTE: No z-index here. Setting z-index on .app-shell creates a stacking context that traps
     the sidebar's z-index:300 inside it, causing the .sidebar-overlay (which lives OUTSIDE
     .app-shell at z:299) to paint on top of the sidebar on mobile — making the sidebar look
     visible through the semi-transparent overlay but unclickable (every tap hits the overlay). */
  .app-shell { display:flex; flex:1; height:100vh; height:100svh; overflow:hidden; position:relative; }

  /* ── SIDEBAR ─────────────────────────────────────────── */
  .sidebar {
    width: 240px;
    flex-shrink: 0;
    background: var(--surface);
    border-right: 1px solid var(--border);
    display: flex;
    flex-direction: column;
    position: fixed;
    top:0; left:0; bottom:0;
    z-index: 100;
    transition: transform 0.28s cubic-bezier(0.4,0,0.2,1);
    overflow-y: auto;
  }

  .sidebar-logo {
    padding: 26px 20px 22px;
    border-bottom: 1px solid var(--border);
    flex-shrink: 0;
  }
  .sidebar-logo h1 {
    font-family: 'Space Grotesk', sans-serif;
    font-size: 22px;
    font-weight: 700;
    color: var(--text);
    letter-spacing: -0.5px;
    line-height: 1;
  }
  .sidebar-logo h1 span { color: var(--accent); }
  .sidebar-logo p {
    font-size: 9px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--text3);
    text-transform: uppercase;
    letter-spacing: 2.5px;
    margin-top: 5px;
  }

  .sidebar-section-label {
    font-size: 9px;
    font-family: 'JetBrains Mono', monospace;
    text-transform: uppercase;
    letter-spacing: 2px;
    color: var(--text3);
    padding: 22px 20px 6px;
  }

  .nav-item {
    display: flex;
    align-items: center;
    gap: 11px;
    padding: 10px 14px;
    margin: 2px 8px;
    cursor: pointer;
    border: none;
    background: none;
    width: calc(100% - 16px);
    text-align: left;
    color: var(--text2);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 13.5px;
    font-weight: 500;
    border-radius: var(--r-sm);
    transition: all 0.16s ease;
    border: 1px solid transparent;
  }
  .nav-item:hover {
    background: var(--surface2);
    color: var(--text);
  }
  .nav-item.active {
    /* iOS-style: white pill with dark text for the active tab — high-contrast,
       reads as a real "you are here" affordance. */
    background: #ffffff;
    color: #1a1c1c;
    border-color: #ffffff;
    font-weight: 700;
    box-shadow: 0 2px 12px rgba(0,0,0,0.25);
  }
  .nav-item .nav-badge {
    margin-left: auto;
    background: var(--accent);
    color: var(--ink);
    font-size: 10px;
    font-family: 'JetBrains Mono', monospace;
    font-weight: 700;
    padding: 2px 7px;
    border-radius: 20px;
    min-width: 20px;
    text-align: center;
  }
  .nav-item.active .nav-badge { background:#1a1c1c; color:#ffffff; }
  .nav-icon {
    width: 18px; height: 18px;
    flex-shrink: 0;
    display: flex; align-items: center; justify-content: center;
    opacity: 0.35;
    transition: opacity 0.16s;
  }
  .nav-item.active .nav-icon { opacity: 1; color: #1a1c1c; }
  .nav-item:hover .nav-icon { opacity: 0.7; }
  .nav-icon svg { display: block; }

  .sidebar-footer {
    margin-top: auto;
    padding: 14px 18px;
    border-top: 1px solid var(--border);
    font-size: 10px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--text3);
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .sidebar-footer .save-dot {
    width: 6px; height: 6px;
    border-radius: 50%;
    background: var(--green);
    flex-shrink: 0;
    animation: pulse 2.5s infinite;
    box-shadow: 0 0 8px rgba(52,211,153,0.7);
  }
  @keyframes pulse { 0%,100%{opacity:1;} 50%{opacity:0.25;} }

  /* ── MICRO-ANIMATIONS ────────────────────────────────────── */
  /* 1. Bill scan: line sweeps up/down over document */
  @keyframes scan-sweep {
    0%, 100% { transform: translateY(0px); }
    50%       { transform: translateY(50px); }
  }
  @keyframes scan-glow {
    0%, 100% { opacity: 0.13; }
    50%       { opacity: 0.05; }
  }
  .ocr-scan-line { animation: scan-sweep 1.8s ease-in-out infinite; }
  .ocr-scan-glow { animation: scan-sweep 1.8s ease-in-out infinite, scan-glow 1.8s ease-in-out infinite; }

  /* 2. Animated SVG checkmark (draw-on effect) */
  @keyframes draw-circle { to { stroke-dashoffset: 0; } }
  @keyframes draw-check  { to { stroke-dashoffset: 0; } }
  .anim-circle {
    stroke-dasharray: 75.4;
    stroke-dashoffset: 75.4;
    animation: draw-circle 0.45s cubic-bezier(0.4,0,0.2,1) forwards;
  }
  .anim-check {
    stroke-dasharray: 22;
    stroke-dashoffset: 22;
    animation: draw-check 0.3s cubic-bezier(0.4,0,0.2,1) 0.4s forwards;
  }

  /* 3. Results section pop-in when calculation completes */
  @keyframes results-pop {
    0%   { opacity: 0; transform: translateY(22px) scale(0.97); }
    65%  { transform: translateY(-5px) scale(1.012); }
    100% { opacity: 1; transform: translateY(0) scale(1); }
  }
  .results-animate {
    animation: results-pop 0.55s cubic-bezier(0.34, 1.56, 0.64, 1) both;
  }

  /* ── MAIN CONTENT ─────────────────────────────────────── */
  .main-content {
    margin-left: 240px;
    flex: 1;
    height: 100vh;
    height: 100svh;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    background: var(--bg);
  }

  .topbar {
    background: var(--surface);
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    border-bottom: 1px solid var(--border);
    padding: 14px 28px;
    display: flex;
    align-items: center;
    gap: 14px;
    position: sticky;
    top: 0;
    z-index: 50;
  }
  .topbar-title {
    font-family: 'Space Grotesk', sans-serif;
    font-size: 18px;
    font-weight: 600;
    color: var(--text);
    letter-spacing: -0.3px;
  }
  .topbar-sub {
    font-size: 11px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--text3);
    margin-left: auto;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 180px;
  }
  .hamburger { display:none; background:none; border:none; cursor:pointer; padding:4px; color:var(--text); font-size:20px; }

  .page-content { padding: 28px 28px 60px; flex:1; min-height:0; }
  .tab-panel { display:none !important; }
  .tab-panel.active { display:block !important; }

  .sidebar-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.55);
    z-index: 99;
    pointer-events: none;
    /* Must be BELOW sidebar z-index:100 so overlay never intercepts sidebar clicks */
    /* NO backdrop-filter — causes black compositing layer on iOS Safari */
  }
  .sidebar-overlay.open {
    display: block;
    pointer-events: auto;
  }

  @media(max-width:768px) {
    .sidebar {
      transform: translateX(-260px); /* fully off-screen */
      z-index: 300;
      will-change: transform;
      -webkit-transform: translateX(-260px);
    }
    .sidebar.open {
      transform: translateX(0);
      -webkit-transform: translateX(0);
    }
    /* Overlay sits between main content and sidebar — below sidebar so sidebar is tappable */
    .sidebar-overlay { z-index: 299; }
    .main-content {
      margin-left: 0;
      height: 100vh;
      height: 100svh;
      overflow-y: auto;
      }
    .hamburger { display: flex; align-items: center; justify-content: center; }
    .topbar { padding: 12px 16px; }
    .page-content {
      padding: 16px 14px 40px;
      /* Mobile bottom tab bar was removed — only need space for home-indicator safe area */
      padding-bottom: max(40px, calc(24px + env(safe-area-inset-bottom)));
      min-height: 0;
    }
  }

  /* ── CARDS ────────────────────────────────────────────── */
  .card {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    padding: 26px 28px;        /* generous iOS-style breathing room */
    margin-bottom: 18px;
    box-shadow: var(--shadow-card);
  }
  .card-title {
    font-family: 'Space Grotesk', sans-serif;
    font-size: 16px;
    font-weight: 600;
    color: var(--text);
    margin-bottom: 18px;
    padding-bottom: 14px;
    border-bottom: 1px solid var(--border2);
    display: flex;
    align-items: center;
    gap: 10px;
    letter-spacing: -0.2px;
  }
  .card-title .icon {
    width: 30px; height: 30px;
    border-radius: var(--r-sm);
    display: flex; align-items: center; justify-content: center;
    font-size: 14px;
    flex-shrink: 0;
  }

  /* ── FORMS ────────────────────────────────────────────── */
  .form-row { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:14px; }
  .form-row.three { grid-template-columns:1fr 1fr 1fr; }
  .form-row.single { grid-template-columns:1fr; }

  label {
    display: block;
    font-size: 10px;
    font-family: 'JetBrains Mono', monospace;
    text-transform: uppercase;
    letter-spacing: 1.2px;
    color: var(--text3);
    margin-bottom: 6px;
  }

  input[type="text"], input[type="number"], input[type="date"], select, textarea {
    width: 100%;
    padding: 10px 13px;
    border: 1px solid var(--field-border);
    border-radius: var(--r-sm);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 14px;
    background: var(--surface2);
    color: var(--text);
    transition: border-color 0.18s, box-shadow 0.18s;
    outline: none;
    appearance: none;
    -webkit-appearance: none;
  }
  input::placeholder { color: var(--text3); }
  /* The print header is injected for PDF rendering only — hide it on screen. */
  .print-header { display: none; }
  @media print { .print-header { display: block; } }
  /* Dim the literal "yyyy-mm-dd" / "mm/dd/yyyy" hint that browsers stamp into
     empty native date inputs — it reads as broken text otherwise. */
  input[type="date"]:not(.has-value)::-webkit-datetime-edit-text,
  input[type="date"]:not(.has-value)::-webkit-datetime-edit-year-field,
  input[type="date"]:not(.has-value)::-webkit-datetime-edit-month-field,
  input[type="date"]:not(.has-value)::-webkit-datetime-edit-day-field {
    color: var(--text3);
    opacity: 0.75;
  }
  input[type="date"].has-value::-webkit-datetime-edit-text,
  input[type="date"].has-value::-webkit-datetime-edit-year-field,
  input[type="date"].has-value::-webkit-datetime-edit-month-field,
  input[type="date"].has-value::-webkit-datetime-edit-day-field {
    color: var(--text);
    opacity: 1;
  }
  input:focus, select:focus {
    border-color: var(--accent);
    box-shadow: 0 0 0 3px rgba(var(--accent-rgb),0.20);
  }
  select option { background: var(--surface2); color: var(--text); }

  .input-prefix { position:relative; }
  .input-prefix span { position:absolute; left:13px; top:50%; transform:translateY(-50%); font-family:'JetBrains Mono',monospace; color:var(--text3); font-size:13px; pointer-events:none; }
  .input-prefix input { padding-left:28px; }

  /* ── BUTTONS ──────────────────────────────────────────── */
  /* ── SPLIT MODE BUTTONS ─────────────────────────────── */
  .split-mode {
    display: inline-flex;
    gap: 4px;
    background: var(--surface2);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 3px;
    margin-bottom: 8px;
  }
  .split-mode button {
    padding: 5px 11px;
    font-size: 11px;
    font-weight: 600;
    font-family: 'JetBrains Mono', monospace;
    color: var(--text3);
    background: transparent;
    border: 1px solid transparent;
    border-radius: 6px;
    cursor: pointer;
    transition: all 0.15s;
    min-height: 32px;
    min-width: 36px;
    letter-spacing: 0.3px;
    -webkit-tap-highlight-color: transparent;
    touch-action: manipulation;
    user-select: none;
    -webkit-user-select: none;
  }
  .split-mode button:hover {
    color: var(--text);
    background: var(--surface3);
  }
  .split-mode button.active {
    /* Active toggle = white pill on charcoal (iOS segmented control look) */
    background: #ffffff;
    border-color: #ffffff;
    color: #1a1c1c;
    font-weight: 700;
    box-shadow: 0 2px 8px rgba(0,0,0,0.25);
  }
  /* None/excluded button gets a red tint when active */
  .split-mode button:last-child.active {
    border-color: rgba(255,100,100,0.4);
    color: #ff6464;
    box-shadow: none;
  }
  @media(max-width:768px) {
    .split-mode { width: 100%; justify-content: stretch; }
    .split-mode button { flex: 1; min-height: 38px; font-size: 12px; }
  }

  /* ── NOTE INPUT ──────────────────────────────────────── */
  .note-input-field {
    width: 100%;
    border: none;
    border-bottom: 1.5px solid var(--border);
    background: transparent;
    font-size: 13px;
    color: var(--text2);
    font-family: 'DM Sans', sans-serif;
    padding: 4px 2px 6px;
    outline: none;
    transition: border-color 0.2s, color 0.2s;
  }
  .note-input-field::placeholder {
    color: var(--text3);
  }
  .note-input-field:focus {
    border-bottom-color: var(--accent);
    color: var(--text);
  }

  .calc-btn-wrapper { text-align:center; margin:28px 0 32px; }
  .calc-btn-main { font-size:15px; }

  .btn {
    padding: 10px 20px;
    border-radius: var(--r-sm);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    border: none;
    transition: all 0.18s;
    display: inline-flex;
    align-items: center;
    gap: 7px;
    letter-spacing: 0.1px;
  }
  .btn-primary {
    background: var(--accent);
    color: var(--ink);
    box-shadow: 0 3px 14px rgba(var(--accent-rgb),0.25);
  }
  .btn-primary:hover { background: var(--accent2); color: var(--ink); box-shadow: 0 5px 20px rgba(var(--accent-rgb),0.40); transform:translateY(-1px); }
  .btn-secondary {
    background: var(--surface2);
    color: var(--text2);
    border: 1px solid var(--border2);
  }
  .btn-secondary:hover { background:var(--surface3); color:var(--text); border-color:var(--border2); }
  /* Hero "Calculate Split" — white iOS pill, the highest-contrast surface in the app.
     Reads as "this is THE action" without any colour competing for attention. */
  .btn-success {
    background: #ffffff;
    color: #1a1c1c;
    font-weight: 700;
    box-shadow: 0 6px 28px rgba(0,0,0,0.35), 0 1px 2px rgba(0,0,0,0.4);
    padding: 14px 44px;
    font-size: 15px;
    border-radius: var(--r-lg);
    letter-spacing: 0.2px;
  }
  .btn-success:hover { transform:translateY(-2px); box-shadow:0 10px 36px rgba(0,0,0,0.45), 0 1px 2px rgba(0,0,0,0.4); filter:brightness(1.02); }
  .btn-ghost {
    background: none;
    color: var(--accent);
    border: 1px solid rgba(var(--accent-rgb),0.30);
    font-size: 12px;
    padding: 7px 13px;
    border-radius: var(--r-sm);
  }
  .btn-ghost:hover { background:rgba(var(--accent-rgb),0.10); border-color:rgba(var(--accent-rgb),0.50); }

  .actions-row { display:flex; gap:10px; flex-wrap:wrap; }
  .remove-btn {
    background: none; border: 1px solid var(--border2); border-radius:6px;
    color:var(--text3); cursor:pointer; font-size:12px; padding:4px 9px;
    font-family:'JetBrains Mono',monospace; transition:all 0.15s;
  }
  .remove-btn:hover { border-color:var(--red); color:var(--red); background:rgba(255,77,109,0.08); }
  .invite-btn {
    background: none; border: 1px solid var(--border2); border-radius:6px;
    color:var(--text3); cursor:pointer; font-size:12px; padding:4px 9px;
    font-family:'JetBrains Mono',monospace; transition:all 0.15s;
  }
  .invite-btn:hover { border-color:var(--accent); color:var(--accent); background:rgba(var(--accent-rgb),0.08); }

  /* ── UTILITY ROWS ─────────────────────────────────────── */
  .utility-row {
    display: grid;
    grid-template-columns: 200px 160px 1fr;
    gap: 10px;
    align-items: start;
    padding: 16px 18px;
    background: var(--surface2);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    margin-bottom: 12px;
    transition: all 0.15s;
  }
  .utility-row:hover { border-color:var(--border2); box-shadow:0 4px 20px rgba(0,0,0,0.35); }

  /* util-name: flex row holding dot + icon + select */
  .util-name {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: nowrap;
    min-width: 0;
  }
  .util-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    flex-shrink: 0;
  }

  /* Mobile utility row — stack vertically */
  @media(max-width:768px) {
    .utility-row {
      grid-template-columns: 1fr !important;
      padding: 12px 14px;
    }
    .util-name {
      flex-wrap: wrap;
      gap: 6px;
    }
    .util-name select {
      max-width: 100% !important;
      width: 100%;
      font-size: 15px !important;
    }
  }

  /* ── SPLIT BUTTONS ────────────────────────────────────── */
  .split-btns { display:flex; gap:4px; }
  .split-btn {
    flex:1; padding:7px 5px; font-size:10.5px; font-family:'JetBrains Mono',monospace;
    border: 1px solid var(--border2); border-radius:6px; cursor:pointer;
    background:var(--surface2); color:var(--text3); transition:all 0.15s; text-align:center;
  }
  .split-btn.active { background:var(--accent); color:var(--ink); border-color:var(--accent); box-shadow:0 2px 8px rgba(var(--accent-rgb),0.4); }

  /* ── RESULT CARDS ─────────────────────────────────────── */
  .results-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:12px; margin-bottom:20px; }

  .result-card {
    border: 1px solid var(--border2);
    border-left-width: 4px;             /* overridden inline with tenant colour */
    border-radius: var(--r-md);
    overflow: hidden;
    box-shadow: var(--shadow-card);
    transition: all 0.22s;
    background: var(--surface2);        /* sits clearly above page bg */
  }
  .result-card:hover { transform:translateY(-2px); box-shadow:var(--shadow-float); }
  .result-card-header {
    padding: 13px 16px 11px;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 11px;
    font-weight: 700;
    display: flex;
    align-items: center;
    gap: 8px;
    text-transform: uppercase;
    letter-spacing: 1px;
    background: transparent;            /* no muddy tint — bg comes from card */
    border-bottom: 1px solid var(--border);
  }
  .result-card-body { padding:22px 20px 16px; background: transparent; }
  /* Money is the hero — DM Serif Display gives totals real weight and personality. */
  .result-amount { font-family:'DM Serif Display',serif !important; font-size:44px; font-weight:400; line-height:1; margin-bottom:8px; letter-spacing:-1px; }
  .result-label { font-size:10.5px; color:var(--text3); font-family:'JetBrains Mono',monospace !important; text-transform:uppercase; letter-spacing:1.2px; }

  /* ── SUMMARY BANNER ───────────────────────────────────── */
  .summary-banner {
    background: var(--surface2);
    border: 1px solid var(--border2);
    border-top: 3px solid var(--accent);   /* strong top accent — anchors the section */
    border-radius: var(--r-lg);
    padding: 22px 28px;
    margin-bottom: 20px;
    display: flex;
    align-items: center;
    gap: 0;
    flex-wrap: wrap;
    box-shadow: var(--shadow-card);
    position: relative;
    overflow: hidden;
  }
  .summary-banner::before {
    content:'';
    position:absolute; inset:0;
    background: radial-gradient(ellipse at 0% 0%, rgba(var(--accent-rgb),0.10) 0%, transparent 55%),
                radial-gradient(ellipse at 100% 100%, rgba(var(--accent-rgb),0.05) 0%, transparent 50%);
    pointer-events:none;
  }
  /* :not(.divider) — this rule outranks .divider's own `padding:0` on
     specificity, so without it the 1px rule renders as a 57px block. */
  .summary-banner > div:not(.divider) { padding: 6px 28px; position:relative; z-index:1; }
  .banner-label { font-size:9px; font-family:'JetBrains Mono',monospace !important; text-transform:uppercase; letter-spacing:1.8px; color:var(--text3); margin-bottom:6px; }
  .banner-value { font-family:'DM Serif Display',serif; font-size:32px; font-weight:400; color:var(--text); letter-spacing:-0.5px; }
  .divider { width:1px; background:var(--border2); align-self:stretch; margin:0; padding:0; min-height:54px; }

  /* ── BREAKDOWN TABLE ──────────────────────────────────── */
  .breakdown-table { width:100%; border-collapse:collapse; font-size:13px; }
  .breakdown-table th { font-family:'JetBrains Mono',monospace; font-size:9px; text-transform:uppercase; letter-spacing:1.2px; color:var(--text3); padding:10px 12px; text-align:left; background:var(--surface3); border-bottom:2px solid var(--border2); }
  .breakdown-table td { padding:11px 12px; border-bottom:1px solid var(--border); color:var(--text2); }
  .breakdown-table tr:last-child td { border-bottom:none; }
  .breakdown-table tr:hover td { background:var(--surface2); color:var(--text); }
  .amount-cell { font-family:'JetBrains Mono',monospace; font-weight:600; text-align:right; }
  .amount-cell .dollar, .result-amount, .banner-value { font-family:'DM Serif Display',serif !important; }
  .total-row td { font-weight:700; border-top:1px solid var(--border2) !important; color:var(--text) !important; padding-top:12px; }

  /* ── GLOBAL FONT ENFORCEMENT ─────────────────────────── */
  /* Monetary hero displays → DM Serif Display.
     Numbers in tables/rows stay JetBrains Mono for the clean tabular look. */
  .result-amount, .banner-value, .history-total {
    font-family: 'DM Serif Display', serif !important;
    font-weight: 400;
  }
  /* All technical badges, labels, monospaced data → JetBrains Mono */
  .result-label, .banner-label, .status-badge, .pill,
  .amount-cell, .breakdown-table th,
  [class*="badge"], [class*="label"][class*="mono"],
  [class*="mono"] {
    font-family: 'JetBrains Mono', monospace !important;
  }

  /* ── HISTORY ──────────────────────────────────────────── */
  .history-item {
    padding: 16px 20px;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    margin-bottom: 10px;
    cursor: pointer;
    transition: all 0.18s;
    display: grid;
    grid-template-columns: 1fr auto;
    align-items: center;
    gap: 16px;
    box-shadow: var(--shadow-card);
  }
  .history-item:hover { border-color:rgba(var(--accent-rgb),0.40); box-shadow:0 4px 24px rgba(var(--accent-rgb),0.15); transform:translateY(-1px); }
  .history-month { font-family:'Space Grotesk',sans-serif; font-size:17px; font-weight:600; margin-bottom:4px; color:var(--text); letter-spacing:-0.2px; }
  .history-pills { display:flex; flex-wrap:wrap; gap:6px; margin-top:8px; }
  .pill { padding:3px 11px; border-radius:20px; font-size:10.5px; font-family:'JetBrains Mono',monospace; font-weight:500; }
  .history-amounts { text-align:right; }
  .history-total { font-family:'DM Serif Display',serif; font-size:26px; font-weight:400; color:var(--text); letter-spacing:-0.4px; }
  .history-sub { font-size:10.5px; color:var(--text3); font-family:'JetBrains Mono',monospace; }

  /* ── STATUS BADGES ────────────────────────────────────── */
  .status-badge { padding:3px 10px; border-radius:20px; font-size:9.5px; font-family:'JetBrains Mono',monospace !important; font-weight:600; text-transform:uppercase; letter-spacing:0.5px; }
  .status-paid    { background:rgba(6,214,160,0.15); color:var(--green); border:1px solid rgba(6,214,160,0.3); }
  .status-partial { background:rgba(255,209,102,0.15); color:var(--yellow); border:1px solid rgba(255,209,102,0.3); }
  .status-pending { background:rgba(255,255,255,0.06); color:var(--text3); border:1px solid var(--border); }
  .status-overdue { background:rgba(255,77,109,0.15); color:var(--red); border:1px solid rgba(255,77,109,0.3); }

  /* ── ALERTS ───────────────────────────────────────────── */
  .alert { padding:12px 16px; border-radius:var(--r-sm); border-left:3px solid; font-size:13px; margin-bottom:14px; }
  .alert-info { background:rgba(var(--accent-rgb),0.08); border-color:var(--accent); color:var(--accent); }
  .alert-warn { background:rgba(255,209,102,0.1); border-color:var(--yellow); color:var(--yellow); }

  /* ── TENANT ROWS ──────────────────────────────────────── */
  .tenant-row { display:flex; align-items:center; gap:12px; padding:11px 15px; background:var(--surface2); border:1px solid var(--border); border-radius:var(--r-sm); margin-bottom:8px; transition:all 0.15s; }
  .tenant-row:hover { border-color:var(--border2); }
  .tenant-color { width:10px; height:10px; border-radius:50%; flex-shrink:0; box-shadow:0 0 6px currentColor; }
  .tenant-name-display { font-weight:600; font-size:14px; flex:1; color:var(--text); }
  .tenant-pct { font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--text3); }

  /* ── EMPTY STATE ──────────────────────────────────────── */
  .empty-state { text-align:center; padding:60px 32px; color:var(--text3); }
  .empty-state .big-icon { font-size:48px; margin-bottom:16px; opacity:0.3; }
  .empty-state h3 { font-family:'Space Grotesk',sans-serif; font-size:20px; font-weight:600; color:var(--text2); margin-bottom:8px; }
  .empty-state p { font-size:13.5px; max-width:320px; margin:0 auto; line-height:1.6; color:var(--text3); }

  /* ── TOAST ────────────────────────────────────────────── */
  .toast {
    position: fixed; bottom:24px; right:24px;
    background: var(--surface2);
    color: var(--text);
    padding: 12px 18px;
    border-radius: var(--r-md);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 13.5px; font-weight:500;
    z-index: 9999;
    box-shadow: var(--shadow-float);
    animation: slideUp 0.3s cubic-bezier(0.34,1.56,0.64,1);
    display: flex; align-items:center; gap:8px;
    max-width: 320px;
    border: 1px solid var(--border2);
    border-left: 3px solid var(--accent);
  }
  @keyframes slideUp { from{opacity:0;transform:translateY(16px) scale(0.96);} to{opacity:1;transform:translateY(0) scale(1);} }
  @keyframes success-ripple {
    0%   { box-shadow: 0 0 0 0 rgba(var(--accent-rgb),0.7), 0 4px 16px rgba(var(--accent-rgb),0.35); background: var(--accent); }
    40%  { box-shadow: 0 0 0 10px rgba(var(--accent-rgb),0), 0 6px 24px rgba(var(--accent-rgb),0.4); background: var(--accent2); }
    100% { box-shadow: 0 0 0 0 rgba(var(--accent-rgb),0), 0 4px 16px rgba(var(--accent-rgb),0.35); background: var(--accent); }
  }
  .btn-save-ripple {
    animation: success-ripple 1s ease-out;
  }

  /* ── MODE SELECTOR ────────────────────────────────────── */
  .mode-card {
    padding: 22px 20px;
    border-radius: var(--r-md);
    cursor: pointer;
    text-align: left;
    transition: all 0.22s cubic-bezier(0.4,0,0.2,1);
    border: 1px solid var(--border);
    background: var(--surface);
    /* A <button> defaults to the UA's buttontext (black), not the body colour,
       so anything inside without its own colour — the icon — vanishes on the
       dark card. Set it here so descendants inherit the theme. */
    color: var(--text-primary);
    position: relative;
    box-shadow: var(--shadow-card);
  }
  .mode-card:hover { border-color:var(--border2); transform:translateY(-2px); box-shadow:var(--shadow-float); }
  .mode-card.active-property { border-color:rgba(var(--accent-rgb),0.55); background:linear-gradient(135deg,rgba(var(--accent-rgb),0.14),rgba(var(--accent-rgb),0.04)); box-shadow:0 4px 24px rgba(var(--accent-rgb),0.18); }
  .mode-card.active-group { border-color:rgba(var(--accent-rgb),0.55); background:linear-gradient(135deg,rgba(var(--accent-rgb),0.10),rgba(var(--accent-rgb),0.03)); box-shadow:0 4px 24px rgba(var(--accent-rgb),0.14); }
  .mode-card-icon { font-size:28px; margin-bottom:12px; }
  .mode-card.active-property .mode-card-icon,
  .mode-card.active-group .mode-card-icon { color:var(--brand-text); }
  .mode-card-title { font-family:'Space Grotesk',sans-serif; font-size:17px; font-weight:600; color:var(--text); margin-bottom:5px; }
  .mode-card-desc { font-size:12.5px; color:var(--text3); line-height:1.5; }
  .mode-active-badge {
    position:absolute; top:12px; right:12px;
    font-size:9px; font-family:'JetBrains Mono',monospace; font-weight:700;
    text-transform:uppercase; letter-spacing:1px;
    padding:3px 9px; border-radius:20px;
    background:var(--accent); color:var(--ink);
  }

  /* ── PAYMENT ROWS ─────────────────────────────────────── */
  .payment-row { display:flex; align-items:center; gap:10px; padding:10px 14px; background:var(--surface2); border-radius:var(--r-sm); margin-bottom:6px; flex-wrap:wrap; border:1px solid var(--border); }

  /* ── MODAL ────────────────────────────────────────────── */
  .modal-overlay { position:fixed; inset:0; background:rgba(0,0,0,0.75); z-index:1000; display:flex; align-items:center; justify-content:center; padding:24px; backdrop-filter:blur(6px); }
  .modal-box { background:var(--surface); border-radius:var(--r-xl); padding:32px; max-width:420px; width:100%; box-shadow:var(--shadow-float); border:1px solid var(--border2); }

  /* ── LANDING PAGE ─────────────────────────────────────── */
  .landing { position:fixed; inset:0; z-index:500; overflow-y:auto; background:var(--bg); }
  .landing.hidden { display:none; }

  .landing-hero {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 60px 24px 40px;
    text-align: center;
    position: relative;
    background: var(--bg);
    overflow: hidden;
  }
  .landing-hero::before {
    content:'';
    position:absolute; inset:0;
    background: radial-gradient(ellipse at 25% 40%, rgba(var(--accent-rgb),0.16) 0%, transparent 55%),
                radial-gradient(ellipse at 75% 60%, rgba(var(--accent-rgb),0.10) 0%, transparent 55%),
                radial-gradient(ellipse at 50% 95%, rgba(var(--accent-rgb),0.08) 0%, transparent 45%);
    pointer-events:none;
  }
  .landing-hero::after {
    /* Subtle arced background lines — reference dashboard pattern */
    content:'';
    position:absolute; inset:0;
    background-image:
      radial-gradient(ellipse 800px 320px at 20% 30%, transparent 65%, rgba(var(--accent-rgb),0.04) 66%, rgba(var(--accent-rgb),0.04) 67%, transparent 68%),
      radial-gradient(ellipse 900px 400px at 85% 70%, transparent 65%, rgba(var(--accent-rgb),0.04) 66%, rgba(var(--accent-rgb),0.04) 67%, transparent 68%),
      radial-gradient(circle at 50% 50%, transparent 60%, rgba(var(--accent-rgb),0.025) 61%, rgba(var(--accent-rgb),0.025) 62%, transparent 63%);
    pointer-events:none;
  }
  @keyframes gridMove { from{background-position:0 0;} to{background-position:44px 44px;} }

  .landing-badge {
    display:inline-flex; align-items:center; gap:8px;
    background:rgba(var(--accent-rgb),0.08);
    border:1px solid rgba(var(--accent-rgb),0.25);
    border-radius:40px;
    padding:6px 18px;
    font-size:11.5px; font-family:'JetBrains Mono',monospace;
    color:rgba(255,255,255,0.6);
    margin-bottom:28px;
    position:relative; z-index:1;
  }
  .landing-badge .dot { width:6px; height:6px; border-radius:50%; background:var(--green); box-shadow:0 0 8px rgba(52,211,153,0.9); animation:pulse 2s infinite; }

  .landing-logo {
    font-family: 'Space Grotesk', sans-serif;
    font-size: clamp(56px,11vw,88px);
    font-weight: 800;
    color: var(--text);
    letter-spacing: -3px;
    line-height: 1;
    margin-bottom: 18px;
    position: relative; z-index:1;
  }
  .landing-logo span { color:var(--accent); }

  .landing-hero-headline {
    font-family: 'DM Serif Display', serif;
    font-size: clamp(36px, 6vw, 72px);
    font-weight: 400;
    color: var(--text);
    line-height: 1.1;
    letter-spacing: -1px;
    margin-bottom: 18px;
    position: relative;
    z-index: 1;
  }
  .landing-hero-headline em {
    font-style: italic;
    color: var(--accent);
    font-size: 1.1em;
  }

  .landing-tagline {
    font-size: clamp(16px,3vw,19px);
    color: var(--text2);
    max-width: 480px;
    line-height: 1.65;
    margin-bottom: 36px;
    position: relative; z-index:1;
  }
  .landing-tagline strong { color:var(--text); font-weight:700; }

  .landing-cta-group { display:flex; gap:13px; flex-wrap:wrap; justify-content:center; margin-bottom:52px; position:relative; z-index:1; }

  .btn-landing-primary {
    padding: 14px 34px;
    background: #ffffff;
    color: #1a1c1c;
    border: none;
    border-radius: var(--r-lg);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px; font-weight: 700;
    cursor: pointer;
    transition: all 0.2s;
    display:inline-flex; align-items:center; gap:8px;
    box-shadow: 0 6px 28px rgba(0,0,0,0.45);
  }
  .btn-landing-primary:hover { transform:translateY(-2px); box-shadow:0 10px 40px rgba(0,0,0,0.55); filter:brightness(1.02); }

  .btn-landing-secondary {
    padding: 14px 28px;
    background: rgba(255,255,255,0.06);
    color: var(--text2);
    border: 1px solid var(--border2);
    border-radius: var(--r-lg);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px; font-weight: 500;
    cursor: pointer;
    transition: all 0.2s;
  }
  .btn-landing-secondary:hover { background:rgba(255,255,255,0.1); color:var(--text); }

  .landing-stats {
    display:flex; gap:0; flex-wrap:wrap; justify-content:center;
    background:rgba(255,255,255,0.04);
    border:1px solid var(--border);
    border-radius:var(--r-xl);
    padding:4px;
    position:relative; z-index:1;
    backdrop-filter:blur(10px);
  }
  .landing-stat { padding:14px 26px; text-align:center; }
  .landing-stat + .landing-stat { border-left:1px solid var(--border); }
  .stat-num { font-family:'DM Serif Display',serif; font-size:38px; font-weight:400; color:var(--accent); letter-spacing:-1px; line-height:1; }
  .stat-label { font-size:9px; font-family:'JetBrains Mono',monospace; color:var(--text3); text-transform:uppercase; letter-spacing:1.5px; margin-top:2px; }

  .landing-features { padding:72px 24px; max-width:1000px; margin:0 auto; }
  .landing-features h2 { font-family:'Space Grotesk',sans-serif; font-size:clamp(28px,5vw,42px); font-weight:700; color:var(--text); text-align:center; margin-bottom:10px; letter-spacing:-1px; }
  .landing-features > p { text-align:center; color:var(--text3); font-size:15px; margin-bottom:48px; }
  .features-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:14px; }
  .landing-feature {
    padding:22px;
    background:var(--surface);
    border:1px solid var(--border);
    border-radius:var(--r-md);
    transition:all 0.2s;
    box-shadow:var(--shadow-card);
  }
  .landing-feature:hover { border-color:rgba(var(--accent-rgb),0.40); transform:translateY(-2px); box-shadow:var(--shadow-float); }
  .landing-feature .feat-icon { font-size:26px; margin-bottom:12px; }
  .landing-feature h3 { font-family:'Space Grotesk',sans-serif; font-size:16px; font-weight:600; color:var(--text); margin-bottom:7px; }
  .landing-feature p { font-size:13px; color:var(--text3); line-height:1.6; }

  /* ── How It Works ─────────────────────────────────────────────────────────
     These rules used to target .landing-how / .how-steps / .how-step, which
     the markup stopped using. The only selector still matching anything was
     .step-num, and its `margin:0 auto` is why the numbered circles floated in
     the middle of the page while the text sat unstyled against the left edge.
     Selectors now match the markup that actually ships: .landing-steps > .step
     > .step-num + .step-content. */
  .landing-steps { padding:72px 24px; max-width:760px; margin:0 auto; }
  .landing-steps h2 { font-family:'Space Grotesk',sans-serif; font-size:clamp(26px,5vw,38px); font-weight:700; color:var(--text); text-align:center; margin-bottom:44px; letter-spacing:-0.8px; }

  /* A fixed rail for the number, the prose beside it — so the digits line up
     down a single edge instead of drifting with the text. */
  .step { display:grid; grid-template-columns:44px 1fr; gap:20px; align-items:start; position:relative; padding-bottom:30px; }
  .step:last-child { padding-bottom:0; }

  /* The steps are a genuine sequence, so the rail is joined up. Fades out at
     the bottom so it reads as a thread rather than a table border.
     :has(+ .step) rather than :not(:last-child) — a CTA div follows the last
     step, so :last-child never matched it and the rail trailed off below the
     final number into empty space. */
  .step:has(+ .step)::before {
    content:''; position:absolute; left:21px; top:52px; bottom:6px; width:2px;
    background:linear-gradient(to bottom, rgba(var(--accent-rgb),0.45), rgba(var(--accent-rgb),0.06));
    border-radius:2px;
  }

  .step-num { width:44px; height:44px; border-radius:50%; background:var(--accent); color:var(--ink); font-family:'JetBrains Mono',monospace; font-size:17px; font-weight:700; display:flex; align-items:center; justify-content:center; margin:0; flex-shrink:0; position:relative; z-index:1; box-shadow:0 4px 16px rgba(var(--accent-rgb),0.35); }

  .step-content { padding-top:3px; }   /* optical: aligns the h4 with the digit */
  .step-content h4 { font-family:'Space Grotesk',sans-serif; font-size:16.5px; font-weight:600; color:var(--text); margin:0 0 6px; }
  .step-content p { font-size:14px; color:var(--text2); line-height:1.65; margin:0; max-width:60ch; }

  @media (max-width:520px) {
    .landing-steps { padding:56px 20px; }
    .step { grid-template-columns:36px 1fr; gap:14px; padding-bottom:24px; }
    .step-num { width:36px; height:36px; font-size:15px; }
    .step:not(:last-child)::before { left:17px; top:44px; }
  }

  .landing-footer {
    padding:24px;
    text-align:center;
    font-size:11px; font-family:'JetBrains Mono',monospace;
    color:var(--text3);
    border-top:1px solid var(--border);
    background:rgba(0,0,0,0.2);
  }
  .landing-footer span { color:var(--text2); }

  /* ── MISC ─────────────────────────────────────────────── */
  /* Force font stacks on financial data */
  .breakdown-table .amount-cell,
  .breakdown-table tfoot td,
  .history-total,
  .result-amount,
  .banner-value { font-family: 'DM Serif Display', serif !important; font-weight: 400; }
  .breakdown-table th,
  .result-label,
  .banner-label,
  .status-badge,
  .pill { font-family: 'JetBrains Mono', monospace !important; }

  /* scrollbar */
  ::-webkit-scrollbar { width:5px; height:5px; }
  ::-webkit-scrollbar-track { background:transparent; }
  ::-webkit-scrollbar-thumb { background:var(--surface3); border-radius:10px; }
  ::-webkit-scrollbar-thumb:hover { background:var(--border2); }

  /* ── BUTTON LOADING STATE ────────────────────────────── */
  .btn-loading {
    position: relative;
    pointer-events: none;
    opacity: 0.85;
  }
  .btn-loading::after {
    content: '';
    display: inline-block;
    width: 13px;
    height: 13px;
    border: 2px solid rgba(255,255,255,0.3);
    border-top-color: currentColor;
    border-radius: 50%;
    animation: btn-spin 0.65s linear infinite;
    margin-left: 8px;
    vertical-align: middle;
    flex-shrink: 0;
  }
  @keyframes btn-spin { to { transform: rotate(360deg); } }
  .btn-done {
    transition: background 0.25s, transform 0.2s;
    transform: scale(1.03);
  }

  /* ── MOBILE BOTTOM TAB BAR — HIDDEN ───────────────────────
     Removed per user request — mobile uses the hamburger sidebar for navigation.
     Kept the HTML + JS (mbtNav, syncMobileTabBar) in place so nothing breaks;
     the JS just toggles classes on hidden elements, a harmless no-op. */
  /* The phone tab bar lives in the MOBILE SHELL section at the end of this
     file; it only exists at ≤768px. */
  .mobile-tab-bar { display: none; }

  /* ══════════════════════════════════════════════
     MOBILE-FIRST RESPONSIVE FIXES
     Fixes both issues seen in screenshots:
     1. Tab/content visibility when sidebar open
     2. Bill-type select & split buttons on phone
  ══════════════════════════════════════════════ */

  /* Prevent iOS zoom on any input focus */
  @media(max-width:768px) {
    input[type="text"],
    input[type="number"],
    input[type="email"],
    input[type="password"],
    input[type="date"],
    select,
    textarea {
      font-size: 16px !important;
    }
    /* Show the sidebar close button on mobile */
    #sidebar-close-btn { display: flex !important; }
    .sidebar-logo { position: relative; }
  }

  /* Cards — tighter padding on phone */
  @media(max-width:768px) {
    .card { padding: 14px 12px; margin-bottom: 12px; }
    .card-title { font-size: 14px; margin-bottom: 12px; padding-bottom: 10px; gap: 8px; }
    .card-title .icon { width: 26px; height: 26px; font-size: 12px; }

    /* Billing period — 2-col on phone, not 4-col */
    .billing-period-row {
      grid-template-columns: 1fr 1fr !important;
    }
    /* Form rows — always single column on mobile */
    .form-row[style*="1fr 1fr 1fr 1fr"] {
      grid-template-columns: 1fr 1fr !important;
    }
    .form-row { gap: 10px; }
    .form-row.three { grid-template-columns: 1fr 1fr !important; }

    /* Mode selector — stack cards vertically */
    #mode-selector > div {
      grid-template-columns: 1fr !important;
      gap: 10px;
      max-width: 100% !important;
    }
    .mode-card { padding: 16px 14px; text-align: left; }
    .mode-card-title { font-size: 15px; }
    .mode-card-icon { font-size: 22px; margin-bottom: 8px; }

    /* Summary banner — compact */
    .summary-banner { padding: 14px 12px; gap: 0; flex-wrap: wrap; }
    .summary-banner > div:not(.divider) { padding: 6px 10px; }
    .banner-value { font-size: 20px !important; }
    .banner-label { font-size: 8px !important; }

    /* Results grid — 2-col then 1-col on tiny screens */
    .results-grid { grid-template-columns: 1fr 1fr !important; gap: 8px; }
    .result-amount { font-size: 26px !important; }

    /* Actions row — full-width stacked buttons */
    .actions-row { flex-direction: column; gap: 8px; }
    .actions-row .btn { width: 100% !important; justify-content: center; }

    /* Breakdown table — horizontal scroll wrapper */
    table.breakdown-table { min-width: 420px; font-size: 12px; }
    table.breakdown-table th,
    table.breakdown-table td { padding: 8px 8px; }

    /* Group mode — stack columns */
    #calc-mode-group > div[style*="grid-template-columns:1fr 1fr"] {
      grid-template-columns: 1fr !important;
    }

    /* History stats grid — 2-col */
    .history-stats-grid,
    div[style*="grid-template-columns:1fr 1fr 1fr;gap:12px;margin-bottom:20px"] {
      grid-template-columns: 1fr 1fr !important;
      font-size: 13px;
    }

    /* Charts tab — stack all grids to 1 column on mobile.
       The charts grids use inline styles so they need attribute selectors to override. */
    #tab-charts div[style*="grid-template-columns:1fr 1fr"],
    #tab-charts div[style*="grid-template-columns:1fr 2fr"] {
      grid-template-columns: 1fr !important;
    }
    /* Chart canvas containers — slightly shorter on mobile so they fit the viewport better */
    #tab-charts div[style*="height:220px"] {
      height: 200px !important;
    }

    /* Calc button — full width with extra bottom clearance for tab bar */
    .calc-btn-wrapper {
      margin: 20px 0 0;
      padding-bottom: 20px;
      /* extra space so button is never hidden behind the bottom tab bar */
    }
    .btn-success.calc-btn-main { width: 100%; justify-content: center; padding: 16px 20px; font-size: 16px; }

    /* Payment grid inside history — stack */
    .payment-grid { grid-template-columns: 1fr !important; gap: 8px; }

    /* Global split row — wrap properly */
    #utilities-list > div[style*="align-items:center;gap:10px"] {
      flex-wrap: wrap; gap: 8px;
    }

    /* Topbar sub — hide on very small screens */
    .topbar-sub { display: none; }

    /* Page content top padding */
    .page-content { padding-top: 14px; }
  }

  /* Very small phones */
  @media(max-width:400px) {
    .results-grid { grid-template-columns: 1fr !important; }
    .form-row, .form-row.three { grid-template-columns: 1fr !important; }
    .card { padding: 12px 10px; }
    .split-controls-row > div { max-width: 100% !important; }
  }

  /* ══════════════════════════════════════════════
     iOS / PHONE LAYOUT STABILITY
     Heights use 100svh (see body/.app-shell/.main-content): the *stable*
     small-viewport unit. 100dvh re-sizes the scroll container every time
     Safari's address bar collapses mid-scroll, which is what made the whole
     app appear to shift and jump while scrolling on iPhone.
  ══════════════════════════════════════════════ */

  html {
    /* Stop iOS inflating text in landscape */
    -webkit-text-size-adjust: 100%;
    text-size-adjust: 100%;
  }

  /* Nothing may push the page sideways — a horizontal overflow on a phone
     reads as the layout "sliding around" under your thumb. */
  body { overflow-x: hidden; }

  /* Respect the notch / home indicator (viewport-fit=cover is set) */
  @supports (padding: max(0px)) {
    @media(max-width:768px) {
      .topbar       { padding-left: max(16px, env(safe-area-inset-left));
                      padding-right: max(16px, env(safe-area-inset-right)); }
      .page-content { padding-left: max(14px, env(safe-area-inset-left));
                      padding-right: max(14px, env(safe-area-inset-right)); }
      .sidebar      { padding-bottom: env(safe-area-inset-bottom); }
    }
  }

  @media(max-width:768px) {
    /* Any two-column layout that was built for desktop stacks on a phone.
       Without this, panels like "By Category | All Expenses" render as two
       ~165px slivers with clipped headings. */
    .sw-stack-mobile { grid-template-columns: 1fr !important; gap: 12px !important; }

    /* Media inside cards must never exceed the viewport */
    .card img, .card canvas, .card table { max-width: 100%; }

    /* Comfortable tap targets (Apple HIG ≈ 44px) */
    .sw-tap { min-width: 40px !important; min-height: 40px !important; }

    /* Mode selector — trim the descriptions so the actual work isn't
       pushed a third of a screen down on every visit */
    .mode-card { padding: 13px 14px !important; }
    .mode-card-desc { display: none; }
    .mode-card-icon { font-size: 18px !important; margin-bottom: 4px !important; }
    .mode-card-title { font-size: 14px !important; }

    /* This Month dashboard — row 1: month nav + budget icon, row 2: the total.
       The budget button drops its text label so it stays on the nav row. */
    .sw-month-nav { flex-wrap: wrap; gap: 10px !important; }
    .sw-month-nav .sw-budget-btn  { order: 1; margin-left: auto; padding: 9px 12px !important; }
    .sw-budget-label { display: none; }
    .sw-month-nav .sw-month-total { order: 2; flex: 1 0 100% !important; text-align: left !important; }

    /* Budget modal rows stay on one line at any width */
    #budget-modal input { width: 88px !important; }

    /* Expense name gets its own line — sharing a row with the amount field
       left it ~160px wide, too narrow for its own placeholder. */
    .sw-exp-name { flex: 1 0 100% !important; min-width: 0 !important; }

    /* Home strip: two stats per row rather than three squeezed slivers,
       and drop the vertical rules that read as clutter once wrapped. */
    .sw-home-cells { gap: 14px 12px !important; }
    .sw-home-cells > button { flex: 1 1 40% !important; min-width: 0 !important; }
    .sw-home-cells > div { display: none !important; }

    /* ── iOS repaint budget ──
       Two effects that look great on a desktop GPU but force Safari to
       re-composite the whole viewport on every scrolled frame, which reads
       as stuttering and drift on a phone: */

    /* 1. A live backdrop blur behind the sticky topbar re-samples the
          scrolling content underneath it continuously. Use an opaque bar. */
    .topbar {
      backdrop-filter: none !important;
      -webkit-backdrop-filter: none !important;
      background: var(--surface) !important;
    }

    /* 2. A position:fixed full-viewport noise overlay repaints against every
          scroll offset. It's a texture nobody misses at phone size. */
    body::before { display: none !important; }
  }

  /* ══════════════════════════════════════════════════════════════════════════
     COMPONENT LAYER
     Appended last so these win over the older rules above at equal specificity.
     Every value is a semantic token — no literals below this line.
     ══════════════════════════════════════════════════════════════════════════ */

  /* ── Focus ──────────────────────────────────────────────────────────────
     One visible treatment for every interactive thing. :focus-visible so a
     mouse click does not draw a ring, but Tab always does. */
  a:focus-visible, button:focus-visible, input:focus-visible,
  select:focus-visible, textarea:focus-visible, [tabindex]:focus-visible,
  .nav-item:focus-visible, .card:focus-visible {
    outline: 2px solid var(--focus-ring);
    outline-offset: 2px;
    box-shadow: var(--focus-shadow);
    border-radius: var(--r-sm);
  }

  /* ── Inputs ─────────────────────────────────────────────────────────────
     A field must look operable before it is touched: real fill, real edge. */
  input[type="text"], input[type="number"], input[type="date"],
  input[type="email"], input[type="password"], input[type="search"],
  select, textarea {
    background: var(--surface);
    border: 1px solid var(--border-strong);
    color: var(--text-primary);
    border-radius: var(--r-sm);
    transition: border-color .15s, box-shadow .15s;
  }
  input::placeholder, textarea::placeholder { color: var(--text-muted); opacity: 1; }

  input[type="text"]:hover, input[type="number"]:hover, input[type="date"]:hover,
  select:hover, textarea:hover { border-color: var(--brand); }

  input[type="text"]:focus, input[type="number"]:focus, input[type="date"]:focus,
  select:focus, textarea:focus {
    border-color: var(--brand);
    box-shadow: var(--focus-shadow);
    outline: none;
  }

  /* Invalid is never colour alone — pair with the .field-error text below. */
  input[aria-invalid="true"], select[aria-invalid="true"], textarea[aria-invalid="true"],
  input.is-invalid, select.is-invalid, textarea.is-invalid {
    border-color: var(--danger);
    background: var(--danger-soft);
  }
  .field-error {
    display: flex; align-items: center; gap: 6px;
    color: var(--danger); font-size: 12.5px; margin-top: 5px;
  }
  .field-error::before { content: '⚠'; font-size: 12px; }

  select option { background: var(--surface); color: var(--text-primary); }

  /* ── Buttons ────────────────────────────────────────────────────────────
     Primary carries --brand-ink, which is white on light and a near-black on
     dark: white on the dark brand is 2.42:1 and unusable. */
  .btn-primary, .btn-landing-primary {
    background: var(--brand);
    color: var(--brand-ink);
    border: 1px solid var(--brand);
    box-shadow: none;
  }
  .btn-primary:hover, .btn-landing-primary:hover {
    background: var(--brand-hover);
    border-color: var(--brand-hover);
    color: var(--brand-ink);
  }

  .btn-secondary, .btn-ghost, .btn-landing-secondary {
    background: var(--surface);
    border: 1px solid var(--border-strong);
    color: var(--text-primary);
  }
  .btn-secondary:hover, .btn-ghost:hover, .btn-landing-secondary:hover {
    background: var(--surface-muted);
    border-color: var(--brand);
    color: var(--text-primary);
  }

  /* Reserved for irreversible actions, and always behind a confirm dialog. */
  .btn-danger {
    background: var(--danger);
    color: var(--surface);
    border: 1px solid var(--danger);
  }
  .btn-danger:hover { filter: brightness(0.92); }

  .btn:disabled, .btn[disabled], button:disabled {
    opacity: 1;                       /* opacity dims the LABEL below AA */
    background: var(--surface-muted);
    color: var(--text-muted);
    border-color: var(--border);
    cursor: not-allowed;
  }

  /* ── Cards ──────────────────────────────────────────────────────────────
     Neutral by default. A bill row is not a status; it earns a tint only when
     something is actually true of it. Border first, shadow only when floating. */
  .card {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    box-shadow: none;
  }
  .card--raised { box-shadow: var(--shadow-card); }
  .card--section { background: var(--surface-muted); border-color: var(--border); }

  /* ── Status chips ───────────────────────────────────────────────────────
     Icon + word + colour. Never colour alone: the ::before glyph and the text
     both carry the state, so it survives greyscale and colour blindness. */
  .status {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 3px 10px; border-radius: 999px;
    font-size: 12px; font-weight: 600; line-height: 1.5;
    border: 1px solid transparent; white-space: nowrap;
  }
  .status::before { font-size: 11px; line-height: 1; }

  .status--draft    { background: var(--surface-muted); color: var(--text-secondary); border-color: var(--border); }
  .status--draft::before   { content: '○'; }

  .status--review   { background: var(--info-soft);    color: var(--info);    border-color: var(--info); }
  .status--review::before  { content: 'ⓘ'; }

  .status--duesoon  { background: var(--warning-soft); color: var(--warning); border-color: var(--warning); }
  .status--duesoon::before { content: '◑'; }

  .status--overdue  { background: var(--danger-soft);  color: var(--danger);  border-color: var(--danger); }
  .status--overdue::before { content: '▲'; }

  .status--partial  { background: var(--brand-soft);   color: var(--brand-text); border-color: var(--brand); }
  .status--partial::before { content: '◐'; }

  .status--paid     { background: var(--success-soft); color: var(--success); border-color: var(--success); }
  .status--paid::before    { content: '✓'; }

  /* ── Category chip ──────────────────────────────────────────────────────*/
  .chip {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 3px 9px; border-radius: 999px;
    background: var(--surface-muted); color: var(--text-secondary);
    border: 1px solid var(--border); font-size: 12px;
  }

  /* ── Attachment chip ────────────────────────────────────────────────────
     Filenames stay at text-primary: they are content, not metadata. */
  .attach-chip {
    display: inline-flex; align-items: center; gap: 7px;
    padding: 5px 10px; border-radius: var(--r-sm);
    background: var(--surface-muted); border: 1px solid var(--border-strong);
    color: var(--text-primary); font-size: 12.5px; max-width: 100%;
  }
  .attach-chip__name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .attach-chip__size { color: var(--text-secondary); flex: 0 0 auto; }

  /* ── Modal ──────────────────────────────────────────────────────────────*/
  .modal-box, #ocr-modal-box {
    background: var(--surface);
    border: 1px solid var(--border);
    box-shadow: var(--shadow-float);
    color: var(--text-primary);
  }

  /* ── Toast ──────────────────────────────────────────────────────────────*/
  .toast {
    background: var(--surface);
    color: var(--text-primary);
    border: 1px solid var(--border-strong);
    border-left: 3px solid var(--brand);
    box-shadow: var(--shadow-float);
  }
  .toast--success { border-left-color: var(--success); }
  .toast--warning { border-left-color: var(--warning); }
  .toast--danger  { border-left-color: var(--danger); }
  .toast--info    { border-left-color: var(--info); }

  /* ── Money ──────────────────────────────────────────────────────────────
     Amounts are the thing people came to read: full contrast, tabular so
     columns line up, never muted. */
  .amount, .amount-total {
    color: var(--text-primary);
    font-variant-numeric: tabular-nums;
  }
  .amount-total { font-weight: 700; }
  .amount--muted { color: var(--text-secondary); }

  /* An empty row is a draft, not a $0.00 bill. */
  .bill-row--empty {
    background: var(--surface-muted);
    border: 1px dashed var(--border-strong);
    color: var(--text-secondary);
  }

  /* Uppercase labels: readable size, restrained tracking. */
  .label-caps {
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-size: 11.5px;
    font-weight: 600;
    color: var(--text-secondary);
  }

  @media (prefers-reduced-motion: reduce) {
    * { animation-duration: .01ms !important; transition-duration: .01ms !important; }
  }

  /* ══════════════════════════════════════════════════════════════════════════
     MOBILE SHELL — design handoff, phase 1
     Bottom tab bar, bottom sheets, Home and Bills (built by 11-mobile.js).
     Phone widths only; desktop never renders any of it. Every colour is a
     semantic token, so both themes work without a single override.
     ══════════════════════════════════════════════════════════════════════════ */

  .sr-only {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }

  /* ID beats .tab-panel.active — both are !important, specificity decides. */
  @media (min-width: 769px) {
    #tab-home, #tab-bills { display: none !important; }
  }

  /* ── Bottom sheet (global: a primitive, not a phone-only style) ─────────── */
  #m-sheet-root { position: fixed; inset: 0; z-index: 1000; }
  #m-sheet-root[hidden] { display: none; }
  .m-scrim { position: absolute; inset: 0; background: rgba(8, 14, 20, .55); animation: mFade .2s ease; }
  .m-sheet {
    position: absolute; left: 0; right: 0; bottom: 0;
    max-width: 560px; margin: 0 auto; max-height: 88vh; overflow-y: auto;
    padding: 10px 20px calc(22px + env(safe-area-inset-bottom, 0px));
    background: var(--surface); color: var(--text-primary);
    border: 1px solid var(--border); border-bottom: 0;
    border-radius: 28px 28px 0 0;
    box-shadow: 0 -18px 40px -12px rgba(0, 0, 0, .35);
    animation: mSheetUp .28s cubic-bezier(.2, .9, .2, 1);
  }
  .m-sheet:focus { outline: none; }
  .m-sheet__handle { width: 40px; height: 5px; margin: 0 auto 14px; border-radius: 3px; background: var(--border-strong); }
  .m-sheet__title { margin: 0 0 14px; font: 700 19px/1.25 'Space Grotesk', sans-serif; letter-spacing: -.3px; color: var(--text-primary); }
  @keyframes mSheetUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
  @keyframes mFade { from { opacity: 0; } to { opacity: 1; } }

  .m-sheet-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
  .m-sheet-item {
    width: 100%; display: flex; align-items: center; gap: 12px; padding: 14px;
    border-radius: 16px; border: 1px solid var(--border); background: var(--surface);
    color: var(--text-primary); text-align: left; cursor: pointer; font-family: 'Plus Jakarta Sans', sans-serif;
  }
  .m-sheet-item:hover { border-color: var(--brand); }
  .m-sheet-item.is-active { background: var(--brand-soft); border-color: var(--brand); }
  .m-sheet-item__main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
  .m-sheet-item__main strong { font: 600 15px/1.3 'Space Grotesk', sans-serif; }
  .m-sheet-item__main span { font-size: 12.5px; line-height: 1.35; color: var(--text-secondary); }
  .m-sheet-item > i { flex: none; font-size: 12px; color: var(--text-secondary); }
  .m-current { flex: none; display: inline-flex; align-items: center; gap: 5px; font: 700 11px/1 'JetBrains Mono', monospace; letter-spacing: .03em; text-transform: uppercase; color: var(--brand-text); }
  .m-dot { flex: none; width: 12px; height: 12px; border-radius: 50%; }

  .m-kv { display: flex; flex-direction: column; border: 1px solid var(--border); border-radius: 16px; overflow: hidden; }
  .m-kv > div { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 12px 14px; }
  .m-kv > div + div { border-top: 1px solid var(--border); }
  .m-kv span { font: 700 11px/1.3 'JetBrains Mono', monospace; letter-spacing: .05em; text-transform: uppercase; color: var(--text-secondary); }
  .m-kv strong { font: 600 15px/1.3 'Plus Jakarta Sans', sans-serif; color: var(--text-primary); text-align: right; }
  .m-kv strong.m-money { font: 400 20px/1 'DM Serif Display', serif; }
  .m-kv > .m-kv__note { flex-direction: column; align-items: stretch; }
  .m-kv__note p { margin: 4px 0 0; font-size: 14px; line-height: 1.5; color: var(--text-primary); }
  .m-sheet-hint, .m-sheet-text { margin: 14px 0 0; font-size: 14px; line-height: 1.5; color: var(--text-secondary); }
  .m-sheet-text strong { color: var(--text-primary); }
  .m-sheet-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 18px; }

  /* ── Buttons ─────────────────────────────────────────────────────────────── */
  .m-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    min-height: 48px; padding: 0 18px; border-radius: 14px; border: 1px solid transparent;
    font: 700 14.5px/1 'Space Grotesk', sans-serif; cursor: pointer;
  }
  .m-btn--primary   { background: var(--brand);   border-color: var(--brand);   color: var(--brand-ink); }
  .m-btn--primary:hover { background: var(--brand-hover); border-color: var(--brand-hover); }
  .m-btn--secondary { background: var(--surface); border-color: var(--border-strong); color: var(--text-primary); }
  .m-btn--secondary:hover { background: var(--surface-muted); border-color: var(--brand); }
  .m-btn--danger    { background: var(--danger);  border-color: var(--danger);  color: var(--surface); }
  .m-btn--success   { background: var(--success); border-color: var(--success); color: var(--surface); }

  /* ── Status chips the phone screens add to the six from the component layer */
  .status--unpaid   { background: var(--surface-muted); color: var(--text-primary); border-color: var(--border-strong); }
  .status--unpaid::before   { content: '○'; }
  .status--reported { background: var(--warning-soft); color: var(--warning); border-color: var(--warning); }
  .status--reported::before { content: '↗'; }

  .m-flash { animation: mFlash 1.6s ease; }
  @keyframes mFlash { 0%, 45% { box-shadow: 0 0 0 3px var(--focus-ring); } 100% { box-shadow: 0 0 0 0 transparent; } }

  @media (max-width: 768px) {
    .main-content { padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)); }
    /* .page-content is flex:1 + min-height:0 inside a fixed-height scroller, so
       it shrinks to the viewport and its content overflows the box. Padding on
       .main-content then lands after the BOX, not the content, and the last
       row sits under the tab bar out of reach. Let it grow, never shrink. */
    .page-content { flex: 1 0 auto; }
    body.m-sheet-open .main-content { overflow: hidden; }

    /* Reports: two charts side by side leaves each about 150px wide on a
       phone — one per row instead. !important because the column template is
       an inline style on the row. */
    .chart-pair { grid-template-columns: minmax(0, 1fr) !important; }

    /* ── Tab bar ── */
    .mobile-tab-bar {
      display: grid; grid-template-columns: repeat(5, 1fr); align-items: end;
      position: fixed; left: 0; right: 0; bottom: 0; z-index: 900;
      padding: 6px 4px calc(8px + env(safe-area-inset-bottom, 0px));
      background: var(--surface); border-top: 1px solid var(--border);
    }
    .mbt-btn {
      position: relative; display: flex; flex-direction: column; align-items: center; gap: 4px;
      min-height: 50px; padding: 8px 2px 2px; border: 0; border-radius: 12px; background: none;
      color: var(--text-secondary); font: 600 11px/1.2 'Plus Jakarta Sans', sans-serif; cursor: pointer;
    }
    .mbt-icon { font-size: 18px; line-height: 1; }
    .mbt-btn.active { color: var(--brand-text); }
    /* Current tab is marked by a bar as well as colour. */
    .mbt-btn.active::before {
      content: ''; position: absolute; top: -7px; left: 28%; right: 28%;
      height: 3px; border-radius: 0 0 3px 3px; background: var(--brand);
    }
    .mbt-scan { gap: 5px; padding-top: 0; }
    .mbt-scan__disc {
      /* Kept deliberately small: it floats above the bar, so every pixel of
         width and lift is content it covers while you scroll. */
      display: grid; place-items: center; width: 46px; height: 46px; margin-top: -16px;
      border-radius: 50%; background: var(--brand); color: var(--brand-ink); font-size: 17px;
      box-shadow: 0 0 0 4px var(--surface), 0 8px 18px -8px rgba(var(--brand-rgb), .6);
      transition: transform .15s ease;
    }
    .mbt-scan:active .mbt-scan__disc { transform: scale(.95); }
    .mbt-badge:empty { display: none; }
    .mbt-badge {
      position: absolute; top: 2px; left: calc(50% + 6px); min-width: 18px; height: 18px; padding: 0 5px;
      border-radius: 9px; background: var(--brand); color: var(--brand-ink);
      font: 700 10.5px/18px 'JetBrains Mono', monospace; text-align: center;
    }

    /* ── Toast: a pill above the tab bar instead of under the thumb ── */
    .sw-toast {
      left: 16px !important; right: 16px !important;
      bottom: calc(100px + env(safe-area-inset-bottom, 0px)) !important;
      display: flex; align-items: center; gap: 10px;
      padding: 12px 16px !important; border: 0 !important; border-radius: 999px !important;
      background: var(--text-primary) !important; color: var(--surface) !important;
      font: 600 13.5px/1.35 'Plus Jakarta Sans', sans-serif !important;
      box-shadow: 0 12px 30px -10px rgba(0, 0, 0, .45) !important;
    }
    .sw-toast::before { content: ''; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--toast-accent, var(--brand)); }

    /* ── Screen scaffolding ── */
    .m-screen { display: flex; flex-direction: column; gap: 14px; padding-bottom: 8px; }
    .m-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; }
    .m-head--stack { display: block; }
    .m-eyebrow { display: block; margin: 0; font: 700 11px/1.3 'JetBrains Mono', monospace; letter-spacing: .06em; text-transform: uppercase; color: var(--text-secondary); }
    .m-title { margin: 3px 0 0; font: 700 clamp(22px, 6.5vw, 26px)/1.15 'Space Grotesk', sans-serif; letter-spacing: -.5px; color: var(--text-primary); }
    .m-sub { margin: 4px 0 0; font: 500 12.5px/1.4 'JetBrains Mono', monospace; color: var(--text-secondary); }
    .m-prop-switch {
      display: inline-flex; align-items: center; gap: 8px; margin-top: 3px; padding: 4px 0;
      border: 0; background: none; cursor: pointer; color: var(--text-primary);
      font: 700 clamp(21px, 6vw, 24px)/1.15 'Space Grotesk', sans-serif; letter-spacing: -.5px;
    }
    .m-prop-switch i { font-size: 12px; color: var(--brand); }

    /* ── Balance card: the screen's one loud thing ── */
    .m-balance {
      position: relative; overflow: hidden; padding: 20px; border-radius: 22px;
      background: linear-gradient(150deg, var(--brand), var(--brand-hover)); color: var(--brand-ink);
    }
    .m-balance::after {
      content: ''; position: absolute; right: -36px; top: -36px; width: 136px; height: 136px;
      border-radius: 50%; background: rgba(255, 255, 255, .10); pointer-events: none;
    }
    .m-balance > * { position: relative; z-index: 1; }
    .m-balance__top { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
    .m-balance__label { margin: 0; font: 700 11px/1.3 'JetBrains Mono', monospace; letter-spacing: .06em; text-transform: uppercase; }
    /* Inverted, so it keeps full contrast where it overlaps the lighter disc. */
    .m-balance__pill { flex: none; padding: 5px 10px; border-radius: 999px; background: var(--brand-ink); color: var(--brand); font: 700 11px/1 'JetBrains Mono', monospace; letter-spacing: .04em; text-transform: uppercase; }
    .m-balance__amount { margin: 12px 0 3px; font: 400 clamp(40px, 12.5vw, 50px)/1 'DM Serif Display', serif; letter-spacing: -1.2px; font-variant-numeric: tabular-nums; }
    .m-balance__meta { margin: 0; font: 600 13.5px/1.4 'Plus Jakarta Sans', sans-serif; }
    .m-balance__bar { height: 7px; margin-top: 16px; border-radius: 6px; background: rgba(0, 0, 0, .2); overflow: hidden; }
    .m-balance__bar span { display: block; height: 100%; border-radius: 6px; background: var(--brand-ink); }
    .m-balance__foot { margin: 7px 0 0; font: 700 11px/1.3 'JetBrains Mono', monospace; letter-spacing: .04em; }
    .m-balance--empty { background: var(--surface); color: var(--text-primary); border: 1.5px dashed var(--border-strong); }
    .m-balance--empty::after { display: none; }
    .m-balance__empty-text { margin: 8px 0 16px; font: 500 14px/1.5 'Plus Jakarta Sans', sans-serif; color: var(--text-secondary); }

    /* ── Payment waiting for confirmation ── */
    .m-alert {
      display: flex; align-items: center; gap: 12px; width: 100%; padding: 13px 14px; text-align: left;
      border-radius: 16px; border: 1px solid var(--warning); background: var(--warning-soft);
      color: var(--text-primary); font-family: 'Plus Jakarta Sans', sans-serif; cursor: pointer;
    }
    .m-alert__icon { flex: none; display: grid; place-items: center; width: 36px; height: 36px; border-radius: 11px; background: var(--surface); color: var(--warning); font-size: 15px; }
    .m-alert__text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
    .m-alert__text strong { font: 600 14px/1.3 'Space Grotesk', sans-serif; color: var(--text-primary); }
    .m-alert__text span { font-size: 12.5px; line-height: 1.4; color: var(--text-secondary); }
    .m-alert__cta { flex: none; padding: 8px 12px; border-radius: 10px; background: var(--warning); color: var(--surface); font: 700 11px/1 'JetBrains Mono', monospace; letter-spacing: .04em; text-transform: uppercase; }
    .m-more-note { margin: -4px 0 0; font-size: 12.5px; color: var(--text-secondary); }

    /* ── Quick actions ── */
    .m-quick { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
    .m-quick__btn {
      display: flex; flex-direction: column; align-items: flex-start; gap: 3px; padding: 15px;
      border-radius: 17px; border: 1px solid var(--border); background: var(--surface);
      color: var(--text-primary); text-align: left; cursor: pointer; font-family: 'Plus Jakarta Sans', sans-serif;
    }
    .m-quick__btn:hover { border-color: var(--brand); }
    .m-quick__btn i { margin-bottom: 8px; font-size: 18px; color: var(--brand); }
    .m-quick__btn strong { font: 600 14.5px/1.3 'Space Grotesk', sans-serif; }
    .m-quick__btn span { font-size: 12.5px; color: var(--text-secondary); }

    /* ── Lists ── */
    .m-section-head { display: flex; justify-content: space-between; align-items: center; margin-top: 10px; }
    .m-section { margin: 0; font: 700 11px/1.3 'JetBrains Mono', monospace; letter-spacing: .06em; text-transform: uppercase; color: var(--text-secondary); }
    .m-link { min-height: 36px; padding: 0 2px; border: 0; background: none; cursor: pointer; font: 700 13px/1 'Plus Jakarta Sans', sans-serif; color: var(--brand-text); }
    .m-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
    .m-list--compact { gap: 6px; }
    .m-row { display: flex; align-items: center; gap: 12px; padding: 13px 14px; border-radius: 17px; border: 1px solid var(--border); background: var(--surface); }
    .m-row__main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
    .m-row__main strong { font: 600 15px/1.25 'Plus Jakarta Sans', sans-serif; color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .m-row__main span { font: 500 12px/1.3 'JetBrains Mono', monospace; color: var(--text-secondary); }
    .m-row__end { flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
    .m-money { font: 400 20px/1 'DM Serif Display', serif; color: var(--text-primary); font-variant-numeric: tabular-nums; }
    .m-mini { display: flex; align-items: center; gap: 11px; padding: 10px 12px; border-radius: 14px; background: var(--surface-muted); }
    .m-mini__type { flex: 1; min-width: 0; font: 500 14px/1.3 'Plus Jakarta Sans', sans-serif; color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .m-mini__amt { flex: none; font: 600 14px/1 'JetBrains Mono', monospace; color: var(--text-primary); font-variant-numeric: tabular-nums; }
    .m-chip { flex: none; display: grid; place-items: center; border-radius: 12px; }
    .m-empty { margin: 0; padding: 14px; border-radius: 14px; background: var(--surface-muted); font-size: 14px; color: var(--text-secondary); }
    .m-draft { font: 600 12.5px/1 'Plus Jakarta Sans', sans-serif; color: var(--text-secondary); }

    /* ── Bills ── */
    .m-filters { display: flex; gap: 8px; margin: 0 -2px; padding: 0 2px 2px; overflow-x: auto; scrollbar-width: none; }
    .m-filters::-webkit-scrollbar { display: none; }
    .m-filter {
      flex: none; display: inline-flex; align-items: center; gap: 6px; min-height: 38px; padding: 0 14px;
      border-radius: 999px; border: 1px solid var(--border-strong); background: var(--surface);
      color: var(--text-primary); font: 600 13px/1 'Plus Jakarta Sans', sans-serif; cursor: pointer;
    }
    .m-filter span { font: 700 11.5px/1 'JetBrains Mono', monospace; color: var(--text-secondary); }
    .m-filter.is-on { background: var(--brand); border-color: var(--brand); color: var(--brand-ink); }
    .m-filter.is-on span { color: var(--brand-ink); }
    .m-filter:disabled { background: var(--surface-muted); border-color: var(--border); color: var(--text-muted); cursor: default; }
    .m-filter:disabled span { color: var(--text-muted); }

    .m-bills { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
    .m-bill { position: relative; border-radius: 18px; overflow: hidden; background: var(--surface-muted); }
    .m-bill__actions { position: absolute; top: 0; right: 0; bottom: 0; width: 136px; display: flex; visibility: hidden; }
    .m-bill.is-revealing .m-bill__actions { visibility: visible; }
    .m-bill__act {
      flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 7px;
      border: 0; cursor: pointer; font: 700 11px/1 'JetBrains Mono', monospace; letter-spacing: .04em; text-transform: uppercase;
    }
    .m-bill__act i { font-size: 16px; }
    .m-bill__act--split  { background: var(--brand);  color: var(--brand-ink); }
    .m-bill__act--delete { background: var(--danger); color: var(--surface); }
    .m-bill__face {
      position: relative; z-index: 1; padding: 14px 14px 12px 15px;
      border-radius: 18px; border: 1px solid var(--border); background: var(--surface);
      touch-action: pan-y; -webkit-user-select: none; user-select: none;
    }
    .m-bill.is-open .m-bill__face { box-shadow: 10px 0 18px -12px rgba(0, 0, 0, .4); }
    /* A bill with no amount is a draft, not a $0.00 bill. */
    .m-bill--draft .m-bill__face { border: 1.5px dashed var(--border-strong); }
    .m-bill__top { display: flex; align-items: center; gap: 12px; }
    .m-bill__open {
      flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 3px;
      padding: 2px 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer;
    }
    .m-bill__open strong { max-width: 100%; font: 600 16px/1.2 'Space Grotesk', sans-serif; color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .m-bill__open span { max-width: 100%; font: 500 12px/1.3 'JetBrains Mono', monospace; color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .m-bill__amt { flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 5px; }
    .m-bill__amt .m-money { font-size: 23px; }
    .m-bill__due { font: 500 11.5px/1 'JetBrains Mono', monospace; color: var(--text-secondary); }
    .m-bill__foot { display: flex; align-items: center; gap: 8px; margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--border); color: var(--text-secondary); font-size: 12px; }
    .m-bill__split { flex: 1; min-width: 0; font: 500 12px/1.35 'JetBrains Mono', monospace; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .m-tag {
      flex: none; display: inline-flex; align-items: center; gap: 5px; padding: 4px 8px; border-radius: 7px;
      background: var(--info-soft); color: var(--info); font: 700 10.5px/1 'JetBrains Mono', monospace; letter-spacing: .03em; text-transform: uppercase;
    }
    .m-bill__more {
      flex: none; display: grid; place-items: center; width: 44px; height: 44px; margin: -12px -10px -12px 0;
      border: 0; border-radius: 12px; background: none; color: var(--text-secondary); font-size: 17px; cursor: pointer;
    }
    .m-bill__more:hover, .m-bill.is-open .m-bill__more { background: var(--surface-muted); color: var(--text-primary); }

    .m-add {
      display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; min-height: 52px;
      border-radius: 18px; border: 1.5px dashed var(--border-strong); background: transparent;
      color: var(--text-primary); font: 600 14px/1 'Plus Jakarta Sans', sans-serif; cursor: pointer;
    }
    .m-add:hover { border-color: var(--brand); color: var(--brand-text); }
    .m-total { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 16px 18px; border-radius: 18px; border: 1px solid var(--border); background: var(--surface); }
    .m-total__amt { display: block; margin-top: 5px; font: 400 28px/1 'DM Serif Display', serif; color: var(--text-primary); font-variant-numeric: tabular-nums; }

    .m-empty-card {
      display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 28px 20px; text-align: center;
      border-radius: 20px; border: 1.5px dashed var(--border-strong); background: var(--surface);
    }
    .m-empty-card > i { font-size: 30px; color: var(--brand); }
    .m-empty-card p { margin: 0; display: flex; flex-direction: column; gap: 4px; }
    .m-empty-card strong { font: 700 17px/1.3 'Space Grotesk', sans-serif; color: var(--text-primary); }
    .m-empty-card span { font-size: 14px; line-height: 1.5; color: var(--text-secondary); }
  }
