/* ============================================================
   assets/css/app.css — 驾校记账系统
   覆盖全站 60+ 组件 · 移动端优先 · 三档响应式
   ============================================================ */

/* ---- 1. CSS 变量（模板皮肤：深蓝 + 金） ---- */
:root {
    /* 主色系：深蓝 */
    --color-primary: #1a3a5c;          --color-primary-light: #e8f0f8;       --color-primary-dark: #0f2440;
    /* 点缀色：金 */
    --color-accent: #c9a84c;           --color-accent-light: #f5eedb;
    /* 语义色 */
    --color-danger: #c53030;           --color-danger-light: #fff5f5;
    --color-success: #2f855a;          --color-success-light: #f0fff4;
    --color-warning: #c9a84c;          --color-warning-light: #f5eedb;
    /* 中性色 */
    --color-bg: #f2f5f9;              --color-surface: #ffffff;
    --color-text: #1e293b;             --color-text-secondary: #4a5568;      --color-text-muted: #6b7280;
    --color-border: #e2e8f0;           --color-border-light: #e2e8f0;         --color-divider: #e8ecf1;
    --color-overlay: rgba(15,36,64,0.5);
    /* 状态色 */
    --color-pending: #c9a84c;          --color-pending-bg: #f5eedb;
    --color-first: #1a3a5c;            --color-first-bg: #e8f0f8;
    --color-rejected: #c53030;         --color-rejected-bg: #fff5f5;
    --color-approved: #2f855a;         --color-approved-bg: #f0fff4;
    --color-voided: #8896a6;           --color-voided-bg: #f2f5f9;
    /* 圆角 */
    --radius-sm: 8px;                  --radius: 14px;                      --radius-lg: 20px;                   --radius-round: 9999px;
    /* 阴影 */
    --shadow-sm: 0 1px 3px rgba(0,0,0,.05);
    --shadow: 0 4px 12px rgba(0,0,0,.06);
    --shadow-md: 0 8px 24px rgba(0,0,0,.08);
    --shadow-lg: 0 10px 30px rgba(0,0,0,.08);
    /* 斑马纹 */
    --color-stripe: #f8fafc;
    /* 布局 */
    --nav-height: 56px;
    --safe-bottom: env(safe-area-inset-bottom,8px);
    --safe-top: env(safe-area-inset-top,0px);
    --page-padding: 16px;
    --sidebar-width: 280px;
    --max-width: 1400px;
}

/* ---- 2. Reset ---- */
*,*::before,*::after{box-sizing:border-box}
html{font-size:16px;-webkit-text-size-adjust:100%}
body{margin:0;padding:0;padding-top:var(--safe-top);
    font-family:'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Noto Sans SC', sans-serif;
    font-size:15px;line-height:1.5;background:var(--color-bg);color:var(--color-text);
    -webkit-font-smoothing:antialiased;max-width:100vw;overflow-x:hidden}
a{color:var(--color-primary);text-decoration:none;-webkit-tap-highlight-color:transparent}
a:active{opacity:.7}
img{max-width:100%;height:auto}

/* ---- 3. 工具类 ---- */
.page-title{font-size:20px;font-weight:700;margin:0 0 4px}
.page-subtitle{font-size:13px;color:var(--color-text-secondary);margin:0 0 16px}
.section-title{font-size:16px;font-weight:600;margin:0 0 12px}
.text-secondary{color:var(--color-text-secondary)}
.text-muted{color:var(--color-text-muted)}
.text-primary{color:var(--color-primary)}
.text-danger{color:var(--color-danger)}
.text-success{color:var(--color-success)}
.text-warning{color:var(--color-warning)}
.text-sm{font-size:13px}.text-xs{font-size:11px}.text-lg{font-size:18px}.text-xl{font-size:20px}
.text-center{text-align:center}.text-right{text-align:right}
.text-mono{font-family:"SF Mono",Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.flex{display:flex}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}
.items-center{align-items:center}.justify-between{justify-content:space-between}
.gap-8{gap:8px}.gap-12{gap:12px}.gap-16{gap:16px}
.mt-4{margin-top:4px}.mt-8{margin-top:8px}.mt-12{margin-top:12px}.mt-16{margin-top:16px}
.mb-0{margin-bottom:0}.mb-8{margin-bottom:8px}.mb-12{margin-bottom:12px}.mb-16{margin-bottom:16px}
.px-page{padding-left:var(--page-padding);padding-right:var(--page-padding)}
.w-full{width:100%}.hidden{display:none!important}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}

/* ---- 4. 页面容器 ---- */
.page{min-height:calc(100vh - var(--nav-height) - var(--safe-top) - var(--safe-bottom))}
.page-body{padding:12px 0 24px}

/* ---- 5. 页面头部 ---- */
.page-header{display:flex;align-items:center;justify-content:space-between;gap:12px;
    padding:12px var(--page-padding);background:var(--color-surface);
    border-bottom:1px solid var(--color-border-light);position:sticky;top:0;z-index:50}
.page-header h1{font-size:20px;font-weight:700;margin:0;flex:1}
.page-header__back{display:flex;align-items:center;justify-content:center;width:36px;height:36px;
    font-size:20px;color:var(--color-text);border-radius:50%}
.page-header__back:active{background:var(--color-divider)}

/* 模板风格头栏（桌面端卡片式 header） */
.header{background:var(--color-surface);border-radius:var(--radius-lg);
    padding:1.25rem 1.75rem;box-shadow:var(--shadow-sm);border:1px solid var(--color-border);
    display:flex;align-items:center;justify-content:space-between}
.header h2{font-size:1.5rem;font-weight:700;color:var(--color-primary-dark);letter-spacing:-0.3px;margin:0}
.header-actions{display:flex;gap:0.5rem}
.header-btn{width:40px;height:40px;border-radius:50%;background:var(--color-bg);
    border:1px solid var(--color-border);display:flex;align-items:center;justify-content:center;
    color:var(--color-text-secondary);font-size:1rem;cursor:pointer;transition:all 0.15s}
.header-btn:hover{background:var(--color-bg);border-color:var(--color-text-muted)}
@media (max-width:767px){
    .header{
        padding:0.85rem 1rem;border-radius:0;box-shadow:none;border:none;
        border-bottom:1px solid var(--color-border);
        position:sticky;top:0;z-index:50;background:var(--color-surface)
    }
    .header h2{font-size:1.15rem}
    .header .btn-sm{padding:0 10px;font-size:12px;height:30px;min-height:30px}
    .summary-banner{padding:1rem 1.25rem;margin:0;border-radius:0}
    .summary-banner__balance{font-size:1.5rem}
    .summary-banner__detail{font-size:0.75rem;gap:0.5rem}
}

/* ---- 5a. 返回链接 ---- */
.back-link{display:inline-flex;align-items:center;justify-content:center;height:36px;
    font-size:1.2rem;color:var(--color-text);border-radius:50%;text-decoration:none}
.back-link:active{background:var(--color-divider)}

/* ---- 6. 触控 ---- */
button,.btn,select,input[type="date"],input[type="file"],[role="button"]{min-height:44px;min-width:44px;-webkit-tap-highlight-color:transparent;touch-action:manipulation}
input,textarea,select{-webkit-appearance:none;appearance:none;margin:0}

/* ---- 7. 表单 ---- */
label{display:block;font-size:14px;font-weight:500;margin-bottom:6px}
.required{color:var(--color-danger);margin-left:2px}
.form-label{display:block;font-size:14px;font-weight:500;margin-bottom:6px}
.form-group{margin-bottom:16px}
.form-hint{font-size:12px;color:var(--color-text-muted);margin-top:4px}
.form-section{margin-bottom:8px}
.form-section__row{display:flex;gap:8px}
.form-section__title{font-size:17px;font-weight:600;margin:0 0 12px}
.form-error{font-size:12px;color:var(--color-danger);margin-top:4px;display:none}
.form-error.is-visible{display:block}
input[type="text"],input[type="tel"],input[type="number"],input[type="date"],input[type="email"],
input[type="password"],input[type="search"],textarea,select{
    width:100%;padding:10px 12px;font-size:16px;font-family:inherit;
    color:var(--color-text);background:var(--color-surface);
    border:1px solid var(--color-border);border-radius:var(--radius-sm);
    transition:border-color .2s,box-shadow .2s;outline:none}
input:focus-visible,textarea:focus-visible,select:focus-visible{border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-light)}
input:focus:not(:focus-visible),textarea:focus:not(:focus-visible),select:focus:not(:focus-visible){box-shadow:none;outline:none}
input:disabled,textarea:disabled,select:disabled{background:var(--color-divider);color:var(--color-text-muted);cursor:not-allowed;opacity:1}
input::placeholder,textarea::placeholder{color:var(--color-text-muted);opacity:1}
input.is-error,textarea.is-error,select.is-error{border-color:var(--color-danger)!important;box-shadow:0 0 0 3px var(--color-danger-light)!important}
select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12'%3E%3Cpath fill='%235f6368' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
    background-repeat:no-repeat;background-position:right 12px center;padding-right:32px;cursor:pointer}
textarea{min-height:80px;resize:vertical}

/* ---- 8. 金额输入 ---- */
.amount-input,.form-group input[inputmode="decimal"]{font-size:24px;font-weight:700;text-align:center;
    padding:12px 16px;font-variant-numeric:tabular-nums}
.money-input-group{position:relative}
.money-input-prefix{position:absolute;left:16px;top:50%;transform:translateY(-50%);font-size:24px;font-weight:700;color:var(--color-text-secondary);pointer-events:none}
.money-input-group .amount-input,.money-input-group input[inputmode="decimal"]{padding-left:36px!important}

/* ---- 9. 快捷金额 ---- */
.quick-amounts{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}
.quick-amount{flex:1;min-width:60px;padding:8px 4px;font-size:14px;font-weight:500;text-align:center;
    color:var(--color-primary);background:var(--color-primary-light);
    border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer;
    transition:background .15s;-webkit-tap-highlight-color:transparent}
.quick-amount:active,.quick-amount.is-active{background:var(--color-primary);color:#fff}

/* ---- 10. 按钮 ---- */
.btn{display:inline-flex;align-items:center;justify-content:center;padding:0 16px;height:40px;
    font-size:14px;font-weight:500;font-family:inherit;line-height:1;
    color:var(--color-text);background:var(--color-surface);
    border:1px solid var(--color-border);border-radius:var(--radius-sm);cursor:pointer;
    white-space:nowrap;gap:6px;transition:background .15s,opacity .15s}
.btn:active{opacity:.8;transform:scale(.98)}
.btn:disabled{opacity:.5;cursor:not-allowed;transform:none}
.btn--primary,.btn-primary{color:#fff;background:var(--color-primary);border-color:var(--color-primary);box-shadow:0 1px 2px rgba(26,115,232,.3)}
.btn--primary:active,.btn-primary:active{background:var(--color-primary-dark)}
.btn--danger,.btn-danger{color:#fff;background:var(--color-danger);border-color:var(--color-danger)}
.btn--success,.btn-success{color:#fff;background:var(--color-success);border-color:var(--color-success)}
.btn--outline,.btn-outline{color:var(--color-primary);background:transparent;border-color:var(--color-primary)}
.btn-outline:active{background:var(--color-primary-light)}
.btn--ghost,.btn-ghost{color:var(--color-text-secondary);background:transparent;border-color:transparent}
.btn-ghost:hover{background:var(--color-divider)}
.btn--sm,.btn-sm{height:32px;padding:0 12px;font-size:13px}
.btn--lg,.btn-lg{height:48px;padding:0 24px;font-size:16px;font-weight:600}
.btn--block,.btn-block{width:100%}
.btn--icon{width:40px;padding:0;min-width:40px}

/* ---- 11. 卡片 ---- */
.card{background:var(--color-surface);border-radius:var(--radius);box-shadow:var(--shadow);
    margin:16px var(--page-padding);overflow:hidden}
.card__header,.card-header{padding:14px 16px 10px;display:flex;align-items:center;
    justify-content:space-between;border-bottom:1px solid var(--color-divider)}
.card__title,.card-header h3{font-size:16px;font-weight:600;margin:0}
.card__body,.card-body{padding:16px}
.card__footer{padding:12px 16px;border-top:1px solid var(--color-divider);display:flex;justify-content:flex-end;gap:8px}
.card--compact{margin:4px var(--page-padding)}
.card--flat{box-shadow:none;border:1px solid var(--color-border-light)}
.card--income,.card-income{border-left:4px solid var(--color-success)}
.card--expense,.card-expense{border-left:4px solid var(--color-danger)}
.card--highlight{background:var(--color-primary);color:#fff}

/* ---- 12. Badge 状态标签 ---- */
.badge{display:inline-flex;align-items:center;padding:2px 10px;font-size:12px;font-weight:600;
    line-height:20px;border-radius:var(--radius-round);white-space:nowrap}
.badge--pending,.badge-pending{color:var(--color-pending);background:var(--color-pending-bg)}
.badge--first,.badge-first{color:var(--color-first);background:var(--color-first-bg)}
.badge--rejected,.badge-rejected{color:var(--color-rejected);background:var(--color-rejected-bg)}
.badge--approved,.badge-approved,.badge--active,.badge-active{color:var(--color-approved);background:var(--color-approved-bg)}
.badge--voided,.badge-voided{color:var(--color-voided);background:var(--color-voided-bg)}
.badge--void_pending,.badge-void_pending{color:var(--color-warning);background:var(--color-warning-light)}
.badge--inactive,.badge-inactive{color:var(--color-voided);background:var(--color-voided-bg)}
.badge--super_admin,.badge-super_admin{color:#fff;background:#c62828}
.badge--unpaid{color:var(--color-pending);background:var(--color-pending-bg)}
.badge--paid{color:var(--color-voided);background:var(--color-voided-bg)}
.badge--primary,.badge-primary{color:var(--color-primary);background:var(--color-primary-light)}
.badge-sm{font-size:11px;padding:1px 6px;line-height:16px}

/* ---- 13. Tab ---- */
.tabs{display:flex;background:var(--color-surface);border-bottom:1px solid var(--color-border-light);
    overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tab,.tab-item{flex:none;padding:12px 16px;font-size:14px;font-weight:500;
    color:var(--color-text-secondary);text-align:center;cursor:pointer;white-space:nowrap;
    border-bottom:2px solid transparent;transition:color .2s,border-color .2s;
    min-height:44px;display:flex;align-items:center;text-decoration:none}
.tab.is-active,.tab--active,.tab-item.active{color:var(--color-primary);border-bottom-color:var(--color-primary)}
.tab__count,.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;
    padding:0 5px;margin-left:6px;font-size:11px;font-weight:700;color:#fff;
    background:var(--color-danger);border-radius:var(--radius-round)}

/* ---- 14. 底部导航（移动端） ---- */
.bottom-nav-mobile{display:none;position:fixed;bottom:0;left:0;right:0;z-index:100;
    padding:0.5rem 0.8rem calc(0.5rem + var(--safe-bottom));background:var(--color-surface);
    border-top:1px solid var(--color-border);justify-content:space-around;align-items:center}
@media (max-width:767px){.bottom-nav-mobile{display:flex}}
.nav-item-mobile{display:flex;flex-direction:column;align-items:center;gap:0.2rem;
    font-size:0.65rem;font-weight:600;color:var(--color-text-muted);
    cursor:pointer;text-decoration:none;transition:color 0.15s;position:relative}
.nav-item-mobile i{font-size:1.2rem}
.nav-item-mobile.active{color:var(--color-primary)}
.nav-item-mobile.cta i{font-size:1.8rem;color:var(--color-accent)}
.nav-item__dot{position:absolute;top:0;right:2px;width:8px;height:8px;
    background:var(--color-danger);border-radius:50%;border:1.5px solid var(--color-surface)}
.nav-badge{display:inline-flex;align-items:center;justify-content:center;
    min-width:18px;height:18px;padding:0 5px;margin-left:auto;font-size:11px;font-weight:700;
    color:#fff;background:var(--color-danger);border-radius:var(--radius-round)}

/* 桌面端侧边栏子项（移动端隐藏） */
.nav-sub{display:none}
.side-section{display:none;font-size:11px;font-weight:600;color:var(--color-text-muted);
    text-transform:uppercase;letter-spacing:.5px;padding:0 20px;align-items:center;gap:8px}
.side-spacer{display:none;flex:1}
.side-brand{display:none}

/* ---- 14a. 桌面端 avatar（匹配模板） ---- */
.avatar{width:48px;height:48px;border-radius:12px;background:var(--color-primary);
    display:flex;align-items:center;justify-content:center;
    color:white;font-weight:700;font-size:1.2rem;flex-shrink:0}
.profile-name{font-weight:700;font-size:1rem;color:var(--color-text)}
.profile-role{font-size:0.78rem;color:var(--color-text-muted);margin-top:0.15rem}

/* ---- 15. Toast ---- */
.toast{position:fixed;top:calc(16px + var(--safe-top));left:50%;transform:translateX(-50%);
    padding:12px 24px;border-radius:var(--radius-round);font-size:14px;font-weight:500;
    color:#fff;z-index:9999;box-shadow:0 4px 12px rgba(0,0,0,.2);
    max-width:calc(100vw - 32px);text-align:center;
    animation:toast-in .3s ease;transition:opacity .3s ease}
.toast--success,.toast-success{background:var(--color-success);color:#fff}
.toast--error,.toast-error{background:var(--color-danger);color:#fff}
.toast--warning,.toast-warning{background:#b8943a;color:#fff}
.toast--info,.toast-info{background:var(--color-primary);color:#fff}
@keyframes toast-in{from{opacity:0;transform:translateX(-50%) translateY(-12px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}

/* ---- 16. 弹窗 ---- */
.dialog-overlay,.modal-overlay{position:fixed;inset:0;z-index:9000;background:var(--color-overlay);
    display:flex;align-items:center;justify-content:center;padding:24px;animation:overlay-in .2s ease}
@keyframes overlay-in{from{opacity:0}to{opacity:1}}
.dialog,.modal-sheet{background:var(--color-surface);border-radius:var(--radius-lg);
    box-shadow:var(--shadow-lg);width:100%;max-width:420px;max-height:85vh;
    overflow-y:auto;animation:dialog-in .25s ease}
.modal-sheet{border-radius:var(--radius-lg) var(--radius-lg) 0 0;max-width:100%}
@keyframes dialog-in{from{opacity:0;transform:scale(.9) translateY(10px)}to{opacity:1;transform:scale(1) translateY(0)}}
.dialog,.modal-sheet{padding:0}
.dialog__title,.modal-header h2{font-size:17px;font-weight:600;margin:0}
.dialog__body{font-size:14px;color:var(--color-text-secondary);margin:0;line-height:1.6}
.modal-header{display:flex;align-items:center;justify-content:space-between;
    padding:16px 20px;border-bottom:1px solid var(--color-divider);position:sticky;top:0;background:var(--color-surface)}
.modal-close{background:none;border:none;font-size:20px;color:var(--color-text-secondary);cursor:pointer;padding:4px 8px;border-radius:50%}
.modal-close:active{background:var(--color-divider)}
.modal-header h2{margin:0;flex:1}
.modal-sheet form{padding:16px 20px}
.dialog__input{margin:0 0 20px;padding:0 24px}
.dialog__input textarea{width:100%;min-height:72px;font-size:14px}
.dialog__actions,.dialog{padding:24px}
.btn-fixed-bottom{position:fixed;bottom:calc(var(--nav-height) + var(--safe-bottom));
    left:0;right:0;z-index:99;padding:10px var(--page-padding);
    padding-bottom:calc(10px + var(--safe-bottom));background:var(--color-surface);
    border-top:1px solid var(--color-border);display:flex;gap:10px;box-shadow:0 -2px 8px rgba(0,0,0,.06)}
.btn-fixed-bottom .btn{flex:1}

/* ---- 17. 列表项 ---- */
.list-item{display:flex;align-items:center;padding:12px 16px;
    border-bottom:1px solid var(--color-divider);gap:12px;cursor:pointer}
.list-item:last-child{border-bottom:none}
.list-item:active{background:var(--color-divider)}
.list-item--pending,
.list-item--muted {
    opacity: 0.55;
}
.list-item--pending .item-amount {
    color: var(--color-text-muted) !important;
    font-weight: 400;
}
.card--pending {
    opacity: 0.75;
}
.card--pending .card-footer,
.card--pending button {
    opacity: 1;
}
.card--pending .amount-income,
.card--pending .amount-expense {
    color: var(--color-text-muted) !important;
}
.item-avatar{flex-shrink:0;width:40px;height:40px;border-radius:50%;
    background:var(--color-primary-light);color:var(--color-primary);
    display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700}
.item-content{flex:1;min-width:0}
.item-title{font-size:15px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.item-subtitle{font-size:13px;color:var(--color-text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px}
.item-extra{flex-shrink:0;text-align:right;font-size:14px;min-width:40px}
.item-amount{font-weight:600;font-variant-numeric:tabular-nums}
.amount-income,.item-amount.amount-income{color:var(--color-success)}
.amount-expense,.item-amount.amount-expense{color:var(--color-danger)}
.item-arrow{flex-shrink:0;width:20px;height:20px;color:var(--color-text-muted);display:flex;align-items:center;justify-content:center}

/* ---- 18. 搜索下拉 ---- */
.search-selector{position:relative}
.search-input-wrap{position:relative;display:flex;align-items:center}
.search-icon{position:absolute;left:10px;font-size:16px;pointer-events:none;z-index:1}
.search-dropdown{display:none;position:absolute;top:100%;left:0;right:0;z-index:200;
    max-height:280px;overflow-y:auto;background:var(--color-surface);
    border:1px solid var(--color-border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);margin-top:4px}
.search-dropdown.show,.search-dropdown.is-open{display:block}
.dropdown-section{padding:6px 14px;font-size:11px;font-weight:600;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.5px}
.dropdown-item{padding:10px 14px;font-size:14px;cursor:pointer;display:flex;align-items:center;
    justify-content:space-between;transition:background .1s;color:var(--color-text)}
.dropdown-item:active{background:var(--color-primary-light)}
.dropdown-item .item-info{flex:1;min-width:0}
.dropdown-item .item-name{font-weight:500}
.dropdown-item .item-detail{font-size:12px;color:var(--color-text-muted)}
.dropdown-empty{padding:16px 14px;text-align:center;color:var(--color-text-muted);font-size:13px}
.dropdown-add{padding:12px 14px;text-align:center;color:var(--color-primary);font-weight:500;
    border-top:1px solid var(--color-divider);cursor:pointer;font-size:14px}
.dropdown-add:active{background:var(--color-primary-light)}

/* ---- 19. 单选卡片 ---- */
.radio-group{display:flex;gap:10px;flex-wrap:wrap}
.radio-card{flex:1;min-width:90px;padding:14px 8px;text-align:center;font-size:14px;font-weight:500;
    border:2px solid var(--color-border);border-radius:var(--radius);cursor:pointer;
    transition:border-color .2s,background .2s;background:var(--color-surface)}
.radio-card .radio-icon{font-size:24px;display:block;margin-bottom:4px}
.radio-card.active,.radio-card.is-active{border-color:var(--color-primary);background:var(--color-primary-light);color:var(--color-primary)}

/* ---- 20. 标签多选 ---- */
.tag-check-list{display:flex;gap:8px;flex-wrap:wrap}
.tag-check{padding:8px 18px;font-size:14px;font-weight:500;border:1.5px solid var(--color-border);
    border-radius:var(--radius-round);cursor:pointer;transition:all .15s;color:var(--color-text-secondary)}
.tag-check.selected,.tag-check.active{background:var(--color-primary);border-color:var(--color-primary);color:#fff}

/* ---- 21. 分类大卡片 ---- */
.category-cards{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.category-card{padding:20px 12px;border:2px solid var(--color-border);border-radius:var(--radius);
    text-align:center;cursor:pointer;transition:border-color .2s,background .2s;font-size:15px;font-weight:600}
.category-card.is-active,.category-card.active{border-color:var(--color-primary);background:var(--color-primary-light)}
.category-card .cat-icon{font-size:28px;display:block;margin-bottom:6px}
.category-card .cat-label{display:block}

/* ---- 22. 上传 ---- */
.upload-zone,.upload-trigger{display:flex;flex-direction:column;align-items:center;
    justify-content:center;padding:20px 16px;border:2px dashed var(--color-border);
    border-radius:var(--radius);cursor:pointer;font-size:13px;font-weight:500;
    color:var(--color-text-secondary);transition:border-color .2s,color .2s;text-align:center}
.upload-zone:active,.upload-trigger:active{border-color:var(--color-primary);color:var(--color-primary)}
.upload-icon{font-size:28px;margin-bottom:6px}
.upload-hint{font-size:11px;color:var(--color-text-muted);margin-top:4px}
.upload-preview{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}
.upload-preview__item,.preview-item{position:relative;width:80px;height:80px;border-radius:var(--radius-sm);
    overflow:hidden;border:1px solid var(--color-border);flex-shrink:0}
.upload-preview__item img,.preview-item img{width:100%;height:100%;object-fit:cover}
.preview-remove{position:absolute;top:-2px;right:-2px;width:22px;height:22px;border-radius:50%;
    background:var(--color-danger);color:#fff;border:2px solid var(--color-surface);
    font-size:14px;line-height:18px;text-align:center;cursor:pointer;padding:0;
    display:flex;align-items:center;justify-content:center}
.upload-preview__add{width:80px;height:80px;border:2px dashed var(--color-border);
    border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;
    font-size:28px;color:var(--color-text-muted);cursor:pointer;flex-shrink:0}
.upload-progress{margin-top:8px;height:4px;background:var(--color-border-light);border-radius:2px;overflow:hidden}
.upload-progress__bar{height:100%;background:var(--color-primary);border-radius:2px;width:0;transition:width .3s}
.progress-bar{height:8px;background:var(--color-border-light);border-radius:4px;overflow:hidden;margin:8px 16px}
.progress-fill{height:100%;background:var(--color-primary);border-radius:4px;min-width:4px;transition:width .3s}

/* ---- 23. 首页仪表盘 ---- */
.summary-cards{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:0 var(--page-padding);margin-bottom:16px;margin-top:16px}
.summary-cards.cols-2{grid-template-columns:1fr 1fr}
.summary-card,.dashboard-stat{background:var(--color-surface);border-radius:var(--radius);
    padding:16px 12px;text-align:center;box-shadow:var(--shadow-sm)}
.summary-card.income,.dashboard-stat--success{border-left:4px solid var(--color-success)}
.summary-card.expense{border-left:4px solid var(--color-danger)}
.summary-card.balance,.dashboard-stat--primary{border-left:4px solid var(--color-primary)}
.sum-label,.dashboard-stat__label{font-size:12px;color:var(--color-text-secondary);margin-bottom:4px}
.sum-value,.dashboard-stat__value{font-size:20px;font-weight:700;font-variant-numeric:tabular-nums}
.dashboard-stat__value{color:var(--color-primary)}
.sum-sub{font-size:12px;color:var(--color-text-muted);margin-top:2px}

.info-row{display:flex;justify-content:space-between;align-items:flex-start;padding:8px 0;border-bottom:1px solid var(--color-divider);gap:12px}
.info-row:last-child{border-bottom:none}
.info-label{flex-shrink:0;font-size:13px;color:var(--color-text-secondary);min-width:64px}
.info-value{flex:1;text-align:right;font-size:14px;word-break:break-all}

.entry-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;padding:4px 8px 8px}
.entry-card{display:flex;flex-direction:column;align-items:center;padding:12px 4px;
    text-decoration:none;color:var(--color-text);border-radius:var(--radius);transition:background .15s}
.entry-card:active{background:var(--color-divider)}
.entry-icon{display:flex;align-items:center;justify-content:center;margin-bottom:4px}
.entry-card svg{margin-bottom:4px}
.entry-label{font-size:12px;color:var(--color-text-secondary)}

/* ---- 24. 空状态 ---- */
.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;
    padding:40px 24px;text-align:center}
.card-body>.empty-state{padding:24px 16px}
.empty-icon,.empty-state__icon{font-size:56px;line-height:1;margin-bottom:16px;opacity:.6}
.empty-text,.empty-state__title{font-size:16px;font-weight:600;margin:0 0 8px}
.empty-state__desc{font-size:14px;color:var(--color-text-secondary);margin:0 0 20px;max-width:240px;line-height:1.5}

/* ---- 25. 骨架屏 ---- */
.skeleton{background:linear-gradient(90deg,var(--color-divider) 25%,#e8eaed 50%,var(--color-divider) 75%);
    background-size:200% 100%;border-radius:var(--radius-sm)}
@media (prefers-reduced-motion:no-preference){
    .skeleton{animation:skeleton-shimmer 1.5s ease-in-out infinite}
}
@keyframes skeleton-shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
.skeleton-card{padding:16px;margin:0;background:var(--color-surface);border-radius:var(--radius);box-shadow:var(--shadow-sm)}
.skeleton-line{height:14px;margin-bottom:8px;width:70%}
.skeleton--text{height:14px;margin-bottom:8px;width:70%}
.skeleton--title{height:18px;margin-bottom:10px;width:50%}
.skeleton--card{height:80px;margin:8px var(--page-padding)}
.skeleton-avatar{width:40px;height:40px;border-radius:50%}
.skeleton-row{display:flex;align-items:center;gap:12px}

/* ---- 26. 筛选栏 ---- */
.filter-bar{display:flex;gap:8px;padding:10px var(--page-padding) 12px;
    scrollbar-width:none;flex-wrap:wrap;align-items:center}
@media (min-width:768px){.filter-bar{flex-wrap:wrap;overflow-x:visible}}
@media (max-width:767px){.filter-bar{overflow-x:auto;overflow-y:hidden;flex-wrap:nowrap;-webkit-overflow-scrolling:touch;
    scrollbar-width:none;padding-left:var(--page-padding);padding-right:var(--page-padding);
    position:sticky;top:0;z-index:40;background:var(--color-bg);border-bottom:1px solid var(--color-border-light)}
.filter-bar::-webkit-scrollbar{display:none}
.filter-tab{flex-shrink:0;padding:0.35rem 0.8rem;font-size:0.78rem}
.filter-tab i{display:none}
#filter-bar .date-range{flex-shrink:0;min-width:auto;max-width:150px}
#filter-bar .date-range .date-range__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
#filter-bar .date-range .date-range__from,
#filter-bar .date-range .date-range__to{position:absolute;width:0;height:0;min-width:0;padding:0;overflow:hidden}
#filter-bar select{flex-shrink:0;min-width:80px;max-width:100px;font-size:13px;padding:6px 24px 6px 8px}
#filter-bar #filter-search{flex-shrink:0;min-width:110px;max-width:160px;font-size:13px;padding:6px 8px 6px 30px}
#filter-bar #filter-search::placeholder{font-size:11px}
#filter-bar .btn-sm{flex-shrink:0}
#filter-bar>*{flex-shrink:0!important}}
.filter-chip{flex:none;padding:6px 14px;font-size:13px;font-weight:500;color:var(--color-text-secondary);
    background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-round);
    cursor:pointer;white-space:nowrap}
.filter-chip.is-active,.filter-chip.active{color:#fff;background:var(--color-primary);border-color:var(--color-primary)}
/* 筛选胶囊 — 模板风格 pill-shaped tabs */
.filter-tab{background:var(--color-bg);padding:0.5rem 1.1rem;border-radius:24px;
    font-size:0.84rem;font-weight:500;color:var(--color-text-secondary);
    white-space:nowrap;cursor:pointer;transition:all 0.2s;
    border:1px solid var(--color-border);display:flex;align-items:center;gap:0.35rem;
    text-decoration:none;flex:none}
.filter-tab i{font-size:0.75rem}
.filter-tab.active{background:var(--color-primary);color:white;border-color:var(--color-primary);
    box-shadow:0 4px 10px rgba(0,0,0,0.3);font-weight:600}
.filter-tab.active i{color:var(--color-accent)}
/* 筛选栏中的 <select> 并排均分 */
.filter-bar select{flex:1;min-width:0}

/* ---- 27. 折叠组 ---- */
.accordion{margin:16px var(--page-padding);background:var(--color-surface);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}
.accordion__header,.group-header{display:flex;align-items:center;justify-content:space-between;
    padding:14px 16px;cursor:pointer;font-size:15px;font-weight:500;gap:12px}
.group-header:active{background:var(--color-divider)}
.group-arrow{font-size:12px;color:var(--color-text-muted);transition:transform .25s}
.accordion.is-open .accordion__arrow,.group-body{display:block}
.accordion__body,.group-body{display:none;border-top:1px solid var(--color-divider)}
.accordion.is-open .accordion__body{display:block}

/* 分组折叠 */
.group-body{display:block}
.group-body.collapsed{display:none}
.group-header.collapsed .group-arrow{transform:rotate(-90deg)}

/* ---- 28. 分页 ---- */
.pagination{display:flex;align-items:center;justify-content:center;gap:8px;padding:16px}
.pagination__btn,.page-btn{min-width:36px;height:36px;padding:0 8px;font-size:13px;font-weight:500;
    color:var(--color-text-secondary);background:var(--color-surface);
    border:1px solid var(--color-border);border-radius:var(--radius-sm);cursor:pointer;
    display:flex;align-items:center;justify-content:center}
.pagination__btn:disabled,.page-btn:disabled{opacity:.4;cursor:not-allowed}
.pagination__btn.is-active,.page-btn.is-active,.page-btn.active{color:#fff;background:var(--color-primary);border-color:var(--color-primary)}
.pagination__info{font-size:13px;color:var(--color-text-secondary)}

/* ---- 29. 审核卡片 ---- */

/* 审核列表容器 */
.review-list{display:flex;flex-direction:column;gap:12px;padding:0 var(--page-padding) 16px}

/* 单张审核卡片 */
.review-card{position:relative;background:var(--color-surface);border-radius:var(--radius);
    box-shadow:var(--shadow);padding:14px 16px;overflow:hidden;
    transition:opacity .3s ease,transform .3s ease}
.review-card--income{border-left:4px solid var(--color-success)}
.review-card--expense{border-left:4px solid var(--color-danger)}
.review-card--student{border-left:4px solid var(--color-accent)}
/* 状态变体：驳回 */
.review-card[data-review-status="rejected"]{opacity:.8}
.review-card[data-review-status="voided"]{opacity:.7}
/* 移除动画（二审通过后从「待我审核」列表滑出） */
.review-card--removing{opacity:0;transform:translateX(100%)}

/* 卡片头部：类型标签 + 状态徽标 + 时间（flex 两端对齐） */
.review-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
.review-card__type{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.review-card__type-icon{display:inline-flex;align-items:center;justify-content:center;
    width:20px;height:20px;font-size:14px;flex-shrink:0}
.review-card__type-label{font-size:14px;font-weight:600;color:var(--color-text)}
.review-card__time{font-size:12px;color:var(--color-text-muted);white-space:nowrap;flex-shrink:0}

/* 元信息：提交人 + 学员 */
.review-card__meta{display:flex;align-items:center;gap:4px;font-size:13px;
    color:var(--color-text-secondary);margin-bottom:6px;flex-wrap:wrap}
.review-card__submitter{color:var(--color-text-secondary)}
.review-card__student{color:var(--color-text-muted)}

/* 金额（大字突出） */
.review-card__amount{font-size:20px;font-weight:700;font-variant-numeric:tabular-nums;
    color:var(--color-text);margin-bottom:6px;line-height:1.3}

/* 备注（最多 2 行截断） */
.review-card__note{font-size:12px;color:var(--color-text-muted);margin-bottom:10px;
    line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}

/* 操作按钮区 */
.review-card__actions{display:flex;gap:8px;padding-top:10px;
    border-top:1px solid var(--color-divider);justify-content:flex-end}
.review-card__actions .btn{flex:1;max-width:120px;height:36px;font-size:13px}

/* 批量审核复选框（恢复原生外观，覆盖全局 appearance:none） */
.batch-checkbox,.batch-transfer-checkbox{-webkit-appearance:auto;appearance:auto;width:18px;height:18px;cursor:pointer;accent-color:var(--color-accent);
    flex-shrink:0;vertical-align:middle;margin-right:8px}

/* ---- 30. 受益人 ---- */
.beneficiary-row{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.beneficiary-row__name{flex:1;min-width:0}
.beneficiary-row__amount{width:120px;flex-shrink:0}
.beneficiary-row__remove{flex-shrink:0;width:32px;height:32px;display:flex;align-items:center;
    justify-content:center;color:var(--color-danger);font-size:20px;cursor:pointer;border-radius:50%}
.beneficiaries-total{font-size:13px;color:var(--color-text-secondary);margin-top:4px}
.beneficiaries-total.is-exceeded{color:var(--color-danger);font-weight:600}

/* ---- 31. 图片查看器 ---- */
.image-viewer,.image-lightbox{position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,.95);
    display:flex;align-items:center;justify-content:center;cursor:pointer}
.image-viewer img,.image-lightbox img{max-width:95vw;max-height:95vh;object-fit:contain}
.image-viewer__close{position:absolute;top:calc(16px + var(--safe-top));right:16px;
    width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.2);
    color:#fff;border:none;font-size:20px;cursor:pointer}

/* ---- 32. 报表卡片 ---- */
.report-cards{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:0 var(--page-padding);margin-bottom:16px}
.report-card{display:flex;flex-direction:column;align-items:center;padding:20px 12px;
    text-align:center;background:var(--color-surface);border-radius:var(--radius);
    box-shadow:var(--shadow-sm);text-decoration:none;color:var(--color-text);transition:transform .15s}
.report-card:active{transform:scale(.97)}
.report-card-icon{font-size:36px;margin-bottom:8px}
.report-card-label{font-size:14px;font-weight:500}
.report-card-desc{font-size:11px;color:var(--color-text-muted);margin-top:4px}

/* ---- 33. 统计表格 ---- */
.stat-table{width:100%;border-collapse:collapse;font-size:14px}
.stat-table th{padding:10px 12px;text-align:left;font-weight:600;font-size:12px;
    color:var(--color-text-secondary);border-bottom:2px solid var(--color-border)}
.stat-table td{padding:10px 12px;border-bottom:1px solid var(--color-divider)}
.stat-table tr:last-child td{border-bottom:none}
.stat-number{font-variant-numeric:tabular-nums;font-weight:500;text-align:right}
.stat-table .text-right{text-align:right}

/* ---- 34. 个人中心 ---- */
.profile-page{padding:24px var(--page-padding)}
.profile-avatar{width:64px;height:64px;border-radius:50%;background:var(--color-primary-light);
    color:var(--color-primary);display:flex;align-items:center;justify-content:center;
    font-size:28px;font-weight:700;margin:0 auto 12px}
.profile-menu{background:var(--color-surface);border-radius:var(--radius);box-shadow:var(--shadow)}
.profile-menu-item{display:flex;align-items:center;padding:14px 16px;border-bottom:1px solid var(--color-divider);
    color:var(--color-text);text-decoration:none;font-size:15px;gap:12px}
.profile-menu-item:last-child{border-bottom:none}
.profile-menu-item:active{background:var(--color-divider)}
.profile-menu-icon{font-size:20px;width:28px;text-align:center}
.profile-menu-arrow{font-size:14px;color:var(--color-text-muted);margin-left:auto}

/* ---- 35. 分隔线 ---- */
.divider{border:none;border-top:1px solid var(--color-divider);margin:12px 0}
.divider--spacious{margin:20px 0}
.divider--inset{margin-left:16px;margin-right:16px}

/* ---- 36. 登录页 ---- */
.login-page{display:flex;flex-direction:column;align-items:center;justify-content:center;
    min-height:100vh;min-height:100dvh;padding:32px 24px;background:var(--color-bg)}
.login-page__logo{font-size:56px;margin-bottom:16px}
.login-page__title{font-size:24px;font-weight:700;margin:0 0 8px}
.login-page__subtitle{font-size:14px;color:var(--color-text-secondary);margin:0 0 32px}
.login-page__form{width:100%;max-width:360px}
.login-page__form .form-group{margin-bottom:20px}
.login-page__form input[type="tel"],.login-page__form input[type="password"]{
    font-size:18px;text-align:center;padding:14px 16px;letter-spacing:2px}

/* ---- 37. 学员详情 ---- */
.student-summary{display:flex;gap:12px;padding:12px var(--page-padding)}
.student-summary__item{flex:1;text-align:center;background:var(--color-surface);
    border-radius:var(--radius);padding:12px 8px;box-shadow:var(--shadow-sm)}
.student-summary__amount{font-size:18px;font-weight:700;font-variant-numeric:tabular-nums}
.student-summary__label{font-size:11px;color:var(--color-text-secondary);margin-top:4px}

/* ---- 38. 底部操作栏 ---- */
.bottom-actions{position:fixed;bottom:calc(var(--nav-height) + var(--safe-bottom));
    left:0;right:0;z-index:99;padding:10px var(--page-padding);
    padding-bottom:calc(10px + var(--safe-bottom));background:var(--color-surface);
    border-top:1px solid var(--color-border);display:flex;gap:10px;box-shadow:0 -2px 8px rgba(0,0,0,.06)}
.bottom-actions .btn{flex:1}
.bottom-actions--no-nav{bottom:0}
.has-bottom-actions{padding-bottom:90px}

/* ---- 39. 页面内容区 ---- */
.page-content{padding:8px 0}
.page-content--flush{padding:0}
.page-content--with-actions{padding-bottom:72px}

/* ---- 40. 侧边栏组件（桌面端） ---- */
.desktop-sidebar{display:none}
.sidebar-card{background:var(--color-surface);border-radius:var(--radius-lg);padding:1.5rem;box-shadow:var(--shadow);border:1px solid var(--color-border)}
.sidebar-profile{display:flex;align-items:center;gap:0.85rem;margin-bottom:1.5rem;padding-bottom:1.25rem;border-bottom:1px solid var(--color-border)}
.sidebar-avatar{width:48px;height:48px;border-radius:12px;background:var(--color-primary);display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:1.2rem;flex-shrink:0}
.sidebar-profile-name{font-weight:700;font-size:1rem;color:var(--color-text)}
.sidebar-profile-role{font-size:0.78rem;color:var(--color-text-muted);margin-top:0.15rem}
.sidebar-brand{display:flex;align-items:center;gap:0.5rem;padding-bottom:1rem;margin-bottom:0.5rem;border-bottom:1px solid var(--color-border);font-size:1rem;font-weight:700;color:var(--color-primary-dark)}
.sidebar-nav{display:flex;flex-direction:column;gap:0.25rem}
.sidebar-nav-item{display:flex;align-items:center;gap:0.75rem;padding:0.7rem 0.9rem;border-radius:var(--radius-sm);font-size:0.9rem;font-weight:500;color:var(--color-text-secondary);text-decoration:none;cursor:pointer;transition:all 0.15s}
.sidebar-nav-item i{width:20px;text-align:center;font-size:1rem;color:var(--color-text-muted);flex-shrink:0}
.sidebar-nav-item.active{background:var(--color-primary);color:#fff;font-weight:600}
.sidebar-nav-item.active i{color:var(--color-accent)}
.sidebar-nav-item:not(.active):hover{background:var(--color-bg);color:var(--color-primary)}
.sidebar-nav-icon{width:20px;text-align:center;font-size:1rem;color:var(--color-text-muted);flex-shrink:0}
.sidebar-stats{margin-top:0.5rem;display:flex;flex-direction:column;gap:0.5rem}
.sidebar-stats-title{font-weight:700;font-size:0.9rem;margin-bottom:0.75rem;color:var(--color-primary-dark)}
.sidebar-stat-row{display:flex;justify-content:space-between;align-items:center;font-size:0.85rem;padding:0.3rem 0}
.sidebar-stat-row--balance{border-top:1px solid var(--color-border);padding-top:0.9rem;margin-top:0.4rem}
.stat-label{color:var(--color-text-secondary);font-weight:500}
.income-stat{color:var(--color-success);font-weight:700}
.expense-stat{color:var(--color-danger);font-weight:700}
.balance-stat{font-weight:700;color:var(--color-accent);font-size:1.1rem}

/* ---- 41. 汇总横幅（深蓝渐变，用于首页摘要区） ---- */
.summary-banner{background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-primary-dark) 100%);border-radius:var(--radius-lg);padding:1.5rem 1.75rem;color:#fff;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;box-shadow:0 8px 24px rgba(15,36,64,0.25);border:1px solid rgba(201,168,76,0.2);margin:0 var(--page-padding)}
.summary-banner__left{display:flex;align-items:center;gap:0.6rem}
.summary-banner__icon{color:var(--color-accent);font-size:1.2rem}
.summary-banner__label{font-weight:600;font-size:0.95rem;color:#cbd5e0}
.summary-banner__right{text-align:right}
.summary-banner__balance{font-size:2rem;font-weight:700;letter-spacing:-0.5px;color:var(--color-accent)}
.summary-banner__detail{font-size:0.82rem;color:#a0aec0;display:flex;gap:1rem;margin-top:0.25rem;justify-content:flex-end}
.summary-banner__income{color:#68d391;font-weight:600}
.summary-banner__expense{color:#fc8181;font-weight:600}
@media (min-width:768px){.summary-banner{margin:0}}

/* ---- 42. 日期分组 + 交易列表项 ---- */
.transaction-section{background:var(--color-surface);border-radius:var(--radius-lg);padding:1.5rem 1.75rem;box-shadow:var(--shadow-sm);border:1px solid var(--color-border)}
@media (max-width:767px){.transaction-section{padding:1rem;border-radius:var(--radius);margin:0 var(--page-padding) 16px}}
.date-group{margin-bottom:0.25rem}
.date-group+.date-group{border-top:1px solid var(--color-border);padding-top:0.5rem}
.date-group__header{display:flex;align-items:center;justify-content:space-between;padding:0.55rem 0 0.4rem 0;flex-wrap:wrap;gap:0.5rem}
.date-group__label{font-weight:700;font-size:0.95rem;color:var(--color-text);display:flex;align-items:center;gap:0.5rem}
.date-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.date-dot.today{background:var(--color-accent)}
.date-dot.past{background:var(--color-text-muted)}
.date-group__summary{display:inline;font-size:0.75rem;font-weight:600;color:var(--color-text-secondary)}
.date-sum-exp{color:var(--color-danger);margin-left:0.2rem}
.date-sum-inc{color:var(--color-success);margin-left:0.2rem}
.transaction-list{display:flex;flex-direction:column}
.transaction-item{display:flex;align-items:center;justify-content:space-between;padding:0.7rem 0;border-bottom:none;transition:background 0.12s;border-radius:6px;margin:1px 0;padding-left:0.5rem;padding-right:0.5rem}
.transaction-item:nth-child(even){background:var(--color-stripe)}
.transaction-item:last-child{border-bottom:none}
.transaction-item[data-status="pending"],.transaction-item[data-status="first_approved"],.transaction-item[data-status="rejected"]{opacity:.55}
.transaction-item[data-status="voided"]{opacity:.55}
.transaction-item[data-status="voided"] .tx-amount{text-decoration:line-through}
.tx-left{display:flex;align-items:center;gap:0.85rem;min-width:0;flex:1}
.tx-icon{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:1.1rem;flex-shrink:0}
.tx-icon.expense{background:var(--color-danger-light);color:var(--color-danger)}
.tx-icon.income{background:var(--color-success-light);color:var(--color-success)}
.tx-info{min-width:0}
.tx-title{font-weight:600;font-size:0.93rem;color:var(--color-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tx-meta{display:flex;align-items:center;gap:0.4rem;font-size:0.72rem;color:var(--color-text-muted);margin-top:0.15rem}
.tx-category{background:#f1f5f9;padding:0.15rem 0.55rem;border-radius:10px;font-weight:500;color:var(--color-text-secondary);font-size:0.7rem;white-space:nowrap}
.tx-right{text-align:right;flex-shrink:0;margin-left:0.75rem}
.tx-amount{font-weight:700;font-size:1rem;letter-spacing:-0.2px;font-variant-numeric:tabular-nums}
.tx-amount.expense{color:var(--color-danger)}
.tx-amount.income{color:var(--color-success)}
.tx-payment{font-size:0.68rem;color:var(--color-text-muted);margin-top:0.15rem}
.tx-actions{display:flex;justify-content:flex-end;gap:4px;margin-top:4px;}
.tx-actions .btn{height:28px;padding:0 10px;font-size:0.7rem;min-height:28px}
.tx-note-text{font-size:0.68rem;color:var(--color-text-muted);display:block;margin-top:2px;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---- 43. 按钮：金色强调 ---- */
.btn--accent{color:#fff;background:var(--color-accent);border-color:var(--color-accent);font-weight:600}
.btn--accent:active{background:var(--color-accent);opacity:.85}

/* ---- 44. 响应式 ---- */

/* 平板 (≥768px)：侧边栏 + 主内容双栏 */
@media (min-width:768px) {
    body{max-width:none;margin:0;padding:0;min-height:100vh}
    body.page-login{padding-left:0}
    .bottom-nav-mobile{display:none!important}
    .mob-only{display:none!important}
    .desktop-sidebar{display:flex;flex-direction:column;gap:1.25rem;width:var(--sidebar-width);flex-shrink:0;position:sticky;top:2rem;align-self:flex-start;max-height:100vh;overflow-y:auto}
    .app-wrapper{max-width:var(--max-width);margin:0 auto;padding:2rem;display:flex;gap:2rem;align-items:flex-start;width:100%}
    .app-inner{display:flex;gap:2rem;width:100%}
    .main-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:1.5rem}
    .card,.form-section,.accordion,.filter-bar,.dashboard-grid,.student-summary,.summary-cards,.page-header,.report-cards{margin-left:0;margin-right:0;max-width:none}
    .dialog,.modal-sheet{max-width:480px}
    .login-page__form{max-width:400px}
    .page{min-height:auto}
}

/* 桌面 (≥1024px)：宽屏增强 */
@media (min-width:1024px) {
    body{padding-left:0}
    .page-header{position:static;padding:0 0 16px;background:transparent;border-bottom:1px solid var(--color-border-light);margin-bottom:20px}
    .summary-cards{grid-template-columns:repeat(4,1fr);padding:0}
    .entry-grid{grid-template-columns:repeat(4,1fr)}
    .category-cards{grid-template-columns:repeat(2,1fr)}
    .bottom-actions,.btn-fixed-bottom{position:static;padding:16px 0 0;background:transparent;border-top:none;box-shadow:none;max-width:none;transform:none}
    .bottom-actions .btn,.btn-fixed-bottom .btn{max-width:200px;flex:none}
    .has-bottom-actions{padding-bottom:0}
    .report-cards{grid-template-columns:repeat(4,1fr)}
    .modal-sheet{max-width:560px;border-radius:var(--radius-lg)}
    .review-list{display:grid;grid-template-columns:1fr 1fr;gap:12px}
    .filter-bar{flex-wrap:nowrap}

    /* 表单 2 列布局 */
    .form-row{display:flex;gap:16px}
    .form-row>.form-group{flex:1;margin-bottom:0}
    .form-section,.card-body{display:grid;grid-template-columns:1fr 1fr;gap:0 20px}
    .form-section>.form-group--full,.form-section>.form-group:only-child,.form-section>.form-group.w-full,.card-body>.form-group--full,.card-body>.form-group:only-child,.card-body>.form-group.w-full{grid-column:1/-1}
    .form-section__title,.form-section>.form-hint,.card-body>.form-hint{grid-column:1/-1}

    /* 上传区域并排 */
    .upload-columns{display:flex;gap:16px;align-items:flex-start}
    .upload-col-id{flex:1;min-width:0;margin:0!important}
    .upload-col-contract{flex:2;min-width:0;margin:0!important}
}
.date-range {
    display: inline-flex;
    align-items: center;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    background: var(--color-surface);
    flex-shrink: 0;
    cursor: pointer;
    user-select: none;
    padding: 6px 10px;
    font-size: 13px;
    color: var(--color-text-secondary);
    gap: 4px;
    white-space: nowrap;
}
.date-range.has-value {
    color: var(--color-text);
}
.date-range input[type="date"] {
    position: absolute;
    opacity: 0;
    pointer-events: none;
    width: 0;
    height: 0;
}
.date-range__sep {
    color: var(--color-text-muted);
}
.date-range__clear {
    display: none;
    margin-left: 2px;
    color: var(--color-text-muted);
    font-size: 14px;
    line-height: 1;
}
.date-range.has-value .date-range__clear {
    display: inline;
}
.date-range__clear:hover {
    color: var(--color-danger);
}

/* 日期范围选择器弹出层 */
.drp-picker {
    position: fixed;
    z-index: 9999;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    max-width: calc(100vw - 16px);
    font-size: 14px;
    overflow: hidden;
    right: auto;
}
.drp-picker__inner {
    padding: 12px 16px 16px;
    background: var(--color-surface);
    border-radius: var(--radius-lg);
}
/* 窄屏兜底：贴右边缘防止裁剪 */
@media (max-width: 500px) {
    .drp-picker {
        right: 16px;
        left: 16px !important;
        max-width: none;
    }
}
.drp-nav {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 10px;
}
.drp-nav__btn {
    background: none; border: none; font-size: 20px; cursor: pointer;
    padding: 2px 6px; color: var(--color-primary); line-height: 1;
    border-radius: 50%; width: 28px; height: 28px; display: flex; align-items: center; justify-content: center;
}
.drp-nav__btn:hover { background: var(--color-primary-light); }
.drp-nav__label { font-weight: 600; font-size: 14px; }
.drp-months { display: flex; gap: 20px; }
.drp-month { flex: 1; min-width: 160px; }
.drp-month__title { text-align: center; font-weight: 600; margin-bottom: 6px; font-size: 13px; }
.drp-weekdays {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 2px;
    text-align: center;
    font-size: 11px;
    color: var(--color-text-muted);
    margin-bottom: 2px;
}
.drp-weekdays span { padding: 2px 0; }
.drp-days {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 2px;
}
.drp-day, .drp-day--empty {
    display: flex; align-items: center; justify-content: center;
    aspect-ratio: 1;
    border-radius: 50%;
    cursor: pointer;
    font-size: 13px;
    transition: background .15s;
    min-width: 0;
}
.drp-day:hover { background: var(--color-primary-light); }
.drp-day--today { font-weight: 700; color: var(--color-primary); }
.drp-day--range {
    background: var(--color-primary-light);
    border-radius: 0;
    color: var(--color-primary);
}
.drp-day--start, .drp-day--end {
    background: var(--color-primary) !important;
    color: #fff !important;
}
.drp-day--start {
    border-radius: 6px 0 0 6px;
}
.drp-day--end {
    border-radius: 0 6px 6px 0;
}
.drp-day--start.drp-day--end {
    border-radius: 6px;
}
.drp-day--empty { cursor: default; }

/* 移动端日历适配 */
@media (max-width: 500px) {
    .drp-months { flex-direction: column; gap: 12px; }
    .drp-month { min-width: 0; }
    .drp-day, .drp-day--empty { font-size: 12px; }
}
@media (min-width:1440px) {
    .page{max-width:1200px}
}

/* ============================================================
   Section: 收支汇总报表组件（模板风格）
   ============================================================ */

/* KPI 指标卡片 */
.kpi-grid{display:grid;margin-bottom:1.5rem}
.kpi-card{background:var(--color-surface);border-radius:var(--radius-lg);padding:1.4rem 1.5rem;box-shadow:var(--shadow-md);border:1px solid var(--color-border);display:flex;align-items:center;gap:1.1rem;transition:transform 0.15s,box-shadow 0.15s;position:relative;overflow:hidden}
.kpi-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}
.kpi-card::after{content:'';position:absolute;top:0;left:0;width:4px;height:100%}
.kpi-card.income::after{background:var(--color-success)}
.kpi-card.expense::after{background:var(--color-danger)}
.kpi-card.balance::after{background:var(--color-accent)}
.kpi-icon{width:52px;height:52px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;flex-shrink:0}
.kpi-card.income .kpi-icon{background:var(--color-success-light);color:var(--color-success)}
.kpi-card.expense .kpi-icon{background:var(--color-danger-light);color:var(--color-danger)}
.kpi-card.balance .kpi-icon{background:var(--color-accent-light);color:var(--color-accent)}
.kpi-info{flex:1;min-width:0}
.kpi-label{font-size:0.82rem;font-weight:500;color:var(--color-text-muted);margin-bottom:0.25rem}
.kpi-value{font-size:1.8rem;font-weight:700;letter-spacing:-0.5px}
.kpi-card.income .kpi-value{color:var(--color-success)}
.kpi-card.expense .kpi-value{color:var(--color-danger)}
.kpi-card.balance .kpi-value{color:var(--color-primary-dark)}
.kpi-change{font-size:0.75rem;font-weight:600;margin-top:0.2rem;display:flex;align-items:center;gap:0.25rem}
.kpi-change.up{color:var(--color-success)}
.kpi-change.down{color:var(--color-danger)}

/* 图表区域 */
.chart-grid{display:grid;margin-bottom:1.5rem}
.chart-card{background:var(--color-surface);border-radius:var(--radius-lg);padding:1.4rem 1.5rem;box-shadow:var(--shadow-md);border:1px solid var(--color-border)}
.chart-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.1rem}
.chart-title{font-weight:700;font-size:1rem;color:var(--color-text);display:flex;align-items:center;gap:0.5rem}
.chart-title i{color:var(--color-accent);font-size:0.9rem}
.chart-legend{display:flex;gap:1rem;font-size:0.75rem;font-weight:500;color:var(--color-text-muted)}
.legend-dot{width:9px;height:9px;border-radius:50%;display:inline-block;margin-right:0.3rem}
.legend-dot.income-dot{background:var(--color-success)}
.legend-dot.expense-dot{background:var(--color-danger)}

/* 柱状图 */
.bar-chart{display:flex;align-items:flex-end;gap:1.2rem;height:200px;padding:0.5rem 0}
.bar-chart.six-cols{gap:0.8rem}
.bar-group{flex:1;display:flex;flex-direction:column;align-items:center;gap:0.4rem;height:100%;justify-content:flex-end;min-width:0}
.bar-wrapper{display:flex;gap:0.35rem;align-items:flex-end;height:160px;width:100%;justify-content:center}
.bar{width:22px;border-radius:6px 6px 0 0;transition:height 0.4s ease;min-width:16px}
.bar.income-bar{background:linear-gradient(180deg,#48bb78 0%,#2f855a 100%)}
.bar.expense-bar{background:linear-gradient(180deg,#fc8181 0%,#c53030 100%)}
.bar-label{font-size:0.7rem;font-weight:600;color:var(--color-text-secondary);text-align:center;white-space:nowrap}
.bar-value{font-size:0.65rem;font-weight:700;color:var(--color-text-muted);text-align:center;margin-top:0.2rem;white-space:nowrap}

/* 环形图 */
.donut-container{display:flex;align-items:center;justify-content:center;gap:2rem;flex-wrap:wrap}
.donut-chart{position:relative;width:160px;height:160px;flex-shrink:0}
.donut-chart svg{width:100%;height:100%;transform:rotate(-90deg)}
.donut-center{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center}
.donut-center .center-value{font-size:1.5rem;font-weight:700;color:var(--color-primary)}
.donut-center .center-label{font-size:0.7rem;color:var(--color-text-muted);font-weight:500}
.donut-legend-list{display:flex;flex-direction:column;gap:0.7rem}
.donut-legend-item{display:flex;align-items:center;gap:0.5rem;font-size:0.82rem;font-weight:500;color:var(--color-text-secondary)}
.donut-legend-color{width:12px;height:12px;border-radius:3px;flex-shrink:0}
.donut-legend-value{margin-left:auto;font-weight:700;color:var(--color-text)}

/* 底部网格 */
.bottom-grid{display:grid}

/* 分类明细卡片 */
.detail-card{background:var(--color-surface);border-radius:var(--radius-lg);padding:1.4rem 1.5rem;box-shadow:var(--shadow-md);border:1px solid var(--color-border)}
.detail-title{font-weight:700;font-size:1rem;color:var(--color-text);margin-bottom:1rem;display:flex;align-items:center;gap:0.5rem}
.detail-title i{color:var(--color-accent)}
.category-list{display:flex;flex-direction:column;gap:0.7rem;max-height:260px;overflow-y:auto}
.category-item{display:flex;align-items:center;gap:0.7rem}
.category-icon{width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:0.9rem;flex-shrink:0}
.category-icon.income-cat{background:var(--color-success-light);color:var(--color-success)}
.category-icon.expense-cat{background:var(--color-danger-light);color:var(--color-danger)}
.category-info{flex:1;min-width:0}
.category-name{font-weight:600;font-size:0.85rem;color:var(--color-text)}
.category-count{font-size:0.7rem;color:var(--color-text-muted)}
.category-bar-wrap{width:80px;height:6px;background:#f1f5f9;border-radius:3px;overflow:hidden;flex-shrink:0}
.category-bar-fill{height:100%;border-radius:3px}
.category-bar-fill.income-fill{background:var(--color-success)}
.category-bar-fill.expense-fill{background:var(--color-danger)}
.category-amount{font-weight:700;font-size:0.85rem;text-align:right;min-width:70px;flex-shrink:0}
.category-amount.income-amt{color:var(--color-success)}
.category-amount.expense-amt{color:var(--color-danger)}

/* 月份徽标 */
.page-badge{background:var(--color-accent-light);color:var(--color-accent);padding:0.3rem 0.9rem;border-radius:20px;font-size:0.8rem;font-weight:600;white-space:nowrap}

/* 报表页头 */
.report-page-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.75rem;gap:0.75rem}
.report-page-title{font-size:1.6rem;font-weight:700;color:var(--color-primary-dark);letter-spacing:-0.3px}
#filter-user{max-width:110px;padding-left:6px;padding-right:24px}

/* 响应式 */
@media (max-width:767px){
    .kpi-grid{grid-template-columns:1fr;gap:0.75rem}
    .chart-grid{grid-template-columns:1fr}
    .bottom-grid{grid-template-columns:1fr;gap:1rem}
    .page{padding-bottom:calc(64px + var(--safe-bottom))}
    .category-list{max-height:none}
    .kpi-card{padding:1rem 1.1rem}
    .kpi-value{font-size:1.4rem}
    .bar-chart{gap:0.6rem;height:180px}
    .bar-wrapper{height:130px}
    .bar{width:18px;min-width:14px}
    .donut-container{gap:1rem}
    .report-page-header{flex-direction:column;align-items:flex-start}
    #header-actions{flex-wrap:wrap}
    #header-actions .btn-sm{padding:0 8px;font-size:12px;height:30px;min-height:30px}
    .tx-meta{flex-wrap:wrap}
    .tx-note-text{max-width:160px}
    .tx-icon{width:32px;height:32px;font-size:0.9rem;border-radius:8px}
    .transaction-item{padding:0.5rem;gap:0.4rem;flex-wrap:nowrap;align-items:center}
    .tx-left{margin-right:0;flex:1;min-width:0;overflow:hidden}
    .tx-title{font-size:0.85rem}
    .tx-right{flex-shrink:0;max-width:55%;text-align:right;margin-left:auto;gap:4px;display:flex;flex-direction:column;align-items:flex-end}
    .tx-amount{font-size:0.9rem}
    .tx-actions{flex-wrap:wrap;justify-content:flex-end}
    .tx-actions .btn{padding:0 8px;font-size:0.65rem;height:26px;min-height:26px}
    .student-stats-banner{padding:10px 12px;gap:0.5rem}
    .list-item{padding:10px 12px}
    .item-avatar{width:36px;height:36px;font-size:0.8rem}
    .modal-sheet{border-radius:var(--radius-lg) var(--radius-lg) 0 0;max-width:100%;margin-top:auto}
    .modal-sheet form{padding:12px 16px}
    .radio-group{gap:6px}
    .radio-card{min-width:70px;padding:10px 6px;font-size:12px}
    .category-card{min-width:80px;padding:12px 10px;font-size:13px}
    .review-card{padding:12px}
    .review-card__amount{font-size:17px}
    .review-card__actions .btn{max-width:none}
    .form-section__row{flex-direction:column}
    .date-range{min-width:0;flex-shrink:1}
    .date-range .date-range__from,.date-range .date-range__to{max-width:100%;min-width:0}
    #filter-user{max-width:90px}
    select{font-size:14px;padding:8px 10px}
}
@media (min-width:768px){
    .kpi-grid{grid-template-columns:repeat(3,1fr);gap:1.5rem}
    .chart-grid{grid-template-columns:1.2fr 0.8fr;gap:1.5rem}
    .bottom-grid{grid-template-columns:1fr 1fr;gap:1.5rem}
}