  /* Global box-sizing reset — MUST be first. Without this, any element that
     combines an explicit width (100%, a percentage, etc.) with padding or a
     border renders wider than its container by exactly that padding/border
     amount. This was missing from the whole stylesheet; .sheet itself was
     one victim (width:100% + 40px horizontal padding), only masked because
     it happens to be a flex item that gets force-shrunk to fit — every
     plain block element with the same pattern (inputs, .tag-input-wrap
     children, anything not lucky enough to be flex-shrunk) had no such
     safety net. This is the real fix for the class of "overwidth" bugs
     reported across multiple screens, not a per-element patch. */
  *, *::before, *::after{ box-sizing: border-box; }

  :root{
    --bg: #F6F8F4;
    --surface: #FFFFFF;
    --surface-2: #EFF2EC;
    --ink: #17211D;
    --ink-soft: #5B655F;
    --line: #E1E6DD;
    --accent: #2F6F5E;
    --accent-ink: #FFFFFF;
    --accent-soft: #E3EFEA;
    --warn: #E0673F;
    --warn-soft: #FBE9E2;
    --radius-lg: 20px;
    --radius-md: 14px;
    --radius-sm: 10px;
    --shadow: 0 1px 2px rgba(23,33,29,0.04), 0 8px 24px rgba(23,33,29,0.06);
    color-scheme: light;
  }
  [data-theme="dark"]{
    --bg: #121613;
    --surface: #1B211D;
    --surface-2: #232A25;
    --ink: #EDF2EC;
    --ink-soft: #9AA79E;
    --line: #2C342E;
    --accent: #57B79B;
    --accent-ink: #0C1512;
    --accent-soft: #1E2E28;
    --warn: #E88462;
    --warn-soft: #33231C;
    --shadow: 0 1px 2px rgba(0,0,0,0.2), 0 8px 24px rgba(0,0,0,0.3);
    color-scheme: dark;
  }
  /* CSS-ONLY BUILD FINGERPRINT — deliberately independent of any JS version
     check. Browsers/CDNs cache .css files far more aggressively than JS/HTML
     and can serve a stale stylesheet even when the service worker has fully
     updated everything else. This tiny corner watermark proves definitively
     whether THIS stylesheet, not just the JS, is actually the current one. */
  body::after{
    content:"css-build: rev36-kbsave";
    position:fixed;bottom:3px;right:6px;font-size:9px;color:var(--ink-soft);
    opacity:.45;pointer-events:none;z-index:99999;
  }
  html,body{margin:0;padding:0;}
  body{
    background:var(--bg);
    color:var(--ink);
    font-family:'Inter',sans-serif;
    -webkit-font-smoothing:antialiased;
    min-height:100vh;
    transition:background .25s ease, color .25s ease;
    padding-bottom:96px;
  }
  .num, .amount, h1, h2, .brand{ font-family:'Sora',sans-serif; }
  a{color:inherit;}
  button{font-family:inherit;}
  .app{max-width:520px;margin:0 auto;padding:0 16px;overflow-x:hidden;}

  /* ---------- Topbar ---------- */
  .topbar{
    display:flex;align-items:center;justify-content:space-between;
    padding:18px 16px 6px;max-width:520px;margin:0 auto;
  }
  .brand{font-size:19px;font-weight:800;letter-spacing:-0.01em;display:flex;align-items:center;gap:8px;}
  .offline-badge{
    font-size:11px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;
    background:var(--warn-soft);color:var(--warn);padding:3px 8px;border-radius:99px;
  }
  .brand .dot{width:9px;height:9px;border-radius:50%;background:var(--accent);display:inline-block;}
  .theme-toggle{
    width:42px;height:42px;border-radius:50%;border:1px solid var(--line);
    background:var(--surface);display:flex;align-items:center;justify-content:center;
    cursor:pointer;color:var(--ink);
  }
  .theme-toggle svg{width:18px;height:18px;}

  /* ---------- Install banner ---------- */
  .install-banner{
    display:none;align-items:center;gap:12px;
    max-width:520px;margin:0 auto 4px;padding:12px 14px;
    background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-md);
    box-shadow:var(--shadow);
  }
  .install-banner.show{display:flex;}
  .install-banner-icon{width:40px;height:40px;border-radius:11px;flex-shrink:0;object-fit:cover;}
  .update-banner-icon{background:var(--accent-soft);color:var(--accent);display:flex;align-items:center;justify-content:center;}
  .update-banner-icon svg{width:19px;height:19px;}
  .install-banner-text{flex:1;min-width:0;}
  .install-banner-title{font-size:13.5px;font-weight:700;}
  .install-banner-sub{font-size:12px;color:var(--ink-soft);margin-top:1px;}
  .install-banner-btn{
    flex-shrink:0;background:var(--accent);color:var(--accent-ink);border:none;
    padding:9px 14px;border-radius:10px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit;
  }
  .install-banner-close{
    flex-shrink:0;width:28px;height:28px;border-radius:50%;background:var(--surface-2);border:none;
    display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--ink-soft);
  }
  .install-banner-close svg{width:13px;height:13px;}

  /* ---------- Setup screen ---------- */
  .setup-wrap{
    min-height:100vh;display:flex;flex-direction:column;justify-content:center;
    padding:32px 24px;max-width:440px;margin:0 auto;
  }
  .setup-icon{
    width:56px;height:56px;border-radius:16px;background:var(--accent);
    display:flex;align-items:center;justify-content:center;margin-bottom:24px;
  }
  .setup-icon svg{width:28px;height:28px;color:var(--accent-ink);}
  .setup-wrap h1{font-size:28px;line-height:1.25;margin:0 0 8px;font-weight:700;}
  .setup-wrap p{color:var(--ink-soft);margin:0 0 28px;font-size:15px;line-height:1.5;}
  .field-label{font-size:13px;font-weight:600;color:var(--ink-soft);margin-bottom:8px;display:block;text-transform:uppercase;letter-spacing:.04em;}
  input[type=text], input[type=number], input[type=date], textarea{
    width:100%;background:var(--surface);border:1.5px solid var(--line);
    border-radius:var(--radius-md);padding:14px 16px;font-size:16px;color:var(--ink);
    font-family:inherit;outline:none;transition:border-color .15s ease;
  }
  input:focus, textarea:focus{border-color:var(--accent);}
  .btn{
    display:flex;align-items:center;justify-content:center;gap:8px;
    padding:16px 20px;border-radius:var(--radius-md);border:none;
    font-size:16px;font-weight:700;cursor:pointer;width:100%;font-family:inherit;
    transition:transform .08s ease, opacity .15s ease;
  }
  .btn:active{transform:scale(0.98);}
  .btn-primary{background:var(--accent);color:var(--accent-ink);}
  .btn-primary:disabled{opacity:.4;cursor:not-allowed;}
  .btn-ghost{background:var(--surface-2);color:var(--ink);}
  .btn-danger{background:var(--warn-soft);color:var(--warn);}

  /* ---------- Cards ---------- */
  .card{
    background:var(--surface);border-radius:var(--radius-lg);
    padding:20px;box-shadow:var(--shadow);margin-bottom:14px;border:1px solid var(--line);
  }
  .welcome{font-size:22px;font-weight:700;margin:14px 0 2px;}
  .period-pill{
    display:inline-flex;align-items:center;gap:6px;background:var(--accent-soft);color:var(--accent);
    padding:7px 12px;border-radius:999px;font-size:13px;font-weight:600;margin-top:8px;
  }
  .period-pill svg{width:14px;height:14px;}

  .total-label{color:var(--ink-soft);font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px;}
  .total-amount{font-size:38px;font-weight:800;letter-spacing:-0.02em;}
  .total-amount span{font-size:20px;font-weight:600;color:var(--ink-soft);}
  .receipt-line{
    height:1px;margin:16px 0;
    background-image:repeating-linear-gradient(to right, var(--line) 0, var(--line) 6px, transparent 6px, transparent 12px);
  }
  .mini-stats{display:flex;gap:10px;}
  .mini-stat{flex:1;background:var(--surface-2);border-radius:var(--radius-sm);padding:12px;}
  .mini-stat .n{font-size:17px;font-weight:700;}
  .mini-stat .l{font-size:11.5px;color:var(--ink-soft);font-weight:600;margin-top:2px;}

  .section-title{font-size:15px;font-weight:700;margin:22px 2px 10px;display:flex;align-items:center;justify-content:space-between;}
  .link{font-size:13px;font-weight:600;color:var(--accent);cursor:pointer;}

  .cat-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line);}
  .cat-row:last-child{border-bottom:none;}
  .cat-dot{width:10px;height:10px;border-radius:3px;flex-shrink:0;}
  .cat-info{flex:1;min-width:0;}
  .cat-name{font-size:14.5px;font-weight:600;}
  .cat-bar-bg{height:5px;background:var(--surface-2);border-radius:99px;margin-top:6px;overflow:hidden;}
  .cat-bar-fill{height:100%;border-radius:99px;}
  .cat-amount{font-size:14.5px;font-weight:700;white-space:nowrap;}

  .txn-item{display:flex;align-items:center;gap:12px;padding:13px 0;border-bottom:1px solid var(--line);cursor:pointer;
    /* long-press starts multi-select — never the OS text-selection handles */
    user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;}
  .txn-item:last-child{border-bottom:none;}
  .txn-icon{width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:16px;}
  .txn-icon-wrap{position:relative;flex-shrink:0;}
  .sync-pending-dot{
    position:absolute;top:-2px;right:-2px;width:11px;height:11px;border-radius:50%;
    background:var(--warn);border:2px solid var(--surface);
  }
  .txn-mid{flex:1;min-width:0;}
  .txn-cat{font-size:14.5px;font-weight:600;}
  .txn-sub{font-size:12.5px;color:var(--ink-soft);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  /* Rows with a trailing attachment pin: the note text ellipsizes, the pin
     never gets trimmed away no matter how long the note is. */
  .txn-sub-flex{display:flex;align-items:center;gap:6px;overflow:visible;text-overflow:clip;}
  .txn-sub-flex .txn-sub-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .txn-sub-pin{flex-shrink:0;}
  .txn-tags{display:flex;gap:5px;margin-top:5px;flex-wrap:wrap;}
  .tag-chip{font-size:11px;background:var(--surface-2);color:var(--ink-soft);padding:3px 8px;border-radius:99px;font-weight:600;}
  .txn-amount{font-size:15px;font-weight:700;white-space:nowrap;}

  .empty{text-align:center;padding:34px 10px;color:var(--ink-soft);}
  .empty svg{width:36px;height:36px;margin-bottom:10px;opacity:.5;}
  .empty p{font-size:14px;margin:0;}

  /* ---------- FAB ---------- */
  .fab{
    position:fixed;bottom:24px;left:50%;transform:translateX(-50%);
    width:min(488px, calc(100% - 32px));
    display:flex;gap:10px;z-index:40;
  }
  .fab-btn{
    flex:1;background:var(--accent);color:var(--accent-ink);border:none;border-radius:16px;
    padding:16px;font-size:15.5px;font-weight:700;display:flex;align-items:center;justify-content:center;gap:8px;
    box-shadow:0 10px 30px rgba(47,111,94,0.35);cursor:pointer;font-family:inherit;
  }
  [data-theme="dark"] .fab-btn{box-shadow:0 10px 30px rgba(0,0,0,0.5);}
  .fab-btn:active{transform:scale(0.97);}
  .fab-btn svg{width:18px;height:18px;}

  /* ---------- Tabs ---------- */
  .tabs{display:flex;gap:6px;background:var(--surface-2);padding:4px;border-radius:12px;margin:14px 0 16px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;cursor:grab;}
  .tabs.dragging{cursor:grabbing;user-select:none;}
  .tabs::-webkit-scrollbar{display:none;}
  .tab{flex:0 0 auto;text-align:center;padding:10px 14px;border-radius:9px;font-size:13px;font-weight:700;cursor:pointer;color:var(--ink-soft);white-space:nowrap;}
  .tab.active{background:var(--surface);color:var(--ink);box-shadow:var(--shadow);}
  .tab-badge{
    display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;
    padding:0 4px;margin-left:5px;border-radius:99px;background:var(--warn);color:#fff;
    font-size:10px;font-weight:800;vertical-align:middle;
  }
  .pending-raw-text{
    background:var(--surface-2);border-radius:var(--radius-sm);padding:12px 14px;
    font-size:12.5px;color:var(--ink-soft);line-height:1.5;white-space:pre-wrap;word-break:break-word;
    max-height:110px;overflow-y:auto;
  }
  .pending-txn-row{display:flex;align-items:center;gap:12px;padding:13px 0;border-bottom:1px solid var(--line);cursor:pointer;}
  .pending-txn-row:last-child{border-bottom:none;}
  .pending-txn-icon{width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:16px;background:var(--warn-soft);color:var(--warn);}
  .pending-txn-mid{flex:1;min-width:0;}
  .pending-txn-title{font-size:14.5px;font-weight:600;}
  .pending-txn-sub{font-size:12px;color:var(--ink-soft);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .pending-txn-amount{font-size:15px;font-weight:700;white-space:nowrap;}
  .pending-txn-actions{display:flex;gap:6px;margin-top:8px;}
  .pending-txn-actions button{
    flex:1;padding:8px;border-radius:var(--radius-sm);border:none;font-size:12.5px;font-weight:700;
    cursor:pointer;font-family:inherit;
  }
  .pending-txn-confirm-btn{background:var(--accent);color:var(--accent-ink);}
  .pending-txn-edit-btn{background:var(--surface-2);color:var(--ink);}
  .pending-txn-delete-btn{background:var(--warn-soft);color:var(--warn);}

  /* ---------- Swipeable tab carousel ---------- */
  .tab-viewport{overflow:hidden;width:100%;position:relative;}
  .tab-track{display:flex;align-items:flex-start;will-change:transform;}
  .tab-panel{flex-shrink:0;min-width:0;margin-right:20px;}

  /* ---------- Search / filter ---------- */
  .search-row{display:flex;gap:8px;margin-bottom:12px;}
  .search-box{flex:1;min-width:0;position:relative;}
  .search-box input{padding-left:40px;}
  .search-box svg{position:absolute;left:14px;top:50%;transform:translateY(-50%);width:16px;height:16px;color:var(--ink-soft);}
  .filter-btn{
    width:48px;flex-shrink:0;background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius-md);
    display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;
  }
  .filter-btn.active{border-color:var(--accent);color:var(--accent);}
  .filter-btn svg{width:18px;height:18px;}
  .filter-dot{position:absolute;top:8px;right:9px;width:7px;height:7px;border-radius:50%;background:var(--accent);}

  .chip-row{display:flex;gap:8px;overflow-x:auto;padding-bottom:6px;margin-bottom:6px;}
  .chip-row::-webkit-scrollbar{display:none;}
  .fchip{
    flex-shrink:0;padding:9px 14px;border-radius:99px;background:var(--surface);border:1.5px solid var(--line);
    font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap;color:var(--ink-soft);
  }
  .fchip.active{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);}

  /* ---------- Confirm Dialog (replaces native confirm/alert) ---------- */
  .confirm-overlay{
    position:fixed;inset:0;background:rgba(10,15,12,0.5);z-index:200;
    display:none;align-items:center;justify-content:center;
    backdrop-filter:blur(2px);padding:24px;
  }
  .confirm-overlay.open{display:flex;}
  .confirm-card{
    background:var(--surface);width:100%;max-width:340px;border-radius:20px;
    padding:26px 24px 20px;box-shadow:var(--shadow);
    animation:confirmPop .18s cubic-bezier(.2,.8,.2,1);
    text-align:center;
  }
  @keyframes confirmPop{from{transform:scale(.94);opacity:0;}to{transform:scale(1);opacity:1;}}
  .confirm-icon{
    width:48px;height:48px;border-radius:50%;margin:0 auto 16px;
    display:flex;align-items:center;justify-content:center;
  }
  .confirm-icon svg{width:22px;height:22px;}
  .confirm-icon.danger{background:var(--warn-soft);color:var(--warn);}
  .confirm-icon.neutral{background:var(--accent-soft);color:var(--accent);}
  .confirm-title{font-size:17px;font-weight:700;margin:0 0 6px;}
  .confirm-message{font-size:13.5px;color:var(--ink-soft);line-height:1.5;margin:0 0 22px;}
  .confirm-actions{display:flex;gap:10px;}
  .btn-danger-solid{background:var(--warn);color:#fff;}

  /* ---------- Export ---------- */
  .export-preview{
    background:var(--surface-2);border:1px solid var(--line);border-radius:var(--radius-md);
    padding:14px 16px;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;
    font-size:12.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word;
    max-height:280px;overflow-y:auto;color:var(--ink);margin-top:4px;
  }

  /* ---------- Category management ---------- */
  .emoji-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;}
  .emoji-choice{
    aspect-ratio:1;border-radius:11px;background:var(--surface);border:1.5px solid var(--line);
    display:flex;align-items:center;justify-content:center;font-size:19px;cursor:pointer;
  }
  .emoji-choice.selected{border-color:var(--accent);background:var(--accent-soft);}
  .cat-manage-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line);cursor:pointer;}
  .cat-manage-row:last-child{border-bottom:none;}
  .cat-manage-icon{width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;font-size:17px;flex-shrink:0;}
  .cat-manage-name{font-size:14.5px;font-weight:600;flex:1;}
  .cat-manage-chevron{color:var(--ink-soft);flex-shrink:0;}
  .cat-manage-chevron svg{width:16px;height:16px;}

  /* ---------- Moneybox ---------- */
  .moneybox-row{display:flex;align-items:center;gap:12px;padding:13px 0;border-bottom:1px solid var(--line);cursor:pointer;}
  .moneybox-row:last-child{border-bottom:none;}
  .moneybox-icon{width:40px;height:40px;border-radius:12px;background:var(--accent-soft);display:flex;align-items:center;justify-content:center;font-size:19px;flex-shrink:0;}
  .moneybox-name{font-size:14.5px;font-weight:600;flex:1;}
  .moneybox-balance{font-size:15px;font-weight:700;white-space:nowrap;}
  .moneybox-detail-header{text-align:center;margin-bottom:14px;}
  .moneybox-detail-icon{font-size:34px;margin-bottom:8px;}
  .moneybox-history-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line);cursor:pointer;}
  .moneybox-history-row:active{background:var(--surface-2);}
  .moneybox-history-chevron{width:16px;height:16px;color:var(--ink-soft);opacity:.5;flex-shrink:0;}
  .moneybox-history-row:last-child{border-bottom:none;}
  .moneybox-history-icon{width:34px;height:34px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:15px;flex-shrink:0;}

  /* ---------- Modal / Sheet ---------- */
  .overlay{
    position:fixed;inset:0;background:rgba(10,15,12,0.5);z-index:100;
    display:none;align-items:flex-end;justify-content:center;
    backdrop-filter:blur(2px);
  }
  .overlay.open{display:flex;}
  .sheet{
    background:var(--bg);width:100%;max-width:520px;max-height:92vh;overflow-y:auto;
    border-radius:24px 24px 0 0;padding:8px 20px 28px;
    animation:slideUp .25s cubic-bezier(.2,.8,.2,1);
  }
  @keyframes slideUp{from{transform:translateY(24px);opacity:0;}to{transform:translateY(0);opacity:1;}}
  .sheet-handle{width:36px;height:4px;background:var(--line);border-radius:99px;margin:10px auto 14px;}
  .sheet-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px;}
  .sheet-head h2{font-size:19px;margin:0;font-weight:700;}
  .sheet-close{
    width:34px;height:34px;border-radius:50%;background:var(--surface-2);border:none;
    display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--ink);
  }
  .sheet-close svg{width:16px;height:16px;}

  .amount-input-wrap{display:flex;align-items:center;background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius-md);padding:6px 16px;}
  .amount-input-wrap span{font-size:22px;font-weight:700;color:var(--ink-soft);margin-right:6px;}
  .amount-input-wrap input{border:none;padding:10px 0;font-size:26px;font-weight:700;background:transparent;}
  .amount-input-wrap input:focus{outline:none;}

  .radio-grid{display:flex;flex-direction:column;gap:10px;}
  .radio-opt{
    display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:var(--radius-md);
    border:1.5px solid var(--line);background:var(--surface);cursor:pointer;
  }
  .radio-opt.checked{border-color:var(--accent);background:var(--accent-soft);}
  .radio-circle{width:20px;height:20px;border-radius:50%;border:2px solid var(--line);flex-shrink:0;display:flex;align-items:center;justify-content:center;}
  .radio-opt.checked .radio-circle{border-color:var(--accent);}
  .radio-circle .dotfill{width:10px;height:10px;border-radius:50%;background:var(--accent);display:none;}
  .radio-opt.checked .dotfill{display:block;}
  .radio-emoji{font-size:18px;}
  .radio-text{font-size:14.5px;font-weight:600;flex:1;}

  .field{margin-bottom:18px;}

  .tag-input-wrap{border:1.5px solid var(--line);border-radius:var(--radius-md);background:var(--surface);padding:10px;overflow:hidden;}
  .tag-selected{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px;}
  .tag-selected:empty{display:none;}
  .tag-pill{
    display:flex;align-items:center;gap:6px;background:var(--accent);color:var(--accent-ink);
    padding:6px 10px;border-radius:99px;font-size:12.5px;font-weight:600;
  }
  .tag-pill button{background:none;border:none;color:inherit;cursor:pointer;padding:0;display:flex;font-size:14px;line-height:1;opacity:.8;}
  .tag-text-input{border:none;padding:8px 4px;font-size:14.5px;width:100%;background:transparent;}
  .tag-text-input:focus{outline:none;}
  /* One scrollable row — many tags no longer stack into a wall of chips.
     Swipe sideways to reach the rest; scrollbar hidden for a clean look. */
  .tag-suggest{
    display:block;width:100%;max-width:100%;
    white-space:nowrap;margin-top:8px;
    overflow-x:auto;padding-bottom:4px;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
  }
  .tag-suggest::-webkit-scrollbar{display:none;}
  .tag-suggest .tag-suggest-chip{display:inline-flex;vertical-align:top;white-space:nowrap;max-width:220px;overflow:hidden;text-overflow:ellipsis;margin-right:7px;}
  .tag-suggest-chip{
    padding:7px 12px;border-radius:99px;background:var(--surface-2);font-size:12.5px;font-weight:600;
    cursor:pointer;color:var(--ink-soft);display:flex;align-items:center;gap:4px;
  }
  .tag-suggest-chip .freq{opacity:.6;font-weight:500;}

  /* ---------- Attachments ---------- */
  .attach-btn-row{display:flex;gap:8px;}
  .attach-btn-row .attach-add-btn{flex:1 1 auto;width:auto;padding:12px 14px;font-size:14.5px;}
  .attach-btn-row .attach-cam-btn{flex:0 0 54px;width:auto;padding:12px 0;font-size:19px;line-height:1;}
  .attach-hint{font-size:11px;color:var(--ink-soft);margin-top:6px;}
  .attach-list{display:flex;flex-direction:column;gap:8px;margin-bottom:10px;}
  .attach-row{
    display:flex;align-items:center;gap:10px;background:var(--surface);border:1.5px solid var(--line);
    border-radius:var(--radius-sm);padding:10px 12px;
  }
  .attach-pending-row{background:var(--warn-soft);border-color:var(--warn);border-style:dashed;}
  .attach-icon{font-size:18px;flex-shrink:0;width:28px;text-align:center;}
  .attach-mid{flex:1;min-width:0;}
  .attach-name{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .attach-name a{color:inherit;text-decoration:none;}
  .attach-name a:hover{text-decoration:underline;}
  .attach-meta{font-size:11.5px;color:var(--ink-soft);margin-top:1px;}
  .attach-note-input{
    width:100%;border:none;background:transparent;font-size:12px;color:var(--ink-soft);
    padding:4px 0 0;font-family:inherit;
  }
  .attach-note-input:focus{outline:none;color:var(--ink);}
  .attach-note-input::placeholder{color:var(--ink-soft);opacity:.7;}
  .attach-remove{
    flex-shrink:0;width:26px;height:26px;border-radius:50%;background:var(--surface-2);border:none;
    display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--ink-soft);
  }
  .attach-remove svg{width:12px;height:12px;}
  .attach-progress-bg{height:4px;background:var(--surface-2);border-radius:99px;margin-top:6px;overflow:hidden;}
  .attach-progress-fill{height:100%;background:var(--accent);border-radius:99px;transition:width .15s ease;}
  .attach-uploading .attach-name{color:var(--ink-soft);}
  .tag-suggest-chip:hover{background:var(--accent-soft);color:var(--accent);}

  .sheet-actions{display:flex;gap:10px;margin-top:8px;}

  select.native-date{appearance:none;}
  .toast{
    position:fixed;bottom:100px;left:50%;transform:translateX(-50%);
    max-width:calc(100vw - 48px);width:max-content;
    background:var(--ink);color:var(--bg);padding:12px 18px;border-radius:16px;font-size:13.5px;
    font-weight:600;z-index:200;opacity:0;pointer-events:none;transition:opacity .2s ease, transform .2s ease;
    white-space:normal;text-align:center;line-height:1.4;
  }
  .toast.show{opacity:1;transform:translateX(-50%) translateY(-6px);}

  /* Floating "Save" that appears ONLY while the keyboard is covering the
     sheet's real Save button (see 31-keyboard-save.js). Deliberately NOT
     full-width and NOT centered — a small pill tucked to the right, clear
     of where a thumb is actively tapping keys, so it's reachable in one
     motion but hard to hit by accident while typing. */
  .keyboard-save-btn{
    position:fixed;right:16px;z-index:210;
    background:var(--accent);color:var(--accent-ink);border:none;
    padding:11px 20px;border-radius:99px;font-size:14px;font-weight:700;
    box-shadow:0 4px 14px rgba(0,0,0,0.25);cursor:pointer;
    transition:bottom .12s ease, opacity .15s ease;
    opacity:0;pointer-events:none;
  }
  .keyboard-save-btn.show{opacity:1;pointer-events:auto;}

  .loader{display:flex;align-items:center;justify-content:center;min-height:100vh;color:var(--ink-soft);font-size:14px;}
  .spin{width:22px;height:22px;border:2.5px solid var(--line);border-top-color:var(--accent);border-radius:50%;animation:sp .7s linear infinite;margin-right:10px;}
  @keyframes sp{to{transform:rotate(360deg);}}

  .other-type-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px;}
  .other-type-chip{flex:1 1 90px;text-align:center;padding:10px 6px;border-radius:var(--radius-sm);border:1.5px solid var(--line);background:var(--surface);font-size:12.5px;font-weight:700;cursor:pointer;color:var(--ink-soft);}
  .other-type-chip.checked{border-color:var(--accent);background:var(--accent-soft);color:var(--accent);}

  .filter-custom-range{display:flex;align-items:center;gap:8px;margin-top:10px;}
  .filter-custom-range input[type=date]{flex:1;min-width:0;}
  .filter-custom-range span{color:var(--ink-soft);font-size:12.5px;flex-shrink:0;}
  .filter-summary{display:flex;align-items:center;gap:8px;margin:0 2px 12px;padding:8px 12px;
    background:var(--accent-soft);border:1px solid var(--accent);border-radius:var(--radius-sm);
    color:var(--accent);font-size:12.5px;font-weight:600;}
  .filter-summary-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .filter-summary-clear{flex-shrink:0;background:none;border:none;color:inherit;font-weight:800;
    font-size:15px;cursor:pointer;padding:0 2px;line-height:1;}

  .session-badge{
    display:inline-flex;align-items:center;margin-left:8px;padding:3px 9px;border-radius:999px;
    font-size:10.5px;font-weight:700;letter-spacing:.02em;vertical-align:middle;cursor:pointer;
    background:var(--accent-soft);color:var(--accent);border:1px solid var(--accent);
    max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .session-badge.own{background:var(--surface-2);color:var(--ink-soft);border-color:var(--line);}

  input.code-locked{
    background:var(--surface-2);color:var(--ink-soft);border-style:dashed;
    pointer-events:none;font-size:12px;
  }

  /* ---------- Budget periods (M4) ---------- */
  .period-switcher{display:flex;align-items:center;gap:8px;}
  .period-arrow{
    width:34px;height:34px;border-radius:50%;border:1px solid var(--line);background:var(--surface);
    color:var(--ink);font-size:19px;font-weight:800;cursor:pointer;flex-shrink:0;line-height:1;
    display:flex;align-items:center;justify-content:center;font-family:inherit;padding:0 0 2px;
  }
  .period-pill{cursor:pointer;min-width:0;}
  .period-status{
    font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;
    padding:2px 7px;border-radius:999px;margin-left:6px;flex-shrink:0;
  }
  .period-pill.p-current .period-status{background:var(--accent);color:#fff;}
  .period-pill.p-past{background:var(--surface-2);color:var(--ink-soft);border-color:var(--line);}
  .period-pill.p-past .period-status{background:var(--ink-soft);color:var(--surface);}
  .period-pill.p-future{border-style:dashed;border-color:#4A7FB5;color:#4A7FB5;background:transparent;}
  .period-pill.p-future .period-status{background:#4A7FB5;color:#fff;}
  .period-notice{
    display:flex;align-items:center;gap:8px;margin:0 2px 12px;padding:8px 12px;
    border-radius:var(--radius-sm);font-size:12.5px;font-weight:600;cursor:pointer;
  }
  .period-notice.p-past{background:var(--surface-2);color:var(--ink-soft);border:1px solid var(--line);}
  .period-notice.p-future{border:1px dashed #4A7FB5;color:#4A7FB5;background:transparent;}
  .period-list-status{font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;padding:2px 7px;border-radius:999px;flex-shrink:0;}
  .period-list-status.ended{background:var(--surface-2);color:var(--ink-soft);}
  .period-list-status.current{background:var(--accent);color:#fff;}
  .period-list-status.upcoming{background:#4A7FB5;color:#fff;}

  /* ---------- Modal focus & tap feedback ---------- */
  *{-webkit-tap-highlight-color:transparent;} /* no blue flash between tap and sheet */
  .txn-item:active{background:var(--surface-2);border-radius:10px;} /* our own subtle press state */
  body.modal-open{overflow:hidden;} /* page behind a modal never scrolls */
  .overlay, .sheet{overscroll-behavior:contain;}
  .sheet-handle, .sheet-head{touch-action:none;} /* the drag-to-dismiss grip */
  .mini-picker .mini-opt.picked{
    background:var(--accent-soft);border-color:var(--accent);
    box-shadow:inset 0 0 0 1px var(--accent);
  }
  .mini-picker-actions{display:flex;gap:10px;margin-top:14px;}
  .mini-picker-actions .btn{flex:1;}
  .mini-picker-actions .btn:disabled{opacity:.45;}

  /* ---------- Multi-select (long-press) ---------- */
  .txn-item.sel-selected{
    background:var(--accent-soft);
    box-shadow:inset 0 0 0 2px var(--accent);
    border-radius:12px;
    /* bleed to the card edges so the WHOLE row box highlights */
    margin-left:-20px;margin-right:-20px;
    padding-left:20px;padding-right:20px;
    border-bottom-color:transparent;
  }
  body.selection-active .fab{display:none !important;}
  body.selection-active .txn-item{user-select:none;-webkit-user-select:none;}
  .selection-bar{
    position:fixed;left:50%;transform:translateX(-50%);
    bottom:calc(20px + var(--sa-bottom, 0px));
    width:min(520px, calc(100% - 24px));
    background:var(--surface);border:1px solid var(--accent);border-radius:16px;
    box-shadow:0 8px 30px rgba(0,0,0,.18);
    display:flex;flex-direction:column;gap:10px;
    padding:12px 14px;z-index:120;
  }
  .selection-head{display:flex;align-items:center;justify-content:space-between;gap:10px;}
  .selection-count{font-weight:800;font-size:13.5px;color:var(--accent);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .selection-actions{display:flex;gap:8px;overflow-x:auto;padding-bottom:2px;-webkit-overflow-scrolling:touch;}
  .selection-actions .sel-btn{flex-shrink:0;white-space:nowrap;}
  .sel-close{padding:6px 11px;border-radius:999px;}
  .sel-btn{
    background:var(--surface-2);border:1px solid var(--line);border-radius:10px;
    padding:8px 12px;font-size:12.5px;font-weight:700;color:var(--ink);cursor:pointer;font-family:inherit;
  }
  .sel-btn.sel-danger{color:var(--warn);border-color:var(--warn);}
  .mini-picker-overlay{
    position:fixed;inset:0;z-index:300;background:rgba(0,0,0,.45);
    display:flex;align-items:center;justify-content:center;padding:24px;
  }
  .mini-picker{
    background:var(--surface);border-radius:16px;padding:18px;width:min(360px,100%);
    max-height:70vh;overflow-y:auto;
  }
  .mini-picker h3{margin:0 0 4px;font-size:15.5px;}
  .mini-picker .mini-sub{font-size:12px;color:var(--ink-soft);margin:0 0 12px;}
  .mini-picker .mini-opt{
    display:flex;align-items:center;gap:10px;padding:11px 12px;border:1px solid var(--line);
    border-radius:10px;margin-bottom:8px;cursor:pointer;font-size:13.5px;font-weight:600;
  }
  .mini-picker .mini-opt:active{background:var(--accent-soft);}

  /* ---------- Budget ---------- */
  .link-btn{font-size:13px;font-weight:600;color:var(--accent);cursor:pointer;flex-shrink:0;}
  .budget-progress-text{font-size:12.5px;color:var(--ink-soft);margin-top:7px;font-weight:600;}
  .quick-add-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px;}
  .qa-chip{
    padding:7px 12px;border-radius:99px;background:var(--surface-2);font-size:12px;font-weight:700;
    color:var(--ink-soft);cursor:pointer;border:1px solid var(--line);user-select:none;
  }
  .qa-chip:hover{background:var(--accent-soft);color:var(--accent);border-color:var(--accent);}
  .qa-custom-row{display:none;gap:8px;margin-top:8px;align-items:center;width:100%;}
  .qa-custom-row input{flex:1;padding:9px 12px;font-size:13.5px;border:1.5px solid var(--line);border-radius:var(--radius-sm);background:var(--surface);color:var(--ink);font-family:inherit;}
  .qa-custom-row input:focus{outline:none;border-color:var(--accent);}
  .qa-custom-row button{padding:9px 14px;border-radius:var(--radius-sm);border:none;background:var(--accent);color:var(--accent-ink);font-weight:700;font-size:13px;cursor:pointer;font-family:inherit;}

  .switch{position:relative;display:inline-block;width:44px;height:26px;flex-shrink:0;}
  .switch input{opacity:0;width:0;height:0;position:absolute;}
  .switch-slider{position:absolute;cursor:pointer;inset:0;background:var(--surface-2);border:1.5px solid var(--line);border-radius:99px;transition:.2s ease;}
  .switch-slider:before{content:"";position:absolute;height:18px;width:18px;left:3px;top:2.5px;background:var(--surface);border:1px solid var(--line);border-radius:50%;transition:.2s ease;}
  .switch input:checked + .switch-slider{background:var(--accent);border-color:var(--accent);}
  .switch input:checked + .switch-slider:before{transform:translateX(18px);background:#fff;border-color:transparent;}

  .budget-cat-row{padding:16px 0;border-bottom:1px solid var(--line);}
  .budget-cat-row:last-child{border-bottom:none;}
  .budget-cat-label{font-size:14px;font-weight:600;margin-bottom:9px;}
  .amount-input-wrap.small{padding:4px 14px;}
  .amount-input-wrap.small input{font-size:18px;padding:9px 0;}
  .cat-limit-sub{font-size:11px;font-weight:600;margin-top:2px;}
  .cat-amount-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:2px;}
  .cat-pct{font-size:11px;color:var(--ink-soft);font-weight:600;white-space:nowrap;}
  .date-group{margin-bottom:16px;}
  .date-group:last-child{margin-bottom:0;}
  .date-group-header{display:flex;align-items:baseline;justify-content:space-between;padding:0 4px 8px;}
  .date-group-label{font-size:12px;font-weight:700;color:var(--ink-soft);text-transform:uppercase;letter-spacing:.04em;}
  .date-group-total{font-size:12.5px;font-weight:700;color:var(--ink-soft);}

  /* ---------- Month groups (Transactions list) ---------- */
  .month-group{margin-bottom:14px;}
  .month-group:last-child{margin-bottom:0;}
  .month-group-header{
    width:100%;display:flex;align-items:center;gap:10px;
    background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-md);
    padding:14px 16px;cursor:pointer;font-family:inherit;text-align:left;color:var(--ink);
  }
  .month-group-header:active{transform:scale(0.99);}
  .month-group-chevron{display:flex;align-items:center;justify-content:center;color:var(--ink-soft);transition:transform .2s ease;flex-shrink:0;}
  .month-group-chevron svg{width:16px;height:16px;}
  .month-group-chevron.expanded{transform:rotate(90deg);}
  .month-group-label{font-size:14.5px;font-weight:700;flex:1;min-width:0;}
  .month-group-meta{font-size:12px;font-weight:600;color:var(--ink-soft);white-space:nowrap;}
  .month-group-body{margin-top:12px;}
  .txn-list-toggle-all{font-size:12.5px;font-weight:600;color:var(--accent);cursor:pointer;}

  /* ---------- Commitments ---------- */
  .commit-row{display:flex;align-items:center;gap:12px;padding:13px 0;border-bottom:1px solid var(--line);cursor:pointer;}
  .commit-row:last-child{border-bottom:none;}
  .commit-check{width:24px;height:24px;border-radius:7px;border:2px solid var(--line);flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--surface);color:var(--accent-ink);transition:background .12s ease, border-color .12s ease;}
  .commit-check.checked{background:var(--accent);border-color:var(--accent);}
  .commit-check svg{width:14px;height:14px;}
  .commit-mid{flex:1;min-width:0;}
  .commit-name{font-size:14.5px;font-weight:600;}
  .commit-name.paid{color:var(--ink-soft);text-decoration:line-through;}
  .commit-note{font-size:12px;color:var(--ink-soft);margin-top:3px;}
  .commit-amount{font-size:14.5px;font-weight:700;white-space:nowrap;}
  .commit-amount.paid{color:var(--ink-soft);text-decoration:line-through;font-weight:600;}

  /* ---------- Refunds ---------- */
  .subtabs{display:flex;gap:6px;background:var(--surface-2);padding:4px;border-radius:12px;margin:14px 0 16px;}
  .subtab{flex:1;text-align:center;padding:9px;border-radius:9px;font-size:13px;font-weight:700;cursor:pointer;color:var(--ink-soft);}
  .subtab.active{background:var(--surface);color:var(--ink);box-shadow:var(--shadow);}

  #refundLinkSearchWrap input{margin-bottom:0;}
  .refund-link-results{max-height:230px;overflow-y:auto;border:1.5px solid var(--line);border-radius:var(--radius-md);margin-top:8px;background:var(--surface);}
  .refund-link-results:empty{display:none;}
  .refund-link-row{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--line);cursor:pointer;}
  .refund-link-row:last-child{border-bottom:none;}
  .refund-link-row:hover{background:var(--surface-2);}
  .refund-link-empty{padding:16px;text-align:center;color:var(--ink-soft);font-size:13px;}
  .refund-link-icon{width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:14px;}

  .refund-linked-chip{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--accent-soft);border:1.5px solid var(--accent);border-radius:var(--radius-md);padding:12px 14px;margin-bottom:4px;}
  .refund-linked-chip .info{font-size:13.5px;font-weight:700;color:var(--ink);}
  .refund-linked-chip .sub{font-size:12px;color:var(--ink-soft);margin-top:2px;font-weight:500;}
  .refund-linked-chip button{background:none;border:none;color:var(--accent);font-weight:700;font-size:12.5px;cursor:pointer;flex-shrink:0;}

  .exceed-note{background:var(--warn-soft);color:var(--warn);border-radius:var(--radius-sm);padding:10px 12px;font-size:12px;font-weight:600;margin-top:10px;line-height:1.45;}

  .refund-item{display:flex;align-items:center;gap:12px;padding:13px 0;border-bottom:1px solid var(--line);cursor:pointer;}
  .refund-item:last-child{border-bottom:none;}
  .refund-icon{width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:16px;background:var(--accent-soft);color:var(--accent);}
  .refund-amount{font-size:15px;font-weight:700;color:var(--accent);white-space:nowrap;}

  .refund-summary-row{display:flex;justify-content:space-between;align-items:flex-start;}
  .refund-summary-figure{font-size:26px;font-weight:800;color:var(--accent);letter-spacing:-0.02em;}

  /* ---------- SYSTEM SAFE-AREA INSETS (edge-to-edge) ----------
     Android 15+ draws the app edge-to-edge, so bottom-anchored UI must clear
     the gesture/navigation bar and top UI must clear the status bar.
     Capacitor injects --safe-area-inset-* into the native WebView; browsers
     provide env(safe-area-inset-*). Cover both, defaulting to 0. */
  :root{
    --sa-bottom: var(--safe-area-inset-bottom, env(safe-area-inset-bottom, 0px));
    --sa-top:    var(--safe-area-inset-top,    env(safe-area-inset-top,    0px));
  }
  body{ padding-bottom: calc(96px + var(--sa-bottom)); padding-top: var(--sa-top); }
  .fab{ bottom: calc(24px + var(--sa-bottom)); }
  .toast{ bottom: calc(100px + var(--sa-bottom)); }
  .sheet{ padding-bottom: calc(28px + var(--sa-bottom)); }
