
:root{--sidebar:#0f172a;--bg:#f5f7fb;--card:#fff;--ink:#0f172a;--body:#334155;--mut:#64748b;
--line:#e2e8f0;--pri:#6366f1;--pri2:#8b5cf6;--grad:linear-gradient(135deg,#6366f1,#8b5cf6);
--ok:#059669;--warn:#d97706;--err:#dc2626;--info:#0ea5e9;--hl:#b45309;--hlbg:#fef3c7}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--body);
 font:14px/1.65 "Microsoft YaHei","PingFang SC","Hiragino Sans GB","Noto Sans SC",system-ui,sans-serif;
 -webkit-font-smoothing:antialiased}
.app{display:flex;min-height:100vh}
/* 侧边栏 */
.sidebar{width:232px;flex:0 0 232px;background:var(--sidebar);color:#cbd5e1;display:flex;flex-direction:column;
 position:sticky;top:0;height:100vh}
.brand{display:flex;gap:10px;align-items:center;padding:18px 16px;border-bottom:1px solid #1e293b}
.brand .logo{width:34px;height:34px;border-radius:10px;background:var(--grad);color:#fff;display:grid;
 place-items:center;font-weight:700;flex:0 0 auto}
.brand b{display:block;color:#fff;font-size:14px}
.brand small{display:block;color:#64748b;font-size:11.5px}
.sidebar nav{padding:10px 8px;flex:1}
.nav-item{display:flex;align-items:center;gap:9px;padding:9px 12px;border-radius:10px;color:#cbd5e1;
 text-decoration:none;font-size:13.5px;margin-bottom:2px;transition:.16s}
.nav-item:hover{background:#1e293b;color:#fff}
.nav-item.on{background:var(--grad);color:#fff;box-shadow:0 4px 12px rgba(99,102,241,.35)}
.ni-dot{width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.6;flex:0 0 auto}
.nav-item .wip{margin-left:auto;font-size:10px;font-style:normal;color:#94a3b8;background:#1e293b;
 border-radius:4px;padding:0 5px}
.side-foot{padding:12px 16px;border-top:1px solid #1e293b;font-size:11px;color:#64748b;line-height:1.6}
/* 主区 */
.main{flex:1;min-width:0;padding:24px 28px 60px;max-width:1240px}
.crumb{font-size:12.5px;color:var(--mut);margin-bottom:6px}
h1{margin:0 0 8px;font-size:26px;color:var(--ink);letter-spacing:.2px}
h1 .tag{vertical-align:middle;margin-left:8px}
.lead{margin:0 0 18px;color:var(--mut);font-size:13.5px;max-width:900px}
h2{font-size:17px;color:var(--ink);margin:30px 0 12px}
h2 small{font-size:12.5px;color:var(--mut);font-weight:400;margin-left:8px}
.hl{color:var(--hl);font-weight:700;background:linear-gradient(transparent 62%,var(--hlbg) 62%);
 padding:0 2px;border-radius:2px}
.mut{color:var(--mut)}.small{font-size:12.5px}
.ok{color:var(--ok)}.warn{color:var(--warn)}.err{color:var(--err)}
/* 统计 */
.stats{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:6px}
.stat{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 16px;min-width:150px;flex:1}
.stat span{font-size:12px;color:var(--mut);display:block}
.stat b{display:block;font-size:20px;color:var(--ink);line-height:1.3;margin:2px 0}
.stat small{font-size:11.5px;color:var(--mut)}
/* 卡片 / 表格 */
.card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px 18px;margin-bottom:14px;
 box-shadow:0 1px 2px rgba(15,23,42,.04)}
.card>b{display:block;color:var(--ink);margin-bottom:8px;font-size:14.5px}
.table{width:100%;border-collapse:collapse;font-size:13px}
.table th{background:#f8fafc;color:var(--mut);font-weight:600;font-size:12px;text-align:left;
 padding:9px 11px;border-bottom:1px solid var(--line);white-space:nowrap}
.table td{padding:9px 11px;border-bottom:1px solid #f1f5f9;vertical-align:top}
.table tr:last-child td{border-bottom:0}
.table tbody tr:hover{background:#fafbff}
.c-no{color:var(--mut);font-weight:700;width:1%;white-space:nowrap}
.c-name b{color:var(--ink)}
.c-name small{display:block;color:var(--mut);font-size:11.5px}
.c-cap code{background:#f1f5f9;border-radius:4px;padding:1px 5px;font-size:11.5px;color:#475569}
.c-last{color:var(--mut);font-size:12px;white-space:nowrap}
.dt td:first-child{color:var(--mut);white-space:nowrap;width:1%}
/* 标签 / 圆点 / 按钮 */
.tag{display:inline-block;background:#f8fafc;color:var(--mut);border:1px solid var(--line);
 border-radius:6px;padding:1px 8px;font-size:11.5px}
.tag.ok{background:#ecfdf5;color:var(--ok);border-color:#a7f3d0}
.tag.warn{background:#fffbeb;color:var(--warn);border-color:#fcd34d}
.tag.err{background:#fef2f2;color:var(--err);border-color:#fecaca}
.tag.info{background:#f0f9ff;color:var(--info);border-color:#bae6fd}
.tag.ir{background:#ecfdf5;color:#047857;border-color:#a7f3d0}
.tag.soft{background:#eef2ff;color:#4338ca;border-color:#c7d2fe}
.dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#cbd5e1;margin-right:6px}
.dot.ok{background:var(--ok)}.dot.err{background:var(--err)}
.btn{border:1px solid var(--line);background:#fff;border-radius:8px;padding:7px 14px;font-size:13px;
 color:var(--body);cursor:pointer;font-family:inherit;transition:.16s}
.btn:hover{border-color:#c7d2fe;transform:translateY(-1px)}
.btn.ghost{background:#fff}
.btn.sm{padding:3px 10px;font-size:12px}
.input{border:1px solid var(--line);border-radius:8px;padding:7px 11px;font-size:13px;font-family:inherit;outline:none}
.input:focus{border-color:var(--pri);box-shadow:0 0 0 3px rgba(99,102,241,.12)}
.input.sm{padding:5px 10px;font-size:12.5px;width:200px}
.chip{border:1px solid var(--line);background:#fff;border-radius:999px;padding:5px 13px;font-size:12.5px;
 cursor:pointer;font-family:inherit;color:var(--body);transition:.16s}
.chip:hover{border-color:#c7d2fe}
.chip.on{border-color:var(--pri);color:var(--pri);box-shadow:0 0 0 2px rgba(99,102,241,.14)}
.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.spacer{flex:1}
.switch{width:38px;height:21px;border-radius:999px;background:#cbd5e1;position:relative;display:inline-block;flex:0 0 auto}
.switch:after{content:"";position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;
 background:#fff;transition:.2s}
.switch.on{background:var(--pri)}
.switch.on:after{left:19px}
/* 布局块 */
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.room-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
.room-card{padding:13px 15px;margin:0}
.rc-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:8px}
.rc-head b{color:var(--ink)}
.rc-cnt{font-size:11.5px;color:var(--mut)}
.li{display:flex;align-items:center;gap:6px;padding:4px 0;font-size:12.5px;border-bottom:1px dashed #f1f5f9}
.li:last-child{border-bottom:0}
.li-n{flex:1;color:var(--body)}
.sec-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
.sec-card{display:block;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:15px 17px;
 text-decoration:none;color:inherit;transition:.18s}
.sec-card:hover{border-color:#c7d2fe;transform:translateY(-2px);box-shadow:0 6px 18px rgba(99,102,241,.10)}
.sec-card.wip{background:#fcfcfd}
.sc-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.sc-head b{color:var(--ink);font-size:15px}
.sec-card p{margin:0 0 10px;font-size:12.5px;color:var(--mut)}
.sc-foot{font-size:12px;color:var(--pri)}
.note{background:#fff;border-left:3px solid var(--pri);border-radius:0 10px 10px 0;padding:12px 16px;
 margin:14px 0;font-size:13px;line-height:1.7}
.note code{background:#f1f5f9;padding:1px 5px;border-radius:4px;font-size:12px}
/* 设备详情 */
.detail-card .empty{color:var(--mut);margin:0}
.dd-head{display:flex;align-items:center;gap:11px;flex-wrap:wrap;margin-bottom:12px}
.dd-no{width:34px;height:34px;border-radius:50%;background:var(--grad);color:#fff;display:grid;place-items:center;
 font-weight:700;flex:0 0 auto}
.dd-head b{color:var(--ink);font-size:15px}
.dd-head small{display:block;color:var(--mut);font-size:12px}
.dd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;margin-bottom:14px}
.dd-grid em{font-style:normal;display:block;color:var(--mut);font-size:11.5px;margin-bottom:2px}
.detail-card h4{margin:14px 0 8px;font-size:13.5px;color:var(--ink)}
.rule .rule-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.rule .rule-head b{color:var(--ink)}
.rule p{margin:0 0 8px;font-size:12.5px}
.rule-meta{font-size:11.5px;color:var(--mut)}
.ph-row{display:flex;gap:14px;padding:9px 0;border-bottom:1px dashed var(--line);font-size:13px}
.ph-row:last-child{border-bottom:0}
.ph-row b{flex:0 0 130px;color:var(--ink)}
.ph-row span{color:var(--body)}
/* 管家汇报 */
.butler{padding:0;overflow:hidden}
.ptabs{display:flex;border-bottom:1px solid var(--line);background:#fafbfe}
.ptab{flex:1;border:0;background:transparent;padding:11px 10px;cursor:pointer;font-family:inherit;
 border-bottom:2px solid transparent;transition:.16s;text-align:center}
.ptab b{display:block;font-size:13.5px;color:var(--body)}
.ptab small{display:block;font-size:11.5px;color:var(--mut);margin-top:1px}
.ptab:hover{background:#f1f5ff}
.ptab.on{border-bottom-color:var(--pri);background:#fff}
.ptab.on b{color:var(--pri)}
.ovbody{padding:18px 22px 20px}
.ovhead{display:flex;gap:8px;align-items:center;margin-bottom:10px;flex-wrap:wrap}
.ch{background:#eef2ff;color:#4338ca;border:1px solid #c7d2fe;border-radius:999px;padding:2px 11px;
 font-size:11.5px;font-weight:600}
.tone{font-size:11.5px;color:var(--mut)}
.ovbody h4{margin:0 0 12px;font-size:16px;color:var(--ink);display:flex;align-items:center;gap:9px}
.ovbody h4:before{content:"管家";flex:0 0 auto;width:32px;height:32px;border-radius:50%;background:var(--grad);
 color:#fff;font-size:11px;display:grid;place-items:center;font-weight:600}
.ovbody p{margin:0 0 10px;font-size:14px}
.signoff{margin-top:12px;padding-top:11px;border-top:1px dashed var(--line);font-size:13.5px;color:var(--ink)}
/* 建议卡 */
.fcard{border-left:4px solid var(--pri);border-radius:0 14px 14px 0}
.fhead{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:8px}
.fhead>b{color:var(--mut);font-size:12.5px}
.fhead .ptitle{color:var(--ink);font-size:14.5px;font-weight:600}
.fhead .dom{margin-left:auto;font-size:11.5px;color:var(--mut);background:#f8fafc;border:1px solid var(--line);
 border-radius:999px;padding:1px 9px}
.itxt{font-size:13.5px;background:var(--bg);border-radius:8px;padding:9px 12px;line-height:1.7}
details{margin-top:8px}
summary{cursor:pointer;font-size:12.5px;color:var(--pri);list-style:none}
summary::-webkit-details-marker{display:none}
summary:before{content:"▸ "}
details[open] summary:before{content:"▾ "}
.fev{font-size:12.5px;color:var(--mut);background:#fafbfc;border-radius:8px;padding:9px 12px;margin-top:6px;line-height:1.65}
.fact{font-size:12.5px;margin-top:6px}
.fact span{color:var(--pri);font-weight:600;margin-right:7px}
/* 分析域 / FLQI */
.dom-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.dom-card{margin:0;border-left:3px solid var(--c)}
.dc-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:6px}
.dc-head b{color:var(--ink)}
.dc-head span{font-size:11.5px;color:var(--mut)}
.dom-card p{margin:0;font-size:12.5px;color:var(--body)}
.flqi-row{display:flex;align-items:center;gap:12px;padding:7px 0;font-size:13px}
.flqi-row .fn{flex:0 0 84px;color:var(--body)}
.bar{flex:1;height:9px;background:#eef2f7;border-radius:999px;overflow:hidden}
.bar i{display:block;height:100%;background:var(--grad);border-radius:999px}
.flqi-row b{flex:0 0 30px;text-align:right;color:var(--ink)}
.ch{width:100%;height:250px}
.ch.tall{height:310px}
@media(max-width:1000px){.grid2{grid-template-columns:1fr}.main{padding:20px 16px 50px}}
@media print{.sidebar{display:none}.main{max-width:none}}
