:root{--bg:#f2f5fa;--surface:#fff;--border:#dfe5ef;--border-strong:#c7d2e0;--text:#1e293b;--muted:#64748b;--primary:#1a56db;--primary-dark:#1744b0;--primary-soft:#e8effc;--ok:#16a34a;--ok-soft:#e6f6ec;--warn:#c2740a;--warn-soft:#fdf3e0;--danger:#dc2626;--danger-soft:#fdecec;--info:#0e7490;--info-soft:#e1f3f8;--purple:#7c3aed;--purple-soft:#f0e9fd;--radius:10px;--radius-sm:6px;--shadow:0 1px 2px rgba(15,23,42,.06);--shadow-md:0 6px 18px rgba(15,23,42,.08);--topbar-h:56px}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{font-family:system-ui,-apple-system,Segoe UI,Microsoft YaHei,PingFang SC,sans-serif;margin:0;background:var(--bg);color:var(--text);font-size:15px;line-height:1.6}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}h1{font-size:22px;margin:0 0 14px}h2{font-size:19px}h3{font-size:16px;margin:0 0 10px}p{margin:6px 0}.topbar{background:linear-gradient(90deg,#0e2a6e,#1a56db);color:#fff;position:-webkit-sticky;position:sticky;top:0;z-index:20;box-shadow:var(--shadow-md)}.topbar-inner{max-width:1080px;margin:0 auto;padding:0 16px;min-height:var(--topbar-h);gap:14px;flex-wrap:wrap}.brand,.topbar-inner{display:flex;align-items:center}.brand{gap:8px;font-weight:700;font-size:16px;color:#fff}.brand:hover{text-decoration:none}.brand .logo{width:26px;height:26px;border-radius:7px;background:hsla(0,0%,100%,.18);display:inline-flex;align-items:center;justify-content:center;font-size:15px}.topbar nav{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.topbar nav a{color:hsla(0,0%,100%,.88);padding:6px 10px;border-radius:7px;font-size:14px}.topbar nav a:hover{background:hsla(0,0%,100%,.14);text-decoration:none;color:#fff}.topbar nav a.active{background:hsla(0,0%,100%,.18);color:#fff;font-weight:600}.topbar .spacer{flex:1 1}.topbar .who{font-size:13px;color:hsla(0,0%,100%,.92);display:flex;align-items:center;gap:8px}.container,.page{max-width:1080px;margin:0 auto;padding:22px 16px 56px}.page-title{display:flex;align-items:center;gap:10px;margin-bottom:16px}.page-title .crumb{font-size:13px;color:var(--muted);font-weight:400}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:18px;margin-bottom:16px;box-shadow:var(--shadow)}.card h3.card-title{display:flex;align-items:center;gap:8px;margin:0 0 12px}.card h3.card-title:before{content:"";width:4px;height:16px;background:var(--primary);border-radius:2px;display:inline-block}.card h3.card-title.green:before{background:var(--ok)}.card h3.card-title.red:before{background:var(--danger)}.card h3.card-title.orange:before{background:var(--warn)}.card h3.card-title.purple:before{background:var(--purple)}.card h3.card-title.cyan:before{background:var(--info)}.card+.card{margin-top:0}.card .hint{margin:2px 0 10px}.card .hint,label.field{font-size:13px;color:var(--muted)}label.field{display:block;font-weight:600;margin:10px 0 4px}input:not([type]),input[type=file],input[type=password],input[type=text],select,textarea{font:inherit;color:var(--text);padding:9px 11px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:#fff;max-width:100%}input:focus,select:focus,textarea:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px rgba(26,86,219,.15)}textarea{line-height:1.7}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));grid-gap:12px;gap:12px}.form-actions{display:flex;gap:10px;align-items:center;margin-top:14px;flex-wrap:wrap}.field-note{font-size:12px;color:var(--muted);margin:4px 0 0}.btn{font:inherit;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:9px 16px;border:1px solid transparent;border-radius:var(--radius-sm);background:var(--primary);color:#fff;cursor:pointer;transition:filter .15s,background .15s;font-size:14px;white-space:nowrap}.btn:hover{filter:brightness(1.08);text-decoration:none}.btn:disabled{opacity:.55;cursor:not-allowed}.btn-outline{background:#fff;color:var(--primary);border-color:var(--primary)}.btn-outline:hover{background:var(--primary-soft)}.btn-ghost{background:#fff;color:var(--text);border-color:var(--border-strong)}.btn-ghost:hover{background:#f1f5f9}.btn-success{background:var(--ok)}.btn-danger{background:var(--danger)}.btn-purple{background:var(--purple)}.btn-cyan{background:var(--info)}.btn-warn{background:var(--warn)}.btn-sm{padding:5px 10px;font-size:13px;border-radius:5px}.btn-lg{padding:11px 22px;font-size:16px}.btn-block{width:100%}.badge,.tag{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;font-size:12px;line-height:1.7;font-weight:600;white-space:nowrap}.tag{background:var(--primary-soft);color:var(--primary-dark)}.tag-gray{background:#eef1f6;color:#526071}.tag-green{background:var(--ok-soft);color:var(--ok)}.tag-orange{background:var(--warn-soft);color:var(--warn)}.tag-red{background:var(--danger-soft);color:var(--danger)}.tag-cyan{background:var(--info-soft);color:var(--info)}.tag-purple{background:var(--purple-soft);color:var(--purple)}.dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:1px}.table-scroll{overflow-x:auto;margin:0 -4px;padding:0 4px}table.data{width:100%;border-collapse:collapse;font-size:14px}table.data td,table.data th{border-bottom:1px solid var(--border);padding:9px 10px;text-align:left;vertical-align:middle}table.data th{color:var(--muted);font-weight:600;font-size:13px;white-space:nowrap;border-bottom:1px solid var(--border-strong)}table.data th,table.data tr:hover td{background:#f8fafc}table.data .num{font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.cell-ellipsis{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.clamp3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;max-width:320px}.cell-pre{white-space:pre-wrap;word-break:break-word}td .muted{color:var(--muted);font-size:13px}.msg{font-size:14px;border-radius:var(--radius-sm);padding:8px 12px;margin-top:10px}.msg-ok{background:var(--ok-soft);color:#15803d}.msg-err{background:var(--danger-soft);color:#b91c1c}.msg-info{background:var(--info-soft);color:#155e75}.inline-msg{font-size:14px}.inline-msg.ok{color:var(--ok)}.inline-msg.err{color:var(--danger)}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));grid-gap:12px;gap:12px;margin-bottom:16px}.stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;box-shadow:var(--shadow)}.stat-card .num{font-size:26px;font-weight:700;line-height:1.3}.stat-card .lbl{font-size:13px;color:var(--muted)}.stat-card.ok .num{color:var(--ok)}.stat-card.primary .num{color:var(--primary)}.stat-card.orange .num{color:var(--warn)}.stat-card.red .num{color:var(--danger)}.stat-card.cyan .num{color:var(--info)}.empty{text-align:center;color:var(--muted);padding:34px 10px;font-size:14px}.empty .big{font-size:30px;margin-bottom:6px}.quick-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-gap:12px;gap:12px}.quick-card{display:flex;flex-direction:column;gap:4px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow);transition:transform .12s,box-shadow .12s;color:var(--text)}.quick-card:hover{text-decoration:none;transform:translateY(-2px);box-shadow:var(--shadow-md)}.quick-card .t{font-weight:700;font-size:15px;display:flex;align-items:center;gap:8px}.quick-card .d{font-size:13px;color:var(--muted)}.auth-wrap{min-height:calc(100vh - var(--topbar-h) - 80px);display:flex;align-items:flex-start;justify-content:center;padding-top:7vh}.auth-card{width:100%;max-width:380px}.auth-head{text-align:center;margin-bottom:18px}.auth-head .logo-big{width:52px;height:52px;border-radius:14px;background:linear-gradient(135deg,#0e2a6e,#1a56db);color:#fff;font-size:26px;display:inline-flex;align-items:center;justify-content:center;box-shadow:var(--shadow-md)}.auth-head h1{font-size:18px;margin:10px 0 2px}.auth-head p{color:var(--muted);font-size:13px;margin:0}@media (max-width:640px){body{font-size:14px}.page{padding:14px 10px 48px}.card{padding:14px}h1{font-size:19px}.topbar-inner{gap:8px;padding:0 10px}.brand{font-size:14px}.topbar nav a{padding:5px 8px}.topbar nav a,table.data{font-size:13px}.btn{padding:8px 13px}.form-grid{grid-template-columns:1fr}.cell-ellipsis{max-width:140px}}