:root{--ink: #272447;--ink-strong: #1b1836;--text: var(--ink);--secondary: #4d4a73;--muted: #6f6b94;--faint: #9b97bd;--hairline: rgba(120, 110, 180, .16);--grid: rgba(120, 110, 180, .16);--accent: #6f7cf0;--accent-soft: rgba(111, 124, 240, .14);--pos: #1fb6a6;--neg: #ec5a86;--red: var(--neg);--grad-sky: linear-gradient(135deg, #5ba8f5 0%, #56d6e0 100%);--grad-violet: linear-gradient(135deg, #9b6df0 0%, #c860d4 100%);--grad-rose: linear-gradient(135deg, #ef6f9e 0%, #f2926e 100%);--grad-accent: linear-gradient(135deg, #6f8cf5 0%, #9b6df0 100%);--card-bg: rgba(255, 255, 255, .58);--card-bg-strong: rgba(255, 255, 255, .74);--stage-bg: rgba(255, 255, 255, .34);--glass-card: blur(22px) saturate(185%);--glass-light: blur(10px) saturate(160%);--edge: inset 0 1px 0 rgba(255, 255, 255, .9);--sheen: linear-gradient(150deg, rgba(255, 255, 255, .55) 0%, transparent 34%);--shadow: 0 22px 50px -16px rgba(76, 64, 150, .32), var(--edge);--shadow-soft: 0 12px 32px -14px rgba(76, 64, 150, .26), var(--edge);--radius: 22px;--radius-sm: 14px;--radius-lg: 30px;--ease-spring: cubic-bezier(.34, 1.56, .42, 1);color-scheme:light}*{box-sizing:border-box}html,body,#root{margin:0;min-height:100%}body{font-family:Inter,Noto Sans TC,-apple-system,system-ui,sans-serif;background-color:#eceaf8;background-image:radial-gradient(60vw 55vh at 8% 0%,rgba(165,138,240,.6),transparent 62%),radial-gradient(58vw 55vh at 100% 6%,rgba(110,178,246,.55),transparent 62%),radial-gradient(54vw 58vh at 88% 100%,rgba(242,146,196,.5),transparent 62%),radial-gradient(52vw 60vh at 0% 100%,rgba(140,196,244,.46),transparent 62%),radial-gradient(48vw 48vh at 50% 52%,rgba(255,255,255,.4),transparent 60%);background-repeat:no-repeat;background-attachment:fixed;color:var(--text);font-size:14px;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-webkit-tap-highlight-color:transparent}.recharts-wrapper text{font-family:Inter,Noto Sans TC,sans-serif;font-variant-numeric:tabular-nums;fill:var(--muted)}.avg-pill{-webkit-tap-highlight-color:transparent}.gate{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:1rem}.gate-card{position:relative;overflow:hidden;background:var(--sheen),var(--card-bg-strong);backdrop-filter:var(--glass-card);-webkit-backdrop-filter:var(--glass-card);border:1px solid rgba(255,255,255,.6);border-radius:var(--radius-lg);padding:2.75rem 2.25rem;max-width:360px;width:100%;text-align:center;box-shadow:var(--shadow)}.gate-card h1{margin:0 0 .5rem;font-size:1.6rem;font-weight:800;letter-spacing:-.02em;color:var(--ink-strong)}.gate-sub{color:var(--muted);margin:0 0 1.6rem;font-size:.9rem}.gate-note{color:var(--muted);font-size:.75rem;margin:1.4rem 0 0;line-height:1.6}.gate-error{color:var(--neg);font-size:.85rem;margin-top:1rem}.btn-primary,.btn-secondary{font:inherit;font-weight:600;border-radius:9999px;padding:.65rem 1.3rem;cursor:pointer;border:1px solid transparent;transition:transform .4s var(--ease-spring),filter .2s ease,background-color .2s ease,border-color .2s ease,box-shadow .25s ease}.btn-primary:active,.btn-secondary:active{transform:scale(1.04)}.btn-primary{background:var(--grad-accent);color:#fff;width:100%;box-shadow:0 10px 24px -8px #6f5ae699,inset 0 1px #fff6}.btn-primary:hover{filter:brightness(1.06)}.btn-primary:disabled{opacity:.55;cursor:default}.btn-secondary{background:#ffffff80;backdrop-filter:var(--glass-light);-webkit-backdrop-filter:var(--glass-light);color:var(--secondary);border-color:#ffffffbf;box-shadow:var(--shadow-soft)}.status{text-align:center;margin-top:4rem;color:var(--muted)}.empty{color:var(--muted);text-align:center;margin:auto;padding:2rem 1rem;font-size:.9rem}.dashboard{max-width:1200px;margin:1.5rem auto;padding:1.5rem;display:flex;flex-direction:column;gap:1rem;background:var(--sheen),var(--stage-bg);border:1px solid rgba(255,255,255,.5);border-radius:var(--radius-lg);box-shadow:0 30px 70px -28px #463a8c66,var(--edge)}.topbar{display:flex;align-items:center;justify-content:space-between;padding:.25rem .25rem .4rem}.topbar h1{display:flex;align-items:center;gap:.65rem;margin:0;font-size:1.4rem;font-weight:800;letter-spacing:-.02em;color:var(--ink-strong)}.topbar h1:before{content:"$";display:grid;place-items:center;width:36px;height:36px;border-radius:11px;background:var(--grad-accent);color:#fff;font-size:1.05rem;font-weight:800;box-shadow:0 8px 18px -6px #6f5ae6b3,inset 0 1px #ffffff80}.panel{position:relative;background:var(--sheen),var(--card-bg);backdrop-filter:var(--glass-card);-webkit-backdrop-filter:var(--glass-card);border:1px solid rgba(255,255,255,.6);border-radius:var(--radius);box-shadow:var(--shadow);padding:1.2rem 1.3rem}.time-panel{z-index:5}.panel-head{display:flex;align-items:center;justify-content:space-between;gap:.75rem;margin-bottom:.85rem;flex-wrap:wrap}.panel-head h2{margin:0;font-size:1.02rem;font-weight:700;letter-spacing:-.01em;color:var(--ink-strong)}.kpis{display:grid;grid-template-columns:1.05fr 1.45fr;gap:.85rem;align-items:stretch}.kpi-stats{position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:space-evenly;background:var(--sheen),var(--card-bg);backdrop-filter:var(--glass-card);-webkit-backdrop-filter:var(--glass-card);border:1px solid rgba(255,255,255,.6);border-radius:var(--radius);box-shadow:var(--shadow-soft);padding:.3rem 1.3rem}.kpi-stats:after{content:"";position:absolute;top:-45%;right:-18%;width:55%;height:130%;border-radius:50%;opacity:.34;filter:blur(30px);pointer-events:none;background:#56cfe0}.stat-row{position:relative;display:flex;align-items:baseline;justify-content:space-between;gap:1rem;padding:.72rem 0}.stat-row+.stat-row{border-top:1px solid var(--hairline)}.stat-label{color:var(--muted);font-size:.82rem;font-weight:500}.stat-figure{display:flex;flex-direction:column;align-items:flex-end;line-height:1.15}.stat-value{font-size:1.4rem;font-weight:800;letter-spacing:-.025em;color:var(--ink-strong);font-variant-numeric:tabular-nums}.stat-note{margin-top:.1rem;color:var(--muted);font-size:.72rem;font-weight:500;letter-spacing:0}.kpi-hero{position:relative;overflow:hidden;display:flex;flex-direction:column;gap:.25rem;background:var(--sheen),var(--card-bg);backdrop-filter:var(--glass-card);-webkit-backdrop-filter:var(--glass-card);border:1px solid rgba(255,255,255,.6);border-radius:var(--radius);box-shadow:var(--shadow);padding:1.15rem 1.3rem .7rem}.kpi-hero:after{content:"";position:absolute;top:-45%;right:-20%;width:65%;height:120%;border-radius:50%;opacity:.42;filter:blur(30px);pointer-events:none;background:#9b6df0}.kpi-hero-value{position:relative;font-size:2.5rem;line-height:1.05;font-weight:800;letter-spacing:-.035em;color:var(--ink-strong);font-variant-numeric:tabular-nums}.sparkline{position:relative;height:58px;margin-top:auto;padding-top:.5rem}.kpi-label{position:relative;color:var(--muted);font-size:.78rem;font-weight:500}.kpi-sub{position:relative;font-size:.75rem;font-weight:600}.tone-up{color:var(--neg)}.tone-down{color:var(--pos)}.tone-flat{color:var(--muted)}.time-chart{height:300px;display:flex;overflow-x:auto;overflow-y:hidden}.time-chart-inner{flex:0 0 auto;height:100%;width:max(100%,calc(var(--cols, 12) * 30px))}.head-controls{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.project-picker{position:relative}.project-trigger{display:inline-flex;align-items:center;gap:.5rem;font:inherit;font-size:.85rem;font-weight:500;padding:.45rem .55rem .45rem .95rem;border-radius:9999px;border:1px solid rgba(255,255,255,.75);background:#ffffff80;backdrop-filter:var(--glass-light);-webkit-backdrop-filter:var(--glass-light);box-shadow:var(--shadow-soft);color:var(--ink);cursor:pointer;max-width:240px}.pt-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pt-chevron{color:var(--muted);font-size:.7rem;transition:transform .3s var(--ease-spring)}.pt-chevron.open{transform:rotate(180deg)}.project-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:30;min-width:200px;max-width:calc(100vw - 1.5rem);max-height:320px;overflow:auto;list-style:none;margin:0;padding:6px;border-radius:18px;border:1px solid rgba(255,255,255,.6);background:#ffffffe6;backdrop-filter:blur(24px) saturate(190%);-webkit-backdrop-filter:blur(24px) saturate(190%);box-shadow:0 22px 48px -14px #463a8c66,var(--edge);transform-origin:top right;isolation:isolate;animation:menuIn .24s var(--ease-spring)}@keyframes menuIn{0%{opacity:0;transform:translateY(-6px) scale(.97)}to{opacity:1;transform:none}}.project-item{display:flex;align-items:center;gap:.4rem;width:100%;font:inherit;font-size:.85rem;text-align:left;padding:.5rem .6rem;border:none;background:none;border-radius:11px;color:var(--ink);cursor:pointer;transition:background-color .18s ease,transform .35s var(--ease-spring)}.project-item:hover{background:#6f7cf01a}.project-item:active{transform:scale(1.03)}.project-item.active{color:var(--accent);font-weight:600;background:var(--accent-soft)}.pi-check{width:1em;flex:none;color:var(--accent)}.pi-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.press-glass{transition:transform .4s var(--ease-spring),background-color .25s ease,box-shadow .25s ease,border-color .25s ease}.press-glass:active{transform:scale(1.06);border-color:#ffffffe6;box-shadow:inset 0 1px #fffc,inset 0 0 18px #ffffff38,0 14px 32px -10px #463a8c6b}.btn-primary.press-glass:active{background:var(--grad-accent)}.breadcrumb{display:flex;align-items:center;flex-wrap:wrap;gap:.15rem;font-size:.85rem}.crumb-item{display:inline-flex;align-items:center;gap:.15rem}.crumb.link{background:none;border:none;color:var(--accent);cursor:pointer;font:inherit;font-weight:500;padding:.1rem .3rem;border-radius:7px;transition:background-color .2s ease,transform .35s var(--ease-spring)}.crumb.link:hover{background:var(--accent-soft)}.crumb.link:active{transform:scale(1.08)}.crumb.current{color:var(--ink-strong);font-weight:700;padding:.1rem .3rem}.crumb-sep{color:var(--faint)}.mid-grid{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(300px,1fr);gap:1rem;align-items:start}@media (min-width: 901px){.mid-grid{align-items:stretch}.mid-grid>.panel{height:430px;display:flex;flex-direction:column}.mid-grid .time-chart{height:auto;flex:1;min-height:0}.mid-grid .breakdown{flex:1;min-height:0}.mid-grid .breakdown-donut{height:auto;flex:1 1 auto;min-height:110px;max-height:220px}.mid-grid .breakdown-list{flex:0 1 auto;overflow-y:auto;min-height:0}}@media (max-width: 900px){.kpis,.mid-grid{grid-template-columns:1fr}}.breakdown{display:flex;flex-direction:column;gap:1rem}.breakdown-donut{position:relative;height:180px}.donut-center{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.donut-total{font-size:1.2rem;font-weight:800;letter-spacing:-.02em;color:var(--ink-strong);font-variant-numeric:tabular-nums}.donut-caption{font-size:.72rem;color:var(--muted)}.breakdown-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.15rem}.cat-row{display:grid;grid-template-columns:12px 4.5em 1fr auto auto;align-items:center;gap:.5rem;width:100%;background:none;border:none;cursor:pointer;font:inherit;color:var(--ink);padding:.4rem .45rem;border-radius:var(--radius-sm);transition:background-color .2s ease,transform .35s var(--ease-spring)}.cat-row:hover{background:#ffffff80}.cat-row:active{transform:scale(1.02)}.cat-row.selected{background:#fff9}.cat-row.dimmed{opacity:.45}.cat-dot{width:11px;height:11px;border-radius:4px}.cat-name{text-align:left;white-space:nowrap}.cat-bar{height:7px;background:#786eb429;border-radius:4px;overflow:hidden}.cat-bar-fill{display:block;height:100%;border-radius:4px}.cat-amt{font-variant-numeric:tabular-nums;font-size:.85rem;font-weight:600;color:var(--ink)}.cat-pct{color:var(--muted);font-size:.78rem;width:2.6em;text-align:right;font-variant-numeric:tabular-nums}.txn-panel,.txn{display:flex;flex-direction:column;min-width:0}.txn-head{display:flex;align-items:center;justify-content:space-between;gap:.75rem;margin-bottom:.85rem;flex-wrap:wrap}.txn-title{display:flex;align-items:baseline;gap:.6rem;flex-wrap:wrap}.txn-title h2{margin:0;font-size:1.02rem;font-weight:700;letter-spacing:-.01em;color:var(--ink-strong)}.txn-meta{color:var(--muted);font-size:.82rem;font-variant-numeric:tabular-nums}.txn-search{font:inherit;padding:.5rem .95rem;border-radius:9999px;border:1px solid rgba(255,255,255,.75);background:#ffffff80;backdrop-filter:var(--glass-light);-webkit-backdrop-filter:var(--glass-light);box-shadow:var(--shadow-soft);color:var(--ink);min-width:200px;transition:background-color .3s ease,border-color .3s ease,box-shadow .4s var(--ease-spring),transform .4s var(--ease-spring)}.txn-search::placeholder{color:var(--faint);font-size:.8rem}.txn-search:focus{outline:none;transform:translateY(-1px);background:#ffffffad;backdrop-filter:blur(18px) saturate(195%);-webkit-backdrop-filter:blur(18px) saturate(195%);border-color:#6f7cf080;box-shadow:inset 0 1px #ffffffe6,0 0 0 3px #6f7cf029,0 12px 28px -10px #463a8c57}.chip-row{display:flex;flex-wrap:wrap;gap:.4rem}.chip{font:inherit;font-size:.78rem;font-weight:600;border:1px solid var(--accent);color:var(--accent);background:var(--accent-soft);border-radius:9999px;padding:.14rem .7rem;cursor:pointer;transition:transform .4s var(--ease-spring)}.chip:active{transform:scale(1.05)}.txn-scroll{overflow:auto;max-height:640px;border:1px solid rgba(255,255,255,.5);border-radius:var(--radius-sm);background:#ffffff6b}table{width:100%;border-collapse:collapse;font-size:.85rem}thead th{position:sticky;top:0;background:#f5f4fceb;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);text-align:left;font-weight:600;color:var(--muted);padding:.6rem .75rem;border-bottom:1px solid var(--hairline);white-space:nowrap;z-index:1}thead th.col-note{color:var(--muted)}tbody td{padding:.5rem .75rem;border-bottom:1px solid var(--grid);vertical-align:top}tbody tr:hover{background:#fff9}.col-date{white-space:nowrap;font-variant-numeric:tabular-nums;color:var(--muted)}.cell-main{font-weight:600;color:var(--ink)}.cell-sub{color:var(--muted)}.cell-project{color:var(--muted);white-space:nowrap}.col-note{color:var(--ink);max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-amt{text-align:right;white-space:nowrap}.amt-twd{font-variant-numeric:tabular-nums;font-weight:700;color:var(--ink-strong)}.amt-orig{display:block;color:var(--muted);font-size:.72rem;font-variant-numeric:tabular-nums}.txn-cap{color:var(--muted);font-size:.78rem;margin:.6rem 0 0}.tt{background:#ffffffeb;backdrop-filter:blur(10px) saturate(180%);-webkit-backdrop-filter:blur(10px) saturate(180%);border:1px solid rgba(255,255,255,.7);border-radius:var(--radius-sm);padding:.55rem .8rem;box-shadow:0 14px 32px -12px #463a8c66,var(--edge);font-size:.82rem}.tt-title{font-weight:700;margin-bottom:.15rem;color:var(--ink-strong)}.tt-row{font-variant-numeric:tabular-nums;color:var(--ink)}.tt-sub{color:var(--muted);font-size:.74rem;margin-top:.1rem}@media (max-width: 560px){.dashboard{margin:.6rem;padding:1rem;border-radius:var(--radius);gap:.75rem}.topbar h1{font-size:1.18rem}.topbar h1:before{width:30px;height:30px;border-radius:9px;font-size:.9rem}.panel{padding:.95rem}.kpis{gap:.5rem}.kpi-hero-value{font-size:2.1rem}.kpi-stats{padding:.15rem 1rem}.stat-value{font-size:1.2rem}.panel-head{flex-direction:column;align-items:stretch;gap:.5rem}.head-controls{justify-content:space-between}.project-menu{left:0;right:auto;transform-origin:top left}.time-chart{height:240px}.txn-head{flex-direction:column;align-items:stretch}.txn-search{width:100%;min-width:0}.txn-scroll{max-height:64vh;overflow-x:hidden}thead{display:none}table,tbody,tbody tr,tbody td{display:block;width:100%}tbody tr{display:grid;grid-template-columns:1fr auto;grid-template-areas:"cat  amt" "date amt" "proj amt" "note note";align-items:baseline;column-gap:.8rem;row-gap:.1rem;padding:.7rem .85rem;border-bottom:1px solid var(--grid)}tbody td{padding:0;border:none;white-space:normal;vertical-align:baseline}tbody td:nth-child(2){grid-area:cat;font-size:.9rem}.col-date{grid-area:date;font-size:.74rem}.cell-project{grid-area:proj;font-size:.74rem}.col-note{grid-area:note;max-width:none;color:var(--muted);font-size:.78rem;margin-top:.2rem;white-space:normal;overflow:visible;text-overflow:clip}.col-amt{grid-area:amt;align-self:center;text-align:right}.amt-twd{font-size:1.1rem}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}
