/* style.css - 个人成长记录样式 */

/* ==================== 全局重置 ==================== */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

html {
    height: 100%;
    -webkit-text-size-adjust: 100%;
    /* 阻止 html 与 body 的滚动链，避免整页双回弹；滚动由各滚动容器自行承担 */
    overscroll-behavior-y: none;
}

body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
    background-color: var(--bg-color);
    color: var(--text-color);
    line-height: 1.6;
    height: 100%;
    overflow-x: hidden; /* 兜底防止任何横向溢出撑破页面 */
    word-break: break-word; /* 长文本/URL 自动换行 */
    /* 非管理页（如登录页）使用 body 原生滚动，启用 iOS 动量 */
    -webkit-overflow-scrolling: touch;
}

/* ==================== 全局滚动优化 ==================== */
/* 统一细滚动条，避免默认粗滚动条影响视觉；仅桌面端可见，移动端隐藏 */
* {
    scrollbar-width: thin;
    scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
}
*::-webkit-scrollbar { width: 6px; height: 6px; }
*::-webkit-scrollbar-thumb {
    background: rgba(0, 0, 0, 0.2);
    border-radius: 3px;
}
*::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.35); }
*::-webkit-scrollbar-track { background: transparent; }
@media (hover: none) and (pointer: coarse) {
    *::-webkit-scrollbar { width: 0; height: 0; } /* 触屏隐藏滚动条，保持原生观感 */
}

/* 所有常见可滚动容器统一启用 iOS 动量 + 滚动链隔离，避免内层滚动穿透到外层 */
.table-container,
.students-list,
.modal-body,
.drawer-body,
.scroll-y,
.log-panel {
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;
}

:root {
    --primary-color: #1890ff;
    --primary-dark: #096dd9;
    --primary-soft: #e6f4ff;
    --primary-gradient: linear-gradient(135deg, #1890ff 0%, #40a9ff 100%);
    --sidebar-bg: #001529;
    --sidebar-gradient: linear-gradient(180deg, #001529 0%, #002140 100%);
    --sidebar-hover: #1f3a5f;
    --sidebar-active: #1890ff;
    --sidebar-text: rgba(255, 255, 255, 0.85);
    --sidebar-text-dim: rgba(255, 255, 255, 0.6);
    --sidebar-submenu-bg: rgba(0, 0, 0, 0.35);
    --sidebar-border: rgba(255, 255, 255, 0.1);
    --sidebar-accent-soft: rgba(24, 144, 255, 0.18);
    --sidebar-accent-border: rgba(24, 144, 255, 0.35);
    --sidebar-active-gradient: linear-gradient(90deg, rgba(24, 144, 255, 0.55) 0%, rgba(24, 144, 255, 0.3) 100%);
    --bg-color: #f0f2f5;
    --card-bg: #ffffff;
    --text-color: #333333;
    --text-secondary: #666666;
    --border-color: #e8e8e8;
    --success-color: #52c41a;
    --success-dark: #389e0d;
    --success-soft: #f6ffed;
    --success-gradient: linear-gradient(135deg, #52c41a 0%, #73d13d 100%);
    --warning-color: #faad14;
    --warning-dark: #d48806;
    --warning-soft: #fffbe6;
    --warning-gradient: linear-gradient(135deg, #faad14 0%, #ffc53d 100%);
    --danger-color: #ff4d4f;
    --danger-dark: #cf1322;
    --danger-soft: #fff2f0;
    --danger-gradient: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);
    --neutral-50: #fafafa;
    --neutral-100: #f5f5f5;
    --neutral-200: #e8e8e8;
    --neutral-300: #d9d9d9;
    --info-color: #2f54eb;
    --info-soft: #f0f5ff;
    --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06);
    --shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
    --shadow-md: 0 4px 14px rgba(0, 0, 0, 0.10);
    --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12);
    --shadow-focus: 0 0 0 3px;
    --radius: 8px;
    --radius-sm: 6px;
    --radius-md: 10px;
    --radius-lg: 12px;
    --radius-pill: 999px;
    --transition-base: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
    --transition-fast: all 0.15s ease;
    --btn-height: 40px;
    --btn-padding-x: 20px;
    --btn-font: 14px;
    --btn-line-height: 22px;
}

body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
    background-color: var(--bg-color);
    color: var(--text-color);
    line-height: 1.6;
    overflow-x: hidden; /* 兜底防止任何横向溢出撑破页面 */
    word-break: break-word; /* 长文本/URL 自动换行 */
}

/* ==================== 全局响应式兜底 ==================== */
/* 图片永远不超出容器 */
img {
    max-width: 100%;
    height: auto;
}
/* 预格式化内容/代码块内部横向滚动，不撑破父容器 */
pre {
    overflow-x: auto;
    max-width: 100%;
    box-sizing: border-box;
}
/* 表格默认横向滚动容器，避免裸 table 撑破页面 */
table {
    max-width: 100%;
}

/* ==================== 登录页 ==================== */
.login-page {
    position: relative;
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--primary-gradient);
    padding: 40px 60px;
    gap: 60px;
    overflow: hidden;
}

.login-container {
    width: 400px;
    flex-shrink: 0;
    padding: 40px;
    background: var(--card-bg);
    border-radius: var(--radius);
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
    z-index: 2;
    color: var(--text-color);
}

/* 左侧理念文案滚动视窗 */
.login-manifesto-side {
    position: relative;
    max-width: 560px;
    width: 100%;
    height: 380px;
    overflow: hidden;
    z-index: 2;
    text-align: center;
    margin-left: -80px;
}

/* 滚动轨道 */
.manifesto-track {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    transition: transform 0.7s cubic-bezier(0.4, 0, 0.2, 1);
    will-change: transform;
}

/* 每一行固定高度，保证 track 平移计算准确 */
.manifesto-line {
    height: 52px;
    line-height: 52px;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    color: rgba(255, 255, 255, 0.32);
    font-size: 17px;
    letter-spacing: 0.5px;
    transition: opacity 0.7s ease;
    white-space: nowrap;
}

/* 焦点行 */
.manifesto-line.active {
    color: #ffffff;
    font-size: 28px;
    font-weight: 500;
    opacity: 1 !important;
    text-shadow: 0 2px 16px rgba(255, 255, 255, 0.25);
}

/* 焦点行中的高亮句（最后两句） */
.manifesto-line.active.highlight {
    font-size: 32px;
    font-weight: 700;
    color: #ffffff;
    text-shadow: 0 0 24px rgba(255, 255, 255, 0.5);
}

.login-header {
    text-align: center;
    margin-bottom: 30px;
}

.login-header h1 {
    font-size: 24px;
    color: var(--primary-color);
    margin-bottom: 8px;
    word-break: break-word;
    line-height: 1.3;
}

.login-header p {
    color: var(--text-secondary);
    font-size: 12px;
}

.login-form .form-group {
    margin-bottom: 20px;
}

.login-form label {
    display: block;
    margin-bottom: 6px;
    color: var(--text-secondary);
    font-size: 14px;
}

.login-form input {
    width: 100%;
    padding: 10px 14px;
    border: 1px solid var(--border-color);
    border-radius: 4px;
    font-size: 14px;
    transition: border-color 0.3s;
}

.login-form input:focus {
    outline: none;
    border-color: var(--primary-color);
    box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}

.error-msg {
    color: var(--danger-color);
    font-size: 14px;
    margin-bottom: 16px;
    padding: 8px 12px;
    background: #fff1f0;
    border-radius: 4px;
}

.btn-login {
    width: 100%;
    padding: 12px;
    background: var(--primary-color);
    color: white;
    border: none;
    border-radius: 4px;
    font-size: 16px;
    cursor: pointer;
    transition: background 0.3s;
}

.btn-login:hover:not(:disabled) {
    background: var(--primary-dark);
}

.btn-login:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}

/* 备案信息页脚 */
.icp-footer {
    position: absolute;
    bottom: 16px;
    left: 0;
    right: 0;
    text-align: center;
    font-size: 12px;
}

.icp-footer a {
    color: rgba(255, 255, 255, 0.85);
    text-decoration: none;
    transition: color 0.2s;
}

.icp-footer a:hover {
    color: white;
    text-decoration: underline;
}

/* ==================== 管理后台布局 ==================== */
.admin-layout {
    display: flex;
    height: 100vh;
    height: 100dvh; /* iOS 动态视口，避免地址栏伸缩导致高度跳变 */
    overflow: hidden; /* 锁定外框，滚动权交给 .main-content */
}

/* 移动端遮罩 */
.sidebar-overlay {
    display: none;
}

/* 菜单切换按钮 */
.btn-menu-toggle {
    display: none;
    background: none;
    border: none;
    font-size: 20px;
    cursor: pointer;
    padding: 4px 8px;
    margin-right: 8px;
    color: var(--text-color);
}

/* 侧边栏 */
.sidebar {
    width: 220px;
    background: var(--sidebar-gradient);
    color: var(--sidebar-text);
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    overflow-y: auto;
    z-index: 1001;
    transition: transform 0.3s ease;
}

.sidebar-header {
    padding: 20px;
    text-align: center;
    border-bottom: 1px solid var(--sidebar-border);
}

.sidebar-header h2 {
    font-size: 18px;
    color: var(--sidebar-text);
}

.sidebar-nav {
    padding: 12px 0;
}

.nav-item {
    display: flex;
    align-items: center;
    padding: 12px 20px;
    color: var(--sidebar-text-dim);
    text-decoration: none;
    transition: all 0.3s;
    border-left: 3px solid transparent;
}

.nav-item:hover {
    background: var(--sidebar-hover);
    color: var(--sidebar-text);
}

.nav-item.active {
    background: var(--sidebar-hover);
    color: var(--sidebar-text);
    border-left-color: var(--primary-color);
}

.nav-icon {
    margin-right: 10px;
    font-size: 18px;
}

.nav-text {
    font-size: 14px;
}

/* 折叠子菜单（班主任工作台分组导航） */
.nav-group {
    border-radius: 6px;
    margin: 4px 8px;
    overflow: hidden;
}
.nav-item-parent {
    cursor: pointer;
    user-select: none;
    border-radius: 6px;
    transition: all 0.25s ease;
    position: relative;
    padding-left: 18px;
    padding-right: 18px;
}
.nav-item-parent:hover {
    background: var(--sidebar-hover);
}
/* 父级展开状态：左侧高亮条 + 背景提亮 */
.nav-item-parent.expanded {
    background: var(--sidebar-accent-soft);
    color: var(--sidebar-text);
    border-left: 3px solid var(--primary-color);
    padding-left: 15px;
}
.nav-item-parent.expanded::after {
    content: '';
    position: absolute;
    right: 16px;
    top: 50%;
    transform: translateY(-50%);
    width: 4px;
    height: 4px;
    border-radius: 50%;
    background: var(--primary-color);
    box-shadow: 0 0 8px var(--sidebar-accent-border);
}
.nav-arrow {
    margin-left: auto;
    font-size: 13px;
    color: var(--sidebar-text-dim);
    transition: transform 0.3s ease, color 0.25s ease;
}
/* 父级分组聚合徽章：与箭头相邻右对齐，避免与箭头平分剩余空间 */
.nav-item-parent .nav-badge {
    flex-shrink: 0;
}
.nav-item-parent .nav-badge + .nav-arrow {
    margin-left: 8px;
}
/* 展开状态下父级有徽章时隐藏右侧高亮点，避免与徽章视觉重叠 */
.nav-item-parent.expanded:has(.nav-badge)::after {
    display: none;
}
.nav-item-parent.expanded .nav-arrow {
    transform: rotate(90deg);
    color: var(--primary-color);
    text-shadow: 0 0 6px var(--sidebar-accent-border);
}
/* 子菜单区域：明显比父级深，增加左侧竖线标识层级 */
.nav-submenu {
    background: var(--sidebar-submenu-bg);
    border-left: 2px solid var(--sidebar-accent-border);
    margin-left: 18px;
    margin-bottom: 6px;
    padding: 4px 0;
    border-radius: 0 0 6px 6px;
    position: relative;
}
.nav-submenu::before {
    content: '';
    position: absolute;
    left: -2px;
    top: 0;
    bottom: 0;
    width: 2px;
    background: linear-gradient(180deg, var(--primary-color) 0%, var(--sidebar-accent-border) 100%);
    border-radius: 2px;
}
.nav-item-child {
    padding: 10px 14px 10px 30px;
    font-size: 13px;
    margin: 2px 6px;
    border-radius: 4px;
    border-left: 0;
    color: var(--sidebar-text-dim);
    position: relative;
    transition: all 0.2s ease;
}
/* 子项左侧小横线连接竖线 */
.nav-item-child::before {
    content: '';
    position: absolute;
    left: 8px;
    top: 50%;
    width: 14px;
    height: 1px;
    background: var(--sidebar-accent-border);
}
.nav-item-child:hover {
    background: var(--sidebar-hover);
    color: var(--sidebar-text);
    padding-left: 32px;
}
.nav-item-child .nav-icon {
    font-size: 16px;
    margin-right: 8px;
}
/* 子项激活状态：亮蓝白背景 + 蓝色边框，对比度强烈 */
.nav-item-child.active {
    background: var(--sidebar-active-gradient);
    color: var(--sidebar-text);
    font-weight: 600;
    border-left: 0;
    box-shadow: 0 2px 6px var(--sidebar-accent-border);
}
.nav-item-child.active::before {
    background: var(--sidebar-text);
    box-shadow: 0 0 4px var(--sidebar-accent-border);
}

/* 主内容区 */
.main-content {
    margin-left: 220px;
    flex: 1;
    display: flex;
    flex-direction: column;
    height: 100%; /* 撑满 .admin-layout，作为唯一纵向滚动容器 */
    min-width: 0; /* flex 子项，防止内部宽内容撑破 */
    min-height: 0; /* flex 子项，允许收缩以触发内部 .page-content 溢出滚动 */
    overflow-y: auto;
    overflow-x: hidden;
    /* iOS 原生动量 + 独立合成层：避免滚动掉帧、白屏、闪烁 */
    -webkit-overflow-scrolling: touch;
    overscroll-behavior-y: contain; /* 阻止滚动链到 html/body */
    transform: translateZ(0);
    will-change: scroll-position;
    backface-visibility: hidden;
}

/* 顶部栏 */
.top-bar {
    height: 56px;
    background: var(--card-bg);
    box-shadow: var(--shadow);
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0 24px;
    position: sticky;
    top: 0;
    z-index: 100;
    /* sticky 顶栏提升到独立合成层，滚动时不参与重绘 */
    transform: translateZ(0);
    will-change: transform;
    -webkit-backface-visibility: hidden;
}

.breadcrumb {
    font-size: 16px;
    font-weight: 500;
    color: var(--text-color);
}

.user-info {
    display: flex;
    align-items: center;
    gap: 12px;
}

.top-bar-right {
    display: flex;
    align-items: center;
    gap: 12px;
}

/* 主题设置入口按钮 */
.btn-theme-toggle {
    background: transparent;
    border: 1px solid var(--border-color);
    border-radius: 50%;
    width: 34px;
    height: 34px;
    font-size: 16px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: all 0.2s;
    color: var(--text-color);
    flex-shrink: 0;
}
.btn-theme-toggle:hover {
    background: var(--primary-soft);
    border-color: var(--primary-color);
    transform: rotate(-12deg);
}

.ws-indicator {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 8px;
    border-radius: 12px;
    font-size: 12px;
    font-weight: 500;
    user-select: none;
}

.ws-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    display: inline-block;
}

.ws-online {
    background: #e6f7ec;
    color: #1a9e4b;
}

.ws-online .ws-dot {
    background: #1a9e4b;
    box-shadow: 0 0 0 0 rgba(26, 158, 75, 0.4);
    animation: ws-pulse-green 2s infinite;
}

@keyframes ws-pulse-green {
    0% { box-shadow: 0 0 0 0 rgba(26, 158, 75, 0.4); }
    70% { box-shadow: 0 0 0 6px rgba(26, 158, 75, 0); }
    100% { box-shadow: 0 0 0 0 rgba(26, 158, 75, 0); }
}

.ws-polling {
    background: #fff8e6;
    color: #b8860b;
}

.ws-polling .ws-dot {
    background: #f5a623;
}

.ws-refresh {
    background: none;
    border: none;
    cursor: pointer;
    font-size: 14px;
    padding: 0 2px;
}

.ws-refresh:hover {
    opacity: 0.7;
}

.ws-offline {
    background: #fde8e8;
    color: #c0392b;
}

.ws-offline .ws-dot {
    background: #c0392b;
}

.user-name {
    font-weight: 500;
}

.user-role {
    padding: 2px 8px;
    background: var(--primary-color);
    color: white;
    border-radius: 4px;
    font-size: 12px;
}

.btn-logout {
    padding: 6px 16px;
    background: var(--danger-color);
    color: white;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    transition: background 0.3s;
}

.btn-logout:hover {
    background: #cf1322;
}

/* 页面内容 */
.page-content {
    flex: 1;
    padding: 24px;
    min-width: 0; /* flex 子项，防止内部宽内容撑破 */
    /* 用 clip 而非 hidden：hidden 会迫使 overflow-y 计算为 auto，
       导致 .page-content 变成滚动容器，与 .main-content 形成嵌套滚动。
       clip 只裁切横向溢出，纵向保持 visible，让滚动权统一交给 .main-content */
    overflow-x: clip;
    contain: layout paint; /* 隔离布局与绘制，滚动时减少子树重排重绘 */
}

/* ==================== 页面容器 ==================== */
.page-container {
    max-width: 1400px;
    width: 100%;
    box-sizing: border-box;
    overflow-x: hidden; /* 防止内部固定宽元素撑破页面宽度 */
}

.page-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 20px;
}

.page-header h2 {
    font-size: 22px;
    color: var(--text-color);
}

.card {
    background: var(--card-bg);
    border-radius: var(--radius);
    padding: 20px;
    margin-bottom: 16px;
    box-shadow: var(--shadow);
    min-width: 0; /* 作为 grid/flex 子项时防止内部内容撑破 */
    box-sizing: border-box;
    overflow-wrap: anywhere; /* 长文本/URL 在卡片内自动换行 */
}

.card h3 {
    font-size: 16px;
    margin-bottom: 16px;
    color: var(--text-color);
}

/* ==================== 按钮（统一设计规范 v2）==================== */
/*
    设计原则：
    1. 三态一致：hover → 轻微上浮(+1px) + 阴影加深 + 颜色变暗/变亮；active → 按下复位 + 阴影变浅；focus-visible → 3px 聚焦环（无障碍）
    2. disabled → 灰化(opacity-50) + 禁手光标 + 禁用所有 transform 动画
    3. 尺寸：高度 40px / sm 32px / 圆角 md(10px) / sm(6px)
    4. 渐变主色 vs 纯色副按钮，视觉层次清晰
*/
[class*="btn-primary"], [class*="btn-secondary"], [class*="btn-danger"],
[class*="btn-warning"], [class*="btn-success"], [class*="btn-text"],
.btn-back, .btn-sm, .btn-appeal {
    font-family: inherit;
    font-size: var(--btn-font);
    font-weight: 500;
    line-height: var(--btn-line-height);
    letter-spacing: 0.2px;
    min-height: var(--btn-height);
    padding: 9px var(--btn-padding-x);
    cursor: pointer;
    user-select: none;
    -webkit-user-select: none;
    -webkit-tap-highlight-color: transparent;
    position: relative;
    overflow: hidden;
    text-align: center;
    vertical-align: middle;
    border-style: solid;
    transition: var(--transition-base);
    will-change: transform, box-shadow;
}
/* 统一聚焦（键盘可访问）*/
[class*="btn-primary"]:focus-visible, [class*="btn-secondary"]:focus-visible,
[class*="btn-danger"]:focus-visible, [class*="btn-warning"]:focus-visible,
[class*="btn-success"]:focus-visible, .btn-back:focus-visible,
.btn-sm:focus-visible, .btn-appeal:focus-visible {
    outline: none;
    box-shadow: var(--shadow-focus) rgba(24, 144, 255, 0.28);
    border-color: var(--primary-color);
}
/* 统一 disabled */
[class*="btn-"]:disabled, [class*="btn-"][disabled], .btn-sm:disabled, .btn-back:disabled {
    opacity: 0.5;
    cursor: not-allowed !important;
    transform: none !important;
    box-shadow: none !important;
    background-color: var(--neutral-200) !important;
    border-color: var(--neutral-200) !important;
    color: var(--text-secondary) !important;
    background-image: none !important;
}

/* =============== 主按钮：渐变蓝（重要操作：发布、提交、确认）=============== */
.btn-primary {
    background: var(--primary-gradient);
    color: #ffffff;
    border: 0;
    border-radius: var(--radius-md);
    box-shadow: 0 2px 8px rgba(24, 144, 255, 0.28), 0 1px 3px rgba(24, 144, 255, 0.15);
    position: relative;
    z-index: 1;
}
.btn-primary::before {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(135deg, #40a9ff 0%, #096dd9 100%);
    opacity: 0;
    transition: opacity 0.25s ease;
    border-radius: inherit;
    z-index: -1;
}
.btn-primary:hover:not(:disabled) {
    transform: translateY(-1.5px);
    box-shadow: 0 6px 16px rgba(24, 144, 255, 0.36), 0 3px 8px rgba(24, 144, 255, 0.18);
    color: white;
}
.btn-primary:hover:not(:disabled)::before { opacity: 1; }
.btn-primary:active:not(:disabled) {
    transform: translateY(0.5px);
    box-shadow: 0 2px 6px rgba(24, 144, 255, 0.28);
}

/* =============== 副按钮：白底蓝边（次要操作：取消、返回、重试）=============== */
.btn-secondary {
    background: var(--card-bg);
    color: var(--text-color);
    border: 1.5px solid var(--neutral-200);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
}
.btn-secondary:hover:not(:disabled) {
    border-color: var(--primary-color);
    color: var(--primary-dark);
    background: var(--primary-soft);
    transform: translateY(-1.5px);
    box-shadow: 0 5px 14px rgba(24, 144, 255, 0.12);
}
.btn-secondary:active:not(:disabled) {
    transform: translateY(0.5px);
    box-shadow: var(--shadow-sm);
}

/* =============== 文字按钮：轻量操作（编辑、查看、撤销）=============== */
.btn-text {
    background: transparent;
    border: 1.5px solid transparent;
    color: var(--primary-color);
    padding: 6px 12px;
    min-height: 32px;
    border-radius: var(--radius-sm);
    font-weight: 500;
}
.btn-text:hover:not(:disabled) {
    background: var(--primary-soft);
    color: var(--primary-dark);
    border-color: rgba(24, 144, 255, 0.18);
    transform: translateY(-0.5px);
}
.btn-text:active:not(:disabled) {
    transform: translateY(0);
}
.btn-text.danger { color: var(--danger-color); }
.btn-text.danger:hover:not(:disabled) {
    background: var(--danger-soft);
    color: var(--danger-dark);
    border-color: rgba(255, 77, 79, 0.18);
}

/* =============== 危险按钮：渐变红（删除、确认撤销、撤回）=============== */
.btn-danger {
    background: var(--danger-gradient);
    color: #ffffff;
    border: 0;
    border-radius: var(--radius-md);
    box-shadow: 0 2px 8px rgba(255, 77, 79, 0.22), 0 1px 3px rgba(255, 77, 79, 0.12);
}
.btn-danger:hover:not(:disabled) {
    transform: translateY(-1.5px);
    box-shadow: 0 6px 16px rgba(255, 77, 79, 0.30), 0 3px 8px rgba(255, 77, 79, 0.15);
    background: linear-gradient(135deg, #ff7875 0%, #cf1322 100%);
    color: white;
}
.btn-danger:active:not(:disabled) {
    transform: translateY(0.5px);
    box-shadow: 0 2px 6px rgba(255, 77, 79, 0.22);
}

/* =============== 警告按钮：渐变橙（待同步、重要提示操作）=============== */
.btn-warning {
    background: var(--warning-gradient);
    color: #ffffff;
    border: 0;
    border-radius: var(--radius-md);
    box-shadow: 0 2px 8px rgba(250, 173, 20, 0.22), 0 1px 3px rgba(250, 173, 20, 0.12);
}
.btn-warning:hover:not(:disabled) {
    transform: translateY(-1.5px);
    box-shadow: 0 6px 16px rgba(250, 173, 20, 0.32), 0 3px 8px rgba(250, 173, 20, 0.15);
    background: linear-gradient(135deg, #ffc53d 0%, #d48806 100%);
    color: white;
}
.btn-warning:active:not(:disabled) {
    transform: translateY(0.5px);
    box-shadow: 0 2px 6px rgba(250, 173, 20, 0.22);
}

/* =============== 成功按钮：渐变绿（导出、通过、审核通过）=============== */
.btn-success {
    background: var(--success-gradient);
    color: #ffffff;
    border: 0;
    border-radius: var(--radius-md);
    box-shadow: 0 2px 8px rgba(82, 196, 26, 0.22), 0 1px 3px rgba(82, 196, 26, 0.12);
}
.btn-success:hover:not(:disabled) {
    transform: translateY(-1.5px);
    box-shadow: 0 6px 16px rgba(82, 196, 26, 0.32), 0 3px 8px rgba(82, 196, 26, 0.15);
    background: linear-gradient(135deg, #73d13d 0%, #389e0d 100%);
    color: white;
}
.btn-success:active:not(:disabled) {
    transform: translateY(0.5px);
    box-shadow: 0 2px 6px rgba(82, 196, 26, 0.22);
}

/* =============== 返回按钮（学生互评"← 返回列表" 等轻导航按钮）=============== */
.btn-back {
    background: var(--neutral-50);
    color: var(--text-secondary);
    border: 1.5px solid var(--neutral-200);
    border-radius: var(--radius-sm);
    padding: 7px 14px;
    min-height: 34px;
    font-size: 13px;
    font-weight: 500;
    box-shadow: var(--shadow-sm);
}
.btn-back:hover:not(:disabled) {
    color: var(--primary-dark);
    border-color: rgba(24, 144, 255, 0.32);
    background: var(--primary-soft);
    transform: translateX(-2px);
    box-shadow: 0 3px 10px rgba(24, 144, 255, 0.10);
}
.btn-back:active:not(:disabled) {
    transform: translateX(0);
}

/* =============== 小型按钮变体（工具栏、紧凑操作区）=============== */
.btn-sm {
    min-height: 32px !important;
    padding: 5px 14px !important;
    font-size: 13px !important;
    line-height: 20px !important;
    border-radius: var(--radius-sm) !important;
    font-weight: 500 !important;
    letter-spacing: 0.1px !important;
    box-shadow: var(--shadow-sm) !important;
    transition: var(--transition-fast) !important;
}
.btn-sm:hover:not(:disabled) {
    transform: translateY(-1px) !important;
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.08) !important;
}
.btn-sm:active:not(:disabled) {
    transform: translateY(0) !important;
}
.btn-sm.btn-primary { background: var(--primary-gradient) !important; border: 0 !important; }
.btn-sm.btn-secondary { background: var(--card-bg) !important; }
.btn-sm[disabled] { opacity: 0.5; cursor: not-allowed; transform: none !important; box-shadow: none !important; }

/* ==================== 表单 ==================== */
.form-group {
    margin-bottom: 16px;
}

.form-group label {
    display: block;
    margin-bottom: 6px;
    color: var(--text-secondary);
    font-size: 14px;
}

/* 修复：label 内含 checkbox/radio 时，改为 inline-flex 同行显示 */
.form-group label:has(input[type="checkbox"]),
.form-group label:has(input[type="radio"]) {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-bottom: 0;
    cursor: pointer;
    line-height: 1.4;
    white-space: nowrap;
}
.form-group label:has(input[type="checkbox"]) input[type="checkbox"],
.form-group label:has(input[type="radio"]) input[type="radio"] {
    width: 16px;
    height: 16px;
    margin: 0;
    flex-shrink: 0;
    accent-color: var(--primary-color);
}
/* form-row 中 checkbox 独占一行时不压缩 */
.form-row .form-group:has(label > input[type="checkbox"]) {
    min-width: max-content;
    flex: 0 0 auto;
}

.form-group input,
.form-group select,
.form-group textarea {
    width: 100%;
    padding: 8px 12px;
    border: 1px solid var(--border-color);
    border-radius: 4px;
    font-size: 14px;
    transition: border-color 0.3s;
    background: var(--card-bg);
    color: var(--text-color);
}

.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
    outline: none;
    border-color: var(--primary-color);
    box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}

.form-group input:disabled {
    background: var(--neutral-100);
    cursor: not-allowed;
}

.form-section-title {
    margin: 20px 0 12px;
    padding: 8px 12px;
    font-size: 14px;
    font-weight: 600;
    color: var(--primary-color);
    background-color: rgba(24, 144, 255, 0.08);
    border-left: 3px solid var(--primary-color, #1890ff);
    border-radius: 2px;
}

.filter-bar {
    display: flex;
    gap: 12px;
    margin-bottom: 16px;
    align-items: center;
}

.search-input {
    flex: 1;
    max-width: 300px;
    padding: 8px 12px;
    border: 1px solid var(--border-color);
    border-radius: 4px;
    font-size: 14px;
}

.filter-select {
    padding: 8px 12px;
    border: 1px solid var(--border-color);
    border-radius: 4px;
    font-size: 14px;
    min-width: 150px;
}

/* ==================== 表格 ==================== */
.table-container {
    background: var(--card-bg);
    border-radius: var(--radius);
    overflow: hidden;
    box-shadow: var(--shadow);
}

.data-table {
    width: 100%;
    border-collapse: collapse;
}

.data-table th {
    background: var(--neutral-50);
    padding: 12px 16px;
    text-align: left;
    font-weight: 600;
    color: var(--text-color);
    border-bottom: 1px solid var(--border-color);
    font-size: 14px;
}

.data-table td {
    padding: 12px 16px;
    border-bottom: 1px solid var(--border-color);
    font-size: 14px;
    color: var(--text-color);
}

.data-table tr:hover {
    background: var(--neutral-100);
}

.data-table .empty-row {
    text-align: center;
    color: var(--text-secondary);
    padding: 40px;
}

/* ==================== 徽章和状态 ==================== */
.badge {
    display: inline-block;
    padding: 2px 8px;
    border-radius: 4px;
    font-size: 12px;
    font-weight: 500;
    background: var(--neutral-200);
    color: var(--text-secondary);
}
.badge.badge-success { background: #f6ffed; color: #52c41a; border: 1px solid #b7eb8f; }
.badge.badge-warning { background: #fffbe6; color: #faad14; border: 1px solid #ffe58f; }
.badge.badge-danger { background: #fff2f0; color: #ff4d4f; border: 1px solid #ffccc7; }
.badge.badge-info { background: #e6f7ff; color: #1890ff; border: 1px solid #91d5ff; }
.badge.badge-pending { background: #fff7e6; color: #fa8c16; border: 1px solid #ffd591; }

.badge.role-admin {
    background: #1890ff;
    color: white;
}

.badge.role-leader {
    background: #722ed1;
    color: white;
}

.badge.role-middle {
    background: #13c2c2;
    color: white;
}

.badge.role-grade_leader {
    background: #fa8c16;
    color: white;
}

.badge.role-teacher {
    background: #52c41a;
    color: white;
}

.badge.role-student {
    background: #2f54eb;
    color: white;
}

.badge.role-parent {
    background: #eb2f96;
    color: white;
}

.badge.role-success {
    background: #52c41a;
    color: white;
}

.badge.role-danger {
    background: #ff4d4f;
    color: white;
}

/* 超级领导徽章（书记/校长） */
.badge.badge-super {
    background: linear-gradient(135deg, #faad14, #fa8c16);
    color: white;
    border: none;
    margin-left: 4px;
}

/* 分管范围配置 - 复选框组 */
.scope-checkbox-group {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    max-height: 240px;
    overflow-y: auto;
    padding: 8px;
    background: var(--neutral-50);
    border: 1px solid var(--border-color);
    border-radius: 6px;
}

.scope-checkbox-item {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 12px;
    background: var(--card-bg);
    border: 1px solid var(--neutral-300);
    border-radius: 4px;
    cursor: pointer;
    font-size: 13px;
    transition: all 0.2s;
    user-select: none;
}

.scope-checkbox-item:hover {
    border-color: var(--primary-color);
    color: var(--primary-color);
}

.scope-checkbox-item input[type="checkbox"] {
    width: 16px;
    height: 16px;
    cursor: pointer;
    margin: 0;
}

.scope-checkbox-item input[type="checkbox"]:checked + span {
    color: #1890ff;
    font-weight: 500;
}

.status-badge {
    display: inline-block;
    padding: 2px 8px;
    border-radius: 4px;
    font-size: 12px;
}

.status-badge.active,
.status-badge.在读 {
    background: #f6ffed;
    color: #52c41a;
    border: 1px solid #b7eb8f;
}

.status-badge.disabled,
.status-badge.休学 {
    background: #fffbe6;
    color: #faad14;
    border: 1px solid #ffe58f;
}

.status-badge.graduated,
.status-badge.毕业 {
    background: #e6f7ff;
    color: #1890ff;
    border: 1px solid #91d5ff;
}

.status-badge.退学 {
    background: #fff1f0;
    color: #ff4d4f;
    border: 1px solid #ffa39e;
}

.status-badge.outflow,
.status-badge.流出 {
    background: #f5f5f5;
    color: #8c8c8c;
    border: 1px solid #d9d9d9;
}

/* ==================== 弹窗 ==================== */
.modal-overlay {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(0, 0, 0, 0.5);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 1000;
}

.modal-content {
    background: var(--card-bg);
    border-radius: var(--radius);
    width: 500px;
    max-height: 90vh;
    overflow-y: auto;
    padding: 24px;
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
    color: var(--text-color);
}

.modal-content h3 {
    margin-bottom: 20px;
    font-size: 18px;
}

.modal-actions {
    display: flex;
    justify-content: flex-end;
    gap: 12px;
    margin-top: 24px;
}

/* ==================== 分页 ==================== */
.pagination {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 12px;
    margin-top: 20px;
}

.pagination button {
    padding: 6px 16px;
    border: 1px solid var(--border-color);
    background: var(--card-bg);
    border-radius: 4px;
    cursor: pointer;
    transition: all 0.3s;
    color: var(--text-color);
}

.pagination button:hover:not(:disabled) {
    border-color: var(--primary-color);
    color: var(--primary-color);
}

.pagination button:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}

.pagination span {
    color: var(--text-secondary);
}

/* ==================== 角色模块Tab ==================== */
.role-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 16px;
    padding: 12px;
    background: var(--card-bg);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
}

.role-tab {
    padding: 8px 16px;
    border: 1px solid var(--border-color);
    background: var(--card-bg);
    border-radius: 20px;
    cursor: pointer;
    transition: all 0.25s;
    font-size: 14px;
    color: var(--text-secondary);
    display: inline-flex;
    align-items: center;
    gap: 4px;
}

.role-tab:hover {
    border-color: var(--primary-color);
    color: var(--primary-color);
}

.role-tab.active {
    background: var(--primary-color);
    border-color: var(--primary-color);
    color: white;
}

.role-tab .tab-count {
    display: inline-block;
    min-width: 20px;
    padding: 0 6px;
    height: 18px;
    line-height: 18px;
    text-align: center;
    background: rgba(0, 0, 0, 0.08);
    border-radius: 9px;
    font-size: 12px;
    color: inherit;
}

.role-tab.active .tab-count {
    background: rgba(255, 255, 255, 0.25);
    color: white;
}

/* ==================== Peer Tabs（页面级标签切换） ==================== */
.peer-tabs {
    display: flex;
    gap: 6px;
    margin-bottom: 20px;
    border-bottom: 2px solid var(--border-color);
    padding-bottom: 0;
}

.peer-tab {
    padding: 12px 28px;
    font-size: 15px;
    font-weight: 500;
    color: var(--text-secondary);
    cursor: pointer;
    border: 1.5px solid transparent;
    border-bottom: none;
    border-radius: 10px 10px 0 0;
    background: #f5f7fa;
    transition: all 0.25s ease;
    user-select: none;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    position: relative;
    top: 2px;
}

.peer-tab:hover {
    color: var(--primary-color);
    background: #e6f4ff;
    border-color: #bae0ff;
}

.peer-tab.active {
    background: var(--card-bg);
    color: var(--primary-color);
    border-color: var(--border-color);
    border-bottom: 2px solid var(--card-bg);
    font-weight: 600;
    box-shadow: 0 -2px 8px rgba(24, 144, 255, 0.08);
    top: 0;
}

.peer-tab .tab-count {
    background: #ff4d4f;
    color: #fff;
    font-size: 12px;
    padding: 2px 8px;
    border-radius: 10px;
    margin-left: 4px;
    font-weight: 600;
}

/* 内容区由各组件自行管理，无需默认样式 */

/* ==================== 分页栏（含每页条数选择） ==================== */
.pagination-bar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 12px;
    margin-top: 20px;
    padding: 12px 16px;
    background: white;
    border-radius: var(--radius);
    box-shadow: var(--shadow);
}

.page-size-selector {
    display: flex;
    align-items: center;
    gap: 8px;
    color: var(--text-secondary);
    font-size: 14px;
}

.page-size-selector select {
    padding: 4px 8px;
    border: 1px solid var(--border-color);
    border-radius: 4px;
    background: white;
    cursor: pointer;
    font-size: 14px;
}

.page-size-selector select:focus {
    outline: none;
    border-color: var(--primary-color);
}

.pagination-bar .pagination {
    margin-top: 0;
}

.pagination-info {
    color: var(--text-secondary);
    font-size: 14px;
}

@media (max-width: 768px) {
    .pagination-bar {
        flex-direction: column;
        align-items: stretch;
    }
    .page-size-selector {
        justify-content: center;
    }
    .pagination-info {
        text-align: center;
    }
}

/* ==================== 统计卡片 ==================== */
.dashboard {
    padding: 20px;
}

.dashboard h2 {
    margin-bottom: 24px;
    color: var(--text-color);
}

.stats-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 16px;
}

.stat-card {
    background: white;
    border-radius: var(--radius);
    padding: 24px;
    display: flex;
    align-items: center;
    gap: 16px;
    box-shadow: var(--shadow);
    transition: transform 0.2s, box-shadow 0.2s;
}

.stat-card:hover {
    transform: translateY(-2px);
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
}

.stat-icon {
    font-size: 40px;
}

.stat-info {
    flex: 1;
}

.stat-value {
    font-size: 28px;
    font-weight: bold;
    color: var(--primary-color);
}

.stat-label {
    font-size: 14px;
    color: var(--text-secondary);
}

.stat-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 4px 16px;
}
.stat-success { color: #52c41a; }
.stat-warning { color: #faad14; }
.stat-danger { color: #ff4d4f; }

/* ==================== 转班页面 ==================== */
.form-check {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px;
    background: #fafafa;
    border-radius: 4px;
    margin-bottom: 12px;
}

.form-check label {
    cursor: pointer;
}

.student-list {
    max-height: 300px;
    overflow-y: auto;
    border: 1px solid var(--border-color);
    border-radius: 4px;
    padding: 12px;
}

.student-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px;
    cursor: pointer;
    border-radius: 4px;
    transition: background 0.2s;
}

.student-item:hover {
    background: #f5f5f5;
}

.empty-tip {
    text-align: center;
    color: var(--text-secondary);
    padding: 20px;
}

.transfer-summary {
    padding: 12px;
    background: #e6f7ff;
    border-radius: 4px;
    margin-bottom: 16px;
}

.transfer-summary p {
    margin-bottom: 4px;
}

/* ==================== 转班功能 - 当前班级展示 ==================== */
.class-info-display {
    padding: 8px 0;
}

.class-info-single {
    display: flex;
    align-items: center;
    padding: 12px 16px;
    background: linear-gradient(135deg, #e6f7ff 0%, #bae7ff 100%);
    border: 1px solid #91d5ff;
    border-radius: 6px;
}

.class-info-single .class-label {
    color: #666;
    font-size: 14px;
}

.class-info-single .class-name {
    font-size: 18px;
    font-weight: 600;
    color: #1890ff;
    margin-left: 8px;
}

.class-info-display .class-label {
    display: block;
    color: #666;
    font-size: 14px;
    margin-bottom: 8px;
}

/* ==================== 错误页面 ==================== */
.error-page {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--bg-color);
}

.error-content {
    text-align: center;
}

.error-content h1 {
    font-size: 120px;
    color: var(--primary-color);
    margin-bottom: 16px;
}

.error-content p {
    font-size: 18px;
    color: var(--text-secondary);
    margin-bottom: 24px;
}

/* ==================== 响应式 ==================== */
@media (max-width: 768px) {
    /* 侧边栏改为抽屉模式 */
    .sidebar {
        transform: translateX(-100%);
    }

    .sidebar.show {
        transform: translateX(0);
    }

    .sidebar-overlay {
        display: block;
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background: rgba(0, 0, 0, 0.5);
        z-index: 1000;
    }

    .btn-menu-toggle {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        font-size: 24px;
        padding: 8px 12px;
        min-width: 44px;
        min-height: 44px;
        line-height: 1;
        border-radius: 8px;
        background: rgba(255, 255, 255, 0.12);
        border: 1px solid rgba(255, 255, 255, 0.15);
    }

    .btn-menu-toggle:active {
        background: rgba(255, 255, 255, 0.22);
    }

    .main-content {
        margin-left: 0;
    }

    .table-container {
        overflow-x: auto;
    }

    .data-table {
        min-width: 800px;
    }

    .stats-grid {
        grid-template-columns: repeat(2, 1fr);
    }

    .filter-bar {
        flex-wrap: wrap;
    }

    .search-input {
        max-width: none;
        width: 100%;
    }

    .filter-select {
        width: 100%;
    }

    .page-content {
        padding: 12px;
    }

    .page-header {
        flex-direction: column;
        align-items: flex-start;
        gap: 12px;
    }

    .page-header h2 {
        font-size: 18px;
    }

    .btn-primary, .btn-secondary {
        width: 100%;
        padding: 10px;
        font-size: 15px;
    }

    .login-page {
        flex-direction: column;
        justify-content: center;
        padding: 24px 16px 50px;
        gap: 24px;
    }

    .login-container {
        order: 1;
        width: 100%;
        max-width: 400px;
        padding: 24px;
    }

    .login-manifesto-side {
        order: 2;
        width: 100%;
        height: 260px;
        margin-left: 0;
    }

    .manifesto-line {
        height: 44px;
        line-height: 44px;
        font-size: 14px;
    }

    .manifesto-line.active {
        font-size: 19px;
    }

    .manifesto-line.active.highlight {
        font-size: 22px;
    }

    .modal-content {
        width: 92%;
        max-height: 85vh;
        padding: 16px;
    }

    .stats-grid {
        grid-template-columns: 1fr;
    }

    .top-bar {
        padding: 0 12px;
    }

    .user-info {
        gap: 6px;
    }

    .user-name {
        font-size: 13px;
    }

    .user-role {
        display: none;
    }

    .btn-logout {
        padding: 4px 10px;
        font-size: 12px;
    }

    .btn-text {
        font-size: 14px;
        padding: 6px 10px;
    }

    .peer-tabs {
        flex-wrap: wrap;
        gap: 4px;
    }

    .peer-tab {
        padding: 10px 18px;
        font-size: 14px;
        border-radius: 10px;
        top: 0;
    }

    .btn-sm {
        width: auto !important;
        padding: 5px 12px !important;
    }

    .form-row {
        flex-direction: column;
        gap: 0;
    }

    .modal-punishment {
        width: 94% !important;
        max-height: 90vh;
        padding: 18px;
    }
}

@media (max-width: 480px) {
    .stat-card {
        padding: 16px;
    }

    .stat-icon {
        font-size: 28px;
    }

    .stat-value {
        font-size: 20px;
    }

    .login-header h1 {
        font-size: 18px;
    }

    .modal-actions {
        flex-direction: column-reverse;
    }

    .modal-actions button {
        width: 100%;
    }

    .radio-group {
        flex-direction: column;
        gap: 8px;
    }

    .modal-punishment {
        padding: 14px;
    }
}

