:root{--c-primary:#2f6bff;--c-primary-strong:#1f52e0;--c-primary-soft:#eaf0ff;--c-bg:#f3f5f9;--c-card:#fff;--c-border:#e6e9f0;--c-border-strong:#d6dbe6;--c-text:#171d2b;--c-text-secondary:#67718a;--c-text-tertiary:#98a1b7;--c-success:#10a95b;--c-success-soft:#e5f7ec;--c-danger:#e5484d;--c-danger-soft:#fdebec;--c-warning:#d97a06;--c-warning-soft:#fdf3e3;--sidebar-w:236px;--radius:14px;--radius-sm:10px;--shadow-sm:0 1px 2px #171d2b0d, 0 1px 3px #171d2b0f;--shadow:0 1px 2px #171d2b0a, 0 4px 14px #171d2b0f;--shadow-lg:0 4px 10px #171d2b0f, 0 16px 40px #171d2b1f;--ring:0 0 0 3px #2f6bff29;--grad-primary:linear-gradient(135deg, #3a7bff 0%, #2456e6 100%)}*{box-sizing:border-box}html,body,#app{height:100%;margin:0}body{color:var(--c-text);background:radial-gradient(1200px 500px at 85% -10%, #2f6bff0f, transparent 60%), radial-gradient(900px 420px at -10% 110%, #10a95b0d, transparent 60%), var(--c-bg);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;font-size:14px}a{color:var(--c-primary);text-decoration:none}::selection{background:#2f6bff2e}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:#c9d0de padding-box content-box;border:2px solid #0000;border-radius:8px}::-webkit-scrollbar-thumb:hover{background:#adb7c9 padding-box content-box}::-webkit-scrollbar-track{background:0 0}.card{background:var(--c-card);border:1px solid var(--c-border);border-radius:var(--radius);box-shadow:var(--shadow-sm);padding:20px 22px;transition:box-shadow .2s,border-color .2s}.card:hover{border-color:var(--c-border-strong);box-shadow:var(--shadow)}.card+.card{margin-top:16px}.card-title{letter-spacing:.2px;margin:0 0 14px;font-size:15px;font-weight:600}.btn{border:1px solid var(--c-border-strong);color:var(--c-text);border-radius:var(--radius-sm);cursor:pointer;box-shadow:var(--shadow-sm);background:#fff;justify-content:center;align-items:center;gap:6px;padding:7px 15px;font-size:13px;font-weight:500;line-height:1.4;transition:all .16s;display:inline-flex}.btn:hover:not(:disabled){background:#f7f9fc;border-color:#bcc5d6;transform:translateY(-1px);box-shadow:0 2px 6px #171d2b14}.btn:active:not(:disabled){box-shadow:none;transform:translateY(0)}.btn:focus-visible{box-shadow:var(--ring);outline:none}.btn:disabled{opacity:.55;cursor:not-allowed}.btn-primary{background:var(--grad-primary);color:#fff;border-color:#0000;box-shadow:0 2px 6px #2456e64d}.btn-primary:hover:not(:disabled){background:linear-gradient(135deg,#4a86ff 0%,#2f60ea 100%);box-shadow:0 4px 12px #2456e661}.btn-danger{color:var(--c-danger)}.btn-danger:hover:not(:disabled){background:var(--c-danger-soft);border-color:#f3b6b8}.btn-sm{box-shadow:none;border-radius:8px;padding:4px 10px;font-size:12px}.input,.select{border:1px solid var(--c-border-strong);border-radius:var(--radius-sm);width:100%;color:var(--c-text);background:#fff;outline:none;padding:8px 12px;font-size:13px;transition:border-color .16s,box-shadow .16s,background .16s}.input::placeholder{color:var(--c-text-tertiary)}.input:hover,.select:hover{border-color:#c2cadd}.input:focus,.select:focus{border-color:var(--c-primary);box-shadow:var(--ring)}.field{margin-bottom:14px}.field label{color:var(--c-text-secondary);margin-bottom:6px;font-size:13px;font-weight:500;display:block}.field .error{color:var(--c-danger);margin-top:4px;font-size:12px}.table{border-collapse:collapse;width:100%;font-size:13px}.table th,.table td{text-align:left;border-bottom:1px solid var(--c-border);white-space:nowrap;padding:11px 12px}.table th{color:var(--c-text-tertiary);letter-spacing:.4px;border-bottom-color:var(--c-border-strong);background:#f8fafd;font-size:12px;font-weight:600}.table th:first-child{border-radius:8px 0 0 8px}.table th:last-child{border-radius:0 8px 8px 0}.table tbody tr{transition:background .12s}.table tbody tr:hover{background:#f6f8fc}.table tr:last-child td{border-bottom:none}.table .num{font-variant-numeric:tabular-nums}.empty{text-align:center;color:var(--c-text-tertiary);padding:48px 0;font-size:13px}.tag{border-radius:999px;padding:2px 9px;font-size:12px;font-weight:500;line-height:1.7;display:inline-block}.tag-green{background:var(--c-success-soft);color:var(--c-success)}.tag-red{background:var(--c-danger-soft);color:var(--c-danger)}.tag-orange{background:var(--c-warning-soft);color:var(--c-warning)}.tag-gray{color:var(--c-text-secondary);background:#eef1f6}.tag-blue{background:var(--c-primary-soft);color:var(--c-primary-strong)}.money{font-variant-numeric:tabular-nums;font-weight:600}.money.income{color:var(--c-success)}.money.outcome{color:var(--c-danger)}.text-secondary{color:var(--c-text-secondary)}.toolbar{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:14px;display:flex}.toolbar .spacer{flex:1}.pagination{color:var(--c-text-secondary);justify-content:flex-end;align-items:center;gap:8px;margin-top:14px;font-size:13px;display:flex}.modal-mask{-webkit-backdrop-filter:blur(3px);z-index:100;background:#0f172a80;justify-content:center;align-items:center;animation:.18s fade-in;display:flex;position:fixed;inset:0}.modal{width:440px;max-width:calc(100vw - 32px);max-height:85vh;box-shadow:var(--shadow-lg);background:#fff;border-radius:16px;padding:24px 26px;animation:.22s cubic-bezier(.22,1,.36,1) pop-in;overflow:auto}.modal h3{margin:0 0 18px;font-size:16px;font-weight:600}.modal-actions{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes pop-in{0%{opacity:0;transform:scale(.94)translateY(8px)}to{opacity:1;transform:scale(1)translateY(0)}}.toast-wrap{z-index:200;flex-direction:column;align-items:center;gap:8px;display:flex;position:fixed;top:20px;left:50%;transform:translate(-50%)}.toast{color:#fff;border-radius:10px;padding:10px 20px;font-size:13px;font-weight:500;animation:.24s cubic-bezier(.22,1,.36,1) toast-in;box-shadow:0 8px 24px #171d2b38}.toast.success{background:linear-gradient(135deg,#12b76a,#0e9f5c)}.toast.error{background:linear-gradient(135deg,#ef5a5f,#e03e43)}@keyframes toast-in{0%{opacity:0;transform:translateY(-10px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}.skeleton{-webkit-user-select:none;user-select:none;background:linear-gradient(90deg,#edf0f5 25%,#f7f9fc 37%,#edf0f5 63%) 0 0/400% 100%;border-radius:4px;animation:1.4s infinite skeleton;color:#0000!important}@keyframes skeleton{0%{background-position:100%}to{background-position:0}}
