:root{color:#1f2329;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;background:#f4f5f7;font-family:Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;font-weight:400;line-height:1.5}*{box-sizing:border-box}body{min-width:960px;margin:0}button,input,select{font:inherit}a{color:inherit;text-decoration:none}.loginPage{background:linear-gradient(160deg,#f7f8fa 0%,#eef2f7 100%);place-items:center;min-height:100vh;padding:24px;display:grid}.loginCard{background:#fff;border:1px solid #e5e7eb;border-radius:16px;gap:14px;width:100%;max-width:400px;padding:28px;display:grid;box-shadow:0 10px 30px #0f172a0f}.loginCard h1{margin:0;font-size:22px}.loginCard label,.modal label{color:#4b5563;gap:6px;font-size:13px;display:grid}.loginCard input,.filters>input,.filters>select,.modal input,.modal select{background:#fff;border:1px solid #d1d5db;border-radius:10px;height:40px;padding:0 12px}.loginCard button,.filters>button,.modalActions button,.pageHeader button{color:#fff;cursor:pointer;background:#e53935;border:none;border-radius:10px;height:40px;padding:0 16px}.filters>button.primaryBtn{color:#fff;background:#2563eb;border:none}.filters>button.ghostBtn{color:#4b5563;background:#fff;border:1px solid #d1d5db}.loginCard button:disabled,.filters>button:disabled,.pager button:disabled{opacity:.55;cursor:not-allowed}.appShell{grid-template-columns:220px 1fr;min-height:100vh;display:grid}.sideBar{background:#fff;border-right:1px solid #e5e7eb;flex-direction:column;gap:8px;padding:20px 14px;display:flex}.brand{padding:4px 10px 16px;font-size:18px;font-weight:700}.sideNav{flex-direction:column;flex:1;gap:4px;display:flex}.sideNav a{color:#6b7280;border-radius:10px;padding:10px 12px}.sideNav a.active{color:#b91c1c;background:#fee2e2;font-weight:600}.sideFooter{border-top:1px solid #f0f1f3;gap:10px;padding:12px 4px 4px;display:grid}.main{min-width:0;padding:20px 24px 40px}.page{gap:16px;display:grid}.pageHeader{justify-content:space-between;align-items:center;display:flex}.pageHeader h2{margin:0;font-size:20px}.filters{background:#fff;border:1px solid #e5e7eb;border-radius:12px;flex-wrap:wrap;align-items:center;gap:10px;padding:12px;display:flex}.filters input[placeholder]{min-width:220px}.categoryTree{min-width:200px;position:relative}.categoryTreeTrigger{color:#111827;cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:10px;justify-content:space-between;align-items:center;gap:10px;width:100%;min-width:200px;max-width:280px;height:40px;padding:0 12px;font-size:13px;display:flex}.categoryTreeTriggerLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.categoryTreePanel{z-index:30;background:#fff;border:1px solid #e5e7eb;border-radius:12px;width:min(320px,80vw);max-height:360px;padding:8px;position:absolute;top:calc(100% + 6px);left:0;overflow:auto;box-shadow:0 10px 30px #0f172a1f}.categoryTreePanelHead{color:#6b7280;border-bottom:1px solid #f0f1f3;justify-content:space-between;align-items:center;margin-bottom:6px;padding:6px 8px 10px;font-size:12px;display:flex}.categoryTreeBranch+.categoryTreeBranch{margin-top:4px}.categoryTreeRow{border-radius:8px;align-items:center;gap:6px;padding:6px 8px;display:flex}.categoryTreeRow:hover{background:#f8fafc}.categoryTreeRow.parent{font-weight:600}.categoryTreeChildren{padding-left:22px}.categoryTreeEmpty{padding:6px 8px 10px;font-size:12px}.categoryTreeExpand{cursor:pointer;color:#6b7280;background:0 0;border:none;width:20px;padding:0;font-size:12px}.categoryTreeCheck{cursor:pointer;color:#111827;flex:1;align-items:center;gap:8px;font-size:13px;display:flex}.categoryTreeCheck input{width:auto;margin:0}.filterSummary{background:#fff;border:1px solid #e5e7eb;border-radius:12px;flex-wrap:wrap;align-items:baseline;gap:16px 28px;padding:12px 16px;display:flex}.filterSummaryItem{flex-direction:column;gap:2px;min-width:110px;display:flex}.filterSummaryItem strong{font-variant-numeric:tabular-nums;font-size:18px}.filterSummaryHint{margin-left:auto;font-size:12px}.tableWrap{background:#fff;border:1px solid #e5e7eb;border-radius:12px;overflow:auto}table{border-collapse:collapse;width:100%;font-size:13px}th,td{text-align:left;white-space:nowrap;border-bottom:1px solid #f0f1f3;padding:10px 12px}th{color:#6b7280;background:#fafafa;font-weight:600}.ellipsis{text-overflow:ellipsis;max-width:220px;overflow:hidden}.income{color:#dc2626;font-variant-numeric:tabular-nums}.expense{color:#059669;font-variant-numeric:tabular-nums}.actions{gap:8px;display:flex}.linkBtn{color:#2563eb;cursor:pointer;background:0 0;border:none;padding:0}.linkBtn.danger{color:#dc2626}.ghostBtn{color:#374151;cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:10px;height:36px;padding:0 12px}.sortableTh{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.sortableTh:hover,.sortableTh.active{color:#2563eb}.sortableTh .sortMark{opacity:.85;margin-left:4px;font-size:11px}.pager{align-items:center;gap:12px;display:flex}.pager button{cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:10px;height:36px;padding:0 12px}.muted{color:#6b7280;font-size:13px}.error{color:#b91c1c;background:#fef2f2;border:1px solid #fecaca;border-radius:10px;padding:10px 12px;font-size:13px}.modalMask{z-index:50;background:#0f172a59;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.modal{background:#fff;border-radius:14px;gap:12px;width:100%;max-width:440px;padding:20px;display:grid}.modal h3{margin:0}.modalActions{justify-content:flex-end;gap:8px;margin-top:4px;display:flex}.statGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;display:grid}.statCard{background:#fff;border:1px solid #e5e7eb;border-radius:12px;gap:6px;padding:16px;display:grid}.statLabel{color:#6b7280;font-size:13px}.statValue{font-variant-numeric:tabular-nums;font-size:24px;font-weight:700}.dashSplit{grid-template-columns:1fr 1fr;gap:12px;display:grid}.dashCard{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:16px}.dashCardHead{justify-content:space-between;align-items:baseline;margin-bottom:12px;display:flex}.dashCardHead h3{margin:0;font-size:15px}.catBars{gap:10px;margin:0;padding:0;list-style:none;display:grid}.catBarButton{text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;width:100%;margin:0 -4px;padding:6px 4px;display:block}.catBarButton:hover{background:#f8fafc}.catBarMeta{justify-content:space-between;gap:12px;margin-bottom:4px;font-size:13px;display:flex}.catBarTrack{background:#f3f4f6;border-radius:999px;height:8px;overflow:hidden}.catBarFill{border-radius:999px;height:100%}.catBarFill.expense{background:#34d399}.catBarFill.income{background:#f87171}.trendLineWrap{width:100%;overflow-x:auto}.trendLineSvg{width:100%;min-width:640px;height:auto;display:block}.trendGridLine{stroke:#eef0f3;stroke-width:1px}.trendAxisLabel{fill:#9ca3af;font-size:11px}.trendLinePath{stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.trendLinePath.expense{stroke:#059669}.trendLinePath.income{stroke:#dc2626}.trendDot.expense{fill:#059669}.trendDot.income{fill:#dc2626}.trendPointLabel{font-variant-numeric:tabular-nums;font-size:9px}.trendPointLabel.expense{fill:#059669}.trendPointLabel.income{fill:#dc2626}.trendLegend{color:#6b7280;gap:16px;margin-top:12px;font-size:12px;display:flex}.trendLegend .dot{border-radius:50%;width:8px;height:8px;margin-right:6px;display:inline-block}.trendLegend .dot.expense{background:#34d399}.trendLegend .dot.income{background:#f87171}@keyframes skeletonShimmer{0%{background-position:100% 0}to{background-position:-100% 0}}.dashSkeleton{gap:12px;display:grid}.skeletonBlock{background:linear-gradient(90deg,#eef0f3 0%,#f7f8fa 45%,#eef0f3 90%) 0 0/200% 100%;border-radius:8px;animation:1.25s ease-in-out infinite skeletonShimmer}.skeletonLabel{width:72px;height:14px}.skeletonValue{border-radius:10px;width:118px;height:28px}.skeletonHint{width:140px;height:12px}.skeletonTitle{width:160px;height:16px}.skeletonTrendLine{border-radius:12px;width:100%;height:140px}.skeletonCatName{width:64px;height:13px}.skeletonCatAmount{width:52px;height:13px}.skeletonCatTrack{border-radius:999px;width:100%;height:8px}
