:root{--bg:#f2f4f8;--card:#fff;--border:#e3e6ee;--text:#1c2333;--muted:#6b7280;--accent:#3f51b5;--accent-dark:#2c3aa8;--red:#d32f2f;--red-bg:#fdecea;--amber:#b26a00;--amber-bg:#fff6e0;--green:#2e7d32;--green-bg:#e8f5e9;--radius:10px;--shadow:0 1px 3px #10182814}*{box-sizing:border-box}body{background:var(--bg);color:var(--text);margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.app{max-width:1100px;margin:0 auto;padding:16px 16px 40px}.topbar{flex-wrap:wrap;align-items:center;gap:10px;padding:12px 0 18px;display:flex}.brand{white-space:nowrap;font-size:18px;font-weight:700}.title{text-align:right;white-space:nowrap;flex:1;min-width:200px;margin:0;font-size:20px}.scope-tabs{background:#e8eaf3;border-radius:8px;padding:3px;display:flex}.tab{cursor:pointer;color:var(--muted);background:0 0;border:none;border-radius:6px;padding:6px 14px;font-size:14px}.tab.active{background:var(--card);color:var(--accent);box-shadow:var(--shadow);font-weight:600}.nav{gap:6px;display:flex}.actions{flex-wrap:wrap;gap:8px;margin-left:auto;display:flex}.btn{border:1px solid var(--border);background:var(--card);color:var(--text);cursor:pointer;border-radius:8px;padding:7px 14px;font-size:14px}.btn:hover{border-color:#c9cede}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover{background:var(--accent-dark)}.icon{cursor:pointer;background:0 0;border:none;border-radius:6px;padding:4px 8px;font-size:16px}.icon:hover{background:#eef0f6}.icon.danger:hover{background:var(--red-bg)}.notice{z-index:50;color:#1a3e8c;background:#e8f0fe;border:1px solid #b9cdfa;border-radius:8px;margin-bottom:14px;padding:10px 16px;position:sticky;top:8px}.update-banner{z-index:50;color:#6b4a00;background:#fff3cd;border:1px solid #f5d28a;border-radius:8px;justify-content:center;align-items:center;gap:12px;margin-bottom:14px;padding:10px 16px;display:flex;position:sticky;top:8px}.stats{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:14px;display:grid}.stat{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px 16px}.stat-value{font-size:22px;font-weight:700}.stat-label{color:var(--muted);margin-top:2px;font-size:13px}.stat.spend .stat-value{color:var(--red)}.stat.income .stat-value{color:var(--green)}.stat.over .stat-value{color:var(--red)}.stat.ok .stat-value{color:var(--green)}.pace{background:var(--amber-bg);color:var(--amber);border:1px solid #f0d9a8;border-radius:8px;margin-bottom:14px;padding:10px 16px;font-size:14px}.pace.over{background:var(--red-bg);color:var(--red);border-color:#f3c2bd}.grid{grid-template-columns:1fr 1fr;gap:12px;margin-bottom:14px;display:grid}@media (width<=760px){.grid{grid-template-columns:1fr}}.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:14px;padding:16px}.card h3{color:#374151;margin:0 0 12px;font-size:15px}.card-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;display:flex}.card-head h3{margin:0}.chart{height:240px}.breakdown{flex-direction:column;gap:10px;display:flex}.budget-row{align-items:center;gap:10px;display:flex}.dot{border-radius:50%;flex-shrink:0;width:12px;height:12px}.b-name{text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;width:120px;font-size:14px;overflow:hidden}.bar{background:#eef0f6;border-radius:5px;flex:1;height:10px;overflow:hidden}.bar-fill{border-radius:5px;height:100%;transition:width .2s}.bar-fill.warn{outline:2px solid var(--amber)}.bar-fill.over{outline:2px solid var(--red)}.b-amount{text-align:right;font-variant-numeric:tabular-nums;min-width:90px;font-size:14px;font-weight:600}.b-budget{text-align:right;min-width:80px;color:var(--muted);font-variant-numeric:tabular-nums;font-size:13px}.badge{white-space:nowrap;border-radius:999px;padding:2px 8px;font-size:12px;font-weight:700}.badge.over{background:var(--red-bg);color:var(--red)}.badge.warn{background:var(--amber-bg);color:var(--amber)}.badge.ok{background:var(--green-bg);color:var(--green)}.rec-list{flex-direction:column;gap:8px;display:flex}.rec-list.cand{border:1px solid var(--border);border-radius:8px;max-height:220px;padding:6px;overflow-y:auto}.rec-cand-head{align-items:baseline;gap:10px;margin:18px 0 8px;display:flex}.rec-cand-head h3{margin:0;font-size:14px}.rec-row.cand{cursor:pointer;border-radius:6px;padding:4px 6px}.rec-row.cand:hover{background:var(--row-hover,#7f7f7f14)}.rec-row.cand .badge{margin-left:6px;font-size:10px}.rec-row{align-items:center;gap:10px;display:flex}.rec-row .rec-del{opacity:.5;flex-shrink:0}.rec-row .rec-cat{white-space:nowrap;flex-shrink:0;font-size:12px}.bulk-list{max-height:340px;overflow-y:auto}.bulk-row{cursor:pointer;border-bottom:1px solid #f0f2f8;align-items:center;gap:10px;padding:7px 4px;font-size:13px;display:flex}.bulk-row:hover{background:#f7f8fc}.bulk-row input{flex-shrink:0}.bulk-date{white-space:nowrap;color:var(--muted);font-size:12px}.bulk-desc{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.bulk-payee{color:var(--muted);white-space:nowrap;font-size:12px}.bulk-cat{white-space:nowrap;font-size:12px}.bulk-row .num{font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto}.bulk-row .spend{color:var(--red)}.bulk-row .income{color:var(--green)}.rec-row .rec-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:14px;font-weight:600;overflow:hidden}.rec-info{flex:1;min-width:0}.rec-sub{color:var(--muted);font-size:12px}.rec-sub.changed{color:var(--amber)}.rec-amount{text-align:right;font-variant-numeric:tabular-nums;min-width:84px;font-weight:600}.rec-row .badge{flex-shrink:0}.tx-table{border-collapse:collapse;width:100%;font-size:14px}.tx-wrap{overflow:auto hidden}.tx-table.resizable{table-layout:fixed}.tx-table th{text-align:left;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);border-bottom:1px solid var(--border);padding:6px 8px;font-size:12px;position:relative}.tx-table td{vertical-align:middle;border-bottom:1px solid #f0f2f8;padding:7px 8px}.sort-btn{max-width:100%;font:inherit;text-transform:inherit;letter-spacing:inherit;color:inherit;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;align-items:center;gap:4px;padding:0;display:inline-flex;overflow:hidden}.sort-btn:hover,.sort-btn.active{color:var(--text)}.sort-ind{font-size:9px;line-height:1}.tx-table tr:last-child td{border-bottom:none}.tx-table .desc{position:relative}.tx-table .desc-text{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.tx-table.resizable .desc-text{width:100%}.tx-table:not(.resizable) .desc-text{max-width:320px}.tx-table.resizable td.nowrap{text-overflow:ellipsis;overflow:hidden}.tx-table.resizable .cat-select{max-width:100%}.col-resizer{cursor:col-resize;z-index:10;width:7px;position:absolute;top:0;bottom:0;right:-4px}.tx-table.resizable th:last-child .col-resizer{right:0}.col-resizer:hover{background:#3f51b54d}.tx-table .desc[data-tooltip]:hover:after,.tx-table .payee-cell[data-tooltip]:hover:after{content:attr(data-tooltip);z-index:50;color:#fff;white-space:normal;pointer-events:none;background:#23262f;border-radius:6px;max-width:440px;padding:6px 10px;font-size:12px;line-height:1.45;position:absolute;top:calc(100% + 6px);left:8px;box-shadow:0 4px 12px #0f172a40}.payee-cell{position:relative}.tx-table.resizable tbody tr:last-child .desc[data-tooltip]:hover:after,.tx-table.resizable tbody tr:last-child .payee-cell[data-tooltip]:hover:after{top:auto;bottom:calc(100% + 6px)}.payee-cell .payee-input{width:100%;font:inherit;color:var(--text);text-overflow:ellipsis;white-space:nowrap;background:0 0;border:1px solid #0000;border-radius:5px;padding:2px 4px;font-size:13px;overflow:hidden}.payee-cell .payee-input:hover{border-color:var(--border);background:var(--card)}.payee-cell .payee-input:focus{border-color:var(--accent);background:var(--card);outline:none}.payee-input::placeholder{color:#c3c8d4}.tx-table .num{text-align:right;font-variant-numeric:tabular-nums}.tx-table .nowrap{white-space:nowrap}.tx-table .spend{color:var(--red)}.tx-table .income{color:var(--green)}.tx-table .empty-cell{text-align:center;color:var(--muted);padding:24px}.cat-select{border:1px solid var(--border);background:var(--card);border-radius:6px;max-width:180px;padding:3px 6px;font-size:13px}.cat-cell{align-items:center;gap:6px;min-width:0;display:flex}.cat-cell .cat-select{flex:auto;min-width:0;max-width:none}.cat-cell .transfer-toggle{flex:none;margin-left:0}.del-cell{text-align:center;white-space:nowrap}.del-btn{cursor:pointer;opacity:.45;background:0 0;border:none;border-radius:5px;padding:2px 4px;font-size:14px;line-height:1}.del-btn:hover{opacity:1;background:#f443361f}.transfer-toggle{border:1px solid var(--border);background:var(--card);color:var(--muted);cursor:pointer;vertical-align:middle;border-radius:6px;margin-left:6px;padding:2px 6px;font-size:12px;line-height:1.2}.transfer-toggle:hover{border-color:var(--accent)}.transfer-toggle.on{border-color:var(--accent);color:var(--accent);background:#3f51b51f}.month-table{border-collapse:collapse;width:100%;font-size:14px}.month-table th{text-align:left;color:var(--muted);border-bottom:1px solid var(--border);padding:6px 8px;font-size:12px}.month-table td{border-bottom:1px solid #f0f2f8;padding:8px}.month-table .num{text-align:right;font-variant-numeric:tabular-nums}.month-table .spend{color:var(--red)}.month-table .income{color:var(--green)}.month-table .clickable{cursor:pointer}.month-table .clickable:hover{background:#f5f7fb}.filters{flex-wrap:wrap;gap:8px;display:flex}.filters .search{border:1px solid var(--border);border-radius:8px;min-width:200px;padding:6px 10px;font-size:14px}.filters select{border:1px solid var(--border);background:var(--card);border-radius:8px;padding:6px 8px;font-size:14px}.overlay{z-index:100;background:#0f142373;justify-content:center;align-items:flex-start;padding:40px 16px;display:flex;position:fixed;inset:0;overflow-y:auto}.dialog{background:var(--card);border-radius:12px;width:100%;max-width:440px;padding:18px;box-shadow:0 12px 40px #0003}.dialog.wide{max-width:720px}.dialog-head{justify-content:space-between;align-items:center;margin-bottom:14px;display:flex}.dialog-head h2{margin:0;font-size:18px}.dialog-foot{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.mapping{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin:14px 0 10px;display:grid}.mapping label{color:var(--muted);flex-direction:column;gap:4px;font-size:13px;display:flex}.mapping select{border:1px solid var(--border);border-radius:8px;padding:6px 8px;font-size:14px}.check{align-items:center;gap:8px;margin:10px 0;font-size:14px;display:flex}.hint{color:var(--muted);margin:10px 0;font-size:13px}.preview-wrap{border:1px solid var(--border);border-radius:8px;max-height:300px;overflow:auto}.form{flex-direction:column;gap:12px;display:flex}.form label{color:var(--muted);flex-direction:column;gap:4px;font-size:13px;display:flex}.form input,.form select{border:1px solid var(--border);color:var(--text);background:var(--card);border-radius:8px;padding:8px 10px;font-size:14px}.error{color:var(--red);margin:0;font-size:13px}.cat-list{flex-direction:column;gap:8px;max-height:50vh;display:flex;overflow-y:auto}.cat-row{align-items:center;gap:8px;display:flex}.color-input{border:1px solid var(--border);cursor:pointer;background:0 0;border-radius:6px;width:38px;height:32px;padding:0}.name-input{border:1px solid var(--border);border-radius:8px;flex:1;min-width:0;padding:7px 10px;font-size:14px}.budget-input{color:var(--muted);white-space:nowrap;align-items:center;gap:6px;font-size:13px;display:flex}.budget-input input{border:1px solid var(--border);text-align:right;border-radius:8px;width:110px;padding:7px 8px;font-size:14px}.account-filter{border:1px solid var(--border);background:var(--card);border-radius:8px;padding:7px 8px;font-size:14px}.dialog-tabs{background:#e8eaf3;border-radius:8px;width:fit-content;margin:12px 0;padding:3px;display:flex}.paste-area{border:1px solid var(--border);resize:vertical;width:100%;min-height:120px;color:var(--text);background:var(--card);border-radius:8px;padding:10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:14px}.cat-row .b-budget{white-space:nowrap;min-width:auto}.dialog.rule-dialog{max-width:680px}.rule-list{flex-direction:column;gap:10px;max-height:55vh;display:flex;overflow-y:auto}.rule-card{border:1px solid var(--border);background:#fafbfe;border-radius:10px;flex-direction:column;gap:8px;padding:10px;display:flex}.rule-top{align-items:center;gap:8px;display:flex}.rule-pattern{border:1px solid var(--border);min-width:0;color:var(--text);border-radius:8px;flex:1;padding:7px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:14px}.rule-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.rule-label{color:var(--muted);white-space:nowrap;align-items:center;gap:6px;font-size:13px;display:flex}.rule-label input,.rule-label select,.rule-top select{border:1px solid var(--border);color:var(--text);background:var(--card);border-radius:8px;padding:6px 8px;font-size:13px}.rule-label input{min-width:150px}.rule-error{color:var(--red);margin:0;font-size:12px}.empty{color:var(--muted);text-align:center;padding:16px}.footer{color:var(--muted);text-align:center;margin-top:24px;font-size:13px}
