
        /* ============ 现代化浅色主题（2026-08-02 设计系统 v2） ============
           原则：中性色阶 + 语义色 + 统一圆角/阴影/间距/字号，全部 Token 化，
           后续暗色模式只需覆盖 :root 变量。 */
        :root {
            /* 品牌色（保留旧名兼容子页面） */
            --primary: #2563eb;
            --primary-dark: #1d4ed8;
            --primary-50: #eef2ff;
            --primary-100: #e0e7ff;

            /* 中性色阶（text/border/bg 分层） */
            --bg: #f6f7f9;
            --panel: #ffffff;
            --border: #e5e7eb;
            --border-strong: #d1d5db;
            --text: #111827;
            --text-2: #374151;
            --muted: #6b7280;
            --muted-2: #9ca3af;

            /* 语义色（success/warning/info/danger） */
            --danger: #dc2626;
            --green: #059669;
            --green-dark: #0d8050;
            --warning: #d97706;              /* 新增：警告文本色，用于状态2徽章 */
            --neutral-bg: #f3f4f6;           /* 新增：中性背景色，用于"未知"状态徽章 */
            --orange: #d97706;
            --orange-deep: #e65100;
            --red-deep: #c62828;
            --success-bg: #ecfdf5;
            --warning-bg: #fffbeb;
            --danger-bg: #fef2f2;
            --info-bg: #eef2ff;
            /* 语义色浅阶（success/warning/danger 的 50/200 档，供徽章/卡片/按钮浅底边框用，
               值分别对齐 --*-bg 与语义主色） */
            --success: #059669;              /* 成功文本绿（与 --green 同值，语义名独立） */
            --success-50: #ecfdf5;           /* 成功浅底（与 --success-bg 同值） */
            --success-200: #a7f3d0;          /* 成功浅边框 */
            --warning-50: #fffbeb;           /* 警告浅底（与 --warning-bg 同值） */
            --warning-200: #fde68a;          /* 警告浅边框 */
            --danger-50: #fef2f2;            /* 危险浅底（与 --danger-bg 同值） */
            --danger-200: #fecaca;           /* 危险浅边框 */

            /* 字段/区块编号徽标（橙色，对应设计稿编号体系 R10） */
            --tag: #f59e0b;
            --tag-bg: #fffbeb;

            /* 模块独立色板（2026-08-23 令牌化立项，不并入全局语义色） */
            --dorm-primary: #2f6fed;         /* 宿舍品牌蓝（dorm 系列头部渐变，非全局 primary） */
            --dorm-primary-dark: #1f4fc0;    /* 宿舍品牌蓝暗色（135deg 渐变第二色） */
            --dorm-danger: #e0483e;          /* 宿舍红（宿舍模块专用，非全局 danger） */
            --dorm-green: #2e9e5b;           /* 宿舍绿（dorm_day_dorm/grid/report 主导绿） */
            --post-warn: #e0a800;            /* 待处理提示黄（dorm_grid 待处理 / accounts_post_dict） */
            --post-warn-text: #8a6d00;       /* 待处理提示黄深文字（#8a6d00） */
            --post-warn-bg: #fdf3d7;         /* 待处理提示黄浅底（#fdf3d7） */
            --admin-warn-text: #b8860b;      /* admin 警告文字（#b8860b） */
            --admin-warn-bg: #fff7e6;        /* admin 警告底（#fff7e6） */
            --admin-warn-border: #ffe0a3;    /* admin 警告边框（#ffe0a3） */
            --mi-green: #16a34a;             /* 巡检绿（patrol 三页独立色板主色） */
            --mi-green-dark: #15803d;        /* 巡检绿深色（patrol 独立色板） */
            --mi-green-bg: #e7f6ec;          /* 巡检绿浅背景（patrol 独立色板） */

            /* 圆角体系 */
            --radius-sm: 6px;
            --radius-md: 8px;
            --radius-lg: 12px;
            --radius-xl: 16px;
            --radius-pill: 999px;

            /* 阴影（柔和、低透明度） */
            --shadow-sm: 0 1px 2px rgba(16,24,40,.05);
            --shadow-md: 0 2px 8px rgba(16,24,40,.06), 0 1px 2px rgba(16,24,40,.04);
            --shadow-lg: 0 8px 24px rgba(16,24,40,.10), 0 2px 6px rgba(16,24,40,.06);

            /* 遮罩层（弹窗/抽屉背板；页面级样式禁裸色值，统一走令牌） */
            --mask-bg: rgba(17,24,39,.45);

            /* 字号阶 */
            --fs-xs: 12px;
            --fs-sm: 13px;
            --fs-md: 14px;
            --fs-lg: 16px;
            --fs-xl: 20px;
            --fs-2xl: 24px;

            /* 过渡 */
            --t-fast: .12s ease;
            --t-base: .18s ease;

            /* 焦点环（无障碍可见性） */
            --focus-ring: 0 0 0 3px rgba(37,99,235,.18);

            /* 移动端（移动端首页/课表等）设计令牌 */
            --mb-tabbar-bg: #ffffff;
            --mb-tab-active: #2563eb;
            --mb-card-radius: 12px;
            --mb-gray-200: #e5e7eb;
            --mb-gray-400: #9ca3af;
        }

        /* ============ 暗色模式（data-theme="dark" 覆盖变量，2026-08-02 设计系统 v2） ============ */
        [data-theme="dark"] {
            --bg: #0f1117;
            --panel: #171a21;
            --border: #2a2e3a;
            --border-strong: #3a3f4d;
            --text: #e5e7eb;
            --text-2: #cbd5e1;
            --muted: #94a3b8;
            --muted-2: #64748b;
            --primary: #3b82f6;
            --primary-dark: #60a5fa;
            --primary-50: rgba(59,130,246,.15);
            --primary-100: rgba(59,130,246,.25);
            --danger: #f87171;
            --green: #34d399;
            --green-dark: #10b981;
            --orange: #f59e0b;
            --orange-deep: #fb923c;
            --red-deep: #f87171;
            --success-bg: rgba(16,185,129,.12);
            --warning-bg: rgba(245,158,11,.12);
            --danger-bg: rgba(248,113,113,.12);
            --info-bg: rgba(59,130,246,.12);
            /* 语义色浅阶（暗色同步一份，值沿用浅色保证视觉一致） */
            --success: #34d399;
            --success-50: rgba(16,185,129,.12);
            --success-200: rgba(16,185,129,.30);
            --warning-50: rgba(245,158,11,.12);
            --warning-200: rgba(245,158,11,.30);
            --danger-50: rgba(248,113,113,.12);
            --danger-200: rgba(248,113,113,.30);
            /* 模块独立色板（暗色同步一份，值沿用浅色保证视觉一致） */
            --dorm-primary: #2f6fed;
            --dorm-primary-dark: #1f4fc0;
            --dorm-danger: #e0483e;
            --dorm-green: #2e9e5b;
            --post-warn: #e0a800;
            --post-warn-text: #8a6d00;
            --post-warn-bg: #fdf3d7;
            --admin-warn-text: #b8860b;
            --admin-warn-bg: #fff7e6;
            --admin-warn-border: #ffe0a3;
            --mi-green: #16a34a;
            --mi-green-dark: #15803d;
            --mi-green-bg: #e7f6ec;
            --shadow-sm: 0 1px 2px rgba(0,0,0,.3);
            --shadow-md: 0 2px 8px rgba(0,0,0,.4);
            --shadow-lg: 0 8px 24px rgba(0,0,0,.5);
            --mask-bg: rgba(0,0,0,.6);
            --focus-ring: 0 0 0 3px rgba(59,130,246,.3);
        }
        /* 暗色模式下的硬编码浅色微调（表格条纹/hover 等用 rgba 中性） */
        [data-theme="dark"] .data-table thead { background: #1c2029; }
        [data-theme="dark"] .data-table tbody tr:nth-child(even),
        [data-theme="dark"] table.striped tbody tr:nth-child(even) { background: rgba(255,255,255,.02); }
        [data-theme="dark"] .data-table td { border-bottom-color: #232733; }
        [data-theme="dark"] .filter-bar select, [data-theme="dark"] .filter-bar input,
        [data-theme="dark"] select[data-cbx] + .cbx-input, [data-theme="dark"] .form-input { background: #1c2029; color: var(--text); }
        [data-theme="dark"] .gsearch { background: #1c2029; }
        [data-theme="dark"] .gsearch:focus-within { background: #232733; }
        [data-theme="dark"] .gs-panel, [data-theme="dark"] .user-dropdown, [data-theme="dark"] .cbx-panel { background: #171a21; border-color: var(--border); }
        [data-theme="dark"] .gs-item:hover, [data-theme="dark"] .gs-item.sel,
        [data-theme="dark"] .user-dropdown a.item:hover, [data-theme="dark"] .cbx-panel li:hover { background: rgba(59,130,246,.15); }
        [data-theme="dark"] .tbtn, [data-theme="dark"] .icon-btn { background: #1c2029; color: var(--text); }
        [data-theme="dark"] .mini-btn { background: #232733; color: var(--text-2); }
        [data-theme="dark"] .mini-btn:hover { background: #2d3342; }
        [data-theme="dark"] .badge.gray, [data-theme="dark"] .data-table .tag.gray { background: #232733; color: var(--muted); }
        [data-theme="dark"] .sched-head { background: #232733; color: var(--text); border-color: var(--border); }
        [data-theme="dark"] .sched-subhead { background: #1c2029; color: var(--muted); }
        [data-theme="dark"] .sched-cell { border-color: var(--border); }
        [data-theme="dark"] .sched-cell.empty, [data-theme="dark"] .sched-cell.break { background: #1c2029; }
        [data-theme="dark"] .sched-table { background: #171a21; }
        [data-theme="dark"] .sched-table td, [data-theme="dark"] .sched-table th { border-color: var(--border); }
        [data-theme="dark"] .sched-table tbody tr:hover td { background: rgba(59,130,246,.08); }
        [data-theme="dark"] .sched-period { background: rgba(139,92,246,.12); }
        [data-theme="dark"] .sched-period .time { color: #a78bfa; }
        [data-theme="dark"] .sched-period .label { color: #c4b5fd; }
        [data-theme="dark"] .sched-info-card { background: #171a21; }
        [data-theme="dark"] .sched-info-card .sic-label { color: var(--muted); }
        [data-theme="dark"] .sched-info-card .sic-value { color: var(--text); }
        [data-theme="dark"] .sched-info-card .sic-value.hl { color: var(--orange); }
        [data-theme="dark"] .sched-info-card .sic-value.green { color: var(--green); }
        [data-theme="dark"] .sched-info-card .sic-value.blue { color: #60a5fa; }
        [data-theme="dark"] .sched-info-card .sic-sep { background: var(--border); }
        [data-theme="dark"] .class-tag { background: rgba(139,92,246,.15); color: #c4b5fd; border-color: rgba(139,92,246,.25); }
        [data-theme="dark"] .cbx-input { background: #1c2029; color: var(--text); }
        [data-theme="dark"] body { color-scheme: dark; }
        * { box-sizing: border-box; }
        html, body { margin: 0; padding: 0; }
        body {
            font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
            background: var(--bg); color: var(--text); font-size: var(--fs-md); line-height: 1.6;
            -webkit-font-smoothing: antialiased;
        }
        a { color: var(--primary); text-decoration: none; transition: color var(--t-fast); }
        a:hover { color: var(--primary-dark); }
        h1, h2, h3 { margin-top: 0; }
        .muted { color: var(--muted); }

        /* ============ 布局 ============ */
        .layout { display: flex; min-height: 100vh; }
        .sidebar {
            width: 224px; flex-shrink: 0; background: var(--panel);
            border-right: 1px solid var(--border); padding: 16px 12px;
            position: sticky; top: 0; height: 100vh; overflow-y: auto;
        }
        .brand {
            font-size: 18px; font-weight: 700; color: var(--text);
            padding: 6px 10px 16px; display: flex; align-items: center; gap: 10px;
        }
        .brand .logo {
            width: 28px; height: 28px; border-radius: 8px; flex-shrink: 0;
            background: linear-gradient(135deg, #2563eb, #4f46e5); color: #fff;
            display: flex; align-items: center; justify-content: center;
            font-size: 15px; font-weight: 700;
            box-shadow: var(--shadow-sm);
        }
        .sidebar nav a {
            display: flex; align-items: center; gap: 10px;
            padding: 9px 12px; border-radius: var(--radius-md);
            color: var(--text-2); margin-bottom: 2px; font-size: 14px;
            transition: background var(--t-fast), color var(--t-fast);
            position: relative;
        }

        .sidebar nav a .nav-ico { width: 18px; height: 18px; flex-shrink: 0; opacity: .75; transition: opacity var(--t-fast); }
        .sidebar nav a .nav-badge {
            margin-left: auto; min-width: 18px; height: 18px; padding: 0 5px;
            border-radius: 9px; background: var(--danger, #dc2626); color: #fff;
            font-size: 11px; font-weight: 600; line-height: 18px; text-align: center;
            flex-shrink: 0;
        }
        .sidebar nav a.active .nav-badge { background: rgba(255,255,255,.9); color: var(--danger, #dc2626); }
        .sidebar nav a:hover { background: var(--primary-50); color: var(--text); }
        .sidebar nav a:hover .nav-ico { opacity: 1; }
        .sidebar nav a.active { background: var(--primary); color: #fff; box-shadow: var(--shadow-sm); }
        .sidebar nav a.active .nav-ico { opacity: 1; }
        .sidebar nav a:focus-visible { outline: none; box-shadow: var(--focus-ring); }
        .group-title { font-size: 12px; color: var(--muted); margin: 16px 12px 6px; font-weight: 600; letter-spacing: .02em; }

        /* ① 收起/展开菜单：整个侧边栏隐藏或显示（参考旧平台 .layout.collapsed .sidebar{display:none}） */
        .layout.collapsed .sidebar { display: none; }

        /* ② 简约模式：侧边栏改为「模块化导航」，分组标题可点击折叠（参考旧平台 mod-head） */
        .nav-group { }
        .group-items { display: block; }
        .layout.simple .group-title {
            cursor: pointer; display: flex; align-items: center; justify-content: space-between;
            background: #e8ecf2; border-radius: 6px; padding: 7px 12px; margin: 10px 0 4px;
            color: #475569; font-weight: 600;
        }
        .layout.simple .group-title::after { content: '▸'; color: var(--muted); font-size: 12px; }
        .layout.simple .nav-group.open .group-title::after { content: '▾'; }
        .layout.simple .group-items { display: none; }
        .layout.simple .nav-group.open .group-items { display: block; }

        .main-wrap { flex: 1; display: flex; flex-direction: column; min-width: 0; }
        .topbar {
            display: flex; align-items: center; justify-content: space-between;
            background: var(--panel); border-bottom: 1px solid var(--border);
            padding: 12px 22px;
        }
        .topbar-left { display: flex; align-items: center; gap: 12px; flex: 1; min-width: 0; }
        .topbar .title { font-weight: 600; font-size: 15px; white-space: nowrap; }
        .topbar .user { display: flex; align-items: center; gap: 12px; font-size: 13px; color: var(--muted); }

        /* ============ 全局搜索（⌘K） ============ */
        .gsearch {
            position: relative; display: flex; align-items: center; gap: 6px;
            background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-pill);
            padding: 5px 12px; margin-left: 8px; min-width: 180px; max-width: 300px; flex: 1;
            transition: border-color var(--t-fast), box-shadow var(--t-fast), background var(--t-fast);
        }
        .gsearch:focus-within { border-color: var(--primary); background: #fff; box-shadow: var(--focus-ring); }
        .gs-ico { color: var(--muted-2); flex-shrink: 0; }
        .gsearch input {
            flex: 1; border: none; outline: none; background: transparent;
            font-size: var(--fs-sm); color: var(--text); min-width: 0;
        }
        .gsearch input::placeholder { color: var(--muted-2); }
        .gs-kbd {
            font-size: 11px; color: var(--muted); background: var(--panel);
            border: 1px solid var(--border); border-radius: 4px; padding: 1px 5px;
            white-space: nowrap; flex-shrink: 0;
        }
        .gs-panel {
            position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 200;
            background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg);
            box-shadow: var(--shadow-lg); padding: 6px; max-height: 360px; overflow-y: auto;
            display: none;
        }
        .gs-panel.open { display: block; }
        .gs-panel .gs-item {
            display: flex; align-items: center; gap: 10px;
            padding: 8px 10px; border-radius: var(--radius-md); cursor: pointer;
            font-size: var(--fs-sm); color: var(--text-2);
        }
        .gs-panel .gs-item:hover, .gs-panel .gs-item.sel { background: var(--primary-50); color: var(--primary); }
        .gs-panel .gs-item .gs-kind {
            font-size: 11px; color: var(--muted); background: #f1f5f9;
            border-radius: var(--radius-pill); padding: 1px 8px; flex-shrink: 0;
        }
        .gs-panel .gs-item .gs-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .gs-panel .gs-empty { padding: 14px; text-align: center; color: var(--muted); font-size: var(--fs-sm); }
        @media (max-width: 860px) {
            /* 手机端展示全局搜索：顶栏 title 已隐藏，搜索框占满剩余空间；⌘K 提示无需显示 */
            .gsearch { display: flex; flex: 1; min-width: 0; max-width: none; margin-left: 0; }
            .gs-kbd { display: none; }
            /* 手机顶栏：身份跟在姓名后同一行（紧凑小字），隐藏下拉箭头省空间 */
            .user-trigger .caret { display: none; }
            .user-info { white-space: nowrap; }
            .user-info .name { max-width: 72px; overflow: hidden; text-overflow: ellipsis; }
        }

        /* ============ 菜单 typeahead（E：侧边栏顶部，移动端=抽屉顶部） ============ */
        .menu-search {
            position: relative; display: flex; align-items: center; gap: 6px;
            background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-pill);
            padding: 6px 12px; margin: 4px 0 10px;
            transition: border-color var(--t-fast), box-shadow var(--t-fast), background var(--t-fast);
        }
        .menu-search:focus-within { border-color: var(--primary); background: #fff; box-shadow: var(--focus-ring); }
        .ms-ico { color: var(--muted-2); flex-shrink: 0; }
        .menu-search input {
            flex: 1; border: none; outline: none; background: transparent;
            font-size: 14px; color: var(--text); min-width: 0;
        }
        .menu-search input::placeholder { color: var(--muted-2); }
        .ms-panel {
            position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 45;
            background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-md);
            box-shadow: var(--shadow); max-height: 320px; overflow-y: auto; display: none;
        }
        .ms-panel.open { display: block; }
        .ms-panel .ms-item {
            display: flex; align-items: center; gap: 8px; padding: 8px 12px;
            cursor: pointer; color: var(--text-2); font-size: 14px;
        }
        .ms-panel .ms-item:hover, .ms-panel .ms-item.sel { background: var(--primary-50); color: var(--text); }
        .ms-panel .ms-item .ms-group {
            font-size: 11px; color: var(--muted); background: var(--bg);
            border-radius: 4px; padding: 1px 6px; flex-shrink: 0;
        }
        .ms-panel .ms-empty { padding: 12px; text-align: center; color: var(--muted); font-size: var(--fs-sm); }
        [data-theme="dark"] .ms-panel { background: #171a21; border-color: var(--border); }
        [data-theme="dark"] .ms-panel .ms-item:hover, [data-theme="dark"] .ms-panel .ms-item.sel { background: rgba(59,130,246,.15); }

        /* ============ 多页签 Tab 栏 ============ */
        .tab-bar {
            display: flex; align-items: center; gap: 2px;
            background: var(--panel); border-bottom: 1px solid var(--border);
            padding: 0 12px; overflow-x: auto; flex-shrink: 0;
            -webkit-user-select: none; user-select: none;
        }
        .tab-bar::-webkit-scrollbar { height: 0; }
        .tab {
            display: flex; align-items: center; gap: 6px;
            padding: 8px 14px; font-size: 13px; color: var(--muted);
            cursor: pointer; border-radius: 8px 8px 0 0;
            white-space: nowrap; flex-shrink: 0;
            transition: .12s; position: relative;
        }
        .tab:hover { background: #f0f2f5; color: var(--text); }
        .tab.active {
            background: var(--bg); color: var(--primary); font-weight: 600;
            box-shadow: 0 -2px 8px rgba(0,0,0,.04);
        }
        .tab.active::after {
            content: ''; position: absolute; bottom: -1px; left: 0; right: 0;
            height: 2px; background: var(--bg);
        }
        .tab .tab-close {
            font-size: 16px; line-height: 1; opacity: 0.45;
            width: 18px; text-align: center; border-radius: 4px;
        }
        .tab .tab-close:hover { opacity: 1; background: rgba(0,0,0,.08); }
        .tab-clear {
            margin-left: auto; flex-shrink: 0;
            padding: 4px 10px; font-size: 12px; color: var(--muted);
            cursor: pointer; border: 1px solid var(--border); border-radius: 5px;
            background: transparent;
        }
        .tab-clear:hover { background: #f0f2f5; color: var(--danger); border-color: #fbcaca; }
        .icon-btn {
            border: 1px solid var(--border); background: #fff; border-radius: 6px;
            padding: 5px 11px; cursor: pointer; font-size: 16px; line-height: 1; color: var(--text);
        }
        .icon-btn:hover { background: #eef2ff; }

        /* 菜单切换按钮组（≡ 图标 + 下方小字提示，参考旧平台「校务通」风格） */
        .menu-toggle { display: flex; flex-direction: column; align-items: center; gap: 1px; }
        .menu-hint {
            font-size: 11px; color: var(--muted); white-space: nowrap;
            cursor: pointer; line-height: 1;
        }
        .menu-hint:hover { color: var(--primary); }

        /* 顶栏右侧容器 + 通用文字按钮（简约菜单 / 页签开关，参考旧平台 mode-btn） */
        .topbar-right { display: flex; align-items: center; gap: 10px; }
        .notif-bell { position: relative; display: inline-flex; align-items: center; }
        .notif-dot { position: absolute; top: -6px; right: -8px; min-width: 16px; height: 16px;
            padding: 0 4px; border-radius: 999px; background: var(--danger); color: #fff;
            font-size: 10px; line-height: 16px; text-align: center; font-weight: 700; }
        .tbtn {
            border: 1px solid var(--border); background: #fff; border-radius: 6px;
            padding: 5px 12px; cursor: pointer; font-size: 13px; line-height: 1;
            color: var(--text); display: inline-flex; align-items: center; gap: 5px;
        }
        .tbtn:hover { background: #eef2ff; }
        .tbtn.active { background: var(--primary); color: #fff; border-color: var(--primary); }

        /* 用户下拉 */
        .user-menu { position: relative; }
        .user-trigger {
            display: flex; align-items: center; gap: 8px;
            cursor: pointer; padding: 4px 10px; border-radius: 8px;
            white-space: nowrap; line-height: 1;
        }
        .user-trigger:hover { background: #eef2ff; }
        .user-avatar {
            width: 30px; height: 30px; border-radius: 50%;
            background: var(--primary); color: #fff;
            display: flex; align-items: center; justify-content: center;
            font-size: 13px; font-weight: 600; flex-shrink: 0;
        }
        .user-trigger .caret { color: var(--muted); flex-shrink: 0; width: 16px; height: 16px; }
        .user-info { display: flex; align-items: baseline; gap: 6px; line-height: 1; }
        .user-info .name { font-size: 13px; font-weight: 600; color: var(--text); }
        .user-info .role { font-size: 11px; color: var(--muted); white-space: nowrap; }
        .user-info .role::before { content: '·'; margin-right: 6px; opacity: .55; }
        .user-dropdown {
            position: absolute; right: 0; top: calc(100% + 4px);
            background: #fff; border: 1px solid var(--border);
            border-radius: 10px; box-shadow: 0 8px 24px rgba(0,0,0,.12);
            min-width: 180px; padding: 6px; z-index: 100;
            display: none;
        }
        .user-dropdown.open { display: block; }
        .user-dropdown .u-head { padding: 10px 12px; border-bottom: 1px solid var(--border); margin-bottom: 6px; }
        .user-dropdown .u-name { font-weight: 600; font-size: 14px; }
        .user-dropdown .u-role { font-size: 12px; color: var(--muted); margin-top: 2px; }
        .user-dropdown a.item { display: flex; align-items: center; gap: 9px; padding: 9px 12px; border-radius: 8px; color: var(--text); font-size: 13px; }
        .user-dropdown a.item:hover { background: #f1f5f9; }
        .content { padding: 22px; flex: 1; }
        .content-inner { max-width: 1200px; margin: 0 auto; }

        /* ============ 卡片 / 面板 / 闪信 ============ */
        .card, .panel {
            background: var(--panel); border: 1px solid var(--border);
            border-radius: var(--radius-xl); padding: 18px 22px; margin-bottom: 16px;
            box-shadow: var(--shadow-sm);
        }
        .card h3, .panel h3 { margin-top: 0; }

        /* ============ 可折叠区块（<details class="collapse">，默认展开，点标题收起） ============ */
        /* 适用：筛选区 / KPI 统计卡 / 字段对照表等非必看大区块，省竖向空间。来源：巡检列表页范式 */
        details.collapse {
            background: var(--panel); border: 1px solid var(--border);
            border-radius: var(--radius-xl); margin: 10px 12px; padding: 0 14px 12px;
            box-shadow: var(--shadow-sm);
        }
        details.collapse > summary {
            list-style: none; cursor: pointer; user-select: none;
            display: flex; align-items: center; gap: 8px;
            padding: 12px 0; font-weight: 700; font-size: 14px; color: var(--text);
        }
        details.collapse > summary::-webkit-details-marker { display: none; }
        details.collapse > summary .code {
            background: var(--tag); color: #fff; font-size: 11px; font-weight: 700;
            padding: 1px 7px; border-radius: var(--radius-pill);
        }
        details.collapse > summary .arrow {
            margin-left: auto; color: var(--muted); font-size: 12px; transition: transform var(--t-fast);
        }
        details.collapse:not([open]) > summary .arrow { transform: rotate(-90deg); }
        details.collapse > summary:hover { color: var(--primary); }
        /* 折叠内嵌卡片去自身外边距/阴影，避免双重边框 */
        details.collapse > .card,
        details.collapse > .kpi-card { margin: 0; box-shadow: none; }
        .flash {
            padding: 10px 14px; border-radius: var(--radius-md); margin-bottom: 12px;
            background: var(--info-bg); color: var(--primary); border: 1px solid #cfe3ff; white-space: pre-line;
            animation: flashIn var(--t-base);
        }
        /* 分类 flash 配色（统一连字符式，全仓唯一来源；配色参考 course_adjust 原有实现） */
        .flash-error { background: #fdeaea; color: #dc2626; border-color: #fbcaca; }
        .flash-danger { background: #fdeaea; color: #dc2626; border-color: #fbcaca; }
        .flash-success { background: #e7f7ec; color: #16a34a; border-color: #bbf7d0; }
        .flash-warning { background: #fff6e0; color: #b45309; border-color: #fde68a; }
        .flash-info { background: #eef2ff; color: #4338ca; border-color: #c7d2fe; }
        .flash-message { background: var(--info-bg); color: var(--primary); border-color: #cfe3ff; }
        @keyframes flashIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

        /* ============ 按钮（统一交互反馈：hover 加深 / active 按压 / focus 环 / disabled） ============ */
        .btn {
            display: inline-flex; align-items: center; justify-content: center; gap: 6px;
            padding: 9px 16px; border-radius: var(--radius-md); border: none;
            cursor: pointer; font-size: var(--fs-md); text-decoration: none; line-height: 1.2;
            background: var(--primary); color: #fff;
            transition: background var(--t-fast), transform var(--t-fast), box-shadow var(--t-fast);
            box-shadow: var(--shadow-sm);
        }
        .btn:hover { background: var(--primary-dark); }
        .btn:active { transform: scale(.97); }
        .btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
        .btn:disabled { opacity: .5; cursor: not-allowed; transform: none; }
        .btn-sm { padding: 5px 11px; font-size: var(--fs-sm); border-radius: var(--radius-sm); }
        .btn-danger { background: var(--danger); }
        .btn-danger:hover { background: #b91c1c; }
        .btn-ghost {
            background: transparent; color: var(--text-2);
            border: 1px solid var(--border-strong); box-shadow: none;
        }
        .btn-ghost:hover { background: var(--primary-50); color: var(--primary); border-color: var(--primary-100); }

        /* ============ 页面标题 ============ */
        .page-title { font-size: var(--fs-xl); font-weight: 700; margin: 0 0 16px; color: var(--text); letter-spacing: -.01em; }
        .page-desc { color: var(--muted); font-size: var(--fs-md); margin: 0 0 16px; }

        /* ============ 数据表格（全站统一） ============ */
        .data-table {
            width: 100%; border-collapse: collapse; font-size: var(--fs-sm);
            background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-lg);
            overflow: hidden; box-shadow: var(--shadow-sm);
        }
        .data-table thead { background: #f8fafc; }
        .data-table th {
            text-align: left; padding: 10px 14px; font-weight: 600; color: var(--muted);
            border-bottom: 1px solid var(--border); font-size: var(--fs-xs); white-space: nowrap;
            letter-spacing: .01em;
        }
        .data-table td { padding: 9px 14px; border-bottom: 1px solid #f0f2f5; vertical-align: middle; }
        .data-table tbody tr:nth-child(even) { background: #fafbfc; }
        .data-table tbody tr { transition: background var(--t-fast); }
        .data-table tbody tr:hover { background: var(--primary-50); }
        .data-table tbody tr:last-child td { border-bottom: none; }
        .data-table a { color: var(--primary); }
        .data-table .tag, .data-table .badge {
            display: inline-block; padding: 2px 10px; border-radius: var(--radius-pill); font-size: 12px;
            background: var(--primary-50); color: var(--primary); line-height: 1.6;
        }
        .data-table .tag.red { background: var(--danger-bg); color: var(--danger); }
        .data-table .tag.green { background: var(--success-bg); color: var(--green); }
        .data-table .tag.gray { background: #f1f5f9; color: var(--muted); }

        /* 隔行变色（供自绘表格使用：在 <table> 上加 class="striped"） */
        table.striped tbody tr:nth-child(even) { background: #fafbfc; }
        table.striped tbody tr { transition: background var(--t-fast); }
        table.striped tbody tr:hover { background: var(--primary-50); }

        /* ============ 课表：按科目配色 + 节次列底色（v2 漂亮排版） ============ */
        /* 单元格基础 */
        .sched-cell {
            padding: 8px 6px; border: 1px solid var(--border);
            text-align: center; vertical-align: middle; font-size: 13px;
            line-height: 1.45;
        }
        .sched-cell.empty { background: var(--bg); }
        .sched-cell.break {
            background: repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(100,116,139,.05) 6px, rgba(100,116,139,.05) 12px);
            color: var(--muted); font-size: 12px; letter-spacing: .05em;
        }
        /* 合并休息行（午休/晚饭整行单格）：比普通格稍高，文字更居中 */
        .sched-cell.break[colspan] { padding: 10px 6px; }
        .sched-cell .course { font-weight: 700; font-size: 13.5px; }
        .sched-cell .teacher { font-size: 11px; opacity: .85; margin-top: 2px; }
        .sched-cell .teacher .tdot { display:inline-block; width:7px; height:7px; border-radius:50%; margin-right:4px; vertical-align:middle; }
        /* 班号列 */
        .sched-cell.class-id { background: #f5f3ff; color: #4c1d95; font-weight: 700; font-size: 12px; }
        /* 调/停 徽标（路径 B 停课标签红：用 is-stop 类，弃用 style 字符串匹配） */
        .adj-tag { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; padding: 1px 5px; margin-right: 4px; border-radius: var(--radius-pill); font-size: 10px; font-weight: 800; vertical-align: middle; background: var(--primary-50); color: var(--primary); border: 1px solid var(--primary-100); }
        .adj-tag.is-stop { background: var(--danger-bg); color: var(--danger); border-color: #fecaca; text-decoration: line-through; }
        /* 老师/科目网格中的班号小标签（独立于单元格，避免嵌套 sched-cell 双边框） */
        .class-tag {
            display: inline-block; margin: 1px 2px; padding: 1px 7px;
            border-radius: var(--radius-pill);
            background: #f5f3ff; color: #4c1d95; font-weight: 600; font-size: 11.5px;
            border: 1px solid #e9e4fb;
        }
        /* 节次列（第一列）：上下两行 —— 上=时间(起-止)，下=节次名 */
        .sched-period {
            background: #f3e8ff; border: 1px solid var(--border); vertical-align: middle; padding: 4px 6px;
        }
        .sched-period .sp-time {
            display: block; text-align: center; font-size: 10.5px; color: #7c6ba6;
            font-variant-numeric: tabular-nums; white-space: nowrap;
        }
        .sched-period .sp-label {
            display: block; text-align: center; font-weight: 700; color: #4c1d95;
            font-size: 12px; margin-top: 2px; white-space: nowrap;
        }
        /* 表头（浅灰，无下划线冲突） */
        .sched-head {
            background: #f3f4f6; color: #374151; font-weight: 700; text-align: center;
            border: 1px solid var(--border); padding: 10px 6px; letter-spacing: .03em;
        }
        .sched-subhead { background: #fafbfc; color: #6b7280; font-weight: 600; font-size: 12px; text-align: center; border: 1px solid var(--border); }
        /* 主表格：圆角外框 + 紧凑内边框 */
        .sched-table {
            width: 100%; border-collapse: collapse; font-size: 13px;
            border-radius: var(--radius-lg); overflow: hidden;
            border: 1px solid var(--border); background: #fff;
            box-shadow: var(--shadow-sm);
        }
        .sched-table td, .sched-table th { border: 1px solid var(--border); }
        .sched-table tbody tr:hover td { background: rgba(37,99,235,.04); }
        .sched-table tbody tr:hover td.sched-cell.empty { background: rgba(37,99,235,.04); }

        /* 顶部信息卡（替代原 sched-info 表格）：卡片式 header */
        .sched-info-card {
            display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
            background: var(--panel); border: 1px solid var(--border);
            border-radius: var(--radius-lg); padding: 10px 16px; margin-bottom: 12px;
            box-shadow: var(--shadow-sm);
        }
        .sched-info-card .sic-item { display: flex; align-items: baseline; gap: 6px; }
        .sched-info-card .sic-label { font-size: 12px; color: var(--muted); }
        .sched-info-card .sic-value { font-size: 15px; font-weight: 700; color: var(--text); }
        .sched-info-card .sic-value.hl { color: var(--orange-deep); }
        .sched-info-card .sic-value.green { color: var(--green-dark); }
        .sched-info-card .sic-value.blue { color: var(--primary); }
        .sched-info-card .sic-sep { width: 1px; height: 18px; background: var(--border); }

        /* 科目配色：每科一对底色+文字色，柔和不刺眼 */
        .course-math    { background: #dbeafe; color: #1e40af; }   /* 蓝 */
        .course-chinese { background: #fce7f3; color: #9f1239; }   /* 粉 */
        .course-english { background: #d1fae5; color: #065f46; }   /* 绿 */
        .course-physics { background: #e0e7ff; color: #3730a3; }   /* 蓝灰 */
        .course-chem    { background: #fef9c3; color: #854d0e; }   /* 黄 */
        .course-bio     { background: #dcfce7; color: #166534; }   /* 黄绿 */
        .course-history { background: #ffedd5; color: #9a3412; }   /* 橙 */
        .course-geo     { background: #ede9fe; color: #5b21b6; }   /* 紫 */
        .course-politic { background: #fee2e2; color: #991b1b; }   /* 红 */
        .course-pe      { background: #ecfccb; color: #3f6212; }   /* 草绿 */
        .course-art     { background: #fce7f3; color: #9d174d; }   /* 玫红 */
        .course-music   { background: #fae8ff; color: #86198f; }   /* 淡紫 */
        .course-it      { background: #cffafe; color: #155e75; }   /* 青 */
        .course-lab     { background: #f5f5f4; color: #57534e; }   /* 石墨灰 */
        .course-others  { background: #f3f4f6; color: #4b5563; }   /* 浅灰 */

        /* ============ 筛选栏 / 工具栏 ============ */
        .filter-bar {
            display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
            margin-bottom: 14px; padding: 12px 16px;
            background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-lg);
            box-shadow: var(--shadow-sm);
        }
        .filter-bar select, .filter-bar input[type="text"], .filter-bar input[type="search"],
        select[data-cbx] + .cbx-input {
            padding: 7px 10px; border: 1px solid var(--border); border-radius: var(--radius-md);
            font-size: var(--fs-sm); background: #fff; outline: none;
            transition: border-color var(--t-fast), box-shadow var(--t-fast);
        }
        .filter-bar select:hover, .filter-bar input:hover { border-color: var(--border-strong); }
        .filter-bar select:focus, .filter-bar input:focus { border-color: var(--primary); box-shadow: var(--focus-ring); }

        /* ============ 操作栏（表格上方按钮行） ============ */
        .action-bar { display: flex; gap: 8px; align-items: center; margin-bottom: 12px; flex-wrap: wrap; }
        .action-bar .spacer { flex: 1; }

        /* ============ 表单（通用） ============ */
        .form-group { margin-bottom: 14px; }
        .form-group label { display: block; font-weight: 600; font-size: var(--fs-sm); margin-bottom: 4px; color: var(--text); }
        .form-input {
            width: 100%; padding: 8px 12px; border: 1px solid var(--border); border-radius: var(--radius-md);
            font-size: var(--fs-md); outline: none; background: #fff; transition: border-color var(--t-fast), box-shadow var(--t-fast);
        }
        .form-input:hover { border-color: var(--border-strong); }
        .form-input:focus { border-color: var(--primary); box-shadow: var(--focus-ring); }

        /* ============ 空状态 / 提示 ============ */
        .empty-state {
            text-align: center; padding: 56px 24px; color: var(--muted);
            display: flex; flex-direction: column; align-items: center; gap: 8px;
        }
        .empty-state .icon {
            font-size: 40px; margin-bottom: 8px; color: var(--muted-2);
        }
        .empty-state .e-ico {
            width: 56px; height: 56px; border-radius: var(--radius-xl);
            background: var(--primary-50); color: var(--primary);
            display: flex; align-items: center; justify-content: center;
            margin-bottom: 6px;
        }
        .empty-state .e-title { font-size: var(--fs-lg); font-weight: 600; color: var(--text-2); }
        .empty-state .e-desc { font-size: var(--fs-sm); color: var(--muted); max-width: 360px; }
        .empty-state .e-action { margin-top: 10px; }
        .container { max-width: 1100px; margin: 0 auto; padding: 0 4px; }

        /* ============ 通用工具类（供子页面抽取高频内联样式） ============ */
        .p0 { padding: 0; }
        .p4 { padding: 4px; }
        .p8 { padding: 8px; }
        .nowrap { white-space: nowrap; }
        .inline-form { display: inline; }
        .link-btn {
            background: none; border: none; color: var(--primary);
            cursor: pointer; padding: 0; font-size: inherit;
            transition: color var(--t-fast), opacity var(--t-fast);
        }
        .link-btn:hover { color: var(--primary-dark); text-decoration: underline; }
        .muted-xs { color: var(--muted); font-size: var(--fs-xs); }

        /* ============ 行内操作链接（表格内"操作"列用，比 ghost 更轻、比主按钮柔和） ============ */
        .row-link {
            display: inline-flex; align-items: center; gap: 2px;
            padding: 4px 10px; border-radius: var(--radius-pill);
            color: var(--primary); font-size: var(--fs-sm);
            background: var(--primary-50);
            transition: background var(--t-fast), color var(--t-fast), transform var(--t-fast);
        }
        .row-link:hover { background: var(--primary); color: #fff; }
        .row-link:active { transform: scale(.96); }
        .row-link:focus-visible { outline: none; box-shadow: var(--focus-ring); }

        /* 状态徽标 / 迷你按钮（表格内高频内联样式抽取）—— 胶囊化 */
        .badge { display: inline-block; padding: 2px 10px; border-radius: var(--radius-pill); font-size: var(--fs-xs); line-height: 1.6; }
        .badge.green { background: var(--success-bg); color: var(--green-dark); }
        .badge.gray { background: #f1f5f9; color: var(--muted); }
        .badge.warn { background: var(--warning-bg); color: var(--orange-deep); }
        .badge.red { background: var(--danger-bg); color: var(--danger); }
        .mini-btn {
            padding: 3px 8px; font-size: var(--fs-xs); border: none; border-radius: var(--radius-sm); cursor: pointer;
            background: #eef1f5; color: var(--text-2);
            transition: background var(--t-fast), transform var(--t-fast);
        }
        .mini-btn:hover { background: #e2e6ea; }
        .mini-btn:active { transform: scale(.95); }
        .mini-btn.danger { background: #fdecea; color: var(--red-deep); }
        .mini-btn.danger:hover { background: #fad5d5; }
        .mini-btn.info { background: #e3f2fd; color: #1565c0; }
        .mini-btn.info:hover { background: #d3e9fb; }
        .mini-select {
            padding: 3px 18px 3px 8px;
            font-size: var(--fs-xs);
            border: 1px solid var(--border);
            border-radius: var(--radius-sm);
            background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%23666' d='M0 0h10L5 6z'/%3E%3C/svg%3E") no-repeat right 6px center;
            background-size: 8px;
            color: var(--text-2); cursor: pointer;
            appearance: none; -webkit-appearance: none;
            height: 24px; line-height: 1;
        }
        .mini-select:hover { border-color: var(--primary); }
        .op-group {
            display: inline-flex; align-items: stretch;
            border: 1px solid var(--border); border-radius: var(--radius-sm);
            /* 必须 visible：组合内可能含 combobox（.cbx-panel 浮层面板），
               overflow:hidden 会把面板裁剪掉（如 dorm 换房下拉「点不开」）。
               子元素 mini-select/mini-btn 均等高 stretch 且无自身圆角，不溢出。 */
            overflow: visible;
        }
        .op-group .mini-select,
        .op-group .mini-btn {
            border-radius: 0; border: none;
        }
        .op-group .mini-btn { border-left: 1px solid var(--border); }
        .op-group .mini-btn.danger { border-left-color: #fad5d5; }
        .op-group .mini-btn.info { border-left-color: #bbdefb; }
        .p76 { padding: 7px 6px; }

        /* ============ 统计卡片（现代化：浅灰底无边框 + 数字 tabular-nums） ============ */
        .stats { display: flex; gap: 12px; flex-wrap: wrap; margin: 16px 0; }
        .stat {
            background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-lg);
            padding: 14px 16px; min-width: 90px; text-align: center; flex: 1 1 0;
            transition: box-shadow var(--t-base), transform var(--t-base), border-color var(--t-fast);
        }
        .stat:hover { box-shadow: var(--shadow-md); transform: translateY(-1px); border-color: var(--border-strong); }
        .stat .num { font-size: var(--fs-2xl); font-weight: 700; color: var(--primary); line-height: 1.2; font-variant-numeric: tabular-nums; }
        .stat .lab { color: var(--muted); font-size: var(--fs-xs); margin-top: 2px; }
        .stat.green .num { color: var(--green-dark); }
        .stat.warn .num { color: var(--orange); }
        .stat.red .num { color: var(--danger); }
        .stat.gray .num { color: var(--muted); }

        /* ============ 模块快捷入口网格 ============ */
        .mod-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 14px; margin-top: 12px; }
        .mod-card {
            display: flex; align-items: center; gap: 14px;
            background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-lg);
            padding: 16px 18px; transition: box-shadow var(--t-base), transform var(--t-base), border-color var(--t-fast);
        }
        .mod-card:hover { border-color: var(--primary-100); box-shadow: var(--shadow-md); transform: translateY(-2px); }
        .mod-card:active { transform: translateY(0) scale(.99); }
        .mod-card:focus-visible { outline: none; box-shadow: var(--focus-ring); }
        .mod-ico {
            width: 44px; height: 44px; border-radius: var(--radius-lg); flex-shrink: 0;
            background: var(--primary-50); color: var(--primary);
            display: flex; align-items: center; justify-content: center;
            transition: background var(--t-fast), color var(--t-fast);
        }
        .mod-card:hover .mod-ico { background: var(--primary); color: #fff; }
        .mod-card .t { font-weight: 600; }
        .mod-card .d { color: var(--muted); font-size: 12px; margin-top: 2px; }

        /* ============ 移动端 ============ */
        .sidebar-backdrop { display: none; }
        @media (max-width: 860px) {
            .sidebar {
                position: fixed; left: 0; top: 0; z-index: 40;
                transform: translateX(-100%); transition: transform .2s;
                box-shadow: 0 0 30px rgba(0,0,0,.18);
            }
            .layout.show-nav .sidebar { transform: translateX(0); }
            .sidebar-backdrop {
                position: fixed; inset: 0; background: rgba(15,23,42,.4);
                z-index: 35; display: none;
            }
            .layout.show-nav .sidebar-backdrop { display: block; }
            .content { padding: 14px; }
            .stat { flex: 1 1 0; min-width: 0; }
            .topbar { padding: 10px 14px; }
            .topbar-left .title { display: none; }
            /* 手机上侧边栏为浮层：collapsed 不生效（改用 show-nav 控制显隐） */
            .layout.collapsed .sidebar { display: block; }
            /* 手机顶栏空间窄，隐藏简约/页签按钮，保持简洁 */
            .topbar-right .tbtn { display: none; }
            .menu-hint { display: none; }  /* 手机上不需要收起/展开提示 */
            .tab { padding: 6px 10px; font-size: 12px; }
            .tab .tab-close { display: none; }  /* 手机上隐藏关闭按钮，用清空代替 */
        }

        /* ===== 通用可输入下拉 combobox（select[data-cbx] 自动增强） =====
           原生 <select> 仍保留在 DOM 中（仅视觉隐藏），其 name/提交值不变，
           表单提交照常；上方叠加一个可输入过滤框 + 浮层下拉面板。 */
        .cbx { position: relative; display: inline-block; vertical-align: bottom; }
        /* 原生 select 视觉隐藏，但仍在 <form> 内、可提交（不 disabled） */
        .cbx-native { position: absolute !important; opacity: 0; width: 1px; height: 1px; padding: 0; margin: 0; border: 0; pointer-events: none; }
        .cbx-input { box-sizing: border-box; width: 100%; min-width: 120px; background: #fff; }
        .cbx-panel { position: absolute; z-index: 1000; left: 0; right: 0; margin: 2px 0 0; padding: 4px 0;
            list-style: none; background: #fff; border: 1px solid #ccd; border-radius: 6px;
            box-shadow: 0 4px 12px rgba(0,0,0,.14); max-height: 240px; overflow-y: auto; display: none; }
        .cbx-panel.open { display: block; }
        /* portal 模式：脱离父级 overflow 容器，避免被 table/card 等裁剪 */
        .cbx-panel.detached {
            position: fixed; z-index: 10000; margin: 0;
            left: auto; right: auto; width: auto;
            /* 关键：浮层透明区不拦截点击，否则展开后会盖住下方其它行的控件，
               导致只有第一个下拉能点开、其余点击被浮层吞掉。选项 li 仍可被点。 */
            pointer-events: none;
        }
        .cbx-panel.detached li { pointer-events: auto; }
        .cbx-panel li { padding: 6px 12px; cursor: pointer; font-size: 13px; white-space: nowrap;
            overflow: hidden; text-overflow: ellipsis; }
        .cbx-panel li:hover, .cbx-panel li.active { background: #e8f3ff; color: var(--primary); }
        .cbx-panel li.cbx-empty { color: #999; cursor: default; }

        /* 开放枚举可输入下拉（input[data-combo]，对照 data-cbx 闭合枚举） */
        .combo { position: relative; display: inline-block; width: 100%; }
        .combo-input { width: 100%; box-sizing: border-box; }
        .combo-panel { position: fixed; z-index: 1300; margin-top: 4px;
            background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-md);
            box-shadow: 0 8px 24px rgba(0,0,0,.12); max-height: 240px; overflow: auto; padding: 4px; }
        .combo-panel li { padding: 6px 12px; cursor: pointer; font-size: 13px; white-space: nowrap;
            overflow: hidden; text-overflow: ellipsis; }
        .combo-panel li:hover, .combo-panel li.active { background: #e8f3ff; color: var(--primary); }
        .combo-panel li.combo-empty { color: #999; cursor: default; }

        /* ============ 打印 / PDF（课程表） ============ */
        @media print {
            @page { size: A4 landscape; margin: 8mm; }
            html, body { width: 100%; height: 100%; margin: 0 !important; padding: 0 !important; background: #fff !important; color: #000 !important; }
            .sidebar, .topbar, .filter-bar, .action-bar,
            .sched-modal-mask, .page-title, .page-desc,
            nav, footer, .sic-sep, #schedToast,
            button, .btn, .btn-ghost, .btn-primary { display: none !important; }
            /* 关键：.layout 不能隐藏，否则课表(.content 在其内)一并消失导致打印空白 */
            .layout { display: block !important; }
            .content { margin: 0 !important; padding: 0 !important; max-width: 100% !important; width: 100% !important; }
            .panel { box-shadow: none !important; border: none !important; padding: 0 !important; margin: 0 !important; background: #fff !important; }
            .sched-grid-wrap { overflow: visible !important; margin-top: 0 !important; }
            .print-title { display: none !important; }
            .sched-info-card {
                margin: 0 0 6px 0 !important; padding: 3px 0 !important;
                gap: 12px !important; font-size: 15px !important; flex-wrap: nowrap !important;
            }
            .sched-info-card .sic-label { font-size: 16px !important; }
            .sched-info-card .sic-value { font-size: 18px !important; }
            .sched-table {
                width: 100% !important; max-width: 100% !important;
                table-layout: fixed !important; border-collapse: collapse !important;
                border: 1px solid #999 !important; box-shadow: none !important;
                border-radius: 0 !important; font-size: 17px !important;
            }
            .sched-table tr { page-break-inside: avoid !important; }
            .sched-table th, .sched-table td {
                border: 1px solid #999 !important; padding: 5px 4px !important;
                vertical-align: middle !important; text-align: center !important;
                line-height: 1.4 !important; overflow: hidden !important;
                word-wrap: break-word !important; height: auto !important;
            }
            .sched-table th:first-child, .sched-table td:first-child { width: 10% !important; }
            .sched-head { padding: 5px 2px !important; font-size: 18px !important; background: #f3f4f6 !important; }
            .sched-subhead { padding: 3px !important; font-size: 17px !important; background: #fafbfc !important; }
            .sched-period { background: #f3e8ff !important; padding: 5px 3px !important; }
            .sched-period .sp-time { font-size: 16px !important; margin-bottom: 1px !important; }
            .sched-period .sp-label { font-size: 17px !important; margin-top: 0 !important; }
            .sched-cell { font-size: 18px !important; padding: 5px 3px !important; }
            .sched-cell.empty { background: #fff !important; }
            .sched-cell.break { font-size: 17px !important; padding: 6px 3px !important; }
            /* 科目+教师名并排成一行：td 保持 table-cell（不破坏表格列布局），
               仅让内部两个元素 inline 并排，避免 display:flex 作用于 td 导致打印错位 */
            .sched-cell .course { display: inline !important; font-size: 18px !important; line-height: 1.3 !important; }
            .sched-cell .teacher { display: inline !important; font-size: 17px !important; margin: 0 0 0 6px !important; }
            .sched-cell .teacher .tdot { width: 8px !important; height: 8px !important; margin-right: 2px !important; }
            .class-tag, .teacher-tag { font-size: 15px !important; padding: 0 3px !important; margin: 0 1px !important; }
            /* 保留课程底色与教师圆点配色，避免打印成纯白 */
            .sched-cell, .course-math, .course-chinese, .course-english, .course-physics,
            .course-chem, .course-bio, .course-history, .course-geo, .course-politic,
            .course-pe, .course-art, .course-music, .course-it, .course-lab, .course-others,
            .sched-cell .teacher .tdot {
                -webkit-print-color-adjust: exact; print-color-adjust: exact;
            }
        }
        .print-title { display: none; }

        /* ===== 通用日期选择器（input.date-picker 自动增强） =====
           零依赖原生 JS：点击弹日历 + 支持键盘直接键入（2026-9-10 / 2026/9/10 / 9-10 / 20260910 均可）。
           失焦自动规范化为 YYYY-MM-DD，非法输入回退到上一个有效值。
           用法：在任意 <input type="text"> 上加 class="date-picker" 即可。 */
        .dp-panel { position: absolute; z-index: 2000; background: #fff; border: 1px solid #e2e8f0; border-radius: 12px;
            box-shadow: 0 10px 30px rgba(15,23,42,.18); padding: 12px; width: 252px; font-size: 13px; display: none; }
        .dp-head { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin-bottom: 8px; }
        .dp-head button { width: 26px; height: 28px; border: none; background: #f1f5f9; border-radius: 8px; cursor: pointer; font-size: 16px; color: #475569; flex: 0 0 auto; }
        .dp-head button:hover { background: #e2e8f0; }
        .dp-head select { flex: 1 1 auto; min-width: 0; border: 1px solid #e2e8f0; border-radius: 8px; padding: 4px 6px; font-size: 13px; color: #1e293b; background: #fff; cursor: pointer; }
        .dp-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; text-align: center; }
        .dp-grid .dp-dow { color: #94a3b8; font-size: 11px; padding: 4px 0; }
        .dp-cell { width: 30px; height: 30px; line-height: 18px; padding: 6px 0; border-radius: 50%; margin: 1px auto; box-sizing: border-box; cursor: pointer; color: #334155; }
        .dp-cell:hover { background: #eef2ff; }
        .dp-cell.dp-out { color: #cbd5e1; }
        .dp-cell.dp-out:hover { background: #f8fafc; }
        .dp-cell.dp-today { box-shadow: inset 0 0 0 1.5px #f97316; color: #ea580c; font-weight: 700; }
        .dp-cell.dp-sel { background: #2563eb; color: #fff; font-weight: 600; }
        .dp-cell.dp-sel.dp-today { box-shadow: inset 0 0 0 1.5px #fff; }
        .dp-foot { margin-top: 8px; text-align: center; }
        .dp-today-btn { width: 100%; padding: 6px 0; border: 1px solid #e2e8f0; background: #f8fafc; border-radius: 8px; cursor: pointer; color: #2563eb; font-size: 13px; }
        .dp-today-btn:hover { background: #eff6ff; }
        input.date-picker { cursor: pointer; }

        /* ===== 通用 Modal 弹窗（.modal-mask + .show） =====
           用法：<div class="modal-mask" id="myModal"><div class="modal-box">...</div></div>
           JS: openModal('myModal') / closeModal('myModal')，支持 Esc 关闭 + 点击遮罩关闭。 */
        .modal-mask { position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 100; display: none; align-items: center; justify-content: center; }
        .modal-mask.show { display: flex; }
        .modal-box { background: var(--panel); color: var(--text); border-radius: 12px; padding: 24px; width: 480px; max-width: 90vw; max-height: 80vh; overflow-y: auto; box-shadow: 0 12px 40px rgba(0,0,0,.22); }

        /* ===== 反馈模态框（建议 / 意见 / 异常上报）：分段控件 + 附件框 ===== */
        .fb-modal { width: 520px; }
        .fb-modal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
        .fb-modal-head h3 { margin: 0; font-size: 17px; }
        .fb-close { background: none; border: none; font-size: 22px; line-height: 1; cursor: pointer; color: var(--muted); padding: 2px 8px; border-radius: 8px; }
        .fb-close:hover { background: var(--primary-50); color: var(--primary); }
        .fb-field { margin-bottom: 14px; }
        .fb-field > label { display: block; font-size: 13px; color: var(--text-2); margin-bottom: 6px; }
        .fb-field > label em { color: var(--muted); font-style: normal; font-weight: normal; font-size: 12px; margin-left: 4px; }
        .fb-req { color: #dc2626; font-size: 12px; font-weight: 600; margin-left: 4px; }
        .fb-field input[type="text"], .fb-field textarea {
            width: 100%; box-sizing: border-box; padding: 9px 12px;
            border: 1px solid var(--border); border-radius: 8px;
            background: var(--panel); color: var(--text); font-size: 14px; }
        .fb-field textarea { min-height: 96px; resize: vertical; }
        .fb-field input[type="text"]:focus, .fb-field textarea:focus { outline: none; border-color: var(--primary); box-shadow: var(--focus-ring); }
        .fb-seg { display: flex; gap: 8px; flex-wrap: wrap; }
        .fb-seg-item { position: relative; flex: 1; min-width: 88px; cursor: pointer; }
        .fb-seg-item input { position: absolute; opacity: 0; inset: 0; cursor: pointer; }
        .fb-seg-item span { display: block; text-align: center; padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px; font-size: 13px; color: var(--text-2); background: var(--panel); transition: all .15s; }
        .fb-seg-item input:checked + span { border-color: var(--primary); color: var(--primary); background: var(--primary-50); font-weight: 600; }
        .fb-seg-item input:focus-visible + span { box-shadow: var(--focus-ring); }
        .fb-file-row { display: flex; gap: 8px; flex-wrap: wrap; }
        .fb-file-row .fb-file { flex: 1; justify-content: center; min-width: 110px; }
        .fb-file { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border: 1px dashed var(--border-strong); border-radius: 8px; cursor: pointer; font-size: 13px; color: var(--text-2); }
        .fb-file:hover { border-color: var(--primary); color: var(--primary); }
        .fb-file input { display: none; }
        .fb-file-pick { margin-top: 6px; font-size: 12px; color: var(--text-2); display: flex; align-items: center; }
        .fb-file-pick[hidden] { display: none; }
        .fb-preview { width: 48px; height: 48px; object-fit: cover; border-radius: 6px; border: 1px solid var(--border); margin-right: 8px; flex: none; }
        .fb-file-pick button { background: none; border: none; color: var(--primary); cursor: pointer; text-decoration: underline; margin-left: 8px; font-size: 12px; }
        .fb-actions { margin-top: 18px; }

        /* ===== 通用 Toast 反馈 ===== */
        .toast-msg { position: fixed; left: 50%; top: 18px; transform: translateX(-50%);
            background: #16a34a; color: #fff; padding: 9px 18px; border-radius: 8px; font-size: 13px;
            z-index: 3000; box-shadow: 0 6px 18px rgba(0,0,0,.22); transition: opacity .3s; opacity: 0; pointer-events: none; }
        .toast-msg.toast-error { background: #dc2626; }
        .toast-msg.toast-warning { background: #d97706; }
        /* X2: success/info 显式类型（默认绿即 success；info 用中性蓝灰） */
        .toast-msg.toast-success { background: #16a34a; }
        .toast-msg.toast-info { background: #2563eb; }



        /* ============ 移动端（移动端首页/课表等，复用设计令牌） ============
           对齐 docs/design/移动端首页第一梯队实施方案_20260822.md 与元宝 mb_home_proto。 */
        .mb-app { max-width: 480px; margin: 0 auto; min-height: 100vh; padding-bottom: 80px; }
        .mb-head { background: linear-gradient(135deg, var(--primary), var(--primary-dark)); color: #fff; padding: 18px 16px 22px; border-radius: 0 0 20px 20px; box-shadow: var(--shadow-md); }
        .mb-head .greet { font-size: 19px; font-weight: 700; margin: 0 0 4px; }
        .mb-head .date { font-size: 13px; opacity: .92; }
        .mb-head .role { display: inline-block; margin-top: 8px; font-size: 12px; background: rgba(255,255,255,.22); padding: 3px 12px; border-radius: var(--radius-pill); font-weight: 600; }
        .mb-card { background: var(--panel); border-radius: var(--mb-card-radius); box-shadow: var(--shadow-sm); margin: 12px 14px 0; padding: 14px; }
        .mb-card h3 { font-size: 15px; font-weight: 700; margin: 0 0 10px; display: flex; align-items: center; gap: 8px; }
        .mb-card h3 .ico { width: 22px; height: 22px; color: var(--primary); flex: none; }
        .mb-card .more { margin-left: auto; font-size: 12px; color: var(--muted); text-decoration: none; font-weight: 400; }
        .lessons { display: flex; flex-direction: column; gap: 8px; }
        .lesson { display: flex; gap: 10px; align-items: flex-start; padding: 10px; background: var(--bg); border-radius: var(--radius-md); border-left: 4px solid var(--primary); }
        .lesson.stop { background: #f3f4f6; border-left-color: var(--mb-gray-400); opacity: .75; }
        .lesson .period { font-size: 12px; font-weight: 700; color: var(--primary); background: var(--primary-50); padding: 2px 8px; border-radius: var(--radius-pill); min-width: 44px; text-align: center; flex: none; }
        .lesson.stop .period { color: var(--muted); background: var(--mb-gray-200); }
        .lesson .body { flex: 1; min-width: 0; }
        .lesson .body .name { font-size: 14px; font-weight: 600; }
        .lesson.stop .body .name { text-decoration: line-through; color: var(--muted); }
        .lesson .body .meta { font-size: 12px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
        .badge.tiao { background: var(--primary); }
        .badge.bu { background: var(--orange); }
        .badge.ting { background: var(--mb-gray-400); }
        .mb-empty { text-align: center; color: var(--muted); padding: 18px 0; font-size: 13px; }
        .inspect { display: flex; align-items: center; gap: 14px; }
        .inspect .big { font-size: 30px; font-weight: 800; color: var(--primary); font-variant-numeric: tabular-nums; line-height: 1; }
        .inspect .desc { font-size: 12px; color: var(--muted); margin-top: 4px; }
        .inspect .go { margin-left: auto; background: var(--primary); color: #fff; border: none; border-radius: var(--radius-md); padding: 8px 14px; font-size: 13px; font-weight: 600; white-space: nowrap; }
        .work { display: flex; gap: 14px; align-items: flex-end; }
        .work .col { flex: 1; }
        .work .col .lab { font-size: 12px; color: var(--muted); }
        .work .col .val { font-size: 26px; font-weight: 800; color: var(--text); font-variant-numeric: tabular-nums; line-height: 1.1; }
        .work .col.primary .val { color: var(--primary); }
        .work .delta { font-size: 12px; color: var(--green-dark); font-weight: 600; margin-top: 4px; }
        .work .note { font-size: 11px; color: var(--muted); margin-top: 2px; }
        .todo-item { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-top: 1px solid var(--border); }
        .todo-item:first-child { border-top: none; padding-top: 2px; }
        .todo-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--danger); flex: none; }
        .todo-item .t { font-size: 13px; flex: 1; }
        .todo-item .n { font-size: 13px; font-weight: 700; color: var(--danger); }
        .quick { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
        .quick a { display: flex; flex-direction: column; align-items: center; gap: 6px; text-decoration: none; color: var(--text-2); font-size: 12px; }
        .quick .qico { width: 44px; height: 44px; border-radius: var(--radius-lg); background: var(--primary-50); color: var(--primary); display: flex; align-items: center; justify-content: center; }
        .quick .qico svg { width: 22px; height: 22px; }
        .mb-tabbar { position: fixed; left: 50%; transform: translateX(-50%); bottom: 0; width: 100%; max-width: 480px; background: var(--mb-tabbar-bg); border-top: 1px solid var(--border); display: flex; z-index: 50; padding-bottom: env(safe-area-inset-bottom); }
        .mb-tab { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 8px 0 6px; color: var(--muted); text-decoration: none; font-size: 11px; min-height: 44px; }
        .mb-tab svg { width: 22px; height: 22px; }
        .mb-tab.active { color: var(--mb-tab-active); }
        .mb-tab.active .tablb { font-weight: 700; }
        [data-theme="dark"] .mb-tabbar { background: #171a21; border-top-color: var(--border); }
        [data-theme="dark"] .mb-tab.active { color: var(--primary); }
    