/* ======================================================================
   安知 · 公共扩展组件（在 app.css 之后加载）。页面专属样式请放 css/pages/*.css
   ====================================================================== */
[hidden]{display:none!important}
a{color:inherit;text-decoration:none}
a.nav-i{text-decoration:none}
.role a{display:contents}
.role button{border:0}
.pagebody{padding:14px 20px 28px}
.pagehead{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;padding:16px 20px 0}
.pagehead h2{font-size:20px;font-weight:700;letter-spacing:.02em}
.pagehead p{font-size:13.5px;color:var(--ink3);margin-top:3px}
.pagehead .f-r{margin-left:auto}
.s2{grid-column:span 2}.s6{grid-column:span 6}.s9{grid-column:span 9}.s10{grid-column:span 10}.s11{grid-column:span 11}
.mono-s{font-family:var(--mono);font-size:12px;color:var(--ink3)}
.muted{color:var(--ink3)}
.ink2{color:var(--ink2)}
.row{display:flex;align-items:center;gap:10px}
.wrap{flex-wrap:wrap}
.grow{flex:1;min-width:0}
.gap6{gap:6px}.gap14{gap:14px}
.mt8{margin-top:8px}.mt12{margin-top:12px}.mt16{margin-top:16px}
.right{margin-left:auto}
.col{display:flex;flex-direction:column;gap:10px}
.g2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
.g3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.g4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.sc-y{overflow-y:auto;scrollbar-width:thin}

/* 通知下拉 */
.bellwrap{position:relative}
.drop{position:absolute;right:0;top:42px;width:340px;max-height:420px;overflow:auto;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 18px 40px -12px rgba(16,40,80,.28);z-index:60}
.drop-h{font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--ink3);padding:10px 14px;border-bottom:1px solid var(--line2);text-transform:uppercase}
.drop-i{display:grid;grid-template-columns:8px minmax(0,1fr) auto;gap:10px;padding:10px 14px;border-bottom:1px solid var(--line2);align-items:start}
.drop-i:hover{background:#F5F9FF}
.drop-i i{width:7px;height:7px;border-radius:50%;margin-top:6px;background:var(--blue)}
.drop-i.warn i{background:var(--amber)}
.drop-i b{display:block;font-size:13.5px;font-weight:500;line-height:1.4}
.drop-i span{font-size:12px;color:var(--ink3)}
.drop-i time{font-size:11px;color:var(--ink4);font-family:var(--mono);white-space:nowrap}
.drop-empty{padding:22px;text-align:center;color:var(--ink3);font-size:13px}
.pill.warn{border-color:#FFE3B0;background:#FFF9EC;color:#B57300}
.top .me .ibtn{width:28px;height:28px;margin-left:2px}

/* 按钮 / 表单 */
.btn.sm{height:26px;padding:0 9px;font-size:12.5px}
.btn.lg{height:36px;padding:0 18px;font-size:14px}
.btn.danger:hover{border-color:var(--red);color:var(--red)}
.btn.ghost{border-color:transparent;background:transparent}
.btn.ghost:hover{background:var(--blue-50)}
.btn[disabled],.btn.off{opacity:.5;pointer-events:none}
.btn.busy{pointer-events:none;opacity:.75}
.btn.busy::after{content:'';width:12px;height:12px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin .7s linear infinite}
.inp,.ta,select.inp{width:100%;height:32px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:#fff;font-size:13.5px;outline:0;transition:.2s}
.ta{height:auto;padding:8px 10px;line-height:1.6;resize:vertical;min-height:72px}
.inp:focus,.ta:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(10,108,255,.12)}
.inp::placeholder,.ta::placeholder{color:var(--ink4)}
.lbl{display:block;font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;color:var(--ink3);text-transform:uppercase;margin:0 0 5px}
.field{margin-bottom:12px}
.chk{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;color:var(--ink2)}
.chk input{accent-color:var(--blue)}
.tagc{display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:4px;font-size:12px;background:var(--blue-50);color:var(--blue);white-space:nowrap}
.tagc.g{background:#E8F8F2;color:#0B9469}.tagc.a{background:#FFF6E3;color:#B57300}.tagc.r{background:#FFF0F0;color:var(--red)}
.tagc.p{background:#F2EEFF;color:#6A4FD8}.tagc.n{background:#F1F4F8;color:#55657D}.tagc.c{background:#E6F8FC;color:#0089A3}
.chips{display:flex;flex-wrap:wrap;gap:6px}
.chipb{height:26px;padding:0 11px;border:1px solid var(--line);border-radius:13px;background:#fff;font-size:13px;color:var(--ink2);transition:.2s;cursor:pointer}
.chipb:hover{border-color:var(--blue);color:var(--blue)}
.chipb.on{border-color:var(--blue);background:var(--blue-50);color:var(--blue);font-weight:600}

/* 空状态 / 加载 */
.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:30px 14px;color:var(--ink3);text-align:center;font-size:13px}
.empty b{color:var(--ink2);font-size:14px;font-weight:600}
.empty .eico{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;background:var(--blue-50);color:var(--blue)}
.skel{background:linear-gradient(90deg,#EEF2F8 25%,#F7F9FC 50%,#EEF2F8 75%);background-size:200% 100%;animation:skel 1.3s linear infinite;border-radius:4px;min-height:14px}
@keyframes skel{to{background-position:-200% 0}}
.spin{width:16px;height:16px;border:2px solid var(--blue);border-right-color:transparent;border-radius:50%;animation:spin .7s linear infinite;display:inline-block}

/* 弹窗 */
.modal-wrap{position:fixed;inset:0;z-index:200;background:rgba(14,26,43,.38);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;padding:24px;opacity:0;transition:opacity .2s}
.modal-wrap.show{opacity:1}
.modal{position:relative;width:min(760px,100%);max-height:88vh;overflow:auto;background:#fff;border-radius:6px;border:1px solid var(--line);box-shadow:0 30px 70px -20px rgba(16,40,80,.5);padding:20px 22px;transform:translateY(10px);transition:transform .25s}
.modal-wrap.show .modal{transform:none}
.modal.sm{width:min(400px,100%)}
.modal.lg{width:min(980px,100%)}
.modal-x{position:absolute;right:10px;top:8px;width:28px;height:28px;font-size:20px;color:var(--ink3);border-radius:6px}
.modal-x:hover{background:var(--bg);color:var(--ink)}
.mh{font-size:16px;font-weight:700;margin-bottom:12px;padding-right:30px;line-height:1.5}
.mf{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}

/* Markdown 渲染（AI 回答、综述） */
.md{font-size:14px;line-height:1.75;color:var(--ink)}
.md p{margin:0 0 8px}
.md h3,.md h4,.md h5,.md h6{font-size:14.5px;margin:12px 0 6px;font-weight:700}
.md ul,.md ol{margin:4px 0 8px 20px}
.md li{margin:2px 0}
.md code{font-family:var(--mono);font-size:12.5px;background:#F1F5FB;border:1px solid var(--line2);border-radius:3px;padding:0 4px}
.md pre.code{background:#0F1B2D;color:#D7E3F5;border-radius:6px;padding:10px 12px;overflow:auto;font-size:13px;margin:8px 0}
.md pre.code code{background:none;border:0;color:inherit;padding:0}
.md a{color:var(--blue);text-decoration:underline}
.mdtbl{border-collapse:collapse;margin:8px 0;font-size:13px;width:100%}
.mdtbl th,.mdtbl td{border:1px solid var(--line);padding:5px 8px;text-align:left}
.mdtbl th{background:#F5F9FF}
sup.cite{display:inline-block;min-width:15px;height:15px;line-height:15px;text-align:center;font-family:var(--mono);font-size:10.5px;font-weight:600;color:#fff;background:var(--blue);border-radius:4px;margin:0 1px;vertical-align:1px;cursor:pointer}
sup.cite:hover{background:var(--cyan)}

/* 表格 / 杂项 */
.tbl.auto{table-layout:auto}
.tbl.auto td{white-space:normal;height:auto;padding:8px 6px}
.pager{display:flex;align-items:center;gap:6px;justify-content:flex-end;padding-top:10px;font-size:13px;color:var(--ink3)}
.kv-list{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;font-size:13.5px}
.kv-list dt{color:var(--ink3)}
.divider{height:1px;background:var(--line2);margin:12px 0}
.hl{background:linear-gradient(transparent 60%,rgba(10,108,255,.18) 60%)}
.score-bar{height:4px;border-radius:2px;background:var(--line2);overflow:hidden}
.score-bar i{display:block;height:100%;background:linear-gradient(90deg,var(--blue),var(--cyan));border-radius:2px}
.demo-chip{display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:9px;font-size:11px;border:1px dashed #E0B565;color:#B57300;background:#FFFBF0;white-space:nowrap}

/* 提示条 / 演示账号 / 错误页（登录页主体样式在 css/pages/login.css） */
.demo-acc{margin-top:14px;padding-top:12px;border-top:1px dashed var(--line)}
.demo-acc .row{margin-top:6px;gap:6px}
.msg-err{background:#FFF0F0;color:var(--red);border:1px solid #FFD6D6;border-radius:6px;padding:7px 10px;font-size:13px;margin-bottom:12px}
.msg-ok{background:#E8F8F2;color:#0B9469;border:1px solid #BFEBD9;border-radius:6px;padding:7px 10px;font-size:13px;margin-bottom:12px}
.err-page{min-height:100vh;display:grid;place-items:center;text-align:center;position:relative;z-index:1}
.err-page b{display:block;font-family:var(--mono);font-size:72px;letter-spacing:.04em;line-height:1;
  background:linear-gradient(100deg,var(--blue) 30%,var(--cyan) 50%,var(--blue) 70%);background-size:220% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:brandShine 6s ease-in-out infinite}
.err-page .err-k{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.3em;color:var(--ink3);margin-bottom:8px}
.err-page > div{position:relative;padding:28px 44px;border:1px solid var(--line);border-radius:4px;background:rgba(255,255,255,.88);box-shadow:0 24px 60px -30px rgba(16,40,80,.35)}
.err-page p{color:var(--ink2);margin:10px 0 18px}

/* ======================================================================
   动效层 FX（base.html 的 <html class="fx"> 打开；登录页不加载）
   原则：只动 transform / opacity / 背景位置；悬停效果只作用于当前元素；
   prefers-reduced-motion 时全部静止（见文件末尾）。
   ====================================================================== */
@property --fx-a{syntax:'<angle>';inherits:false;initial-value:0deg}
@property --fx-c{syntax:'<length>';inherits:false;initial-value:10px}
/* 指针坐标只写在当前悬停的面板上；注册为不继承，避免整棵子树重算样式，伪元素用 inherit 显式取值 */
@property --mx{syntax:'<length>';inherits:false;initial-value:-999px}
@property --my{syntax:'<length>';inherits:false;initial-value:-999px}

/* ---- 面板入场：错峰 淡入 + 上移 + 轻微去模糊（blur 只在前半程，结束后不留 filter） ---- */
.fx .rise{animation:fxRise .8s cubic-bezier(.2,.7,.2,1) forwards;animation-delay:var(--d,0s)}
@keyframes fxRise{0%{opacity:0;transform:translateY(14px) scale(.988);filter:blur(3px)}55%{filter:blur(0)}100%{opacity:1;transform:none;filter:none}}

/* ---- 面板悬停：HUD 角标展开 + 边框流光环绕 + 指针跟随的边框高光（只在悬停面板上绘制） ---- */
.fx .panel::before{content:'';position:absolute;inset:0;z-index:3;pointer-events:none;border-radius:inherit;padding:1.5px;opacity:0;
  --hc:var(--fx-hc,var(--blue));--mx:inherit;--my:inherit;
  background:
   linear-gradient(var(--hc),var(--hc)) 0 0/var(--fx-c) 1.5px no-repeat,
   linear-gradient(var(--hc),var(--hc)) 0 0/1.5px var(--fx-c) no-repeat,
   linear-gradient(var(--hc),var(--hc)) 100% 0/var(--fx-c) 1.5px no-repeat,
   linear-gradient(var(--hc),var(--hc)) 100% 0/1.5px var(--fx-c) no-repeat,
   linear-gradient(var(--hc),var(--hc)) 0 100%/var(--fx-c) 1.5px no-repeat,
   linear-gradient(var(--hc),var(--hc)) 0 100%/1.5px var(--fx-c) no-repeat,
   linear-gradient(var(--hc),var(--hc)) 100% 100%/var(--fx-c) 1.5px no-repeat,
   linear-gradient(var(--hc),var(--hc)) 100% 100%/1.5px var(--fx-c) no-repeat,
   radial-gradient(220px circle at var(--mx) var(--my),rgba(10,108,255,.55),transparent 70%),
   conic-gradient(from var(--fx-a),transparent 0 62%,rgba(0,184,217,.0) 64%,rgba(0,184,217,.85) 82%,var(--hc) 92%,transparent 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;
          mask:linear-gradient(#000 0 0) content-box exclude,linear-gradient(#000 0 0);
  transition:opacity .3s,--fx-c .35s cubic-bezier(.3,.8,.3,1)}
.fx .panel:hover::before{opacity:1;--fx-c:24px;animation:fxOrbit 3.2s linear infinite}
@keyframes fxOrbit{to{--fx-a:360deg}}
.fx .kpi.alert{--fx-hc:var(--red)}
.fx .panel .ph .eb b{transition:letter-spacing .3s,color .3s}
.fx .panel:hover .ph .eb b{color:var(--cyan)}
/* 眉标前的小菱形放在面板左内边距里（绝对定位，不占眉标宽度） */
.fx .panel .ph .eb::before{content:'';position:absolute;left:5px;width:4px;height:4px;background:var(--blue);opacity:0;transform:rotate(45deg) scale(.4);transition:opacity .3s,transform .3s}
.fx .panel:hover .ph .eb::before{opacity:1;transform:rotate(45deg) scale(1);box-shadow:0 0 6px var(--blue)}

/* 空状态图标：外圈缓慢扩散，提示“这里等待数据” */
.fx .empty .eico{position:relative}
.fx .empty .eico::after{content:'';position:absolute;inset:-1px;border-radius:13px;border:1px solid rgba(10,108,255,.35);animation:emptyPing 2.8s ease-out infinite}
@keyframes emptyPing{0%{transform:scale(1);opacity:.9}100%{transform:scale(1.45);opacity:0}}
.ph .eb.fx-ov{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 26px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 26px),transparent)}

/* ---- KPI：迷你折线跟随面板延迟描线、面积渐显；数字跳动高亮 ---- */
.fx .sl{animation-delay:calc(var(--d,0s) + .35s)}
.fx .spark path:not(.sl){animation:fxFade 1.2s ease both;animation-delay:calc(var(--d,0s) + .6s)}
@keyframes fxFade{from{opacity:0}}
.fx .kv .num.tick{text-shadow:0 0 12px rgba(10,108,255,.35)}
.fx .kpi .spark{filter:drop-shadow(0 3px 4px rgba(10,108,255,.12))}

/* ---- 按钮：悬停光泽扫过 + 点击涟漪（涟漪容器由 app.js 注入，自带裁剪，不影响徽标外溢） ---- */
.fx .btn{position:relative;isolation:isolate}
.fx .btn::before{content:'';position:absolute;inset:0;z-index:-1;border-radius:inherit;pointer-events:none;
  background:linear-gradient(110deg,transparent 32%,rgba(10,108,255,.13) 46%,rgba(0,184,217,.12) 52%,transparent 66%) no-repeat;
  background-size:260% 100%;background-position:100% 0;transition:background-position .75s cubic-bezier(.2,.7,.2,1)}
.fx .btn.pri::before{background-image:linear-gradient(110deg,transparent 32%,rgba(255,255,255,.42) 47%,rgba(255,255,255,.16) 53%,transparent 66%)}
.fx .btn:hover::before{background-position:0 0}
.fx .btn.pri:hover{box-shadow:0 8px 20px -8px rgba(10,108,255,.75)}
.fx .btn:active{transform:translateY(1px)}
.fx-rw{position:absolute!important;inset:0;display:block!important;margin:0!important;padding:0!important;border-radius:inherit;overflow:hidden;pointer-events:none;z-index:4}
.fx-rp{position:absolute;border-radius:50%;background:currentColor;opacity:.24;transform:scale(0);animation:fxRipple .6s cubic-bezier(.2,.7,.3,1) forwards}
@keyframes fxRipple{to{transform:scale(1);opacity:0}}
.fx .ibtn:hover{box-shadow:0 6px 14px -8px rgba(10,108,255,.55)}
.fx .ibtn .n{animation:bdPulse 2.6s ease-out infinite}
.fx .chipb,.fx .seg button,.fx .tabs button{position:relative}

/* ---- 骨架屏：占位行纹理 + 斜向流光 ---- */
.skel{position:relative;overflow:hidden;animation:none;
  background:repeating-linear-gradient(180deg,#EDF2F8 0 14px,rgba(237,242,248,.35) 14px 22px),#F4F7FB}
.skel::after{content:'';position:absolute;inset:0;transform:translateX(-100%);pointer-events:none;
  background:linear-gradient(100deg,transparent 20%,rgba(255,255,255,.9) 45%,rgba(214,230,255,.7) 52%,transparent 75%);animation:fxSkel 1.6s cubic-bezier(.4,0,.2,1) infinite}
.skel::before{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:linear-gradient(var(--blue),var(--cyan));opacity:.35}
@keyframes fxSkel{to{transform:translateX(100%)}}

/* ---- 顶部加载进度条（app.js 注入 #azProg） ---- */
.az-prog{position:fixed;left:0;top:0;z-index:400;height:2px;width:0;pointer-events:none;opacity:0;
  background:linear-gradient(90deg,rgba(0,184,217,0),var(--cyan) 30%,var(--blue));box-shadow:0 0 10px rgba(10,108,255,.55);
  transition:width .5s cubic-bezier(.2,.7,.2,1),opacity .35s}
.az-prog.run{opacity:1}
.az-prog::after{content:'';position:absolute;right:-2px;top:-3px;width:90px;height:8px;border-radius:50%;
  background:radial-gradient(closest-side,rgba(0,184,217,.85),rgba(10,108,255,.25) 60%,transparent);filter:blur(1px)}

/* ---- 侧栏：悬停滑块 + 当前项指示条（跨页从上一项滑到当前项） ---- */
.fx .app > .side .nav-i{z-index:1}
.fx .app > .side .nav-glide{position:absolute;left:0;top:0;z-index:0;border-radius:6px;pointer-events:none;opacity:0;
  background:linear-gradient(90deg,#EAF2FF,#F5F9FF);box-shadow:inset 0 0 0 1px rgba(10,108,255,.12);
  transition:transform .3s cubic-bezier(.3,.8,.3,1),width .3s,height .3s,opacity .2s}
.fx .app > .side .nav-glide.on{opacity:1}
.fx .app > .side .nav-bar{position:absolute;left:0;top:0;z-index:2;width:3px;border-radius:0 3px 3px 0;pointer-events:none;
  background:linear-gradient(var(--blue),var(--cyan));box-shadow:0 0 10px rgba(10,108,255,.8),0 0 2px var(--blue);
  transition:transform .6s cubic-bezier(.3,.85,.2,1),height .6s cubic-bezier(.3,.85,.2,1)}
.fx .app > .side .nav-bar.no-t{transition:none}
.fx .app > .side.glide-on .nav-i.on::before{display:none}
.fx .app > .side.glide-on .nav-i:not(.on):hover{background:transparent}

/* ---- 顶栏：搜索框聚焦扫描线、时钟、状态胶囊 ---- */
.fx .search{position:relative;overflow:hidden}
.fx .search::after{content:'';position:absolute;left:0;right:0;bottom:0;height:1.5px;pointer-events:none;opacity:0;
  background:linear-gradient(90deg,transparent,var(--blue),var(--cyan),transparent) no-repeat;background-size:40% 100%;transition:opacity .2s}
.fx .search:focus-within::after{opacity:1;animation:scanx 2.2s linear infinite}
.fx .search:focus-within svg{stroke:var(--blue)}
.fx .clock b{background:linear-gradient(180deg,var(--ink),#36507A);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.fx .pill{position:relative;overflow:hidden}
.fx .pill::after{content:'';position:absolute;inset:0;pointer-events:none;background:linear-gradient(105deg,transparent 35%,rgba(255,255,255,.75) 50%,transparent 65%);transform:translateX(-120%);animation:sheen 8s ease-in-out 2s infinite}
.fx .role .ind{background:linear-gradient(135deg,var(--blue),#2C86FF 60%,var(--cyan))}

/* ---- 底部告警条：斜纹流动标签、发光分隔、均衡器 ---- */
.fx .ticker{background:linear-gradient(180deg,rgba(255,255,255,.95),rgba(246,249,253,.95));box-shadow:0 -8px 24px -18px rgba(16,40,80,.35)}
.fx .ticker::before{content:'';position:absolute;left:0;right:0;top:-1px;height:1px;z-index:2;pointer-events:none;
  background:linear-gradient(90deg,transparent,var(--cyan),var(--blue),transparent) no-repeat;background-size:24% 100%;animation:scanx 9s linear infinite}
.fx .ticker .tk-l{isolation:isolate;text-shadow:0 0 8px rgba(255,255,255,.35)}
.fx .ticker .tk-l::before{content:'';position:absolute;inset:0;z-index:-1;
  background:repeating-linear-gradient(-45deg,rgba(255,255,255,.13) 0 6px,transparent 6px 12px);background-size:17px 17px;animation:tkStripe 1.4s linear infinite}
@keyframes tkStripe{to{background-position:17px 0}}
.fx .tk-item{position:relative;transition:background .2s}
.fx .tk-item:hover{background:linear-gradient(180deg,transparent,rgba(10,108,255,.06))}
.fx .tk-item:hover::after{content:'';position:absolute;left:18px;right:18px;bottom:0;height:2px;border-radius:1px;background:linear-gradient(90deg,var(--blue),var(--cyan))}
.fx .tk-item .k{box-shadow:inset 0 0 0 1px color-mix(in srgb,currentColor 28%,transparent)}
.fx .tk-item .k.w{animation:tkWarn 2.4s ease-in-out infinite}
@keyframes tkWarn{50%{background:#FFE1E1}}
.eq{display:inline-flex;align-items:flex-end;gap:2px;height:12px;margin-right:4px}
.eq i{display:block;width:2px;height:100%;border-radius:1px;background:linear-gradient(var(--cyan),var(--blue));transform-origin:bottom;animation:eqB 1.1s ease-in-out infinite}
.eq i:nth-child(2){animation-delay:-.3s}.eq i:nth-child(3){animation-delay:-.6s}.eq i:nth-child(4){animation-delay:-.15s}.eq i:nth-child(5){animation-delay:-.45s}
@keyframes eqB{0%,100%{transform:scaleY(.3)}50%{transform:scaleY(1)}}

/* ---- 吐司：弹性入场 + 状态色 + 剩余时间条 ---- */
.fx .toast{min-width:220px;max-width:min(560px,80vw);padding:10px 18px 12px 14px;border:1px solid rgba(255,255,255,.08);
  background:linear-gradient(135deg,rgba(14,26,43,.96),rgba(22,40,66,.96));box-shadow:0 18px 40px -14px rgba(8,20,40,.55),inset 0 1px 0 rgba(255,255,255,.06);
  transform:translate(-50%,24px) scale(.94);transition:transform .45s cubic-bezier(.2,1.35,.4,1),opacity .25s;overflow:hidden}
.fx .toast.show{transform:translate(-50%,0) scale(1)}
.fx .toast span{line-height:1.5}
.fx .toast i{position:relative;flex:none;width:8px;height:8px;box-shadow:0 0 0 3px rgba(0,184,217,.18)}
.fx .toast.show i{animation:toastDot 1.4s ease-out infinite}
@keyframes toastDot{0%{box-shadow:0 0 0 0 rgba(0,184,217,.55)}100%{box-shadow:0 0 0 8px rgba(0,184,217,0)}}
.fx .toast.ok i{background:var(--green)}.fx .toast.err i{background:var(--red)}.fx .toast.warn i{background:var(--amber)}
.toast .tbar{position:absolute;left:0;bottom:0;height:2px;width:100%;transform-origin:left;transform:scaleX(0);text-decoration:none;
  background:linear-gradient(90deg,var(--cyan),var(--blue))}
.toast.err .tbar{background:linear-gradient(90deg,#FF8A8A,var(--red))}
.toast.show .tbar{animation:toastBar var(--tdur,2.6s) linear forwards}
@keyframes toastBar{from{transform:scaleX(1)}to{transform:scaleX(0)}}

/* ---- 其它细节：表格行悬停指示、下拉、弹窗入场 ---- */
.fx .tbl tbody tr:hover td:first-child{box-shadow:inset 2px 0 0 var(--blue)}
.fx .drop{animation:fxDrop .22s cubic-bezier(.2,.8,.3,1)}
@keyframes fxDrop{from{opacity:0;transform:translateY(-6px) scale(.98)}}
.fx .modal{transform:translateY(14px) scale(.98)}
.fx .modal-wrap.show .modal{transform:none}
.fx .modal::before{content:'';position:absolute;left:0;top:0;right:0;height:2px;background:linear-gradient(90deg,var(--blue),var(--cyan))}

@media (prefers-reduced-motion:reduce){
  .bg .grid::before,.bg .g3,.top::before,.brand b,.brand .logo-w::before,.brand .logo-w::after,.fx .ticker .tk-l::before,.eq i,.fx .pill::after{animation:none!important}
  .bg canvas.fxc,.bg .spot,.fx .panel::before,.az-prog{display:none!important}
  .fx .rise{filter:none!important}
}
