/* 颜色、字体：全站只用这一组。状态色成对使用（文字色 / 底色） */
:root{--brand:#1f62d8;--brand-d:#174fb3;--brand-l:#e8f0fe;--side:#0f1b2d;--bg:#f3f5f8;--line:#e1e6ee;--line-2:#edf0f5;--border:#cbd3df;--ink:#16202c;--ink-2:#45526a;--muted:#5a677d;--meter:#2f6fe0;--ok:#0b6b4b;--ok-bg:#e2f3eb;--warn:#7a5200;--warn-bg:#fbefd2;--bad:#a8322e;--bad-bg:#fbe7e5;--off-bg:#ebeef3;
  font-family:"PingFang SC","Microsoft YaHei","Noto Sans CJK SC","Helvetica Neue",system-ui,sans-serif;color:var(--ink);background:var(--bg);font-size:14px;line-height:1.5}
[hidden]{display:none!important}
*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}
button{cursor:pointer;border:1px solid var(--border);background:#fff;border-radius:8px;min-height:36px;padding:0 14px;color:var(--ink)}button:hover{border-color:var(--brand);color:var(--brand-d)}button:disabled{opacity:.5;cursor:default}button:disabled:hover{border-color:var(--border);color:var(--ink)}
button.primary{background:var(--brand);color:#fff;border-color:var(--brand)}button.primary:hover{background:var(--brand-d);border-color:var(--brand-d);color:#fff}button.danger{color:var(--bad);border-color:#e5b5b2}button.danger:hover{border-color:var(--bad);color:var(--bad)}
input,select,textarea{border:1px solid var(--border);border-radius:8px;background:#fff;min-height:36px;padding:0 10px;min-width:0;color:var(--ink)}input[type=checkbox],input[type=radio],input[type=range]{min-height:0;padding:0}input[type=file]{padding:6px 10px}
textarea{min-height:110px;width:100%;padding:9px 10px;font-family:ui-monospace,monospace}select[multiple]{min-height:90px;padding:6px}
:is(button,input,select,textarea,summary,a):focus-visible{outline:2px solid #2f6fe066;outline-offset:1px}
label{display:grid;align-content:start;gap:5px;font-weight:600;font-size:13px;color:var(--ink-2)}label>:is(input,select,textarea){font-size:14px;font-weight:400}
a{color:var(--brand);text-decoration:none}a:hover{color:var(--brand-d);text-decoration:underline}p{margin:8px 0}
.muted{color:var(--muted)}.error{color:var(--bad);min-height:1.2em}.hint{font-size:12.5px;color:var(--muted)}.nowrap,td.nowrap{white-space:nowrap}
.icon{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px}.card [hidden]{display:none}

/* 登录 */
.login-wrap{min-height:100vh;display:grid;place-items:center;background:var(--bg)}.login-card{width:min(390px,90vw);display:grid;gap:14px;padding:32px}.login-card h1{font-size:22px;margin:0}.login-card button{min-height:40px}
.brand-mark{background:#2f6fe0;color:#fff;border-radius:9px;width:34px;height:34px;flex:none;display:grid;place-items:center;font-weight:700;font-size:14px}.login-card .brand-mark{width:48px;height:48px;font-size:19px;border-radius:12px}

/* 整体框架：左侧菜单（可整体收起成只剩图标的窄条，每个分组也可单独收起）＋右侧内容 */
#shell{display:flex;min-height:100vh}#shell[hidden],.page[hidden]{display:none}
.sidebar{flex:none;width:232px;background:var(--side);color:#b7c4d8;display:flex;flex-direction:column;gap:18px;padding:20px 12px 16px;position:sticky;top:0;height:100vh;overflow:hidden auto;transition:width .18s ease}
.logo{display:flex;gap:10px;align-items:center;font-size:15px;font-weight:600;line-height:1.3;color:#fff;padding:0 8px;white-space:nowrap}.logo small{display:block;color:#8a9bb3;font-size:12px;font-weight:400}
.sidebar nav{display:flex;flex-direction:column;gap:8px}.nav-sec,.nav-items{display:flex;flex-direction:column;gap:2px}
.sidebar nav button{position:relative;display:flex;align-items:center;gap:10px;width:100%;min-height:40px;padding:0 12px;border:0;border-radius:8px;background:transparent;color:#b7c4d8;text-align:left;white-space:nowrap}
.sidebar nav button:hover{background:#17283f;color:#fff}.sidebar nav button.active{background:#1c3a66;color:#fff;font-weight:600}
.sidebar nav button.nav-group{min-height:32px;gap:6px;padding:0 10px 0 12px;font-size:12px;letter-spacing:.06em;color:#8a9bb3}.sidebar nav button.nav-group:hover{background:transparent;color:#dce4f0}
.nav-group span,.nav-label{flex:1}.nav-group .icon{width:14px;height:14px;stroke-width:2;transition:transform .15s}
.nav-sec.folded .nav-items{display:none}.nav-sec.folded .nav-group .icon{transform:rotate(-90deg)}
.nav-sec.folded:has(.nav-badge.alert:not(:empty)) .nav-group span::after{content:'';display:inline-block;width:7px;height:7px;border-radius:4px;background:#ff9a8f;margin-left:8px}
.nav-badge{min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:#24406b;color:#dce4f0;font-size:12px;font-weight:600;line-height:20px;text-align:center;font-variant-numeric:tabular-nums}.nav-badge.alert{background:#ffd9d4;color:#7a1f1b}.nav-badge:empty{display:none}
.nav-collapsed .sidebar{width:64px;padding:20px 10px 16px}.nav-collapsed .logo{padding:0;justify-content:center}.nav-collapsed :is(.logo>div,.nav-label){display:none}
.nav-collapsed .sidebar nav button{justify-content:center;padding:0}.nav-collapsed .nav-sec.folded .nav-items{display:flex}
.nav-collapsed .sidebar nav button.nav-group{min-height:0;height:1px;margin:4px 8px 6px;width:auto;padding:0;background:#23354f;pointer-events:none}.nav-collapsed .nav-group>*,.nav-collapsed .nav-sec:first-child .nav-group{display:none}
.nav-collapsed .nav-badge{position:absolute;top:6px;right:8px;box-sizing:content-box;min-width:0;width:8px;height:8px;padding:0;font-size:0;border:2px solid var(--side);background:#8a9bb3}.nav-collapsed .nav-badge.alert{background:#ff9a8f}
main{flex:1 1 0;min-width:0;max-width:1600px;margin:0 auto;padding:24px clamp(16px,3vw,32px) 32px}
header{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:22px}header h2{margin:0;font-size:22px;line-height:1.3}header p{margin:2px 0 0;font-size:13px}
.header-left{display:flex;align-items:center;gap:12px;min-width:0}.header-right{display:flex;align-items:center;gap:14px}.icon-btn{display:grid;place-items:center;flex:none;width:36px;padding:0;color:var(--ink-2)}
.user-menu summary{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px 0 6px;border-radius:20px;font-size:13px}.user-menu summary .icon{width:14px;height:14px;stroke-width:2;color:var(--muted)}
.avatar{display:grid;place-items:center;width:28px;height:28px;border-radius:14px;background:var(--brand-l);color:var(--brand-d);font-weight:700;text-transform:uppercase}
body.loading main::before{content:'';position:fixed;top:0;left:0;right:0;height:3px;z-index:50;background:linear-gradient(90deg,transparent,var(--meter),transparent);background-size:40% 100%;background-repeat:no-repeat;animation:loadbar 1s linear infinite}
@keyframes loadbar{from{background-position:-40% 0}to{background-position:140% 0}}
/* 操作结果提示：页面顶部居中 */
.status:not(:empty){position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:60;display:flex;align-items:center;gap:10px;background:#fff;border:1px solid var(--line);border-radius:10px;padding:10px 16px 10px 12px;font-size:14px;color:var(--ink);box-shadow:0 8px 30px #0f1b2d24;max-width:min(680px,90vw)}
.status:not(:empty)::before{content:'✓';display:grid;place-items:center;flex:none;width:22px;height:22px;border-radius:11px;background:var(--ok-bg);color:var(--ok);font-size:13px;font-weight:700}
.status.bad:not(:empty){border-color:#e5b5b2;color:var(--bad)}.status.bad:not(:empty)::before{content:'!';background:var(--bad-bg);color:var(--bad)}

/* 数字：需要处理的卡片（可点）、概况数字栏、普通数字卡片 */
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px}
.stat{font-size:13px;color:var(--ink-2)}.stat strong{display:block;margin-top:2px;font-size:24px;line-height:1.4;color:var(--ink);font-variant-numeric:tabular-nums}.stat strong.small{font-size:18px}.stat small{display:block;font-size:12.5px;color:var(--muted)}.stat .compare{color:var(--brand-d);font-size:12.5px}
.stat.link{cursor:pointer}.stat.link:hover{border-color:#a9c1ec}.stat.attn strong{color:var(--bad)}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1px;background:var(--line);border:1px solid var(--line);border-radius:12px;overflow:hidden}.kpis>.stat{border:0;border-radius:0;padding:14px 18px}.kpis strong i{font-style:normal;font-size:15px;font-weight:400;color:var(--muted)}
.todo{display:flex;flex-direction:column;gap:10px;padding:16px 18px;background:#fff;border:1px solid var(--line);border-radius:12px;color:var(--ink)}.todo:hover{border-color:#a9c1ec;color:var(--ink);text-decoration:none}
.todo-head{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--ink-2)}.todo-head b{flex:1;font-weight:400}.todo-head>.icon{width:16px;height:16px;stroke-width:2;color:#8a96a8}
.todo-icon{display:grid;place-items:center;width:30px;height:30px;border-radius:8px;background:var(--ok-bg);color:var(--ok)}.todo-num{font-size:13px;color:var(--ink-2)}.todo-num strong{margin-right:6px;font-size:32px;line-height:1;color:var(--muted);font-variant-numeric:tabular-nums}.todo small{font-size:12.5px;color:var(--muted)}
.todo.bad .todo-icon{background:var(--bad-bg);color:var(--bad)}.todo.bad strong{color:var(--bad)}.todo.warn .todo-icon{background:var(--warn-bg);color:var(--warn)}.todo.warn strong{color:var(--warn)}
.mini-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:14px 0 6px;font-variant-numeric:tabular-nums}
.mini-stat{background:#f5f7fa;border-radius:10px;padding:12px 14px}.mini-stat small{display:block;font-size:12.5px;color:var(--muted)}.mini-stat b{display:block;font-size:18px}.mini-stat i{display:block;height:4px;margin-top:6px;border-radius:2px;background:var(--line);overflow:hidden}.mini-stat i u{display:block;height:100%;background:var(--meter)}
.mini-stat.attn{background:var(--bad-bg)}.mini-stat.attn small{color:#7a2a27}.mini-stat.attn b{color:var(--bad)}.mini-stat.attn i{background:#f2cfcc}.mini-stat.attn i u{background:#c0443f}

/* 分区标题、筛选栏、页签 */
.section-head{display:flex;justify-content:space-between;align-items:center;margin:24px 0 12px;gap:12px}.section-head h3{margin:0;font-size:16px;font-weight:600}.page>.section-head:first-child,.tabs+.section-head{margin-top:0}
.toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.page>.toolbar{margin-bottom:14px}.toolbar>input{min-width:190px}.toolbar .spacer{flex:1}.toolbar .spacer+*{margin-left:auto}.toolbar label{display:flex;align-items:center;gap:6px;font-weight:400}
.toolbar input[placeholder^="搜索"]{padding-left:32px;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235a677d' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M11 18a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM20 20l-4-4'/%3E%3C/svg%3E") 10px center/16px no-repeat}
.toolbar .live{margin-left:auto;display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted)}.toolbar .live::before{content:'';width:7px;height:7px;border-radius:4px;background:var(--meter)}
.seg{display:inline-flex;gap:2px;padding:3px;border-radius:9px;background:var(--off-bg)}.seg button{min-height:30px;padding:0 12px;border:0;border-radius:7px;background:transparent;color:var(--ink-2);font-size:13px}.seg button.active{background:#fff;color:var(--ink);font-weight:600;box-shadow:0 1px 2px #0f1b2d29}.seg b{margin-left:5px;font-weight:inherit;color:var(--bad)}
.tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:18px;flex-wrap:wrap}
.tabs button{min-height:42px;border:0;border-bottom:2px solid transparent;border-radius:0;background:transparent;padding:0 14px;color:var(--ink-2);margin-bottom:-1px}.tabs button.active{color:var(--brand-d);border-bottom-color:var(--brand);font-weight:600}.tabs button:hover{color:var(--brand-d)}
.tabs button .pill{margin-left:6px;border-radius:9px;padding:0 6px;font-size:12px;font-weight:600}

/* 列表：筛选栏、表格、翻页连成一张卡片 */
.table-wrap{overflow:auto;background:#fff;border:1px solid var(--line);border-radius:12px}
table{border-collapse:collapse;width:100%;min-width:700px;font-variant-numeric:tabular-nums}
th,td{text-align:left;border-bottom:1px solid var(--line-2);padding:10px 16px;vertical-align:middle}th{color:var(--muted);background:#f8f9fb;border-bottom-color:var(--line);font-size:12.5px;font-weight:600;white-space:nowrap}
tr:last-child td{border-bottom:0}tbody tr:hover{background:#f5f8fd}td small{font-size:12.5px;color:var(--muted)}:is(th,td).num{text-align:right}:is(th,td).act{text-align:right;white-space:nowrap}
td button{min-height:28px;margin:0 2px 0 0;padding:0 6px;border:0;background:transparent;color:var(--brand);font-size:13px;font-weight:600}td button:hover{background:var(--brand-l)}td button.danger{color:var(--bad)}td button.danger:hover{background:var(--bad-bg)}td button.primary{padding:0 10px;background:var(--brand);color:#fff}td button.primary:hover{background:var(--brand-d)}
.empty{color:var(--muted);padding:30px;text-align:center}
.pagination{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin:14px 0;flex-wrap:wrap;color:var(--muted);font-size:13px}.pagination span{margin-right:auto}.pagination label{display:flex;align-items:center;gap:5px;font-weight:400}.pagination :is(button,select){min-height:32px;padding:0 12px;font-size:13px}
.table-wrap:has(+.pagination){border-radius:12px 12px 0 0}.table-wrap+.pagination{margin:0 0 14px;padding:10px 16px;background:#fff;border:1px solid var(--line);border-top:0;border-radius:0 0 12px 12px}
.toolbar:has(+:is(.table-wrap,.joined)){margin:0;padding:12px 16px;background:#fff;border:1px solid var(--line);border-bottom:0;border-radius:12px 12px 0 0}:is(.toolbar+.table-wrap,.toolbar+.joined>.table-wrap:first-child){border-top-left-radius:0;border-top-right-radius:0}
/* 批量操作条：勾选了行才出现，夹在筛选栏和表格之间 */
.toolbar:has(+.batch-bar){margin:0;padding:12px 16px;background:#fff;border:1px solid var(--line);border-bottom:0;border-radius:12px 12px 0 0}
.batch-bar{margin:0;padding:10px 16px;background:var(--brand-l);border:1px solid var(--line);border-bottom:0;color:var(--brand-d)}.batch-bar button{min-height:32px;font-size:13px}.batch-bar+.table-wrap{border-top-left-radius:0;border-top-right-radius:0}
/* 页签页面和弹窗里：分区标题和紧跟的表格连成一张卡片；页签已经写了标题，这里只留右边的说明和按钮 */
:is(.tabs~.section-head,.box-pane .section-head,.page>.section-head:first-child):has(+.table-wrap){margin-bottom:0;padding:10px 16px;background:#fff;border:1px solid var(--line);border-bottom:0;border-radius:12px 12px 0 0}:is(.tabs~.section-head,.box-pane .section-head,.page>.section-head:first-child)+.table-wrap{border-top-left-radius:0;border-top-right-radius:0}
.tabs~.section-head:has(>:nth-child(2))>h3{display:none}.section-head>:last-child:not(:first-child){margin-left:auto}
/* 日期范围：两个日期框并成一个控件 */
.range{display:inline-flex;align-items:center;gap:6px;min-height:36px;padding:0 10px;border:1px solid var(--border);border-radius:8px;background:#fff;color:var(--muted)}.range input{min-height:34px;padding:0;border:0;background:transparent}.range input:invalid{color:var(--muted)}.range .icon{width:16px;height:16px}
/* “更多筛选”：点开后在按钮下面出现的小面板 */
.pop{position:relative;display:inline-block}.pop summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:6px;min-height:36px;border:1px solid var(--border);background:#fff;border-radius:8px;padding:0 14px;color:var(--ink)}.pop summary::-webkit-details-marker{display:none}.pop[open] summary{background:var(--off-bg)}.pop summary .icon{width:14px;height:14px;stroke-width:2;color:var(--muted)}
.pop-body{position:absolute;top:calc(100% + 4px);left:0;z-index:30;display:grid;gap:12px;width:280px;padding:14px;background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:0 8px 30px #0f1b2d29}.toolbar .pop-body label{display:grid;gap:5px;font-weight:600}
.pill{display:inline-block;border-radius:6px;padding:2px 8px;background:var(--off-bg);color:var(--ink-2);font-size:12.5px;white-space:nowrap}.pill.ok{background:var(--ok-bg);color:var(--ok)}.pill.info{background:var(--brand-l);color:var(--brand-d)}.pill.bad{background:var(--bad-bg);color:var(--bad)}.pill.warn{background:var(--warn-bg);color:var(--warn)}
/* 状态（在线、离线、启用、停用）用圆角带圆点；问题和待办用方角 */
.pill.dot{border-radius:11px;padding:2px 9px 2px 8px;font-weight:600}.pill.dot::before{content:'';display:inline-block;width:6px;height:6px;margin-right:6px;border-radius:3px;background:currentColor;vertical-align:middle;position:relative;top:-1px}
.problems{display:flex;flex-wrap:wrap;gap:4px}#health th,#alarms th,#health td:is(:nth-child(2),:nth-child(4),:nth-child(5),:nth-child(6),:nth-child(8),:nth-child(9)){white-space:nowrap}
/* 设备健康的表列多：能折行的两列（门店、配置）留够最小宽度，免得被挤成一字一行；格子左右留白收窄一些，1280 宽的屏幕也能放下 */
#health td:nth-child(1){min-width:150px}#health td:nth-child(7){min-width:130px}
#health :is(th,td){padding-left:10px;padding-right:10px}#health :is(th,td):first-child{padding-left:16px}#health :is(th,td):last-child{padding-right:16px}#health th{line-height:1.3}
.meters{display:flex;gap:8px;align-items:flex-end}.meters>span{width:40px;font-size:12.5px;line-height:1.3}.meters i{display:block;height:3px;margin-top:4px;border-radius:2px;background:var(--line);overflow:hidden}.meters i u{display:block;height:100%;background:var(--meter)}.meters .attn{color:var(--bad);font-weight:600}.meters .attn u{background:#c0443f}.meters .temp{padding-bottom:7px}
.cov{display:flex;align-items:center;gap:10px}.cov i{flex:1;max-width:140px;height:6px;border-radius:3px;background:var(--line);overflow:hidden}.cov i u{display:block;height:100%;background:var(--meter)}.cov span{width:40px;text-align:right}.cov.warn span{color:var(--warn);font-weight:600}.cov.warn u{background:#b7791f}.cov.bad span{color:var(--bad);font-weight:600}.cov.bad u{background:#c0443f}
.bar{height:6px;border-radius:3px;background:var(--line);overflow:hidden}.bar span{display:block;background:var(--meter);height:100%}

/* “更多”菜单：固定定位，免得被表格的滚动区域裁掉 */
.menu{display:inline-block}.menu summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:6px;min-height:36px;border:1px solid var(--border);background:#fff;border-radius:8px;padding:0 14px;color:var(--ink)}
.menu summary::-webkit-details-marker{display:none}.menu[open] summary{background:var(--off-bg)}.menu summary .icon{width:14px;height:14px;stroke-width:2;color:var(--muted)}
.menu-items{position:fixed;z-index:70;background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:0 8px 30px #0f1b2d29;padding:6px;display:grid;gap:2px;min-width:184px}
.menu-items button{text-align:left;border:0;border-radius:6px;width:100%;white-space:nowrap;padding:0 10px}.menu-items button:hover{background:var(--bg)}.menu-items button.danger:hover{background:var(--bad-bg)}
td .menu summary{min-height:28px;padding:0 8px;font-size:13px;margin:0 2px 0 0}td .menu-items button{min-height:36px;margin:0;padding:0 10px;font-size:14px;font-weight:400;color:var(--ink)}td .menu-items button.danger{color:var(--bad)}td .menu-items button:hover{background:var(--bg)}

/* 弹窗 */
dialog{border:0;border-radius:14px;padding:24px;width:min(720px,94vw);max-height:90vh;overflow:auto;color:var(--ink);box-shadow:0 12px 60px #0f1b2d59}dialog::backdrop{background:#0f1b2d88}dialog.wide{width:min(1040px,95vw)}
dialog .close{float:right;display:grid;place-items:center;width:36px;border:0;font-size:22px;padding:0;color:var(--ink-2)}dialog h3{margin-top:0;font-size:18px}
.detail h4{margin:22px 0 8px}.detail>p{line-height:1.9;margin-top:0}
.box-head h3{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0;font-size:20px;line-height:1.3}.box-head>p{margin:4px 0 16px;font-size:13px;color:var(--muted)}
.info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px 24px;margin:0 0 16px;padding:14px 16px;border-radius:10px;background:#f5f7fa}.info-grid small{display:block;font-size:12.5px;color:var(--muted)}
dialog .tabs{margin:16px -24px 20px;padding:0 24px}.box-pane h4{margin:20px 0 10px;font-size:15px}.box-pane h4 small{margin-left:8px;font-size:13px;font-weight:600;color:var(--muted)}.box-pane h4 small.attn{color:var(--bad)}
.checks{display:flex;flex-wrap:wrap;gap:6px 16px;font-weight:400}label.check{display:inline-flex;align-items:center;gap:6px;font-weight:400;color:var(--ink)}label.check input{width:auto;margin:0}
.field-label{display:block;font-weight:600;font-size:13px;color:var(--ink-2);margin-bottom:5px}.date-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center}button.link{border:0;background:none;padding:0 2px;min-height:0;color:inherit;cursor:pointer;font-size:14px;line-height:1}
.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.form-grid .full{grid-column:1/-1}.form-grid label small{font-weight:400;color:var(--muted)}label small.field-warn{color:var(--warn)}.form-grid textarea.json{min-height:54px}details .form-grid{margin-top:10px}
.form-actions{grid-column:1/-1;display:flex;gap:8px;justify-content:flex-end}
.form-actions.sticky{position:sticky;bottom:0;background:#fff;padding:12px 0 4px;margin-top:16px;border-top:1px solid var(--line);z-index:5}.form-actions.sticky .error{margin-right:auto;min-height:0}dialog .form-actions.sticky{bottom:-24px;padding-bottom:20px}
.cfg-group{border:1px solid var(--line);border-radius:12px;padding:6px 16px 12px;margin:14px 0}.cfg-group legend{font-weight:600;padding:0 6px}.cfg-group .hint{margin:4px 0 12px}
.cfg-value{font-family:ui-monospace,monospace;font-size:12px;word-break:break-all;max-width:220px}.cfg-json{max-height:320px;overflow:auto;white-space:pre-wrap}
.pick-list{max-height:260px;overflow:auto;border:1px solid var(--line);border-radius:10px;padding:6px 12px;margin:10px 0 4px}.pick-row{display:flex;font-weight:400;font-size:14px;color:var(--ink);gap:8px;align-items:center;padding:4px 0}
.two-col{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:16px}.two-col h4{margin:0 0 8px}.review-bar{margin:12px 0}.review-bar input{flex:1}
/* 表单校验：必填星号、没填对的项标红并在下面写原因 */
.req{font-style:normal;color:var(--bad)}label.invalid>:is(input,select,textarea){border-color:var(--bad)}.field-error{font-weight:400;font-size:12.5px;color:var(--bad)}
/* 事件详情：左边截图和片段（片段在最上面，截图点一下放大），右边说明；复核一栏固定在底部 */
.event-body{display:flex;flex-wrap:wrap;gap:20px;margin-top:16px}.event-media{flex:999 1 480px;min-width:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-content:start}
.event-media :is(img,video){display:block;width:100%;border-radius:8px;background:#14202f}.event-media :is(video,img.big,img:only-child,p){grid-column:1/-1}.event-media video{order:-1}.event-media img{cursor:zoom-in}.event-media img.big{cursor:zoom-out}
.event-media:not(:has(video))>img:first-child{grid-column:1/-1}.kv{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;margin:12px 0;font-size:13px}.kv>:nth-child(odd){color:var(--muted)}
.event-info{flex:1 1 300px;min-width:0}.event-info>p:first-child{margin-top:0}.event-info .form-actions{justify-content:flex-start;margin:10px 0}
.event-body.stacked{display:block}.event-body.stacked .event-media{margin-bottom:16px}#event-extra:not(:empty){margin-top:16px}
dialog .review-bar{position:sticky;bottom:-24px;margin:20px -24px -24px;padding:14px 24px;background:#f8f9fb;border-top:1px solid var(--line)}
/* 展厅标定：左边一栏放当前步骤的工具和列表，右边是画布 */
#fl-body:has(>[data-tab-shared]){display:grid;grid-template-columns:minmax(300px,400px) minmax(0,1fr);column-gap:16px;align-items:start}#fl-body:has(>[data-tab-shared])>*{grid-column:1;min-width:0;margin-bottom:12px}
#fl-body:has(>[data-tab-shared])>.section-head{margin:0;padding:10px 16px;background:#fff;border:1px solid var(--line);border-bottom:0;border-radius:12px 12px 0 0}#fl-body>.section-head+:is(.card,.table-wrap,.empty){border-top-left-radius:0;border-top-right-radius:0}
#fl-body>.empty{padding:16px;background:#fff;border:1px solid var(--line);border-radius:12px;text-align:left}
#fl-body>.tabs{grid-column:1/-1}#fl-body>[data-tab-shared]{grid-column:2;grid-row:2/span 30;margin-top:0!important}#fl-body table{min-width:0}#fl-body>.section-head{margin-top:0}
.sched{display:grid;gap:6px;justify-items:start}.sched-row{display:flex;gap:6px;align-items:center;font-weight:400}
.code{font-family:ui-monospace,monospace;word-break:break-all;background:var(--off-bg);padding:8px;border-radius:7px}details{margin:8px 0}details>summary{cursor:pointer;color:var(--ink-2)}pre{white-space:pre-wrap;word-break:break-all}
.log-view{max-height:62vh;overflow:auto;white-space:pre-wrap;word-break:break-all;font-size:12px;line-height:1.5;margin:0}

/* 画面与图片：实时预览、区域标注、展厅标定、热力图、人像 */
.preview-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.preview-card{background:var(--side);color:#fff;border-radius:12px;padding:8px;position:relative}
.preview-card img,.preview-card canvas{width:100%;aspect-ratio:16/9;object-fit:contain;background:#000;display:block}.preview-card [hidden]{display:none}.preview-info{font-size:12px}.preview-card button{position:absolute;right:12px;top:12px}.preview-card p{margin:3px 6px}
dialog .preview-grid{grid-template-columns:1fr}dialog .preview-card>button{display:none}
.asset-thumb{max-width:96px;max-height:64px;object-fit:contain;background:var(--off-bg);border-radius:6px}#pt-canvas{height:auto}.trend{width:100%;height:auto}
.heat-canvas{width:100%;height:auto;border-radius:8px;background:#101a28}.draw-canvas{width:100%;background:#14202f;aspect-ratio:16/9;touch-action:none;cursor:crosshair}
.calib-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px;margin-top:8px}.calib-grid [hidden]{display:none}.calib-canvas{width:100%;height:auto;display:block;border-radius:8px;background:#14202f;cursor:crosshair}
.portrait-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.portrait-card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:8px;display:flex;flex-direction:column;gap:6px}.portrait-card.labeled{border-color:#a9c1ec;background:#f5f8fd}
.portrait-card img,.portrait-missing{width:100%;aspect-ratio:3/4;object-fit:contain;background:var(--off-bg);border-radius:8px}.portrait-missing{display:grid;place-items:center;color:var(--muted);font-size:12px}.portrait-meta{font-size:12px;line-height:1.7}.portrait-meta .portrait-match{padding-inline:5px;font-size:12px}
.portrait-actions{display:flex;gap:2px;padding:3px;border-radius:9px;background:var(--off-bg)}.portrait-actions button{flex:1;min-height:28px;padding:0;border:0;background:transparent;color:var(--ink-2);font-size:12.5px}
.portrait-actions button.primary{background:#fff;color:var(--brand-d);font-weight:600;box-shadow:0 1px 2px #0f1b2d29}

/* 窄屏：菜单仍在左侧，默认收成窄条；展开时盖在内容上面 */
@media (max-width:760px){
  body:not(.nav-collapsed) .sidebar{position:fixed;left:0;z-index:40;box-shadow:8px 0 30px #0f1b2d59}body:not(.nav-collapsed) main{margin-left:64px}
  main{padding:14px}header{flex-wrap:wrap;gap:8px}.header-right{margin-left:auto}#page-subtitle,#who-role{display:none}
  .grid,.mini-grid{grid-template-columns:1fr 1fr}.form-grid,.preview-grid,.calib-grid{grid-template-columns:1fr}
  dialog,dialog.wide{width:96vw;padding:16px;max-height:94vh}dialog .form-actions.sticky{bottom:-16px}dialog .tabs{margin:16px -16px 20px;padding:0 16px}dialog .review-bar{bottom:-16px;margin:16px -16px -16px;padding:12px 16px}
  #fl-body:has(>[data-tab-shared]){display:block}.pop-body{width:min(280px,80vw)}
  .tabs{flex-wrap:nowrap;overflow-x:auto}.tabs button{white-space:nowrap;padding:0 12px}
  .toolbar>input,.toolbar>select{min-width:0;flex:1 1 140px}.section-head{flex-wrap:wrap;gap:8px}.pagination{justify-content:flex-start}th,td{padding:8px 10px;font-size:13px}
}

/* 复核原因与候选方案 */
.review-reason{display:block;color:var(--muted,#667085);font-size:12px;margin-top:4px;white-space:normal}
.improvement-sources{max-height:300px;overflow:auto;margin-bottom:16px}
#improvement-create>label{display:grid;gap:6px;margin:16px 0}
#improvement-create>details{margin:18px 0}
#improvement-validate textarea{font-family:ui-monospace,monospace}
