:root{
  --ink:#1D2B33;
  --ink-soft:#5B6B70;
  --paper:#FBF7EE;
  --paper-line:#E7DFCC;
  --teal:#0F4C3A;
  --teal-deep:#0A3529;
  --teal-soft:#E3EEE8;
  --sage:#7FA88E;
  --stamp:#C23B22;
  --stamp-soft:#F7E1DA;
  --amber:#B9790A;
  --amber-soft:#FBEDD1;
  --gold:#D8B85C;
  --radius:14px;
  --shadow: 0 8px 24px rgba(15,76,58,0.10), 0 2px 6px rgba(15,76,58,0.08);
}
*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
body{
  background:var(--paper);
  background-image:
    repeating-linear-gradient(var(--paper) 0 27px, var(--paper-line) 27px 28px);
  background-attachment:local;
  color:var(--ink);
  font-family:"Noto Sans TC","IBM Plex Mono",sans-serif;
  -webkit-font-smoothing:antialiased;
  min-height:100vh;
}
.app{max-width:480px;margin:0 auto;min-height:100vh;background:transparent;position:relative;padding-bottom:78px;}

/* ---------- Cover / balance header ---------- */
.cover{
  background:linear-gradient(155deg,var(--teal) 0%,var(--teal-deep) 100%);
  color:#F3EFE1;
  padding:calc(26px + env(safe-area-inset-top)) 20px 22px;
  position:relative;
  overflow:hidden;
  border-bottom-left-radius:22px;
  border-bottom-right-radius:22px;
  box-shadow:var(--shadow);
}
.cover::before{
  content:"";
  position:absolute; top:-40px; right:-40px;
  width:150px;height:150px;border-radius:50%;
  background:radial-gradient(circle, rgba(216,184,92,0.16), transparent 70%);
}
.cover-top{display:flex;justify-content:space-between;align-items:flex-start;}
.cover-title{font-family:"Noto Serif TC";font-weight:900;font-size:20px;letter-spacing:.06em;}
.cover-sub{font-size:11px;color:#BFD8CB;margin-top:3px;letter-spacing:.08em;}
.whoami{
  font-size:11px; background:rgba(255,255,255,0.12); padding:4px 10px;border-radius:999px;
  color:#E9EFE9; border:1px solid rgba(255,255,255,0.18); cursor:pointer;
  transition: all 0.2s;
}
.whoami:active{ transform: scale(0.95); background: rgba(255,255,255,0.2); }
.balance-row{margin-top:22px;}
.balance-label{font-size:12px;color:#AFCDBD;letter-spacing:.1em;}
.balance-amount{
  font-family:"IBM Plex Mono";font-weight:700;font-size:40px;line-height:1.15;margin-top:2px;
  font-variant-numeric:tabular-nums;
  transition: color 0.3s;
}
.balance-amount.negative{color:#F2B6A6;}
.holders{
  display:flex;gap:10px;margin-top:16px;
}
.holder-chip{
  flex:1;background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.15);
  border-radius:10px;padding:8px 10px;font-size:12px;
}
.holder-chip b{display:block;font-family:"IBM Plex Mono";font-size:14px;margin-top:2px;}
.stamp-mark{
  position:absolute; right:16px; bottom:14px; width:46px;height:46px;
  border:2px solid rgba(216,184,92,0.55); border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  color:rgba(216,184,92,0.65); font-family:"Noto Serif TC"; font-weight:700; font-size:13px;
  transform:rotate(-14deg); letter-spacing:.05em;
}

/* ---------- low balance banner ---------- */
.banner{
  margin:14px 16px 0; background:var(--amber-soft); border:1px dashed var(--amber);
  border-radius:var(--radius); padding:12px 14px; font-size:13px; color:#7A5308;
  animation: slideDown 0.3s ease-out;
}
@keyframes slideDown {
  from { opacity: 0; transform: translateY(-10px); }
  to { opacity: 1; transform: translateY(0); }
}
.banner b{color:var(--amber);}
.banner-actions{display:flex;gap:8px;margin-top:10px;}
.btn-mini{
  flex:1; background:#fff; border:1px solid var(--amber); color:#7A5308;
  padding:8px 6px;border-radius:9px;font-size:12px;font-weight:700;font-family:"IBM Plex Mono";
  cursor: pointer;
  transition: all 0.2s;
}
.btn-mini:active { transform: scale(0.96); background: var(--amber-soft); }

/* ---------- quick actions ---------- */
.quick{display:flex;gap:10px;margin:16px 16px 0;}
.quick button{
  flex:1;padding:13px 8px;border-radius:12px;font-size:13.5px;font-weight:700;
  border:none;cursor:pointer;font-family:"Noto Sans TC";
  transition: all 0.2s;
}
.quick button:active { transform: scale(0.96); }
.quick .primary{background:var(--stamp);color:#fff;box-shadow:0 6px 14px rgba(194,59,34,.28);}
.quick .secondary{background:var(--teal-soft);color:var(--teal-deep);}

/* ---------- section titles ---------- */
.section-title{
  margin:22px 16px 8px; font-size:13px; color:var(--ink-soft); letter-spacing:.08em;
  display:flex;justify-content:space-between;align-items:center;
}
.section-title span.count{
  background:var(--stamp);color:#fff;border-radius:999px;font-size:11px;padding:1px 7px;
  font-family:"IBM Plex Mono";
}

/* ---------- ledger rows (passbook lines) ---------- */
.ledger{margin:0 16px;background:#fff;border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;}
.row{
  display:flex; align-items:center; gap:10px; padding:12px 14px;
  border-bottom:1px solid var(--paper-line); font-size:13px; position:relative;
  transition: background-color 0.2s;
}
.row:last-child{border-bottom:none;}
.row .cat-dot{width:8px;height:8px;border-radius:50%;background:var(--sage);flex-shrink:0;}
.row .cat-dot.deposit{background:var(--gold);}
.row .cat-dot.pending{background:var(--amber);}
.row .cat-dot.rejected{background:#B0463B;opacity:.5;}
.row-main{flex:1;min-width:0;}
.row-item{font-weight:600;font-size:13.5px;}
.row-meta{color:var(--ink-soft);font-size:11px;margin-top:2px;font-family:"IBM Plex Mono";}
.row-amt{font-family:"IBM Plex Mono";font-weight:700;font-size:14px;white-space:nowrap;font-variant-numeric:tabular-nums;}
.row-amt.out{color:var(--stamp);}
.row-amt.in{color:var(--teal);}
.row-run{font-family:"IBM Plex Mono";font-size:10px;color:var(--ink-soft);white-space:nowrap;margin-top:2px;text-align:right;}
.empty{padding:28px 16px;text-align:center;color:var(--ink-soft);font-size:13px;}

/* approval card */
.approve-card{margin:0 16px 12px;background:#fff;border-radius:var(--radius);box-shadow:var(--shadow);padding:14px;position:relative;overflow:hidden;}
.approve-card .top{display:flex;justify-content:space-between;align-items:flex-start;}
.approve-card .item{font-weight:700;font-size:15px;}
.approve-card .meta{font-size:11.5px;color:var(--ink-soft);margin-top:3px;font-family:"IBM Plex Mono";}
.approve-card .amt{font-family:"IBM Plex Mono";font-weight:700;font-size:18px;color:var(--stamp);}
.approve-card .note{font-size:12.5px;color:var(--ink-soft);margin-top:8px;background:var(--paper);padding:8px 10px;border-radius:8px;}
.approve-actions{display:flex;gap:8px;margin-top:12px;}
.approve-actions button{
  flex:1;padding:10px;border-radius:9px;border:none;font-weight:700;font-size:13px;cursor:pointer;
  transition: all 0.2s;
}
.approve-actions button:active{ transform: scale(0.95); }
.btn-approve{background:var(--teal);color:#fff;}
.btn-reject{background:#fff;border:1px solid var(--stamp) !important;color:var(--stamp);}
.reject-box{display:none;margin-top:10px;gap:8px;flex-direction:column;}
.reject-box.show{display:flex; animation: fadeIn 0.2s ease-out;}
@keyframes fadeIn { from {opacity:0;} to {opacity:1;} }
.reject-box textarea{width:100%;border:1px solid var(--paper-line);border-radius:8px;padding:8px;font-family:inherit;font-size:12.5px;resize:none;}
.reject-box .confirm{align-self:flex-end;background:var(--stamp);color:#fff;border:none;padding:7px 14px;border-radius:8px;font-size:12px;font-weight:700;cursor:pointer;}

.stamp-overlay{
  position:absolute; top:8px; right:10px; width:58px;height:58px;
  border:3px solid var(--teal); border-radius:50%; color:var(--teal);
  display:flex;align-items:center;justify-content:center;font-family:"Noto Serif TC";
  font-weight:900;font-size:14px; transform:rotate(-16deg) scale(0); opacity:0;
  pointer-events:none;
}
.stamp-overlay.play{animation:stampIn .5s cubic-bezier(.2,1.4,.4,1) forwards;}
@keyframes stampIn{
  0%{transform:rotate(-16deg) scale(2.4);opacity:0;}
  60%{transform:rotate(-16deg) scale(0.9);opacity:1;}
  100%{transform:rotate(-16deg) scale(1);opacity:1;}
}
@media (prefers-reduced-motion: reduce){
  .stamp-overlay.play{animation:none;transform:rotate(-16deg) scale(1);opacity:1;}
}
.pill{display:inline-block;font-size:10.5px;padding:2px 8px;border-radius:999px;font-weight:700;}
.pill.pending{background:var(--amber-soft);color:var(--amber);}
.pill.waiting{background:var(--teal-soft);color:var(--teal-deep);}

/* ---------- bottom nav ---------- */
.tabbar{
  position:fixed;bottom:0;left:0;right:0;max-width:480px;margin:0 auto;
  background:#fff;border-top:1px solid var(--paper-line);
  display:flex; padding:8px 6px calc(8px + env(safe-area-inset-bottom));
  box-shadow:0 -4px 14px rgba(0,0,0,0.05);
  z-index: 10;
}
.tabbar button{
  flex:1;background:none;border:none;padding:8px 2px;font-size:11.5px;color:var(--ink-soft);
  font-family:"Noto Sans TC";cursor:pointer;position:relative;font-weight:500;
  transition: color 0.2s;
}
.tabbar button.active{color:var(--teal);font-weight:700;}
.tabbar button.active::after{
  content:"";position:absolute;top:-9px;left:50%;transform:translateX(-50%);
  width:18px;height:2.5px;background:var(--stamp);border-radius:2px;
  animation: slideIn 0.3s ease-out;
}
@keyframes slideIn { from { width: 0; } to { width: 18px; } }
.tabbar .badge{
  position:absolute;top:0px;right:calc(50% - 20px);background:var(--stamp);color:#fff;
  border-radius:999px;font-size:9.5px;min-width:15px;height:15px;display:flex;align-items:center;justify-content:center;
  font-family:"IBM Plex Mono";
}

/* ---------- modals ---------- */
.modal-bg{
  position:fixed;inset:0;background:rgba(15,25,22,0.45);display:none;align-items:flex-end;justify-content:center;z-index:50;
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
}
.modal-bg.show{display:flex; animation: bgFadeIn 0.2s ease-out;}
@keyframes bgFadeIn { from {opacity:0;} to {opacity:1;} }
.modal{
  background:var(--paper);width:100%;max-width:480px;border-top-left-radius:20px;border-top-right-radius:20px;
  padding:20px 18px calc(20px + env(safe-area-inset-bottom));max-height:88vh;overflow-y:auto;
  transform: translateY(100%);
  transition: transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.modal-bg.show .modal {
  transform: translateY(0);
}
.modal h3{font-family:"Noto Serif TC";font-size:17px;margin:0 0 14px;color:var(--teal-deep);}
.field{margin-bottom:14px;}
.field label{display:block;font-size:12px;color:var(--ink-soft);margin-bottom:5px;font-weight:600;}
.field input, .field select, .field textarea{
  width:100%;padding:11px 12px;border:1px solid var(--paper-line);border-radius:9px;
  font-family:"Noto Sans TC";font-size:14.5px;background:#fff;color:var(--ink);
  transition: border-color 0.2s;
}
.field input:focus, .field textarea:focus {
  outline: none;
  border-color: var(--teal);
}
.field textarea{resize:none;height:60px;}
.cat-grid{display:flex;flex-wrap:wrap;gap:7px;}
.cat-opt{
  padding:7px 12px;border-radius:999px;border:1px solid var(--paper-line);background:#fff;
  font-size:12.5px;cursor:pointer;color:var(--ink-soft);
  transition: all 0.2s;
}
.cat-opt.sel{background:var(--teal);border-color:var(--teal);color:#fff;font-weight:700;}
.modal .submit{
  width:100%;padding:13px;background:var(--stamp);color:#fff;border:none;border-radius:11px;
  font-size:15px;font-weight:700;margin-top:4px;cursor:pointer;
  transition: all 0.2s;
}
.modal .submit:active { transform: scale(0.98); }
.modal .submit:disabled { opacity: 0.7; cursor: not-allowed; }
.modal .cancel{
  width:100%;padding:11px;background:none;border:none;color:var(--ink-soft);font-size:13px;margin-top:6px;cursor:pointer;
}

.topup-split{display:flex;gap:10px;margin-bottom:14px;}
.topup-card{flex:1;background:#fff;border:1px solid var(--paper-line);border-radius:11px;padding:12px;text-align:center;}
.topup-card .name{font-size:12px;color:var(--ink-soft);}
.topup-card .amt{font-family:"IBM Plex Mono";font-weight:700;font-size:19px;color:var(--teal-deep);margin-top:3px;}
.topup-card .ratio{font-size:10.5px;color:var(--sage);margin-top:2px;}
.topup-card button{margin-top:9px;width:100%;padding:8px;border:none;border-radius:8px;background:var(--teal-soft);color:var(--teal-deep);font-weight:700;font-size:12px;cursor:pointer;transition:all 0.2s;}
.topup-card button:active{transform:scale(0.95);}

/* identity picker */
.id-screen{
  position:fixed;inset:0;background:var(--teal);z-index:100;
  display:flex;flex-direction:column;align-items:center;justify-content:center;color:#F3EFE1;padding:24px;
}
.id-screen h1{font-family:"Noto Serif TC";font-size:22px;margin-bottom:6px;}
.id-screen p{font-size:12.5px;color:#BFD8CB;margin-bottom:26px;}
.id-btn{
  width:100%;max-width:280px;background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.25);
  color:#fff;padding:16px;border-radius:12px;font-size:16px;font-weight:700;margin-bottom:12px;font-family:"Noto Sans TC";
  cursor:pointer; transition:all 0.2s;
}
.id-btn:active{ transform:scale(0.96); background:rgba(255,255,255,0.2); }

/* toast */
#toast{
  position:fixed;bottom:90px;left:50%;transform:translateX(-50%) translateY(20px);
  background:var(--ink);color:#fff;padding:9px 18px;border-radius:999px;font-size:12.5px;
  opacity:0;transition:all .3s cubic-bezier(0.2,0.8,0.2,1);z-index:200;pointer-events:none;
}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0);}

.settings-group{margin:0 16px 18px;background:#fff;border-radius:var(--radius);box-shadow:var(--shadow);padding:14px 16px;}
.settings-group h4{margin:0 0 12px;font-size:12.5px;color:var(--ink-soft);letter-spacing:.06em;}
.ratio-row{display:flex;align-items:center;gap:8px;margin-bottom:10px;}
.ratio-row input[type=number]{width:70px;padding:8px;border:1px solid var(--paper-line);border-radius:8px;font-family:"IBM Plex Mono";text-align:center;}
.ratio-row input[type=text]{flex:1;padding:8px;border:1px solid var(--paper-line);border-radius:8px;}
.danger{color:var(--stamp);background:none;border:1px solid var(--stamp);padding:9px;border-radius:9px;width:100%;font-weight:700;font-size:13px;margin-top:4px;cursor:pointer;transition:all 0.2s;}
.danger:active{background:var(--stamp-soft);}
.save-tip{font-size:11px;color:var(--sage);margin-top:6px;}

.action-btn { cursor:pointer; font-size:12px; font-weight:700; padding:6px 10px; border-radius:6px; border:none; margin-top:6px; display:inline-block; }
.btn-delete { background: var(--stamp-soft); color: var(--stamp); transition: all 0.2s; }
.btn-delete:active { background: var(--stamp); color: #fff; }

/* Tabs transition */
section {
  animation: fadeSection 0.3s ease-out;
}
@keyframes fadeSection {
  from { opacity: 0; transform: translateY(5px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Delete confirmation modal specific */
#modalDelete .modal {
  text-align: center;
}
#modalDelete h3 {
  color: var(--stamp);
}
#modalDelete .submit {
  background: var(--stamp);
}
