:root{--paper:#f4f1ea;--paper-2:#faf8f3;--ink:#1d211d;--ink-2:#5c615a;--ink-3:#8d918a;--line:#1d211d17;--green:#1f6f5c;--green-2:#2e8a72;--green-soft:#1f6f5c17;--red:#c4573f;--red-soft:#c4573f1a;--amber:#b77a24;--radius:20px;--shadow:0 1px 2px #1d211d0a, 0 10px 30px -18px #1d211d40;--num:"Iowan Old Style", "Palatino Linotype", "Songti SC", "STSong", Georgia, serif;--sans:"PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", system-ui, sans-serif;--ease:cubic-bezier(.22, 1, .36, 1)}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{background:var(--paper);color:var(--ink);font-family:var(--sans);-webkit-font-smoothing:antialiased;background-image:radial-gradient(1200px 600px at 85% -10%,#1f6f5c12,#0000 60%),radial-gradient(900px 500px at -10% 10%,#b77a240d,#0000 55%);background-attachment:fixed;min-height:100vh;margin:0;font-size:15px;line-height:1.55}button{color:inherit;font-family:inherit}input,textarea,select{color:var(--ink);font-family:inherit}input:focus-visible,textarea:focus-visible,select:focus-visible,button:focus-visible{outline:2px solid var(--green-2);outline-offset:2px}.app{max-width:1120px;animation:fade-in .5s var(--ease) both;margin:0 auto;padding:0 20px 64px}.topbar{z-index:20;background:linear-gradient(var(--paper) 70%, #f4f1ea00);justify-content:space-between;align-items:center;padding:20px 2px 14px;display:flex;position:sticky;top:0}.brand{align-items:center;gap:10px;display:flex}.brand-name{letter-spacing:.16em;font-size:19px;font-weight:600}.brand-sub{font-family:var(--num);color:var(--ink-3);border-left:1px solid var(--line);margin-left:2px;padding-left:10px;font-size:13px}.tabs{background:#1d211d0d;border-radius:999px;gap:2px;padding:3px;display:flex}.tabs button{color:var(--ink-2);cursor:pointer;transition:all .25s var(--ease);background:0 0;border:0;border-radius:999px;padding:7px 16px;font-size:14px}.tabs button.active{background:var(--paper-2);color:var(--ink);box-shadow:0 1px 4px #1d211d1f}.page{flex-direction:column;gap:18px;padding-top:10px;display:flex}.page-title{letter-spacing:.04em;margin:8px 2px 0;font-size:24px}.hero{border:1px solid var(--line);box-shadow:var(--shadow);animation:rise .7s var(--ease) both;background:linear-gradient(160deg,#fdfbf6 0%,#f7f3ea 100%);border-radius:28px;padding:26px 28px 24px;position:relative;overflow:hidden}.hero:after{content:"";pointer-events:none;background:radial-gradient(circle,#1f6f5c14,#0000 65%);border-radius:50%;width:420px;height:420px;position:absolute;inset:-40% -20% auto auto}.hero-left{z-index:1;position:relative}.hero-top{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.greet{color:var(--ink-2);margin-bottom:8px;font-size:14px}.month-switch{border:1px solid var(--line);background:#ffffffb3;border-radius:999px;align-items:center;gap:2px;padding:2px;display:inline-flex}.month-switch .icon-btn{cursor:pointer;width:30px;height:30px;color:var(--ink-2);background:0 0;border:0;border-radius:50%;font-size:18px;line-height:1}.month-switch .icon-btn:hover:not(:disabled){background:var(--green-soft);color:var(--green)}.month-switch .icon-btn:disabled{opacity:.3;cursor:default}.month-label{cursor:pointer;background:0 0;border:0;border-radius:999px;align-items:center;gap:8px;padding:4px 10px;font-size:15px;font-weight:550;display:inline-flex}.month-label:hover{background:var(--green-soft)}.back-now{color:var(--green);background:var(--green-soft);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:400}.ring{flex:none;position:relative}.ring svg{display:block}.ring-center{flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.ring-pct{font-family:var(--num);color:var(--green);font-size:26px;font-weight:600;line-height:1.1}.ring-pct.over{color:var(--red)}.ring-cap{color:var(--ink-3);letter-spacing:.1em;font-size:11px}.hero-total{animation:rise .8s .1s var(--ease) both;align-items:baseline;margin:18px 0 2px;display:flex}.hero-currency{font-family:var(--num);color:var(--ink-2);margin-right:4px;font-size:26px}.hero-amount{font-family:var(--num);letter-spacing:-.02em;font-variant-numeric:tabular-nums;font-size:clamp(48px,9vw,76px);font-weight:500;line-height:1}.hero-cents{font-family:var(--num);color:var(--ink-3);font-size:22px}.hero-meta{color:var(--ink-3);margin-top:6px;font-size:13px}.meter{background:#1f6f5c1a;border-radius:999px;height:6px;margin:18px 0 20px;overflow:hidden}.meter-fill{border-radius:inherit;background:linear-gradient(90deg, var(--green), var(--green-2));height:100%;animation:grow-width 1s .2s var(--ease) both;transform-origin:0}.meter-fill.over{background:linear-gradient(90deg, var(--red), #d9785f)}.hero-stats{grid-template-columns:repeat(4,1fr);gap:8px;display:grid}.stat{border:1px solid var(--line);animation:rise .7s var(--ease) both;background:#ffffff8c;border-radius:14px;padding:12px 14px}.stat:first-child{animation-delay:80ms}.stat:nth-child(2){animation-delay:.14s}.stat:nth-child(3){animation-delay:.2s}.stat:nth-child(4){animation-delay:.26s}.stat-label{color:var(--ink-3);margin-bottom:3px;font-size:12px}.stat-value{font-family:var(--num);font-variant-numeric:tabular-nums;font-size:19px;font-weight:600}.stat-value.neg{color:var(--red)}.stat-value.pos{color:var(--green)}.stat-sub{color:var(--ink-3);font-size:12px;font-weight:400}.verdict{animation:rise .7s .3s var(--ease) both;border-radius:12px;margin-top:16px;padding:11px 15px;font-size:14px}.verdict.good{background:var(--green-soft);color:#17594a}.verdict.warn{background:var(--red-soft);color:#8c3a27}.card{background:var(--paper-2);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);animation:rise .7s var(--ease) both;padding:20px 22px}.card-title{letter-spacing:.02em;font-size:16px;font-weight:600}.card-head{justify-content:space-between;align-items:baseline;gap:10px;margin-bottom:14px;display:flex}.card-actions{flex-wrap:wrap;align-items:center;gap:10px;margin-top:14px;display:flex}.hint{color:var(--ink-3);font-size:12.5px}.empty{color:var(--ink-3);text-align:center;padding:26px 0;font-size:14px}.grid-2{grid-template-columns:1fr 1fr;gap:18px;display:grid}.chat-card{padding-bottom:16px}.chat-input-wrap{gap:10px;display:flex}.chat-input{border:1px solid var(--line);background:#fff;border-radius:14px;flex:1;padding:13px 16px;font-size:16px;transition:border-color .2s,box-shadow .2s}.chat-input:focus{border-color:var(--green-2);box-shadow:0 0 0 4px var(--green-soft);outline:none}.btn{background:var(--green);color:#fff;cursor:pointer;transition:transform .15s var(--ease), background .2s, opacity .2s;white-space:nowrap;border:0;border-radius:14px;padding:12px 20px;font-size:15px;font-weight:550}.btn:hover:not(:disabled){background:#195c4c;transform:translateY(-1px)}.btn:active:not(:disabled){transform:translateY(0)scale(.98)}.btn:disabled{opacity:.45;cursor:default}.btn.send{padding-inline:24px}.btn.ghost{color:var(--ink-2);border:1px solid var(--line);background:0 0}.btn.ghost:hover:not(:disabled){background:#1d211d0a}.btn.danger{background:var(--red)}.btn.danger:hover:not(:disabled){background:#a94633}.btn.full{width:100%}.quick-row{flex-wrap:wrap;align-items:center;gap:6px;margin-top:10px;display:flex}.chip{border:1px solid var(--line);color:var(--ink-2);cursor:pointer;background:0 0;border-radius:999px;padding:4px 11px;font-size:13px;transition:all .2s}.chip:hover{border-color:var(--green-2);color:var(--green)}.quick-row .hint{margin-left:auto}.toast-inline{animation:pop .35s var(--ease) both;border-radius:12px;margin-top:12px;padding:10px 14px;font-size:14px}.toast-inline.ok{background:var(--green-soft);color:#17594a}.toast-inline.err{background:var(--red-soft);color:#8c3a27}.alert-strip{animation:rise .6s var(--ease) both;flex-wrap:wrap;gap:8px;display:flex}.alert-item{background:var(--red-soft);color:#8c3a27;border-radius:999px;align-items:center;gap:7px;padding:7px 14px;font-size:13px;display:inline-flex}.cat-layout{align-items:center;gap:22px;display:flex}.donut{flex:none;margin:4px;position:relative}.donut-center{flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.donut-amt{font-family:var(--num);font-variant-numeric:tabular-nums;font-size:19px;font-weight:600}.donut-cap{color:var(--ink-3);letter-spacing:.08em;font-size:11px}.cat-list{flex-direction:column;flex:1;gap:9px;min-width:0;display:flex}.cat-line{grid-template-columns:10px 52px 1fr auto 38px;align-items:center;gap:8px;font-size:13.5px;display:grid}.cat-name{color:var(--ink-2)}.cat-track{background:#1d211d0f;border-radius:999px;height:7px;overflow:hidden}.cat-fill{border-radius:inherit;height:100%;transition:width 1s var(--ease);transform-origin:0}.cat-amt{font-family:var(--num);font-variant-numeric:tabular-nums;text-align:right}.cat-pct{color:var(--ink-3);text-align:right;font-variant-numeric:tabular-nums;font-size:12px}.dot{border-radius:50%;flex:none;width:8px;height:8px;display:inline-block}.trend-chart{align-items:stretch;gap:6px;height:190px;padding-top:18px;display:flex;position:relative}.trend-budget-line{pointer-events:none;z-index:1;border-top:1.5px dashed #c4573f73;position:absolute;left:0;right:0}.trend-budget-line:after{content:"预算";color:#c4573fcc;font-size:10px;position:absolute;top:-16px;right:0}.trend-col{cursor:pointer;background:0 0;border:0;border-radius:10px;flex-direction:column;flex:1;align-items:center;min-width:0;padding:0;transition:background .2s;display:flex}.trend-col:hover{background:#1d211d08}.trend-val{font-family:var(--num);color:var(--ink-3);font-variant-numeric:tabular-nums;font-size:11.5px}.trend-bar-wrap{flex:1;justify-content:center;align-items:flex-end;width:100%;min-height:0;display:flex}.trend-bar{width:64%;max-width:38px;transition:height .9s var(--ease);background:#1f6f5c38;border-radius:8px 8px 4px 4px;min-height:2px}.trend-col.active .trend-bar{background:linear-gradient(180deg, var(--green-2), var(--green))}.trend-col.empty-col .trend-bar{background:0 0}.trend-label{color:var(--ink-2);margin-top:6px;font-size:12px}.trend-col.active .trend-label{color:var(--green);font-weight:600}.trend-delta{color:var(--ink-3);font-variant-numeric:tabular-nums;height:15px;font-size:10.5px}.trend-delta.up{color:var(--red)}.trend-delta.down{color:var(--green)}.trend-foot{color:var(--ink-3);margin-top:10px;font-size:12.5px}.drop-zone{text-align:center;cursor:pointer;transition:all .25s var(--ease);background:#1f6f5c09;border:1.5px dashed #1f6f5c59;border-radius:16px;padding:26px 16px}.drop-zone:hover{border-color:var(--green-2);background:#1f6f5c11}.drop-zone.is-busy{cursor:progress}.drop-icon{color:var(--green);margin-bottom:6px;font-size:22px}.drop-text{margin-bottom:3px;font-size:14.5px;font-weight:500}.progress{background:#1f6f5c1f;border-radius:999px;max-width:280px;height:5px;margin:12px auto 0;overflow:hidden}.progress>div{background:var(--green);border-radius:inherit;height:100%;transition:width .25s}.draft-list{animation:rise .4s var(--ease) both;flex-direction:column;gap:8px;margin-top:14px;display:flex}.draft-row{grid-template-columns:84px 104px 1fr 32px;align-items:center;gap:8px;display:grid}.draft-amount,.draft-note{border:1px solid var(--line);background:#fff;border-radius:10px;min-width:0;padding:8px 10px;font-size:14px}.draft-actions{gap:10px;margin-top:6px;display:flex}.icon-btn{color:var(--ink-3);cursor:pointer;background:0 0;border:0;border-radius:50%;width:32px;height:32px;font-size:18px;transition:background .2s,color .2s}.icon-btn:hover{background:var(--red-soft);color:var(--red)}.raw-details{border-top:1px solid var(--line);margin-top:14px;padding-top:12px}.raw-details summary{cursor:pointer;color:var(--ink-3);font-size:13px}.raw-details summary:hover{color:var(--green)}.raw-text{border:1px solid var(--line);resize:vertical;background:#fff;border-radius:12px;width:100%;min-height:110px;margin:10px 0;padding:10px 12px;font-size:14px}.cat-select{border:1px solid var(--line);background:#fff;border-radius:10px;min-width:0;padding:8px 10px;font-size:14px}.entry-groups{flex-direction:column;gap:14px;display:flex}.day-group{animation:rise .5s var(--ease) both}.day-head{color:var(--ink-3);border-bottom:1px solid var(--line);justify-content:space-between;margin-bottom:2px;padding:0 4px 5px;font-size:12.5px;display:flex}.day-total{font-family:var(--num);font-variant-numeric:tabular-nums}.entry-row{border-radius:12px;overflow:hidden}.entry-row.editing{background:#1f6f5c0d;margin:4px 0}.entry-btn{cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:10px;width:100%;padding:11px 6px;font-size:14.5px;transition:background .18s;display:flex}.entry-btn:hover{background:#1d211d09}.entry-dot{border-radius:50%;flex:none;width:9px;height:9px}.entry-note{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.entry-cat{color:var(--ink-3);font-size:12px}.src-tag{color:var(--ink-3);border:1px solid var(--line);border-radius:999px;padding:0 7px;font-size:10.5px;line-height:17px}.entry-amt{font-family:var(--num);font-variant-numeric:tabular-nums;font-weight:550}.editor{animation:pop .25s var(--ease) both;flex-direction:column;gap:10px;padding:12px 14px;display:flex}.editor-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.editor-row label{color:var(--ink-3);width:34px;font-size:12.5px}.editor-row input{border:1px solid var(--line);background:#fff;border-radius:10px;flex:1;min-width:0;padding:8px 10px;font-size:14px}.editor-row input[type=date]{flex:none}.editor-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.editor-warn{color:var(--red);flex:1;font-size:13px}.pill{color:var(--ink-2);font-variant-numeric:tabular-nums;background:#1d211d0d;border-radius:999px;padding:3px 10px;font-size:12px}.pill.ok{background:var(--green-soft);color:var(--green)}.pill.warn{background:var(--red-soft);color:var(--red)}.cat-budget-list{flex-direction:column;gap:11px;display:flex}.cat-budget-row{grid-template-columns:66px 78px 1fr minmax(96px,auto);align-items:center;gap:10px;font-size:13.5px;display:grid}.cat-budget-name{color:var(--ink-2);align-items:center;gap:7px;display:flex}.cat-budget-input{border:1px solid var(--line);font-variant-numeric:tabular-nums;background:#fff;border-radius:9px;width:100%;padding:6px 8px;font-size:13.5px}.cat-budget-bar{background:#1d211d0f;border-radius:999px;height:6px;overflow:hidden}.bar-fill{border-radius:inherit;height:100%;transition:width .8s var(--ease)}.bar-fill.near{background:var(--amber)!important}.bar-fill.over{background:var(--red)}.cat-budget-spent{text-align:right;font-family:var(--num);font-variant-numeric:tabular-nums;font-size:13px}.cat-budget-spent.over{color:var(--red)}.cat-budget-spent .pct{color:var(--ink-3);font-size:11.5px}blockquote.hint{margin:0}.form-grid{grid-template-columns:150px 1fr;align-items:center;gap:10px 14px;display:grid}.form-grid label{color:var(--ink-2);font-size:13.5px}.form-grid input{border:1px solid var(--line);font-variant-numeric:tabular-nums;background:#fff;border-radius:12px;padding:10px 12px;font-size:15px}.link-btn{color:var(--green);cursor:pointer;font-size:inherit;text-underline-offset:3px;background:0 0;border:0;padding:0 4px;text-decoration:underline}.login-wrap{place-items:center;min-height:100vh;padding:24px;display:grid}.login-card{background:var(--paper-2);border:1px solid var(--line);width:min(380px,100%);box-shadow:var(--shadow);animation:rise .7s var(--ease) both;border-radius:26px;padding:34px 30px 28px}.brand-mark{margin-bottom:14px}.login-card h1{letter-spacing:.2em;margin:0;font-size:30px;font-weight:600}.login-sub{color:var(--ink-3);margin:6px 0 24px;font-size:13.5px}.login-card input{border:1px solid var(--line);background:#fff;border-radius:13px;width:100%;margin-bottom:12px;padding:13px 15px;font-size:16px}.login-card input:focus{border-color:var(--green-2);box-shadow:0 0 0 4px var(--green-soft);outline:none}.login-err{color:var(--red);margin:-4px 0 10px;font-size:13px}.skeleton-card{pointer-events:none}.sk{background:linear-gradient(90deg,#1d211d0d 25%,#1d211d17 50%,#1d211d0d 75%) 0 0/200% 100%;border-radius:10px;animation:1.4s infinite shimmer}.sk-line{height:13px;margin-bottom:12px}.sk-line.w40{width:40%}.sk-line.w50{width:50%}.sk-line.w60{width:60%}.sk-num{width:55%;height:62px;margin:18px 0}.sk-bar{width:100%;height:8px;margin-top:18px}.sk-ring{border-radius:50%;width:180px;height:180px;margin:10px auto}.sk-chart{height:160px;margin-top:10px}.banner-err{background:var(--red-soft);color:#8c3a27;border-radius:14px;margin:8px 0;padding:12px 16px;font-size:14px}.foot{text-align:center;color:var(--ink-3);letter-spacing:.04em;padding:18px 0 0;font-size:12px}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes rise{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}@keyframes pop{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}@keyframes grow-width{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}@media (width<=860px){.grid-2{grid-template-columns:1fr}.hero{border-radius:24px;padding:22px 20px 20px}.hero-stats{grid-template-columns:1fr 1fr}.hero-top .ring{display:none}.cat-layout{flex-direction:column;align-items:stretch;gap:14px}.donut{align-self:center}.form-grid{grid-template-columns:1fr;gap:6px}.cat-budget-row{grid-template-columns:60px 74px 1fr}.cat-budget-spent{text-align:left;grid-column:1/-1;padding-left:2px}}@media (width<=520px){.app{padding:0 14px 48px}.topbar{padding-top:14px}.brand-sub{display:none}.hero-amount{font-size:46px}.quick-row .hint{display:none}.draft-row{grid-template-columns:70px 90px 1fr 28px;gap:6px}.trend-delta,.entry-cat{display:none}.card{padding:17px 16px}.chat-input-wrap{flex-wrap:nowrap}.btn.send{padding-inline:16px}}@supports (padding:env(safe-area-inset-bottom)){.app{padding-bottom:calc(48px + env(safe-area-inset-bottom))}}
