/* 横泰经济开发区 AI 数字人智能体平台 · 一期样板系统
   双模设计系统：
   - 深色科技模式（登录页 + 运营大屏）：深邃蓝黑、玻璃拟态、电蓝/青光晕、等宽发光数字
   - 浅色高级模式（工作台 + 企业端）：借鉴苏州工业园区「流畅设计」——大留白、卡片面板、
     柔和分层阴影、渐变主按钮、毛玻璃顶栏、渐变光条侧栏 */
:root{
  --blue:#0b4ea2; --blue-2:#2e7cf6; --cyan:#22d3ee;
  --blue-deep:#0a3570; --blue-dark:#07264f;
  --blue-soft:#e8f0fa; --blue-line:#c9dbf2;
  --ink:#16263c; --ink-2:#43536b; --ink-3:#8494ab;
  --bg:#f3f6fb; --card:#ffffff; --line:#e3eaf3;
  --ok:#177245; --ok-bg:#e7f4ec;
  --warn:#b45309; --warn-bg:#fdf3e3;
  --bad:#b3261e; --bad-bg:#fdecea;
  --gold:#a87b1f;
  --radius:14px;
  --shadow:0 1px 2px rgba(16,42,86,.05),0 12px 32px -14px rgba(16,42,86,.16);
  --shadow-lg:0 2px 4px rgba(16,42,86,.05),0 24px 48px -16px rgba(16,42,86,.22);
  --num-font:"DIN Alternate","SF Mono","Roboto Mono",Consolas,monospace;
  --grad-btn:linear-gradient(135deg,#0b4ea2 0%,#2e7cf6 100%);
  /* 深色科技 */
  --dk-1:#050d1f; --dk-2:#0a1e3f;
  --dk-panel:linear-gradient(160deg,rgba(23,52,102,.66),rgba(9,22,48,.78));
  --dk-border:rgba(110,168,255,.28);
  --dk-ink:#dcebfb; --dk-ink2:#93aed6; --dk-ink3:#5f7ba3;
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans SC",sans-serif;
  background:var(--bg); color:var(--ink); font-size:14px; line-height:1.65;
}
button{font-family:inherit;cursor:pointer}
input,select,textarea{font-family:inherit}
.num{font-family:var(--num-font);font-variant-numeric:tabular-nums;letter-spacing:.01em}
.tag{display:inline-block;padding:1px 9px;border-radius:99px;font-size:12px;line-height:1.75;white-space:nowrap;font-weight:500}
.tag.blue{background:var(--blue-soft);color:var(--blue)}
.tag.ok{background:var(--ok-bg);color:var(--ok)}
.tag.warn{background:var(--warn-bg);color:var(--warn)}
.tag.bad{background:var(--bad-bg);color:var(--bad)}
.tag.grey{background:#eef1f6;color:var(--ink-2)}
.btn{
  display:inline-block;border:1px solid transparent;background:var(--grad-btn);color:#fff;
  padding:7px 17px;border-radius:9px;font-size:13px;line-height:1.5;
  box-shadow:0 6px 16px -6px rgba(11,78,162,.55);
  transition:transform .16s ease,box-shadow .16s ease,background .16s ease,border-color .16s ease;
}
.btn:hover{transform:translateY(-1px);box-shadow:0 10px 22px -6px rgba(11,78,162,.6)}
.btn:active{transform:translateY(0) scale(.985)}
.btn.ghost{background:#fff;color:var(--blue);border-color:var(--blue-line);box-shadow:none}
.btn.ghost:hover{background:var(--blue-soft)}
.btn.plain{background:#fff;color:var(--ink-2);border-color:var(--line);box-shadow:none}
.btn.plain:hover{border-color:var(--blue-line);color:var(--blue)}
.btn.small{padding:4px 11px;font-size:12px;border-radius:7px}
.btn:disabled{opacity:.45;cursor:not-allowed;transform:none}
.muted{color:var(--ink-3)} .small{font-size:12px} .strong{font-weight:600}
a{color:var(--blue);text-decoration:none}
.up{color:var(--bad)} .down{color:var(--ok)}

/* 演示徽章（精致小徽章，替代粗横幅） */
.demoBadge{display:inline-flex;align-items:center;gap:5px;font-size:11px;letter-spacing:.12em;
  padding:2px 10px;border-radius:99px;border:1px solid rgba(169,198,234,.5);color:#cfe2f7;background:rgba(255,255,255,.07);white-space:nowrap}
.demoBadge::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--cyan);box-shadow:0 0 6px var(--cyan)}
.demoBadge.lite{border-color:var(--blue-line);color:var(--blue);background:var(--blue-soft)}
.demoBadge.lite::before{background:var(--blue-2);box-shadow:none}
.demoCorner{position:absolute;top:16px;right:18px;z-index:5}

/* ============ 登录页（深色科技） ============ */
.loginPage{position:relative;min-height:100vh;overflow:hidden;color:var(--dk-ink);
  background:radial-gradient(1100px 600px at 18% -10%,rgba(46,124,246,.35),transparent 60%),
             radial-gradient(900px 520px at 105% 110%,rgba(34,211,238,.20),transparent 55%),
             linear-gradient(160deg,var(--dk-1) 0%,var(--dk-2) 100%)}
.loginPage::before{content:'';position:absolute;inset:0;
  background-image:linear-gradient(rgba(90,140,220,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(90,140,220,.07) 1px,transparent 1px);
  background-size:46px 46px;mask-image:radial-gradient(ellipse 90% 80% at 50% 40%,#000 30%,transparent 78%)}
#loginCanvas{position:absolute;inset:0;width:100%;height:100%;opacity:.85}
.loginInner{position:relative;z-index:2;display:grid;grid-template-columns:minmax(0,1.15fr) minmax(360px,430px);
  gap:56px;align-items:center;max-width:1240px;margin:0 auto;padding:64px 40px 56px;min-height:100vh}
.loginVisual .org{font-size:13px;letter-spacing:.5em;color:#8fc1ff;margin-bottom:14px}
.loginVisual h1{font-size:44px;line-height:1.16;font-weight:800;letter-spacing:.03em;color:#fff;
  text-shadow:0 0 34px rgba(46,124,246,.45)}
.loginVisual h1 em{font-style:normal;background:linear-gradient(92deg,#7dd3fc,#22d3ee 55%,#2e7cf6);
  -webkit-background-clip:text;background-clip:text;color:transparent}
.lvSub{margin-top:14px;color:var(--dk-ink2);font-size:14px;letter-spacing:.18em}
.ipStage{display:flex;align-items:flex-end;gap:34px;margin:40px 0 8px}
.ipFigure{position:relative;text-align:center}
.ipFigure .ipRing{position:absolute;left:50%;top:44%;transform:translate(-50%,-50%);border-radius:50%;
  border:1px solid rgba(125,211,252,.5);box-shadow:0 0 0 10px rgba(46,124,246,.06),0 0 44px rgba(34,211,238,.35),inset 0 0 34px rgba(46,124,246,.28);
  animation:ringSpin 14s linear infinite}
.ipFigure .ipRing::after{content:'';position:absolute;inset:-9px;border-radius:50%;
  border:1px dashed rgba(125,211,252,.35);animation:ringSpinR 26s linear infinite}
.ipFigure img{position:relative;border-radius:50%;object-fit:cover;object-position:top;
  border:2px solid rgba(160,205,255,.65);box-shadow:0 18px 44px -12px rgba(0,0,0,.65)}
.ipFigure.main img{width:172px;height:172px}
.ipFigure.main .ipRing{width:212px;height:212px}
.ipFigure.sub img{width:128px;height:128px;opacity:.96}
.ipFigure.sub .ipRing{width:162px;height:162px;animation-duration:18s}
.ipFigure label{display:block;margin-top:16px;font-size:12.5px;color:#a9c8ef;letter-spacing:.14em}
.ipFigure label b{color:#fff;font-weight:600}
@keyframes ringSpin{to{transform:translate(-50%,-50%) rotate(360deg)}}
@keyframes ringSpinR{to{transform:rotate(-360deg)}}
.loginStats{display:flex;gap:14px;flex-wrap:wrap;margin-top:30px}
.statItem{min-width:128px;padding:13px 16px 11px;border-radius:12px;background:var(--dk-panel);
  border:1px solid var(--dk-border);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  box-shadow:inset 0 1px 0 rgba(160,205,255,.16)}
.statItem .sv{font-family:var(--num-font);font-variant-numeric:tabular-nums;font-size:25px;font-weight:700;color:#cfeaff;line-height:1.2;
  text-shadow:0 0 16px rgba(34,211,238,.5)}
.statItem .sl{font-size:11.5px;color:var(--dk-ink2);letter-spacing:.1em;margin-top:2px}
.loginPanel{border-radius:20px;padding:30px 30px 24px;background:linear-gradient(165deg,rgba(24,54,105,.72),rgba(8,20,44,.82));
  border:1px solid var(--dk-border);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
  box-shadow:inset 0 1px 0 rgba(160,205,255,.2),0 30px 60px -20px rgba(0,0,0,.7)}
.loginPanel h2{font-size:17px;color:#fff;margin-bottom:18px;letter-spacing:.06em}
.loginPanel .field{margin-bottom:15px}
.loginPanel .field label{display:block;font-size:12px;color:#9db9dd;margin-bottom:6px;letter-spacing:.08em}
.loginPanel .field input,.loginPanel .field select{width:100%;padding:10px 13px;border-radius:9px;font-size:14px;color:#eaf3ff;
  background:rgba(6,16,36,.55);border:1px solid rgba(110,168,255,.35)}
.loginPanel .field input:focus,.loginPanel .field select:focus{outline:none;border-color:var(--cyan);box-shadow:0 0 0 3px rgba(34,211,238,.22)}
.loginPanel .field select option{color:#16263c}
.loginBtn{width:100%;padding:12px;font-size:15px;margin-top:4px;border-radius:10px}
.loginErr{color:#ff9d94;font-size:13px;min-height:20px;margin-top:9px;text-align:center}
.acctBox{margin-top:16px;border-top:1px dashed rgba(110,168,255,.3);padding-top:14px}
.acctBox .t{font-size:12px;color:#7e9cc4;letter-spacing:.08em;margin-bottom:8px}
.acctRow{display:flex;justify-content:space-between;gap:8px;padding:5px 0;border-bottom:1px solid rgba(110,168,255,.12);font-size:13px;color:#c6dcf5}
.acctRow:last-child{border-bottom:none}
.acctRow code{font-family:var(--num-font);color:#7dd3fc;cursor:pointer}
.acctRow code:hover{text-decoration:underline}
.loginFoot{margin-top:18px;color:#6d8ab0;font-size:12px;line-height:1.7}

/* ============ 应用框架（浅色高级） ============ */
.shell{display:flex;flex-direction:column;min-height:100vh}
.topbar{background:rgba(7,32,68,.92);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  color:#fff;display:flex;align-items:center;gap:14px;padding:0 20px;height:56px;position:sticky;top:0;z-index:40;
  box-shadow:0 8px 24px -12px rgba(7,32,68,.55)}
.topbar .brand{font-size:16px;font-weight:600;letter-spacing:.05em;white-space:nowrap}
.topbar .brand span{font-weight:400;font-size:12px;color:#a9c6ea;margin-left:10px;letter-spacing:.12em}
.topbar .sp{flex:1}
.topbar .who{font-size:13px;color:#d7e6f8;white-space:nowrap}
.topbar .who b{color:#fff}
.topbar>button{background:transparent;border:1px solid #3f6db0;color:#d7e6f8;border-radius:7px;padding:4px 12px;font-size:12px;transition:.15s;white-space:nowrap;flex:none}
.topbar>button:hover{background:#123f78;color:#fff}
.shellBody{display:flex;flex:1;align-items:stretch}
.sidebar{width:212px;flex:none;background:rgba(255,255,255,.86);backdrop-filter:blur(10px);
  border-right:1px solid var(--line);padding:18px 0}
@media (min-width:770px){
  .sidebar{position:sticky;top:56px;height:calc(100vh - 56px);overflow-y:auto;align-self:flex-start}
}
.sidebar .roleLine{padding:0 20px 14px;border-bottom:1px solid var(--line);margin-bottom:10px}
.sidebar .roleLine .r{font-size:15px;font-weight:600}
.sidebar .roleLine .d{font-size:12px;color:var(--ink-3)}
.navItem{display:block;width:100%;text-align:left;background:none;border:none;padding:10px 20px 10px 17px;
  font-size:14px;color:var(--ink-2);border-left:3px solid transparent;position:relative;transition:.16s}
.navItem:hover{background:#f2f7fd;color:var(--blue)}
.navItem.on{background:linear-gradient(90deg,var(--blue-soft),rgba(232,240,250,.25));color:var(--blue);font-weight:600}
.navItem.on::before{content:'';position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:3px;
  background:linear-gradient(180deg,var(--blue-2),var(--cyan));box-shadow:0 0 10px rgba(46,124,246,.55)}
.main{flex:1;min-width:0;padding:24px 28px 64px;animation:viewIn .24s ease both}
@keyframes viewIn{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
.pageTitle{font-size:21px;font-weight:700;color:var(--blue-dark);letter-spacing:.02em;margin-bottom:4px}
.pageSub{color:var(--ink-2);font-size:13px;margin-bottom:18px}
.grid{display:grid;gap:14px}
.grid>*,.dashMain>*,.chatLayout>*,.dashKpiBand>*{min-width:0}
.grid.c2{grid-template-columns:repeat(2,1fr)}
.grid.c3{grid-template-columns:repeat(3,1fr)}
.grid.c4{grid-template-columns:repeat(4,1fr)}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:19px 21px}
.card h3{font-size:15px;font-weight:600;margin-bottom:10px;color:var(--ink)}
.card h3 .more{float:right;font-size:12px;font-weight:400}
.grid>.card,.funnel>.f-step,.grid>.kpi{animation:riseIn .5s cubic-bezier(.22,.8,.32,1) both}
.grid>*:nth-child(2){animation-delay:.05s}.grid>*:nth-child(3){animation-delay:.1s}
.grid>*:nth-child(4){animation-delay:.15s}.grid>*:nth-child(5){animation-delay:.2s}
.grid>*:nth-child(6){animation-delay:.25s}.grid>*:nth-child(7){animation-delay:.3s}
.grid>*:nth-child(8){animation-delay:.35s}
@keyframes riseIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
.kpi .k-label{font-size:12px;color:var(--ink-3);letter-spacing:.1em}
.kpi .k-value{font-size:28px;font-weight:700;color:var(--blue-dark);margin:3px 0;line-height:1.25;
  font-variant-numeric:tabular-nums}
.kpi .k-value small{font-size:13px;font-weight:500;color:var(--ink-3);margin-left:2px}
.kpi .k-sub{font-size:12px;color:var(--ink-2)}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;color:var(--ink-2);font-weight:600;padding:9px 10px;border-bottom:2px solid var(--blue-line);white-space:nowrap;background:#fbfcfe}
td{padding:9px 10px;border-bottom:1px solid #edf1f6;vertical-align:top;transition:background .15s}
tbody tr{transition:.15s}
tbody tr:hover td{background:#f4f8fd}
tr:last-child td{border-bottom:none}
.tblWrap{overflow-x:auto}
.bar{height:8px;background:#e9eef5;border-radius:99px;overflow:hidden;min-width:90px}
.bar i{display:block;height:100%;background:linear-gradient(90deg,var(--blue),var(--blue-2));border-radius:99px;transition:width .7s cubic-bezier(.22,.8,.32,1)}
.bar i.warn{background:linear-gradient(90deg,#d97706,#f0a832)}.bar i.bad{background:linear-gradient(90deg,#b3261e,#e0564c)}.bar i.ok{background:linear-gradient(90deg,#1d7a49,#2e9e62)}
.funnel{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.funnel .f-step{border-radius:var(--radius);padding:17px 19px;color:#fff;box-shadow:var(--shadow)}
.f-step .n{font-size:31px;font-weight:700;line-height:1.2;font-variant-numeric:tabular-nums}
.f-step .l{font-size:13px;opacity:.93}
.f-step.s1{background:linear-gradient(135deg,#6d92c2,#4e74a8)}.f-step.s2{background:linear-gradient(135deg,#0b4ea2,#2e7cf6)}.f-step.s3{background:linear-gradient(135deg,#c0564f,#a53f38)}
.evd{border-left:3px solid var(--blue-line);padding:8px 12px;background:#f8fafd;border-radius:0 8px 8px 0;margin-top:8px}
.evd li{margin-left:16px;font-size:13px;color:var(--ink-2)}
details.evdBox summary{cursor:pointer;color:var(--blue);font-size:13px}
.stepFlow{display:flex;align-items:center;gap:0;flex-wrap:wrap;margin:6px 0}
.stepFlow .st{padding:3px 12px;border-radius:99px;background:#eef1f5;color:var(--ink-2);font-size:12px}
.stepFlow .st.done{background:var(--ok-bg);color:var(--ok)}
.stepFlow .st.cur{background:var(--grad-btn);color:#fff;box-shadow:0 4px 10px -3px rgba(11,78,162,.5)}
.stepFlow .arr{color:var(--ink-3);padding:0 5px;font-size:12px}
/* 扶持审批阶段光轨 */
.stageRail{display:flex;align-items:center;gap:0;margin:2px 0 4px}
.srNode{display:flex;flex-direction:column;align-items:center;gap:3px;min-width:86px;text-align:center}
.srDot{width:15px;height:15px;border-radius:50%;background:#dbe4f0;border:2px solid #fff;box-shadow:0 0 0 1px var(--blue-line)}
.srNode.hot .srDot{background:radial-gradient(circle at 35% 35%,#7dd3fc,var(--blue-2) 70%);box-shadow:0 0 12px rgba(46,124,246,.65),0 0 0 1px var(--blue-2)}
.srName{font-size:13px;font-weight:600;color:var(--ink)}
.srNum{font-size:12px;color:var(--ink-3)}
.srTrack{flex:1;height:3px;border-radius:3px;margin:0 6px 26px;background:linear-gradient(90deg,var(--blue-line),var(--blue-2),var(--cyan));opacity:.75;
  box-shadow:0 0 8px rgba(46,124,246,.35)}
/* SVG 图表动效 */
.barRect{transform-box:fill-box;transform-origin:50% 100%;animation:growY .8s cubic-bezier(.22,.8,.32,1) both}
@keyframes growY{from{transform:scaleY(0)}to{transform:scaleY(1)}}
.lineDraw{stroke-dasharray:100;stroke-dashoffset:100;animation:drawLine 1.1s .1s ease forwards}
@keyframes drawLine{to{stroke-dashoffset:0}}
.dotPop{animation:dotIn .4s .8s both}
@keyframes dotIn{from{opacity:0}to{opacity:1}}
.donutSeg{animation:donutIn .9s cubic-bezier(.22,.8,.32,1) both;transform-origin:center}
@keyframes donutIn{from{opacity:0;transform:rotate(-14deg) scale(.94)}to{opacity:1;transform:none}}

/* ============ 企业端对话 ============ */
.chatLayout{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:16px;align-items:start}
.chatBox{background:#fff;border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow-lg);display:flex;flex-direction:column;height:640px;overflow:hidden}
.chatHead{display:flex;align-items:center;gap:12px;padding:13px 16px;border-bottom:1px solid var(--line);
  background:linear-gradient(180deg,#fbfdff,#f2f7fd)}
.chatHead .avatarWrap{position:relative;flex:none}
.chatHead .avatarWrap::after{content:'';position:absolute;inset:-5px;border-radius:50%;
  border:1.5px solid rgba(46,124,246,.45);box-shadow:0 0 14px rgba(46,124,246,.35);animation:breathe 2.8s ease-in-out infinite}
@keyframes breathe{0%,100%{transform:scale(1);opacity:.75}50%{transform:scale(1.09);opacity:.35}}
.chatHead img{width:46px;height:46px;border-radius:50%;object-fit:cover;object-position:top;display:block}
.chatHead .nm{font-weight:600;font-size:15px}
.chatHead .ds{font-size:12px;color:var(--ok)}
.chatBody{flex:1;overflow-y:auto;padding:16px;background:linear-gradient(180deg,#f7fafd,#f2f6fb)}
.msg{display:flex;gap:10px;margin-bottom:14px;max-width:92%;animation:msgIn .32s cubic-bezier(.22,.8,.32,1) both}
@keyframes msgIn{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}
.msg img{width:34px;height:34px;border-radius:50%;object-fit:cover;object-position:top;flex:none}
.msg .bubble{background:#fff;border:1px solid var(--line);border-radius:4px 14px 14px 14px;padding:10px 14px;font-size:13.5px;box-shadow:0 2px 8px -2px rgba(11,50,100,.09)}
.msg.me{margin-left:auto;flex-direction:row-reverse}
.msg.me .bubble{background:var(--grad-btn);color:#fff;border-color:transparent;border-radius:14px 4px 14px 14px}
.msg .bubble table{font-size:12.5px}
.msg .bubble th{background:#f2f6fb}
.tdots{display:inline-flex;gap:5px;padding:4px 2px}
.tdots span{width:7px;height:7px;border-radius:50%;background:#9db9dd;animation:tblink 1.1s infinite}
.tdots span:nth-child(2){animation-delay:.16s}.tdots span:nth-child(3){animation-delay:.32s}
@keyframes tblink{0%,60%,100%{transform:translateY(0);opacity:.45}30%{transform:translateY(-4px);opacity:1}}
.chips{display:flex;gap:8px;flex-wrap:wrap;padding:10px 16px;border-top:1px solid var(--line);background:#fff}
.chip{border:1px solid var(--blue-line);color:var(--blue);background:#fff;border-radius:99px;padding:5px 13px;font-size:12.5px;transition:.15s}
.chip:hover{background:var(--blue-soft);transform:translateY(-1px)}
.chatInput{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--line)}
.chatInput input{flex:1;padding:9px 12px;border:1px solid var(--line);border-radius:8px;font-size:14px}
.chatInput input:focus{outline:2px solid var(--blue-line);border-color:var(--blue)}
.briefCard{border:1px solid var(--blue-line);border-radius:12px;padding:14px 16px;background:linear-gradient(180deg,#fdfeff,#f4f9ff);box-shadow:0 6px 18px -8px rgba(11,78,162,.25)}
.briefCard .bt{font-weight:600;color:var(--blue-dark);margin-bottom:6px}
.receipt{position:relative;border:1.5px dashed var(--blue);border-radius:12px;padding:15px 17px;background:linear-gradient(180deg,#f7fbff,#eef5ff);overflow:hidden}
.receipt .rt{font-weight:700;color:var(--blue-dark);letter-spacing:.1em}
.receipt::after{content:'已存证';position:absolute;right:16px;top:14px;width:56px;height:56px;border-radius:50%;
  border:2px solid rgba(179,38,30,.5);color:rgba(179,38,30,.72);font-size:12.5px;font-weight:700;letter-spacing:.12em;
  display:flex;align-items:center;justify-content:center;transform:rotate(-12deg);
  box-shadow:inset 0 0 0 2px rgba(179,38,30,.14);background:rgba(255,255,255,.35)}
.noticeItem{padding:10px 0;border-bottom:1px solid #eef1f5}
.noticeItem:last-child{border-bottom:none}
.noticeItem .nt{font-weight:600;font-size:13.5px}
.careCard{background:linear-gradient(135deg,#fdf6e3,#fdeeda);border:1px solid #ecd9ac;border-radius:var(--radius);padding:16px 18px;box-shadow:var(--shadow)}
.careCard .ct{color:var(--gold);font-weight:700;letter-spacing:.06em}

/* ============ 悬浮交互栏（air menu） ============ */
.airFab{position:fixed;right:22px;bottom:22px;z-index:90;width:58px;height:58px;border-radius:50%;border:none;padding:0;
  background:linear-gradient(140deg,#123f78,#0b4ea2);box-shadow:0 14px 30px -8px rgba(7,32,68,.6),0 0 0 3px rgba(125,211,252,.35),0 0 22px rgba(46,124,246,.45);
  transition:transform .18s ease}
.airFab:hover{transform:translateY(-2px) scale(1.05)}
.airFab img{width:100%;height:100%;border-radius:50%;object-fit:cover;object-position:top;display:block}
.airFabDot{position:absolute;top:2px;right:2px;width:11px;height:11px;border-radius:50%;background:#34d399;border:2px solid #fff;
  box-shadow:0 0 8px rgba(52,211,153,.9)}
.airPanel{position:fixed;right:22px;bottom:92px;z-index:91;width:372px;max-width:calc(100vw - 24px);height:540px;max-height:calc(100vh - 120px);
  display:flex;flex-direction:column;background:#fff;border:1px solid var(--blue-line);border-radius:18px;overflow:hidden;
  box-shadow:0 30px 60px -18px rgba(7,32,68,.45);animation:airIn .26s cubic-bezier(.22,.8,.32,1) both}
@keyframes airIn{from{opacity:0;transform:translateY(14px) scale(.97)}to{opacity:1;transform:none}}
.airHead{display:flex;align-items:center;gap:10px;padding:12px 15px;color:#fff;background:linear-gradient(120deg,#0a3570,#0b4ea2 60%,#2e7cf6)}
.airHead img{width:38px;height:38px;border-radius:50%;object-fit:cover;object-position:top;border:1.5px solid rgba(255,255,255,.6)}
.airHead .nm{font-weight:600;font-size:14.5px}
.airHead .ds{font-size:11.5px;color:#bcd7f7}
.airHead .x{margin-left:auto;background:rgba(255,255,255,.14);border:none;color:#fff;width:26px;height:26px;border-radius:8px;font-size:14px;line-height:1}
.airBody{flex:1;overflow-y:auto;padding:14px;background:linear-gradient(180deg,#f7fafd,#f1f6fc)}
.airBody .msg{max-width:96%}
.airChips{display:flex;gap:7px;flex-wrap:wrap;padding:9px 13px;border-top:1px solid var(--line);background:#fff}
.airInput{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--line);background:#fff}
.airInput input{flex:1;padding:8px 11px;border:1px solid var(--line);border-radius:8px;font-size:13.5px;min-width:0}
.airInput input:focus{outline:2px solid var(--blue-line);border-color:var(--blue)}

/* ============ 大屏（深色驾驶舱） ============ */
.dash{position:relative;min-height:100vh;color:var(--dk-ink);padding:20px 24px 26px;overflow:hidden;
  background:radial-gradient(1000px 480px at 50% -12%,rgba(46,124,246,.32),transparent 62%),
             radial-gradient(760px 420px at 108% 108%,rgba(34,211,238,.14),transparent 55%),
             linear-gradient(165deg,var(--dk-1),var(--dk-2))}
.dash::before{content:'';position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(rgba(90,140,220,.06) 1px,transparent 1px),linear-gradient(90deg,rgba(90,140,220,.06) 1px,transparent 1px);
  background-size:44px 44px;mask-image:radial-gradient(ellipse 95% 85% at 50% 38%,#000 25%,transparent 80%)}
.dash>*:not(.demoCorner){position:relative;z-index:1}
.dashTop{display:flex;align-items:center;gap:16px;margin-bottom:16px;flex-wrap:wrap}
.dashTop .dt-org{font-size:11.5px;letter-spacing:.42em;color:#8fc1ff}
.dashTop h1{font-size:27px;font-weight:800;letter-spacing:.05em;color:#fff;line-height:1.25;text-shadow:0 0 26px rgba(46,124,246,.5)}
.dashTop .dt-sub{color:var(--dk-ink2);font-size:12.5px;margin-top:3px}
.dashTop .sp{flex:1}
.btn.dk{background:rgba(16,42,86,.5);border:1px solid var(--dk-border);color:#cfe2f7;box-shadow:none;backdrop-filter:blur(8px)}
.btn.dk:hover{background:rgba(46,124,246,.28);color:#fff}
.dpanel{background:var(--dk-panel);border:1px solid var(--dk-border);border-radius:16px;
  backdrop-filter:blur(13px);-webkit-backdrop-filter:blur(13px);
  box-shadow:inset 0 1px 0 rgba(160,205,255,.15),0 20px 40px -20px rgba(0,0,0,.65);padding:16px 18px}
.dpanel h3{font-size:14px;font-weight:600;color:#eaf3ff;letter-spacing:.08em;margin-bottom:10px}
.dpanel h3 .more{float:right;font-size:11.5px;font-weight:400;color:var(--dk-ink3)}
.dpanel.zoneHi{border-color:rgba(34,211,238,.85);box-shadow:inset 0 1px 0 rgba(160,205,255,.2),0 0 0 1px rgba(34,211,238,.6),0 0 34px rgba(34,211,238,.35)}
.dashKpiBand{display:grid;grid-template-columns:repeat(5,1fr);gap:13px;margin-bottom:13px}
.dkpi{padding:14px 16px 12px}
.dkpi .k-label{font-size:11.5px;color:var(--dk-ink2);letter-spacing:.12em}
.dkpi .k-value{font-family:var(--num-font);font-variant-numeric:tabular-nums;font-size:29px;font-weight:700;line-height:1.25;margin:3px 0;color:#d8efff;
  text-shadow:0 0 18px rgba(34,211,238,.45)}
.dkpi .k-value small{font-size:12.5px;font-weight:500;color:var(--dk-ink2);margin-left:2px;text-shadow:none}
.dkpi .k-sub{font-size:11.5px;color:var(--dk-ink2)}
.dashMain{display:grid;grid-template-columns:308px minmax(0,1fr) 308px;gap:13px;margin-bottom:13px}
.dashMain .col{display:flex;flex-direction:column;gap:13px;min-width:0}
.netWrap{position:relative;padding:8px 6px 2px}
#netCanvas{display:block;width:100%;height:430px}
.netTip{position:absolute;pointer-events:none;background:rgba(6,17,38,.92);border:1px solid rgba(34,211,238,.55);border-radius:10px;
  padding:9px 12px;font-size:12px;color:#dcebfb;box-shadow:0 12px 30px rgba(0,0,0,.5);opacity:0;transition:opacity .15s;max-width:230px;z-index:4}
.netTip.show{opacity:1}
.netTip b{color:#7dd3fc}
.netNote{font-size:11.5px;color:var(--dk-ink3);text-align:center;padding:2px 0 6px;letter-spacing:.1em}
.ringRow{display:flex;align-items:center;gap:13px;padding:8px 0;border-bottom:1px solid rgba(110,168,255,.14)}
.ringRow:last-child{border-bottom:none}
.ringRow .rr-t{flex:1;min-width:0}
.ringRow .rr-t .t1{font-size:13px;color:#eaf3ff}
.ringRow .rr-t .t2{font-size:11.5px;color:var(--dk-ink2)}
.ringSvg{flex:none;filter:drop-shadow(0 0 7px rgba(34,211,238,.35))}
.dRankRow{display:flex;align-items:center;gap:10px;padding:6.5px 0;border-bottom:1px solid rgba(110,168,255,.12);font-size:12.5px}
.dRankRow:last-child{border-bottom:none}
.dRankRow .rn{width:20px;height:20px;border-radius:50%;background:rgba(46,124,246,.25);border:1px solid rgba(125,211,252,.5);
  color:#a5d8ff;font-size:11px;display:flex;align-items:center;justify-content:center;flex:none;font-family:var(--num-font)}
.dRankRow .rb{flex:1;min-width:0}
.dRankRow .bar{background:rgba(110,168,255,.16)}
.streamPanel{padding:12px 0 10px;overflow:hidden}
.streamHead{display:flex;align-items:center;gap:10px;padding:0 18px 9px}
.streamHead h3{font-size:14px;font-weight:600;color:#eaf3ff;letter-spacing:.08em}
.streamHead .live{margin-left:auto;font-size:11px;color:#7dd3fc;letter-spacing:.14em;display:flex;align-items:center;gap:6px}
.streamHead .live::before{content:'';width:6px;height:6px;border-radius:50%;background:var(--cyan);box-shadow:0 0 8px var(--cyan);animation:tblink 1.6s infinite}
.streamMask{overflow:hidden;mask-image:linear-gradient(90deg,transparent,#000 4%,#000 96%,transparent)}
.streamTrack{display:flex;gap:0;width:max-content;animation:marquee 46s linear infinite}
.streamPanel:hover .streamTrack{animation-play-state:paused}
@keyframes marquee{to{transform:translateX(-50%)}}
.evItem{display:flex;align-items:center;gap:8px;padding:5px 22px 5px 0;font-size:12.5px;color:#c6dcf5;white-space:nowrap}
.evItem .dot{width:6px;height:6px;border-radius:50%;flex:none}
.evItem .et{color:var(--dk-ink3);font-family:var(--num-font);font-size:11.5px}
.tourBubble{position:absolute;left:24px;bottom:96px;z-index:6;width:348px;max-width:calc(100vw - 48px);
  display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border-radius:16px;
  background:linear-gradient(160deg,rgba(23,52,102,.9),rgba(8,20,44,.94));border:1px solid rgba(34,211,238,.5);
  box-shadow:0 22px 44px -14px rgba(0,0,0,.7),0 0 26px rgba(34,211,238,.22);animation:airIn .3s both}
.tourBubble img{width:46px;height:46px;border-radius:50%;object-fit:cover;object-position:top;flex:none;border:1.5px solid rgba(125,211,252,.6)}
.tourBubble .tt{font-size:12px;color:#7dd3fc;letter-spacing:.14em;margin-bottom:3px}
.tourBubble .tx{font-size:13px;color:#e6f1fd;line-height:1.65}
svg text{font-family:inherit}

/* 弹窗 / 提示 */
.modalMask{position:fixed;inset:0;background:rgba(8,24,50,.5);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:80;padding:16px}
.modal{background:#fff;border-radius:16px;max-width:760px;width:100%;max-height:88vh;overflow-y:auto;padding:24px 26px;box-shadow:0 24px 60px rgba(0,0,0,.3);animation:airIn .25s both}
.modal h3{font-size:17px;margin-bottom:12px;color:var(--blue-dark)}
.modal .x{float:right}
#toast{position:fixed;left:50%;bottom:34px;transform:translateX(-50%) translateY(20px);background:var(--blue-dark);color:#fff;
  padding:10px 22px;border-radius:99px;font-size:13.5px;opacity:0;pointer-events:none;transition:.25s;z-index:120;box-shadow:0 10px 28px rgba(0,0,0,.3)}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ============ 平板 770–1199px ============ */
@media (max-width:1199px) and (min-width:770px){
  .grid.c4{grid-template-columns:repeat(2,1fr)}
  .grid.c3{grid-template-columns:repeat(2,1fr)}
  .chatLayout{grid-template-columns:minmax(0,1fr) 300px}
  .sidebar{width:180px}
  .main{padding:20px 18px 52px}
  .loginInner{grid-template-columns:minmax(0,1fr) minmax(330px,400px);gap:34px;padding:48px 26px}
  .loginVisual h1{font-size:36px}
  .ipFigure.main img{width:142px;height:142px}.ipFigure.main .ipRing{width:178px;height:178px}
  .ipFigure.sub img{width:106px;height:106px}.ipFigure.sub .ipRing{width:136px;height:136px}
  .dashKpiBand{grid-template-columns:repeat(3,1fr)}
  .dashMain{grid-template-columns:250px minmax(0,1fr) 250px}
  #netCanvas{height:380px}
}
/* ============ 手机 <770px ============ */
@media (max-width:769px){
  .loginInner{grid-template-columns:1fr;gap:26px;padding:40px 18px 34px;min-height:0}
  .loginVisual{text-align:center}
  .loginVisual .org{letter-spacing:.34em}
  .loginVisual h1{font-size:29px}
  .lvSub{letter-spacing:.1em;font-size:12.5px}
  .ipStage{justify-content:center;gap:20px;margin:24px 0 4px}
  .ipFigure.main img{width:104px;height:104px}.ipFigure.main .ipRing{width:130px;height:130px}
  .ipFigure.sub{display:none}
  .loginStats{justify-content:center;margin-top:18px}
  .statItem{min-width:104px;padding:10px 12px 8px}
  .statItem .sv{font-size:20px}
  .loginPanel{padding:24px 20px 20px}
  .demoCorner{top:10px;right:12px}
  .topbar{padding:0 12px;gap:8px}
  .topbar>button{padding:4px 9px;font-size:11.5px}
  .topbar .demoBadge{display:none}
  .topbar .brand{font-size:14px}
  .topbar .brand span{display:none}
  .topbar .who{display:none}
  .shellBody{flex-direction:column}
  .sidebar{width:100%;border-right:none;border-bottom:1px solid var(--line);padding:8px 6px;display:flex;overflow-x:auto;gap:2px}
  .sidebar .roleLine{display:none}
  .navItem{width:auto;white-space:nowrap;border-left:none;padding:8px 12px}
  .navItem.on{background:var(--blue-soft)}
  .navItem.on::before{left:10px;right:10px;top:auto;bottom:0;width:auto;height:3px}
  .main{padding:16px 12px 52px}
  .grid.c2,.grid.c3,.grid.c4{grid-template-columns:1fr}
  .funnel{grid-template-columns:1fr}
  .chatLayout{grid-template-columns:1fr}
  .chatBox{height:70vh}
  .airFab{right:14px;bottom:14px;width:52px;height:52px}
  .airPanel{right:12px;left:12px;bottom:76px;width:auto;height:66vh}
  .stageRail{overflow-x:auto;padding-bottom:4px}
  /* 掌上驾驶舱：竖版单独布局，深色 */
  .dash{padding:14px 12px 30px}
  .dashTop h1{font-size:20px}
  .dashTop .dt-sub{font-size:11.5px}
  .dashKpiBand{grid-template-columns:repeat(2,1fr)}
  .dashKpiBand .dkpi:first-child{grid-column:1 / -1}
  .dkpi .k-value{font-size:24px}
  .dashMain{grid-template-columns:1fr}
  #netCanvas{height:320px}
  .tourBubble{left:12px;bottom:auto;top:118px;width:auto;right:12px;max-width:none}
  .modal{padding:18px 16px}
  table{font-size:12.5px}
  th,td{padding:7px 7px}
}

/* ============ 减动效 ============ */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation-duration:.001s !important;animation-iteration-count:1 !important;transition-duration:.001s !important}
  .streamTrack{animation:none}
  .streamMask{overflow-x:auto}
  .ipFigure .ipRing,.ipFigure .ipRing::after{animation:none}
}
