/**
 * OA v4 全局样式 — 精装版
 * 现代化 UI：毛玻璃导航、渐变卡片、微动画、精致阴影
 */

/* ============================================================
   设计令牌 (Design Tokens)
   ============================================================ */
:root {
    --primary: #6366F1;
    --primary-light: #A78BFA;
    --primary-dark: #3730A3;
    --primary-bg: #EEF2FF;
    --primary-soft: rgba(99,102,241,.1);
    --primary-glow: rgba(99,102,241,.24);
    --accent: #22D3EE;

    --success: #10B981;
    --success-bg: #ECFDF5;
    --warning: #F59E0B;
    --warning-bg: #FFFBEB;
    --danger: #EF4444;
    --danger-bg: #FEF2F2;
    --info: #3B82F6;
    --info-bg: #EFF6FF;

    --text-primary: #172033;
    --text-secondary: #5F6F8A;
    --text-placeholder: #9CA3AF;
    --text-white: #fff;

    --bg-page: #F4F7FB;
    --bg-card: rgba(255,255,255,.82);
    --bg-card-solid: #FFFFFF;
    --bg-glass: rgba(255,255,255,.72);
    --bg-glass-strong: rgba(255,255,255,.9);
    --bg-input: rgba(248,250,252,.82);
    --bg-hover: rgba(99,102,241,.07);

    --border: rgba(148,163,184,.24);
    --border-light: rgba(255,255,255,.62);
    --border-focus: var(--primary);

    --radius-sm: 10px;
    --radius-md: 14px;
    --radius-lg: 20px;
    --radius-xl: 28px;
    --radius-full: 9999px;

    --shadow-xs: 0 1px 2px rgba(0,0,0,.04);
    --shadow-sm: 0 2px 8px rgba(15,23,42,.05);
    --shadow-md: 0 12px 30px rgba(30,41,59,.08);
    --shadow-lg: 0 18px 48px rgba(30,41,59,.11);
    --shadow-xl: 0 28px 72px rgba(15,23,42,.16);
    --shadow-card: 0 1px 2px rgba(15,23,42,.04), 0 14px 34px rgba(30,41,59,.07);
    --shadow-glow: 0 18px 48px rgba(99,102,241,.18);

    --space-xs: 4px;
    --space-sm: 8px;
    --space-md: 16px;
    --space-lg: 24px;
    --space-xl: 32px;

    --nav-height: 64px;
    --nav-safe-bottom: env(safe-area-inset-bottom, 0px);

    --font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
    --font-xs: 11px;
    --font-sm: 13px;
    --font-base: 15px;
    --font-lg: 17px;
    --font-xl: 20px;
    --font-2xl: 26px;
    --font-3xl: 32px;

    --ease-spring: cubic-bezier(.34,1.56,.64,1);
    --ease-smooth: cubic-bezier(.4,0,.2,1);
    --transition: .25s var(--ease-smooth);
}

/* ============================================================
   重置 & 基础
   ============================================================ */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{font-size:16px;height:100%;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;overflow:hidden}
body{font-family:var(--font-family);font-size:var(--font-base);line-height:1.6;color:var(--text-primary);background:var(--bg-page);height:100%;overflow:hidden;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
a{color:var(--primary);text-decoration:none}
img{max-width:100%;height:auto;display:block}
input,select,textarea,button{font:inherit;outline:none;border:none;background:none}
::-webkit-scrollbar{width:4px;height:4px}
::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:4px}

/* ============================================================
   页面框架
   ============================================================ */
.page-wrapper{height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch;padding-bottom:calc(var(--nav-height) + var(--nav-safe-bottom) + 16px);display:flex;flex-direction:column}

.page-header{position:sticky;top:0;z-index:100;background:rgba(255,255,255,.92);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);padding:14px var(--space-md);display:flex;align-items:center;justify-content:space-between;min-height:56px;border-bottom:1px solid rgba(0,0,0,.04)}
.page-header-title{font-size:var(--font-lg);font-weight:700;flex:1;text-align:center;letter-spacing:.3px}
.page-header-left,.page-header-right{width:48px;display:flex;align-items:center}
.page-header-left{justify-content:flex-start}
.page-header-right{justify-content:flex-end}

.page-content{flex:1;padding:var(--space-md)}

/* ============================================================
   底部导航栏 — 毛玻璃效果
   ============================================================ */
.bottom-nav{position:fixed;bottom:0;left:0;right:0;height:calc(var(--nav-height) + var(--nav-safe-bottom));padding-bottom:var(--nav-safe-bottom);background:rgba(255,255,255,.88);backdrop-filter:blur(24px) saturate(200%);-webkit-backdrop-filter:blur(24px) saturate(200%);display:flex;align-items:center;justify-content:space-around;border-top:1px solid rgba(0,0,0,.06);z-index:999}

.nav-item{display:flex;flex-direction:column;align-items:center;justify-content:center;text-decoration:none;color:var(--text-secondary);font-size:var(--font-xs);padding:6px 0;flex:1;position:relative;transition:color var(--transition)}
.nav-item .nav-icon{font-size:24px;margin-bottom:2px;line-height:1;transition:transform var(--transition)}
.nav-item .nav-label{font-size:10px;font-weight:500;letter-spacing:.3px}
.nav-item.active{color:var(--primary)}
.nav-item.active .nav-icon{transform:scale(1.12)}

.nav-item-center{position:relative;top:-18px}
.nav-item-center .nav-icon-plus{width:54px;height:54px;border-radius:50%;background:linear-gradient(135deg,var(--primary) 0%,var(--primary-light) 100%);color:white;display:flex;align-items:center;justify-content:center;font-size:30px;font-weight:300;box-shadow:0 6px 20px rgba(99,102,241,.45);transition:transform .2s var(--ease-spring),box-shadow .2s}
.nav-item-center:active .nav-icon-plus{transform:scale(.88);box-shadow:0 3px 10px rgba(99,102,241,.3)}

.nav-badge{position:absolute;top:-2px;right:50%;transform:translateX(calc(50% + 12px));background:var(--danger);color:white;font-size:9px;min-width:16px;height:16px;border-radius:8px;display:flex;align-items:center;justify-content:center;padding:0 5px;font-weight:700;border:2px solid white;box-shadow:0 2px 4px rgba(239,68,68,.3)}

.bottom-nav--dense .nav-item{padding:6px 2px}
.bottom-nav--dense .nav-item .nav-icon{font-size:19px;width:30px;height:26px}
.bottom-nav--dense .nav-item .nav-label{font-size:9px;letter-spacing:.1px}

/* ============================================================
   卡片 — 精致版
   ============================================================ */
.card{background:var(--bg-card);border-radius:var(--radius-lg);padding:var(--space-md);margin-bottom:var(--space-md);box-shadow:var(--shadow-card);transition:box-shadow var(--transition);border:1px solid rgba(0,0,0,.03)}
.card:hover{box-shadow:var(--shadow-md)}
.card-title{font-size:var(--font-base);font-weight:700;margin-bottom:var(--space-sm);letter-spacing:.2px}
.card-subtitle{font-size:var(--font-sm);color:var(--text-secondary)}

/* ============================================================
   按钮系统 — 渐变 + 微动画
   ============================================================ */
.oa-btn{display:inline-flex;align-items:center;justify-content:center;padding:11px 22px;border-radius:var(--radius-md);font-size:var(--font-base);font-weight:600;cursor:pointer;transition:all .2s var(--ease-smooth);gap:6px;line-height:1.4;white-space:nowrap;letter-spacing:.2px;border:none}
.oa-btn:active{transform:scale(.96)}
.oa-btn-primary{background:linear-gradient(135deg,var(--primary) 0%,var(--primary-light) 100%);color:white;box-shadow:0 4px 14px rgba(99,102,241,.3)}
.oa-btn-primary:hover{box-shadow:0 6px 20px rgba(99,102,241,.4);transform:translateY(-1px)}
.oa-btn-success{background:linear-gradient(135deg,#059669,var(--success));color:white;box-shadow:0 4px 14px rgba(16,185,129,.3)}
.oa-btn-danger{background:linear-gradient(135deg,#DC2626,var(--danger));color:white;box-shadow:0 4px 14px rgba(239,68,68,.3)}
.oa-btn-secondary{background:white;color:var(--text-secondary);border:1.5px solid var(--border);box-shadow:var(--shadow-xs)}
.oa-btn-secondary:hover{border-color:var(--primary);color:var(--primary)}
.oa-btn-extra{background:var(--info-bg);color:var(--info);border:1.5px dashed rgba(59,130,246,.4)}
.oa-btn-extra:hover{border-color:var(--info);color:#2563EB;background:rgba(59,130,246,.1)}
.oa-btn-text{background:transparent;color:var(--text-secondary);padding:8px 12px}
.oa-btn-block{display:flex;width:100%}
.oa-btn-sm{padding:7px 14px;font-size:var(--font-sm);border-radius:var(--radius-sm)}
.oa-btn-lg{padding:14px 28px;font-size:var(--font-lg);border-radius:var(--radius-md)}
.oa-btn:disabled{opacity:.45;cursor:not-allowed;transform:none!important}

/* ============================================================
   表单
   ============================================================ */
.form-group{margin-bottom:var(--space-md)}
.form-label{display:block;font-size:var(--font-sm);font-weight:600;color:var(--text-primary);margin-bottom:6px}
.form-label .required{color:var(--danger);margin-left:2px}
.form-input,.form-select,.form-textarea{width:100%;padding:11px 14px;border:1.5px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);font-size:var(--font-base);color:var(--text-primary);transition:border-color var(--transition),box-shadow var(--transition),background var(--transition)}
.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--primary);box-shadow:0 0 0 4px var(--primary-glow);background:white}
.form-input::placeholder,.form-textarea::placeholder{color:var(--text-placeholder)}
.form-textarea{min-height:80px;resize:vertical}
.form-select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M6 8L1 3h10z' fill='%236B7280'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;padding-right:36px}
.form-hint{font-size:var(--font-xs);color:var(--text-secondary);margin-top:4px}
.form-error{font-size:var(--font-xs);color:var(--danger);margin-top:4px}
/* 日期/时间框：左右无内边距，文字居中，高度略缩 */
input.form-input[type="date"],input.form-input[type="time"]{padding:7px 0!important;text-align:center!important}

.period-toggle{display:inline-flex;border:1.5px solid var(--border);border-radius:var(--radius-md);overflow:hidden}
.period-toggle input[type="radio"]{display:none}
.period-toggle label{padding:9px 18px;cursor:pointer;font-size:var(--font-sm);font-weight:600;color:var(--text-secondary);background:white;transition:all var(--transition);border-right:1px solid var(--border)}
.period-toggle label:last-child{border-right:none}
.period-toggle input[type="radio"]:checked+label{background:var(--primary);color:white}

.form-row{display:flex;gap:var(--space-sm);align-items:flex-end}
.form-row .form-group{flex:1}


/* ============================================================
   状态标签 — 胶囊样式
   ============================================================ */
.status-badge{display:inline-flex;align-items:center;padding:3px 12px;border-radius:var(--radius-full);font-size:var(--font-xs);font-weight:600;line-height:1.7;letter-spacing:.3px}
.status-pending{background:#FEF3C7;color:#92400E}
.status-approved{background:#D1FAE5;color:#065F46}
.status-rejected{background:#FEE2E2;color:#991B1B}
.status-cancelled{background:#F3F4F6;color:#6B7280}
.status-draft{background:#F3F4F6;color:#9CA3AF}

/* ============================================================
   申请类型图标 — 渐变背景
   ============================================================ */
.app-type-icon{width:42px;height:42px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;font-size:20px;flex-shrink:0}
.app-type-1{background:linear-gradient(135deg,#FEE2E2,#FECACA)}
.app-type-2{background:linear-gradient(135deg,#DBEAFE,#BFDBFE)}
.app-type-3{background:linear-gradient(135deg,#D1FAE5,#A7F3D0)}
.app-type-4{background:linear-gradient(135deg,#FEF3C7,#FDE68A)}
.app-type-5{background:linear-gradient(135deg,#FCE7F3,#FBCFE8)}
.app-type-6{background:linear-gradient(135deg,#E0E7FF,#C7D2FE)}
.app-type-7{background:linear-gradient(135deg,#F3E8FF,#E9D5FF)}
.app-type-8{background:linear-gradient(135deg,#CCFBF1,#99F6E4)}
.app-type-9{background:linear-gradient(135deg,#FFF7ED,#FED7AA)}

/* ============================================================
   列表项 — 悬浮效果
   ============================================================ */
.list-item{display:flex;align-items:center;padding:14px var(--space-md);background:var(--bg-card);border-bottom:1px solid rgba(0,0,0,.04);gap:var(--space-md);transition:background var(--transition)}
.list-item:active{background:var(--bg-hover)}
.list-item:last-child{border-bottom:none}
.list-item-content{flex:1;min-width:0}
.list-item-title{font-size:var(--font-base);font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.list-item-desc{font-size:var(--font-sm);color:var(--text-secondary);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.list-item-right{text-align:right;flex-shrink:0}

/* ============================================================
   Tab 切换 — 底部指示器动画
   ============================================================ */
.tabs{display:flex;background:var(--bg-card);border-bottom:1px solid rgba(0,0,0,.04);overflow-x:auto;-webkit-overflow-scrolling:touch}
.tab-item{flex:1;text-align:center;padding:13px 16px;font-size:var(--font-base);font-weight:600;color:var(--text-secondary);cursor:pointer;position:relative;white-space:nowrap;transition:color var(--transition)}
.tab-item.active{color:var(--primary)}
.tab-item.active::after{content:'';position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:28px;height:3px;background:linear-gradient(90deg,var(--primary),var(--primary-light));border-radius:3px}

/* ============================================================
   通知角标
   ============================================================ */
.notif-badge{position:relative;display:inline-flex}
.notif-badge .badge-count{position:absolute;top:-6px;right:-10px;background:var(--danger);color:white;font-size:9px;min-width:18px;height:18px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 5px;font-weight:700;border:2px solid white;animation:badge-pulse 2s infinite}
@keyframes badge-pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.08)}}

/* ============================================================
   快捷菜单 — 弹出动画
   ============================================================ */
.quick-menu-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.45);backdrop-filter:blur(4px);z-index:1000;display:none;opacity:0;transition:opacity .3s}
.quick-menu-overlay.show{display:block;opacity:1}
.quick-menu{position:absolute;bottom:calc(var(--nav-height) + var(--nav-safe-bottom) + 16px);left:50%;transform:translateX(-50%) translateY(30px);background:white;border-radius:var(--radius-xl);padding:var(--space-lg) var(--space-md);width:calc(100% - 32px);max-width:380px;box-shadow:var(--shadow-xl);opacity:0;transition:all .35s var(--ease-spring)}
.quick-menu-overlay.show .quick-menu{transform:translateX(-50%) translateY(0);opacity:1}
.quick-menu-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--space-md)}
.quick-menu-section{grid-column:1/-1;font-size:var(--font-xs);font-weight:700;color:var(--text-secondary);letter-spacing:.4px;margin:2px 0 -6px;padding-left:4px}
.quick-menu-item{display:flex;flex-direction:column;align-items:center;gap:6px;cursor:pointer;padding:var(--space-sm);border-radius:var(--radius-md);transition:background var(--transition),transform var(--transition);text-decoration:none;color:var(--text-primary)}
.quick-menu-item:active{background:var(--bg-hover);transform:scale(.94)}
.quick-menu-item .qm-icon{width:48px;height:48px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;font-size:24px}
.quick-menu-item .qm-label{font-size:var(--font-xs);font-weight:600;text-align:center;letter-spacing:.2px}
.quick-apply-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}

/* ============================================================
   考勤打卡卡片 — 渐变 + 光泽
   ============================================================ */
.attendance-card{background:linear-gradient(135deg,#4338CA 0%,var(--primary) 40%,var(--primary-light) 100%);border-radius:var(--radius-xl);padding:var(--space-xl) var(--space-lg);color:white;text-align:center;margin-bottom:var(--space-md);position:relative;overflow:hidden;box-shadow:0 8px 32px rgba(67,56,202,.3)}
.attendance-card::before{content:'';position:absolute;top:-60%;right:-30%;width:200px;height:200px;border-radius:50%;background:rgba(255,255,255,.08)}
.attendance-card::after{content:'';position:absolute;bottom:-40%;left:-20%;width:180px;height:180px;border-radius:50%;background:rgba(255,255,255,.05)}
.attendance-time{font-size:var(--font-3xl);font-weight:800;letter-spacing:2px;margin-bottom:4px;text-shadow:0 2px 4px rgba(0,0,0,.1)}
.attendance-date{font-size:var(--font-sm);opacity:.85;margin-bottom:var(--space-md)}
.attendance-btn{display:inline-flex;align-items:center;justify-content:center;width:84px;height:84px;border-radius:50%;background:rgba(255,255,255,.18);color:white;font-size:var(--font-lg);font-weight:700;border:3px solid rgba(255,255,255,.35);cursor:pointer;transition:all .2s var(--ease-spring);backdrop-filter:blur(8px);position:relative;z-index:1}
.attendance-btn:active{transform:scale(.92);background:rgba(255,255,255,.28)}
.attendance-btn.clock-out{background:rgba(16,185,129,.25);border-color:rgba(16,185,129,.5)}
.attendance-btn.done{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.15);cursor:default;opacity:.6}
.attendance-status{font-size:var(--font-sm);opacity:.8;margin-top:var(--space-sm);position:relative;z-index:1}

/* ============================================================
   Toast — 现代圆角胶囊
   ============================================================ */
.oa-toast{position:fixed;top:80px;left:50%;transform:translateX(-50%) translateY(-20px);padding:12px 28px;border-radius:var(--radius-full);font-size:var(--font-sm);font-weight:600;z-index:10000;opacity:0;transition:all .35s var(--ease-spring);pointer-events:none;max-width:calc(100% - 40px);text-align:center;box-shadow:var(--shadow-lg)}
.oa-toast-show{opacity:1;transform:translateX(-50%) translateY(0)}
.oa-toast-success{background:var(--success);color:white}
.oa-toast-error{background:var(--danger);color:white}
.oa-toast-warning{background:var(--warning);color:white}
.oa-toast-info{background:var(--info);color:white}

/* ============================================================
   Loading
   ============================================================ */
#oa-loading{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(255,255,255,.7);backdrop-filter:blur(4px);display:none;align-items:center;justify-content:center;z-index:9999}
.oa-loading-spinner{width:40px;height:40px;border:3.5px solid var(--border);border-top-color:var(--primary);border-radius:50%;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* ============================================================
   对话框
   ============================================================ */
.oa-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.45);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:10000;padding:var(--space-lg);animation:fadeIn .2s}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.oa-dialog{background:white;border-radius:var(--radius-xl);padding:var(--space-lg);width:100%;max-width:340px;box-shadow:var(--shadow-xl);animation:slideUp .3s var(--ease-spring)}
@keyframes slideUp{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
.oa-dialog-title{font-size:var(--font-lg);font-weight:700;margin-bottom:var(--space-sm)}
.oa-dialog-content{font-size:var(--font-base);color:var(--text-secondary);margin-bottom:var(--space-lg);line-height:1.6}
.oa-dialog-actions{display:flex;gap:var(--space-sm);justify-content:flex-end}
.oa-dialog-actions-row{flex-direction:row;flex-wrap:wrap;justify-content:center;align-items:stretch}
.oa-dialog-actions-row .oa-btn{min-height:44px;white-space:nowrap}
/* 手机版打卡弹窗：上标准打卡，下灰色手动签到，再下取消 */
@media (max-width:768px){
.oa-dialog-actions-punch{flex-direction:column;width:100%}
.oa-dialog-actions-punch .oa-btn{width:100%}
.oa-dialog-actions-punch .oa-btn-punch-manual{background:#F1F5F9;color:#475569;border:1.5px solid #E2E8F0;box-shadow:none}
.oa-dialog-actions-punch .oa-btn-punch-manual:hover{background:#E2E8F0;color:#334155;border-color:#CBD5E1}
}
.oa-btn-punch-manual{background:linear-gradient(135deg,#93C5FD 0%,#60A5FA 100%);color:#1E40AF;box-shadow:0 4px 14px rgba(59,130,246,.35);border:none}
.oa-btn-punch-manual:hover{background:linear-gradient(135deg,#60A5FA 0%,#3B82F6 100%);color:white;box-shadow:0 6px 20px rgba(59,130,246,.45)}
.oa-btn-punch-standard{background:linear-gradient(135deg,#059669 0%,#10B981 100%);color:white;box-shadow:0 4px 14px rgba(16,185,129,.3);border:none}
.oa-btn-punch-standard:hover{box-shadow:0 6px 20px rgba(16,185,129,.4);transform:translateY(-1px)}
/* 对话框按钮：确认=淡蓝色，取消=淡红色，更易区分 */
.oa-dialog-actions .oa-btn-primary[data-action="confirm"],
.oa-dialog-actions .oa-btn[data-action="confirm"]{
    background:linear-gradient(135deg,#93C5FD 0%,#60A5FA 100%);color:#1E40AF;box-shadow:0 4px 14px rgba(59,130,246,.35);border:none
}
.oa-dialog-actions .oa-btn-primary[data-action="confirm"]:hover,
.oa-dialog-actions .oa-btn[data-action="confirm"]:hover{
    background:linear-gradient(135deg,#60A5FA 0%,#3B82F6 100%);color:white;box-shadow:0 6px 20px rgba(59,130,246,.45)
}
.oa-dialog-actions .oa-btn-secondary[data-action="cancel"],
.oa-dialog-actions .oa-btn[data-action="cancel"]{
    background:#FEE2E2;color:#991B1B;border:1.5px solid #FECACA;box-shadow:0 2px 8px rgba(239,68,68,.15)
}
.oa-dialog-actions .oa-btn-secondary[data-action="cancel"]:hover,
.oa-dialog-actions .oa-btn[data-action="cancel"]:hover{
    background:#FECACA;color:#B91C1C;border-color:#F87171
}

/* ============================================================
   审批时间线
   ============================================================ */
.timeline{position:relative;padding-left:30px}
.timeline::before{content:'';position:absolute;left:10px;top:8px;bottom:8px;width:2px;background:linear-gradient(to bottom,var(--primary-light),var(--border))}
.timeline-item{position:relative;padding-bottom:var(--space-md)}
.timeline-item:last-child{padding-bottom:0}
.timeline-dot{position:absolute;left:-24px;top:4px;width:14px;height:14px;border-radius:50%;border:2.5px solid var(--border);background:white;transition:all var(--transition)}
.timeline-dot.completed{background:var(--success);border-color:var(--success);box-shadow:0 0 0 3px rgba(16,185,129,.15)}
.timeline-dot.current{background:var(--primary);border-color:var(--primary);box-shadow:0 0 0 4px var(--primary-glow);animation:pulse 2s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 4px var(--primary-glow)}50%{box-shadow:0 0 0 8px rgba(99,102,241,.08)}}
.timeline-dot.rejected{background:var(--danger);border-color:var(--danger);box-shadow:0 0 0 3px rgba(239,68,68,.15)}
.timeline-content{font-size:var(--font-sm)}
.timeline-title{font-weight:600;color:var(--text-primary)}
.timeline-time{font-size:var(--font-xs);color:var(--text-secondary);margin-top:2px}
.timeline-comment{font-size:var(--font-sm);color:var(--text-secondary);margin-top:6px;padding:8px 12px;background:var(--bg-page);border-radius:var(--radius-sm);border-left:3px solid var(--border)}

/* ============================================================
   空状态
   ============================================================ */
.empty-state{text-align:center;padding:var(--space-xl) var(--space-md);color:var(--text-secondary)}
.empty-state-icon{font-size:52px;margin-bottom:var(--space-md);opacity:.35}
.empty-state-text{font-size:var(--font-base);font-weight:500}

/* ============================================================
   数据统计
   ============================================================ */
.section-title{font-size:var(--font-xs);font-weight:700;color:var(--text-secondary);padding:var(--space-sm) 0;text-transform:uppercase;letter-spacing:1px}

.stat-row{display:flex;gap:var(--space-sm);margin-bottom:var(--space-md)}
.stat-box{flex:1;background:var(--bg-card);border-radius:var(--radius-md);padding:var(--space-md);text-align:center;box-shadow:var(--shadow-card);border:1px solid rgba(0,0,0,.03)}
.stat-value{font-size:var(--font-2xl);font-weight:800;color:var(--primary);letter-spacing:-.5px}
.stat-label{font-size:var(--font-xs);color:var(--text-secondary);margin-top:4px;font-weight:500}

.progress-bar{height:8px;background:var(--bg-page);border-radius:4px;overflow:hidden;margin-top:var(--space-sm)}
.progress-bar-fill{height:100%;background:linear-gradient(90deg,var(--primary),var(--primary-light));border-radius:4px;transition:width .6s var(--ease-smooth)}

/* ============================================================
   功能列表
   ============================================================ */
.func-list{background:var(--bg-card);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-card);border:1px solid rgba(0,0,0,.03)}
.func-item{display:flex;align-items:center;padding:15px var(--space-md);border-bottom:1px solid rgba(0,0,0,.04);cursor:pointer;transition:background var(--transition);text-decoration:none;color:var(--text-primary)}
.func-item:last-child{border-bottom:none}
.func-item:active{background:var(--bg-hover)}
.func-item-icon{width:34px;font-size:18px;text-align:center;flex-shrink:0}
.func-item-label{flex:1;font-size:var(--font-base);font-weight:500}
.func-item-arrow{color:var(--text-placeholder);font-size:16px}

/* ============================================================
   用户卡片
   ============================================================ */
.user-card{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-lg);background:var(--bg-card);border-radius:var(--radius-lg);margin-bottom:var(--space-md);box-shadow:var(--shadow-card);border:1px solid rgba(0,0,0,.03)}
.user-avatar{width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg,var(--primary-bg),#C7D2FE);display:flex;align-items:center;justify-content:center;font-size:22px;color:var(--primary);font-weight:700;flex-shrink:0;overflow:hidden;border:2px solid white;box-shadow:0 2px 8px rgba(99,102,241,.15)}
.user-avatar img{width:100%;height:100%;object-fit:cover}
.user-info-name{font-size:var(--font-lg);font-weight:700;letter-spacing:.2px}
.user-info-position{font-size:var(--font-sm);color:var(--text-secondary);margin-top:2px}
.user-info-role{display:inline-block;padding:2px 10px;background:linear-gradient(135deg,var(--primary-bg),#DDD6FE);color:var(--primary-dark);font-size:var(--font-xs);border-radius:var(--radius-full);margin-top:4px;font-weight:600}

/* ============================================================
   登录页（legacy，login.css + body.login-body 已接管新登录页）
   ============================================================ */
body:not(.login-body) .login-page{height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch;display:flex;flex-direction:column;justify-content:center;padding:var(--space-xl);background:linear-gradient(180deg,#EEF2FF 0%,#F8FAFC 40%,white 100%)}
body:not(.login-body) .login-logo{text-align:center;margin-bottom:var(--space-xl)}
body:not(.login-body) .login-logo h1{font-size:28px;color:var(--primary-dark);font-weight:800;letter-spacing:.5px}
body:not(.login-body) .login-logo p{font-size:var(--font-sm);color:var(--text-secondary);margin-top:6px}
body:not(.login-body) .login-form{background:white;padding:var(--space-lg);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);border:1px solid rgba(0,0,0,.04)}
body:not(.login-body) .login-form .form-group{margin-bottom:var(--space-lg)}
body:not(.login-body) .login-form .form-input{padding:14px 16px;font-size:var(--font-lg);border-radius:var(--radius-md)}
body:not(.login-body) .login-remember{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-lg);font-size:var(--font-sm);color:var(--text-secondary)}
body:not(.login-body) .login-remember input[type="checkbox"]{width:18px;height:18px;accent-color:var(--primary);border-radius:4px}
body:not(.login-body) .login-agreement{font-size:var(--font-sm);color:var(--text-secondary)}
body:not(.login-body) .login-agreement-hint{font-size:var(--font-xs);color:var(--text-placeholder);margin:6px 0 0 26px;line-height:1.4}

/* ============================================================
   紧急高亮
   ============================================================ */
.highlight-urgent{border-left:3px solid var(--danger);background:rgba(239,68,68,.03)}

/* ============================================================
   精致毛玻璃全局刷新 — 移动端基础体验
   ============================================================ */
body{
    background:
        radial-gradient(circle at 8% 0%,rgba(99,102,241,.16),transparent 32%),
        radial-gradient(circle at 92% 8%,rgba(34,211,238,.12),transparent 30%),
        linear-gradient(160deg,#F8FAFF 0%,var(--bg-page) 48%,#EDF3FA 100%);
}
.page-wrapper{
    position:relative;
}
.page-wrapper::before{
    content:'';
    position:fixed;
    inset:0;
    pointer-events:none;
    background:
        linear-gradient(rgba(255,255,255,.36) 1px,transparent 1px),
        linear-gradient(90deg,rgba(255,255,255,.32) 1px,transparent 1px);
    background-size:38px 38px;
    mask-image:linear-gradient(180deg,rgba(0,0,0,.5),transparent 70%);
}
.page-header{
    background:linear-gradient(180deg,rgba(255,255,255,.92),rgba(255,255,255,.72));
    border-bottom:1px solid rgba(148,163,184,.18);
    box-shadow:0 10px 28px rgba(30,41,59,.06);
}
.page-header-title{
    color:var(--text-primary);
    letter-spacing:.1px;
}
.page-content{
    position:relative;
    z-index:1;
}
.bottom-nav{
    background:linear-gradient(180deg,rgba(255,255,255,.88),rgba(255,255,255,.72));
    border-top:1px solid rgba(148,163,184,.18);
    box-shadow:0 -16px 44px rgba(30,41,59,.10);
}
.nav-item{
    color:var(--text-secondary);
}
.nav-item .nav-icon{
    width:34px;
    height:28px;
    display:flex;
    align-items:center;
    justify-content:center;
    margin-bottom:1px;
    border-radius:var(--radius-md);
    background:transparent;
    font-size:21px;
    filter:saturate(.88);
}
.nav-item.active .nav-icon{
    background:rgba(99,102,241,.1);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.72);
}
.nav-item .nav-label{
    font-weight:600;
}
.nav-item-center .nav-icon-plus{
    background:
        linear-gradient(135deg,rgba(255,255,255,.24),rgba(255,255,255,.05)),
        linear-gradient(135deg,var(--primary),var(--primary-light));
    border:1px solid rgba(255,255,255,.32);
    box-shadow:0 14px 34px rgba(99,102,241,.34),inset 0 1px 0 rgba(255,255,255,.24);
}
.nav-badge,
.notif-badge .badge-count{
    box-shadow:0 8px 18px rgba(239,68,68,.3);
}
.card,
.stat-box,
.func-list,
.user-card,
.login-form{
    background:var(--bg-card);
    border:1px solid rgba(255,255,255,.68);
    box-shadow:var(--shadow-card),inset 0 1px 0 rgba(255,255,255,.74);
    backdrop-filter:blur(22px) saturate(170%);
    -webkit-backdrop-filter:blur(22px) saturate(170%);
}
.card{
    position:relative;
    overflow:hidden;
}
.card::before{
    content:'';
    position:absolute;
    top:0;
    left:18px;
    right:18px;
    height:1px;
    background:linear-gradient(90deg,transparent,rgba(255,255,255,.9),transparent);
    pointer-events:none;
}
.card:hover{
    box-shadow:var(--shadow-md),inset 0 1px 0 rgba(255,255,255,.8);
}
.card-title,
.section-title,
.empty-state-text,
.func-item-label{
    color:var(--text-primary);
}
.card-subtitle,
.list-item-desc,
.stat-label,
.user-info-position{
    color:var(--text-secondary);
}
.oa-btn{
    border-radius:var(--radius-md);
    letter-spacing:.05px;
}
.oa-btn-primary,
.oa-dialog-actions .oa-btn-primary[data-action="confirm"],
.oa-dialog-actions .oa-btn[data-action="confirm"]{
    background:linear-gradient(135deg,var(--primary) 0%,var(--primary-light) 100%);
    border:1px solid rgba(255,255,255,.22);
    box-shadow:0 12px 28px rgba(99,102,241,.26);
}
.oa-btn-primary:hover,
.oa-dialog-actions .oa-btn-primary[data-action="confirm"]:hover,
.oa-dialog-actions .oa-btn[data-action="confirm"]:hover{
    background:linear-gradient(135deg,#4F46E5 0%,#8B5CF6 100%);
    box-shadow:var(--shadow-glow);
}
.oa-btn-secondary,
.oa-btn-text,
.oa-dialog-actions .oa-btn-secondary[data-action="no"],
.oa-dialog-actions .oa-btn[data-action="no"]{
    background:rgba(255,255,255,.62);
    border:1px solid var(--border);
    box-shadow:0 6px 18px rgba(30,41,59,.05);
}
.oa-btn-secondary:hover,
.oa-btn-text:hover{
    background:var(--bg-glass-strong);
    color:var(--primary);
    border-color:rgba(99,102,241,.22);
}
.form-input,
.form-select,
.form-textarea{
    background-color:var(--bg-input);
    border-color:var(--border);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.72);
}
.form-input:hover,
.form-select:hover,
.form-textarea:hover{
    background-color:rgba(255,255,255,.88);
    border-color:rgba(99,102,241,.24);
}
.form-input:focus,
.form-select:focus,
.form-textarea:focus{
    background-color:#fff;
    border-color:rgba(99,102,241,.64);
    box-shadow:0 0 0 4px var(--primary-glow),inset 0 1px 0 rgba(255,255,255,.84);
}
.list-item,
.func-item{
    background:rgba(255,255,255,.5);
    border-bottom-color:rgba(148,163,184,.16);
}
.list-item:active,
.func-item:active{
    background:rgba(99,102,241,.08);
}
.tabs{
    gap:6px;
    padding:4px;
    border-bottom:0;
    background:rgba(255,255,255,.52);
    border:1px solid rgba(255,255,255,.64);
    border-radius:var(--radius-lg);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.72);
}
.tab-item{
    border-radius:var(--radius-md);
}
.tab-item.active{
    background:#fff;
    box-shadow:0 8px 22px rgba(99,102,241,.12);
}
.tab-item.active::after{
    display:none;
}
.quick-menu-overlay{
    background:rgba(15,23,42,.38);
    backdrop-filter:blur(12px);
    -webkit-backdrop-filter:blur(12px);
}
.quick-menu{
    background:var(--bg-glass-strong);
    border:1px solid rgba(255,255,255,.7);
    box-shadow:var(--shadow-xl),inset 0 1px 0 rgba(255,255,255,.78);
    backdrop-filter:blur(24px) saturate(170%);
    -webkit-backdrop-filter:blur(24px) saturate(170%);
}
.quick-menu-section{
    color:#66738A;
}
.quick-menu-item{
    background:rgba(255,255,255,.38);
    border:1px solid transparent;
}
.quick-menu-item:active{
    background:rgba(99,102,241,.09);
}
.quick-menu-item .qm-icon{
    border:1px solid rgba(255,255,255,.56);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.72),0 8px 18px rgba(30,41,59,.07);
    filter:saturate(.92);
}
.attendance-card{
    background:
        radial-gradient(circle at 84% 8%,rgba(255,255,255,.22),transparent 30%),
        linear-gradient(135deg,var(--primary-dark) 0%,var(--primary) 46%,var(--primary-light) 100%);
    border:1px solid rgba(255,255,255,.24);
    box-shadow:var(--shadow-glow);
}
.attendance-btn{
    box-shadow:inset 0 1px 0 rgba(255,255,255,.24),0 12px 28px rgba(15,23,42,.14);
}
.oa-dialog,
.login-form{
    background:var(--bg-glass-strong);
    border:1px solid rgba(255,255,255,.72);
}
.oa-dialog-overlay{
    background:rgba(15,23,42,.38);
    backdrop-filter:blur(12px);
    -webkit-backdrop-filter:blur(12px);
}
.empty-state-icon{
    opacity:.42;
    filter:saturate(.84);
}
.stat-value,
.user-info-role{
    color:var(--primary);
}
.progress-bar{
    background:rgba(148,163,184,.18);
}
.progress-bar-fill{
    background:linear-gradient(90deg,var(--primary),var(--primary-light),var(--accent));
}
body:not(.login-body) .login-page{
    background:
        radial-gradient(circle at 50% 0%,rgba(99,102,241,.18),transparent 34%),
        linear-gradient(180deg,#F8FAFF 0%,var(--bg-page) 58%,#FFFFFF 100%);
}

/* ============================================================
   精致毛玻璃细节打磨 — 移动端
   ============================================================ */
.page-wrapper::before{
    -webkit-mask-image:linear-gradient(180deg,rgba(0,0,0,.5),transparent 70%);
}
.page-header,
.bottom-nav,
.card,
.stat-box,
.func-list,
.user-card,
.login-form,
.quick-menu,
.oa-dialog{
    transform:translateZ(0);
}
.nav-item:focus-visible,
.nav-item-center:focus-visible,
.quick-menu-item:focus-visible,
.oa-btn:focus-visible,
.tab-item:focus-visible,
.list-item:focus-visible,
.func-item:focus-visible,
a:focus-visible{
    outline:2px solid rgba(99,102,241,.72);
    outline-offset:3px;
}
.form-input:focus-visible,
.form-select:focus-visible,
.form-textarea:focus-visible{
    outline:none;
}
.nav-item,
.quick-menu-item,
.oa-btn,
.tab-item,
.list-item,
.func-item{
    -webkit-tap-highlight-color:transparent;
    will-change:transform;
}
.nav-item:active,
.quick-menu-item:active,
.oa-btn:active,
.tab-item:active,
.list-item:active,
.func-item:active{
    transform:scale(.985);
}
.nav-item-center:active .nav-icon-plus{
    transform:scale(.9);
}
.card:active,
.stat-box:active,
.user-card:active{
    box-shadow:var(--shadow-sm),inset 0 1px 0 rgba(255,255,255,.72);
}
.card-title,
.list-item-title,
.func-item-label{
    letter-spacing:-.05px;
}
.form-label,
.section-title,
.quick-menu-section{
    letter-spacing:.04em;
}
.form-input::selection,
.form-textarea::selection,
body ::selection{
    background:rgba(99,102,241,.2);
    color:var(--text-primary);
}
.oa-btn:disabled,
.oa-btn[disabled]{
    filter:saturate(.72);
}
.oa-toast{
    backdrop-filter:blur(18px) saturate(160%);
    -webkit-backdrop-filter:blur(18px) saturate(160%);
    border:1px solid rgba(255,255,255,.28);
}
.bottom-nav::before{
    content:'';
    position:absolute;
    top:-10px;
    left:50%;
    width:42px;
    height:4px;
    border-radius:var(--radius-full);
    background:rgba(148,163,184,.22);
    transform:translateX(-50%);
    pointer-events:none;
}
.quick-menu-item:hover{
    background:rgba(255,255,255,.62);
    border-color:rgba(99,102,241,.14);
}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
    .page-header,
    .bottom-nav,
    .card,
    .stat-box,
    .func-list,
    .user-card,
    .login-form,
    .quick-menu,
    .oa-dialog{
        background:var(--bg-card-solid);
    }
}
@media (prefers-reduced-motion:reduce){
    *,
    *::before,
    *::after{
        animation-duration:.001ms!important;
        animation-iteration-count:1!important;
        scroll-behavior:auto!important;
        transition-duration:.001ms!important;
    }
    .card:hover,
    .oa-btn-primary:hover,
    .nav-item.active .nav-icon{
        transform:none;
    }
}

/* ============================================================
   柔和页面切换
   ============================================================ */
html{
    background:#F4F7FB;
}
body{
    animation:oaPageIn .14s ease-out both;
}
@keyframes oaPageIn{
    from{filter:saturate(.96) brightness(.995)}
    to{filter:saturate(1) brightness(1)}
}
body.oa-page-leaving::after{
    content:'';
    position:fixed;
    inset:0;
    z-index:100000;
    pointer-events:none;
    background:
        radial-gradient(circle at 50% 0%,rgba(99,102,241,.16),transparent 36%),
        rgba(248,250,255,.94);
    backdrop-filter:blur(6px) saturate(125%);
    -webkit-backdrop-filter:blur(6px) saturate(125%);
    animation:oaPageLeave .12s ease-out both;
}
@keyframes oaPageLeave{
    from{opacity:0}
    to{opacity:1}
}
@media (prefers-reduced-motion:reduce){
    body{animation:none}
    body.oa-page-leaving::after{
        animation-duration:.001ms;
        backdrop-filter:none;
        -webkit-backdrop-filter:none;
    }
}

/* ============================================================
   桌面端适配
   ============================================================ */
@media(min-width:768px){
    .page-content{max-width:520px;margin:0 auto}
    .bottom-nav{max-width:520px;left:50%;transform:translateX(-50%);border-radius:var(--radius-xl) var(--radius-xl) 0 0}
}
