:root{color-scheme:light;--bg: #f5f7fb;--bg-soft: #f9fafc;--panel: #ffffff;--line: #e6ebf2;--line-strong: #d6deea;--text: #0f172a;--muted: #64748b;--primary: #2563eb;--primary-hover: #1d4ed8;--success: #0f766e;--success-bg: #ecfdf5;--warning: #b45309;--warning-bg: #fffbeb;--danger: #b42318;--danger-bg: #fef3f2;--sidebar: #0b1324}*{box-sizing:border-box}html,body,#root{margin:0;min-height:100%}body{font-family:Inter,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;background:var(--bg);color:var(--text)}.layout{height:100vh;min-height:100vh;display:grid;grid-template-columns:280px 1fr;overflow:hidden}.sidebar{background:linear-gradient(180deg,#0b1324,#101b30);color:#d8e2ff;padding:18px 14px;border-right:1px solid #1e2b44;position:sticky;top:0;height:100vh;overflow-y:auto}.brand{display:flex;align-items:center;gap:12px;padding:10px 10px 14px}.brand-mark{width:38px;height:38px;border-radius:12px;background:linear-gradient(135deg,#3b82f6,#1d4ed8);display:grid;place-items:center;color:#fff;font-weight:700;letter-spacing:.4px;box-shadow:0 10px 20px #1d4ed847}.brand h1{margin:0;font-size:16px;font-weight:650;color:#f8fbff}.brand span{margin-top:4px;display:inline-block;color:#8ea0c4;font-size:12px}.nav{margin-top:10px;display:flex;flex-direction:column;gap:14px}.nav-group{display:flex;flex-direction:column;gap:6px}.nav-group-title{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:#7f91b7;padding:0 10px}.nav-link{color:#cfdbf7;text-decoration:none;font-size:13px;font-weight:500;padding:10px 12px;border-radius:10px;transition:background .18s ease,color .18s ease}.nav-link:hover{background:#7199e824;color:#fff}.nav-link.active{background:#3170ed38;color:#fff;border:1px solid rgba(109,156,241,.35)}.main{display:flex;flex-direction:column;min-width:0;height:100vh;overflow:hidden}.topbar{background:var(--panel);border-bottom:1px solid var(--line);padding:14px 20px;display:flex;justify-content:space-between;align-items:center;gap:16px;position:sticky;top:0;z-index:10;flex-shrink:0}.topbar-title strong{display:block;font-size:16px;font-weight:650}.topbar-title p{margin:5px 0 0;color:var(--muted);font-size:13px}.topbar-actions{display:flex;align-items:center;gap:10px}.env-chip{padding:6px 10px;border-radius:999px;border:1px solid #d8e4ff;background:#edf4ff;color:#1e40af;font-size:12px;font-weight:600}.content{padding:20px;flex:1;overflow-y:auto}.content-inner{max-width:1360px;margin:0 auto}.page{display:flex;flex-direction:column;gap:16px}.page-header h2{margin:0;font-size:25px;font-weight:700}.page-header p{margin:8px 0 0;color:var(--muted);line-height:1.6}.panel{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px;box-shadow:0 1px 2px #10182808}.panel.subtle{background:var(--bg-soft)}.panel-title-row{display:flex;align-items:center;justify-content:space-between;gap:10px}.panel-title-row h3{margin:0}.chip{border:1px solid #dbe3f0;background:#f4f7fc;color:#334155;border-radius:999px;font-size:12px;font-weight:600;padding:5px 9px}.chip.muted{background:#f8fafc;color:#64748b}.stats-grid{display:grid;gap:12px;grid-template-columns:repeat(4,minmax(180px,1fr))}.stat-card{border:1px solid var(--line);border-radius:12px;background:#fff;padding:14px}.stat-card.tone-warning{border-color:#f3ddbd;background:#fffcf6}.stat-card.tone-success{border-color:#caeee8;background:#f6fffc}.stat-title{color:var(--muted);font-size:13px}.stat-value{font-size:28px;margin-top:8px;font-weight:700}.stat-hint,.stat-meta{color:var(--muted);font-size:12px;margin-top:6px}.dashboard-grid{display:grid;grid-template-columns:repeat(2,minmax(280px,1fr));gap:12px}.todo-list{margin-top:12px;display:flex;flex-direction:column;gap:9px}.todo-item{border:1px solid var(--line);border-radius:10px;padding:10px 12px;display:flex;justify-content:space-between;align-items:center;background:#fff}.todo-item.high{border-color:#f8d2ce;background:#fff9f9}.todo-item.medium{border-color:#f4e1c0;background:#fffdfa}.todo-item.ok{border-color:#d1ece5;background:#f9fefc}.todo-title{font-size:14px;font-weight:600}.todo-value{margin-top:4px;color:var(--muted)}.todo-level{font-size:11px;color:#64748b;font-weight:700}.status-list{list-style:none;padding:0;margin:12px 0 0;display:flex;flex-direction:column;gap:10px}.status-list li{display:flex;justify-content:space-between;align-items:center;border:1px solid var(--line);border-radius:10px;padding:10px 12px}.status-on{color:var(--success);font-weight:600}.status-off{color:var(--danger);font-weight:600}.status-pending{color:var(--warning);font-weight:600}.module-grid{margin-top:12px;display:grid;grid-template-columns:repeat(3,minmax(160px,1fr));gap:10px}.module-item{border:1px solid var(--line);border-radius:10px;padding:11px;background:#fafcff;display:flex;flex-direction:column;gap:4px}.module-item.done{border-color:#bee8dc;background:#f3fffa}.module-item strong{font-size:13px}.module-item small{color:var(--muted)}.empty-block{margin-top:12px;border:1px dashed #c9d6e7;border-radius:10px;background:#f8fbff;color:#475569;padding:15px;line-height:1.6}.muted-text{color:var(--muted);margin:12px 0 0}.toolbar{display:flex;flex-direction:column;gap:12px}.toolbar-grid{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:10px}.toolbar-actions{display:flex;justify-content:flex-end;gap:8px}.input,.textarea{width:100%;border:1px solid var(--line-strong);border-radius:10px;padding:10px 12px;font-size:14px;color:var(--text);background:#fff}.input:focus,.textarea:focus{outline:none;border-color:#7da9ff;box-shadow:0 0 0 3px #2563eb1f}.textarea{min-height:90px;resize:vertical}.table-panel{padding-top:8px}.table-wrap{overflow:auto}.table{width:100%;border-collapse:separate;border-spacing:0;min-width:980px;font-size:14px}.table th,.table td{border-bottom:1px solid var(--line);padding:12px 10px;text-align:left;vertical-align:top}.table th{font-size:12px;color:var(--muted);font-weight:600;background:#f8fafd;position:sticky;top:0}.table-empty{text-align:center!important;color:var(--muted);padding:30px 0!important}.title-cell{display:flex;flex-direction:column;gap:4px}.title-cell strong{line-height:1.4}.title-cell small,.owner-cell span,.owner-cell{color:var(--muted)}.actions{display:flex;flex-wrap:wrap;gap:6px}.btn{border:1px solid transparent;border-radius:9px;padding:8px 12px;font-size:13px;font-weight:600;cursor:pointer;background:#fff;transition:all .15s ease}.btn:disabled{opacity:.56;cursor:not-allowed}.btn.wide{width:100%}.btn.primary{background:var(--primary);color:#fff}.btn.primary:hover:not(:disabled){background:var(--primary-hover)}.btn.secondary{border-color:var(--line-strong);color:#334155}.btn.secondary:hover:not(:disabled){background:#f8fafc}.btn.success{background:#0f766e;color:#fff}.btn.success:hover:not(:disabled){background:#0d655d}.btn.danger{background:var(--danger);color:#fff}.btn.ghost-danger{border-color:#f3c9c5;color:#a3241c;background:#fff7f7}.btn.ghost-danger:hover:not(:disabled){background:#ffeceb}.btn.tiny{padding:5px 9px;font-size:12px}.badge{display:inline-flex;align-items:center;height:24px;border-radius:999px;padding:0 10px;font-size:12px;border:1px solid transparent;font-weight:600}.badge.success{color:var(--success);background:#e8fbf6;border-color:#c7eee3}.badge.warning{color:var(--warning);background:#fff7e7;border-color:#f9e1b9}.badge.danger{color:var(--danger);background:#fff0f0;border-color:#f3c8c8}.badge.info{color:#1d4ed8;background:#ecf2ff;border-color:#d4e3ff}.badge.secondary{color:#334155;background:#edf2f8;border-color:#d9e2ef}.badge.muted{color:#64748b;background:#f1f5f9;border-color:#dce5ef}.pager{margin-top:14px;display:flex;justify-content:space-between;align-items:center;color:var(--muted);font-size:13px}.pager-actions{display:flex;gap:8px}.alert{border-radius:10px;padding:10px 12px;font-size:13px}.alert.info{background:#eef4ff;color:#1d4ed8;border:1px solid #d6e4ff}.alert.error{background:#fff1f2;color:#be123c;border:1px solid #fecdd3}.list{margin:10px 0 0;padding-left:18px;color:#334155;line-height:1.7}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#070e1c75;display:flex;justify-content:center;align-items:center;z-index:30;padding:20px}.modal{background:#fff;border-radius:14px;border:1px solid var(--line);width:min(520px,100%);padding:18px;box-shadow:0 18px 40px #080f1c26}.modal.wide{width:min(760px,100%)}.modal h3{margin:0}.modal p{color:#475467}.modal-actions{margin-top:14px;display:flex;justify-content:flex-end;gap:10px}.detail-grid{margin-top:10px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 14px;font-size:14px}.inline-note{margin-top:10px;border-radius:10px;padding:8px 10px;font-size:13px}.inline-note.success{background:var(--success-bg);color:var(--success);border:1px solid #c7eee3}.inline-note.danger{background:var(--danger-bg);color:var(--danger);border:1px solid #f5ceca}.drawer-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#070e1c4d;z-index:40;display:flex;justify-content:flex-end}.drawer{width:min(720px,100%);height:100vh;background:#fff;border-left:1px solid var(--line);box-shadow:-10px 0 30px #0206171a;display:flex;flex-direction:column}.drawer-header{padding:14px 16px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.drawer-header h3{margin:0;font-size:20px}.drawer-header p{margin:6px 0 0;color:var(--muted);font-size:13px}.drawer-body{padding:14px 16px 22px;overflow:auto;display:flex;flex-direction:column;gap:12px}.drawer-section{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fff}.drawer-section h4{margin:0}.drawer-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 14px;align-items:center;font-size:14px}.description-block{margin:10px 0 0;color:#344054;line-height:1.7;white-space:pre-wrap}.image-block{margin-top:10px;display:flex;flex-direction:column;gap:10px}.image-group{display:flex;flex-direction:column;gap:8px}.image-list{display:grid;grid-template-columns:repeat(3,minmax(120px,1fr));gap:8px}.preview-image{width:100%;height:92px;object-fit:cover;border:1px solid var(--line);border-radius:8px;background:#f8fafc}.preview-image.cover{height:160px;max-width:320px}.image-empty{border:1px dashed #c6d4e8;border-radius:8px;background:#f8fbff;color:#64748b;padding:12px;font-size:13px}.log-list{margin-top:10px;display:flex;flex-direction:column;gap:8px}.log-item{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:#fbfcff}.log-main{font-size:14px;font-weight:600}.log-meta{margin-top:5px;color:#64748b;font-size:12px;display:flex;gap:12px;flex-wrap:wrap}.log-sub{margin-top:5px;color:#475467;font-size:12px;display:flex;gap:12px;flex-wrap:wrap}.drawer-footer{border-top:1px solid var(--line);padding:12px 16px;display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;background:#fff}.login-shell{min-height:100vh;background:radial-gradient(circle at 10% -10%,rgba(37,99,235,.16),transparent 46%),radial-gradient(circle at 90% 120%,rgba(15,118,110,.1),transparent 38%),linear-gradient(180deg,#f8fbff,#f4f7fb);display:grid;place-items:center;padding:20px;position:relative}.login-bg-grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(148,163,184,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(148,163,184,.07) 1px,transparent 1px);background-size:38px 38px;-webkit-mask-image:radial-gradient(circle at center,black,transparent 80%);mask-image:radial-gradient(circle at center,black,transparent 80%)}.login-card{width:min(520px,100%);background:#fffffff5;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);border:1px solid var(--line);border-radius:18px;padding:24px;box-shadow:0 20px 45px #0f172a1a;position:relative;z-index:2}.login-eyebrow{display:inline-flex;border:1px solid #d7e4ff;background:#eef4ff;color:#1e40af;font-size:12px;font-weight:600;border-radius:999px;padding:4px 10px}.login-card h1{margin:12px 0 0;font-size:28px}.login-subtitle{color:var(--muted);margin:8px 0 14px;line-height:1.6}.login-notice{border:1px solid #dce5f3;background:#f8fbff;border-radius:10px;padding:10px 12px;font-size:13px;color:#334155;display:flex;flex-direction:column;gap:6px;margin-bottom:14px}.login-security-card{border:1px solid #dbe5f4;background:#f8fbff;border-radius:10px;padding:10px 12px;font-size:12px;color:#334155;display:flex;flex-direction:column;gap:6px;margin-bottom:14px;line-height:1.55}.login-security-card code{font-family:JetBrains Mono,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.field-label{display:block;margin-bottom:8px;font-size:13px;color:#334155;font-weight:600}.field-help{margin:8px 0 14px;font-size:12px;color:var(--muted)}.login-btn{margin-top:4px;padding-top:10px;padding-bottom:10px}@media (max-width: 1280px){.stats-grid{grid-template-columns:repeat(2,minmax(180px,1fr))}.module-grid{grid-template-columns:repeat(2,minmax(160px,1fr))}}@media (max-width: 1024px){.layout{grid-template-columns:1fr;height:auto;overflow:visible}.sidebar{border-right:0;border-bottom:1px solid #223252;position:relative;top:auto;height:auto;overflow:visible}.toolbar-grid{grid-template-columns:1fr 1fr}.main{height:auto;overflow:visible}.content{overflow:visible}}@media (max-width: 760px){.content{padding:14px}.dashboard-grid,.stats-grid,.toolbar-grid{grid-template-columns:1fr}.pager{flex-direction:column;align-items:flex-start;gap:8px}.detail-grid,.drawer-grid{grid-template-columns:1fr}.image-list{grid-template-columns:repeat(2,minmax(120px,1fr))}.topbar{flex-direction:column;align-items:flex-start}}.toolbar-grid.users-toolbar{grid-template-columns:2fr 1fr}.empty-block.compact{margin-top:8px;padding:10px 12px}.metrics-grid{display:grid;grid-template-columns:repeat(5,minmax(100px,1fr));gap:10px}.metrics-grid.compact{grid-template-columns:repeat(4,minmax(120px,1fr))}.metric-cell{border:1px solid var(--line);background:#fff;border-radius:10px;padding:10px 12px;display:flex;flex-direction:column;gap:6px}.metric-cell span{color:var(--muted);font-size:12px}.metric-cell strong{font-size:16px}.mini-list{margin-top:10px;display:flex;flex-direction:column;gap:8px}.mini-list-item{border:1px solid var(--line);border-radius:10px;padding:10px;background:#fbfcff}.mini-list-main{font-size:13px;font-weight:600;color:#0f172a}.mini-list-sub{margin-top:4px;display:flex;flex-wrap:wrap;gap:10px;color:#64748b;font-size:12px}.campus-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}.campus-tab{border:1px solid var(--line-strong);background:#fff;color:#334155;border-radius:999px;font-size:13px;font-weight:600;padding:7px 12px;cursor:pointer;transition:all .15s ease}.campus-tab:hover{background:#f8fafc}.campus-tab.active{background:#eff6ff;color:#1e40af;border-color:#bfdbfe}.campus-toolbar-grid{grid-template-columns:2fr 1fr 1fr}.image-list-campus{grid-template-columns:repeat(3,minmax(140px,1fr))}.status-grid{margin-top:12px;display:grid;grid-template-columns:repeat(3,minmax(220px,1fr));gap:10px}.status-cell{border:1px solid var(--line);border-radius:10px;background:#fff;padding:12px;display:flex;flex-direction:column;gap:6px}.status-cell span{color:var(--muted);font-size:12px}.status-cell strong{font-size:18px}.status-cell small{color:#475467;font-size:12px;line-height:1.5}.status-cell.primary{border-color:#dbe7ff;background:#f8fbff}.status-cell.warning{border-color:#f6dfba;background:#fffdfa}.status-cell.success{border-color:#caeee8;background:#f6fffc}.status-cell.neutral{border-color:#d7deea;background:#f8fafd}.status-cell.danger{border-color:#f6d1ce;background:#fff9f9}@media (max-width: 1280px){.metrics-grid{grid-template-columns:repeat(3,minmax(120px,1fr))}.status-grid{grid-template-columns:repeat(2,minmax(220px,1fr))}}@media (max-width: 1024px){.toolbar-grid.users-toolbar,.campus-toolbar-grid{grid-template-columns:1fr}}@media (max-width: 760px){.metrics-grid,.metrics-grid.compact{grid-template-columns:1fr 1fr}.status-grid{grid-template-columns:1fr}}.toolbar-grid.reports-toolbar{grid-template-columns:2fr 1fr 1fr}.drawer-note-row{width:100%}.drawer-note-row .textarea{min-height:84px}@media (max-width: 1024px){.toolbar-grid.reports-toolbar{grid-template-columns:1fr}}.heartbeat-toolbar-grid{grid-template-columns:2fr repeat(4,minmax(140px,1fr)) 1fr}.help-governance-toolbar{grid-template-columns:2fr repeat(4,minmax(130px,1fr)) auto}.help-governance-table{min-width:1480px}.heartbeat-table{min-width:1280px}.heartbeat-field{margin-top:12px}.heartbeat-drawer{width:min(820px,100%)}.heartbeat-status-grid{margin-top:10px;display:grid;grid-template-columns:repeat(4,minmax(130px,1fr));gap:8px}.heartbeat-status-grid>div{border:1px solid var(--line);border-radius:10px;background:#fbfcff;padding:10px;display:flex;flex-direction:column;gap:7px}.heartbeat-status-grid span{color:var(--muted);font-size:12px}.heartbeat-tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.heartbeat-photo-button{border:0;background:transparent;padding:0;cursor:zoom-in}.heartbeat-preview-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#070e1cb8;z-index:60;display:grid;place-items:center;padding:24px}.heartbeat-preview-mask img{max-width:min(920px,94vw);max-height:88vh;object-fit:contain;border-radius:12px;background:#fff;box-shadow:0 24px 60px #0000003d}@media (max-width: 1024px){.heartbeat-toolbar-grid,.help-governance-toolbar,.heartbeat-status-grid{grid-template-columns:1fr}}
