:root{--gray-0: #ffffff;--gray-50: #f8fafc;--gray-100: #f1f5f9;--gray-200: #e5eaf1;--gray-300: #d4dce6;--gray-400: #9aa7ba;--gray-500: #6b7a92;--gray-600: #4b5a72;--gray-700: #37455c;--gray-800: #232f44;--gray-900: #131c2c;--gray-950: #0b1220;--blue-50: #eef4ff;--blue-100: #e0eaff;--blue-200: #c7d7fe;--blue-300: #a5bcfc;--blue-400: #8b9ef8;--blue-500: #6d82f2;--blue-600: #2563eb;--blue-700: #1d4ed8;--blue-800: #1e40af;--blue-900: #1e3a8a;--green-500: #16a34a;--green-600: #15803d;--amber-500: #d97706;--amber-600: #b45309;--red-500: #dc2626;--red-600: #b91c1c;--yellow-500: #eab308;--teal-400: #2dd4bf;--teal-500: #14b8a6;--teal-600: #0d9488}:root{--bg: #f5f7fb;--bg-grad: radial-gradient(1200px 620px at 82% -12%, #e7efff 0%, transparent 60%), #f5f7fb;--panel: #ffffff;--panel-2: #f8fafc;--border: #e6eaf2;--border-2: #d7dfea;--text: #1c2434;--text-2: #55617a;--muted: #8a97ad;--primary: var(--blue-600);--primary-d: var(--blue-700);--primary-soft: #eaf1fe;--on-primary: #ffffff;--teal: var(--teal-500);--teal-d: var(--teal-600);--teal-soft: #e6faf7;--success: var(--green-500);--warning: var(--amber-500);--danger: var(--red-500);--info: var(--blue-600);--red: var(--danger);--orange: var(--warning);--yellow: var(--yellow-500);--green: var(--success);--side-bg: #0e1830;--side-bg-2: #16233f;--side-border: #1f2c4b;--side-text: #aebcd6;--side-text-2: #6f81a3;--side-active: #16233f;--shadow-xs: 0 1px 2px rgba(16, 24, 40, .05);--shadow-sm: 0 1px 3px rgba(16, 24, 40, .08), 0 1px 2px rgba(16, 24, 40, .04);--shadow: 0 4px 12px rgba(16, 24, 40, .08), 0 2px 4px rgba(16, 24, 40, .04);--shadow-md: 0 10px 24px rgba(16, 24, 40, .12);--shadow-lg: 0 20px 48px rgba(16, 24, 40, .18);--ring: 0 0 0 3px rgba(37, 99, 235, .28)}[data-theme=dark]{--bg: #0c1322;--bg-grad: radial-gradient(1200px 620px at 82% -12%, #16233f 0%, transparent 60%), #0c1322;--panel: #141d31;--panel-2: #1b2540;--border: #28344f;--border-2: #33415f;--text: #e8eef8;--text-2: #a9b7cf;--muted: #7586a3;--primary: #4f8bff;--primary-d: #3b76f0;--primary-soft: rgba(79, 139, 255, .16);--on-primary: #0b1220;--teal: var(--teal-400);--teal-d: var(--teal-500);--teal-soft: rgba(45, 212, 191, .14);--success: #22c55e;--warning: #f59e0b;--danger: #f87171;--info: #4f8bff;--side-bg: #0a111f;--side-bg-2: #12203a;--side-border: #1b2740;--side-text: #9fb0cc;--side-text-2: #5f7191;--side-active: #12203a;--shadow-xs: 0 1px 2px rgba(0, 0, 0, .4);--shadow-sm: 0 1px 3px rgba(0, 0, 0, .5);--shadow: 0 4px 12px rgba(0, 0, 0, .5);--shadow-md: 0 10px 24px rgba(0, 0, 0, .55);--shadow-lg: 0 20px 48px rgba(0, 0, 0, .6);--ring: 0 0 0 3px rgba(79, 139, 255, .35)}:root{--fg: var(--text);--card: var(--panel);--bg-alt: var(--panel-2);--hover: rgba(28, 36, 52, .06)}[data-theme=dark]{--hover: rgba(232, 238, 248, .08)}:root{--fs-xs: 12px;--fs-sm: 13px;--fs-base: 14px;--fs-md: 15px;--fs-lg: 17px;--fs-xl: 20px;--fs-2xl: 24px;--fs-3xl: 30px;--lh: 1.55;--fw-n: 400;--fw-m: 500;--fw-sb: 600;--fw-b: 700;--sp-1: 4px;--sp-2: 8px;--sp-3: 12px;--sp-4: 16px;--sp-5: 20px;--sp-6: 24px;--sp-8: 32px;--sp-10: 40px;--r-xs: 5px;--r-sm: 7px;--r: 10px;--r-md: 12px;--r-lg: 16px;--r-full: 999px;--radius: var(--r);--ease: cubic-bezier(.16, 1, .3, 1);--ease-io: cubic-bezier(.4, 0, .2, 1);--dur-1: .12s;--dur-2: .2s;--dur-3: .34s;--z-nav: 40;--z-mask: 55;--z-drawer: 60;--z-modal: 80;--z-toast: 110}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:PingFang SC,Microsoft YaHei,Segoe UI,system-ui,-apple-system,sans-serif;background:var(--bg-grad);background-attachment:fixed;color:var(--text);font-size:var(--fs-base);line-height:var(--lh);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}button{font-family:inherit;cursor:pointer}a{color:var(--primary);text-decoration:none}::selection{background:var(--primary-soft);color:var(--text)}:focus{outline:none}:focus-visible{outline:none;box-shadow:var(--ring);border-radius:var(--r-sm)}*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-thumb{background:var(--border-2);border-radius:99px;border:2px solid transparent;background-clip:padding-box}*::-webkit-scrollbar-thumb:hover{background:var(--muted);background-clip:padding-box}*::-webkit-scrollbar-track{background:transparent}svg.lucide{flex-shrink:0;display:inline-block;vertical-align:middle}@keyframes fadeUp{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes pop{0%{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:none}}@keyframes slideInRight{0%{opacity:0;transform:translate(16px)}to{opacity:1;transform:none}}@keyframes shimmer{0%{background-position:-200px 0}to{background-position:200px 0}}.anim-fade-up{animation:fadeUp var(--dur-3) var(--ease) both}.app{display:flex;height:100vh;overflow:hidden}.sidebar{width:224px;background:var(--side-bg);color:var(--side-text);flex-shrink:0;display:flex;flex-direction:column;padding:12px 0}.sidebar .brand{padding:6px 18px 14px;border-bottom:1px solid var(--side-border);display:flex;align-items:center;justify-content:space-between;gap:8px}.sidebar .brand b{color:#fff;font-size:15px;letter-spacing:.5px}.sidebar .brand span{display:block;color:var(--side-text-2);font-size:11px;margin-top:2px}.nav-group-label{padding:14px 18px 4px;font-size:11px;font-weight:var(--fw-sb);color:var(--side-text-2);letter-spacing:2px;-webkit-user-select:none;user-select:none}.filter-summary-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:10px;flex-wrap:wrap}.filter-more>summary{display:inline-flex;align-items:center;gap:6px;margin-top:10px;padding:6px 12px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:var(--fs-sm);color:var(--text-2);border:1px dashed var(--border);border-radius:var(--r-full);list-style:none;transition:border-color var(--dur-2) var(--ease),background var(--dur-2) var(--ease)}.filter-more>summary::-webkit-details-marker{display:none}.filter-more>summary:before{content:"▸";font-size:11px;transition:transform var(--dur-2) var(--ease)}.filter-more[open]>summary:before{transform:rotate(90deg)}.filter-more>summary:hover{background:var(--panel-2)}.filter-more>summary.active{border-color:var(--teal);color:var(--teal-d);background:var(--teal-soft);border-style:solid}.nav-item{display:flex;align-items:center;gap:10px;padding:10px 18px;color:var(--side-text);cursor:pointer;border-left:3px solid transparent;font-size:var(--fs-base);-webkit-user-select:none;user-select:none;transition:background var(--dur-1) var(--ease-io),color var(--dur-1) var(--ease-io),border-color var(--dur-1)}.nav-item:hover{background:var(--side-bg-2);color:#fff}.nav-item.active{background:var(--side-active);color:#fff;border-left-color:var(--teal);font-weight:var(--fw-m)}.nav-item .ic{width:18px;display:inline-flex;align-items:center;justify-content:center;opacity:.92}.main{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.topbar{height:56px;background:var(--panel);border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 20px;gap:14px;flex-shrink:0}.topbar h1{font-size:var(--fs-md);margin:0;font-weight:var(--fw-sb)}.crumb{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:var(--fs-sm)}.crumb b{color:var(--text);font-weight:var(--fw-sb)}.topbar .spacer{flex:1}.topbar .pill{background:var(--panel-2);border:1px solid var(--border);color:var(--text-2);padding:4px 10px;border-radius:var(--r-full);font-size:var(--fs-xs)}.content{flex:1;overflow:auto;padding:20px}.filterbar{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-md);padding:14px 16px;margin-bottom:16px;box-shadow:var(--shadow-sm)}.filter-grid{display:flex;flex-wrap:wrap;gap:12px 18px}.filter-field{display:flex;flex-direction:column;gap:5px;min-width:130px}.filter-field label{font-size:var(--fs-xs);color:var(--text-2);font-weight:var(--fw-m)}.filter-field select,.filter-field input{border:1px solid var(--border-2);border-radius:var(--r-sm);padding:7px 10px;font-size:var(--fs-sm);background:var(--panel);color:var(--text);outline:none;transition:border-color var(--dur-1),box-shadow var(--dur-1)}.filter-field input:hover,.filter-field select:hover{border-color:var(--muted)}.filter-field input:focus,.filter-field select:focus{border-color:var(--primary);box-shadow:var(--ring)}.range{display:flex;align-items:center;gap:4px}.range input{width:68px}.filter-summary{display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding-top:10px;margin-top:10px;border-top:1px dashed var(--border)}.btn{border:1px solid var(--border-2);background:var(--panel);color:var(--text);border-radius:var(--r-sm);padding:7px 14px;font-size:var(--fs-sm);font-weight:var(--fw-m);display:inline-flex;align-items:center;gap:6px;transition:all var(--dur-1) var(--ease-io);-webkit-user-select:none;user-select:none}.btn:hover{border-color:var(--primary);color:var(--primary)}.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.55;cursor:not-allowed;transform:none}.btn.primary{background:var(--primary);color:var(--on-primary);border-color:var(--primary);box-shadow:var(--shadow-xs)}.btn.primary:hover{background:var(--primary-d);border-color:var(--primary-d);color:var(--on-primary)}.btn.teal{background:var(--teal);color:#fff;border-color:var(--teal)}.btn.teal:hover{background:var(--teal-d);border-color:var(--teal-d);color:#fff}.btn.ghost{background:transparent}.btn.sm{padding:4px 10px;font-size:var(--fs-xs)}.btn.red{background:var(--panel);color:var(--danger);border-color:var(--danger)}.btn.red:hover{background:var(--danger);color:#fff;border-color:var(--danger)}.btn.warn{background:#eab3081f;color:#b8860b;border-color:#eab30866}.btn.warn:hover{background:#eab30838;color:#b8860b}.btn.block{width:100%;justify-content:center}.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow-sm);transition:box-shadow var(--dur-2) var(--ease),transform var(--dur-2) var(--ease)}.card.hoverable:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.card .card-h{padding:13px 16px;border-bottom:1px solid var(--border);font-weight:var(--fw-sb);font-size:var(--fs-sm);display:flex;align-items:center;gap:8px}.card .card-b{padding:16px}.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:16px}.kpi{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-md);padding:16px 18px;box-shadow:var(--shadow-sm);position:relative;overflow:hidden;transition:box-shadow var(--dur-2) var(--ease),transform var(--dur-2) var(--ease)}.kpi:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.kpi .label{color:var(--text-2);font-size:var(--fs-sm);font-weight:var(--fw-m)}.kpi .value{font-size:28px;font-weight:var(--fw-b);margin-top:6px;letter-spacing:.3px}.kpi .sub{font-size:var(--fs-xs);color:var(--muted);margin-top:4px}.kpi .bar{position:absolute;left:0;top:0;bottom:0;width:4px}.kpi.alert .value{color:var(--danger)}.kpi.ok .value{color:var(--success)}.kpi.info .value{color:var(--primary)}.kpi.teal .value{color:var(--teal)}.kpi.warn{border-color:#e0a93b}.kpi.warn .value{color:#b8860b}.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}@media (max-width: 1100px){.grid-2,.grid-3{grid-template-columns:1fr}}table.tbl{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}table.tbl th,table.tbl td{padding:9px 12px;border-bottom:1px solid var(--border);text-align:right;white-space:nowrap}table.tbl th:first-child,table.tbl td:first-child{text-align:left}table.tbl th{background:var(--panel-2);color:var(--text-2);position:sticky;top:0;cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:var(--fw-sb);z-index:1}table.tbl tbody tr{transition:background var(--dur-1)}table.tbl tbody tr:hover{background:var(--primary-soft)}table.tbl tbody tr.row-critical{background:#dc262614}table.tbl tbody tr.row-critical:hover{background:#dc262624}table.tbl tbody tr.row-warning{background:#eab30814}table.tbl tbody tr.row-warning:hover{background:#eab30824}.ta{width:100%;border:1px solid var(--border);border-radius:var(--r);padding:10px;background:var(--panel);color:var(--text);resize:vertical}.tbl-wrap{max-height:560px;overflow:auto;border:1px solid var(--border);border-radius:var(--r)}.exp-row{cursor:pointer}.exp-caret{display:inline-block;width:14px;color:var(--text-2);font-size:10px;transition:transform var(--dur-1)}.exp-cell{background:var(--panel-2);padding:2px 8px 10px}.tag{display:inline-block;padding:2px 8px;border-radius:var(--r-full);font-size:var(--fs-xs);font-weight:var(--fw-m);background:var(--panel-2);border:1px solid var(--border);color:var(--text-2)}.tag.red{background:#dc26261a;border-color:#dc262633;color:var(--danger)}.tag.green{background:#16a34a1a;border-color:#16a34a33;color:var(--success)}.tag.yellow{background:#eab3081f;border-color:#eab30840;color:#b8860b}.tag.teal{background:var(--teal-soft);border-color:#14b8a640;color:var(--teal-d)}.sel{border:1px solid var(--border);border-radius:var(--r);padding:8px 10px;background:var(--panel);color:var(--text);font-size:var(--fs-sm);min-width:200px}.mini-stat{display:flex;flex-direction:column;gap:2px;padding:8px 14px;background:var(--panel-2);border:1px solid var(--border);border-radius:var(--r);min-width:84px}.mini-stat span{font-size:var(--fs-xs);color:var(--text-2)}.mini-stat b{font-size:var(--fs-md);font-weight:var(--fw-sb);color:var(--text)}.dev-ok{color:var(--success);font-weight:var(--fw-m)}.dev-warn{color:#b8860b;font-weight:var(--fw-m)}.dev-bad{color:var(--danger);font-weight:var(--fw-sb)}.warn-line{font-size:var(--fs-sm);color:#b8860b;padding:3px 0}.dev-bar{position:relative;height:9px;background:var(--panel-2);border:1px solid var(--border);border-radius:99px;min-width:110px;overflow:hidden}.dev-bar-mid{position:absolute;left:50%;top:-2px;bottom:-2px;width:1px;background:var(--muted);opacity:.55;z-index:2}.dev-bar-fill{position:absolute;top:0;bottom:0;border-radius:99px;transition:width var(--dur-2) var(--ease);z-index:1}.cal-report{background:var(--panel-2);border:1px solid var(--border);border-left:3px solid var(--teal);border-radius:var(--r);padding:10px 14px;font-size:var(--fs-sm);color:var(--text-2);margin-bottom:12px}.cal-report b{color:var(--text)}.cal-report ul{margin:6px 0 0;padding-left:18px}.cal-report li{padding:2px 0;color:var(--text-2)}.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.mt{margin-top:14px}.mb{margin-bottom:14px}.muted{color:var(--muted)}.t2{color:var(--text-2)}.alert-item{display:flex;gap:10px;align-items:center;padding:10px 14px;border-radius:var(--r);border:1px solid var(--border);margin-bottom:8px;background:var(--panel)}.alert-item.red{border-left:3px solid var(--danger)}.alert-item.orange{border-left:3px solid var(--warning)}.alert-item.yellow{border-left:3px solid var(--yellow-500)}.alert-item .lv{font-size:var(--fs-xs);padding:2px 8px;border-radius:var(--r-full);font-weight:var(--fw-sb)}.alert-item.red .lv{background:#dc26261f;color:var(--danger)}.alert-item.orange .lv{background:#d977061f;color:var(--warning)}.alert-item.yellow .lv{background:#eab30824;color:#b8860b}.empty-state{text-align:center;color:var(--muted);padding:64px 20px;animation:fadeIn var(--dur-3) var(--ease)}.empty-state .empty-ic{font-size:40px;opacity:.5;margin-bottom:8px}.empty-state b{color:var(--text-2);font-size:var(--fs-md)}.drop{border:2px dashed var(--border-2);border-radius:var(--r-md);padding:28px;text-align:center;background:var(--panel-2);color:var(--text-2);transition:all var(--dur-2) var(--ease)}.drop.over{border-color:var(--primary);background:var(--primary-soft)}.map-table{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}.map-table th,.map-table td{padding:6px 8px;border-bottom:1px solid var(--border)}.map-table select{width:100%;padding:5px 6px;border:1px solid var(--border-2);border-radius:var(--r-xs);background:var(--panel);color:var(--text)}.section-title{font-size:var(--fs-md);font-weight:var(--fw-sb);margin:0 0 12px;color:var(--text)}.hint{font-size:var(--fs-xs);color:var(--muted)}.tabs{display:flex;gap:6px;margin-bottom:14px}.tabs .tab{padding:7px 14px;border:1px solid var(--border-2);border-radius:var(--r-sm);background:var(--panel);color:var(--text-2);font-weight:var(--fw-m);transition:all var(--dur-1);cursor:pointer}.tabs .tab:hover{border-color:var(--primary);color:var(--primary)}.tabs .tab.active{background:var(--primary);color:var(--on-primary);border-color:var(--primary)}.role-badge{display:inline-block;padding:2px 8px;border-radius:var(--r-full);font-size:var(--fs-xs);font-weight:var(--fw-m);margin-left:6px;vertical-align:middle}.role-badge.owner{background:#d9770624;color:#b0780b}.role-badge.member{background:var(--panel-2);border:1px solid var(--border);color:var(--text-2)}.perms-editor{display:flex;flex-direction:column;gap:12px;margin:10px 0}.perms-editor .filter-field{min-width:0}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#0b122080;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;z-index:var(--z-modal);animation:fadeIn var(--dur-2) var(--ease)}.modal{background:var(--panel);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow-lg);width:520px;max-width:92vw;max-height:88vh;display:flex;flex-direction:column;animation:pop var(--dur-3) var(--ease)}.modal-h{padding:15px 18px;border-bottom:1px solid var(--border);font-weight:var(--fw-sb);font-size:var(--fs-md)}.modal-b{padding:18px;overflow:auto}.modal-f{padding:13px 18px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:10px}.toast-wrap{position:fixed;top:18px;right:18px;z-index:var(--z-toast);display:flex;flex-direction:column;gap:10px;pointer-events:none}.toast{pointer-events:auto;display:flex;align-items:center;gap:10px;min-width:240px;max-width:380px;background:var(--panel);border:1px solid var(--border);border-left-width:4px;border-radius:var(--r);padding:12px 14px;box-shadow:var(--shadow-md);font-size:var(--fs-sm);color:var(--text);animation:slideInRight var(--dur-3) var(--ease)}.toast.success{border-left-color:var(--success)}.toast.error{border-left-color:var(--danger)}.toast.info{border-left-color:var(--primary)}.toast .t-ic{display:inline-flex;flex-shrink:0}.toast.success .t-ic{color:var(--success)}.toast.error .t-ic{color:var(--danger)}.toast.info .t-ic{color:var(--primary)}.skeleton{border-radius:var(--r-sm);background:linear-gradient(90deg,var(--panel-2) 25%,var(--border) 37%,var(--panel-2) 63%);background-size:400px 100%;animation:shimmer 1.3s infinite linear}.skel-line{height:14px;margin:8px 0}.skel-card{height:96px;border-radius:var(--r-md)}[data-tip]{position:relative}[data-tip]:hover:after{content:attr(data-tip);position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%);background:var(--gray-900);color:#fff;font-size:var(--fs-xs);padding:5px 9px;border-radius:var(--r-xs);white-space:nowrap;z-index:var(--z-toast);box-shadow:var(--shadow-md);pointer-events:none;animation:fadeIn var(--dur-1) var(--ease)}.chart-wrap{position:relative;width:100%}.chart-zoom-btn{position:absolute;top:6px;right:6px;z-index:5;cursor:pointer;border:1px solid var(--border);background:var(--panel);border-radius:var(--r-sm);padding:5px 7px;color:var(--text-2);display:inline-flex;align-items:center;opacity:0;transition:opacity var(--dur-1),color var(--dur-1),border-color var(--dur-1)}.chart-wrap:hover .chart-zoom-btn,.chart-zoom-btn:focus-visible{opacity:1}.chart-zoom-btn:hover{color:var(--primary);border-color:var(--primary)}.chart-zoom-modal{width:min(1100px,94vw);max-height:92vh}.appbar,.bottom-nav,.drawer-mask,.sidebar-close{display:none}.brand-txt{display:flex;flex-direction:column;min-width:0;flex:1}.sidebar .brand-logo{flex-shrink:0;color:#fff;filter:drop-shadow(0 1px 6px rgba(120,180,255,.35));transition:transform .3s cubic-bezier(.4,0,.2,1),color .3s ease,filter .3s ease}.sidebar .brand-logo:hover{transform:scale(1.1);color:#fff;filter:drop-shadow(0 2px 10px rgba(120,180,255,.55))}.sidebar-close{background:transparent;border:none;color:#9fb0cc;font-size:16px;width:32px;height:32px;border-radius:var(--r-sm)}.sidebar-close:active{background:var(--side-bg-2);color:#fff}.sidebar-footer{margin-top:auto;padding:14px 16px;border-top:1px solid var(--side-border)}.side-addr-h{color:var(--side-text-2);font-size:var(--fs-xs);margin-bottom:4px}.side-addr-u{color:var(--side-text);font-size:var(--fs-sm);word-break:break-all;line-height:1.5}.side-user{color:var(--side-text-2);font-size:var(--fs-xs);margin-top:10px}@media (max-width: 900px){.app.mobile{display:block;height:auto;min-height:100vh;overflow:visible}.app.mobile .sidebar:not(.drawer){display:none}.app.mobile .topbar{display:none}.app.mobile .main{overflow:visible;padding-top:52px;padding-bottom:64px}.app.mobile .content{padding:14px}.appbar{display:flex;align-items:center;position:fixed;top:0;left:0;right:0;height:52px;z-index:var(--z-nav);background:var(--side-bg);color:#fff;padding:0 6px;padding-top:env(safe-area-inset-top)}.icon-btn{background:transparent;border:none;color:var(--side-text);font-size:20px;width:42px;height:42px;border-radius:var(--r-sm);display:inline-flex;align-items:center;justify-content:center;transition:background var(--dur-1)}.icon-btn:active{background:var(--side-bg-2);color:#fff}.appbar-title{font-size:var(--fs-md);font-weight:var(--fw-sb);margin-left:4px}.appbar-actions{margin-left:auto;display:flex;gap:2px}.bottom-nav{display:flex;position:fixed;left:0;right:0;bottom:0;height:58px;z-index:var(--z-nav);background:var(--panel);border-top:1px solid var(--border);box-shadow:0 -2px 12px #10182814;padding-bottom:env(safe-area-inset-bottom)}.bottom-tab{flex:1;border:none;background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:4px 0;color:var(--text-2);font-size:11px;transition:color var(--dur-1)}.bottom-tab .ic{font-size:19px;line-height:1;display:inline-flex}.bottom-tab.active,.bottom-tab.active .ic{color:var(--teal)}.drawer-mask{display:block;position:fixed;top:0;right:0;bottom:0;left:0;background:#0a122380;z-index:var(--z-mask);opacity:0;pointer-events:none;transition:opacity var(--dur-2)}.drawer-mask.show{opacity:1;pointer-events:auto}.sidebar.drawer{position:fixed;top:0;bottom:0;left:0;width:82%;max-width:300px;z-index:var(--z-drawer);transform:translate(-100%);transition:transform var(--dur-3) var(--ease);box-shadow:4px 0 24px #00000040}.sidebar.drawer.open{transform:translate(0)}.sidebar-close{display:inline-flex;align-items:center;justify-content:center}.kpi-row{grid-template-columns:repeat(2,1fr)!important;gap:10px}.kpi .value{font-size:23px}.grid-2,.grid-3{grid-template-columns:1fr!important}.filter-grid{gap:10px}.filter-field{min-width:calc(50% - 5px);flex:1}.filter-field select,.filter-field input{padding:10px 9px;font-size:15px}.btn{padding:10px 15px;font-size:14px}table.tbl{font-size:12px}table.tbl th,table.tbl td{padding:8px 9px}}@media (max-width: 380px){.filter-field{min-width:100%}}.auth-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;background:radial-gradient(900px 480px at 15% 0%,rgba(37,99,235,.28),transparent 55%),radial-gradient(700px 420px at 90% 100%,rgba(20,184,166,.22),transparent 55%),linear-gradient(140deg,#0e1830,#0b1220 60%)}.auth-card{width:380px;max-width:94vw;background:var(--panel);border:1px solid var(--border);border-radius:var(--r-lg);padding:30px 28px;box-shadow:var(--shadow-lg)}.auth-brand{text-align:center;margin-bottom:6px}.auth-logo{width:88px;height:76px;margin:0 auto 12px;display:flex;align-items:center;justify-content:center;color:var(--primary);filter:drop-shadow(0 2px 8px rgba(31,111,235,.18));animation:auth-logo-in .7s cubic-bezier(.4,0,.2,1) backwards;transition:color .3s ease,filter .3s ease,transform .35s cubic-bezier(.4,0,.2,1)}.auth-logo:hover{transform:scale(1.05);filter:drop-shadow(0 3px 14px rgba(31,111,235,.3))}@keyframes auth-logo-in{0%{opacity:0;transform:translateY(-6px) scale(.94)}to{opacity:1;transform:translateY(0) scale(1)}}.auth-brand h1{font-size:var(--fs-lg);margin:0 0 4px;font-weight:var(--fw-b)}.auth-sub{margin:0;color:var(--text-2);font-size:var(--fs-sm)}.auth-form{display:flex;flex-direction:column;margin-top:16px}.auth-label{display:block;font-size:var(--fs-sm);font-weight:var(--fw-m);color:var(--text-2);margin:14px 0 6px}.auth-field:first-child .auth-label{margin-top:0}.auth-input{display:flex;align-items:center;gap:8px;padding:0 11px;border:1px solid var(--border-2);border-radius:var(--r);background:var(--panel);color:var(--muted);transition:border-color var(--dur-1),box-shadow var(--dur-1)}.auth-input:focus-within{border-color:var(--primary);box-shadow:var(--ring);color:var(--primary)}.auth-input input{flex:1;border:none;outline:none;background:transparent;padding:11px 0;font-size:var(--fs-base);color:var(--text)}.auth-err{display:flex;align-items:center;gap:6px;color:var(--danger);font-size:var(--fs-sm);margin:14px 0 0}.auth-submit{width:100%;justify-content:center;margin-top:18px;height:42px;font-size:var(--fs-base);font-weight:var(--fw-sb);letter-spacing:2px}.auth-foot{text-align:center;font-size:var(--fs-xs);color:var(--muted);margin:16px 0 0;line-height:1.7}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}@media (max-width: 900px){.app.mobile{font-size:15px;line-height:1.62;overscroll-behavior-y:none;-webkit-tap-highlight-color:transparent}.app.mobile input,.app.mobile select,.app.mobile textarea{font-size:16px}.appbar{height:calc(52px + env(safe-area-inset-top));padding-top:env(safe-area-inset-top);padding-left:8px;padding-right:8px;background:#0e1830d1;backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);border-bottom:1px solid var(--side-border)}.appbar-title{font-size:16px}.app.mobile .main{padding-top:calc(52px + env(safe-area-inset-top));padding-bottom:calc(70px + env(safe-area-inset-bottom))}.app.mobile .content{padding:14px 12px}.app.mobile .card{border-radius:14px}.app.mobile .card .card-b{padding:14px}.app.mobile .kpi{padding:14px;border-radius:14px}.app.mobile .kpi .value{font-size:22px;overflow-wrap:anywhere}.app.mobile .kpi .label{font-size:12px}.app.mobile .kpi-row{gap:10px}.app.mobile .tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:12px}.app.mobile table.tbl th:first-child,.app.mobile table.tbl td:first-child{position:sticky;left:0;z-index:2;background:var(--panel);box-shadow:1px 0 0 var(--border)}.app.mobile table.tbl thead th:first-child{background:var(--panel-2)}.app.mobile .chart-wrap{min-height:240px}.bottom-nav{height:calc(58px + env(safe-area-inset-bottom))}.bottom-tab{font-size:11px;transition:color var(--dur-1),transform var(--dur-1)}.bottom-tab .ic{font-size:21px}.bottom-tab.active{position:relative}.bottom-tab.active:before{content:"";position:absolute;top:6px;left:50%;transform:translate(-50%);width:26px;height:3px;border-radius:3px;background:var(--teal)}.bottom-tab:active{transform:scale(.92)}.app.mobile .sidebar.drawer{overflow-y:auto;-webkit-overflow-scrolling:touch}.modal-mask{align-items:flex-end}.modal{width:100%;max-width:100%;max-height:92vh;border-radius:16px 16px 0 0;animation:sheetUp var(--dur-3) var(--ease)}@keyframes sheetUp{0%{transform:translateY(24px);opacity:0}to{transform:none;opacity:1}}.toast-wrap{top:auto;bottom:calc(70px + env(safe-area-inset-bottom));left:12px;right:12px;align-items:stretch}.toast{min-width:0;max-width:100%;width:100%}.app.mobile .empty-state{padding:40px 18px}}@media (max-width: 900px){.auth-wrap{padding:calc(env(safe-area-inset-top) + 16px) 16px calc(env(safe-area-inset-bottom) + 16px)}.auth-input input{font-size:16px}}.ast-fab{position:fixed;right:24px;bottom:24px;z-index:900;width:52px;height:52px;border-radius:50%;background:var(--primary);color:#fff;border:none;cursor:pointer;box-shadow:0 4px 12px #00000026;display:flex;align-items:center;justify-content:center;transition:transform var(--dur-2) var(--ease),box-shadow var(--dur-2) var(--ease)}.ast-fab:hover{transform:scale(1.05);box-shadow:0 6px 16px #0003}.ast-panel{position:fixed;right:24px;bottom:24px;z-index:900;width:400px;height:min(640px,80vh);background:var(--card);border:1px solid var(--border);border-radius:12px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;animation:astFadeIn var(--dur-3) var(--ease)}@keyframes astFadeIn{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}.ast-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border)}.ast-title{display:flex;align-items:center;gap:8px;font-weight:600;color:var(--fg)}.ast-close{background:none;border:none;cursor:pointer;color:var(--muted);padding:4px;border-radius:4px}.ast-close:hover{background:var(--hover);color:var(--fg)}.ast-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px}.ast-msg{display:flex}.ast-msg-user{justify-content:flex-end}.ast-msg-bot{justify-content:flex-start}.ast-bubble{max-width:85%;padding:10px 14px;border-radius:12px;font-size:14px;line-height:1.6}.ast-msg-user .ast-bubble{background:var(--primary);color:#fff;border-bottom-right-radius:4px}.ast-msg-bot .ast-bubble{background:var(--bg-alt, #f5f5f5);color:var(--fg);border-bottom-left-radius:4px}.ast-text{white-space:pre-line}.ast-card{margin-top:10px;background:var(--card);border:1px solid var(--border);border-radius:8px;padding:10px}.ast-card-title{font-weight:600;font-size:13px;margin-bottom:8px;color:var(--fg)}.ast-card-table{width:100%;font-size:13px;border-collapse:collapse}.ast-card-table td{padding:4px 0}.ast-label{color:var(--muted);width:40%}.ast-value{color:var(--fg);font-weight:500;text-align:right}.ast-suggestions{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.ast-chip{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:4px 10px;font-size:12px;color:var(--primary);cursor:pointer;transition:background var(--dur-2) var(--ease)}.ast-chip:hover{background:var(--hover)}.ast-busy{color:var(--muted);font-style:italic}.ast-footer{display:flex;gap:8px;padding:12px 16px;border-top:1px solid var(--border)}.ast-input{flex:1;padding:8px 12px;border:1px solid var(--border);border-radius:8px;background:var(--card);color:var(--fg);font-size:14px}.ast-input:focus{outline:none;border-color:var(--primary)}.ast-send{width:36px;height:36px;border-radius:8px;background:var(--primary);color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:opacity var(--dur-2) var(--ease)}.ast-send:disabled{opacity:.4;cursor:not-allowed}@media (max-width: 900px){.ast-panel{right:12px;bottom:12px;width:calc(100vw - 24px);height:70vh}.ast-fab{right:16px;bottom:16px;width:48px;height:48px}}.gs-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:flex-start;justify-content:center;padding-top:10vh;animation:gsFadeIn var(--dur-2) var(--ease)}@keyframes gsFadeIn{0%{opacity:0}to{opacity:1}}.gs-panel{width:560px;max-width:calc(100vw - 32px);max-height:70vh;background:var(--card);border:1px solid var(--border);border-radius:12px;box-shadow:0 12px 32px #0003;display:flex;flex-direction:column;animation:gsSlideDown var(--dur-3) var(--ease)}@keyframes gsSlideDown{0%{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:none}}.gs-input-wrap{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--border)}.gs-input{flex:1;background:none;border:none;color:var(--fg);font-size:15px;outline:none}.gs-close{background:none;border:none;cursor:pointer;color:var(--muted);padding:4px;border-radius:4px}.gs-close:hover{background:var(--hover);color:var(--fg)}.gs-body{flex:1;overflow-y:auto;padding:8px 0}.gs-hint{padding:16px 20px;color:var(--muted);font-size:13px;line-height:1.6}.gs-hint ul{margin:8px 0;padding-left:20px}.gs-shortcut{margin-top:12px;font-size:12px;color:var(--muted)}.gs-empty{padding:32px 20px;text-align:center;color:var(--muted);font-size:14px}.gs-section{padding:8px 0}.gs-section-title{padding:6px 20px;font-size:12px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.5px}.gs-item{display:flex;align-items:center;gap:12px;padding:10px 20px;cursor:pointer;transition:background var(--dur-2) var(--ease)}.gs-item:hover{background:var(--hover)}.gs-item-main{flex:1;min-width:0}.gs-item-title{font-size:14px;color:var(--fg);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gs-item-sub{font-size:12px;color:var(--muted);margin-top:2px}@media (max-width: 900px){.gs-panel{width:calc(100vw - 24px);max-height:60vh}.gs-mask{padding-top:8vh}}.bp-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--z-drawer);background:#0b122073;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:bpFadeIn var(--dur-2) var(--ease)}@keyframes bpFadeIn{0%{opacity:0}to{opacity:1}}.bp-drawer{position:fixed;top:0;right:0;z-index:calc(var(--z-drawer) + 1);width:min(480px,92vw);height:100dvh;background:var(--card);border-left:1px solid var(--border);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;animation:bpSlideIn var(--dur-3) var(--ease)}@keyframes bpSlideIn{0%{transform:translate(100%)}to{transform:none}}.bp-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border);flex-shrink:0}.bp-header-info{display:flex;align-items:center;gap:8px;color:var(--primary);min-width:0}.bp-batch-no{font-weight:var(--fw-sb);font-size:15px;color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bp-header-sub{font-size:12px;color:var(--muted);white-space:nowrap}.bp-close{background:none;border:none;cursor:pointer;color:var(--muted);padding:4px;border-radius:var(--r-xs);display:inline-flex}.bp-close:hover{background:var(--hover);color:var(--fg)}.bp-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px}.bp-loading,.bp-error{text-align:center;padding:40px 16px;color:var(--muted);font-size:14px}.bp-error{color:var(--danger)}.bp-section{background:var(--bg-alt);border:1px solid var(--border);border-radius:var(--r-md);padding:12px}.bp-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:var(--fw-sb);color:var(--text-2);margin-bottom:10px}.bp-no-perm{opacity:.8;border-style:dashed}.bp-no-perm-text{color:var(--muted);font-size:13px;margin:4px 0 0}.bp-kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.bp-kpi-row+.bp-kpi-row{margin-top:8px}.bp-kpi{background:var(--card);border:1px solid var(--border);border-radius:var(--r-sm);padding:10px;min-width:0}.bp-kpi-label{font-size:11px;color:var(--muted)}.bp-kpi-value{font-size:16px;font-weight:var(--fw-sb);color:var(--fg);margin-top:3px}.bp-bars{display:flex;flex-direction:column;gap:8px}.bp-bar-row{display:grid;grid-template-columns:56px 1fr auto;gap:8px;align-items:center}.bp-bar-label{font-size:12px;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bp-bar-track{height:8px;background:var(--hover);border-radius:var(--r-full);overflow:hidden}.bp-bar-fill{height:100%;border-radius:inherit;transition:width var(--dur-3) var(--ease)}.bp-bar-value{font-size:12px;color:var(--fg);white-space:nowrap}.bp-top-parts{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:10px}.bp-top-label{font-size:11px;color:var(--muted)}.bp-top-chip{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:3px 9px;border-radius:var(--r-full);background:var(--teal-soft);color:var(--teal-d);border:1px solid transparent}.bp-depletion-bar{position:relative;height:18px;border-radius:var(--r-full);overflow:hidden;background:var(--hover)}.bp-depletion-fill{position:absolute;top:0;bottom:0;left:0;background:linear-gradient(90deg,var(--primary),var(--teal));border-radius:inherit;transition:width var(--dur-3) var(--ease)}.bp-depletion-text{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:var(--fw-b);color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.35)}.bp-footer{display:flex;justify-content:flex-end;padding:14px 16px;border-top:1px solid var(--border);flex-shrink:0;gap:8px}.ast-card-link{float:right;margin-left:8px;display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:2px 8px;border-radius:var(--r-full);background:none;border:1px solid var(--teal);color:var(--teal-d);cursor:pointer;transition:background var(--dur-2) var(--ease)}.ast-card-link:hover{background:var(--teal-soft)}@media (max-width: 900px){.bp-drawer{width:100vw;border-left:none}}.ins-strip{display:flex;align-items:flex-start;gap:8px;margin:0 0 12px}.ins-badge{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-top:3px;padding:4px 10px;border-radius:var(--r-full);background:var(--primary-soft, var(--teal-soft));color:var(--primary-d, var(--teal-d));font-size:12px;font-weight:var(--fw-sb)}.ins-cards{display:flex;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.ins-card{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:var(--r-full);border:1px solid var(--border);background:var(--card);color:var(--fg);font-size:12px;line-height:1.5;text-align:left;cursor:default;max-width:100%;transition:border-color var(--dur-2) var(--ease),background var(--dur-2) var(--ease)}.ins-card.ins-warn{border-color:color-mix(in srgb,var(--warning) 45%,transparent);background:color-mix(in srgb,var(--warning) 10%,var(--card))}.ins-card.ins-info{border-color:color-mix(in srgb,var(--info) 40%,transparent);background:color-mix(in srgb,var(--info) 8%,var(--card))}.ins-card[title$=档案]{cursor:pointer}.ins-card[title$=档案]:hover{border-color:var(--primary);background:var(--hover)}.ins-text{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media (max-width: 900px){.ins-strip{flex-direction:column}.ins-badge{align-self:flex-start}}
