/* ============================================================
   虾咪儿AI · 设计系统 · 黑色夜间模式  (Generated by Trae Work)
   ============================================================ */
:root{
  color-scheme:dark;
  --violet:#a78bfa; --violet-600:#8b5cf6; --indigo:#818cf8; --fuchsia:#f472b6;
  --blue:#60a5fa; --emerald:#34d399; --teal:#2dd4bf; --amber:#fbbf24; --rose:#fb7185;
  --ink:#f1f1f7; --ink-2:#c3c3d4; --muted:#8e8ea2; --faint:#62627a;
  --line:#282838; --line-2:#20202e;
  --bg:#0a0a12; --panel:#15151f; --soft:#1c1c29; --soft-2:#242434;
  --sidebar:#0e0e18;
  --solid:#f2f2f7; --solid-fg:#14141a;
  --violet-soft:rgba(139,92,246,.15);
  --grad:linear-gradient(135deg,#8b5cf6 0%,#6366f1 50%,#ec4899 100%);
  --grad-canvas:linear-gradient(135deg,#7c3aed 0%,#4f46e5 55%,#2563eb 100%);
  --grad-seed:linear-gradient(135deg,#059669 0%,#0d9488 55%,#0891b2 100%);
  --shadow-sm:0 1px 2px rgba(0,0,0,.4),0 1px 3px rgba(0,0,0,.3);
  --shadow:0 10px 28px -12px rgba(0,0,0,.65),0 2px 6px rgba(0,0,0,.4);
  --shadow-lg:0 28px 70px -22px rgba(0,0,0,.8),0 10px 26px -12px rgba(0,0,0,.55);
  --r-sm:10px; --r:14px; --r-lg:20px; --r-xl:26px;
  --text:#f1f1f7; --border:#282838; --accent:#a78bfa; --bg1:#15151f;
  --font:"Inter","PingFang SC","Microsoft YaHei",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font-family:var(--font); color:var(--ink); background:var(--bg);
  font-size:15px; line-height:1.6; -webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
input,textarea,select{font-family:inherit;font-size:inherit;color:inherit}
::placeholder{color:var(--faint)}
::selection{background:rgba(139,92,246,.35);color:#fff}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:#2e2e42;border-radius:99px;border:2px solid transparent;background-clip:content-box}
::-webkit-scrollbar-thumb:hover{background:#3d3d56;background-clip:content-box}
::-webkit-scrollbar-track{background:transparent}

/* 图标 */
[data-icon]{display:inline-flex;align-items:center;justify-content:center;width:1.15em;height:1.15em;flex:none}
[data-icon] svg{width:100%;height:100%;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.btn svg,.icon-btn svg,.dock-btn svg,.mini-btn svg,.credits-btn svg,.model-select svg,.suggest-chip svg,.section-head svg{stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}

/* ============ 布局 ============ */
.app{display:grid;grid-template-columns:264px 1fr;height:100vh;overflow:hidden}
.main{display:flex;flex-direction:column;min-width:0;height:100vh;overflow:hidden}

/* ============ 侧边栏 ============ */
.sidebar{background:var(--sidebar);border-right:1px solid var(--line);position:relative;top:0;height:100vh;overflow:hidden;flex-shrink:0}
.sidebar-inner{display:flex;flex-direction:column;height:100%;padding:18px 14px}
.brand{display:flex;align-items:center;gap:11px;padding:6px 8px 16px}
.brand-logo{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;color:#fff}
.brand-logo img{width:100%;height:100%;object-fit:contain;border-radius:11px;mix-blend-mode:multiply;filter:brightness(1.2) contrast(1.15) saturate(1.2)}
.brand-logo svg{width:19px;height:19px;stroke:#fff;fill:rgba(255,255,255,.25);stroke-width:1.6}
.brand-logo.lg{width:56px;height:56px;border-radius:18px}
.brand-logo.lg img{border-radius:18px}
.brand-logo.lg svg{width:30px;height:30px}
.brand-name{font-size:19px;font-weight:800;letter-spacing:.5px}
.brand-name em{font-style:normal;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}

.new-chat-btn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:11px;border-radius:13px;
  background:var(--solid);color:var(--solid-fg);font-weight:600;font-size:14px;margin-bottom:16px;transition:.18s}
.new-chat-btn:hover{background:#dcdce8;transform:translateY(-1px)}
.new-chat-btn svg{width:17px;height:17px}

.nav{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:2px;margin:-2px -4px;padding:0 4px}
.nav-group{font-size:11px;font-weight:700;letter-spacing:1.5px;color:var(--faint);text-transform:uppercase;padding:14px 10px 6px}
.nav-item{display:flex;align-items:center;gap:11px;padding:9px 11px;border-radius:11px;color:var(--ink-2);font-size:14px;font-weight:500;transition:.15s;position:relative}
.nav-item svg{width:18px;height:18px;color:var(--muted);transition:.15s}
.nav-item:hover{background:var(--soft-2);color:var(--ink)}
.nav-item:hover svg{color:var(--violet)}
.nav-item.active{background:var(--panel);color:var(--violet);font-weight:600;box-shadow:var(--shadow-sm);border:1px solid var(--line)}
.nav-item.active svg{color:var(--violet)}
.nav-tag{margin-left:auto;font-size:10px;font-weight:700;color:#fff;background:var(--fuchsia);padding:1px 7px;border-radius:99px;line-height:1.6}
.nav-tag.green{background:var(--emerald);color:#06281f}
.nav-badge{margin-left:auto;min-width:18px;height:18px;padding:0 5px;font-size:11px;font-weight:700;color:#fff;background:var(--violet);border-radius:9px;display:flex;align-items:center;justify-content:center;line-height:1}
.nav-badge.running{background:var(--fuchsia);animation:pulse 2s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.6}}

/* 侧栏折叠按钮 */
.sb-collapse{display:flex;align-items:center;gap:11px;width:100%;padding:10px 11px;border-radius:11px;color:var(--muted);font-size:13.5px;font-weight:600;transition:.15s;margin-top:8px;flex:none}
.sb-collapse:hover{background:var(--soft-2);color:var(--ink)}
.sb-collapse svg{width:18px;height:18px;flex:none;transition:transform .25s,color .15s}
.sb-collapse:hover svg{color:var(--violet)}

/* 桌面端折叠为图标栏 */
@media (min-width:981px){
  .app{transition:grid-template-columns .25s ease}
  .app.sb-collapsed{grid-template-columns:78px 1fr}
  .app.sb-collapsed .sidebar-inner{padding:16px 0;align-items:center}
  .app.sb-collapsed .brand{justify-content:center;padding:4px 0 14px;width:100%}
  .app.sb-collapsed .new-chat-btn{width:48px;height:48px;padding:0;border-radius:14px;margin:0 auto 14px;gap:0}
  .app.sb-collapsed .new-chat-btn svg{width:21px;height:21px;stroke:var(--solid-fg)}
  .app.sb-collapsed .nav{margin:0;padding:0;align-items:center;width:100%;gap:6px}
  .app.sb-collapsed .nav-item{justify-content:center;padding:0;width:48px;height:48px;gap:0;border-radius:14px;margin:0 auto;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.07)}
  .app.sb-collapsed .nav-item svg{width:21px;height:21px;margin:0;color:var(--ink-2)}
  /* 折叠态图标高亮：悬停与选中 */
  .app.sb-collapsed .nav-item:hover{background:var(--soft-2);border-color:rgba(167,139,250,.4)}
  .app.sb-collapsed .nav-item:hover svg{color:var(--violet)}
  .app.sb-collapsed .nav-item.active{background:var(--grad);border-color:transparent;box-shadow:0 8px 20px -8px rgba(139,92,246,.7)}
  .app.sb-collapsed .nav-item.active svg{color:#fff}
  /* 展开按钮：始终清晰可见 */
  .app.sb-collapsed .sb-collapse{justify-content:center;width:48px;height:48px;padding:0;margin:10px auto 0;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:14px;color:var(--ink)}
  .app.sb-collapsed .sb-collapse:hover{background:var(--grad);border-color:transparent;color:#fff}
  .app.sb-collapsed .sb-collapse svg{width:21px;height:21px;transform:rotate(180deg);color:inherit}
  .app.sb-collapsed .ni-text,.app.sb-collapsed .ncb-text,.app.sb-collapsed .nav-group,.app.sb-collapsed .nav-tag{display:none}

  /* 折叠态悬停文字气泡（标明按钮用途） */
  .app.sb-collapsed .brand,
  .app.sb-collapsed .new-chat-btn,
  .app.sb-collapsed .nav-item,
  .app.sb-collapsed .sb-collapse{position:relative}
  .app.sb-collapsed .brand::after,
  .app.sb-collapsed .new-chat-btn::after,
  .app.sb-collapsed .nav-item::after,
  .app.sb-collapsed .sb-collapse::after{
    content:attr(title);
    position:absolute;left:calc(100% + 14px);top:50%;
    transform:translateY(-50%) translateX(-6px);
    background:#20202e;color:var(--ink);font-size:13px;font-weight:600;white-space:nowrap;
    padding:8px 13px;border-radius:10px;border:1px solid var(--line);
    box-shadow:var(--shadow);opacity:0;visibility:hidden;pointer-events:none;
    transition:opacity .16s,transform .16s,visibility .16s;z-index:200;
  }
  .app.sb-collapsed .brand::before,
  .app.sb-collapsed .new-chat-btn::before,
  .app.sb-collapsed .nav-item::before,
  .app.sb-collapsed .sb-collapse::before{
    content:"";position:absolute;left:calc(100% + 8px);top:50%;transform:translateY(-50%);
    border:6px solid transparent;border-right-color:#20202e;
    opacity:0;visibility:hidden;pointer-events:none;transition:.16s;z-index:200;
  }
  .app.sb-collapsed .brand:hover::after,
  .app.sb-collapsed .new-chat-btn:hover::after,
  .app.sb-collapsed .nav-item:hover::after,
  .app.sb-collapsed .sb-collapse:hover::after,
  .app.sb-collapsed .brand:hover::before,
  .app.sb-collapsed .new-chat-btn:hover::before,
  .app.sb-collapsed .nav-item:hover::before,
  .app.sb-collapsed .sb-collapse:hover::before{opacity:1;visibility:visible;transform:translateY(-50%) translateX(0)}
}

.sidebar-foot{margin-top:10px;display:flex;flex-direction:column;gap:10px}
.credits-card{background:linear-gradient(135deg,rgba(139,92,246,.16),rgba(236,72,153,.1));border:1px solid #2e2a48;border-radius:16px;padding:13px}
.credits-top{display:flex;align-items:center;gap:11px}
.credits-ico{width:36px;height:36px;border-radius:11px;background:var(--panel);color:var(--amber);display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow-sm)}
.credits-ico svg{width:19px;height:19px}
.credits-num{font-size:19px;font-weight:800;line-height:1.1}
.credits-label{font-size:11px;color:var(--muted)}
.credits-btn{margin-top:11px;width:100%;padding:8px;border-radius:10px;background:var(--grad);color:#fff;font-size:13px;font-weight:600;transition:.18s}
.credits-btn:hover{filter:brightness(1.1)}
.user-box{}
.user-btn{width:100%;display:flex;align-items:center;gap:11px;padding:9px 10px;border-radius:12px;transition:.15s}
.user-btn:hover{background:var(--soft-2)}
.avatar{width:36px;height:36px;border-radius:50%;background:rgba(139,92,246,.2);color:var(--violet);display:flex;align-items:center;justify-content:center;flex:none}
.avatar svg{width:19px;height:19px}
.avatar.sm{width:30px;height:30px}
.avatar.sm svg{width:16px;height:16px}
.user-meta{display:flex;flex-direction:column;align-items:flex-start;min-width:0;text-align:left}
.user-name{font-size:14px;font-weight:600}
.user-sub{font-size:11.5px;color:var(--muted)}
.user-btn>span:last-child{margin-left:auto;color:var(--faint)}
.user-btn>span:last-child svg{width:16px;height:16px}

/* ============ 顶栏 ============ */
.topbar{height:60px;flex:none;display:flex;align-items:center;gap:14px;padding:0 22px;background:#0e0e18;border-bottom:1px solid var(--line);position:relative;z-index:30}
.topbar-title{font-weight:700;font-size:15px}
.topbar-right{margin-left:auto;display:flex;align-items:center;gap:8px}
.price-chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--amber);background:rgba(245,158,11,.12);border:1px solid rgba(245,158,11,.32);padding:5px 11px;border-radius:99px}
.price-chip svg{width:13px;height:13px}
.icon-btn{width:38px;height:38px;border-radius:11px;display:inline-flex;align-items:center;justify-content:center;color:var(--ink-2);transition:.15s}
.icon-btn:hover{background:var(--soft-2)}
.icon-btn svg{width:20px;height:20px}
.menu-btn{display:none}

/* ============ 按钮 ============ */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:11px 18px;border-radius:13px;font-weight:600;font-size:14px;transition:.18s;border:1px solid transparent;white-space:nowrap}
.btn svg{width:17px;height:17px}
.btn.sm{padding:8px 14px;font-size:13px;border-radius:11px}
.btn-primary{background:var(--solid);color:var(--solid-fg)}
.btn-primary:hover{background:#dcdce8}
.btn-gradient{background:var(--grad);color:#fff;box-shadow:0 10px 22px -10px rgba(124,58,237,.7)}
.btn-gradient:hover{filter:brightness(1.1);transform:translateY(-1px)}
.btn-ghost{background:var(--panel);border-color:var(--line);color:var(--ink-2)}
.btn-ghost:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.btn-soft{background:var(--violet-soft);color:var(--violet)}
.btn-soft:hover{background:rgba(139,92,246,.26)}
.btn.block{width:100%;margin-top:6px}
.btn:disabled{opacity:.55;cursor:not-allowed}

/* ============ 视图容器 ============ */
.view{flex:1;min-height:0;padding:26px 30px 60px;max-width:1200px;width:100%;margin:0 auto;overflow:auto}
.view.view-home{padding:0;max-width:none;margin:0;overflow:hidden;display:flex;flex-direction:column;flex:1;min-height:0}
.page-head{margin-bottom:22px}
.page-title{font-size:24px;font-weight:800;letter-spacing:.3px;display:flex;align-items:center;gap:11px}
.page-title .pt-ico{width:38px;height:38px;border-radius:12px;background:var(--grad);color:#fff;display:inline-flex;align-items:center;justify-content:center}
.page-title .pt-ico svg{width:20px;height:20px}
.page-desc{color:var(--muted);font-size:14px;margin-top:7px;max-width:680px}

/* ============ 首页 / 星聊 ============ */
.chat-wrap{max-width:820px;margin:0 auto;display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden;position:relative}
.chat-scroll{flex:1;overflow-y:auto;padding:26px 20px 20px 4px;min-height:0;scrollbar-width:none}
.chat-scroll::-webkit-scrollbar{display:none}
/* 右侧点导航（2026-10-01，替代原生滚动条视觉）：每个点=一次对话发起（用户消息），
   点击跳转、当前视口高亮；点数多时限高自适应均匀分布。
   消息文字绝不进点列轨道：.chat-scroll 右内边距 20px 为点列预留（点列贴 right:2px 叠上层） */
.chat-dots{position:absolute;right:2px;top:50%;transform:translateY(-50%);max-height:58vh;display:none;flex-direction:column;justify-content:space-evenly;gap:6px;z-index:5}
.chat-dots.show{display:flex}
.chat-dot{width:6px;height:6px;border-radius:50%;border:0;padding:0;background:rgba(231,231,239,.22);cursor:pointer;transition:transform .15s ease,background .15s ease,box-shadow .15s ease;flex:0 0 auto}
.chat-dot:hover{background:rgba(231,231,239,.55);transform:scale(1.5)}
.chat-dot.active{background:#fff;box-shadow:0 0 6px rgba(255,255,255,.65);transform:scale(1.35)}
.welcome{text-align:center;padding:26px 0 10px}
.welcome-logo{width:64px;height:64px;border-radius:20px;background:var(--grad);margin:0 auto 18px;display:flex;align-items:center;justify-content:center;color:#fff;box-shadow:0 16px 36px -14px rgba(124,58,237,.7)}
.welcome-logo svg{width:34px;height:34px;stroke:#fff;fill:rgba(255,255,255,.2)}
.welcome h1{font-size:27px;font-weight:800;letter-spacing:.5px}
.welcome h1 em{font-style:normal;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
.welcome p{color:var(--muted);margin-top:9px;font-size:15px}

/* 极简首页 */
.home-simple .chat-scroll{padding:26px 20px 20px 4px}
.home-simple .chat-scroll:has(.welcome-simple){display:flex;align-items:center;justify-content:center;padding:0}
.home-simple .chat-scroll:not(:has(.welcome-simple)){display:block}
.welcome-simple{text-align:center;width:100%}
.welcome-logo-big{width:120px;height:120px;margin:0 auto 28px;display:flex;align-items:center;justify-content:center;background:transparent}
/* 品牌图标 XME：白底黑字方形圆角，紫色投影贴合深色主题（旧 logo.png 用 mix-blend-mode:multiply 在深底上发黑，已弃用） */
.welcome-logo-big .xme-logo{width:104px;height:104px;display:block;filter:drop-shadow(0 14px 34px rgba(139,92,246,.30)) drop-shadow(0 4px 10px rgba(0,0,0,.35))}
.welcome-simple .welcome-title{font-size:42px;font-weight:800;letter-spacing:1px}
.welcome-simple .welcome-title em{font-style:normal;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
.welcome-simple .welcome-sub{color:var(--muted);margin-top:14px;font-size:17px;line-height:1.7}

/* 首页左右两栏布局 */
.home-layout{display:flex;height:100%;min-height:0;gap:0;margin:0;padding:0}
.chat-sidebar{width:280px;flex-shrink:0;flex-basis:280px;border:none;display:flex;flex-direction:column;background:rgba(255,255,255,.02);position:relative;transition:width .3s cubic-bezier(.4,0,.2,1);overflow:hidden;height:100%;margin:0;padding:0}
.chat-sidebar.collapsed{width:64px;flex-basis:64px}
.sidebar-top-bar{flex-shrink:0}
.chat-sidebar.collapsed .ncb-text,
.chat-sidebar.collapsed .ci-body,
.chat-sidebar.collapsed .ci-time,
.chat-sidebar.collapsed .cgt-text,
.chat-sidebar.collapsed .stb-text,
.chat-sidebar.collapsed .ncb-text{display:none}
.chat-sidebar.collapsed .sidebar-top-bar{flex-direction:column;padding:10px 6px;gap:6px}
.chat-sidebar.collapsed .sidebar-toggle-btn,
.chat-sidebar.collapsed .new-chat-btn-sidebar{margin:0;padding:10px;justify-content:center;width:auto}
.chat-sidebar.collapsed .chat-item{justify-content:center;padding:10px 6px}
.chat-sidebar.collapsed .chat-group-title{justify-content:center;padding:12px 6px 6px}
.sidebar-top-bar{display:flex;flex-direction:column;gap:6px;padding:10px 10px 6px}
.sidebar-toggle-btn{padding:8px 14px;border-radius:var(--r-md);background:rgba(255,255,255,.06);color:var(--muted);border:1px solid var(--border);cursor:pointer;font-size:13px;font-weight:500;display:flex;align-items:center;justify-content:center;gap:6px;transition:.2s}
.sidebar-toggle-btn:hover{background:rgba(255,255,255,.1);color:#fff;border-color:var(--purple)}
.sidebar-toggle-btn svg{width:16px;height:16px;stroke:currentColor}
.chat-sidebar.collapsed .sidebar-toggle-btn svg{transform:rotate(180deg)}
.chat-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;position:relative;overflow:hidden}
.chat-main .chat-wrap{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden;max-width:820px;margin:0 auto;width:100%}
.chat-main .chat-scroll{flex:1;min-height:0;overflow-y:auto}

/* 新建对话按钮 */
.new-chat-btn-sidebar{margin:0;padding:10px 14px;border-radius:var(--r-md);background:var(--grad);color:#fff;border:none;cursor:pointer;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center;gap:8px;transition:.2s;box-shadow:0 4px 16px -4px rgba(124,58,237,.5)}
.new-chat-btn-sidebar:hover{transform:translateY(-1px);box-shadow:0 6px 20px -4px rgba(124,58,237,.6)}
.new-chat-btn-sidebar:active{transform:translateY(0)}
.new-chat-btn-sidebar svg{width:18px;height:18px;stroke:#fff}

/* 对话列表 */
.chat-list{flex:1;overflow-y:auto;padding:8px 8px 20px}
.chat-list::-webkit-scrollbar{width:6px}
.chat-list::-webkit-scrollbar-thumb{background:rgba(255,255,255,.1);border-radius:3px}
.chat-group-title{font-size:11px;color:var(--muted);padding:12px 12px 6px;text-transform:none;display:flex;align-items:center;gap:6px;font-weight:500;letter-spacing:.3px}
.chat-group-title .cg-icon svg{width:14px;height:14px;stroke:var(--muted)}

/* 对话项 */
.chat-item{display:flex;align-items:flex-start;gap:8px;padding:6px 8px;border-radius:var(--r-md);cursor:pointer;transition:.18s ease;margin-bottom:1px;position:relative}
.chat-item:hover{background:rgba(255,255,255,.08);transform:scale(1.02);box-shadow:0 2px 12px rgba(0,0,0,.3)}
.chat-item.active{background:rgba(124,58,237,.18);border:1px solid rgba(124,58,237,.3)}
.chat-item.active:hover{background:rgba(124,58,237,.25);transform:scale(1.02)}
.chat-item.active .ci-title{color:#fff}
.ci-icon{flex-shrink:0;width:28px;height:28px;border-radius:7px;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;margin-top:1px;transition:.18s ease}
.chat-item:hover .ci-icon{transform:scale(1.15)}
.ci-icon svg{width:16px;height:16px;stroke:var(--muted)}
.chat-item.active .ci-icon{background:rgba(124,58,237,.3)}
.chat-item.active .ci-icon svg{stroke:#c4b5fd}
.chat-item.locked .ci-icon{background:rgba(167,139,250,.12)}
.chat-item.locked .ci-icon svg{stroke:#a78bfa}
.chat-item.locked .ci-title{font-weight:600}
.ci-body{flex:1;min-width:0}
.ci-title{font-size:13px;font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.3}
.ci-preview{font-size:11px;color:var(--muted);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.3}
.ci-time{font-size:11px;color:var(--muted);flex-shrink:0;margin-top:2px}
.chat-item.generating .ci-title::after{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--violet);margin-left:6px;vertical-align:middle;opacity:.6}
@keyframes genPulse{0%,100%{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}

/* 右键菜单 */
.chat-ctx-menu{position:fixed;display:none;z-index:9999;background:#1a1a2e;border:1px solid var(--border);border-radius:var(--r-md);padding:6px;min-width:160px;box-shadow:0 8px 32px rgba(0,0,0,.5);backdrop-filter:blur(12px)}
.ctx-item{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:var(--text);transition:.12s;user-select:none}
.ctx-item:hover{background:rgba(124,58,237,.2);color:#fff}
.ctx-item.danger{color:#f87171}
.ctx-item.danger:hover{background:rgba(248,113,113,.15);color:#fca5a5}
.ctx-item svg{width:15px;height:15px;stroke:currentColor}
.ctx-item .ctx-label{flex:1}
.ctx-sep{height:1px;background:var(--border);margin:4px 0}

/* 重命名弹窗 */
.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);display:none;align-items:center;justify-content:center;z-index:10000;backdrop-filter:blur(4px)}
.rename-modal{background:#1a1a2e;border:1px solid var(--border);border-radius:16px;padding:24px;width:360px;box-shadow:0 20px 60px rgba(0,0,0,.6)}
.rename-modal h3{margin:0 0 16px;font-size:16px;font-weight:600}
.rename-input{width:100%;padding:10px 14px;background:rgba(255,255,255,.06);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:14px;outline:none;transition:.2s;box-sizing:border-box}
.rename-input:focus{border-color:var(--purple);box-shadow:0 0 0 3px rgba(124,58,237,.2)}
.rename-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:18px}
/* ⚡ 重命名弹窗：匹配绑定开关（v1.2.7 绑定后@匹配只认绑定的资产节点） */
.rename-bind-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:14px;padding:10px 12px;background:rgba(255,255,255,.04);border:1px solid var(--border);border-radius:8px}
.rename-bind-info{display:flex;flex-direction:column;gap:3px;min-width:0}
.rename-bind-label{font-size:13px;color:var(--text);font-weight:600}
.rename-bind-hint{font-size:11px;color:#8b8a9e;line-height:1.35}
.rename-bind-btn{flex:none;padding:7px 18px;border-radius:8px;border:1px solid var(--border);background:rgba(255,255,255,.06);color:#b8b6cc;font-size:13px;font-weight:600;cursor:pointer;transition:.18s}
.rename-bind-btn:hover{border-color:rgba(34,197,94,.55);color:#d9d8e8}
.rename-bind-btn.bound{background:linear-gradient(135deg,#16a34a,#22c55e);border-color:#22c55e;color:#fff;box-shadow:0 2px 14px rgba(34,197,94,.35)}
.rename-bind-btn.bound:hover{filter:brightness(1.08)}
.btn-cancel{padding:8px 18px;border-radius:8px;background:rgba(255,255,255,.06);color:var(--text);border:1px solid var(--border);cursor:pointer;font-size:13px;transition:.2s}
.btn-cancel:hover{background:rgba(255,255,255,.1)}
.btn-confirm{padding:8px 18px;border-radius:8px;background:var(--grad);color:#fff;border:none;cursor:pointer;font-size:13px;font-weight:600;transition:.2s}
.btn-confirm:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(124,58,237,.4)}

/* ⚡ 创建账号弹窗（管理后台·一屏表单） */
.create-user-modal{width:380px;max-width:calc(100vw - 48px);max-height:calc(100vh - 80px);overflow-y:auto}
.cu-grid{display:flex;flex-direction:column;gap:12px}
.cu-row{display:flex;flex-direction:column;gap:6px}
.cu-label{font-size:12px;color:#8b8a9e;font-weight:600;letter-spacing:.02em}
.cu-seg{display:flex;gap:8px}
.cu-seg-btn{flex:1;padding:9px 0;border-radius:8px;border:1px solid var(--border);background:rgba(255,255,255,.04);color:#b8b6cc;font-size:13px;cursor:pointer;transition:.15s}
.cu-seg-btn:hover{border-color:rgba(124,58,237,.5);color:#e7e7ef}
.cu-seg-btn.on{border-color:var(--purple);background:rgba(124,58,237,.14);color:#c4b0ff;font-weight:600}
.cu-hint{margin:0;min-height:16px;font-size:12px;color:#f87171;line-height:1.4;word-break:break-all}

/* ⚡ 用户详情弹窗（管理后台） */
.user-detail-modal{width:480px;max-width:calc(100vw - 48px);max-height:calc(100vh - 80px);overflow-y:auto}
.cu-detail-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:2px 0 14px}
.cu-detail-name{font-size:16px;font-weight:700;color:var(--text);word-break:break-all}
.cu-detail-tags{display:flex;gap:6px;flex-shrink:0}
.cu-section-title{font-size:12px;color:#8b8a9e;font-weight:600;letter-spacing:.02em;margin:0 0 8px;padding-top:10px;border-top:1px solid rgba(255,255,255,.06)}
.cu-kv-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px 12px;margin-bottom:14px}
.cu-kv{display:flex;flex-direction:column;gap:2px;background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.05);border-radius:8px;padding:8px 10px}
.cu-kv .k{font-size:11px;color:#8b8a9e}
.cu-kv .v{font-size:13px;color:var(--text);word-break:break-all}
.cu-tx-sum{font-size:12px;color:#8b8a9e;margin:0 0 8px}
.cu-tx-list{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow-y:auto;border:1px solid rgba(255,255,255,.06);border-radius:8px;padding:8px;background:rgba(0,0,0,.15)}
.cu-tx-row{display:flex;align-items:center;gap:8px;font-size:12px;padding:4px 6px;border-radius:6px}
.cu-tx-row:nth-child(even){background:rgba(255,255,255,.025)}
.cu-tx-time{color:#8b8a9e;flex-shrink:0}
.cu-tx-delta{font-weight:700;flex-shrink:0;width:64px;text-align:right}
.cu-tx-delta.in{color:#34d399}
.cu-tx-delta.out{color:#f87171}
.cu-tx-balance{color:#8b8a9e;flex-shrink:0;width:74px;text-align:right}
.cu-tx-reason{color:var(--text);word-break:break-all;flex:1}
.cu-tx-empty{font-size:12px;color:#8b8a9e;text-align:center;padding:14px 0}
.cu-tx-err{color:#f87171}

/* ⚡ 重置密码弹窗（管理后台） */
.reset-pwd-modal{width:380px;max-width:calc(100vw - 48px);max-height:calc(100vh - 80px);overflow-y:auto}
.rp-note{margin:0 0 12px;font-size:12px;color:#d4b66a;line-height:1.5;background:rgba(251,191,36,.06);border:1px solid rgba(251,191,36,.18);border-radius:8px;padding:8px 10px}
.rp-tools{display:flex;align-items:center;justify-content:space-between;margin-top:-2px}
.rp-mini{padding:5px 12px;border-radius:7px;border:1px solid var(--border);background:rgba(255,255,255,.04);color:#c4b0ff;font-size:12px;cursor:pointer;transition:.15s}
.rp-mini:hover{border-color:rgba(124,58,237,.5);background:rgba(124,58,237,.1)}
.rp-eye{display:flex;align-items:center;gap:6px;font-size:12px;color:#8b8a9e;cursor:pointer;user-select:none}
.rp-eye input{accent-color:#7c3aed;cursor:pointer}

.feature-cards{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:26px 0 8px}
.feature-card{position:relative;border-radius:var(--r-lg);padding:20px;min-height:168px;overflow:hidden;cursor:pointer;color:#fff;display:flex;flex-direction:column;justify-content:flex-end;text-align:left;transition:.22s;box-shadow:var(--shadow)}
.feature-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg)}
.feature-card.canvas{background:var(--grad-canvas)}
.feature-card.seed{background:var(--grad-seed)}
.feature-card .fc-deco{position:absolute;inset:0;opacity:.5;pointer-events:none}
.feature-card .fc-badge{position:absolute;top:16px;left:18px;width:42px;height:42px;border-radius:13px;background:rgba(255,255,255,.18);backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.25)}
.feature-card .fc-badge svg{width:22px;height:22px;stroke:#fff}
.feature-card h3{font-size:18px;font-weight:700;position:relative}
.feature-card p{font-size:13px;opacity:.92;margin-top:5px;position:relative;line-height:1.55}
.feature-card .fc-go{position:absolute;top:16px;right:16px;width:32px;height:32px;border-radius:50%;background:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;transition:.2s}
.feature-card:hover .fc-go{background:#fff;color:var(--solid-fg);transform:rotate(-45deg)}
.feature-card .fc-go svg{width:16px;height:16px;stroke:#fff}
.feature-card:hover .fc-go svg{stroke:var(--solid-fg)}

.suggest-row{display:flex;flex-wrap:wrap;gap:9px;justify-content:center;margin:20px 0 4px}
.suggest-chip{padding:8px 15px;border-radius:99px;background:var(--panel);border:1px solid var(--line);font-size:13px;color:var(--ink-2);transition:.15s;display:inline-flex;align-items:center;gap:7px}
.suggest-chip:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.suggest-chip svg{width:13px;height:13px}

/* 消息 */
.messages{display:flex;flex-direction:column;gap:22px;padding-top:10px}
.msg{display:flex;gap:0;max-width:100%}
.m-msg .m-avatar,.m-avatar,.m-name{display:none !important}
.msg .m-avatar{width:34px;height:34px;border-radius:11px;flex:none;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:13px}
.msg.user{flex-direction:row;justify-content:flex-end}
.msg.user .m-avatar{background:var(--solid);color:var(--solid-fg)}
.msg.ai .m-avatar{background:var(--grad)}
.m-body{min-width:0}
.m-name{font-size:12px;font-weight:600;color:var(--muted);margin:0 0 6px 2px}
.msg.user .m-name{text-align:right;margin-right:2px}
.m-bubble{background:transparent !important;color:#e7e7ef;border:0 !important;padding:0;font-size:14px;box-shadow:none !important;word-break:break-word;line-height:1.75;letter-spacing:0;-webkit-user-select:text;user-select:text}
.msg.ai .m-bubble{background:transparent !important;color:inherit;border:0 !important;border-radius:0;box-shadow:none !important}
/* 消息角色区分（2026-10-01 四改）：用户消息=右侧半宽块（左边缩进一半，不与 AI 回传的左侧满宽对齐）；
   长内容折叠=贴成一行（省略号截断）+「展开全文」，展开后在半宽块内完整显示；AI=左侧文档流+「虾咪儿AI」标记 */
.msg.user .m-body{max-width:50%;display:flex;flex-direction:column;align-items:flex-end}
.msg.user .msg-actions{justify-content:flex-end}
.m-ai-badge{display:inline-flex;align-items:center;gap:6px;margin:0 0 8px;font-size:12px;font-weight:650;color:var(--violet);letter-spacing:.3px}
.m-ai-badge svg{width:13px;height:13px;stroke:currentColor;fill:none}
/* 用户长消息折叠：折叠态=单行纯文本预览（m-preview，省略号截断），完整内容（m-full）隐藏；
   展开态=隐藏预览，显示完整 markdown。CSS nowrap 压不住 markdown 的 <br> 硬换行，必须双元素切换 */
.msg.user .m-bubble{max-width:100%}
.msg.user .m-preview{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;color:var(--ink-2)}
.msg.user .m-bubble.m-collapsed .m-full{display:none}
.msg.user .m-bubble.m-expanded .m-preview{display:none}
.msg-fold-btn{display:inline-flex;align-items:center;gap:5px;margin-top:6px;padding:4px 12px;border-radius:99px;background:var(--panel);border:1px solid var(--line);color:var(--muted);font-size:12px;cursor:pointer;transition:.15s}
.msg-fold-btn:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.msg-fold-btn svg{width:12px;height:12px;stroke:currentColor;fill:none;transition:transform .2s}
.msg-fold-btn.m-expanded svg{transform:rotate(180deg)}
.m-bubble .typing{display:inline-flex;gap:4px;align-items:center;padding:2px 0}
.m-bubble .typing i{width:7px;height:7px;border-radius:50%;background:var(--violet);animation:blink 1.2s infinite}
.m-bubble .typing i:nth-child(2){animation-delay:.2s}
.m-bubble .typing i:nth-child(3){animation-delay:.4s}
@keyframes blink{0%,60%,100%{opacity:.25;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}
.stream-cursor{display:inline-block;width:2px;height:16px;background:var(--violet);margin-left:2px;vertical-align:text-bottom;animation:cursorBlink .8s infinite}
@keyframes cursorBlink{0%,50%{opacity:1}51%,100%{opacity:0}}

.reasoning-box{background:rgba(139,92,246,.06);border:1px solid rgba(139,92,246,.18);border-radius:8px 12px 12px 12px;margin-bottom:6px;overflow:hidden}
.reasoning-box.thinking{border-color:rgba(139,92,246,.35)}
.reasoning-box summary{padding:6px 12px;font-size:12.5px;color:rgba(139,92,246,.85);cursor:pointer;user-select:none;font-weight:600;list-style:none}
.reasoning-box summary::-webkit-details-marker{display:none}
.reasoning-box summary::before{content:'▸ ';font-size:10px}
.reasoning-box[open] summary::before{content:'▾ '}
.reasoning-box.thinking summary::after{content:'';display:inline-block;width:6px;height:6px;border-radius:50%;background:#a78bfa;margin-left:6px;animation:blink 1s infinite}
.reasoning-content{padding:2px 12px 8px;font-size:13px;color:var(--ink-2);opacity:.65;line-height:1.6;max-height:240px;overflow-y:auto;border-top:1px solid rgba(139,92,246,.08)}

.msg-actions{display:flex;gap:6px;margin-top:8px;opacity:0;transition:opacity .2s}
.msg:hover .msg-actions{opacity:1}
.msg-action-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:8px;background:transparent;border:1px solid var(--line);color:var(--muted);font-size:12px;cursor:pointer;transition:.15s}
.msg-action-btn:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.msg-action-btn svg{width:14px;height:14px;stroke:currentColor;fill:none}
.msg-attachment{margin-top:8px;max-width:300px}
.msg-attachment img{max-width:100%;border-radius:12px;border:1px solid var(--line)}
.msg-attachment video{max-width:100%;border-radius:12px;border:1px solid var(--line)}

/* Markdown 渲染样式 */
.m-bubble .md-codeblock{background:#0d0d18;border:1px solid var(--line);border-radius:10px;padding:12px 14px;overflow-x:auto;margin:8px 0;font-size:13px;line-height:1.5;-webkit-user-select:text;user-select:text}
.m-bubble .md-codeblock code{color:#c4b5fd;font-family:'SF Mono','Fira Code',Consolas,monospace;white-space:pre}
.m-bubble .md-inline{background:rgba(139,92,246,.15);color:#c4b5fd;padding:2px 6px;border-radius:4px;font-family:'SF Mono','Fira Code',Consolas,monospace;font-size:13px}
.m-bubble .md-h3{font-size:16px;font-weight:700;color:#f3f3f7;margin:12px 0 7px;line-height:1.45}
.m-bubble .md-h4{font-size:14px;font-weight:650;color:#ededf4;margin:10px 0 5px;line-height:1.5}
.m-bubble .md-ol,.m-bubble .md-ul{margin:8px 0;padding-left:24px}
.m-bubble .md-ol li,.m-bubble .md-ul li{margin:2px 0;line-height:1.7;list-style-position:outside;padding-left:2px}
.m-bubble .md-ol li{list-style:decimal}
.m-bubble .md-ul li{list-style:disc}
.m-bubble strong{font-weight:700;color:var(--text)}

/* 多卡片分镜 */
.m-bubble.multi-card{padding:0;background:none;border:none;box-shadow:none;display:flex;flex-direction:column;gap:8px}
.msg-card{background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden;transition:.18s ease}
.msg-card:hover{border-color:rgba(124,58,237,.4);box-shadow:0 2px 12px rgba(0,0,0,.3)}
.msg-card-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:rgba(124,58,237,.08);border-bottom:1px solid var(--line)}
.msg-card-title{font-size:13px;font-weight:600;color:var(--violet);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.msg-card-actions{display:flex;gap:4px}
.card-action-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;background:transparent;border:1px solid transparent;color:var(--muted);cursor:pointer;transition:.15s}
.card-action-btn:hover{border-color:var(--violet);color:var(--violet);background:rgba(124,58,237,.15)}
.card-action-btn svg{width:14px;height:14px;stroke:currentColor;fill:none}
.msg-card-body{padding:10px 14px;font-size:14px;line-height:1.7;color:var(--text);word-break:break-word;-webkit-user-select:text;user-select:text}
.msg-card-body pre,.msg-card-body code{white-space:pre-wrap !important;word-wrap:break-word !important;overflow-wrap:anywhere !important;word-break:break-all !important}
.msg-card-text{padding:0 4px 12px;font-size:14px;line-height:1.7;color:var(--text);word-break:break-word}
.msg-card-text pre,.msg-card-text code{white-space:pre-wrap !important;word-wrap:break-word !important;overflow-wrap:anywhere !important;word-break:break-all !important}

/* 输入坞 */
.chat-dock{flex-shrink:0;padding:14px 20px 10px;background:linear-gradient(to top,var(--bg) 70%,transparent)}
.dock{background:var(--panel);border:1px solid var(--line);border-radius:22px;box-shadow:var(--shadow);padding:10px 10px 10px 14px;transition:.2s}
.dock:focus-within{border-color:var(--violet);box-shadow:0 0 0 3px rgba(139,92,246,.15),var(--shadow)}
.dock-row{display:flex;align-items:flex-end;gap:8px}
.chat-input-edit{flex:1;border:none;outline:none;resize:none;background:transparent;font-size:15px;line-height:1.5;max-height:160px;padding:8px 4px;overflow-y:auto;word-break:break-word;white-space:pre-wrap}
.chat-input-edit:empty::before{content:attr(data-placeholder);color:var(--faint)}
.chat-input-edit .attach-ref-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 6px 2px 2px;border-radius:8px;background:rgba(167,139,250,.15);font-size:11px;color:var(--text);vertical-align:middle;margin:0 2px}
.chat-input-edit .attach-ref-badge img,.chat-input-edit .attach-ref-badge video{width:20px;height:20px;border-radius:4px;object-fit:cover}
.chat-input-edit .attach-ref-badge svg{width:12px;height:12px;color:var(--violet);flex-shrink:0}
.chat-input-edit .attach-ref-badge span{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-input-edit .ref-remove{width:14px;height:14px;border-radius:50%;background:rgba(251,113,133,.8);color:#fff;border:none;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;padding:0;transition:all .15s}
.chat-input-edit .ref-remove svg{width:7px;height:7px;color:#fff}
.chat-input-edit .ref-remove:hover{background:#ef4444;width:16px;height:16px}
.dock textarea{flex:1;border:none;outline:none;resize:none;background:transparent;font-size:15px;line-height:1.5;max-height:160px;padding:8px 4px}
.dock-actions{display:flex;align-items:center;gap:6px}
.dock-btn{height:38px;padding:0 14px;border-radius:12px;display:flex;align-items:center;justify-content:center;gap:6px;color:var(--muted);transition:.15s;font-size:13px}
.dock-btn:hover{background:var(--soft-2);color:var(--violet)}
.dock-btn svg{width:18px;height:18px}
.dock-btn-text{display:inline}
.dock-btn.recording{color:#ef4444;animation:pulse-rec 1.5s ease-in-out infinite}
.dock-btn.recording svg{stroke:#ef4444}
@keyframes pulse-rec{0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,.4)}50%{box-shadow:0 0 0 6px rgba(239,68,68,0)}}
.send-btn{width:42px;height:42px;padding:0;border-radius:50%;background:var(--grad);color:#fff;display:flex;align-items:center;justify-content:center;transition:.18s;flex:none;flex-shrink:0}
.send-btn:hover{filter:brightness(1.1);transform:scale(1.06)}
.send-btn svg{width:19px;height:19px;stroke:#fff}
.send-btn.stop-mode{background:#ef4444;animation:pulse-stop 1.5s ease-in-out infinite}
.send-btn.stop-mode:hover{filter:brightness(1.15);transform:scale(1.06)}
.match-btn{height:32px;padding:0 14px;border-radius:99px;background:linear-gradient(135deg,#a78bfa,#7c3aed);color:#fff;display:inline-flex;align-items:center;gap:5px;transition:.18s;flex:none;font-size:12.5px;font-weight:600;box-shadow:0 0 10px rgba(167,139,250,.45);border:1px solid rgba(167,139,250,.5)}
.match-btn:hover{filter:brightness(1.15);box-shadow:0 0 16px rgba(167,139,250,.65)}
.match-btn svg{width:14px;height:14px;stroke:#fff}
.match-btn-text{display:inline}
@keyframes pulse-stop{0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,.5)}50%{box-shadow:0 0 0 6px rgba(239,68,68,0)}}
.dock-bar{display:flex;align-items:center;gap:10px;padding:6px 4px 0}
.model-select{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:600;color:var(--ink-2);background:var(--soft-2);padding:6px 14px;border-radius:99px;border:1px solid transparent;transition:.15s}
.model-select:hover{border-color:var(--violet);color:var(--violet)}
.model-select svg{width:13px;height:13px}
.ms-price{font-size:11px;font-weight:600;color:var(--muted);padding:1px 7px;background:rgba(124,58,237,.14);border-radius:99px;line-height:1.4}
.ms-price:empty{display:none}
.ms-label{font-weight:500;opacity:.7}
.dock-hint{font-size:11.5px;color:var(--faint);margin-left:auto}
.dock-settings-btn{width:32px;height:32px;border-radius:8px;background:transparent;border:1px solid var(--border);color:var(--muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.2s;flex-shrink:0}
.dock-settings-btn:hover{color:var(--violet);border-color:var(--violet);background:rgba(124,58,237,.1)}
.dock-settings-btn svg{width:16px;height:16px}

/* 区块标题（首页项目/作品） */
.section-head{display:flex;align-items:center;justify-content:space-between;margin:30px 2px 14px}
.section-head h2{font-size:16px;font-weight:700;display:flex;align-items:center;gap:8px}
.section-head h2 svg{width:18px;height:18px;color:var(--violet)}
.section-head a{font-size:13px;color:var(--violet);font-weight:600;display:inline-flex;align-items:center;gap:4px}
.section-head a svg{width:13px;height:13px}
.proj-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
.proj-card{border:1.5px dashed var(--line);border-radius:var(--r);padding:18px;min-height:128px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;color:var(--muted);transition:.2s;cursor:pointer;background:var(--panel)}
.proj-card:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft);transform:translateY(-2px)}
.proj-card.filled{align-items:flex-start;text-align:left;justify-content:flex-start;border-style:solid;cursor:pointer}
.proj-card.filled:hover{border-color:var(--violet)}
.proj-card .plus{width:38px;height:38px;border-radius:12px;background:var(--soft-2);display:flex;align-items:center;justify-content:center}
.proj-card .plus svg{width:20px;height:20px}
.proj-card.filled .plus{background:var(--grad-canvas);color:#fff}
.proj-card h4{font-size:14px;font-weight:700;color:var(--ink)}
.proj-card.filled p{font-size:12px;color:var(--muted)}
.proj-thumb{width:100%;height:64px;border-radius:10px;background:var(--grad-canvas);margin-bottom:8px;position:relative;overflow:hidden}
.proj-thumb.seed{background:var(--grad-seed)}
.empty-note{text-align:center;color:var(--faint);font-size:13.5px;padding:30px 0;border:1px dashed var(--line);border-radius:var(--r);background:var(--panel)}

/* ============ 通用卡片 / 表单 ============ */
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:22px;box-shadow:var(--shadow-sm)}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.field{display:block;margin-bottom:10px}
.field-label{display:block;font-size:12px;font-weight:600;margin-bottom:5px;color:var(--ink-2)}
.field-label .req{color:var(--rose)}
.input,.textarea,.select{width:100%;background:var(--soft);border:1px solid var(--line);border-radius:12px;padding:11px 13px;font-size:14px;outline:none;transition:.18s}
.input:focus,.textarea:focus,.select:focus{border-color:var(--violet);background:var(--soft);box-shadow:0 0 0 3px rgba(139,92,246,.15)}
.textarea{resize:vertical;min-height:96px;line-height:1.65}
.select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%238e8ea2' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;padding-right:36px;cursor:pointer}
.select option{background:var(--panel);color:var(--ink)}
.chip-group{display:flex;flex-wrap:wrap;gap:8px}
.chip-choice{padding:7px 14px;border-radius:99px;border:1px solid var(--line);background:var(--panel);font-size:13px;color:var(--ink-2);transition:.15s;cursor:pointer}
.chip-choice:hover{border-color:var(--violet);color:var(--violet)}
.chip-choice.on{background:var(--violet);border-color:var(--violet);color:#fff;font-weight:600}

.toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:18px}
.toolbar .spacer{flex:1}

/* ============ Seedance ============ */
.seed-hero{border-radius:var(--r-xl);padding:26px 28px;color:#fff;position:relative;overflow:hidden;margin-bottom:22px;background:var(--grad-seed);box-shadow:var(--shadow)}
.seed-hero h2{font-size:21px;font-weight:800;display:flex;align-items:center;gap:10px}
.seed-hero h2 svg{width:24px;height:24px}
.seed-hero p{opacity:.94;font-size:14px;margin-top:7px;max-width:620px}
.seed-hero .deco{position:absolute;right:-30px;top:-30px;width:200px;height:200px;border-radius:50%;background:rgba(255,255,255,.12)}
.seed-hero .deco.two{right:60px;top:80px;width:110px;height:110px;background:rgba(255,255,255,.08)}
.prompt-out{background:#0b0b13;border-radius:var(--r-lg);padding:0;overflow:hidden;border:1px solid #262638}
.prompt-out-head{display:flex;align-items:center;gap:10px;padding:13px 18px;border-bottom:1px solid #232333;color:#e4e4ef}
.prompt-out-head .dot{width:10px;height:10px;border-radius:50%;background:var(--emerald)}
.prompt-out-head strong{font-size:14px}
.prompt-out-head span{font-size:12px;color:#8b8b9e;margin-left:auto}
.prompt-out pre{padding:18px;color:#d7d7e6;font-family:"SF Mono","Consolas",monospace;font-size:13px;line-height:1.75;white-space:pre-wrap;word-break:break-word;max-height:520px;overflow-y:auto}
.prompt-out .out-actions{display:flex;gap:10px;padding:13px 18px;border-top:1px solid #232333}
.prompt-empty{text-align:center;padding:54px 20px;color:#6b6b80;border:1px dashed #2c2c3e;border-radius:var(--r-lg);background:#0e0e18}
.prompt-empty svg{width:40px;height:40px;margin-bottom:12px;opacity:.6}
.shot-list{display:flex;flex-direction:column;gap:8px;margin-top:16px}
.shot-item{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:15px 16px;display:flex;gap:14px}
.shot-num{width:38px;height:38px;border-radius:11px;background:var(--grad-seed);color:#fff;font-weight:800;display:flex;align-items:center;justify-content:center;flex:none}
.shot-item h4{font-size:14.5px;font-weight:700}
.shot-item .shot-meta{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}
.mini-tag{font-size:11px;font-weight:600;padding:2px 9px;border-radius:99px;background:rgba(16,185,129,.12);color:#34d399;border:1px solid rgba(16,185,129,.3)}
.shot-item p{font-size:13.5px;color:var(--ink-2);line-height:1.65}

/* ============ 自由画布（旧布局兼容） ============ */
.canvas-layout{display:grid;grid-template-columns:300px 1fr;gap:20px;align-items:start}
.proj-list{display:flex;flex-direction:column;gap:10px}
.proj-list-item{display:flex;align-items:center;gap:11px;padding:12px 13px;border-radius:13px;border:1px solid var(--line);background:var(--panel);cursor:pointer;transition:.15s}
.proj-list-item:hover{border-color:var(--violet)}
.proj-list-item.active{border-color:var(--violet);background:var(--violet-soft);box-shadow:var(--shadow-sm)}
.proj-list-item .pl-ico{width:36px;height:36px;border-radius:10px;background:var(--grad-canvas);color:#fff;display:flex;align-items:center;justify-content:center;flex:none}
.proj-list-item .pl-ico svg{width:18px;height:18px}
.proj-list-item h5{font-size:14px;font-weight:700}
.proj-list-item p{font-size:11.5px;color:var(--muted)}
.proj-list-item .pl-del{margin-left:auto;color:var(--faint);opacity:0;transition:.15s}
.proj-list-item:hover .pl-del{opacity:1}
.proj-list-item .pl-del:hover{color:var(--rose)}
.proj-list-item .pl-del svg{width:16px;height:16px}

.board{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:20px;min-height:480px}
.board-top{display:flex;align-items:center;gap:8px;margin-bottom:16px;flex-wrap:wrap}
.board-top input.title-input{font-size:19px;font-weight:800;border:none;outline:none;background:transparent;flex:1;min-width:160px;border-bottom:2px solid transparent;padding:4px 2px;color:var(--ink)}
.board-top input.title-input:focus{border-bottom-color:var(--violet)}
.scene-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px}
.scene-card{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:var(--panel);transition:.2s;display:flex;flex-direction:column}
.scene-card:hover{box-shadow:var(--shadow);border-color:#4c4585}
.scene-thumb{height:120px;position:relative;display:flex;align-items:center;justify-content:center;color:#fff;overflow:hidden}
.scene-thumb .st-no{position:absolute;top:10px;left:10px;background:rgba(0,0,0,.45);backdrop-filter:blur(4px);font-size:11px;font-weight:700;padding:3px 9px;border-radius:99px}
.scene-thumb .st-gen{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;background:rgba(10,10,18,.5);opacity:0;transition:.2s;cursor:pointer}
.scene-card:hover .st-gen{opacity:1}
.scene-thumb .st-gen svg{width:26px;height:26px;stroke:#fff}
.scene-thumb .st-gen span{font-size:12px;font-weight:600;color:#fff}
.scene-body{padding:12px 13px;display:flex;flex-direction:column;gap:7px;flex:1}
.scene-body .sc-shot{font-size:11px;font-weight:700;color:var(--violet);text-transform:uppercase;letter-spacing:.5px}
.scene-body textarea{border:none;outline:none;resize:none;font-size:13px;line-height:1.55;width:100%;background:transparent;min-height:38px;color:var(--ink)}
.scene-body textarea:focus{background:var(--soft);border-radius:8px;padding:6px}
.scene-foot{display:flex;gap:6px;padding:0 13px 12px}
.scene-foot .mini-btn{flex:1;font-size:11.5px;font-weight:600;padding:6px;border-radius:8px;background:var(--soft-2);color:var(--ink-2);display:inline-flex;align-items:center;justify-content:center;gap:5px;transition:.15s}
.scene-foot .mini-btn:hover{background:var(--violet-soft);color:var(--violet)}
.scene-foot .mini-btn svg{width:13px;height:13px}
.add-scene{border:1.5px dashed var(--line);border-radius:var(--r);min-height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--muted);cursor:pointer;transition:.2s;background:var(--soft)}
.add-scene:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.add-scene svg{width:28px;height:28px}
.script-panel{margin-top:18px}
.script-panel textarea{min-height:150px;font-family:"SF Mono",Consolas,monospace;font-size:13px;line-height:1.7}

/* ============ 自由画布 · 画布列表 ============ */
/* 画布卡片固定尺寸：每张 280px 宽、150px 缩略图，新建多少张都不挤压/伸缩 */
.canvas-home-grid{display:grid;grid-template-columns:repeat(auto-fill,280px);gap:18px;justify-content:flex-start}
/* 画布列表铺满视口：全宽（去掉 1200px 居中——滚动条贴视口最右、标题与卡片同边距左对齐），
   页面至少一屏；卡片尺寸固定，同行等高对齐，不再随行拉伸 */
.view.view-canvas{min-height:calc(100vh - 60px);display:flex;flex-direction:column;max-width:none;margin:0}
.view.view-canvas .canvas-home-grid{flex:1;align-content:flex-start}
.view.view-canvas .cc-thumb{height:150px;flex:none}
.view.view-canvas .new-canvas-card{min-height:100%}
.new-canvas-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;text-align:left;
  border:1.5px dashed #3a3a58;border-radius:var(--r-lg);padding:24px 22px;min-height:230px;
  background:linear-gradient(160deg,rgba(139,92,246,.1),rgba(236,72,153,.06));transition:.2s;color:var(--ink-2);cursor:pointer}
.new-canvas-card:hover{border-color:var(--violet);box-shadow:var(--shadow);transform:translateY(-3px)}
.new-canvas-card .ncc-plus{width:46px;height:46px;border-radius:14px;background:var(--grad-canvas);color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 8px 18px -8px rgba(79,70,229,.7)}
.new-canvas-card .ncc-plus svg{width:24px;height:24px;stroke:#fff}
.new-canvas-card h3{font-size:18px;font-weight:800;color:var(--ink)}
.new-canvas-card p{font-size:12.5px;color:var(--muted);line-height:1.7}
.new-canvas-card .ncc-cta{margin-top:auto;display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:700;color:var(--violet)}
.new-canvas-card .ncc-cta svg{width:13px;height:13px}
.canvas-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;transition:.22s;display:flex;flex-direction:column}
.canvas-card:hover{box-shadow:var(--shadow-lg);transform:translateY(-4px)}
.cc-thumb{height:130px;position:relative;padding:14px;color:#fff;overflow:hidden;background:transparent;border-bottom:1px solid var(--line)}
/* 封面 = 画布里第一张图片：cover 铺满缩略区，标题压在底部渐变上 */
.cc-thumb .cc-cover{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0;display:block}
.cc-thumb.has-img h4{position:absolute;left:14px;right:14px;bottom:12px;z-index:2}
.cc-thumb.has-img::after{content:"";position:absolute;left:0;right:0;bottom:0;height:58px;background:linear-gradient(to top,rgba(8,8,16,.85),transparent);z-index:1}
/* 无图画布：透明底 + 居中淡图标占位 */
.cc-thumb .cc-empty-ico{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;opacity:.22}
.cc-thumb .cc-empty-ico svg{width:44px;height:44px;stroke:#fff;fill:none;stroke-width:1.5}
.cc-thumb:not(.has-img) h4{position:absolute;left:14px;bottom:12px;z-index:2;color:var(--ink)}
.cc-thumb .cc-cat{position:absolute;top:12px;right:12px;background:rgba(0,0,0,.32);backdrop-filter:blur(4px);font-size:11px;font-weight:700;padding:3px 10px;border-radius:99px}
.cc-thumb h4{position:relative;font-size:16px;font-weight:800;text-shadow:0 1px 6px rgba(0,0,0,.4);z-index:2}
.cc-body{padding:13px 15px;display:flex;flex-direction:column;gap:11px;flex:1}
.cc-body p{font-size:12.5px;color:var(--muted)}
.cc-actions{display:flex;align-items:center;gap:8px;margin-top:auto}
.cc-actions .btn{flex:1}
.cc-actions .icon-btn{border:1px solid var(--line);background:var(--panel)}
.cc-actions .icon-btn:hover{color:var(--rose);border-color:rgba(244,63,94,.45);background:rgba(244,63,94,.12)}

/* ============ 自由画布 · AI 无限工作台 ============ */
.view.view-board{padding:0;max-width:none;margin:0;display:flex;overflow:hidden;height:calc(100vh - 60px)}
.board-app{flex:1;display:flex;flex-direction:column;min-height:0;background:var(--bg)}
.board-toolbar{display:flex;align-items:center;gap:10px;padding:12px 18px;background:transparent;border-bottom:none;z-index:20;flex:none;flex-wrap:wrap;position:relative}
.board-toolbar::after{content:"";position:absolute;left:18px;right:18px;bottom:0;height:1px;background:linear-gradient(to right,transparent,rgba(255,255,255,.08),transparent)}
.bt-pill{display:flex;align-items:center;gap:2px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);border-radius:99px;padding:4px 6px 4px 4px;flex:none;max-width:46vw}
.bt-back{display:inline-flex;align-items:center;gap:7px;padding:8px 15px 8px 13px;border-radius:99px;color:var(--ink);font-size:14px;font-weight:600;transition:.15s;white-space:nowrap;flex:none}
.bt-back:hover{background:rgba(255,255,255,.1);color:#fff}
.bt-back svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.bt-pill .bt-divider{width:1px;height:20px;background:rgba(255,255,255,.16);flex:none;margin:0 6px}
.bt-pill .bt-title{font-size:15px;font-weight:700;border:1px solid transparent;background:transparent;border-radius:99px;padding:8px 14px;outline:none;min-width:120px;max-width:30vw;flex:1 1 auto;color:var(--ink)}
.bt-pill .bt-title:focus{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.15)}
.bt-genre{width:auto!important;flex:none;padding:9px 38px 9px 18px;font-size:13px;border-radius:99px;background-color:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);color:var(--ink-2);font-weight:600;cursor:pointer;background-position:right 14px center}
.bt-genre:hover{border-color:rgba(167,139,250,.5);color:var(--violet)}
.board-toolbar .btn.sm{flex:none;padding:9px 18px;border-radius:99px}
.board-toolbar .btn-ghost{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.13)}
.board-toolbar .btn-ghost:hover{background:rgba(167,139,250,.15);border-color:rgba(167,139,250,.45);color:var(--violet)}
.board-viewport{position:relative;flex:1;min-height:0;overflow:hidden;cursor:default;
  background-color:#0c0c15;
  background-image:radial-gradient(circle,#2b2b44 1px,transparent 1px);
  background-size:26px 26px;touch-action:none;user-select:none;-webkit-user-select:none}
/* 平移/拖拽模式：仅对选中/唤醒状态的节点禁用昂贵效果
   休眠态节点本身已无模糊无阴影，无需额外处理（避免全量样式重排导致闪烁） */
.board-viewport.grabbing .b-node.sel,
.board-viewport.grabbing .b-node.multi-sel{
  backdrop-filter:none !important;
  -webkit-backdrop-filter:none !important;
  box-shadow:none !important;
}
.board-viewport.grabbing{user-select:none;-webkit-user-select:none;cursor:grabbing}
/* 拖拽进行中（含从文本节点文案框起步）：全局禁用文本选择，防止拖动时 textarea/输入区继续选字 */
body.board-dragging,body.board-dragging *{user-select:none !important;-webkit-user-select:none !important}
.board-viewport.grabbing .node-op{display:none !important}
.board-viewport.grabbing .b-port{opacity:0 !important;transform:scale(.6) !important;transition:none !important;box-shadow:none !important;pointer-events:none !important} /* ⚡ v435 隐形必不命中：平移时经过节点边缘光标不再闪十字 */
.board-viewport.grabbing .b-node:hover .b-port{opacity:0 !important;transform:scale(.6) !important;box-shadow:none !important;pointer-events:none !important}
.board-viewport.grabbing .edge-del{opacity:0 !important;transition:none !important;pointer-events:none !important}
.board-viewport.grabbing .edge-path{filter:none !important;transition:none !important}
/* 空格键按住 → 抓手模式（所有元素都显示抓手光标） */
.board-viewport.space-grab{cursor:grab}
.board-viewport.space-grab .b-node{cursor:grab}
.board-viewport.space-grab .b-port{cursor:grab;opacity:0 !important;transform:scale(.6) !important;box-shadow:none !important;pointer-events:none !important} /* ⚡ v435 隐形必不命中 */
.board-viewport.space-grab .b-node:hover .b-port{opacity:0 !important;transform:scale(.6) !important;box-shadow:none !important;pointer-events:none !important}
.board-viewport.space-grab.grabbing{cursor:grabbing}
.board-viewport.space-grab.grabbing .b-node{cursor:grabbing}
.board-viewport:focus{outline:none}
.board-world{position:absolute;top:0;left:0;transform-origin:0 0}
.board-links{position:absolute;top:0;left:0;width:10000px;height:10000px;overflow:visible;z-index:1}
/* 拖拽时禁用连线过渡和滤镜，减少 GPU 重绘开销 */
.board-links.dragging .edge-path{transition:none;filter:none !important}
.board-links.dragging .edge-del{transition:none}
/* ⚡ 拖拽时禁用连线鼠标事件，防止 hover 事件风暴导致 Electron 下极端卡顿
   每条线 22px 透明热区 + 鼠标移动 = 不断触发 hover 重绘 */
.board-links.dragging .edge-hit{pointer-events:none}
.board-links.dragging .edge-g{pointer-events:none}
/* 隐形加宽热区：22px 粗的透明描边，方便点中细线 */
.edge-hit{fill:none;stroke:transparent;stroke-width:22;pointer-events:stroke;cursor:pointer}
.edge-path{fill:none;stroke:rgba(120,120,150,.4);stroke-width:2;pointer-events:stroke;cursor:pointer;transition:stroke .15s,stroke-width .15s}
.edge-g{pointer-events:auto}
/* hover 态：通过热区触发，兄弟选择器让可见线变蓝 */
.edge-hit:hover ~ .edge-path{stroke:#7dd3fc;stroke-width:3.5}
/* 选中态：连线变红 */
.edge-g.sel .edge-path{stroke:#f87171;stroke-width:3.5;filter:drop-shadow(0 0 6px rgba(248,113,113,.7))}
/* ⚡ 资产传输流动光效：下游调用上游资产时，连线紫色发光、虚线沿流向流动 */
.edge-g.flowing .edge-path{
  stroke:#a78bfa;
  stroke-width:3;
  stroke-dasharray:10 8;
  filter:drop-shadow(0 0 6px rgba(167,139,250,.9));
  animation:edgeFlowDash .7s linear infinite;
  transition:none;
}
@keyframes edgeFlowDash{
  from{stroke-dashoffset:0}
  to{stroke-dashoffset:-36}
}
/* 浮动删除按钮（点击连线后出现在点击位置上方） */
.edge-del-pop{position:absolute;z-index:30;display:none;pointer-events:auto}
.edge-del-pop.show{display:block;animation:edpPop .2s cubic-bezier(.34,1.8,.64,1)}
@keyframes edpPop{from{transform:scale(.4);opacity:0}to{transform:scale(1);opacity:1}}
.edge-del-pop-btn{width:22px;height:22px;border-radius:50%;background:linear-gradient(135deg,#fff5f5 0%,#fca5a5 20%,#f87171 50%,#ef4444 80%,#dc2626 100%);border:1.5px solid #fef2f2;display:flex;align-items:center;justify-content:center;padding:0;font:inherit;line-height:1;appearance:none;-webkit-appearance:none;cursor:pointer;transition:all .15s ease;box-shadow:0 0 0 1px rgba(239,68,68,.4),0 2px 8px rgba(239,68,68,.5),0 0 12px rgba(248,113,113,.6),inset 0 1px 0 rgba(255,255,255,.6),inset 0 -1px 0 rgba(220,38,38,.3)}
.edge-del-pop-btn:hover{transform:scale(1.2);box-shadow:0 0 0 1px rgba(239,68,68,.5),0 4px 16px rgba(239,68,68,.7),0 0 20px rgba(248,113,113,.9),0 0 32px rgba(239,68,68,.5),inset 0 1px 0 rgba(255,255,255,.7),inset 0 -1px 0 rgba(220,38,38,.4)}
.edge-del-pop-btn:active{transform:scale(.9)}
.edp-x{stroke:#fff;stroke-width:2.4;stroke-linecap:round;pointer-events:none;filter:drop-shadow(0 1px 2px rgba(220,38,38,.6))}
/* 流动光效颜色保持紫色不变 */
/* 拉线时未对准有效端口：临时线变红提示 */
.link-temp{stroke:#22d3ee;stroke-width:2.5;opacity:.9}
/* 节点连接端口：默认隐藏，鼠标靠近时才弹出 */
.b-port{position:absolute;top:50%;width:14px;height:14px;margin-top:-7px;border-radius:50%;background:radial-gradient(circle at 35% 30%,#a5f3fc,#22d3ee 50%,#8b5cf6 100%);border:2px solid #0a0a12;box-shadow:0 0 10px rgba(34,211,238,.6),0 0 20px rgba(139,92,246,.3);z-index:8;cursor:crosshair;opacity:0;transform:scale(.6);transition:opacity .18s ease,transform .18s cubic-bezier(.34,1.56,.64,1),box-shadow .18s ease;pointer-events:none}
.b-port-l{left:-7px}
.b-port-r{right:-7px}
.b-port::before{content:"";position:absolute;inset:-18px;border-radius:50%}
/* ⚡ v434 鼠标防干扰：端口默认不可命中（pointer-events:none）——此前隐形端口+外扩18px
   命中区参与鼠标命中，划过节点边缘光标莫名变十字、靠近检测随机点亮标签，全程干扰操作。
   现在只有「节点悬停/选中/拖线中」端口才可见可抓；.near 靠近放大也只在悬停节点上生效 */
.b-node:hover .b-port,.b-node.sel .b-port,.b-port.linking-port,.b-port.hot{pointer-events:auto}
.b-node:hover .b-port,.b-node.sel .b-port{opacity:1;transform:scale(1.2)}
/* 拖线中端口保持可命中（目标检测依赖命中测试），视觉上仍隐藏 */
body.linking .b-port{pointer-events:auto}
/* 选中节点时显示端口 */
.b-node.sel .b-port{opacity:1;transform:scale(1.3)}
/* 鼠标靠近端口时放大高亮（仅在悬停/选中的节点上生效，空闲划过不再随机发光） */
.b-port.hot,.b-port.linking-port{opacity:1;transform:scale(2);box-shadow:0 0 0 6px rgba(34,211,238,.25),0 0 20px rgba(34,211,238,.8)}
.b-node:hover .b-port.near,.b-node.sel .b-port.near{opacity:1;transform:scale(2);box-shadow:0 0 0 6px rgba(34,211,238,.25),0 0 20px rgba(34,211,238,.8)}
/* 端口标签（接入/输出） */
.b-port::after{content:"";position:absolute;top:50%;margin-top:-10px;padding:2px 9px;font-size:10px;line-height:18px;font-weight:700;letter-spacing:.5px;color:#a5f3fc;background:rgba(10,10,20,.95);border:1px solid rgba(34,211,238,.4);border-radius:10px;white-space:nowrap;opacity:0;transform:scale(.8);transition:opacity .15s ease,transform .15s ease;pointer-events:none}
.b-port-l::after{content:"接入";right:24px}
.b-port-r::after{content:"输出";left:24px}
.b-port.hot::after,.b-port.linking-port::after,.b-node:hover .b-port.near::after,.b-node.sel .b-port.near::after{opacity:1;transform:scale(1)}
/* 拖线时：不显示所有端口，只高亮目标节点 */
body.linking{cursor:crosshair}
body.linking .b-port{opacity:0 !important;transform:scale(.6) !important}
body.linking .b-port.hot{opacity:0 !important;transform:scale(.6) !important}
/* 无端口节点（文本等） */
.b-node.no-port .b-port{display:none !important}
/* 节点连接目标高亮 */
.b-node.link-target{border-color:rgba(34,211,238,.6);box-shadow:0 0 0 2px rgba(34,211,238,.3),0 14px 40px -12px rgba(34,211,238,.4)}
/* 节点主体 — 默认休眠态：纯色背景、无模糊无阴影，降低GPU开销
   只有选中/多选/拖拽时才唤醒（hover不唤醒，避免大面积GPU开销） */
.b-node{position:absolute;left:0;top:0;background:#1c1c2a;border:1px solid rgba(96,165,250,.6);border-radius:18px;display:flex;flex-direction:column;overflow:visible;z-index:1;cursor:default}
.b-node.sel{z-index:6}
/* hover 时不唤醒节点，只有选中才点亮 */
/* 拖拽/平移时禁用所有节点的 hover 效果，防止鼠标经过其他节点时意外变亮 */
.board-viewport.grabbing .b-node:hover{border-color:rgba(96,165,250,.6) !important}
.b-node.drag-ready{will-change:transform}
/* 选中/多选/拖拽均不改节点外观（背景/边框/光晕与未选中完全一致），只保留功能性变化：
   弹操作台、显操作按钮、显端口、置顶；多选范围由外部虚线框指示 */
.b-node.dragging{cursor:grabbing;will-change:transform;z-index:6;backdrop-filter:none!important;-webkit-backdrop-filter:none!important;box-shadow:none!important;user-select:none;-webkit-user-select:none}
.b-node,.b-node *{user-select:none;-webkit-user-select:none;cursor:default}
.b-node .bn-title-input,.b-node .bn-textarea{user-select:text;-webkit-user-select:text}
.b-node .nop-ref-badge,.b-node .nop-ref-badge *{user-select:text;-webkit-user-select:text}
/* 框选框 */
.marquee-box{position:absolute;top:0;left:0;width:0;height:0;background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.6);border-radius:4px;pointer-events:none;z-index:100}
/* 多选统一框 */
.multi-selection-box{position:absolute;pointer-events:none;z-index:5;border:1.5px dashed rgba(139,92,246,.7);border-radius:6px;background:rgba(139,92,246,.05);transition:opacity .15s}
.multi-selection-box.hide{opacity:0}
.msb-port{position:absolute;right:-12px;top:50%;transform:translateY(-50%);width:22px;height:22px;border-radius:50%;background:linear-gradient(135deg,#a78bfa,#8b5cf6);border:2px solid #0f172a;pointer-events:auto;cursor:crosshair;box-shadow:0 2px 12px rgba(139,92,246,.7),0 0 0 4px rgba(139,92,246,.2)}
.msb-port:hover{transform:translateY(-50%) scale(1.3);box-shadow:0 0 0 6px rgba(139,92,246,.3),0 0 20px rgba(139,92,246,.9)}
.msb-port.linking-port{transform:translateY(-50%) scale(1.5);box-shadow:0 0 0 8px rgba(34,211,238,.25),0 0 24px rgba(34,211,238,.8)}
.msb-count{position:absolute;top:-11px;left:50%;transform:translateX(-50%);background:rgba(139,92,246,.95);color:#fff;font-size:12px;font-weight:700;padding:3px 10px;border-radius:12px;white-space:nowrap;pointer-events:none;box-shadow:0 2px 8px rgba(0,0,0,.3)}
/* 多选模式：隐藏单个节点的端口，统一用总端口 */
.board-viewport.multi-select-mode .b-node .b-port{opacity:0 !important;transform:scale(.4) !important;pointer-events:none !important}
.board-viewport.multi-select-mode .b-node.sel .b-port{opacity:0 !important}
/* 节点标签（左上角胶囊） */
.bn-tag{position:absolute;top:-34px;right:14px;display:inline-flex;align-items:center;gap:6px;padding:5px 12px 5px 10px;background:rgba(20,20,32,.9);border:1px solid rgba(255,255,255,.06);border-radius:99px;z-index:10;pointer-events:none}
.bn-tag-ico{width:18px;height:18px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;background:rgba(139,92,246,.2);color:#c4b5fd;flex:none}
.bn-tag-ico svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.bn-tag-text{font-size:12px;font-weight:700;color:#e0def0;white-space:nowrap}
/* 节点内容区 */
.bn-body{padding:10px;display:flex;flex-direction:column;gap:0}
.bn-body > *{flex:none}

/* ===== 选中节点弹出的操作面板（固定大小，不随画布缩放，32:9 预览区） ===== */
/* ===== 节点内嵌操作面板（绑定在节点下方，固定大小不随画布缩放） ===== */
.node-op{position:absolute;top:calc(100% + 12px);left:-75%;width:250%;pointer-events:none;z-index:5;display:none;opacity:0;transform:translateY(-4px);transition:opacity .2s ease,transform .2s ease}
/* 选中节点时才显示操作面板 */
.b-node.sel .node-op{display:block;opacity:1;transform:translateY(0);pointer-events:auto}
/* 拖拽时隐藏操作台 */
.b-node.dragging .node-op,.b-node.no-op .node-op{display:none!important}
/* 内部反向缩放：抵消画布的 scale，保持视觉大小固定。
   ⚡ v2.18 修复网页版面板压扁：v2.17 的 zoom:var() 在旧内核浏览器不生效（宽度补偿生效、放大不生效→窄条），
   退回 transform:scale（全浏览器可靠）；模糊真凶是 will-change:transform（强占合成层、缓存旧栅格拉伸，
   造成清晰/模糊来回跳）——已删除，净缩放恒 1:1，文字按最终尺寸栅格，恒清晰 */
.node-op-inner{width:100%;transform-origin:top center;transform:scale(var(--op-scale,1));background:linear-gradient(180deg,#1c1c2a,#161622);border:1px solid rgba(139,92,246,.28);border-radius:14px;box-shadow:0 12px 36px -10px rgba(0,0,0,.65),0 5px 18px -8px rgba(139,92,246,.3);overflow:hidden}
/* 放大模式：操作台脱离节点，全屏居中显示。
   ⚡ v1.3.2 宽度 760→800px：与普通模式视觉宽度一致（实测 798px），
   底部芯片 grid 定轨铺出与普通模式相同的格子宽，不再挤压出省略号；
   高度 600px 提供给输入区（仅输入区变高，其余尺寸全部继承普通模式） */
.node-op.expanded{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:800px;height:600px;pointer-events:auto;z-index:9999;display:block;opacity:1}
.node-op.expanded .node-op-inner{transform:scale(1);width:100%;height:100%;overflow:hidden;display:flex;flex-direction:column}
.node-op.expanded::before{display:none}
/* 横屏大节点（640px宽）：操作台不随节点放大，视觉宽度锁定 800px（=基准320×250%），居中悬挂在节点下方 */
.b-node.is-wide .node-op{left:-12.5%;width:125%}
/* 放大模式遮罩 */
.op-expand-mask{position:fixed;inset:0;background:rgba(0,0,0,.55);backdrop-filter:blur(4px);z-index:9998;display:none}
.op-expand-mask.show{display:block}
/* 面板顶部连接把手 */
.node-op::before{content:"";position:absolute;top:-6px;left:50%;width:44px;height:4px;border-radius:4px;background:rgba(139,92,246,.55);transform:translateX(-50%) scaleY(var(--op-scale,1));transform-origin:top center;z-index:1;box-shadow:0 0 8px rgba(139,92,246,.4)}
/* 面板头部 */
.nop-head{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 8px;border-bottom:1px solid rgba(255,255,255,.05)}
.nop-title{display:flex;align-items:center;gap:7px;font-size:12px;font-weight:700;color:#e0def0}
.nop-ico{width:20px;height:20px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;background:rgba(139,92,246,.22);color:#c4b5fd;flex:none}
.nop-ico svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nop-icon-btn{width:24px;height:24px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;background:rgba(255,255,255,.05);color:#9493a8;cursor:pointer;transition:.15s;border:none;flex:none}
.nop-icon-btn:hover{background:rgba(139,92,246,.2);color:#c4b5fd}
.nop-icon-btn svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* 预览区 — 32:9 超宽屏比例 */
.nop-preview{position:relative;width:100%;aspect-ratio:32/9;background:#0a0a14;overflow:hidden}
.nop-preview img{width:100%;height:100%;object-fit:cover;display:block}
.nop-empty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:#6b7280;background:linear-gradient(145deg,#151525,#0c0c18)}
.nop-empty span:first-child{width:24px;height:24px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;background:rgba(139,92,246,.18);color:#a78bfa}
.nop-empty span:first-child svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nop-empty span:last-child{font-size:11px;font-weight:500}
/* 视频预览 */
.nop-video .nop-play{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:36px;height:36px;border-radius:50%;background:rgba(0,0,0,.6);backdrop-filter:blur(4px);display:inline-flex;align-items:center;justify-content:center;color:#fff;cursor:pointer;transition:.15s}
.nop-video .nop-play:hover{background:rgba(139,92,246,.85);transform:translate(-50%,-50%) scale(1.1)}
.nop-video .nop-play svg{width:14px;height:14px;fill:currentColor;margin-left:2px}
.nop-duration{position:absolute;bottom:6px;right:8px;padding:2px 7px;border-radius:4px;background:rgba(0,0,0,.7);color:#fff;font-size:10px;font-weight:600;font-variant-numeric:tabular-nums}
/* 音频操作台（与图片节点同款布局：无预览区，上传芯片在底部按钮行） */
.nop-audio-chip svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
.nop-audio-chip:hover{border-color:rgba(139,92,246,.5)}
.nop-audio-chip-name{font-size:10px;color:#8f8fb8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:110px;align-self:center}
/* 音频下拉：未配置配音模型提示 */
.nop-aud-no-model-hint{font-size:10.5px;color:#8b8db0;line-height:1.5;margin:2px 0 10px;padding:7px 10px;border-radius:8px;background:rgba(251,191,36,.07);border:1px dashed rgba(251,191,36,.25)}
/* 音频参数面板：语速/音调/音量滑杆（标签 + 蓝色滑杆 + 数值框） */
.nop-params-chip svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
.nop-params-chip.mod{border-color:rgba(59,130,246,.55);background:rgba(59,130,246,.15);color:#bcd3f7}
.nop-aud-param-row{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.nop-aud-param-label{flex:none;width:30px;font-size:12px;color:#c0c0d8;font-weight:500}
.nop-aud-param-range{-webkit-appearance:none;appearance:none;flex:1;min-width:0;height:5px;border-radius:999px;outline:none;cursor:pointer;background:linear-gradient(to right,#3b82f6 0%,#60a5fa var(--pct,33%),rgba(255,255,255,.10) var(--pct,33%),rgba(255,255,255,.10) 100%)}
.nop-aud-param-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;border-radius:50%;background:#fff;border:3px solid #3b82f6;box-shadow:0 2px 8px rgba(59,130,246,.55);cursor:grab;transition:transform .12s}
.nop-aud-param-range::-webkit-slider-thumb:hover{transform:scale(1.12)}
.nop-aud-param-range::-webkit-slider-thumb:active{cursor:grabbing}
.nop-aud-param-range::-moz-range-thumb{width:11px;height:11px;border-radius:50%;background:#fff;border:3px solid #3b82f6;box-shadow:0 2px 8px rgba(59,130,246,.55);cursor:grab}
.nop-aud-param-range::-moz-range-track{height:5px;border-radius:999px;background:rgba(255,255,255,.10)}
.nop-aud-param-range::-moz-range-progress{height:5px;border-radius:999px;background:linear-gradient(to right,#3b82f6,#60a5fa)}
.nop-aud-param-val{flex:none;min-width:46px;padding:4px 9px;border-radius:8px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08);color:#d4d4e8;font-size:11px;font-weight:600;text-align:center;font-variant-numeric:tabular-nums}
.nop-aud-param-foot{display:flex;justify-content:flex-end;margin-top:2px;padding-top:10px;border-top:1px solid rgba(255,255,255,.06)}
.nop-aud-param-reset{padding:6px 14px;font-size:11.5px}
/* 角标 */
.nop-sb-badge{position:absolute;bottom:6px;left:8px;padding:2px 8px;border-radius:4px;background:rgba(0,0,0,.7);color:#fff;font-size:10px;font-weight:600}
/* 操作按钮区 */
.nop-actions{display:flex;gap:7px;padding:9px 10px 10px}
.nop-btn{flex:1;min-width:0;padding:7px 8px;border-radius:8px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);color:#c8c8e0;font-size:11px;font-weight:600;cursor:pointer;transition:.15s;display:inline-flex;align-items:center;justify-content:center;gap:5px;white-space:nowrap}
.nop-btn:hover{background:rgba(139,92,246,.15);border-color:rgba(139,92,246,.35);color:#e0def0}
.nop-btn:active{transform:scale(.97)}
.nop-btn svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
.nop-btn.primary{background:linear-gradient(135deg,#8b5cf6,#ec4899);border-color:transparent;color:#fff}
.nop-btn.primary:hover{filter:brightness(1.1);border-color:transparent}
/* 3D 预览 */
.nop-3d .nop-empty{background:linear-gradient(145deg,#1a1a2e,#0f0f1a)}
/* ===== 对话式操作台（图片/视频 AI 生成） ===== */
.nop-chat{padding:14px 16px;display:flex;flex-direction:column;gap:8px}
.nop-chat-hint{font-size:13px;color:#8b8d9e;font-weight:500;display:flex;align-items:center;gap:5px}
.nop-chat-hint .at-mark{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;background:rgba(59,130,246,.18);color:#60a5fa;font-size:13px;font-weight:700}
.nop-chat-input-box{background:rgba(255,255,255,.06);border:1px solid rgba(139,92,246,.35);border-radius:14px;padding:12px;display:flex;flex-direction:column;gap:10px;transition:.15s}
/* ⚡ 聚焦零变化（用户要求）：点输入框不再亮边框/变背景，外观与未聚焦完全一致 */
.nop-chat-input-box:focus-within{border-color:rgba(139,92,246,.35);background:rgba(255,255,255,.06)}
.nop-chat-addref{width:44px;height:44px;border-radius:10px;background:rgba(255,255,255,.06);color:#9493a8;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:.15s;flex:none}
.nop-chat-addref:hover{background:rgba(139,92,246,.2);color:#c4b5fd}
.nop-chat-addref svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}
.nop-chat-ref-row{display:flex;gap:6px;flex-wrap:wrap}
/* 参考图行：加号+缩略图排列（⚡ 用户要求：去掉底部横向滚动条，排不下自动换行） */
.nop-ref-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.nop-ref-list{display:flex;gap:8px;flex-wrap:wrap;flex:none;min-width:0}
/* ⚡ 引用/参考全部无边框（用户要求"不要设计的跟按钮一样"）：
   ⚡ 悬停零变化（用户报"鼠标放上去图片会有变化"）：brightness(1.25) 亮度滤镜已删，
   hover 时格子本身纹丝不动——看内容靠悬停预览弹层/点击灯箱，格子不做任何视觉反馈
   ⚡ 格子加大（用户要求参考位置要能看到原图内容）：普通操作台 56px / 放大操作台 112px，
   40px 塞 2848px 原图信息损失 99%+ 视觉糊成色块 */
.nop-ref-item{position:relative;width:48px;height:48px;border-radius:9px;overflow:visible;cursor:pointer;flex:none}
.nop-ref-item img{width:48px;height:48px;object-fit:cover;display:block;border-radius:9px}
.nop-ref-item.matched::after{content:"";position:absolute;right:3px;bottom:3px;width:8px;height:8px;border-radius:50%;background:#22c55e;box-shadow:0 0 5px rgba(34,197,94,.9);z-index:2}
/* v1.3.2 删除按钮悬浮出角定位（top:-6px;right:-6px，用户确认的最初样式）。
   行改 flex-wrap:wrap 后无裁切盒（overflow 默认 visible），出角按钮/序号自然完整可见，
   旧版 padding/负 margin 缓冲与 overflow-x:auto 滚动条已随换行方案一并移除 */
.nop-ref-remove{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:rgba(0,0,0,.75);border:1px solid rgba(255,255,255,.45);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:3;transition:opacity .18s,background .2s,width .2s,height .2s,box-shadow .2s;padding:0;backdrop-filter:blur(4px);opacity:0;pointer-events:none}
/* 默认隐藏，悬停缩略图时才显示（悬停按钮本体也保持显示，避免移向按钮途中消失） */
.nop-ref-item:hover .nop-ref-remove,.nop-ref-remove:hover{opacity:1;pointer-events:auto}
.nop-ref-remove:hover{background:#ef4444;width:22px;height:22px;box-shadow:0 0 8px rgba(239,68,68,.7)}
.nop-ref-remove svg{width:10px;height:10px;stroke:currentColor;fill:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}
.nop-ref-remove:hover svg{width:11px;height:11px}
.nop-ref-type-badge{position:absolute;bottom:1px;left:1px;background:rgba(0,0,0,.7);border-radius:3px;padding:1px 3px;display:flex;align-items:center;pointer-events:none}
.nop-ref-type-badge svg{width:12px;height:12px;color:#fff}
/* ⚡ v1.3.2 固定槽位序号：位置几就是几，资产进入该槽位即得该号，不随 @ 顺序重排。
   移到左上外角（top:-6px;left:-6px），与右上删除按钮同基准对齐；常显不淡出，
   与删除钮分居两对角互不遮挡 */
.nop-ref-order{position:absolute;top:-6px;left:-6px;min-width:16px;height:16px;padding:0 4px;border-radius:4px;background:rgba(0,0,0,.72);color:#fff;font-size:10px;font-weight:700;line-height:16px;text-align:center;z-index:2;pointer-events:none;box-sizing:border-box}
/* v1.2.0 音频参考：面板占位图标（无缩略图）+ 输入框音频徽章图标 */
.nop-ref-audio-ico{width:48px;height:48px;border-radius:9px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,rgba(59,130,246,.16),rgba(139,92,246,.14));color:#8b9df5}
.nop-ref-audio-ico svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* ⚡ ico 必须是 inline-flex：块级 flex 会切断行内文本流导致强制换行；22px 与缩略图对齐 */
.nop-ref-badge-ico{width:22px;height:22px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:rgba(59,130,246,.18);color:#8b9df5;vertical-align:middle;margin:0 3px 0 0}
.nop-ref-badge-ico svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* 旧的参考图样式（保留兼容） */
.nop-chat-ref{display:none}
/* 输入框：contenteditable 版本 */
.nop-chat-input-edit{outline:none;cursor:text;min-height:52px;max-height:120px;overflow-y:auto;white-space:pre-wrap;word-break:break-word}
.nop-chat-input-edit:empty:before{content:attr(data-placeholder);color:#6b7280;pointer-events:none}
/* ⚡ 裸 img 兜底约束：拖拽/粘贴漏网的原图不允许撑开输入框（48px 缩略图化；
   徽章缩略图由下方 .nop-ref-badge img 的 22px 规则覆盖，不受影响） */
.nop-chat-input-edit img{max-width:48px;max-height:48px;object-fit:cover;border-radius:6px;vertical-align:middle}
/* ⚡ 行首徽章前的自绘光标（配合 app.js window.__opCaretGhost）：
   徽章是 contenteditable=false 原子元素且自身无文本，行首徽章前的原生光标会被
   Blink 锚到上一行换行符的字形盒画到上一行行尾。此处不垫任何隐形单位，改为把
   原生光标临时透明、在徽章本行行首叠加同色闪烁光标；pointer-events:none 不挡交互 */
.nop-caret-ghost{position:fixed;width:2px;border-radius:1px;pointer-events:none;z-index:10040;animation:nopCaretBlink 1s step-end infinite}
@keyframes nopCaretBlink{0%{opacity:1}50%{opacity:0}100%{opacity:1}}
/* 参考图徽章（输入框内） */
/* ⚡ v1.3.2 修正：@ 引用必须能看到资产图片。徽章 = 内联小图 + 名字文字。
   底板：灰色调半透明（用户要求灰色，不再用黑色），把引用资产与普通正文区分开；仍无边框（用户要求）。
   徽章 DOM 结构不变——槽位绑定（data-ref-idx/资产ID）、生成时的文本提取、
   Ctrl+Z 撤销、悬停预览全部照常；图片由 loadAssetsIn 按 data-asset-id 水合 */
/* ⚡ v1.3.4 紧凑原子徽章（文本流的收口版）：保持 display:inline 参与文字流，
   但徽章整体 white-space:nowrap——名字绝不断成两截（名字折行在视觉上就是
   "引用导致换行"，用户不可接受）。配合小图标 22px + 紧凑 padding，徽章整体
   宽度压到最低；行尾实在放不下时徽章作为整块换行（与 Slack/飞书 @提及
   行为一致），换行后名字完整、后面文字紧跟——不再出现"名字断成两半"。 */
.nop-ref-badge{display:inline;padding:2px 5px;border:none;border-radius:5px;background:rgba(148,148,160,.24);color:inherit;font-size:inherit;font-weight:inherit;margin:0 2px;white-space:nowrap}
/* ⚡ 徽章内缩略图：行内小图标（22px），跟文字同基线排布；仅展示用途——
   不可选择、不可拖拽（实际输入内容是名字文本，图片不参与提交） */
.nop-ref-badge img{display:inline-block;width:22px;height:22px;border:none;border-radius:6px;background:transparent;object-fit:cover;vertical-align:middle;margin:0 3px 0 0;user-select:none;-webkit-user-select:none;-webkit-user-drag:none}
/* ⚡ 徽章名字：单行显示，超长（>150px≈10个中文字）才截断省略——
   数据里名字始终完整（提交/生成用全名），只是视觉收紧防徽章过宽 */
.nop-ref-badge>span:not(.nop-ref-badge-ico):not(.nop-ref-use){display:inline-block;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}
/* ⚡ 徽章用途标注：点徽章名字弹菜单选「镜头参考图/人物站位图/首帧/尾帧」，默认不显示。
   标签随 data-use 存在，随 promptHtml 持久化；提交时在占位符后追加（用途） */
.nop-ref-use{display:inline-flex;align-items:center;flex:none;margin-left:2px;padding:1px 5px;border-radius:4px;background:rgba(148,163,184,.18);color:#a8b4c8;font-size:.78em;font-weight:600;line-height:1.3;white-space:nowrap}
.nop-ref-use.u-scene{background:rgba(96,165,250,.16);color:#7db4fb}
.nop-ref-use.u-env{background:rgba(45,212,191,.14);color:#5eead4}
.nop-ref-use.u-stand{background:rgba(251,191,36,.15);color:#f0c05a}
.nop-ref-use.u-first{background:rgba(74,222,128,.14);color:#6fd598}
.nop-ref-use.u-last{background:rgba(244,114,182,.15);color:#f18cc4}
/* 用途菜单：点徽章名字弹出，视觉沿用 .nop-pop 深色紫边风格 */
.nop-badge-use-menu{position:fixed;z-index:10050;min-width:176px;background:linear-gradient(180deg,rgba(31,31,47,.985),rgba(22,22,36,.99));border:1px solid rgba(139,92,246,.42);border-radius:12px;box-shadow:0 18px 50px -12px rgba(0,0,0,.78),0 0 0 1px rgba(139,92,246,.10);padding:5px;display:none}
.nop-badge-use-menu.show{display:block}
.nbu-title{font-size:10.5px;color:#8b8db0;font-weight:600;letter-spacing:.6px;padding:5px 9px 6px}
.nbu-item{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:8px;color:#c0c0d8;font-size:12.5px;cursor:pointer;transition:.13s;white-space:nowrap}
.nbu-item:hover{background:rgba(139,92,246,.18);color:#fff}
.nbu-item.on{background:linear-gradient(135deg,rgba(139,92,246,.35),rgba(236,72,153,.25));color:#fff}
.nbu-item .nbu-ico{width:20px;height:20px;flex:none;display:flex;align-items:center;justify-content:center;border-radius:6px;background:rgba(139,92,246,.16);color:#a78bfa}
.nbu-item.on .nbu-ico{background:linear-gradient(135deg,#8b5cf6,#ec4899);color:#fff}
.nbu-item .nbu-ico svg{width:11px;height:11px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nbu-item .nbu-check{margin-left:auto;color:#a78bfa;font-size:12px;visibility:hidden}
.nbu-item.on .nbu-check{visibility:visible}
.nbu-sep{height:1px;background:rgba(255,255,255,.08);margin:5px 4px}
.nbu-item.nbu-default .nbu-ico{background:rgba(255,255,255,.07);color:#9aa0b4}

.nop-chat-bottom{display:flex;align-items:center;justify-content:space-between;gap:10px}
.nop-chat-chips{display:flex;gap:10px;flex-wrap:wrap;flex:1;min-width:0}
.nop-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);color:#c8c8e0;font-size:12px;font-weight:500;cursor:pointer;transition:.15s;white-space:nowrap}
.nop-chip:hover{background:rgba(139,92,246,.15);border-color:rgba(139,92,246,.35);color:#e0def0}
.nop-chip:active{transform:scale(.97)}
.nop-chip-ico{width:22px;height:22px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;background:rgba(139,92,246,.2);color:#a78bfa;flex:none;font-size:10px;font-weight:700}
.nop-chip-ico.img2{background:linear-gradient(135deg,#3b82f6,#8b5cf6);color:#fff}
.nop-chip-ico svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nop-chip-label{font-size:12px}
.nop-chip-sep{color:#555770;font-size:11px}
/* 特价标签 — 芯片上的小徽章（⚡ 火焰版：四周火光呼吸闪烁 + 流光扫过，火花图标） */
.nop-chip-tag-special{display:inline-flex;align-items:center;gap:3px;padding:1.5px 7px 1.5px 5px;margin-left:7px;border-radius:5px;font-size:9.5px;font-weight:700;color:#fff;background-image:linear-gradient(105deg,transparent 42%,rgba(255,255,255,.55) 50%,transparent 58%),linear-gradient(135deg,#ff4500,#c1121f);background-size:220% 100%,160% 160%;background-position:-120% 0,0% 50%;background-repeat:no-repeat;line-height:1.4;white-space:nowrap;vertical-align:middle;letter-spacing:.5px;animation:tagFireGlow 1.8s ease-in-out infinite,tagShineBg 2.6s ease-in-out infinite}
/* ⚡ 格子定宽（用户要求）：芯片行改网格定轨，切换模型/风格/时长等内容变化时格子位置纹丝不动；
   轨道按比例分宽，任何面板宽度下都单行铺满不换行（时长芯片恒为第5格），超长名省略号 */
.nop-chat-chips .nop-chip{justify-content:center}
.nop-chat-chips .nop-chip-label{min-width:0;overflow:hidden;text-overflow:ellipsis}
/* ⚡ 轨道配比 + 芯片间空隙（用户要求"留一些空隙"）：gap 6→10px，与外层按钮间距(.nop-chat-bottom gap:10px)
   统一节奏；模型轨道按实测最坏文案保宽，比例/分辨率/时长捐出多余头部空间换空隙；
   实测约束（参考面板宽≈530px，gap10 下格宽约 143/122/70/85/72px）：
   模型 sd2.0mini+特价标实测需 139px（55标签+35徽章+16箭头+22内衬边框，旧注释≈131 系低估）、
   风格 4字选项+调色板图标≈120 需放下（动漫二次元≈132 走省略号）、16:9≈68、
   1080P≈80 / 自定义 1440P≈84、12s+锁≈64 —— 比例/分辨率/时长最坏文案必须完整，模型/风格超长走省略号；
   图片面板分辨率轨道 1fr 需容下自定义档位最长文案 1080x1920≈100 */
.nop-chips-5{display:grid;gap:10px;grid-template-columns:minmax(0,1.48fr) minmax(0,1.26fr) minmax(0,.72fr) minmax(0,.88fr) minmax(0,.74fr)}
.nop-chips-4{display:grid;gap:10px;grid-template-columns:minmax(0,1.6fr) minmax(0,.8fr) minmax(0,1fr) minmax(0,.9fr)}
.nop-chips-3{display:grid;gap:10px;grid-template-columns:minmax(0,1.6fr) minmax(0,.8fr) minmax(0,1fr)}
/* 特价标签 — 选项列表中的小徽章（⚡ 火焰版：四周火光呼吸闪烁 + 流光扫过 + 火花图标） */
.nop-opt-tag-special{display:inline-flex;align-items:center;gap:3px;padding:1.5px 7px 1.5px 5px;margin-left:9px;border-radius:4px;font-size:9.5px;font-weight:600;color:#fff;background-image:linear-gradient(105deg,transparent 42%,rgba(255,255,255,.55) 50%,transparent 58%),linear-gradient(135deg,#ff4500,#c1121f);background-size:220% 100%,160% 160%;background-position:-120% 0,0% 50%;background-repeat:no-repeat;line-height:1.4;white-space:nowrap;vertical-align:middle;letter-spacing:.5px;animation:tagFireGlow 1.8s ease-in-out infinite,tagShineBg 2.6s ease-in-out infinite}
.nop-opt-tag-special .nop-tag-spark{width:10px;height:10px;flex:none;filter:drop-shadow(0 0 2px rgba(255,120,40,.9))}
.nop-chip-tag-special .nop-tag-spark{width:10px;height:10px;flex:none;filter:drop-shadow(0 0 2px rgba(255,120,40,.9))}
/* 标签红光：纯红微光呼吸（用户不要黄色），与红底融为一体；文字流光：白色光带扫过标签 */
@keyframes tagFireGlow{0%,100%{box-shadow:0 0 3px 1px rgba(255,45,20,.42),0 0 7px 1px rgba(215,20,20,.34)}45%{box-shadow:0 0 5px 2px rgba(255,55,25,.58),0 0 10px 2px rgba(222,25,25,.46)}}
@keyframes tagShineBg{0%{background-position:-120% 0,0% 50%}55%,100%{background-position:220% 0,100% 50%}}
/* ===== 模型按钮（用户设计稿）：平时炫彩流光轮廓常亮，悬停整钮烈焰包裹快速燃烧 =====
   只命中三类模型按钮（imgModel/model/audModel），比例/分辨率/时长等其他按钮不受影响 */
@property --nbA{syntax:'<angle>';initial-value:0deg;inherits:false}
.nop-chip[data-nop-expand="imgModel"],.nop-chip[data-nop-expand="model"],.nop-chip[data-nop-expand="audModel"],
.nop-expand-opt[data-nop-opt="imgModel"],.nop-expand-opt[data-nop-opt="model"],.nop-expand-opt[data-nop-opt="audModel"]{position:relative;border:1px solid #4a4a5a;box-shadow:none}
/* 默认只有灰色边框；悬停时显示快速滑动的边框光圈，提示该按钮可以选择 */
.nop-chip[data-nop-expand="imgModel"]::before,.nop-chip[data-nop-expand="model"]::before,.nop-chip[data-nop-expand="audModel"]::before,
.nop-expand-opt[data-nop-opt="imgModel"]::before,.nop-expand-opt[data-nop-opt="model"]::before,.nop-expand-opt[data-nop-opt="audModel"]::before{content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1.6px;background:conic-gradient(from var(--nbA),transparent 0 58%,#a78bfa 70%,#22d3ee 80%,transparent 92%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;opacity:0;animation:none;pointer-events:none}
.nop-chip[data-nop-expand="imgModel"]:hover::before,.nop-chip[data-nop-expand="model"]:hover::before,.nop-chip[data-nop-expand="audModel"]:hover::before,
.nop-expand-opt[data-nop-opt="imgModel"]:hover::before,.nop-expand-opt[data-nop-opt="model"]:hover::before,.nop-expand-opt[data-nop-opt="audModel"]:hover::before{opacity:1;animation:nbRingSpin .7s linear infinite}
@keyframes nbRingSpin{to{--nbA:360deg}}
/* 悬停烈焰包裹（用户设计稿）：焰层覆盖按钮上方52px+左右14px+下方7px；蒙版并集抠出
   顶部喷发高焰+两侧火翼+底部火床的环抱形态（焰形自然避让按钮中部文字）；
   背景=静态温度渐变（焰基白黄最热→焰身橙→焰尖红）+双层金色火星列快速上飞；
   动画=0.5s形态剧烈抖动+0.65s呼吸拉伸+0.9s火星上升——快速燃烧 */
.nop-chip[data-nop-expand="imgModel"]::after,.nop-chip[data-nop-expand="model"]::after,.nop-chip[data-nop-expand="audModel"]::after,
.nop-expand-opt[data-nop-opt="imgModel"]::after,.nop-expand-opt[data-nop-opt="model"]::after,.nop-expand-opt[data-nop-opt="audModel"]::after{content:"";position:absolute;left:-14px;right:-14px;top:-52px;bottom:-7px;pointer-events:none;opacity:0;transition:opacity .1s ease;transform-origin:50% 60%;background:radial-gradient(circle 3px at 16% 24%,#fff2b8 0 55%,transparent 85%),radial-gradient(circle 2px at 44% 62%,#ffe08a 0 55%,transparent 85%),radial-gradient(circle 3.4px at 78% 36%,#fff6cf 0 55%,transparent 85%),radial-gradient(circle 2.6px at 26% 48%,#ffedb0 0 55%,transparent 85%),radial-gradient(circle 1.8px at 60% 20%,#ffe8a0 0 55%,transparent 85%),radial-gradient(circle 3px at 88% 66%,#fff4c6 0 55%,transparent 85%),linear-gradient(to top,rgba(255,150,60,.98) 0%,rgba(255,205,120,.9) 6%,rgba(255,130,45,.55) 12%,rgba(255,120,40,.42) 32%,#fff8e0 44%,#ffd166 55%,#ff8c1a 70%,#ff4300 85%,rgba(230,45,18,.12) 100%);background-size:100% 84px,100% 84px,100% 84px,100% 126px,100% 126px,100% 126px,100% 100%;-webkit-mask:radial-gradient(34px 58px at 50% 40px,#000 28%,transparent 80%),radial-gradient(16px 42px at 6% 36px,#000 50%,transparent 96%),radial-gradient(13px 27px at 24% 40px,#000 48%,transparent 96%),radial-gradient(24px 50px at 44% 32px,#000 52%,transparent 97%),radial-gradient(21px 45px at 63% 34px,#000 50%,transparent 96%),radial-gradient(13px 28px at 80% 40px,#000 48%,transparent 96%),radial-gradient(16px 41px at 95% 37px,#000 50%,transparent 96%),radial-gradient(15px 33px at 8px 62px,#000 48%,transparent 96%),radial-gradient(15px 33px at calc(100% - 8px) 62px,#000 48%,transparent 96%),radial-gradient(72px 26px at 50% calc(100% - 2px),#000 22%,transparent 78%),radial-gradient(66px 13px at 50% calc(100% - 2px),#000 45%,transparent 96%),radial-gradient(36px 9px at 15% calc(100% - 1px),#000 42%,transparent 96%),radial-gradient(36px 9px at 85% calc(100% - 1px),#000 42%,transparent 96%);mask:radial-gradient(34px 58px at 50% 40px,#000 28%,transparent 80%),radial-gradient(16px 42px at 6% 36px,#000 50%,transparent 96%),radial-gradient(13px 27px at 24% 40px,#000 48%,transparent 96%),radial-gradient(24px 50px at 44% 32px,#000 52%,transparent 97%),radial-gradient(21px 45px at 63% 34px,#000 50%,transparent 96%),radial-gradient(13px 28px at 80% 40px,#000 48%,transparent 96%),radial-gradient(16px 41px at 95% 37px,#000 50%,transparent 96%),radial-gradient(15px 33px at 8px 62px,#000 48%,transparent 96%),radial-gradient(15px 33px at calc(100% - 8px) 62px,#000 48%,transparent 96%),radial-gradient(72px 26px at 50% calc(100% - 2px),#000 22%,transparent 78%),radial-gradient(66px 13px at 50% calc(100% - 2px),#000 45%,transparent 96%),radial-gradient(36px 9px at 15% calc(100% - 1px),#000 42%,transparent 96%),radial-gradient(36px 9px at 85% calc(100% - 1px),#000 42%,transparent 96%)}
.nop-chip[data-nop-expand="imgModel"]:hover,.nop-chip[data-nop-expand="model"]:hover,.nop-chip[data-nop-expand="audModel"]:hover,
.nop-expand-opt[data-nop-opt="imgModel"]:hover,.nop-expand-opt[data-nop-opt="model"]:hover,.nop-expand-opt[data-nop-opt="audModel"]:hover{z-index:3}
.nop-chip[data-nop-expand="imgModel"]::after,.nop-chip[data-nop-expand="model"]::after,.nop-chip[data-nop-expand="audModel"]::after,
.nop-expand-opt[data-nop-opt="imgModel"]::after,.nop-expand-opt[data-nop-opt="model"]::after,.nop-expand-opt[data-nop-opt="audModel"]::after{display:none !important;content:none !important;opacity:0 !important;animation:none !important}
.nop-chip[data-nop-expand="imgModel"]:hover,.nop-chip[data-nop-expand="model"]:hover,.nop-chip[data-nop-expand="audModel"]:hover,
.nop-expand-opt[data-nop-opt="imgModel"]:hover,.nop-expand-opt[data-nop-opt="model"]:hover,.nop-expand-opt[data-nop-opt="audModel"]:hover{animation:none}
@keyframes nbFireRise{from{background-position:0 0,0 0,0 0,0 0,0 0,0 0,0 0}to{background-position:0 -84px,0 -84px,0 -84px,0 -126px,0 -126px,0 -126px,0 0}}
@keyframes nbFlameTurb{0%,100%{mask-position:0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0}25%{mask-position:2px -2px,3px -3px,-2px 2px,2px -4px,-3px 2px,2px 2px,-2px -2px,2px 0,-2px 1px,1px -1px,-2px 0,2px -1px,-1px 1px}55%{mask-position:-1px 2px,-2px 2px,3px -2px,-3px 3px,2px -3px,-1px 2px,3px 1px,-1px -2px,2px -1px,-1px 1px,2px 0,-1px 1px,1px -1px}80%{mask-position:1px -1px,2px -1px,-3px 1px,3px -2px,-2px -2px,3px -1px,-1px 3px,1px 2px,-1px -2px,2px -1px,-1px 1px,1px -2px,2px 1px}}
@keyframes nbFlameBreath{0%,100%{transform:scaleY(1) skewX(0deg)}30%{transform:scaleY(1.1) skewX(-1.4deg)}60%{transform:scaleY(.94) skewX(1.2deg)}}
.nop-chat-match{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border-radius:10px;background:linear-gradient(135deg,#a78bfa,#8b5cf6);border:1px solid rgba(167,139,250,.5);color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:.15s;flex:none}
.nop-chat-match:hover{filter:brightness(1.08);box-shadow:0 4px 16px -4px rgba(139,92,246,.5)}
.nop-chat-match:active{transform:scale(.97)}
.nop-chat-match svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nop-chat-match.disabled{opacity:.35;cursor:not-allowed;filter:grayscale(.5)}
.nop-chat-match.disabled:hover{filter:grayscale(.5);box-shadow:none}
/* ⚡ 生成按钮定宽（用户要求）：宽度恒 104px 够用即可不随内容伸缩——最宽内容
   ✦12+原价15+生成 ≈85px 留足余量，积分数字在 ✦6 / ✦6.25 / ✦6原价 / 免费 / 终止
   之间变化时按钮和整排位置纹丝不动；缩短释放的宽度全部让给左侧参数芯片行 */
.nop-chat-gen{display:inline-flex;align-items:center;justify-content:center;gap:6px;width:104px;padding:8px 0;border-radius:10px;background:linear-gradient(135deg,#3b82f6,#2563eb);border:1px solid rgba(59,130,246,.4);color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:.15s;flex:none}
.nop-chat-gen:hover{filter:brightness(1.1);box-shadow:0 4px 16px -4px rgba(59,130,246,.5)}
.nop-chat-gen:active{transform:scale(.97)}
.nop-chat-gen svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.nop-chat-gen:disabled{opacity:.5;cursor:not-allowed;filter:none;box-shadow:none}
.nop-chat-gen.error{background:linear-gradient(135deg,#ef4444,#dc2626);border-color:rgba(239,68,68,.4)}
.nop-chat-gen.error:hover{box-shadow:0 4px 16px -4px rgba(239,68,68,.5)}
/* 生成中 → 终止按钮：深灰底白字方块图标，与"生成/重试"明显区分 */
.nop-chat-gen.running{background:linear-gradient(135deg,#475569,#334155);border-color:rgba(148,163,184,.5);animation:genPulse 1.6s ease-in-out infinite}
.nop-chat-gen.running:hover{box-shadow:0 4px 16px -4px rgba(71,85,105,.6)}
.nop-chat-gen.running svg{fill:currentColor;stroke:none}
/* 生成按钮内的消耗积分（参考UI）：✦图标(青) + 当前消耗(白) + 特价时原价删除线(灰) + 生成 */
.nop-gen-credit{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;min-width:0;overflow:hidden}
.nop-gen-credit + span{margin-left:4px}
.nop-gen-ico{color:#7dd3fc;font-style:normal;font-size:12px;line-height:1;text-shadow:0 0 6px rgba(125,211,252,.55)}
.nop-gen-num{color:#fff;font-weight:800;font-size:13px;line-height:1;font-variant-numeric:tabular-nums}
.nop-gen-orig{color:rgba(255,255,255,.5);text-decoration:line-through;font-weight:500;font-size:11px;line-height:1}
.nop-gen-credit.special .nop-gen-num{color:#fbbf24}
.nop-gen-credit.special .nop-gen-ico{color:#fbbf24;text-shadow:0 0 6px rgba(251,191,36,.5)}
.nop-gen-credit.free{color:#34d399;font-weight:700;font-size:12px}
@keyframes genPulse{0%,100%{filter:brightness(1)}50%{filter:brightness(1.25)}}
/* 芯片展开箭头 */
.nop-chip-arrow{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;color:#71718a;transition:transform .2s ease;margin-left:2px}
.nop-chip-arrow svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}
.nop-chip.on .nop-chip-arrow{transform:rotate(180deg);color:#c4b5fd}
.nop-chip.on{background:rgba(139,92,246,.18);border-color:rgba(139,92,246,.45);color:#fff}
/* 旧的下伸缩面板已废弃：选项改为芯片正上方的悬浮弹窗（.nop-pop），此容器仅作内容模板，永不显示、不占布局 */
.nop-expand-panel{display:none!important}
.nop-expand-section{display:none}
/* ===== 芯片上弹式悬浮选择层 ===== */
.nop-pop{position:fixed;z-index:10020;display:none;width:264px;max-width:calc(100vw - 16px);opacity:0;transform:translateY(6px) scale(.98);transition:opacity .16s ease,transform .16s ease;pointer-events:auto}
.nop-pop.show{opacity:1;transform:none}
.nop-pop-body{position:relative;background:linear-gradient(180deg,rgba(31,31,47,.985),rgba(22,22,36,.99));border:1px solid rgba(139,92,246,.42);border-radius:14px;box-shadow:0 18px 50px -12px rgba(0,0,0,.78),0 0 0 1px rgba(139,92,246,.10),0 6px 20px -8px rgba(139,92,246,.35);padding:12px;max-height:60vh;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(139,92,246,.4) transparent}
.nop-pop-body::-webkit-scrollbar{width:6px}
.nop-pop-body::-webkit-scrollbar-track{background:transparent}
.nop-pop-body::-webkit-scrollbar-thumb{background:rgba(139,92,246,.35);border-radius:3px}
.nop-pop-body .nop-expand-title{font-size:11px;color:#8b8db0;font-weight:600;margin:0 0 10px 2px;letter-spacing:.6px}
.nop-pop-body .nop-expand-opts{display:flex;flex-wrap:wrap;gap:8px}
.nop-pop-body .nop-expand-opt{display:inline-flex;align-items:center;padding:8px 14px;border-radius:10px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.10);color:#c0c0d8;font-size:12.5px;font-weight:500;cursor:pointer;transition:.15s;white-space:nowrap}
.nop-pop-body .nop-expand-opt:hover{background:rgba(139,92,246,.18);border-color:rgba(139,92,246,.45);color:#fff}
.nop-pop-body .nop-expand-opt.on{background:linear-gradient(135deg,rgba(139,92,246,.42),rgba(236,72,153,.32));border-color:rgba(167,139,250,.65);color:#fff;box-shadow:0 2px 10px -2px rgba(139,92,246,.5)}
.nop-pop-body .nop-expand-opt:active{transform:scale(.96)}
.nop-pop-body .nop-style-custom{display:block;width:100%;box-sizing:border-box;margin-top:10px;background:rgba(255,255,255,.04);border:1px solid rgba(139,92,246,.35);border-radius:10px;color:#e0def0;font-size:12px;line-height:1.6;padding:8px 10px;resize:vertical;font-family:inherit;min-height:52px}
.nop-pop-body .nop-style-custom:focus{outline:none;border-color:rgba(167,139,250,.65);box-shadow:0 0 0 3px rgba(139,92,246,.15)}
.nop-pop-body .nop-style-custom::placeholder{color:#6b6b85}
.nop-pop-arrow{position:absolute;bottom:-6px;width:12px;height:12px;background:rgb(26,26,40);border-right:1px solid rgba(139,92,246,.42);border-bottom:1px solid rgba(139,92,246,.42);transform:rotate(45deg);z-index:1}
/* ===== 时长精准滑动条 ===== */
.nop-dur{padding:2px 2px 0}
.nop-dur-top{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:14px}
.nop-dur-title{font-size:11px;color:#8b8db0;font-weight:600;letter-spacing:.6px}
.nop-dur-val{font-size:20px;font-weight:700;background:linear-gradient(135deg,#c4b5fd,#f0abfc);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;line-height:1}
.nop-dur-range{-webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:999px;outline:none;cursor:pointer;background:linear-gradient(to right,#8b5cf6 0%,#ec4899 var(--pct,8%),rgba(255,255,255,.10) var(--pct,8%),rgba(255,255,255,.10) 100%)}
/* 一口价模型：时长芯片锁定 + 滑动条禁用 */
.nop-chip-locked{cursor:default}
.nop-chip-locked .nop-chip-arrow svg{width:11px;height:11px;color:#f59e0b}
.nop-dur-locked{border:1px solid rgba(245,158,11,.4);border-radius:10px;padding:7px 9px;margin:2px -4px 0;background:rgba(245,158,11,.05)}
.nop-dur-locked .nop-dur-title{display:inline-flex;align-items:center;gap:6px}
.nop-dur-range:disabled{cursor:not-allowed;opacity:.55;background:linear-gradient(to right,#f59e0b 0%,#f59e0b var(--pct,8%),rgba(255,255,255,.10) var(--pct,8%),rgba(255,255,255,.10) 100%)}
.nop-dur-range:disabled::-webkit-slider-thumb{cursor:not-allowed;transform:none;border-color:#f59e0b;box-shadow:0 2px 8px rgba(245,158,11,.5)}
.nop-dur-range:disabled::-moz-range-thumb{cursor:not-allowed;border-color:#f59e0b}
.nop-dur-locked .nop-dur-hint{color:#f59e0b}
.nop-dur-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:20px;height:20px;border-radius:50%;background:#fff;border:3px solid #8b5cf6;box-shadow:0 2px 10px rgba(139,92,246,.7),0 0 0 4px rgba(139,92,246,.18);cursor:grab;transition:transform .12s,box-shadow .12s}
.nop-dur-range::-webkit-slider-thumb:hover{transform:scale(1.15);box-shadow:0 2px 14px rgba(139,92,246,.9),0 0 0 6px rgba(139,92,246,.22)}
.nop-dur-range::-webkit-slider-thumb:active{cursor:grabbing;transform:scale(1.05)}
.nop-dur-range::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#fff;border:3px solid #8b5cf6;box-shadow:0 2px 10px rgba(139,92,246,.7);cursor:grab}
.nop-dur-range::-moz-range-track{height:6px;border-radius:999px;background:rgba(255,255,255,.10)}
.nop-dur-range::-moz-range-progress{height:6px;border-radius:999px;background:linear-gradient(to right,#8b5cf6,#ec4899)}
.nop-dur-scale{display:flex;justify-content:space-between;margin-top:9px;font-size:11px;color:#6b6d88;font-weight:500}
.nop-dur-hint{margin-top:10px;padding:7px 10px;border-radius:8px;background:rgba(139,92,246,.10);border:1px solid rgba(139,92,246,.22);color:#a5a3c8;font-size:11px;line-height:1.4;text-align:center}
.nop-expand-title{font-size:11px;color:#71718a;font-weight:600;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}
.nop-expand-opts{display:flex;flex-wrap:wrap;gap:7px}
.nop-expand-opt{display:inline-flex;align-items:center;padding:7px 14px;border-radius:10px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);color:#b8b8d0;font-size:12px;font-weight:500;cursor:pointer;transition:.15s;white-space:nowrap}
.nop-expand-opt:hover{background:rgba(139,92,246,.15);border-color:rgba(139,92,246,.35);color:#e0def0}
.nop-expand-opt.on{background:linear-gradient(135deg,rgba(139,92,246,.3),rgba(236,72,153,.25));border-color:rgba(139,92,246,.5);color:#fff}
.nop-expand-opt:active{transform:scale(.97)}
/* ===== v1.3.2 放大模式：除输入区变高外，一切与普通模式同尺寸 =====
   宽度对齐普通模式视觉宽 800px（chips 定轨 grid 才能铺出同样的格子宽，不再挤压），
   预览区/标题/参考行/徽章/底部芯片与按钮全部继承普通模式样式（旧的放大覆盖规则已删），
   仅保留结构规则：面板高度 600px，输入框 flex 撑满剩余空间，方便检查长提示词 */
.node-op.expanded .nop-chat{flex:1 1 auto;min-height:0;overflow:hidden}
.node-op.expanded .nop-chat-input-box{flex:1 1 auto;min-height:0;overflow:hidden}
.node-op.expanded .nop-ref-row{flex:none}
/* 中间文本框：填满标题与底部按钮之间的全部剩余空间，文字超出只在框内滚动（面板外层不出滚动轨道） */
.node-op.expanded .nop-chat-input-edit{flex:1 1 auto;min-height:0;max-height:none}
.node-op.expanded .nop-chat-bottom{flex:none}
/* 空状态节点 */
.node-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:28px 20px;text-align:center;min-height:120px;pointer-events:none}
.node-empty-169{aspect-ratio:16/9;min-height:auto;padding:0}
.node-empty.clickable{cursor:pointer;transition:.15s;border-radius:12px}
.node-empty.clickable:hover{background:rgba(139,92,246,.06)}
.ne-ico{width:56px;height:56px;border-radius:16px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(145deg,rgba(139,92,246,.18),rgba(236,72,153,.12));color:#a78bfa}
.node-empty-169 .ne-ico{width:44px;height:44px;border-radius:12px}
.node-empty-169 .ne-ico svg{width:24px;height:24px}
.ne-ico svg{width:30px;height:30px;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.ne-ico.spin{animation:neSpin 1s linear infinite}
@keyframes neSpin{from{transform:rotate(0)}to{transform:rotate(360deg)}}
.node-empty p{color:#9493a8;font-size:14px;margin:0;font-weight:500;line-height:1.5}
/* ⚡ 空态图片节点中央上传按钮：node-empty 整体 pointer-events:none，按钮单独恢复事件 */
.node-empty .node-upload-btn{pointer-events:auto;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:99px;border:1px solid rgba(139,92,246,.35);background:rgba(139,92,246,.12);color:#c4b5fd;font-size:13px;font-weight:600;cursor:pointer;transition:.15s;font-family:inherit}
.node-empty .node-upload-btn:hover{background:rgba(139,92,246,.28);border-color:rgba(139,92,246,.7);color:#fff}
.node-empty .node-upload-btn:active{transform:scale(.96)}
.node-empty .node-upload-btn svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* 预览区（图片/视频/文本/音频） */
.node-preview{position:relative;width:100%;border-radius:10px;overflow:hidden;background:#0a0a14;border:1px solid rgba(255,255,255,.05);box-sizing:border-box}
.node-preview img,.node-preview audio{width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}
/* ⚡ v2.30 视频节点：原视频直挂；视频本体不接收点击，独立播放按钮控制，避免污染节点选中/拖动 */
.video-direct-preview{position:relative;overflow:hidden}
.video-direct-preview video{width:100%;height:100%;object-fit:contain;display:block;pointer-events:none}
/* 视频抽帧选择器：参考图的预览 + 时间轴 + 确认保存流程 */
.video-frame-mask{position:fixed;inset:0;z-index:10080;display:flex;align-items:center;justify-content:center;background:rgba(8,8,16,.72);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);padding:24px}
.video-frame-box{width:min(720px,92vw);max-height:90vh;overflow:auto;border:1px solid rgba(255,255,255,.14);border-radius:16px;background:#171522;box-shadow:0 24px 80px rgba(0,0,0,.52);color:#f8f7ff}
.video-frame-head{height:56px;padding:0 18px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid rgba(255,255,255,.1);font-size:16px}
.video-frame-close{width:32px;height:32px;border:0;border-radius:8px;background:transparent;color:#bcb8cf;font-size:24px;cursor:pointer}.video-frame-close:hover{background:rgba(255,255,255,.1);color:#fff}
.video-frame-stage{margin:18px 18px 10px;min-height:240px;display:flex;align-items:center;justify-content:center;border-radius:10px;overflow:hidden;background:#0b0a10}
.video-frame-video{display:block;width:100%;max-height:56vh;object-fit:contain}
.video-frame-time{display:flex;justify-content:center;gap:8px;color:#ddd8ee;font:600 13px/1.2 ui-monospace,SFMono-Regular,Consolas,monospace}
.video-frame-progress{margin:14px 18px 4px;padding:10px 12px 8px;border:1px solid rgba(255,255,255,.12);border-radius:8px;background:#101722}
.video-frame-range{display:block;width:100%;height:8px;margin:0;appearance:none;-webkit-appearance:none;cursor:pointer;background:linear-gradient(90deg,#58a6ff 0%,#8b5cf6 50%,#ec4899 100%);border-radius:999px;outline:none}
.video-frame-range::-webkit-slider-runnable-track{height:8px;border-radius:999px;background:linear-gradient(90deg,#58a6ff,#8b5cf6,#ec4899);box-shadow:0 0 10px rgba(139,92,246,.35)}
.video-frame-range::-webkit-slider-thumb{appearance:none;-webkit-appearance:none;width:18px;height:18px;margin-top:-5px;border:3px solid #fff;border-radius:50%;background:#8b5cf6;box-shadow:0 0 0 3px rgba(139,92,246,.34),0 2px 8px rgba(0,0,0,.55)}
.video-frame-range::-moz-range-track{height:8px;border-radius:999px;background:linear-gradient(90deg,#58a6ff,#8b5cf6,#ec4899);box-shadow:0 0 10px rgba(139,92,246,.35)}
.video-frame-range::-moz-range-progress{height:8px;border-radius:999px;background:#8b5cf6}
.video-frame-range::-moz-range-thumb{width:14px;height:14px;border:3px solid #fff;border-radius:50%;background:#8b5cf6;box-shadow:0 0 0 3px rgba(139,92,246,.34)}
.video-frame-strip-wrap,.video-frame-strip,.video-frame-selector{display:none!important}
.video-frame-controls{display:flex;gap:8px;padding:8px 18px 0}.video-frame-controls button{height:28px;padding:0 9px;border:1px solid rgba(255,255,255,.16);border-radius:6px;background:#1b222d;color:#dce5f3;font-size:11px;cursor:pointer}.video-frame-controls button:hover{background:#293545;border-color:#60a5fa}.video-frame-controls kbd{margin-left:4px;padding:1px 4px;border:1px solid rgba(255,255,255,.18);border-radius:3px;color:#9ca9ba;font-size:10px}
.video-frame-tip{text-align:center;color:#8f99a8;font-size:12px;padding-top:6px}
.video-frame-range{display:block!important}
.video-frame-foot{display:flex;justify-content:flex-end;gap:10px;padding:16px 18px}.video-frame-foot button{height:36px;padding:0 16px;border-radius:8px;border:1px solid rgba(255,255,255,.14);background:#202832;color:#eef4ff;cursor:pointer}.video-frame-foot button:hover{background:#2b3644}.video-frame-save{background:#1677ff!important;border-color:#2685ff!important}.video-frame-save:disabled{opacity:.6;cursor:wait}

.node-video-play{display:none!important}
/* 资产节点预览：图片/视频完整显示，不裁剪 */
.node-preview.asset-preview img{object-fit:contain}
.video-direct-preview.asset-preview video{object-fit:contain}
/* ⚡ 悬停播放期间底部自绘控制条（唯一可交互区域，图2 播放器样式）：
   播放/暂停 · 时间 · 细线进度（悬停加粗+圆点） · 音量 · 网页全屏 · 更多。
   播放中鼠标静止 2.6s 自动淡出（.idle），一动即现，暂停时常驻（网页全屏态使用） */
.np-vcbar{position:absolute;left:10px;right:10px;bottom:10px;z-index:100;display:flex;align-items:center;gap:7px;padding:6px 9px;background:transparent;border:0;border-radius:4px;box-shadow:none;transition:opacity .25s ease;pointer-events:auto!important;user-select:none;-webkit-user-select:none;touch-action:none}
.np-vcbar.idle{opacity:0;pointer-events:none!important}
.np-vcbar .np-vc-btn{flex:none;width:26px;height:26px;background:transparent;border:0;color:#fff;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;opacity:1;border-radius:50%;pointer-events:auto!important;touch-action:manipulation;position:relative;z-index:101}
.np-vcbar .np-vc-btn:hover{background:rgba(255,255,255,.16);opacity:1}
.np-vcbar .np-vc-btn svg{width:15px;height:15px;filter:drop-shadow(0 1px 2px rgba(0,0,0,.55))}
.np-vcbar .np-vc-play{color:#fff}
.np-vcbar .np-vc-current,.np-vcbar .np-vc-duration{flex:none;color:#fff;font-size:11px;line-height:1;font-variant-numeric:tabular-nums;min-width:29px;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.7)}
.np-vcbar .np-vc-time{display:none}
.np-vcbar .np-vc-track{flex:1;height:16px;display:flex;align-items:center;cursor:pointer;touch-action:auto;pointer-events:auto!important;position:relative;z-index:101}
.np-vcbar .np-vc-rail{position:relative;width:100%;height:4px;border-radius:999px;background:rgba(255,255,255,.38);overflow:visible;transition:height .12s ease;box-shadow:0 1px 3px rgba(0,0,0,.35)}
.np-vcbar .np-vc-fill{position:absolute;left:0;top:0;bottom:0;width:0%;border-radius:999px;background:linear-gradient(90deg,#a78bfa 0%,#c4b5fd 55%,#fff 100%);box-shadow:0 0 7px rgba(167,139,250,.8)}
.np-vcbar .np-vc-dot{position:absolute;top:50%;left:0;width:9px;height:9px;border-radius:50%;background:#fff;transform:translate(-50%,-50%);transition:width .12s ease,height .12s ease;box-shadow:0 0 0 2px rgba(167,139,250,.65),0 1px 5px rgba(0,0,0,.55)}
.np-vcbar .np-vc-track:hover .np-vc-rail{height:4px}
.np-vcbar .np-vc-track:hover .np-vc-dot{width:10px;height:10px}
/* 更多菜单（下载视频）：从控制条上方弹出 */
.np-vc-menu{position:absolute;right:8px;bottom:calc(100% + 6px);min-width:128px;background:rgba(18,18,28,.96);border:1px solid rgba(255,255,255,.14);border-radius:9px;padding:4px;box-shadow:0 12px 32px -8px rgba(0,0,0,.75);z-index:6}
.np-vc-menu .np-vc-mi{display:flex;align-items:center;gap:8px;width:100%;background:transparent;border:none;color:#e6e4f5;font-size:12px;padding:7px 10px;border-radius:6px;cursor:pointer}
.np-vc-menu .np-vc-mi:hover{background:rgba(139,92,246,.28);color:#fff}
.np-vc-menu .np-vc-mi svg{width:14px;height:14px}
.np-vcbar .np-vc-track:focus-visible{outline:2px solid #c084fc;outline-offset:3px;border-radius:5px}
.np-vcbar .np-vc-btn:focus-visible{outline:2px solid #c084fc;outline-offset:2px}
/* 网页全屏：视频铺满视口 + 同款控制条放大版；点画面=播放/暂停，×/ESC 关闭 */
.vid-fs-mask{position:fixed;inset:0;z-index:10001;background:#000;display:flex;align-items:center;justify-content:center;animation:nzFade .18s ease}
.vid-fs-mask video{width:100%;height:100%;object-fit:contain;background:#000;display:block}
.vid-fs-mask .nz-close{top:16px;right:16px}
.vid-fs-mask .np-vcbar{padding:12px 18px;gap:12px;background:linear-gradient(180deg,transparent,rgba(0,0,0,.6))}
.vid-fs-mask .np-vc-btn svg{width:22px;height:22px}
.vid-fs-mask .np-vc-time{font-size:13px}
.vid-fs-mask .np-vc-rail{height:3px}
.vid-fs-mask .np-vc-track:hover .np-vc-rail{height:5px}
.vid-fs-mask .np-vc-track:hover .np-vc-dot{width:13px;height:13px}
.np-empty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:linear-gradient(145deg,#12131f,#0d0e18)}
.np-empty .ne-ico{width:44px;height:44px}
.np-empty .ne-ico svg{width:24px;height:24px}
.np-empty p{color:#71718a;font-size:13px;margin:0}
.np-clear{position:absolute;top:8px;right:8px;width:26px;height:26px;border-radius:8px;background:rgba(0,0,0,.55);backdrop-filter:blur(6px);border:1px solid rgba(255,255,255,.12);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;transition:.15s}
.node-preview:hover .np-clear{opacity:1}
.np-clear:hover{background:rgba(239,68,68,.6)}
.np-clear svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* 图片/视频节点生成中进度动画 */
.node-gen-loading{background:linear-gradient(145deg,#12131f,#0d0e18)}
/* 图片/视频生成节点成片：裸图直接显示（无卡片内框/留白/背景；选中/多选/拖拽/平移也不加框） */
.b-node.bare-media,.board-viewport .b-node.bare-media{background:transparent!important;border-color:transparent!important;box-shadow:none!important}
.b-node.bare-media .bn-body{padding:0}
.b-node.bare-media .node-preview{border:none;background:transparent;border-radius:14px;overflow:hidden}
.b-node.bare-media .node-preview img{object-fit:contain}
.gen-loading-inner{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px}
.gen-spinner{width:36px;height:36px;border-radius:50%;border:3px solid rgba(139,92,246,.2);border-top-color:#8b5cf6;animation:genSpin 0.9s linear infinite}
@keyframes genSpin{to{transform:rotate(360deg)}}
.gen-loading-text{color:#9493a8;font-size:13px;margin:0;font-weight:500}
.ne-ico.spin{animation:genSpin 1s linear infinite}
/* 生成失败状态 */
.node-gen-error{background:linear-gradient(145deg,#1a0f14,#120a0e);overflow:hidden}
.gen-error-inner{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;text-align:center}
.gen-error-ico{width:36px;height:36px;color:#f87171;display:flex;align-items:center;justify-content:center}
.gen-error-ico svg{width:100%;height:100%;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.gen-error-text{color:#f87171;font-size:14px;margin:0;font-weight:600}
.gen-error-msg{color:#9493a8;font-size:11px;margin:0;line-height:1.4;max-width:90%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
/* 节点操作按钮栏 */
.node-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.na-btn{display:inline-flex;align-items:center;gap:5px;height:32px;padding:0 12px;border-radius:10px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);color:#c8c8e0;font-size:12px;font-weight:600;cursor:pointer;transition:.15s;white-space:nowrap}
.na-btn:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.15);color:#fff}
.na-btn svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.na-btn.primary{background:linear-gradient(135deg,#8b5cf6,#6366f1);border-color:transparent;color:#fff;box-shadow:0 4px 14px rgba(139,92,246,.4)}
.na-btn.primary:hover{filter:brightness(1.1);transform:translateY(-1px)}
/* 文本节点内容 */
.np-text{position:absolute;inset:0;padding:12px 14px;overflow:hidden;display:flex;flex-direction:column;gap:6px;pointer-events:none}
.nt-title{font-size:13px;font-weight:700;color:#fff;line-height:1.4;flex:none}
.nt-content{font-size:12px;line-height:1.6;color:#c8c8e0;word-break:break-word;white-space:pre-wrap;overflow:hidden;display:-webkit-box;-webkit-line-clamp:6;-webkit-box-orient:vertical}
.bn-textarea{width:100%;min-height:140px;background:transparent;border:1px solid rgba(139,92,246,.3);border-radius:10px;padding:10px 12px;color:var(--text);font-size:13px;line-height:1.7;outline:none;resize:none;font-family:inherit;box-sizing:border-box}
.bn-textarea:focus{border-color:rgba(139,92,246,.6);background:rgba(139,92,246,.06)}
.hidden-edit{display:none}
.text-preview + .bn-textarea{display:none}
/* ===== 文本节点中段：可直接输入的文本框 + 内嵌右下角放大按钮 ===== */
.tn-editor{position:relative;height:168px}
.tn-input{
  width:100%;height:100%;
  box-sizing:border-box;
  padding:11px 12px;
  background:#0a0a14;
  border:1px solid rgba(255,255,255,.07);
  border-radius:10px;
  color:var(--text,#e6e6f2);
  font-size:12.5px;line-height:1.65;
  font-family:inherit;
  outline:none;resize:none;
}
.tn-input::placeholder{color:#5b5975}
/* 聚焦态不做任何外观变化（用户要求：光标进框前后视觉一致） */

/* ===== 文本分析节点 ===== */
/* 右下角放大编辑按钮：内嵌在输入框容器右下角（设计图2） */
.tn-expand-btn{
  position:absolute;right:7px;bottom:7px;
  width:26px;height:26px;border-radius:7px;
  display:inline-flex;align-items:center;justify-content:center;
  background:rgba(15,15,26,.88);
  border:1px solid rgba(255,255,255,.16);
  color:#a78bfa;cursor:pointer;
  transition:border-color .15s,background .15s,color .15s;
  z-index:2;pointer-events:auto;padding:0;flex:none;
}
.tn-expand-btn:hover,.tn-expand-btn:focus-visible{
  border-color:rgba(139,92,246,.75);
  background:rgba(139,92,246,.45);color:#fff;
}
.tn-expand-btn svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

/* 分析控制面板：顶部下拉行 / 底部类型+生成行 */
.tn-controls{
  display:flex;flex-direction:column;gap:8px;
}
.tn-controls-top{margin:0 0 10px}
.tn-controls-bottom{margin-top:10px}
.tn-ctrl-row{
  display:flex;align-items:center;gap:8px;
}

/* 下拉选择器 */
.tn-select{
  flex:1;min-width:0;
  display:flex;align-items:center;gap:6px;
  padding:6px 9px;
  background:rgba(255,255,255,.04);
  border:1px solid rgba(255,255,255,.08);
  border-radius:8px;
  cursor:pointer;
  transition:all .15s;
  font-size:11.5px;font-weight:600;color:#e0def0;
}
.tn-select:hover{
  border-color:rgba(139,92,246,.4);
  background:rgba(139,92,246,.08);
}
.tn-sel-ico{
  width:19px;height:19px;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;
  background:rgba(139,92,246,.22);color:#a78bfa;
  flex:none;
}
.tn-sel-ico svg{width:11px;height:11px;stroke:currentColor;fill:none;stroke-width:2}
.tn-ico-agent{background:rgba(34,211,238,.18);color:#22d3ee}
.tn-sel-text{
  flex:1;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.tn-sel-chev{
  color:#6b6980;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
}
.tn-sel-chev svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2}

/* 类型按钮组 */
.tn-type-group{
  flex:1;display:flex;gap:4px;min-width:0;
}
.tn-type-btn{
  flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;
  gap:4px;
  padding:7px 2px;
  background:rgba(255,255,255,.04);
  border:1px solid rgba(255,255,255,.08);
  border-radius:8px;
  cursor:pointer;
  color:#8e8ca8;
  transition:all .15s;
  font-size:11px;font-weight:600;
  min-width:0;
}
.tn-type-btn svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}
.tn-type-btn span{pointer-events:none;white-space:nowrap}
.tn-type-btn:hover{
  border-color:rgba(255,255,255,.16);
  color:#c9c7e0;
}
.tn-type-btn.on{
  background:linear-gradient(135deg,#7c3aed,#8b5cf6);
  border-color:rgba(167,139,250,.8);
  color:#fff;
  box-shadow:0 3px 10px -3px rgba(139,92,246,.55);
}

/* 生成按钮 */
.tn-gen-btn{
  flex:none;
  display:flex;align-items:center;gap:5px;
  padding:7px 14px;
  background:linear-gradient(135deg,#8b5cf6,#ec4899);
  border:none;border-radius:8px;
  color:#fff;font-size:11.5px;font-weight:700;
  cursor:pointer;
  transition:all .2s;
  white-space:nowrap;
}
.tn-gen-btn svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}
.tn-gen-btn:hover{
  transform:translateY(-1px);
  box-shadow:0 6px 16px -4px rgba(139,92,246,.5);
}
.tn-gen-btn:active{transform:translateY(0)}
/* 生成→停止切换态（分析进行中，与主聊天停止按钮同款红色脉冲） */
.tn-gen-btn.stop-mode{background:#ef4444;animation:pulse-stop 1.5s ease-in-out infinite}
.tn-gen-btn.stop-mode:hover{filter:brightness(1.15);transform:scale(1.03);box-shadow:0 6px 16px -4px rgba(239,68,68,.5)}
.tn-gen-btn.stop-mode svg{stroke-width:3}

/* 文本分析弹窗 */
.tn-modal-mask{
  position:fixed;inset:0;
  background:rgba(0,0,0,.55);backdrop-filter:blur(4px);
  display:none;align-items:center;justify-content:center;
  z-index:9998;
}
.tn-modal-mask.show{display:flex}
.tn-modal{
  width:90%;max-width:640px;
  height:70vh;
  background:#1a1a2a;
  border:1px solid rgba(255,255,255,.08);
  border-radius:14px;
  display:flex;flex-direction:column;
  box-shadow:0 20px 60px -10px rgba(0,0,0,.5);
  overflow:hidden;
}
.tn-modal-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:11px 14px;
  border-bottom:1px solid rgba(255,255,255,.06);
  background:rgba(255,255,255,.02);
}
.tn-modal-title{
  display:flex;align-items:center;gap:8px;
  font-size:13px;font-weight:700;color:#e0def0;
}
.tn-modal-title svg{width:14px;height:14px;stroke:#a78bfa;fill:none;stroke-width:2}
.tn-modal-head-right{display:flex;align-items:center;gap:10px}
.tn-modal-count{font-size:11.5px;color:#8e8ca8}
.tn-modal-count strong{color:#e0def0;font-weight:700}
.tn-modal-close{
  width:24px;height:24px;border-radius:6px;
  display:inline-flex;align-items:center;justify-content:center;
  background:transparent;border:none;
  color:#6b6980;cursor:pointer;
  transition:.15s;
}
.tn-modal-close:hover{background:rgba(255,255,255,.06);color:#e0def0}
.tn-modal-close svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2}
.tn-modal-body{
  flex:1;padding:14px;
  display:flex;
  overflow:hidden;
}
/* 输入放大编辑弹窗的多行文本框（展开编辑用，结果弹窗已改 .tn-modal-md 渲染） */
.tn-modal-textarea{
  width:100%;height:100%;flex:1;
  background:rgba(255,255,255,.03);
  border:1px solid rgba(255,255,255,.08);
  border-radius:10px;
  padding:12px;
  color:#e0def0;font-size:13px;line-height:1.7;
  resize:none;outline:none;
  box-sizing:border-box;
  font-family:inherit;
}

/* 分析结果：纯提示词展示框（文本 + 右下角放大查看，无多余控件） */
.tn-result{
  position:relative;
  margin-top:10px;
  background:#0a0a14;
  border:1px solid rgba(255,255,255,.07);
  border-radius:10px;
  overflow:hidden;
}
.tn-result .sb-text{max-height:220px}
/* 分析结果：与主页对话同款 markdown 渲染（renderMarkdown 已把换行转 <br>，不用 pre-wrap） */
.tn-result-raw{padding:11px 12px}
.tn-result-raw .reasoning-box{margin:0 0 8px}
.tn-result-raw .md-h3{font-size:14px;font-weight:700;color:#f3f3f7;margin:10px 0 6px;line-height:1.4}
.tn-result-raw .md-h4{font-size:13px;font-weight:650;color:#ededf4;margin:8px 0 4px;line-height:1.45}
.tn-result-raw .md-ol,.tn-result-raw .md-ul{margin:6px 0;padding-left:20px}
.tn-result-raw .md-ol li,.tn-result-raw .md-ul li{margin:2px 0;line-height:1.65;list-style-position:outside;padding-left:2px}
.tn-result-raw .md-ol li{list-style:decimal}
.tn-result-raw .md-ul li{list-style:disc}
.tn-result-raw .md-codeblock{background:#0d0d18;border:1px solid var(--line);border-radius:8px;padding:9px 11px;overflow-x:auto;margin:6px 0;font-size:12px;line-height:1.5;-webkit-user-select:text;user-select:text}
.tn-result-raw .md-codeblock code{color:#c4b5fd;font-family:'SF Mono','Fira Code',Consolas,monospace;white-space:pre}
.tn-result-raw .md-inline{background:rgba(139,92,246,.15);color:#c4b5fd;padding:1px 5px;border-radius:4px;font-family:'SF Mono','Fira Code',Consolas,monospace;font-size:12px}
/* markdown 表格（2026-10-01 v190 renderMarkdown 新增管道表格支持）：横向滚动容器 + 紧凑表格 */
.md-table-wrap{overflow-x:auto;margin:8px 0;border:1px solid rgba(255,255,255,.09);border-radius:8px}
.md-table{border-collapse:collapse;width:100%;font-size:12px;line-height:1.55}
.md-table th,.md-table td{padding:6px 10px;border-bottom:1px solid rgba(255,255,255,.06);vertical-align:top;word-break:break-word}
.md-table th{background:rgba(255,255,255,.045);color:#f0eefc;font-weight:600;white-space:nowrap;text-align:left}
.md-table tr:last-child td{border-bottom:0}
/* 流式生成中：文末紫色光标闪烁 */
.tn-result-raw.tn-streaming::after{content:"▍";margin-left:2px;color:var(--violet,#8b5cf6);animation:tnBlink 1s steps(2) infinite}
@keyframes tnBlink{0%{opacity:1}50%{opacity:0}100%{opacity:1}}
.tn-result-loading{color:#8e8ca8}
.tn-result-error{color:#f87171;font-size:12px;line-height:1.6}
/* 分析结果放大编辑弹窗：思考过程折叠框（有则显示，限高）+ 可编辑 textarea 纵向排布 */
.tn-modal-body-edit{flex-direction:column;gap:10px}
.tn-modal-body-edit .reasoning-box{flex:0 0 auto}
.tn-modal-body-edit .tn-modal-textarea{height:auto;flex:1;min-height:0}

/* 下拉选择器 */
.tn-picker-mask{
  position:fixed;inset:0;
  background:transparent;
  z-index:9998;
}
.tn-picker{
  background:#1a1a2a;
  border:1px solid rgba(255,255,255,.1);
  border-radius:10px;
  box-shadow:0 10px 40px -8px rgba(0,0,0,.5);
  overflow-y:auto;
  padding:4px;
  max-height:min(320px,60vh);
}
.tn-picker-item{
  display:flex;align-items:center;gap:8px;
  padding:7px 10px;
  border-radius:6px;
  cursor:pointer;
  transition:all .12s;
  font-size:12px;color:#c8c8e0;
}
.tn-picker-item:hover{
  background:rgba(139,92,246,.12);
  color:#e0def0;
}
.tn-picker-item.on{
  background:rgba(139,92,246,.18);
  color:#e0def0;
}
.tn-p-ico{
  width:20px;height:20px;border-radius:5px;
  display:inline-flex;align-items:center;justify-content:center;
  background:rgba(139,92,246,.2);color:#a78bfa;
  flex:none;
}
.tn-p-ico svg{width:11px;height:11px;stroke:currentColor;fill:none;stroke-width:2}
.tn-ico-agent{background:rgba(34,211,238,.18);color:#22d3ee}
.tn-p-text{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tn-p-check{
  color:#a78bfa;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
}
.tn-p-check svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2.5}

/* 音频预览 */
.np-audio{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px}
.np-audio .ne-ico{width:40px;height:40px;border-radius:10px}
.np-audio .ne-ico svg{width:22px;height:22px}
.np-audio audio{width:100%;max-width:220px;height:32px;pointer-events:none;opacity:.7}
/* 音频播放器 */
.node-audio-player{display:flex;align-items:center;gap:10px;padding:12px;background:rgba(255,255,255,.03);border-radius:12px;border:1px solid rgba(255,255,255,.06)}
.nap-ico{width:36px;height:36px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(145deg,rgba(34,211,238,.2),rgba(139,92,246,.15));color:#67e8f9;flex:none}
.nap-ico svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.node-audio-player audio{flex:1;min-width:0;height:32px}
.node-audio-player audio::-webkit-media-controls-panel{background:transparent}
.nap-clear{width:26px;height:26px;border-radius:8px;background:transparent;border:1px solid transparent;color:var(--faint);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.15s;flex:none}
.nap-clear:hover{background:rgba(239,68,68,.15);border-color:rgba(239,68,68,.3);color:#fecaca}
.nap-clear svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.board-minimap{position:absolute;right:18px;bottom:62px;width:min(240px,26vw);height:min(150px,24vh);background:rgba(17,17,26,.85);backdrop-filter:blur(10px);border:1px solid #3a3a52;border-radius:14px;box-shadow:var(--shadow);z-index:11;overflow:hidden;transition:opacity .25s,transform .25s;padding:8px}
.board-minimap.hidden{opacity:0;transform:translateY(12px);pointer-events:none}
.board-minimap:hover{border-color:#5a5a80}
.board-minimap canvas{display:block;width:100%;height:100%;cursor:pointer;touch-action:none;border-radius:10px}
.board-ctrl{position:absolute;right:18px;bottom:18px;display:flex;align-items:center;gap:6px;background:rgba(17,17,26,.92);backdrop-filter:blur(10px);border:1px solid #3a3a52;border-radius:99px;padding:5px 13px 5px 5px;box-shadow:var(--shadow);z-index:11}
.bc-btn{width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;transition:.16s;flex:none;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.12)}
.bc-btn:hover{background:rgba(96,165,250,.22);border-color:rgba(96,165,250,.5);color:#7db4ff}
.bc-btn.on{background:rgba(96,165,250,.25);border-color:rgba(96,165,250,.6);color:#7db4ff}
.bc-btn svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.bc-slider{-webkit-appearance:none;appearance:none;width:min(110px,14vw);height:4px;border-radius:99px;background:linear-gradient(to right,#3b82f6 var(--fill,50%),#3a3a4c var(--fill,50%));outline:none;cursor:pointer;margin:0 4px}
.bc-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:#4f8ff7;border:2.5px solid #fff;box-shadow:0 2px 6px rgba(0,0,0,.5);cursor:pointer;transition:.15s}
.bc-slider::-webkit-slider-thumb:hover{transform:scale(1.12)}
.bc-slider::-moz-range-thumb{width:9px;height:9px;border-radius:50%;background:#4f8ff7;border:2.5px solid #fff;box-shadow:0 2px 6px rgba(0,0,0,.5);cursor:pointer}
.bc-pct{font-size:12px;font-weight:800;min-width:42px;text-align:center;background:linear-gradient(135deg,#60a5fa,#a78bfa,#f472b6);-webkit-background-clip:text;background-clip:text;color:transparent;font-variant-numeric:tabular-nums}
.board-drawer{position:absolute;top:0;right:0;bottom:0;width:min(440px,46vw);background:var(--panel);border-left:1px solid var(--line);box-shadow:-12px 0 34px -18px rgba(0,0,0,.6);
  transform:translateX(102%);transition:transform .28s cubic-bezier(.4,0,.2,1);z-index:15;padding:18px;display:flex;flex-direction:column;overflow-y:auto}
.board-drawer.open{transform:translateX(0)}
.board-drawer .textarea{flex:1;min-height:0;resize:none}

/* ---- 左侧可伸缩 AI 对话面板（2026-10-01 用户要求从右移左） ---- */
.chat-tab{position:absolute;top:50%;left:0;transform:translateY(-50%);z-index:16;display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 9px;border:1px solid rgba(167,139,250,.5);border-left:none;border-radius:0 14px 14px 0;background:linear-gradient(180deg,rgba(124,108,240,.28),rgba(56,64,140,.32));backdrop-filter:blur(10px);color:#cbbfff;cursor:pointer;box-shadow:8px 0 26px -10px rgba(124,108,240,.6);transition:transform .2s ease,background .2s ease}
.chat-tab:hover{background:linear-gradient(180deg,rgba(124,108,240,.5),rgba(96,110,240,.5));color:#fff;transform:translateY(-50%) translateX(3px)}
.chat-tab svg{width:19px;height:19px}
.chat-tab span{font-size:11px;font-weight:700;letter-spacing:2px;writing-mode:vertical-rl}
.chat-tab.hide{display:none}
.board-chat{position:absolute;top:0;left:0;bottom:0;z-index:17;width:min(384px,44vw);display:flex;flex-direction:column;background:rgba(13,15,24,.92);backdrop-filter:blur(18px);border-right:1px solid rgba(167,139,250,.28);box-shadow:18px 0 50px -20px rgba(0,0,0,.8);transform:translateX(-103%);transition:transform .3s cubic-bezier(.4,0,.2,1);cursor:default}
.board-chat.open{transform:translateX(0)}
.bchat-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.07);flex:none}
.bchat-title{display:flex;align-items:center;gap:10px;min-width:0}
.bchat-ava{width:34px;height:34px;flex:none;border-radius:11px;display:grid;place-items:center;background:var(--grad);color:#fff;box-shadow:0 6px 18px -6px rgba(124,108,240,.8)}
.bchat-ava svg{width:18px;height:18px}
.bchat-title-txt{display:flex;flex-direction:column;min-width:0}
.bchat-title-txt strong{font-size:14.5px;line-height:1.25}
.bchat-sub{font-size:11.5px;color:var(--faint)}
.bchat-head-btns{display:flex;gap:4px;flex:none}
.bchat-msgs{flex:1;min-height:0;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:14px;scrollbar-width:thin}
.bchat-empty{margin:auto;text-align:center;color:var(--faint);display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px}
.bchat-empty-ico{width:52px;height:52px;border-radius:16px;display:grid;place-items:center;background:rgba(124,108,240,.16);color:#a78bfa}
.bchat-empty-ico svg{width:26px;height:26px}
.bchat-empty p{font-size:13px;line-height:1.7}
.bchat-sugs{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin-top:6px}
.bchat-sugs button{padding:7px 13px;border-radius:99px;border:1px solid rgba(167,139,250,.4);background:rgba(124,108,240,.12);color:#cbbfff;font-size:12.5px;cursor:pointer;transition:.15s}
.bchat-sugs button:hover{background:rgba(124,108,240,.3);color:#fff;border-color:rgba(167,139,250,.7)}
.bchat-msg{display:flex;gap:9px;align-items:flex-end;max-width:100%}
.bchat-msg.me{justify-content:flex-end}
.bchat-msg-ava{width:26px;height:26px;flex:none;border-radius:9px;display:grid;place-items:center;background:var(--grad);color:#fff}
.bchat-msg-ava svg{width:13px;height:13px}
.bchat-bubble{max-width:78%;padding:10px 13px;border-radius:14px;font-size:13.5px;line-height:1.65;white-space:pre-wrap;word-break:break-word}
.bchat-msg.ai .bchat-bubble{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08);color:var(--ink);border-bottom-left-radius:4px}
.bchat-msg.me .bchat-bubble{background:linear-gradient(135deg,#7c6cf0,#6366f1);color:#fff;border-bottom-right-radius:4px;box-shadow:0 8px 22px -10px rgba(99,102,241,.8)}
.bchat-typing{display:flex;gap:5px;align-items:center;padding:12px 15px}
.bchat-typing i{width:7px;height:7px;border-radius:50%;background:#a78bfa;animation:bchatDot 1s infinite ease-in-out}
.bchat-typing i:nth-child(2){animation-delay:.16s}
.bchat-typing i:nth-child(3){animation-delay:.32s}
@keyframes bchatDot{0%,60%,100%{transform:translateY(0);opacity:.4}30%{transform:translateY(-5px);opacity:1}}
/* 画布对话 AI 气泡 markdown 渲染（与主页同款排版；pre-wrap 会把 <br> 双倍换行，md 态关掉） */
.bchat-bubble.md{white-space:normal}
.bchat-bubble.md .md-h3{font-size:14px;font-weight:700;color:#f3f3f7;margin:10px 0 6px;line-height:1.4}
.bchat-bubble.md .md-h4{font-size:13px;font-weight:650;color:#ededf4;margin:8px 0 4px;line-height:1.45}
.bchat-bubble.md .md-ol,.bchat-bubble.md .md-ul{margin:6px 0;padding-left:20px}
.bchat-bubble.md .md-ol li,.bchat-bubble.md .md-ul li{margin:2px 0;line-height:1.65;list-style-position:outside;padding-left:2px}
.bchat-bubble.md .md-ol li{list-style:decimal}
.bchat-bubble.md .md-ul li{list-style:disc}
.bchat-bubble.md .md-code{background:rgba(255,255,255,.1);border-radius:5px;padding:1px 6px;font-family:Consolas,monospace;font-size:12.5px;color:#d6c7ff}
.bchat-bubble.md .md-pre{background:rgba(0,0,0,.42);border:1px solid rgba(255,255,255,.09);border-radius:10px;padding:10px 12px;margin:8px 0;overflow:auto}
.bchat-bubble.md .md-pre code{font-family:Consolas,monospace;font-size:12.5px;color:#e6e0ff;white-space:pre}
.bchat-bubble.md .md-quote{border-left:3px solid rgba(167,139,250,.55);padding:2px 10px;margin:8px 0;color:var(--ink-2)}
.bchat-bubble.md .md-table{border-collapse:collapse;width:100%;margin:8px 0;font-size:12.5px}
.bchat-bubble.md .md-table th{background:rgba(255,255,255,.08);color:#f0edff;font-weight:650;padding:6px 9px;text-align:left;border:1px solid rgba(255,255,255,.12)}
.bchat-bubble.md .md-table td{padding:6px 9px;border:1px solid rgba(255,255,255,.1);vertical-align:top;line-height:1.55;word-break:break-word}
.bchat-bubble.md .reasoning-box{margin:8px 0 0}
/* 生成中发送按钮=停止态 */
.bchat-send.stop{background:rgba(239,68,68,.9);box-shadow:0 8px 20px -8px rgba(239,68,68,.7)}
.bchat-input{flex:none;padding:12px 14px 10px;border-top:1px solid rgba(255,255,255,.07);position:relative}
.chat-model-menu{left:14px;bottom:74px}
.bchat-composer{display:flex;align-items:flex-end;gap:8px;padding:9px 10px 9px 14px;border-radius:16px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);transition:border-color .15s}
.bchat-composer:focus-within{border-color:rgba(167,139,250,.65);box-shadow:0 0 0 3px rgba(124,108,240,.18)}
.bchat-composer textarea{flex:1;background:transparent;border:none;outline:none;resize:none;color:var(--ink);font-size:13.5px;line-height:1.55;max-height:120px;font-family:inherit}
.bchat-composer textarea::placeholder{color:var(--faint)}
.bchat-tools{display:flex;align-items:center;gap:6px;flex:none}
.bchat-icobtn{width:32px;height:32px;border-radius:10px;border:none;background:transparent;color:var(--muted);cursor:pointer;display:grid;place-items:center;transition:.15s}
.bchat-icobtn:hover{background:rgba(255,255,255,.08);color:var(--ink)}
.bchat-icobtn svg{width:18px;height:18px}
.bchat-send{width:36px;height:36px;flex:none;border-radius:12px;border:none;background:var(--grad);color:#fff;cursor:pointer;display:grid;place-items:center;box-shadow:0 8px 20px -8px rgba(124,108,240,.9);transition:transform .15s}
.bchat-send:hover{transform:scale(1.08)}
.bchat-send svg{width:18px;height:18px}
.bchat-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:9px}
.bchat-model{display:flex;align-items:center;gap:6px;padding:6px 12px;border-radius:99px;border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.05);color:var(--muted);font-size:12px;font-weight:600;cursor:pointer;transition:.15s;max-width:62%}
.bchat-model:hover{border-color:rgba(167,139,250,.5);color:#cbbfff}
.bchat-model svg{width:13px;height:13px;flex:none}
.bchat-model svg:first-child{color:#a78bfa}
.bchat-model span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bchat-disc{font-size:11px;color:var(--faint);white-space:nowrap}

/* 仅统一首页智能体对话左右底色，不影响无限画布 */
.view.view-home .home-layout,
.view.view-home .chat-sidebar,
.view.view-home .chat-main,
.view.view-home .chat-scroll,
.view.view-home .chat-dock{background:#111318!important}
.view.view-home .chat-sidebar{border-right:1px solid #2b3038!important}
.view.view-home .chat-dock{background:#111318!important}

/* ---- 双击添加节点菜单 ---- */
.node-menu{position:absolute;z-index:30;width:212px;background:rgba(22,22,33,.97);backdrop-filter:blur(14px);border:1px solid #3a3a52;border-radius:16px;box-shadow:0 24px 54px -14px rgba(0,0,0,.75);padding:8px;display:none;flex-direction:column;gap:2px}
.node-menu.show{display:flex;animation:nmIn .15s ease}
@keyframes nmIn{from{opacity:0;transform:translateY(6px) scale(.97)}to{opacity:1;transform:none}}
.nm-title{font-size:11px;font-weight:700;color:var(--faint);letter-spacing:.8px;padding:7px 10px 5px;text-transform:uppercase}
.nm-item{display:flex;align-items:center;gap:10px;width:100%;padding:9px 10px;border-radius:10px;color:var(--ink-2);font-size:13.5px;font-weight:600;transition:.13s;text-align:left}
.nm-item:hover{background:var(--violet-soft);color:var(--violet)}
.nm-ico{width:30px;height:30px;border-radius:9px;display:inline-flex;align-items:center;justify-content:center;background:rgba(139,92,246,.16);color:var(--violet);flex:none}
.nm-ico svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.nm-divider{height:1px;background:rgba(255,255,255,.06);margin:4px 2px}
.nm-divider-sm{height:1px;background:rgba(255,255,255,.04);margin:2px 2px}
.nm-subtitle{padding:6px 14px 2px;font-size:11px;color:#6b7280;letter-spacing:.3px;text-transform:uppercase;user-select:none}
.nm-empty{padding:10px 14px;font-size:12px;color:#6b7280;text-align:center}
.nm-item.danger{color:#fca5a5}
.nm-item.danger:hover{background:rgba(239,68,68,.15);color:#fecaca}
.nm-item.danger .nm-ico{background:rgba(239,68,68,.15);color:#f87171}

/* ---- 节点头部 ---- */
.bn-tic{width:20px;height:20px;border-radius:7px;display:inline-flex;align-items:center;justify-content:center;background:rgba(139,92,246,.14);color:var(--violet);flex:none}
.bn-tic svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.bn-tlabel{font-size:12.5px;font-weight:600;color:var(--ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}
.bn-del{width:24px;height:24px;border-radius:7px;display:inline-flex;align-items:center;justify-content:center;color:var(--faint);transition:.15s;flex:none;margin-left:2px;opacity:0}
.b-node.sel .bn-del{opacity:1}
.bn-del:hover{background:rgba(244,63,94,.16);color:var(--rose)}
.bn-del svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2.2;stroke-linecap:round}

/* ---- 文本 / 3D 节点 ---- */
.bn-title-input{width:100%;border:1px solid transparent;background:transparent;border-radius:8px;padding:6px 8px;font-size:13.5px;font-weight:700;color:var(--ink);outline:none;font-family:inherit}
.bn-title-input:focus{background:var(--soft);border-color:var(--line)}
.bn-body .bn-textarea{width:100%;border:1px solid transparent;background:transparent;border-radius:8px;padding:7px 8px;font-size:12.5px;line-height:1.65;color:var(--ink-2);outline:none;resize:vertical;min-height:104px;font-family:inherit;white-space:pre-wrap}
.bn-body .bn-textarea:focus{background:var(--soft);border-color:var(--line)}

/* ---- 媒体节点（图片/视频/音频） ---- */
.bn-media{display:block;width:100%;border-radius:10px;background:#000;max-height:268px;object-fit:cover}
video.bn-media{max-height:240px}
.bn-audio{width:100%;margin:2px 0}
.bn-drop{width:100%;min-height:124px;border:1.5px dashed #3a3a58;border-radius:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--muted);background:rgba(255,255,255,.02);transition:.18s;cursor:pointer;font-size:12.5px;font-weight:600}
.bn-drop:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.bn-drop svg{width:26px;height:26px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.bn-url{display:flex;align-items:center;gap:6px;margin-top:8px}
.bn-url>svg{width:15px;height:15px;color:var(--faint);flex:none;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.bn-url input{flex:1;min-width:0;background:var(--soft);border:1px solid var(--line);border-radius:8px;padding:6px 9px;font-size:12px;color:var(--ink);outline:none}
.bn-url input:focus{border-color:var(--violet)}
.bn-url .mini-btn{flex:none}

/* ---- 通用小按钮（节点内） ---- */
.mini-btn{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-size:12px;font-weight:600;padding:7px 12px;border-radius:9px;background:var(--soft-2);color:var(--ink-2);border:1px solid transparent;transition:.15s;cursor:pointer;white-space:nowrap}
.mini-btn:hover{background:var(--violet-soft);color:var(--violet)}
.mini-btn.danger{background:transparent;color:var(--muted)}
.mini-btn.danger:hover{background:rgba(244,63,94,.14);color:var(--rose)}
.mini-btn svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

/* ---- 分镜节点：与文本节点同款输入框（.tn-editor/.tn-input，见文本节点段） ---- */
/* sb-text：文本分析结果展示区文本样式（tn-result 内使用） */
.sb-text{padding:11px 12px;overflow-y:auto;overscroll-behavior:contain;font-size:12.5px;line-height:1.65;color:var(--text,#e6e6f2);word-break:break-word}

/* ---- 多宫格节点 ---- */
.ngrid{display:grid;gap:7px}
.ngrid.ng-3{grid-template-columns:repeat(3,1fr)}
.ngrid.ng-2{grid-template-columns:repeat(2,1fr)}
.ng-cell{position:relative;aspect-ratio:1;border-radius:10px;border:1.5px dashed #3a3a58;background:rgba(255,255,255,.02);display:flex;align-items:center;justify-content:center;color:var(--faint);transition:.16s;cursor:pointer;overflow:hidden;padding:0}
.ng-cell:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.ng-cell svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ng-cell.filled{border-style:solid;border-color:var(--line)}
.ng-cell img{width:100%;height:100%;object-fit:cover;display:block}
.ng-clear{position:absolute;top:4px;right:4px;width:22px;height:22px;border-radius:50%;background:rgba(0,0,0,.62);color:#fff;display:flex;align-items:center;justify-content:center;opacity:0;transition:.15s;z-index:2}
.ng-cell:hover .ng-clear{opacity:1}
.ng-clear:hover{background:var(--rose)}
.ng-clear svg{width:12px;height:12px;stroke:#fff;fill:none;stroke-width:2.4;stroke-linecap:round}
.ng-hint{font-size:11px;color:var(--faint);text-align:center;margin-top:2px}

/* ---- 画布底部操作提示 ---- */
.board-hint{position:absolute;bottom:22px;left:50%;transform:translateX(-50%);background:rgba(17,17,26,.86);backdrop-filter:blur(8px);border:1px solid #3a3a52;color:var(--muted);font-size:12px;padding:8px 18px;border-radius:99px;z-index:10;white-space:nowrap;pointer-events:none;user-select:none;-webkit-user-select:none;transition:opacity .5s;max-width:70vw;overflow:hidden;text-overflow:ellipsis}
.board-hint.hide{opacity:0}
/* FPS 性能监控 */
.fps-monitor{position:fixed;top:8px;right:8px;background:rgba(0,0,0,.75);color:#4ade80;font-size:10px;font-family:Consolas,'Courier New',monospace;padding:6px 10px;border-radius:6px;z-index:99999;pointer-events:none;line-height:1.5;min-width:160px;text-align:right}

/* ⚡ 诊断：全局禁用所有 backdrop-filter 和 filter，排查是否 GPU 降级导致卡顿 */
* {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}
.fps-monitor .fps-val{font-size:14px;font-weight:bold}
.fps-monitor .fps-low{color:#f87171}
.fps-monitor .fps-mid{color:#fbbf24}
.fps-monitor .fps-frame{color:#94a3b8}
.fps-monitor .fps-js{color:#a78bfa}
.fps-monitor .fps-info{color:#64748b}

/* ---- 空画布引导（不阻挡双击，事件穿透到视口） ---- */
.board-empty{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;text-align:center;padding:20px;pointer-events:none}
.board-empty .be-ico{width:66px;height:66px;border-radius:20px;background:var(--violet-soft);border:1.5px dashed rgba(167,139,250,.45);color:var(--violet);display:flex;align-items:center;justify-content:center;box-shadow:0 0 0 6px rgba(139,92,246,.12)}
.board-empty .be-ico svg{width:30px;height:30px;stroke:currentColor;fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
@keyframes bePulse{0%,100%{box-shadow:0 0 0 0 rgba(139,92,246,.18)}50%{box-shadow:0 0 0 14px rgba(139,92,246,0)}}
.board-empty h3{font-size:20px;font-weight:800;color:var(--ink);letter-spacing:.3px}
.board-empty p{font-size:13.5px;color:var(--muted);line-height:1.9}

/* ---- 视频 / 图片生成节点（Seedance 风格：预览画布吸附在上、功能面板独立成卡在下） ---- */
.vg-node{display:flex;flex-direction:column;gap:10px}
/* 预览画布：按画面比例保持自身尺寸，居中吸附；不随功能面板拉伸 */
.vg-preview{position:relative;display:flex;align-items:center;justify-content:center;padding:16px 0 2px;overflow:visible}
.vg-upload{position:absolute;top:-2px;left:50%;transform:translateX(-50%);display:inline-flex;align-items:center;gap:7px;background:#1f2230;border:1px solid #3a3d52;color:var(--ink);font-size:13px;font-weight:600;padding:8px 18px;border-radius:11px;z-index:6;box-shadow:0 4px 16px rgba(0,0,0,.45);transition:.15s}
.vg-upload svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.vg-upload:hover{background:#2a2e42;border-color:#4a56a0}
/* 画布本体：固定高度 + aspect-ratio 决定宽度（比例不同则画布大小不同，面板宽度不变） */
.vg-stage{position:relative;height:200px;width:auto;max-width:100%;aspect-ratio:16/9;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;border:2px solid #3b6ef5;border-radius:16px;background:linear-gradient(160deg,#171a26,#12141d);box-shadow:0 0 0 3px rgba(59,110,245,.12),0 8px 30px rgba(0,0,0,.4);overflow:hidden;padding:16px;text-align:center}
.vg-stage.vg-idle{cursor:pointer;transition:border-color .15s}
.vg-stage.vg-idle:hover{border-color:#6d96ff}
.img-node .vg-stage{border-color:#10b981;box-shadow:0 0 0 3px rgba(16,185,129,.12),0 8px 30px rgba(0,0,0,.4)}
.img-node .vg-stage.vg-idle:hover{border-color:#34d399}
.vg-stage svg{stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.vg-film{color:#5b5f75;display:flex}
.vg-film svg{width:60px;height:60px}
.vg-stage p{color:#8a8ea3;font-size:14px;letter-spacing:.5px}
.vg-stage.vg-generating{background:rgba(20,24,40,.55)}
.vg-spin{width:42px;height:42px;border-radius:50%;border:3px solid rgba(59,110,245,.2);border-top-color:#3b6ef5;animation:vgSpin .8s linear infinite}
.img-node .vg-spin{border-color:rgba(16,185,129,.2);border-top-color:#10b981}
@keyframes vgSpin{to{transform:rotate(360deg)}}
.vg-done-ico{width:54px;height:54px;border-radius:50%;background:rgba(52,211,153,.15);color:#34d399;display:flex;align-items:center;justify-content:center}
.vg-done-ico svg{width:26px;height:26px;stroke-width:2.5}
.vg-stage.vg-done p{color:#34d399;font-weight:600}
.vg-play{position:absolute;bottom:14px;right:14px;width:38px;height:38px;border-radius:50%;background:rgba(59,110,245,.9);color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 14px rgba(59,110,245,.5)}
.vg-play svg{width:15px;height:15px;fill:#fff;stroke:none;margin-left:2px}
/* 图片画布：已生成/上传的图片铺满画布，悬停显示移除 */
.vg-stage-media{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.vg-stage-del{position:absolute;top:8px;right:8px;width:26px;height:26px;border-radius:50%;background:rgba(0,0,0,.62);color:#fff;display:flex;align-items:center;justify-content:center;z-index:3;opacity:0;transition:.15s}
.vg-stage:hover .vg-stage-del{opacity:1}
.vg-stage-del:hover{background:var(--rose)}
.vg-stage-del svg{width:13px;height:13px;stroke:#fff;fill:none;stroke-width:2.6;stroke-linecap:round}

/* 功能面板：独立卡片，吸附在画布下方，保持自身宽度（不与画布同宽联动） */
.vg-panel{display:flex;background:#171926;border:1px solid var(--line);border-radius:14px;padding:12px 12px 10px;flex-direction:column;gap:10px}
.vg-panel-head{display:flex;align-items:center;justify-content:space-between;font-size:12.5px;color:var(--ink-2)}
.vg-at{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:6px;background:#3b6ef5;color:#fff;font-weight:700;font-size:12px;margin:0 2px}
.img-node .vg-at{background:#10b981}
.vg-opt{color:var(--muted)}
.vg-expand{width:26px;height:26px;display:flex;align-items:center;justify-content:center;border-radius:7px;color:var(--muted);transition:.15s}
.vg-expand:hover{background:var(--soft-2);color:var(--ink)}
.vg-expand svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.vg-refs{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.vg-ref-item{position:relative;width:46px;height:46px;border-radius:10px;overflow:hidden;border:1px solid var(--line);background:var(--soft);flex:none}
.vg-ref-item img,.vg-ref-item video{width:100%;height:100%;object-fit:cover;display:block}
.vg-ref-del{position:absolute;top:-6px;right:-6px;width:18px;height:18px;border-radius:50%;background:#fb7185;color:#fff;display:flex;align-items:center;justify-content:center;opacity:0;transition:.15s;box-shadow:0 2px 6px rgba(0,0,0,.5)}
.vg-ref-item:hover .vg-ref-del{opacity:1}
.vg-ref-del svg{width:10px;height:10px;stroke:currentColor;stroke-width:3}
.vg-ref-add{width:46px;height:46px;border-radius:10px;border:1.5px dashed #3a3d52;background:rgba(255,255,255,.02);color:var(--muted);display:flex;align-items:center;justify-content:center;flex:none;transition:.15s}
.vg-ref-add:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.vg-ref-add svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round}
.vg-prompt{width:100%;background:transparent;border:none;outline:none;resize:vertical;color:var(--ink);font-size:13px;line-height:1.7;min-height:64px;font-family:inherit}
.vg-prompt::placeholder{color:var(--faint);line-height:1.7}
.vg-bar{display:flex;flex-wrap:wrap;align-items:center;gap:7px}
.vg-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px 0 12px;border-radius:9px;background:#20222f;border:1px solid var(--line);color:var(--ink-2);font-size:12.5px;font-weight:500;white-space:nowrap;cursor:pointer;transition:.15s}
.vg-chip:hover{background:#2a2d40;border-color:#3a3d52;color:var(--ink)}
.vg-chip-txt{max-width:128px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.vg-chip svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;opacity:.65;margin-left:-2px}
/* 芯片内独立小标签：比例 / 分辨率 / 时长 各自单独标注，不合并 */
.vg-chip-k{font-size:11px;color:var(--faint);font-weight:600;letter-spacing:.5px}
.vg-s25{display:inline-flex;align-items:center;justify-content:center;height:20px;padding:0 5px;border-radius:6px;background:linear-gradient(135deg,#3b6ef5,#7c3aed);color:#fff;font-size:11px;font-weight:700}
.vg-s25.img{background:linear-gradient(135deg,#10b981,#0ea5e9)}
.vg-edit{width:32px;height:32px;border-radius:9px;background:#20222f;border:1px solid var(--line);color:var(--muted);display:inline-flex;align-items:center;justify-content:center;transition:.15s}
.vg-edit:hover{color:var(--ink);background:#2a2d40}
.vg-edit svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.vg-gen{margin-left:auto;display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 16px;border-radius:10px;background:linear-gradient(135deg,#3b6ef5,#2f5fe0);color:#fff;font-size:13.5px;font-weight:700;box-shadow:0 4px 16px rgba(59,110,245,.4);transition:.15s}
.img-node .vg-gen{background:linear-gradient(135deg,#10b981,#0d9488);box-shadow:0 4px 16px rgba(16,185,129,.35)}
.vg-gen:hover{filter:brightness(1.1);transform:translateY(-1px)}
.vg-gen svg{width:15px;height:15px;fill:currentColor}
.vg-gen span{font-weight:800}
/* 配置芯片下拉列表（明确点选，不再循环切换） */
.vg-select-menu{display:none;position:absolute;z-index:70;min-width:190px;max-width:280px;background:#171926;border:1px solid rgba(255,255,255,.12);border-radius:12px;padding:6px;box-shadow:0 20px 48px -12px rgba(0,0,0,.75);max-height:320px;overflow-y:auto}
.vg-select-menu.show{display:block;animation:vgsIn .14s ease}
@keyframes vgsIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}
.vgs-title{font-size:11px;color:var(--faint);padding:7px 10px 5px;font-weight:600;letter-spacing:.02em}
.vgs-opt{display:flex;align-items:center;width:100%;text-align:left;padding:8px 10px;border-radius:8px;color:var(--ink-2);font-size:12.5px;line-height:1.3;transition:.12s;border:1px solid transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.vgs-opt:hover{background:rgba(255,255,255,.06);color:var(--ink)}
.vgs-opt.on{background:rgba(96,165,250,.14);color:#dbeafe;border-color:rgba(96,165,250,.35)}
.vgs-opt.on::after{content:"✓";margin-left:auto;color:#60a5fa;font-weight:700;flex:none;padding-left:10px}

/* ============ 画廊 / 资产 ============ */
.tabs{display:flex;gap:6px;background:var(--panel);border:1px solid var(--line);padding:5px;border-radius:13px;margin-bottom:20px;width:fit-content;flex-wrap:wrap}
.tab{padding:8px 16px;border-radius:9px;font-size:13.5px;font-weight:600;color:var(--muted);transition:.15s}
.tab:hover{color:var(--ink)}
.tab.on{background:var(--solid);color:var(--solid-fg)}
.gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:18px}
.work-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;transition:.22s;cursor:pointer}
.work-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg)}
.work-cover{height:170px;position:relative;display:flex;align-items:flex-end;padding:14px;color:#fff}
.work-cover .wc-cat{position:absolute;top:12px;left:12px;font-size:11px;font-weight:700;background:rgba(0,0,0,.45);backdrop-filter:blur(4px);padding:3px 10px;border-radius:99px}
.work-cover h4{font-size:16px;font-weight:800;position:relative;text-shadow:0 2px 8px rgba(0,0,0,.45)}
.work-body{padding:13px 15px}
.work-body .wc-meta{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--muted)}
.work-body .wc-meta .ava{width:24px;height:24px;border-radius:50%;background:var(--grad);color:#fff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}
.work-body .wc-stats{margin-left:auto;display:flex;gap:8px;font-size:12px;color:var(--muted)}
.work-body .wc-stats span{display:inline-flex;align-items:center;gap:4px}
.work-body .wc-stats svg{width:13px;height:13px}
.like-btn{cursor:pointer;transition:.15s;display:inline-flex;align-items:center;gap:4px}
.like-btn:hover{color:var(--rose)!important}
.like-btn svg{transition:.15s}
.like-btn:hover svg{transform:scale(1.15)}

/* ============ 剧本 / 提示词库 ============ */
.tpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:16px}
.tpl-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:18px;transition:.2s;cursor:pointer;display:flex;flex-direction:column;gap:10px}
.tpl-card:hover{border-color:var(--violet);transform:translateY(-3px);box-shadow:var(--shadow)}
.tpl-ico{width:42px;height:42px;border-radius:12px;display:flex;align-items:center;justify-content:center;color:#fff}
.tpl-ico svg{width:21px;height:21px}
.tpl-card h4{font-size:15.5px;font-weight:700}
.tpl-card p{font-size:13px;color:var(--muted);line-height:1.6;flex:1}
.tpl-card .tpl-foot{font-size:12px;color:var(--violet);font-weight:600;display:flex;align-items:center;gap:6px}
.tpl-card .tpl-foot svg{width:13px;height:13px}

.preset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
.preset-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:15px 16px;transition:.15s}
.preset-card:hover{border-color:var(--violet);box-shadow:var(--shadow-sm)}
.preset-card .pc-top{display:flex;align-items:center;gap:9px;margin-bottom:8px}
.preset-card .pc-ico{width:32px;height:32px;border-radius:9px;background:var(--violet-soft);color:var(--violet);display:flex;align-items:center;justify-content:center;flex:none}
.preset-card .pc-ico svg{width:17px;height:17px}
.preset-card h5{font-size:14px;font-weight:700}
.preset-card p{font-size:12.5px;color:var(--muted);line-height:1.6;margin-bottom:10px}
.preset-card .pc-use{font-size:12.5px;font-weight:600;color:var(--violet);display:inline-flex;align-items:center;gap:5px}
.preset-card .pc-use svg{width:13px;height:13px}

/* ============ 弹窗 ============ */
.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.7);backdrop-filter:blur(4px);display:none;align-items:center;justify-content:center;z-index:10000;padding:20px}
.modal-overlay.show{display:flex;animation:fade .2s}
.modal{background:var(--panel);border:1px solid var(--line);border-radius:22px;padding:30px 28px;width:100%;max-width:420px;position:relative;box-shadow:var(--shadow-lg);animation:pop .25s;/* ⚡ 固定大小，不伸缩 */flex-shrink:0}
.modal.wide{width:680px;max-width:680px;height:600px;max-height:600px;overflow-y:auto;/* ⚡ 固定大小，参照存储设置页面 */flex-shrink:0}
@keyframes fade{from{opacity:0}to{opacity:1}}
@keyframes pop{from{opacity:0;transform:translateY(14px) scale(.97)}to{opacity:1;transform:none}}
.modal-close{position:absolute;top:16px;right:16px;width:34px;height:34px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--muted)}
.modal-close:hover{background:var(--soft-2);color:var(--ink)}
.modal-close svg{width:19px;height:19px}
.modal-brand{text-align:center;margin-bottom:14px}
.modal-title{text-align:center;font-size:21px;font-weight:800}
.modal-sub{text-align:center;color:var(--muted);font-size:13.5px;margin-top:6px;margin-bottom:20px}
.modal-form .btn{margin-top:8px}

/* ============ 任务记录页（管理后台式整页布局） ============ */
/* .task-list/.task-item 等基础样式沿用；页面级覆盖：整页随视图滚动、卡片全宽 */
.tasks-page .task-list{overflow:visible;padding:0;flex:none;min-height:0;display:flex;flex-direction:column;gap:8px;max-width:1180px;width:100%;margin:0 auto}
.tasks-page .task-item{max-width:none;margin:0;padding:14px 16px;background:var(--card);border:1px solid var(--line)}
.task-item{display:flex;align-items:center;gap:8px;padding:12px 14px;border-radius:12px;transition:.15s;margin-bottom:6px}
.task-item:hover{background:var(--soft-2)}
.task-icon{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex:none;background:var(--soft)}
.task-icon.image{background:rgba(124,108,240,.12);color:var(--violet)}
.task-icon.video{background:rgba(236,72,153,.12);color:var(--fuchsia)}
.task-icon.chat{background:rgba(52,211,153,.12);color:var(--emerald)}
.task-icon.text{background:rgba(96,165,250,.12);color:#60a5fa}
.task-icon svg{width:19px;height:19px}
.task-info{flex:1;min-width:0}
.task-title{font-size:14px;font-weight:700;color:var(--ink);margin-bottom:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.task-meta{font-size:12px;color:var(--muted);display:flex;align-items:center;gap:8px}
.task-status{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:700;padding:2px 8px;border-radius:99px;line-height:1.6}
.task-status.running{background:rgba(236,72,153,.12);color:var(--fuchsia)}
.task-status.done{background:rgba(52,211,153,.12);color:var(--emerald)}
.task-status.error{background:rgba(249,115,22,.12);color:#f97316}
.task-status.cancelled{background:rgba(148,163,184,.15);color:#94a3b8}
.task-status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}
.task-status.running .task-status-dot{animation:pulse 1.2s infinite}
.task-del{width:24px;height:24px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:var(--muted);background:transparent;border:none;cursor:pointer;flex:none;opacity:0;transition:.15s}
.task-item:hover .task-del{opacity:1}
.task-del:hover{background:rgba(239,68,68,.1);color:#ef4444}
.task-del svg{width:13px;height:13px}
.task-reason{font-size:12px;color:#f97316;margin-top:4px;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.task-status.cancelled + span + .task-reason,
.task-reason.cancelled{color:#94a3b8}
.task-empty{text-align:center;padding:40px 20px;color:var(--muted);font-size:13.5px}
.task-detail-btn{padding:4px 12px;border-radius:6px;font-size:11px;font-weight:600;color:var(--violet);background:rgba(124,108,240,.1);border:1px solid rgba(124,108,240,.2);cursor:pointer;flex:none;transition:.15s}
.task-detail-btn:hover{background:rgba(124,108,240,.2)}
.task-detail-panel{width:640px;max-width:92vw;max-height:80vh;background:var(--card);border-radius:16px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.25)}
.task-detail-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--line);flex:none}
.task-detail-header h3{margin:0;font-size:16px;font-weight:800}
.task-detail-close{width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;font-size:16px;color:var(--muted)}
.task-detail-close:hover{background:var(--soft-2);color:var(--ink)}
.task-detail-body{overflow-y:auto;padding:16px 20px;flex:1}
.detail-section{margin-bottom:20px}
.detail-section-title{font-size:13px;font-weight:800;color:var(--ink);margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid var(--line)}
.detail-row{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:4px 0;font-size:12.5px}
.detail-row span:first-child{color:var(--muted);flex:none;width:70px}
.detail-row span:last-child{color:var(--ink);text-align:right;word-break:break-all}
.detail-log-item{padding:8px 10px;border-radius:8px;background:var(--soft);margin-bottom:6px}
.detail-log-step{font-size:12px;font-weight:700;color:var(--violet);margin-bottom:4px}
.detail-log-data{font-size:11.5px;color:var(--muted);margin-bottom:2px;word-break:break-all}
.detail-log-pre{font-size:11px;color:var(--ink);background:rgba(0,0,0,.04);border-radius:6px;padding:8px;overflow-x:auto;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto;margin-top:4px}

/* ============ 任务详情·五分区改版 ============ */
/* 顶部摘要条 */
.td-summary{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:12px;margin-bottom:14px;background:var(--soft);flex-wrap:wrap}
.td-type-pill{flex:none;padding:3px 10px;border-radius:999px;font-size:11.5px;font-weight:800;color:#fff;background:var(--violet,#6c5ce7)}
.td-title{font-size:13.5px;font-weight:800;color:var(--ink);max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.td-dot{width:8px;height:8px;border-radius:50%;flex:none;margin-left:auto}
.td-st{font-size:12px;font-weight:700;flex:none}
.td-meta{font-size:11.5px;color:var(--muted);flex:none}
.td-right{margin-left:auto}
.td-error{font-size:12px;color:#e74c3c;background:rgba(231,76,60,.08);border:1px solid rgba(231,76,60,.25);border-radius:10px;padding:8px 12px;margin-bottom:14px;word-break:break-all}
/* 分区彩色竖条 */
.td-bar{display:flex;align-items:center;gap:8px;position:relative;padding-left:10px}
.td-bar::before{content:"";position:absolute;left:0;top:1px;bottom:1px;width:3px;border-radius:2px}
.td-bar-blue::before{background:#4B3FE3}
.td-bar-purple::before{background:#8B5CF6}
.td-bar-green::before{background:#2E9E5B}
.td-bar-gray::before{background:#9aa0a6}
/* 提交总览 JSON */
.td-copy{margin-left:auto;font-size:11px;padding:3px 10px;border-radius:8px;border:1px solid var(--line);background:var(--card);color:var(--muted);cursor:pointer;font-weight:700}
.td-copy:hover{color:var(--ink);border-color:var(--muted)}
.td-json{margin:0;font:11.5px/1.7 ui-monospace,Consolas,"Courier New",monospace;color:var(--ink);background:rgba(0,0,0,.04);border:1px solid var(--line);border-radius:10px;padding:12px;white-space:pre-wrap;word-break:break-all;max-height:300px;overflow-y:auto}
.td-meta-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding:12px;border:1px solid var(--line);border-radius:10px;background:rgba(0,0,0,.025)}
.td-meta-grid>div{display:flex;gap:8px;min-width:0;font-size:12px;line-height:1.5}
.td-meta-grid b{color:var(--muted);font-weight:600;flex:none}
.td-meta-grid span{color:var(--ink);min-width:0;word-break:break-all}
@media(max-width:640px){.td-meta-grid{grid-template-columns:1fr}.task-detail-panel{width:96vw;max-width:96vw}.task-detail-body{padding:12px}}
.detail-log-item .detail-log-pre{max-height:360px}
.td-meta-line{font-size:11px;color:var(--muted);margin-top:6px;word-break:break-all;font-family:ui-monospace,Consolas,monospace}
/* 提示词 tab */
.td-tabs{display:flex;gap:6px;margin-bottom:8px}
.td-tab{padding:5px 14px;border-radius:999px;font-size:12px;font-weight:700;color:var(--muted);background:var(--soft);border:1px solid var(--line);cursor:pointer;transition:.15s}
.td-tab.on{color:#4B3FE3;background:rgba(75,63,227,.08);border-color:rgba(75,63,227,.35)}
.td-tabpane{margin:0;font:12px/1.8 ui-monospace,Consolas,"Courier New",monospace;color:var(--ink);background:rgba(0,0,0,.04);border:1px solid var(--line);border-radius:10px;padding:12px;white-space:pre-wrap;word-break:break-all;max-height:320px;overflow-y:auto}
/* 参考素材网格 */
.td-assets{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}
.td-asset{position:relative;padding:10px 10px 8px;border:1px solid var(--line);border-radius:10px;background:var(--soft)}
.td-asset.bad{border-color:rgba(214,69,69,.45);background:rgba(214,69,69,.05)}
.td-asset-no{position:absolute;top:-7px;left:-6px;min-width:18px;height:18px;border-radius:9px;background:#2E9E5B;color:#fff;font-size:11px;font-weight:800;display:flex;align-items:center;justify-content:center;padding:0 5px}
.td-asset.bad .td-asset-no{background:#D64545}
.td-asset-ok{position:absolute;top:8px;right:10px;font-size:11px;font-weight:800;color:#2E9E5B}
.td-asset.bad .td-asset-ok{color:#D64545}
.td-asset-name{font-size:12px;font-weight:700;color:var(--ink);padding-right:14px;word-break:break-all}
.td-asset-name em{font-style:normal;font-size:10.5px;color:var(--violet,#6c5ce7);font-weight:800}
.td-asset-meta{font-size:10.5px;color:var(--muted);margin-top:3px;word-break:break-all}
/* 折叠区 */
.td-collapse{cursor:pointer;user-select:none}
.td-collapse:hover{color:var(--violet,#6c5ce7)}
/* 轮询记录折叠组：默认收起，一行摘要（次数/出错数/末次状态），点击展开逐条明细 */
.td-poll-group{border:1px dashed rgba(124,110,227,.35);padding:8px 10px}
.td-poll-group>.detail-log-step{display:flex;align-items:center;gap:5px;margin-bottom:0;flex-wrap:wrap}
.td-poll-group>.detail-log-step .td-arrow{font-size:11px}
.td-poll-hint{margin-left:auto;font-style:normal;font-weight:400;font-size:11px;opacity:.5}
.td-poll-group .detail-log-item{margin-top:6px}
.td-arrow{font-size:11px;color:var(--muted);margin-left:4px}
.td-collapsible{margin-top:8px}

/* ============ 提示词指南 ============ */
.nop-chat-hint{display:flex;align-items:center;gap:6px}
.nop-guide-open{margin-left:auto;font-size:10.5px;font-weight:800;color:var(--violet,#6c5ce7);background:rgba(108,92,231,.08);border:1px solid rgba(108,92,231,.25);border-radius:999px;padding:2px 9px;cursor:pointer;flex:none;transition:.15s}
.nop-guide-open:hover{background:rgba(108,92,231,.16)}
.guide-panel{max-width:640px}
.guide-blk{padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--soft);margin-bottom:8px}
.guide-blk-t{font-size:12.5px;font-weight:800;color:var(--ink);margin-bottom:5px}
.guide-blk-d{font-size:12px;line-height:1.8;color:var(--muted)}
.guide-blk-d b{color:var(--ink)}
.guide-pre{font:11.5px/1.75 ui-monospace,Consolas,"Courier New",monospace;color:var(--ink);background:rgba(0,0,0,.04);border:1px solid var(--line);border-radius:8px;padding:9px 11px;margin-top:7px;white-space:pre-wrap;word-break:break-all}

/* ============ 设置弹窗（API 模型打通 / 提示词约束） ============ */
.set-tabs{display:flex;gap:8px;margin-bottom:18px;background:var(--soft);border:1px solid var(--line);border-radius:14px;padding:5px}
.set-tab{flex:1;display:flex;align-items:center;justify-content:center;gap:7px;padding:10px 8px;border-radius:10px;font-size:13.5px;font-weight:700;color:var(--muted);background:transparent;border:none;cursor:pointer;transition:.16s;position:relative}
.set-tab svg{width:16px;height:16px}
.set-tab:hover{color:var(--ink)}
.set-tab.active{background:var(--grad);color:#fff;box-shadow:0 8px 20px -8px rgba(124,108,240,.8)}
.set-tab-badge{min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:rgba(236,72,153,.9);color:#fff;font-size:11px;line-height:18px;text-align:center;font-weight:800;display:inline-flex;align-items:center;justify-content:center}
.set-tab-badge svg{width:11px;height:11px}
.set-tab.active .set-tab-badge{background:rgba(255,255,255,.25)}
.set-tab-badge.on{background:rgba(52,211,153,.95)}
.set-tab-badge:empty{display:none}
.set-section{border:1px solid var(--line);background:var(--soft-2);border-radius:12px;padding:12px;margin-bottom:10px}
.set-section-h{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:700;color:var(--ink);margin-bottom:2px}
.set-section-h svg{width:14px;height:14px;color:var(--violet)}
.set-section-desc{font-size:11px;color:var(--faint);line-height:1.5;margin:0 0 10px}
.set-pane .field{margin-bottom:10px}
.field-hint{display:block;font-size:12px;color:var(--faint);margin-top:6px;line-height:1.6}
.field-inline{display:flex;align-items:center;gap:8px;padding:10px 0}
.field-inline input[type="checkbox"]{width:16px;height:16px;accent-color:#a78bfa;cursor:pointer;flex:none}
.field-inline .field-label{margin:0;font-size:13px}
.field-inline .field-hint{margin:0;font-size:11px}
.set-api-fields{transition:opacity .18s}
.set-api-status{display:flex;align-items:center;gap:8px;padding:10px 13px;border-radius:12px;background:var(--soft);border:1px solid var(--line);font-size:12.5px;color:var(--muted);margin-bottom:14px}
.set-api-status svg{width:15px;height:15px;flex:none}
.set-api-status.ok{background:rgba(52,211,153,.1);border-color:rgba(52,211,153,.4);color:#34d399}
.set-api-status.err{background:rgba(244,63,94,.1);border-color:rgba(244,63,94,.4);color:#fb7185}
.agent-model-list{display:flex;flex-direction:column;gap:8px}
.agent-model-row{border:1px solid var(--border);border-radius:10px;overflow:hidden}
.agent-model-head{display:flex;align-items:center;gap:10px;padding:7px 12px;background:var(--soft);border-bottom:1px solid var(--border)}
.agent-model-status{font-size:11px;display:flex;align-items:center;gap:4px;white-space:nowrap}
.agent-model-status svg{width:13px;height:13px}
.agent-model-status.on{color:#34d399}
.agent-model-status.err{color:#fb7185}
.agent-model-name{font-size:12px;font-weight:600;color:var(--text);margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.agent-model-del{width:24px;height:24px;border-radius:6px;background:transparent;border:none;color:var(--faint);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.2s;flex-shrink:0}
.agent-model-del:hover{color:#fb7185;background:rgba(244,63,94,.1)}
.agent-model-del svg{width:13px;height:13px}
.agent-model-body{padding:10px}
.agent-model-body .field input[type="text"],.agent-model-body .field input[type="password"],.agent-model-body .field select{width:100%;background:var(--soft);border:1px solid var(--line);border-radius:10px;padding:9px 12px;font-size:13px;outline:none;transition:.18s;box-sizing:border-box}
.agent-model-body .field input[type="text"]:focus,.agent-model-body .field input[type="password"]:focus,.agent-model-body .field select:focus{border-color:var(--violet);background:var(--soft);box-shadow:0 0 0 3px rgba(139,92,246,.15)}
.set-spin{width:15px;height:15px;border-radius:50%;border:2px solid rgba(167,139,250,.35);border-top-color:#a78bfa;animation:spin .7s linear infinite;flex:none}
@keyframes spin{to{transform:rotate(360deg)}}
.set-actions{display:flex;gap:10px;justify-content:flex-end}
.set-actions .btn{padding:8px 16px;border-radius:10px;font-size:12.5px;font-weight:700}
.set-rules-meta{font-size:12.5px;color:var(--muted);margin:-4px 0 14px}
.set-rules-meta strong{color:var(--violet-600);font-size:14px}
/* 存储设置 */
.storage-row{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;padding:12px 0;border-bottom:1px dashed var(--line)}
.storage-row:last-child{border-bottom:none}
.storage-info{flex:1;min-width:0}
.storage-label{font-size:12px;color:var(--muted);margin-bottom:4px}
.storage-value{font-size:13px;color:var(--ink);font-family:Consolas,monospace;word-break:break-all}
.storage-actions{display:flex;gap:8px;flex-shrink:0}
.storage-actions .btn{padding:7px 14px;border-radius:8px;font-size:12.5px}
/* 版本历史列表 */
.version-list{max-height:320px;overflow-y:auto;margin:8px 0;border:1px solid var(--line);border-radius:10px;padding:6px}
.version-item{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 12px;border-radius:8px;transition:.15s;margin-bottom:4px}
.version-item:last-child{margin-bottom:0}
.version-item:hover{background:var(--soft-2)}
.version-info{flex:1;min-width:0}
.version-title{font-size:13px;font-weight:700;color:var(--ink);margin-bottom:3px;display:flex;align-items:center;gap:8px}
.version-badge{display:inline-block;padding:1px 7px;font-size:10px;font-weight:800;background:var(--violet);color:#fff;border-radius:99px;line-height:1.6}
.version-meta{font-size:11.5px;color:var(--muted)}
.version-actions{display:flex;gap:6px;flex-shrink:0}
.version-actions .btn-sm{padding:5px 10px;font-size:11.5px;border-radius:7px}
.version-empty{text-align:center;padding:30px 20px;color:var(--muted);font-size:13px}
.check-row{display:flex;align-items:center;gap:8px;cursor:pointer}
.check-row input[type=checkbox]{width:16px;height:16px;accent-color:var(--violet)}
.set-pane .textarea{font-family:Consolas,monospace;font-size:13px;line-height:1.7}
.modal-links{display:flex;justify-content:space-between;margin-top:16px;font-size:13px}
.modal-links a{color:var(--violet);font-weight:600}
.modal-terms{text-align:center;font-size:11.5px;color:var(--faint);margin-top:18px}
.modal h3.modal-h{font-size:17px;font-weight:800;margin-bottom:4px;display:flex;align-items:center;gap:9px}
.modal h3.modal-h svg{width:19px;height:19px;color:var(--violet)}
.modal .modal-desc{font-size:13px;color:var(--muted);margin-bottom:16px}

/* 风格管理弹窗：新建 / 编辑 / 删除（视频/图片共用一件风格库） */
.style-form{display:flex;flex-direction:column;gap:14px;margin-bottom:16px}
.style-field{display:flex;flex-direction:column;gap:7px}
.style-label{font-size:12.5px;font-weight:700;color:var(--text);display:flex;align-items:center;gap:7px}
.style-label .style-req{color:#f87171;font-style:normal;font-weight:800}
.style-label .style-cnt{margin-left:auto;font-size:11px;font-weight:500;color:var(--muted)}
.style-input{width:100%;box-sizing:border-box;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);border-radius:10px;color:var(--text);font-size:13px;padding:10px 12px;font-family:inherit}
.style-input:focus{outline:none;border-color:var(--violet);box-shadow:0 0 0 3px rgba(139,92,246,.15)}
.style-prompt-row{display:flex;gap:8px;align-items:stretch}
.style-img-btn{flex:none;width:56px;min-height:56px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.05);border:1px dashed rgba(139,92,246,.4);border-radius:10px;color:var(--violet);cursor:pointer;transition:.15s;padding:0;overflow:hidden}
.style-img-btn:hover{background:rgba(139,92,246,.15);border-color:var(--violet)}
.style-img-thumb{width:100%;height:100%;object-fit:cover;display:block}
.style-prompt-input{flex:1;min-height:60px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);border-radius:10px;color:var(--text);font-size:13px;line-height:1.6;padding:10px 12px;resize:vertical;font-family:inherit;box-sizing:border-box}
.style-prompt-input:focus{outline:none;border-color:var(--violet);box-shadow:0 0 0 3px rgba(139,92,246,.15)}
.style-list-title{font-size:11px;font-weight:700;color:var(--muted);letter-spacing:.6px;margin-bottom:8px}
.style-list{display:flex;flex-direction:column;gap:8px;max-height:200px;overflow-y:auto;margin-bottom:16px}
.style-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08)}
.style-row-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.style-row-name{font-size:13px;font-weight:700;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.style-row-prompt{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.style-row-btn{flex:none;padding:5px 11px;font-size:11.5px;font-weight:600;border-radius:7px;border:1px solid rgba(139,92,246,.4);background:rgba(139,92,246,.12);color:var(--violet);cursor:pointer;transition:.15s}
.style-row-btn:hover{background:rgba(139,92,246,.22);color:#fff}
.style-row-btn.del{border-color:rgba(248,113,113,.4);background:rgba(248,113,113,.12);color:#f87171}
.style-row-btn.del:hover{background:rgba(248,113,113,.24);color:#fff}
.style-row-btn.undo{border-color:rgba(139,92,246,.45);background:rgba(139,92,246,.14);color:var(--violet)}
.style-row-btn.undo:hover{background:rgba(139,92,246,.26);color:#fff}
.style-row.marked{background:rgba(248,113,113,.10);border-color:rgba(248,113,113,.38)}
.style-row.marked .style-row-name{text-decoration:line-through;color:var(--muted)}
.style-empty{padding:18px;text-align:center;font-size:12px;color:var(--muted)}
.style-actions{display:flex;justify-content:flex-end;gap:10px}
/* 下拉里的「风格设置」入口：强调为可点开管理的入口 */
.nop-expand-opt[data-nop-opt="vstyle"][data-val="风格设置"],
.nop-expand-opt[data-nop-opt="imgStyle"][data-val="风格设置"]{border-style:dashed;border-color:rgba(139,92,246,.55);color:#c9b8ff}

/* 积分流水弹窗：标题行左右布局，右上角展示管理员配置的充值联系（支持多行） */
.tx-modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.tx-modal-head .modal-h{margin-bottom:4px;flex:none}
.tx-contact{display:inline-flex;align-items:flex-start;gap:7px;max-width:72%;padding:6px 12px;border-radius:12px;background:rgba(167,139,250,.12);border:1px solid rgba(167,139,250,.32);font-size:12px;color:var(--muted);line-height:1.7;word-break:break-all;text-align:left;cursor:default}
.tx-contact svg{width:14px;height:14px;color:var(--violet);flex:none;margin-top:3px}
.tx-contact-label{flex:none;white-space:nowrap;font-weight:600}
.tx-contact strong{color:var(--text);font-weight:700;flex:1;min-width:0}

/* 交流群二维码：用户弹窗展示 + 管理后台上传卡 */
.qr-show{display:flex;justify-content:center;padding:18px;background:#fff;border-radius:14px;border:1px solid var(--border)}
.qr-show img{max-width:280px;width:100%;height:auto;display:block}
.qr-admin-row{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap}
.qr-preview{width:132px;height:132px;border-radius:12px;background:#fff;display:flex;align-items:center;justify-content:center;overflow:hidden;border:1px solid var(--border);flex:none}
.qr-preview img{width:100%;height:100%;object-fit:contain;display:block}
.qr-preview .qr-empty{font-size:12px;color:#9ca3af}
.qr-ops{display:flex;gap:8px;align-items:center;flex-wrap:wrap}

/* 二维码裁剪弹窗：图片舞台 + 拖拽框选 + 底部操作（qr- 前缀避免与画布裁剪/标注的 .crop-box 冲突） */
.qr-crop-stage{position:relative;display:block;width:fit-content;margin:0 auto;max-width:100%;user-select:none;-webkit-user-select:none;line-height:0;touch-action:none}
.qr-crop-stage img{display:block;max-width:100%;max-height:min(44vh,400px);border-radius:12px;pointer-events:none}
.qr-crop-box{position:absolute;border:1.5px solid var(--violet);box-shadow:0 0 0 9999px rgba(5,5,12,.62);cursor:move}
.qr-crop-handle{position:absolute;width:12px;height:12px;background:#fff;border:1.5px solid var(--violet);border-radius:3px;box-sizing:border-box}
.qr-crop-handle[data-h=nw]{left:-7px;top:-7px;cursor:nwse-resize}
.qr-crop-handle[data-h=ne]{right:-7px;top:-7px;cursor:nesw-resize}
.qr-crop-handle[data-h=sw]{left:-7px;bottom:-7px;cursor:nesw-resize}
.qr-crop-handle[data-h=se]{right:-7px;bottom:-7px;cursor:nwse-resize}
.qr-crop-handle[data-h=n]{left:50%;top:-7px;margin-left:-6px;cursor:ns-resize}
.qr-crop-handle[data-h=s]{left:50%;bottom:-7px;margin-left:-6px;cursor:ns-resize}
.qr-crop-handle[data-h=w]{left:-7px;top:50%;margin-top:-6px;cursor:ew-resize}
.qr-crop-handle[data-h=e]{right:-7px;top:50%;margin-top:-6px;cursor:ew-resize}
.qr-crop-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:14px;flex-wrap:wrap}
.qr-crop-info{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.qr-crop-ops{display:flex;gap:8px}

/* ============ Toast ============ */
.toast-wrap{position:fixed;bottom:26px;left:50%;transform:translateX(-50%);z-index:10000;display:flex;flex-direction:column;gap:10px;align-items:center;pointer-events:none} /* ⚡ v435 提示不挡操作：toast 期间画布点击穿透 */
.toast{background:var(--solid);color:var(--solid-fg);padding:12px 20px;border-radius:13px;font-size:13.5px;font-weight:500;box-shadow:var(--shadow-lg);display:flex;align-items:center;gap:9px;animation:toastIn .3s;max-width:90vw}
.toast svg{width:17px;height:17px;color:#059669}
.toast.err svg{color:#e11d48}
@keyframes toastIn{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}

/* ============ 杂项 ============ */
.muted{color:var(--muted)}
.mt-8{margin-top:8px}.mt-16{margin-top:16px}.mt-24{margin-top:24px}
.flex{display:flex;align-items:center;gap:10px}
.spinner{width:16px;height:16px;border:2px solid rgba(20,20,26,.3);border-top-color:var(--solid-fg);border-radius:50%;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.hero-banner{border-radius:var(--r-xl);padding:30px 32px;color:#fff;position:relative;overflow:hidden;margin-bottom:24px;background:var(--grad);box-shadow:var(--shadow)}
.hero-banner h2{font-size:23px;font-weight:800;position:relative}
.hero-banner p{opacity:.95;margin-top:8px;max-width:560px;position:relative}
.hero-banner .deco{position:absolute;right:-40px;top:-40px;width:220px;height:220px;border-radius:50%;background:rgba(255,255,255,.12)}
.hero-banner .deco.two{right:80px;top:90px;width:120px;height:120px;background:rgba(255,255,255,.08)}

/* ============ 响应式 ============ */
.sidebar-mask{display:none}
@media(max-width:980px){
  .app{grid-template-columns:1fr}
  .sidebar{position:fixed;left:0;top:0;z-index:60;width:280px;transform:translateX(-100%);transition:transform .28s;box-shadow:var(--shadow-lg);background:var(--sidebar)}
  .sidebar.open{transform:none}
  .sidebar-mask.show{display:block;position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:55}
  .menu-btn{display:inline-flex}
  .feature-cards{grid-template-columns:1fr}
  .proj-grid{grid-template-columns:repeat(2,1fr)}
  .grid-2,.grid-3,.canvas-layout{grid-template-columns:1fr}
  .view{padding:20px 16px 50px}
  .price-chip{display:none}
}
@media(max-width:560px){
  .proj-grid{grid-template-columns:1fr}
  .welcome h1{font-size:22px}
  .modal{padding:24px 20px}
}

/* sub-model styles */
.agent-sub-model{display:flex;align-items:center;gap:8px;padding:6px 0}
.sub-model-input{flex:1;background:var(--soft);border:1px solid var(--line);border-radius:10px;padding:9px 12px;color:var(--text);font-size:13px}
.sub-model-status{display:flex;align-items:center;justify-content:center;min-width:24px;height:24px;flex-shrink:0}
.sub-model-status.on{color:#34d399}
.sub-model-status.on .sub-model-status-text{font-size:11px;font-weight:600;margin-left:2px;white-space:nowrap}
.sub-model-status.err{color:#fb7185}
.sub-model-btn{display:flex;align-items:center;gap:4px;padding:6px 12px;background:var(--soft);border:1px solid var(--border);border-radius:8px;cursor:pointer;color:var(--ink-2);font-size:12px;flex-shrink:0;transition:all .2s}.sub-model-btn:hover{border-color:var(--violet);color:var(--violet)}.sub-model-btn.sub-model-del:hover{border-color:#fb7185;color:#fb7185}.sub-model-btn svg{width:13px;height:13px}
.sub-model-btn.alias-save-ok{background:#ecfdf5;border-color:#10b981;color:#059669}
.sub-model-btn.alias-save-err{background:#fef2f2;border-color:#ef4444;color:#dc2626}
.sub-model-test:hover{border-color:var(--violet)}
.sub-model-del:hover{border-color:#fb7185;color:#fb7185}
.model-name-list{display:flex;flex-direction:column;gap:4px}
.model-name-row{display:flex;align-items:center;gap:8px}
.model-name-row input{flex:1}
.main-model-test{padding:5px 10px}
.sub-model-alias{flex:0 0 120px !important;max-width:120px}
.sub-model-special{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--muted);flex:0 0 auto;cursor:pointer}
.sub-model-special input[type="checkbox"]{width:14px;height:14px;accent-color:#f59e0b;cursor:pointer}
.gen-sub-model{display:flex;align-items:center;gap:8px;padding:5px 0;border-top:1px solid rgba(255,255,255,.06)}
.gen-main-model{padding-bottom:5px;margin-bottom:2px}
.gen-main-model,.gen-sub-model{display:flex;align-items:center;gap:8px}
.gen-main-model input[type="text"],.gen-sub-model input[type="text"],.gen-main-model input[type="password"],.gen-sub-model input[type="password"]{width:100%;background:var(--soft);border:1px solid var(--line);border-radius:10px;padding:9px 12px;color:var(--text);font-size:13px;box-sizing:border-box;outline:none;transition:.18s}
.gen-main-model input[type="text"]:focus,.gen-sub-model input[type="text"]:focus,.gen-main-model input[type="password"]:focus,.gen-sub-model input[type="password"]:focus{border-color:var(--violet);background:var(--soft);box-shadow:0 0 0 3px rgba(139,92,246,.15)}
.gen-main-model .sub-model-alias,.gen-sub-model .sub-model-alias{flex:0 0 120px !important;max-width:120px}
.gen-main-model input[type="text"]:not(.sub-model-alias),.gen-sub-model input[type="text"]:not(.sub-model-alias){flex:0 1 200px;min-width:0;width:200px}
.gen-main-model .sub-model-status,.gen-sub-model .sub-model-status{flex:0 0 28px;width:28px;justify-content:center}
.gen-main-model .sub-model-btn,.gen-sub-model .sub-model-btn{flex:0 0 auto}
.gen-main-model .sub-model-del-placeholder,.gen-sub-model .sub-model-del{flex:0 0 24px;width:24px}
.btn-sm{padding:6px 12px;font-size:12px}
.scroll-bottom-btn{position:absolute;bottom:140px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:6px;padding:8px 16px;border-radius:99px;background:var(--soft-2);border:1px solid var(--violet);color:var(--ink);cursor:pointer;opacity:0;pointer-events:none;transition:all .3s;z-index:10;box-shadow:var(--shadow);font-size:13px}
.scroll-bottom-btn svg{width:16px;height:16px}
.scroll-bottom-btn.show{opacity:1;pointer-events:auto}
.scroll-bottom-btn:hover{background:var(--violet-600);color:#fff;border-color:var(--violet-600)}
.dock-attachments{display:flex;flex-wrap:wrap;gap:8px;padding:8px 12px;max-height:200px;overflow-y:auto;border-bottom:1px solid var(--border)}
.attach-item{position:relative;flex-shrink:0;transition:all .2s;overflow:visible}
.attach-img-preview{width:40px;height:40px;object-fit:cover;display:block}
.attach-video-preview{width:60px;height:40px;object-fit:cover;display:block}
.attach-file-preview{display:flex;align-items:center;gap:4px;padding:4px 8px;font-size:11px;color:var(--ink-2);min-width:60px;max-width:120px}
.attach-file-preview svg{width:12px;height:12px;flex-shrink:0}
.attach-file-info{display:flex;flex-direction:column;gap:1px;overflow:hidden}
.attach-file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.attach-file-size{font-size:9px;color:var(--text-faint)}
.attach-text-preview{width:160px;max-height:80px;overflow:hidden;border-radius:6px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08)}
.attach-text-header{display:flex;align-items:center;gap:4px;padding:3px 6px;font-size:10px;color:var(--text-soft);border-bottom:1px solid rgba(255,255,255,.06);overflow:hidden}
.attach-text-header svg{width:10px;height:10px;flex-shrink:0}
.attach-text-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.attach-text-content{margin:0;padding:4px 6px;font-size:10px;line-height:1.4;color:var(--text-soft);white-space:pre-wrap;word-break:break-all;max-height:56px;overflow:hidden}
.attach-hover-text{max-width:500px;max-height:400px;overflow:auto;margin:0;padding:12px;font-size:12px;line-height:1.5;color:var(--text);white-space:pre-wrap;word-break:break-all;font-family:var(--mono)}
.attach-remove{position:absolute;top:-6px;right:-6px;width:18px;height:18px;border-radius:50%;background:rgba(0,0,0,.65);color:#fff;border:2px solid #fff;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:3;transition:all .2s;padding:0;backdrop-filter:blur(4px)}
.attach-remove svg{width:9px;height:9px}
.msg-attachments{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
.msg-attachment img{max-width:200px;max-height:200px;border-radius:10px}
.msg-attachment video{max-width:240px;max-height:180px;border-radius:10px}
.msg-attachment.text-attach{background:var(--soft);border:1px solid var(--border);border-radius:10px;padding:8px 12px;max-width:400px}
.attach-file-name{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-2);margin-bottom:4px}
.attach-file-name svg{width:13px;height:13px}
.attach-text-content{font-size:11px;color:var(--muted);white-space:pre-wrap;overflow:hidden;max-height:100px}
.attach-item:hover .attach-remove{background:#ef4444;width:20px;height:20px;box-shadow:0 0 8px rgba(239,68,68,.7)}
.attach-item:hover .attach-remove svg{width:10px;height:10px}
.attach-item:hover{border-color:var(--violet)}
.attach-item{position:relative;flex-shrink:0;transition:all .2s;overflow:visible}
/* ⚡ pointer-events:none：弹层永不接收鼠标事件——内容异步加载高度不稳/位置翻转时，
   弹层一旦处于鼠标下方不会触发"隐藏→露出→再显示"的显隐死循环（悬停闪烁根因） */
.attach-hover-preview{position:fixed;max-width:320px;max-height:240px;z-index:10030;display:none;background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:8px;box-shadow:0 8px 32px rgba(0,0,0,.6);left:50%;transform:translateX(-50%);pointer-events:none}
.attach-hover-preview img{max-width:300px;max-height:220px;border-radius:8px;display:block}
.attach-hover-preview video{max-width:300px;max-height:220px;border-radius:8px;display:block}
.attach-picker{z-index:10025;position:fixed;background:var(--panel);border-radius:10px;padding:6px;box-shadow:0 8px 24px rgba(0,0,0,.5);max-height:200px;overflow-y:auto}
.attach-picker-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:8px;cursor:pointer;transition:background .15s;font-size:12px;color:var(--text)}
.attach-picker-item:hover{background:var(--soft)}
.attach-picker-item svg{width:14px;height:14px;color:var(--violet);flex-shrink:0}
.attach-picker-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.attach-picker-thumb{width:32px;height:32px;border-radius:6px;object-fit:cover;flex-shrink:0}
.attach-picker-file{display:flex;align-items:center;justify-content:center;background:var(--soft);color:var(--violet)}
.attach-picker-file svg{width:16px;height:16px}
.attach-ref-container{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}
.attach-ref-badge{display:flex;align-items:center;gap:4px;padding:3px 6px 3px 3px;border-radius:8px;background:rgba(167,139,250,.15);font-size:11px;color:var(--text)}
.attach-ref-badge img,.attach-ref-badge video{width:24px;height:24px;border-radius:4px;object-fit:cover}
.attach-ref-badge svg{width:14px;height:14px;color:var(--violet);flex-shrink:0}
.attach-ref-badge span{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ref-remove{width:14px;height:14px;border-radius:50%;background:rgba(251,113,133,.8);color:#fff;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;padding:0;transition:all .15s}
.ref-remove svg{width:7px;height:7px;color:#fff}
.ref-remove:hover{background:#ef4444;width:16px;height:16px}
/* 技能面板 */
.agent-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin:12px 0 20px}
.agent-card{display:flex;align-items:flex-start;gap:10px;padding:14px;border-radius:12px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);cursor:pointer;transition:all .2s;position:relative}
.agent-card:hover{background:rgba(167,139,250,.08);border-color:rgba(167,139,250,.3)}
.agent-card.active{background:rgba(167,139,250,.12);border-color:var(--violet);box-shadow:0 0 0 1px rgba(167,139,250,.3)}
.agent-card-icon{width:40px;height:40px;border-radius:10px;background:rgba(167,139,250,.12);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.agent-card-icon svg{width:20px;height:20px;color:var(--violet)}
.agent-card-body{flex:1;min-width:0}
.agent-card-name{font-size:14px;font-weight:600;color:var(--text);margin-bottom:4px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.agent-badge-preset{font-size:10px;padding:1px 6px;border-radius:4px;background:rgba(99,102,241,.15);color:#818cf8;border:1px solid rgba(99,102,241,.2)}
.agent-badge-custom{font-size:10px;padding:1px 6px;border-radius:4px;background:rgba(34,197,94,.15);color:#4ade80;border:1px solid rgba(34,197,94,.2)}
.agent-card-desc{font-size:12px;color:var(--text-soft);line-height:1.5}
.agent-card-actions{display:flex;gap:6px;flex-shrink:0;align-items:center}
.agent-use-btn{padding:6px 12px;border-radius:8px;font-size:12px;border:1px solid rgba(167,139,250,.3);background:rgba(167,139,250,.1);color:var(--violet);cursor:pointer;transition:all .15s;display:flex;align-items:center;gap:4px;white-space:nowrap}
.agent-use-btn svg{width:13px;height:13px}
.agent-use-btn:hover{background:var(--violet-600);color:#fff}
.agent-card.active .agent-use-btn{background:var(--violet-600);color:#fff;border-color:var(--violet-600)}
.agent-del-btn{padding:6px;border-radius:8px;border:1px solid rgba(251,113,133,.3);background:rgba(251,113,133,.08);color:#fb7185;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .15s}
.agent-del-btn svg{width:13px;height:13px}
.agent-del-btn:hover{background:#ef4444;color:#fff}
.agent-upload-section{margin-top:20px;padding-top:16px;border-top:1px solid rgba(255,255,255,.08)}
.agent-upload-zone{border:2px dashed rgba(167,139,250,.3);border-radius:12px;padding:24px;text-align:center;cursor:pointer;transition:all .2s;margin:8px 0 16px}
.agent-upload-zone:hover,.agent-upload-zone.dragover{border-color:var(--violet);background:rgba(167,139,250,.06)}
.agent-upload-hint{display:flex;flex-direction:column;align-items:center;gap:4px;color:var(--text-soft)}
.agent-upload-hint svg{width:28px;height:28px;color:var(--violet);margin-bottom:4px}
.agent-upload-format{font-size:11px;color:var(--text-faint)}
.agent-manual-section{margin-top:16px;padding-top:12px;border-top:1px solid rgba(255,255,255,.06)}
@media(max-width:600px){.agent-grid{grid-template-columns:1fr}}

/* ===== 节点历史生成记录：右上角入口 + 右侧固定面板 ===== */
.node-hist-btn{position:absolute;top:8px;right:8px;width:30px;height:30px;border-radius:9px;border:1px solid rgba(255,255,255,.14);background:rgba(15,15,24,.58);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#c9c7e0;display:flex;align-items:center;justify-content:center;padding:0;cursor:pointer;opacity:0;pointer-events:none;z-index:6;transition:opacity .18s ease,background .18s ease,color .18s ease,border-color .18s ease}
.b-node.sel .node-hist-btn{opacity:1;pointer-events:auto}
.b-node .node-hist-btn:hover{background:rgba(139,92,246,.4);border-color:rgba(139,92,246,.7);color:#fff}
.node-hist-btn svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* 面板外框：贴节点右侧、与节点等高；宽高由 JS 按缩放/视口精确设置 */
.node-hist-panel{position:absolute;top:0;left:calc(100% + 14px);height:100%;z-index:25;pointer-events:auto}
.nhp-inner{transform-origin:top left;transform:scale(var(--op-scale,1));display:flex;flex-direction:column;overflow:hidden;background:linear-gradient(180deg,rgba(28,28,42,.97),rgba(20,20,32,.98));border:1px solid rgba(139,92,246,.3);border-radius:14px;box-shadow:0 12px 36px -10px rgba(0,0,0,.7),0 5px 18px -8px rgba(139,92,246,.32)}
/* 缩略图列：固定窄面板内滚动，不随条数伸缩，仅展示图片 */
.nhp-list{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:8px;display:flex;flex-direction:column;gap:8px;scrollbar-width:thin;scrollbar-color:rgba(139,92,246,.5) transparent}
.nhp-list::-webkit-scrollbar{width:6px}
.nhp-list::-webkit-scrollbar-thumb{background:rgba(139,92,246,.45);border-radius:3px}
.nhp-list::-webkit-scrollbar-track{background:transparent}
.b-node .nhp-shot{flex:none;width:100%;padding:0;border-radius:10px;overflow:hidden;background:#0a0a14;border:2px solid transparent;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border-color .15s,box-shadow .15s,transform .1s}
.b-node .nhp-shot:hover{border-color:rgba(139,92,246,.55);transform:translateY(-1px)}
.nhp-shot.on{border-color:#8b5cf6;box-shadow:0 0 0 1px rgba(139,92,246,.4),0 6px 16px -6px rgba(139,92,246,.5)}
.nhp-shot img{width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}
.nhp-shot-ph{color:#55536e;display:flex}
.nhp-shot-ph svg{width:24px;height:24px;stroke:currentColor;fill:none;stroke-width:1.8}

/* ===== 节点顶部行：名字固定最左（超长折叠），下载/放大按钮固定最右 ===== */
.bn-top{position:absolute;top:-46px;left:14px;right:14px;display:flex;align-items:center;justify-content:space-between;gap:8px;z-index:10;pointer-events:none}
.bn-top .bn-tag{position:static;top:auto;right:auto;flex:0 1 auto;min-width:0;max-width:104px}
.bn-top .bn-tag-text{overflow:hidden;text-overflow:ellipsis;min-width:0;display:inline-block;max-width:60px;vertical-align:bottom}
.bn-acts{flex:none;display:flex;align-items:center;gap:6px;margin-left:auto}
/* 文本节点无媒体按钮，重命名铅笔也隐藏：选中态与未选中必须零视觉差异
   （铅笔淡入 + 3px 上滑动画会被感知为"选中后节点抖动"） */
.b-node.bn-text .bn-acts{display:none}
.bn-dl,.bn-zoom,.bn-shot,.bn-rename{flex:none;width:40px;height:40px;border-radius:11px;border:1px solid rgba(255,255,255,.18);background:rgba(20,20,32,.94);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#c9c7e0;display:flex;align-items:center;justify-content:center;padding:0;cursor:pointer;opacity:0;pointer-events:none;transform:translateY(3px);transition:opacity .18s ease,transform .18s ease,background .18s ease,color .18s ease,border-color .18s ease}
.b-node.sel .bn-dl,.b-node.sel .bn-zoom,.b-node.sel .bn-shot,.b-node.sel .bn-rename{opacity:1;pointer-events:auto;transform:translateY(0)}
.b-node .bn-dl:hover,.b-node .bn-zoom:hover,.b-node .bn-shot:hover,.b-node .bn-rename:hover{background:rgba(139,92,246,.4);border-color:rgba(139,92,246,.7);color:#fff}
.bn-dl svg,.bn-zoom svg,.bn-shot svg,.bn-rename svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* 视频抽帧：按参考图显示中文文字按钮 */
.bn-shot.bn-frame-btn{width:auto;min-width:64px;padding:0 10px;gap:5px;border-radius:10px;white-space:nowrap}
.bn-shot.bn-frame-btn span{font-size:13px;line-height:1;font-weight:600}
.bn-shot.bn-frame-btn svg{width:16px;height:16px}

/* ===== 节点重命名弹窗（复用 rename-modal 样式，层级高于放大态操作台 9999） ===== */
.node-rename-ov{z-index:10001}

/* ===== 图片节点 放大弹窗 + 拖框裁剪（截图） ===== */
.crop-mask{position:fixed;inset:0;z-index:10000;background:rgba(5,5,10,.74);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;padding:40px;animation:nzFade .18s ease}
.crop-box{display:flex;flex-direction:column;max-width:86vw;max-height:92vh;border-radius:16px;overflow:hidden;background:#0e0e18;border:1px solid rgba(139,92,246,.4);box-shadow:0 24px 70px -16px rgba(0,0,0,.85),0 0 0 1px rgba(139,92,246,.18);animation:nzPop .2s cubic-bezier(.2,.9,.3,1.2)}
.crop-head{flex:none;position:relative;z-index:30;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.07)}
.crop-title{font-size:14px;color:#c9c7e0;letter-spacing:.2px}
.crop-x{flex:none;width:38px;height:38px;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);color:#e6e4f5;display:flex;align-items:center;justify-content:center;padding:0;cursor:pointer;transition:background .15s}
.crop-x:hover{background:rgba(239,68,68,.55);border-color:rgba(239,68,68,.8);color:#fff}
.crop-x svg{width:19px;height:19px;stroke:currentColor;fill:none;stroke-width:2.2;stroke-linecap:round}
.crop-stage{position:relative;flex:0 1 auto;align-self:center;display:inline-block;font-size:0;line-height:0;background:#000;max-width:86vw}
.crop-anno{position:absolute;inset:0;z-index:1;pointer-events:none}
.crop-tools{flex:none;position:relative;z-index:30;display:flex;align-items:center;gap:6px;padding:10px 16px;border-bottom:1px solid rgba(255,255,255,.07);flex-wrap:wrap}
.crop-tool{display:inline-flex;align-items:center;gap:7px;height:36px;padding:0 14px;border-radius:10px;border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.04);color:#c9c7e0;font-size:13px;cursor:pointer;transition:background .15s,border-color .15s,color .15s}
.crop-tool:hover{background:rgba(139,92,246,.16);color:#fff}
.crop-tool.active{background:linear-gradient(135deg,#8b5cf6,#6366f1);border-color:transparent;color:#fff;font-weight:600}
.crop-tool svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

/* ============================================================
   ⚡ 账号与积分系统：顶栏账号区 / 登录门禁 / 积分流水 / 管理后台
   ============================================================ */

/* ---- 顶栏账号区（右侧） ---- */
.topbar-account{margin-left:auto;display:flex;align-items:center;gap:8px;flex:none}
.ta-chip{display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 13px;border-radius:11px;border:1px solid var(--line);background:var(--panel);color:var(--ink-2);font-size:13px;font-weight:600;cursor:pointer;transition:.15s;white-space:nowrap}
.ta-chip:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.ta-chip svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;color:var(--amber)}
.ta-chip b{font-size:14px;color:var(--ink)}
.ta-chip span{font-size:11.5px;color:var(--muted);font-weight:500}
.ta-chip.ta-admin{border-color:rgba(139,92,246,.5);color:var(--violet)}
.ta-chip.ta-admin svg{color:var(--violet)}
.ta-user{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 10px 0 5px;border-radius:11px;border:1px solid var(--line);background:var(--panel);cursor:pointer;transition:.15s;white-space:nowrap}
.ta-user:hover{border-color:var(--violet);background:var(--violet-soft)}
.ta-avatar{width:27px;height:27px;border-radius:9px;background:linear-gradient(135deg,#8b5cf6,#ec4899);color:#fff;font-size:13px;font-weight:700;display:flex;align-items:center;justify-content:center}
.ta-name{font-size:13px;font-weight:600;color:var(--ink-2);max-width:110px;overflow:hidden;text-overflow:ellipsis}
.ta-user svg{width:14px;height:14px;color:var(--muted)}

/* ============================================================
   ⚡ 认证层：登录 / 注册（两个独立界面，双栏品牌卡片）
   ============================================================ */
[hidden]{display:none!important} /* 防止任意组件样式覆盖 hidden 导致界面串显 */
.auth-layer{position:fixed;inset:0;z-index:9999;display:none;align-items:center;justify-content:center;overflow:hidden;background:#05060c}
.auth-layer.show{display:flex;animation:authFade .28s ease}
@keyframes authFade{from{opacity:0}to{opacity:1}}
/* 背景装饰：极淡环境光斑（单一冷紫，不抢银河光带）+ 极淡科技网格 */
.auth-orb{position:absolute;border-radius:50%;filter:blur(120px);opacity:.14;pointer-events:none;animation:authOrb 11s ease-in-out infinite alternate}
.auth-orb.orb-a{width:640px;height:640px;left:-180px;top:-200px;background:radial-gradient(circle,rgba(124,58,237,.5),transparent 70%)}
.auth-orb.orb-b{width:560px;height:560px;right:-150px;bottom:-190px;background:radial-gradient(circle,rgba(124,58,237,.4),transparent 70%);animation-delay:-5s}
.auth-orb.orb-c{width:480px;height:480px;right:6%;top:-240px;background:radial-gradient(circle,rgba(124,58,237,.3),transparent 70%);animation-delay:-2.5s}
@keyframes authOrb{from{transform:translate(0,0) scale(1)}to{transform:translate(26px,18px) scale(1.08)}}
.auth-grid{position:absolute;inset:0;pointer-events:none;background-image:linear-gradient(rgba(139,92,246,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(139,92,246,.035) 1px,transparent 1px);background-size:52px 52px;mask-image:radial-gradient(1200px 800px at 42% 50%,#000 30%,transparent 80%);-webkit-mask-image:radial-gradient(1200px 800px at 42% 50%,#000 30%,transparent 80%)}

/* ===== 银河宇宙（auth 层）：弧形银河臂 + 三层星空 + 彗星 + 指针光晕 =====
   星星由页尾内联脚本随机生成（远 140 / 中 70 / 近 36 颗，近层更大更亮）；
   银河臂 = 巨大圆环的发光边框扫出的弧线（主臂紫白 + 外侧粉臂 + 弧顶亮核），
   弧顶恰从时钟后方掠过；--mx/--my（-1..1）由 pointermove 驱动：
   弧臂反向轻移 + 三层星空以不同幅度漂移形成视差纵深，
   光晕跟随指针、时钟轻微 3D 倾斜——"一只手拨动银河" */
.auth-galaxy{position:absolute;inset:0;pointer-events:none;overflow:hidden}
/* 主弧臂：3600px 巨圆的 190px 发光边框（柔和弧线横贯全屏），
   边框内还叠着两团沿弧分布的星云；随指针反向轻移形成视差 */
.ag-band{position:absolute;left:50%;top:46%;width:3600px;height:3600px;margin-left:-1800px;border-radius:50%;border:190px solid rgba(206,186,255,.28);box-shadow:0 0 120px rgba(167,139,250,.4),inset 0 0 120px rgba(167,139,250,.34);background:radial-gradient(ellipse 520px 320px at 34% -1%,rgba(228,204,255,.32),transparent 70%),radial-gradient(ellipse 560px 340px at 62% -3%,rgba(165,205,255,.26),transparent 70%);transform:translate(calc(var(--mx,0)*-12px),calc(var(--my,0)*-8px));transition:transform .7s cubic-bezier(.2,.7,.3,1);filter:blur(12px)}
/* 外侧粉臂：更细的一道弧，与主臂错开层次（悬臂感） */
.ag-band::before{content:"";position:absolute;inset:-330px;border-radius:50%;border:90px solid rgba(251,182,214,.22);box-shadow:0 0 90px rgba(244,114,182,.24)}
/* 银河核：弧顶处的亮核光团，恰落在时钟中心后方 */
.ag-band::after{content:"";position:absolute;left:50%;top:-190px;width:980px;height:520px;transform:translate(-50%,-50%);background:radial-gradient(ellipse,rgba(243,238,255,.38),rgba(167,139,250,.18) 48%,transparent 72%);filter:blur(26px)}
.ag-stars{position:absolute;inset:-44px;transition:transform .7s cubic-bezier(.2,.7,.3,1)}
.ag-s1{transform:translate3d(calc(var(--mx,0)*8px),calc(var(--my,0)*8px),0)}
.ag-s2{transform:translate3d(calc(var(--mx,0)*18px),calc(var(--my,0)*18px),0)}
.ag-s3{transform:translate3d(calc(var(--mx,0)*30px),calc(var(--my,0)*30px),0)}
.ag-stars i{position:absolute;border-radius:50%;background:#fff;opacity:0;animation:agTwinkle 4s ease-in-out infinite;will-change:opacity,transform}
@keyframes agTwinkle{0%,100%{opacity:.12;transform:scale(.6)}50%{opacity:.95;transform:scale(1)}}
/* 彗星：斜向划过，长周期低频率，宁静不抢戏 */
.ag-comet{position:absolute;top:14%;left:-15%;width:150px;height:2px;border-radius:2px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.85));filter:drop-shadow(0 0 6px rgba(186,200,255,.9));opacity:0;animation:agComet 12s linear infinite 3s}
.ag-comet.ag-c2{top:66%;width:100px;animation-duration:16s;animation-delay:9s}
@keyframes agComet{0%,72%{opacity:0;transform:rotate(16deg) translateX(0)}74%{opacity:.9}92%,100%{opacity:0;transform:rotate(16deg) translateX(72vw)}}
/* 指针光晕：跟随鼠标的小柔光团，隔着半透明栏板透出，像指尖拨开星尘 */
.ag-glow{position:absolute;left:0;top:0;width:260px;height:260px;border-radius:50%;pointer-events:none;background:radial-gradient(circle,rgba(167,139,250,.22),rgba(56,189,248,.09) 44%,transparent 70%);transform:translate(32vw,24vh);will-change:transform}

/* 卡片主体：全屏铺满（软件第一面）；本体透明，银河星空从两栏半透明板下透出 */
.auth-card{position:relative;z-index:1;display:flex;width:100%;height:100%;max-width:none;max-height:none;border-radius:0;background:transparent;border:none;box-shadow:none;overflow:hidden;animation:authFade .3s ease}
.auth-close{position:absolute;top:14px;right:14px;z-index:5;width:34px;height:34px;border-radius:10px;border:none;background:transparent;color:var(--muted);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:.15s}
.auth-close:hover{background:var(--soft-2);color:var(--ink)}
.auth-close svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round}
.auth-layer.gate .auth-close{display:none}

/* 左右两栏同一底色（无分割线）：银河作为整片连续背景从栏板下透出 */
.auth-brand{flex:1 1 58%;min-width:0;display:flex;flex-direction:column;justify-content:center;padding:36px 56px;background:rgba(8,8,15,.3)}
.auth-brand-head{display:flex;align-items:center;gap:15px}
/* XME LOGO：白色圆角方块 + 黑色特粗字（用户图2还原） */
.auth-logo-xme{flex:none;display:flex;align-items:center;justify-content:center;width:60px;height:60px;border-radius:17px;background:#fff;color:#0a0a0f;font-size:19px;font-weight:900;letter-spacing:-.5px;font-family:'Segoe UI',-apple-system,'Helvetica Neue',Arial,sans-serif;box-shadow:0 10px 30px -8px rgba(255,255,255,.32),0 0 0 1px rgba(255,255,255,.14)}
.auth-brand-name{font-size:25px;font-weight:800;color:#fff;letter-spacing:.5px}
.auth-brand-name em{font-style:normal;background:linear-gradient(90deg,#a78bfa,#f472b6);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.auth-brand-slogan{margin:10px 0 20px;font-size:13.5px;color:var(--muted);line-height:1.7}

/* ===== 模型时钟（登录/注册左栏装饰，纯 CSS 无 JS）=====
   布局（容器 400px，--r=150px 轨道半径，随断点缩放；无底盘无刻度，悬浮于银河上）：
   - 中心 0~93px：励志语核心区（静态）
   - 半径 --r：可见虚线轨道，12 个模型名严格骑在轨道上顺时针旋转
     （.ac-item 用 translate:-50% -50% 把锚点从左上角校正到文字中心，
      否则宽名字会偏离轨道——半径不齐的根因）
   动画：模型环 42s/圈；名字内层反向补偿保持水平；
   金色雷达扇 7.5s/圈；中心闪电呼吸脉动；
   指针视差：--mx/--my 由内联脚本驱动，星空分层漂移 + 时钟轻微 3D 倾斜 */
.auth-clock{--r:150px;position:relative;width:400px;height:400px;margin:6px auto 26px;flex:none;transform:perspective(950px) rotateX(calc(var(--my,0)*-3.5deg)) rotateY(calc(var(--mx,0)*4.5deg));transition:transform .5s cubic-bezier(.2,.7,.3,1)}
/* 轨道环：模型骑行的可见轨迹（虚线主轨，发光） */
.ac-track{position:absolute;left:50%;top:50%;width:calc(var(--r)*2);height:calc(var(--r)*2);transform:translate(-50%,-50%);border-radius:50%;border:1.5px dashed rgba(167,139,250,.34);box-shadow:0 0 26px -6px rgba(139,92,246,.4),inset 0 0 22px -8px rgba(139,92,246,.32)}
/* 雷达扇：静态圆形裁剪盒 + 内层旋转扇面。旋转的是 ::before（被圆形盒裁住），
   避免方形旋转时对角线（×1.414）撑大外层 overflow 容器的滚动宽度 */
.ac-sweep{position:absolute;inset:0;border-radius:50%;overflow:hidden}
.ac-sweep::before{content:"";position:absolute;inset:0;border-radius:50%;background:conic-gradient(from 0deg,rgba(251,191,36,0) 0deg,rgba(251,191,36,.24) 344deg,rgba(251,191,36,.5) 360deg);-webkit-mask:radial-gradient(closest-side,transparent 46%,#000 47%,#000 91%,transparent 92%);mask:radial-gradient(closest-side,transparent 46%,#000 47%,#000 91%,transparent 92%);animation:acSpin 7.5s linear infinite;will-change:transform}
/* 模型环：0×0 锚点定位于时钟中心（子项用 transform 轨道定位），
   环自身无边框无背景，0 尺寸旋转不产生投影包围盒外溢 */
.ac-ring{position:absolute;left:50%;top:50%;width:0;height:0;animation:acSpin 42s linear infinite;will-change:transform}
@keyframes acSpin{to{transform:rotate(1turn)}}
/* translate 属性先于 transform 生效：先把内容盒中心对齐到画布中心，再做轨道定位；
   flex 居中消除行框 strut 的垂直偏移（否则名字转向时半径会抖 ±3px），
   保证任何宽度的名字其中心都精确落在半径 --r 的圆上 */
.ac-item{position:absolute;left:50%;top:50%;display:flex;align-items:center;justify-content:center;translate:-50% -50%;transform:rotate(calc(var(--i)*30deg)) translateY(calc(var(--r)*-1)) rotate(calc(var(--i)*-30deg))}
.ac-item i{display:inline-flex;flex-direction:column;align-items:center;font-style:normal;font-size:11.5px;font-weight:700;letter-spacing:.2px;line-height:1.25;white-space:nowrap;animation:acSpinRev 42s linear infinite;will-change:transform;text-shadow:0 0 3px rgba(8,8,15,.9),0 1px 10px rgba(8,8,15,.95)}
/* 卫星点：每个模型名顶上一颗发光小星（currentColor 跟随类型色），名字骑轨道、星点悬线上 */
.ac-item i::before{content:"";flex:none;width:4px;height:4px;border-radius:50%;background:currentColor;opacity:.9;box-shadow:0 0 7px 1px currentColor;margin-bottom:3px}
@keyframes acSpinRev{to{transform:rotate(-1turn)}}
.ac-txt i{color:#67e8f9}
.ac-img i{color:#ddd6fe}
.ac-vid i{color:#fbcfe8}
.ac-core{position:absolute;left:50%;top:50%;width:186px;height:186px;transform:translate(-50%,-50%);border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;text-align:center;background:radial-gradient(circle,rgba(124,58,237,.17),rgba(13,13,23,.62) 74%);border:1px solid rgba(139,92,246,.22);box-shadow:0 0 46px -8px rgba(124,58,237,.5),inset 0 0 32px rgba(124,58,237,.15)}
.ac-bolt{width:32px;height:32px;color:#fbbf24;filter:drop-shadow(0 0 8px rgba(251,191,36,.7));animation:acPulse 2.6s ease-in-out infinite}
.ac-bolt svg{width:100%;height:100%;fill:currentColor}
@keyframes acPulse{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.18);opacity:1}}
.ac-quote{display:flex;flex-direction:column;gap:3px}
.ac-quote em{font-style:normal;font-size:12.5px;color:var(--muted);letter-spacing:3px}
.ac-quote b{font-size:20px;font-weight:800;background:linear-gradient(90deg,#a78bfa,#f472b6);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:1.5px}
@media (prefers-reduced-motion:reduce){.ac-ring,.ac-item i,.ac-sweep::before,.ac-bolt,.ag-stars i,.ag-comet{animation:none}.ag-stars i{opacity:.6}}
.auth-feats{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:13px}
.auth-feats li{display:flex;align-items:flex-start;gap:11px;font-size:13px;color:var(--ink-2);line-height:1.5}
.auth-feats li span{flex:none;width:30px;height:30px;border-radius:9px;background:rgba(139,92,246,.14);border:1px solid rgba(139,92,246,.3);display:flex;align-items:center;justify-content:center}
.auth-feats li svg{width:15px;height:15px;stroke:var(--violet);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.auth-brand-foot{margin-top:22px;padding-top:16px;border-top:1px solid rgba(139,92,246,.14);font-size:12px;color:var(--faint)}

/* 右栏：表单区（收窄；同一底色，银河连续；表单装在独立浮起的小窗口里） */
.auth-panel{flex:0 0 42%;display:flex;align-items:center;justify-content:center;padding:36px 44px;background:rgba(8,8,15,.3)}
/* 表单小窗口：浮起卡片（毛玻璃 + 细白边 + 大阴影） */
.auth-win{position:relative;width:100%;max-width:396px;padding:34px 34px 28px;border-radius:22px;background:rgba(17,17,26,.78);border:1px solid rgba(255,255,255,.09);box-shadow:0 32px 90px -24px rgba(0,0,0,.85),0 0 0 1px rgba(255,255,255,.03),0 0 70px -34px rgba(124,58,237,.5);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:authWinIn .38s cubic-bezier(.2,.9,.3,1.1)}
/* 顶部受光高光线：强化浮起的光学逻辑 */
.auth-win::before{content:"";position:absolute;left:14%;right:14%;top:-1px;height:1px;border-radius:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.35),transparent);pointer-events:none}
@keyframes authWinIn{from{opacity:0;transform:translateY(16px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}
.auth-view{width:100%;max-width:none}
.auth-view.view-in{animation:authView .3s ease}
@keyframes authView{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
.auth-title{font-size:26px;font-weight:800;color:#fff;margin:0 0 7px}
.auth-sub{font-size:13.5px;color:var(--muted);margin:0 0 24px}
.auth-note{margin:0 0 14px;padding:9px 13px;border-radius:11px;background:rgba(251,113,133,.12);border:1px solid rgba(251,113,133,.35);color:var(--rose);font-size:12.5px;font-weight:500;line-height:1.5}
.auth-form{display:flex;flex-direction:column;gap:12px}
/* 一体化输入框：图标 + 输入 + 眼睛 */
.auth-field{position:relative;display:flex;align-items:center}
.af-icon{position:absolute;left:13px;display:flex;pointer-events:none;color:var(--faint);transition:.15s}
.af-icon svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.auth-field input{width:100%;height:52px;padding:0 44px 0 42px;border-radius:13px;border:1px solid var(--line);background:#0c0c15;color:var(--ink);font-size:14px;font-family:inherit;outline:none;transition:border-color .15s,box-shadow .15s}
.auth-field input::placeholder{color:var(--faint)}
.auth-field input:focus{border-color:var(--violet-600);box-shadow:0 0 0 3px rgba(139,92,246,.16)}
.auth-field:focus-within .af-icon{color:var(--violet)}
.af-eye{position:absolute;right:6px;width:32px;height:32px;border:none;border-radius:9px;background:transparent;color:var(--faint);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:.15s}
.af-eye:hover{color:var(--ink);background:var(--soft-2)}
.af-eye.on{color:var(--violet)}
.af-eye svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* 注册：验证码字段（输入框 + 右侧获取按钮） */
.auth-field input#regCode{padding-right:96px;letter-spacing:2px}
.af-code-btn{position:absolute;right:6px;height:32px;padding:0 12px;border:none;border-radius:9px;background:rgba(139,92,246,.14);color:var(--violet);font-size:12px;font-family:inherit;font-weight:600;cursor:pointer;transition:.15s;white-space:nowrap}
.af-code-btn:hover:not(:disabled){background:rgba(139,92,246,.24)}
.af-code-btn:disabled{color:var(--faint);background:var(--soft-2);cursor:not-allowed}
.auth-submit{width:100%;height:52px;margin-top:6px;padding:0;border:none;font-size:15px;border-radius:13px;letter-spacing:6px}
.auth-submit:disabled{opacity:.65;cursor:wait;transform:none}
/* 切换入口 */
.auth-switch{display:flex;align-items:center;justify-content:center;gap:6px;margin-top:20px;padding-top:18px;border-top:1px solid var(--line-2);font-size:13px;color:var(--muted)}
.auth-switch a{display:inline-flex;align-items:center;gap:4px;color:var(--violet);font-weight:700;text-decoration:none;transition:.15s}
.auth-switch a:hover{color:#c4b5fd;filter:brightness(1.15)}
.sw-arrow svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;display:block}
.sw-arrow.back svg{margin-right:2px}
.auth-terms{margin:16px 0 0;text-align:center;font-size:11px;color:var(--faint)}

/* 窄桌面（≤1000px）：左栏收一点，保持双栏 */
@media (max-width:1000px) and (min-width:821px){
  .auth-brand{flex:1 1 52%;padding:28px 36px}
  .auth-clock{--r:104px;width:284px;height:284px;margin-bottom:20px}
  .ac-item i{font-size:9.5px}
  .ac-core{width:134px;height:134px}
  .ac-quote b{font-size:16px}
  .auth-panel{padding:28px 28px}
}
/* 手机 / 窄屏（≤820px，网页版手机打开）：
   上下布局 + 整页可滚动：顶部品牌（时钟缩小）→ 表单小窗口全宽 */
@media (max-width:820px){
  .auth-layer{overflow-y:auto;-webkit-overflow-scrolling:touch;align-items:flex-start}
  .auth-card{flex-direction:column;height:auto;min-height:100%}
  .auth-brand{flex:none;justify-content:flex-start;padding:26px 22px 8px;background:rgba(8,8,15,.3)}
  .auth-brand-head{gap:12px;justify-content:center}
  .auth-logo-xme{width:44px;height:44px;border-radius:12px;font-size:14px}
  .auth-brand-name{font-size:20px}
  .auth-brand-slogan{margin:8px 0 12px;font-size:12.5px;text-align:center}
  .auth-clock{--r:112px;width:300px;height:300px;margin:4px auto 14px}
  .ac-item i{font-size:9.5px}
  .ac-core{width:140px;height:140px}
  .ac-bolt{width:20px;height:20px}
  .ac-quote b{font-size:14.5px}
  .ac-quote em{font-size:10px}
  .auth-feats{gap:9px}
  .auth-feats li{font-size:11.5px;gap:8px}
  .auth-feats li span{width:24px;height:24px;border-radius:7px}
  .auth-feats li svg{width:12px;height:12px}
  .auth-brand-foot{margin-top:12px;padding-top:10px;font-size:10.5px;text-align:center}
  .auth-panel{flex:none;padding:18px 16px 30px}
  .auth-win{max-width:440px;margin:0 auto;padding:24px 20px 20px;border-radius:18px}
  .auth-title{font-size:22px}
  .auth-field input{height:48px;font-size:13.5px}
  .auth-submit{height:48px;font-size:14px;letter-spacing:5px}
  .auth-close{position:fixed;top:12px;right:12px;background:rgba(255,255,255,.06);border-radius:10px}
}
/* 超小屏手机（≤360px，iPhone SE/安卓小屏）：时钟再收一档保证不贴边 */
@media (max-width:360px){
  .auth-clock{--r:98px;width:262px;height:262px}
  .ac-item i{font-size:8.2px}
  .ac-core{width:121px;height:121px}
  .auth-panel{padding:14px 12px 24px}
}
/* 超矮手机横屏（高度≤620px）：时钟再缩，留足表单空间 */
@media (max-height:620px) and (max-width:820px){
  .auth-clock{--r:80px;width:218px;height:218px;margin-bottom:8px}
  .ac-item i{font-size:7.6px}
  .ac-core{width:102px;height:102px;gap:2px}
  .ac-bolt{width:18px;height:18px}
  .ac-quote b{font-size:12px}
  .ac-quote em{font-size:8.5px;letter-spacing:2px}
  .auth-feats{display:none}
  .auth-brand-foot{display:none}
}
/* 大屏（高度≥900px）：时钟放大到 380px 成为主视觉焦点 */
@media (min-height:900px) and (min-width:821px){
  .auth-clock{--r:172px;width:460px;height:460px}
  .ac-item i{font-size:13px}
  .ac-core{width:215px;height:215px}
  .ac-bolt{width:36px;height:36px}
  .ac-quote b{font-size:23px}
  .ac-quote em{font-size:13.5px}
}
/* 矮窗口：缩小时钟防左栏溢出（330 → 284 → 240 两档） */
@media (max-height:800px) and (min-width:821px){
  .auth-clock{--r:128px;width:344px;height:344px}
  .ac-item i{font-size:10.5px}
  .ac-core{width:162px;height:162px}
  .ac-quote b{font-size:17px}
  .auth-brand{padding:24px 44px}
  .auth-feats{gap:10px}
}
@media (max-height:700px) and (min-width:821px){
  .auth-clock{--r:106px;width:290px;height:290px;margin-bottom:18px}
  .ac-item i{font-size:9.3px}
  .ac-core{width:136px;height:136px}
  .ac-bolt{width:24px;height:24px}
  .ac-quote b{font-size:15px}
  .ac-quote em{font-size:10.5px}
  .auth-brand{padding:18px 40px}
  .auth-feats li{font-size:12px}
  .auth-feats li span{width:26px;height:26px}
  .auth-brand-foot{margin-top:12px;padding-top:10px}
}

/* ---- 积分流水（用户中心） ---- */
.acct-tx-list{max-height:340px;overflow-y:auto;display:flex;flex-direction:column;gap:6px;padding-right:4px}
.acct-tx-item{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 14px;border-radius:12px;background:var(--panel);border:1px solid var(--line)}
.acct-tx-info{min-width:0}
.acct-tx-reason{font-size:13px;font-weight:600;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acct-tx-time{font-size:11.5px;color:var(--muted);margin-top:2px}
.acct-tx-delta{flex:none;font-size:15px;font-weight:700;color:var(--rose)}
.acct-tx-delta.plus{color:var(--emerald)}
.acct-tx-empty{padding:26px 10px;text-align:center;color:var(--muted);font-size:13px}
.acct-tx-refunded{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:7px;font-size:10.5px;font-weight:600;background:rgba(52,211,153,.14);border:1px solid rgba(52,211,153,.35);color:var(--emerald);vertical-align:1px}

/* ---- 管理后台（全屏布局：吸顶栏 + 全宽内容） ---- */
.view.view-admin{padding:0;max-width:none;margin:0;overflow:auto;background:radial-gradient(1100px 280px at 50% -100px,rgba(139,92,246,.10),transparent 70%),var(--bg)}
.admin-page{display:flex;flex-direction:column;min-height:100%;max-width:none;margin:0;padding:0}
.admin-topbar{position:sticky;top:0;z-index:30;background:rgba(12,12,20,.88);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--line);padding:0 28px}
.admin-topbar-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:13px 0 10px}
.admin-topbar-left{display:flex;align-items:baseline;gap:12px;min-width:0;flex-wrap:wrap}
.admin-title{font-size:18px;font-weight:800;display:flex;align-items:center;gap:10px;white-space:nowrap;color:var(--ink)}
.admin-title svg{width:20px;height:20px;stroke:var(--violet);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.admin-sub{font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.admin-tabs{display:flex;gap:4px;padding:0 0 12px;overflow-x:auto;scrollbar-width:none}
.admin-tabs::-webkit-scrollbar{display:none}
.admin-tab{display:flex;align-items:center;gap:7px;height:34px;padding:0 15px;border:1px solid transparent;border-radius:10px;background:transparent;color:var(--muted);font-size:13px;font-weight:600;cursor:pointer;transition:.15s;white-space:nowrap;flex:none}
.admin-tab svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.admin-tab:hover{color:var(--ink);background:var(--panel)}
.admin-tab.active{background:linear-gradient(135deg,rgba(139,92,246,.26),rgba(99,102,241,.13));color:#cfc4fd;box-shadow:inset 0 0 0 1px rgba(139,92,246,.5),0 2px 10px rgba(139,92,246,.14)}
.admin-tab.active svg{stroke:#cfc4fd}
.admin-body{padding:22px 28px 64px;display:flex;flex-direction:column;gap:18px;width:100%}
[data-admin-pane]{display:flex;flex-direction:column;gap:18px}
[data-admin-pane][hidden]{display:none}
.admin-stats{display:grid;grid-template-columns:repeat(5,1fr);gap:14px}
.admin-stat-card{background:linear-gradient(180deg,rgba(255,255,255,.025),transparent 45%),var(--panel);border:1px solid var(--line);border-radius:14px;padding:18px 14px;text-align:center;transition:.15s}
.admin-stat-card:hover{border-color:var(--violet);transform:translateY(-1px)}
.admin-stat-card.online{border-color:rgba(52,211,153,.4)}
.admin-stat-card.online .asc-num{color:var(--emerald)}
.asc-num{font-size:27px;font-weight:800;color:var(--ink);line-height:1.2;font-variant-numeric:tabular-nums}
.asc-label{font-size:12px;color:var(--muted);margin-top:5px}
.admin-card{background:linear-gradient(180deg,rgba(255,255,255,.02),transparent 40%),var(--panel);border:1px solid var(--line);border-radius:16px;padding:20px 22px}
.admin-card-h{display:flex;align-items:center;justify-content:space-between;gap:14px;font-size:15px;font-weight:700;color:var(--ink);margin-bottom:12px}
.admin-card-h svg{width:17px;height:17px;stroke:var(--violet);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:-3px;margin-right:7px}
.admin-search{width:230px;height:34px;padding:0 13px;border-radius:10px;border:1px solid var(--line);background:var(--soft);color:var(--ink);font-size:13px;outline:none;transition:.15s}
.admin-search:focus{border-color:var(--violet)}
.admin-desc{font-size:12.5px;color:var(--muted);margin-bottom:12px;line-height:1.6}
/* 管理后台：邮件设置（SMTP 发信配置） */
.mail-cfg-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-bottom:14px}
.mcf-item{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--muted)}
.mcf-item input,.mcf-item select{height:36px;padding:0 10px;border-radius:9px;border:1px solid var(--line);background:#0c0c15;color:var(--ink);font-size:12.5px;font-family:inherit;outline:none;transition:border-color .15s}
.mcf-item input:focus,.mcf-item select:focus{border-color:var(--violet-600)}
.mcf-item textarea{width:100%;min-height:78px;padding:9px 10px;border-radius:9px;border:1px solid var(--line);background:#0c0c15;color:var(--ink);font-size:12.5px;font-family:inherit;line-height:1.7;outline:none;transition:border-color .15s;resize:vertical;word-break:break-all}
.mcf-item textarea:focus{border-color:var(--violet-600)}
/* 密码框明文切换（存储设置 SecretKey / 邮件设置 SMTP 授权码）：右侧眼睛按钮 */
.mcf-pw{position:relative;display:block}
.mcf-pw input{width:100%;padding-right:36px}
.mcf-eye{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:27px;height:27px;border:none;border-radius:7px;background:transparent;color:var(--muted);cursor:pointer;transition:.15s}
.mcf-eye:hover{color:var(--ink-2);background:rgba(255,255,255,.06)}
.mcf-eye.on{color:var(--violet)}
.mcf-eye svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.mail-test-row{display:flex;align-items:center;gap:8px}
.mail-test-row input{flex:1;height:36px;padding:0 10px;border-radius:9px;border:1px solid var(--line);background:#0c0c15;color:var(--ink);font-size:12.5px;font-family:inherit;outline:none}
.mail-test-row input:focus{border-color:var(--violet-600)}
.mail-status{font-size:12px;color:var(--muted)}
.mail-status.ok{color:#34d399}
.mail-status.warn{color:#fbbf24}
.mail-status.err{color:#f87171}
/* 积分流水弹窗：卡密兑换框 */
.redeem-box{display:flex;gap:8px;margin:10px 0 6px}
.redeem-box input{flex:1;height:40px;padding:0 12px;border-radius:10px;border:1px solid var(--line);background:#0c0c15;color:var(--ink);font-size:13px;font-family:inherit;letter-spacing:1px;outline:none;transition:border-color .15s}
.redeem-box input:focus{border-color:var(--violet-600)}
.redeem-box .btn{height:40px;white-space:nowrap}
.redeem-hint{font-size:11.5px;color:var(--muted);margin:0 0 14px}
/* 多模态设置弹窗（单模型）：附件上限三项 */
.caps-single{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:4px}
.cap-cell-big{display:flex;flex-direction:column;gap:6px;padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:rgba(139,92,246,.05)}
.cap-cell-big > span{font-size:12.5px;font-weight:600;color:var(--ink)}
.cap-cell-big > em{font-style:normal;font-size:11px;color:var(--muted)}
.cap-in-big{width:100%;height:36px;padding:0 12px;border-radius:9px;border:1px solid var(--line);background:#0c0c15;color:var(--ink);font-size:14px;font-family:inherit;text-align:center;outline:none;transition:border-color .15s}
.cap-in-big:focus{border-color:var(--violet-600)}
.cap-in-big::placeholder{color:#4b4963;font-size:12px}
/* 模型行内：多模态齿轮按钮（与删除按钮同款尺寸，悬停紫色） */
.aci-caps{flex:none;width:30px;height:30px;border-radius:9px;border:1px solid var(--line);background:var(--panel);color:var(--muted);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:.15s;position:relative}
.aci-caps:hover{border-color:var(--violet-500);color:var(--violet);background:rgba(139,92,246,.12)}
.aci-caps svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.aci-caps.on{border-color:var(--violet-500);color:var(--violet);background:rgba(139,92,246,.14)} /* 已设置过上限的模型：常亮提示 */
.mdl-h-caps{grid-area:caps}
.mdl-h-publish{grid-area:publish}
.mdl-h-save{grid-area:save}
/* 管理后台：卡密管理 */
.card-stats{font-size:12px;color:var(--muted);font-weight:400}
.card-gen-row{display:grid;grid-template-columns:1fr 1fr 1.4fr auto;gap:10px;align-items:end}
.card-gen-result{margin-top:12px;border:1px solid rgba(139,92,246,.25);border-radius:10px;background:rgba(139,92,246,.06);padding:10px 12px}
.cgr-h{font-size:12px;color:var(--violet);font-weight:600;margin-bottom:6px}
.cgr-codes{font-family:Consolas,monospace;font-size:12.5px;line-height:1.7;color:var(--ink);white-space:pre;max-height:180px;overflow-y:auto;user-select:text}
.cgr-ops{display:flex;gap:8px;margin-top:8px}
.card-filter{display:flex;gap:8px;align-items:center}
.card-filter select,.card-filter input{height:32px;padding:0 9px;border-radius:8px;border:1px solid var(--line);background:#0c0c15;color:var(--ink);font-size:12px;font-family:inherit;outline:none}
.card-filter input{width:160px}
.card-code{font-family:Consolas,monospace;font-size:12px;color:var(--violet);cursor:pointer}
.card-code:hover{text-decoration:underline}
.card-st{font-size:11px;font-weight:600;padding:2px 8px;border-radius:99px}
.card-st.unused{color:#34d399;background:rgba(52,211,153,.12)}
.card-st.used{color:#8e8ca8;background:rgba(142,140,168,.15)}
.card-st.disabled{color:#f87171;background:rgba(248,113,113,.12)}
@media (max-width: 900px){.card-gen-row{grid-template-columns:1fr 1fr}.card-filter{flex-wrap:wrap}}
@media (max-width: 900px){.mail-cfg-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width: 640px){.mail-cfg-grid{grid-template-columns:1fr}.mail-test-row{flex-wrap:wrap}}
.admin-table-wrap{overflow-x:auto;border:1px solid var(--line-2);border-radius:12px}
.admin-table{width:100%;border-collapse:collapse;font-size:13px;min-width:720px}
.admin-table th{text-align:left;padding:10px 13px;background:var(--soft);color:var(--muted);font-size:12px;font-weight:600;border-bottom:1px solid var(--line);white-space:nowrap}
.admin-table td{padding:10px 13px;border-bottom:1px solid var(--line-2);color:var(--ink-2);vertical-align:middle}
.admin-table tbody tr:last-child td{border-bottom:none}
.admin-table tbody tr:hover td{background:rgba(139,92,246,.05)}
.admin-table .th-ops{text-align:right}
.at-acc{font-weight:600;color:var(--ink)}
.at-credits{font-weight:700;color:var(--amber)}
.at-time{color:var(--muted);font-size:12px;white-space:nowrap}
.at-role{display:inline-block;padding:2px 9px;border-radius:8px;font-size:11.5px;font-weight:600}
.at-role.admin{background:rgba(139,92,246,.15);border:1px solid rgba(139,92,246,.4);color:var(--violet)}
.at-role.user{background:var(--soft-2);border:1px solid var(--line);color:var(--muted)}
.at-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--muted);white-space:nowrap}
.at-status::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--faint)}
.at-status.on{color:var(--emerald)}
.at-status.on::before{background:var(--emerald);box-shadow:0 0 8px rgba(52,211,153,.7)}
.at-status.off{color:var(--rose)}
.at-status.off::before{background:var(--rose)}
.at-ops{text-align:right;white-space:nowrap}
.aop{display:inline-flex;align-items:center;gap:4px;height:29px;padding:0 10px;margin-left:6px;border-radius:9px;border:1px solid var(--line);background:var(--soft);color:var(--ink-2);font-size:12px;font-weight:600;cursor:pointer;transition:.15s}
.aop:hover{border-color:var(--violet);color:var(--violet);background:var(--violet-soft)}
.aop svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.at-reason{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.at-delta{font-weight:700;color:var(--rose)}
.at-delta.plus{color:var(--emerald)}
.admin-empty{padding:20px 10px;text-align:center;color:var(--muted);font-size:13px}

/* 积分流水页：筛选栏 + 汇总卡 + 分页 */
.admin-tx-h{flex-wrap:wrap}
.admin-tx-filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.admin-sel{height:34px;padding:0 10px;border-radius:10px;border:1px solid var(--line);background:var(--soft);color:var(--ink);font-size:12.5px;outline:none;cursor:pointer;transition:.15s}
.admin-sel:focus{border-color:var(--violet)}
.admin-tx-sums{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:12px}
.admin-stat-card.sm{padding:11px 12px}
.admin-stat-card.sm .asc-num{font-size:19px}
.admin-stat-card.sm .asc-label{margin-top:2px}
.admin-pager{display:flex;align-items:center;justify-content:flex-end;gap:12px;margin-top:12px;font-size:12.5px;color:var(--muted)}
.admin-pager .btn[disabled]{opacity:.45;cursor:not-allowed}

/* 账本页：一行统计 + 明细表（次数/本地积分/上游消耗/回传状态） */
.led-statline{display:flex;align-items:center;flex-wrap:wrap;gap:4px 10px;padding:9px 12px;margin-bottom:10px;border:1px solid var(--line-2);border-radius:10px;background:var(--soft);font-size:12.5px;color:var(--muted)}
.led-statline b{font-size:13.5px;color:var(--ink);font-weight:700}
.led-table{min-width:640px}
.led-up-cny{color:#ef4444;font-weight:600}
.led-up-credit{color:#8b5cf6;font-weight:600}
.led-ok-n{color:#16a34a}
.led-fail-n{color:#dc2626}
.led-free{display:inline-block;padding:1px 8px;border-radius:20px;font-size:11px;font-weight:600;background:rgba(139,92,246,.14);color:#8b5cf6}
/* 账本模型列的分辨率档位徽标（按档计价记录） */
.led-res{display:inline-block;margin-left:4px;padding:0 5px;border-radius:6px;font-size:10px;font-weight:600;background:rgba(96,165,250,.14);color:#60a5fa}
.led-refund{display:inline-block;padding:1px 8px;border-radius:20px;font-size:11px;font-weight:600;background:rgba(239,68,68,.14);color:#dc2626}
.led-pending{display:inline-block;padding:1px 8px;border-radius:20px;font-size:11px;font-weight:600;background:rgba(148,163,184,.16);color:#94a3b8}

/* 生成记录页：状态徽章 + 详情按钮 + 详情弹窗 */
.at-tx-detail{margin-left:6px;padding:1px 8px;font-size:11px;height:20px;line-height:18px}
.gen-badge{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11.5px;font-weight:600}
.gen-badge.ok{background:rgba(34,197,94,.14);color:#16a34a}
.gen-badge.err{background:rgba(239,68,68,.14);color:#dc2626}
.gen-badge.cancel{background:rgba(120,120,130,.15);color:var(--muted)}
.gen-prompt-hint{display:block;color:var(--muted);font-size:11px;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gen-detail{padding:4px 2px 2px}
.gen-detail-title{display:flex;align-items:center;gap:8px;font-size:16px;margin:0 0 14px}
.gen-detail-title svg{width:18px;height:18px;color:var(--violet)}
.gen-detail-table{width:100%;border-collapse:collapse;margin-bottom:14px}
.gen-detail-table td{padding:7px 10px;border-bottom:1px solid var(--line);font-size:12.5px;vertical-align:top}
.gen-detail-table td:first-child{width:84px;color:var(--muted);white-space:nowrap}
.gen-detail-sec{margin-bottom:12px}
.gen-detail-sec-t{font-size:12px;color:var(--muted);margin-bottom:5px;font-weight:600}
.gen-detail-sec-t.err{color:#dc2626}
.gen-detail-prompt{padding:10px 12px;background:var(--soft);border-radius:10px;font-size:12.5px;line-height:1.7;white-space:pre-wrap;word-break:break-word;max-height:180px;overflow:auto}
.gen-detail-prompt.err{background:rgba(239,68,68,.06);color:#b91c1c}
.gen-detail-api{padding:10px 12px;background:var(--soft);border-radius:10px;font-size:11.5px;line-height:1.8;word-break:break-all;max-height:160px;overflow:auto;color:var(--muted)}
.gen-detail-actions{display:flex;align-items:center;gap:10px;margin-top:16px;flex-wrap:wrap}
.gen-detail-nourl{font-size:11.5px;color:var(--muted)}

/* 模型设置 · 按渠道分组（一个 API 一个组） */
.mdl-group{border:1px solid var(--line-2);border-radius:13px;padding:11px 13px;margin-bottom:12px;background:var(--soft);overflow:visible}
.mdl-group .mdl-head{padding:0 11px 6px}
.mdl-group .mdl-row{overflow:visible}
.mdl-group-h{display:flex;align-items:center;gap:9px;margin-bottom:9px;flex-wrap:wrap}
.mdl-group-h .abg-url{flex:1;min-width:120px}
.mdl-group-h .btn{margin-left:0}
.mdl-count{font-size:10.5px;padding:1px 8px;border-radius:7px;background:rgba(139,92,246,.12);border:1px solid rgba(139,92,246,.3);color:var(--violet);font-weight:600;white-space:nowrap}
.mdl-group-orphan{border-style:dashed;background:transparent}
.mdl-group-orphan .abg-name{color:var(--muted)}
/* API 分组 · 模型计费（一个 API 下可含视频/图片/文本等多种模型） */
.api-bill-group{border:1px solid var(--line-2);border-radius:13px;padding:12px 14px;margin-bottom:12px;background:var(--soft)}
.abg-head{display:flex;align-items:center;gap:9px;margin-bottom:10px;flex-wrap:wrap}
.abg-dot{width:8px;height:8px;border-radius:50%;background:#9aa3af;flex:none}
.abg-dot.on{background:var(--emerald);box-shadow:0 0 7px rgba(52,211,153,.55)}
.abg-name{font-weight:700;font-size:13.5px;color:var(--ink)}
.abg-url{font-size:11px;color:var(--muted);font-family:ui-monospace,Consolas,monospace;max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.abg-src{font-size:10.5px;padding:1px 8px;border-radius:7px;background:rgba(139,92,246,.12);border:1px solid rgba(139,92,246,.3);color:var(--violet);font-weight:600;white-space:nowrap}
.abg-rows{display:flex;flex-direction:column;gap:7px}
.abg-row{display:flex;align-items:center;gap:9px;background:var(--panel);border:1px solid var(--line-2);border-radius:10px;padding:7px 10px}
.abg-model{flex:1;min-width:110px;font-size:13px;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.abg-model-input{flex:1;min-width:110px;height:31px;padding:0 10px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font-size:13px;outline:none;transition:.15s}
.abg-model-input:focus{border-color:var(--violet)}
.abg-type{height:31px;padding:0 7px;border-radius:8px;border:1px solid var(--line);background:var(--panel);color:var(--ink-2);font-size:12.5px;font-weight:600;outline:none;cursor:pointer;transition:.15s}
.abg-type:hover{border-color:var(--violet)}
.abg-cost{width:84px;height:31px;padding:0 9px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font-size:13px;outline:none;text-align:right;transition:.15s}
.abg-cost:focus{border-color:var(--violet)}
.abg-cost::placeholder{color:var(--muted);font-size:11.5px}
.abg-row .api-unit{font-size:11.5px;color:var(--muted);white-space:nowrap}
.abg-add{margin-top:9px}
/* API 渠道页 · 渠道行（API别名 + 地址 + 密钥 + 测试/保存/删除） */
.ch-head,.mdl-head{display:flex;align-items:center;gap:9px;padding:0 11px 6px;font-size:11.5px;font-weight:600;color:var(--muted)}
.ch-head .abg-dot{flex:none}
.ch-h-name{flex:0 0 150px}
.ch-h-url{flex:1.4;min-width:150px}
.ch-h-key{flex:1.1;min-width:130px}
.ch-h-ops{flex:none}
/* 模型行列对齐（CSS Grid 固定轨道）：行内缺失/隐藏的单元格仍保留轨道宽度 → 所有行与表头严格纵向对齐
   定价选项（模式/统一价/固定秒数/分辨率档位价）收进行内「定价」按钮弹窗，行内只留摘要按钮
   上游成本不在此配置——由任务回传携带实际消耗写入账本 */
.mdl-row{display:grid;align-items:center;gap:7px;
  grid-template-columns:minmax(150px,1.5fr) minmax(96px,1fr) 64px minmax(190px,1.7fr) 82px 30px 58px 58px 30px;
  grid-template-areas:"model alias type price tag caps publish save del"}
.mdl-group-orphan .mdl-row{grid-template-columns:minmax(130px,1.3fr) minmax(84px,1fr) minmax(112px,1.1fr) 60px minmax(170px,1.5fr) 80px 30px 58px 58px 30px;
  grid-template-areas:"model alias ch type price tag caps publish save del"}
.mdl-row .mdl-model{grid-area:model}
.mdl-row .mdl-alias{grid-area:alias}
.mdl-row .mdl-channel{grid-area:ch}
.mdl-row .mdl-type{grid-area:type;width:100%}
.mdl-row .mdl-price-btn{grid-area:price}
.mdl-row .mdl-tag-input{grid-area:tag}
.mdl-row .aci-caps{grid-area:caps}
.mdl-row .mdl-publish-btn{grid-area:publish}
.mdl-row .mdl-save-btn{grid-area:save}
.mdl-publish-btn,.mdl-save-btn{height:30px;padding:0 8px;border-radius:8px;font-size:11px;white-space:nowrap;cursor:pointer;font-family:inherit;font-weight:600}
.mdl-publish-btn{border:1px solid rgba(16,185,129,.4);background:rgba(16,185,129,.1);color:#34d399}
.mdl-publish-btn:hover{background:rgba(16,185,129,.2);border-color:#34d399}
.mdl-publish-btn.off{border-color:rgba(148,163,184,.35);background:rgba(148,163,184,.08);color:#94a3b8}
.mdl-save-btn{border:1px solid rgba(139,92,246,.45);background:rgba(139,92,246,.12);color:#c4b5fd}
.mdl-save-btn:hover{background:rgba(139,92,246,.24);border-color:#a78bfa;color:#fff}
/* 表头与行共用同一套轨道（边框1px+内边距10px = 表头内边距11px，两边内容区同宽 → 轨道逐列对齐） */
.mdl-head{display:grid;align-items:center;gap:7px;
  grid-template-columns:minmax(150px,1.5fr) minmax(96px,1fr) 64px minmax(190px,1.7fr) 82px 30px 58px 58px 30px;
  grid-template-areas:"model alias type price tag caps publish save del"}
.mdl-group-orphan .mdl-head{grid-template-columns:minmax(130px,1.3fr) minmax(84px,1fr) minmax(112px,1.1fr) 60px minmax(170px,1.5fr) 80px 30px 58px 58px 30px;
  grid-template-areas:"model alias ch type price tag caps publish save del"}
.mdl-h-model{grid-area:model}
.mdl-h-alias{grid-area:alias}
.mdl-h-ch{grid-area:ch}
.mdl-h-type{grid-area:type}
.mdl-h-price{grid-area:price}
.mdl-h-tag{grid-area:tag}
/* 模型行 · 「定价」按钮：所有定价选项（计价模式/统一价/固定秒数/分辨率档位价）收进弹窗，行内只显示摘要 */
.mdl-price-btn{display:inline-flex;align-items:center;justify-content:flex-start;gap:6px;min-width:0;max-width:100%;height:31px;padding:0 10px;border-radius:8px;border:1px solid var(--line);background:var(--panel);color:var(--ink-2);font-size:12px;cursor:pointer;white-space:nowrap;transition:border-color .15s,color .15s;font-family:inherit}
.mdl-price-btn:hover{border-color:var(--violet);color:var(--ink)}
.mdl-price-btn svg{flex:none;width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.mdl-price-sum{overflow:hidden;text-overflow:ellipsis}
.mdl-price-btn.has-tiers{border-color:rgba(139,92,246,.55);color:var(--violet);background:rgba(139,92,246,.08)}

/* 「模型定价」弹窗：计价模式 + 统一价 + 固定秒数 + 分辨率档位独立价 */
.prc-row{display:grid;grid-template-columns:88px 1fr auto;align-items:center;gap:10px;margin-top:12px}
.prc-lbl{font-size:12.5px;font-weight:600;color:var(--ink-2)}
.prc-cost,.prc-secs{width:100%;height:36px;padding:0 12px;border-radius:9px;border:1px solid var(--line);background:#0c0c15;color:var(--ink);font-size:14px;font-family:inherit;outline:none;transition:border-color .15s}
.prc-cost:focus,.prc-secs:focus{border-color:var(--violet-600)}
.prc-cost::-webkit-outer-spin-button,.prc-cost::-webkit-inner-spin-button,.prc-secs::-webkit-outer-spin-button,.prc-secs::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.prc-cost,.prc-secs{-moz-appearance:textfield;appearance:textfield}
.prc-unit{font-size:12px;color:var(--muted);white-space:nowrap}
.prc-hint{grid-column:1 / -1;font-style:normal;font-size:11px;color:var(--muted)}
.prc-seg{display:flex;border:1px solid var(--line);border-radius:9px;overflow:hidden}
.prc-seg-btn{flex:1;height:34px;border:none;background:transparent;color:var(--muted);font-size:12.5px;font-weight:600;cursor:pointer;transition:.15s;font-family:inherit}
.prc-seg-btn:hover{color:var(--ink-2)}
.prc-seg-btn.on{background:linear-gradient(135deg,rgba(139,92,246,.85),rgba(217,70,239,.75));color:#fff}
.prc-seg-off{flex:1;display:inline-flex;align-items:center;justify-content:center;height:34px;background:rgba(255,255,255,.02);color:#4b4963;font-size:12px;cursor:not-allowed}
.prc-tiers{margin-top:16px;border:1px solid var(--line);border-radius:12px;padding:12px 14px;background:rgba(139,92,246,.04)}
.prc-tiers-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:8px}
.prc-tiers-head span{font-size:12.5px;font-weight:600;color:var(--ink)}
.prc-tiers-head em{font-style:normal;font-size:11px;color:var(--muted);text-align:right}
.prc-tier-list{display:flex;flex-direction:column;gap:6px;max-height:220px;overflow-y:auto}
.prc-tier{display:grid;grid-template-columns:20px 64px 1fr auto 22px;align-items:center;gap:8px;padding:4px 8px;border-radius:8px;font-size:12px;color:var(--muted);cursor:pointer;user-select:none;transition:.12s}
.prc-tier:hover{background:rgba(139,92,246,.12);color:var(--ink-2)}
.prc-tier.on{color:var(--ink)}
.prc-tier-check{opacity:0;font-size:12px;font-weight:700;color:var(--violet)}
.prc-tier.on .prc-tier-check{opacity:1}
.prc-tier-name{font-weight:600;white-space:nowrap}
.prc-tier-price{width:100%;height:28px;padding:0 8px;border-radius:6px;border:1px solid var(--line);background:var(--panel);color:var(--ink);font-size:12px;text-align:right;outline:none;transition:border-color .15s;font-family:inherit}
.prc-tier-price:focus{border-color:var(--violet)}
.prc-tier-price::-webkit-outer-spin-button,.prc-tier-price::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.prc-tier-price{-moz-appearance:textfield;appearance:textfield}
.prc-tier-unit{font-size:11px;color:var(--muted);white-space:nowrap}
.prc-tier-del{opacity:0;font-size:11px;color:#f87171;cursor:pointer;text-align:center;transition:opacity .12s}
.prc-tier:hover .prc-tier-del{opacity:.9}
.prc-tier-del:hover{opacity:1;text-shadow:0 0 6px rgba(248,113,113,.6)}
.prc-tier-add{display:flex;align-items:center;gap:8px;margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
.prc-tier-input{flex:1;min-width:0;height:30px;padding:0 10px;border-radius:8px;border:1px solid var(--line);background:var(--panel);color:var(--ink);font-size:12px;outline:none;transition:border-color .15s;font-family:inherit}
.prc-tier-input:focus{border-color:var(--violet)}
.prc-tier-addbtn{flex:none;height:30px;padding:0 14px;border-radius:8px;border:none;background:var(--violet);color:#fff;font-size:12px;font-weight:600;cursor:pointer;transition:.15s;font-family:inherit}
.prc-tier-addbtn:hover{filter:brightness(1.12)}
.prc-nores{margin-top:12px;font-size:12px;color:var(--muted)}
.mdl-row-special{border-color:rgba(245,158,11,.45);background:linear-gradient(90deg,rgba(245,158,11,.07),transparent 55%,transparent)}
/* 模型行 · 自定义标签输入（任意模型可设，与计费无关；火红色渐变胶囊，空=半透明白占位字） */
.mdl-tag-input{width:100%;height:27px;padding:0 4px;border-radius:6px;border:1px solid transparent;background:linear-gradient(135deg,#ff4500,#c1121f);box-shadow:0 1px 6px -1px rgba(220,20,20,.65);color:#fff;font-size:11px;font-weight:700;text-align:center;outline:none;transition:.15s;font-family:inherit}
.mdl-tag-input::placeholder{color:rgba(255,255,255,.62);font-weight:500;font-size:10.5px}
.mdl-tag-input:hover{filter:brightness(1.12)}
.mdl-tag-input:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,69,0,.4)}
.ch-row{display:flex;align-items:center;gap:9px;background:var(--panel);border:1px solid var(--line-2);border-radius:10px;padding:7px 10px}
.ch-row .abg-dot{flex:none}
.ch-name{flex:0 0 150px;height:31px;padding:0 10px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font-size:13px;outline:none;transition:.15s}
.ch-url{flex:1.4;min-width:150px;height:31px;padding:0 10px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font-size:12.5px;font-family:ui-monospace,Consolas,monospace;outline:none;transition:.15s}
.ch-key{flex:1.1;min-width:130px;height:31px;padding:0 10px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font-size:12.5px;font-family:ui-monospace,Consolas,monospace;outline:none;transition:.15s}
.ch-name:focus,.ch-url:focus,.ch-key:focus{border-color:var(--violet)}
.ch-name::placeholder,.ch-url::placeholder,.ch-key::placeholder{color:var(--muted);font-size:11.5px}
/* 模型行 · 渠道下拉 */
.abg-ch{flex:0 0 170px;height:31px;padding:0 7px;border-radius:8px;border:1px solid var(--line);background:var(--panel);color:var(--ink-2);font-size:12.5px;font-weight:600;outline:none;cursor:pointer;transition:.15s}
.abg-ch:hover{border-color:var(--violet)}
.aci-del{flex:none;width:30px;height:30px;border-radius:9px;border:1px solid var(--line);background:var(--panel);color:var(--muted);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:.15s}
.aci-del:hover{border-color:var(--rose);color:var(--rose);background:rgba(251,113,133,.1)}
.aci-del svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.admin-page .set-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:14px}

@media (max-width:900px){
  .admin-stats{grid-template-columns:repeat(2,1fr)}
  .admin-topbar-row{flex-direction:column;align-items:flex-start}
  .admin-topbar{padding:0 16px}
  .admin-sub{display:none}
  .admin-body{padding:16px 16px 48px}
}
.crop-tool-sep{width:1px;height:22px;background:rgba(255,255,255,.12);margin:0 4px}
.crop-tool-undo{color:#f5c66d}
.crop-brush-wrap{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 12px;border-radius:10px;border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.04)}
.crop-brush-label{font-size:12px;color:#9d9bba;white-space:nowrap}
.crop-brush-val{font-size:13px;font-weight:600;color:#e6e4f5;min-width:22px;text-align:center;font-variant-numeric:tabular-nums}
.crop-brush{-webkit-appearance:none;appearance:none;width:110px;height:4px;border-radius:2px;background:linear-gradient(90deg,#8b5cf6,#6366f1);outline:none;cursor:pointer}
.crop-brush::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:15px;height:15px;border-radius:50%;background:#fff;border:2px solid #8b5cf6;box-shadow:0 1px 4px rgba(0,0,0,.45);cursor:pointer}
.crop-img{display:block;max-width:82vw;max-height:66vh;width:auto;height:auto;user-select:none;-webkit-user-drag:none}
.b-crop-overlay{position:absolute;inset:0;z-index:2;cursor:crosshair;touch-action:none}
/* ===== 3D片场节点卡片（无操作台，整卡可点进入导演台） ===== */
.scene3d-preview{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;cursor:pointer;overflow:hidden;background:radial-gradient(ellipse at 50% 120%,rgba(45,212,191,.14),rgba(139,92,246,.10) 45%,rgba(10,10,18,.4) 75%);transition:filter .15s}
.scene3d-preview:hover{filter:brightness(1.18)}
.scene3d-preview:active{filter:brightness(.95)}
/* 透视地板网格 */
.s3d-floor{position:absolute;left:-30%;right:-30%;bottom:-8%;height:62%;background:linear-gradient(rgba(45,212,191,.55) 1px,transparent 1px),linear-gradient(90deg,rgba(45,212,191,.55) 1px,transparent 1px);background-size:36px 36px;transform:perspective(320px) rotateX(58deg);transform-origin:50% 0;mask:linear-gradient(180deg,transparent,#000 30%,#000 70%,transparent);-webkit-mask:linear-gradient(180deg,transparent,#000 30%,#000 70%,transparent);opacity:.5;pointer-events:none}
.s3d-cube{position:relative;width:54px;height:54px;border-radius:14px;background:linear-gradient(135deg,rgba(139,92,246,.35),rgba(45,212,191,.22));border:1px solid rgba(167,139,250,.55);display:flex;align-items:center;justify-content:center;box-shadow:0 8px 26px -6px rgba(139,92,246,.55),inset 0 0 18px rgba(139,92,246,.18)}
.s3d-cube svg{width:26px;height:26px;stroke:#c4b5fd;fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.s3d-name{position:relative;margin:0;max-width:82%;font-size:12.5px;font-weight:700;color:#e8e6f5;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 2px 10px rgba(0,0,0,.6)}
.s3d-cta{position:relative;display:inline-flex;align-items:center;gap:6px;padding:6px 16px;border-radius:999px;background:linear-gradient(135deg,#8b5cf6,#2dd4bf);color:#fff;font-size:11.5px;font-weight:700;letter-spacing:.5px;box-shadow:0 6px 18px -6px rgba(139,92,246,.7);transition:transform .15s}
.scene3d-preview:hover .s3d-cta{transform:translateY(-1px) scale(1.04)}
.s3d-cta svg{width:12px;height:12px;fill:currentColor;stroke:none}
/* ===== 3D片场 · AI 建场区（v292 测试） ===== */
.s3d-ai{padding:10px 12px 12px;display:flex;flex-direction:column;gap:8px}
.s3d-ai-input{width:100%;min-height:52px;max-height:130px;resize:vertical;background:rgba(10,10,20,.6);border:1px solid rgba(139,92,246,.35);border-radius:9px;color:#e8e6f5;font-size:12px;line-height:1.55;padding:8px 10px;box-sizing:border-box;font-family:inherit;outline:none}
.s3d-ai-input:focus{border-color:rgba(167,139,250,.75);box-shadow:0 0 0 2px rgba(139,92,246,.18)}
.s3d-ai-row{display:flex;gap:8px;align-items:stretch}
.s3d-ai-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 10px;border:none;border-radius:9px;background:linear-gradient(135deg,#8b5cf6,#2dd4bf);color:#fff;font-size:12px;font-weight:700;cursor:pointer;font-family:inherit;letter-spacing:.3px}
.s3d-ai-btn svg{width:13px;height:13px;stroke:#fff}
.s3d-ai-btn:hover{filter:brightness(1.12)}
.s3d-ai-btn.confirm{background:linear-gradient(135deg,#f59e0b,#ef4444)}
.s3d-enter2{padding:8px 12px;border-radius:9px;border:1px solid rgba(167,139,250,.4);background:rgba(139,92,246,.12);color:#c4b5fd;font-size:12px;font-weight:600;cursor:pointer;font-family:inherit;white-space:nowrap}
.s3d-enter2:hover{background:rgba(139,92,246,.22)}
.s3d-ai-busy{display:flex;align-items:center;gap:8px;color:#c4b5fd;font-size:12px;padding:6px 2px;line-height:1.5}
.s3d-ai-spin{width:14px;height:14px;border:2px solid rgba(167,139,250,.3);border-top-color:#a78bfa;border-radius:50%;animation:s3dspin .8s linear infinite;flex:none}
@keyframes s3dspin{to{transform:rotate(360deg)}}
.s3d-ai-err{color:#fb7185;font-size:11.5px;line-height:1.5;padding:2px 2px}
.s3d-config-btn{margin-left:6px;display:inline-block;padding:3px 10px;border-radius:7px;border:1px solid rgba(167,139,250,.45);background:rgba(139,92,246,.16);color:#c4b5fd;font-size:11.5px;font-weight:600;cursor:pointer;font-family:inherit;white-space:nowrap;vertical-align:middle}
.s3d-config-btn:hover{background:rgba(139,92,246,.3);color:#fff}
.s3d-ai-sum{display:flex;align-items:center;gap:8px;color:#5eead4;font-size:11.5px;flex-wrap:wrap}
.s3d-ai-restore{border:1px solid rgba(94,234,212,.4);background:rgba(94,234,212,.1);color:#5eead4;border-radius:7px;padding:2px 10px;font-size:11px;cursor:pointer;font-family:inherit}
.s3d-ai-restore:hover{background:rgba(94,234,212,.2)}
/* ===== 3D 导演台全屏覆盖层 ===== */
.dir3d-overlay{position:fixed;inset:0;z-index:9990;display:flex;flex-direction:column;background:#090909;animation:dir3dIn .18s ease}
@keyframes dir3dIn{from{opacity:0}to{opacity:1}}
.dir3d-top{flex:none;height:46px;display:flex;align-items:center;gap:12px;padding:0 12px;background:#0d0d16;border-bottom:1px solid rgba(139,92,246,.25)}
.dir3d-back{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:9px;background:rgba(139,92,246,.18);border:1px solid rgba(139,92,246,.4);color:#d6c8ff;font-size:12.5px;font-weight:600;cursor:pointer;transition:.15s}
.dir3d-back:hover{background:rgba(139,92,246,.32);color:#fff}
.dir3d-back svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.dir3d-title{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:#9a9ab8;font-weight:600;letter-spacing:.4px}
.dir3d-title svg{width:15px;height:15px;stroke:#a78bfa;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.dir3d-close{margin-left:auto;width:34px;height:34px;border-radius:9px;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);color:#e6e4f5;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:.15s;padding:0}
.dir3d-close:hover{background:rgba(251,113,133,.25);border-color:rgba(251,113,133,.5);color:#fff}
.dir3d-close svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.dir3d-body{flex:1;position:relative;min-height:0}
.dir3d-body iframe{position:absolute;inset:0;width:100%;height:100%;border:0;background:#090909}
.dir3d-loading{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;background:#090909;pointer-events:none}
.dir3d-loading p{margin:0;font-size:13px;color:#8e8ea2}
.dir3d-spin{width:38px;height:38px;border-radius:50%;border:3px solid rgba(139,92,246,.2);border-top-color:#a78bfa;animation:dir3dSpin .8s linear infinite}
@keyframes dir3dSpin{to{transform:rotate(360deg)}}
/* ===== 3D 导演台双页签（3D 操作 / AI 操作台）+ AI 建模面板 ===== */
.dir3d-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dir3d-tabs{display:flex;gap:6px;align-items:center;flex:none}
.dir3d-tab{padding:6px 14px;border-radius:9px;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);color:#9a9ab8;font-size:12px;font-weight:600;cursor:pointer;font-family:inherit;transition:.15s;line-height:1.4}
.dir3d-tab:hover{color:#e6e4f5;background:rgba(255,255,255,.1)}
.dir3d-tab.active{background:linear-gradient(135deg,#8b5cf6,#2dd4bf);color:#fff;border-color:transparent}
.dir3d-close{margin-left:12px}
.dir3d-pane{position:absolute;inset:0;display:none}
.dir3d-pane.active{display:block}
.ai-panel{position:absolute;inset:0;overflow:auto;padding:26px;box-sizing:border-box;background:radial-gradient(ellipse at 50% 0%,rgba(139,92,246,.14),rgba(10,10,20,.45) 62%);display:flex;flex-direction:column;gap:14px}
.ai-panel-head h3{display:flex;align-items:center;gap:8px;margin:0 0 8px;font-size:15px;color:#e8e6f5}
.ai-panel-head h3 svg{width:16px;height:16px;stroke:#a78bfa;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ai-panel-head p{margin:0;font-size:12.5px;color:#9a9ab8;line-height:1.6;max-width:600px}
.ai-mode-tabs{display:flex;gap:8px;background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.18);border-radius:12px;padding:5px}
.ai-mode-tab{flex:1;display:flex;flex-direction:column;gap:2px;align-items:flex-start;padding:9px 13px;border-radius:9px;border:1px solid transparent;background:transparent;color:#9a9ab8;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;transition:.15s;text-align:left}
.ai-mode-tab em{font-style:normal;font-size:10.5px;font-weight:400;color:#7c7c99}
.ai-mode-tab:hover{background:rgba(139,92,246,.12);color:#c9c7e0}
.ai-mode-tab.active{background:linear-gradient(135deg,rgba(139,92,246,.34),rgba(99,102,241,.3));border-color:rgba(167,139,250,.5);color:#fff}
.ai-mode-tab.active em{color:#c4b5fd}
.ai-ratio-row{display:flex;align-items:center;gap:10px;margin-top:10px;flex-wrap:wrap}
.ai-ratio-label{flex:none;font-size:12px;font-weight:600;color:#9a9ab8}
.ai-ratio-chips{display:flex;flex-wrap:wrap;gap:6px}
.ai-ratio-chip{flex:none;padding:5px 11px;border-radius:8px;border:1px solid rgba(139,92,246,.28);background:rgba(255,255,255,.04);color:#9a9ab8;font-size:12px;font-weight:600;cursor:pointer;font-family:inherit;transition:.15s}
.ai-ratio-chip:hover{background:rgba(139,92,246,.14);color:#c9c7e0}
.ai-ratio-chip.active{background:linear-gradient(135deg,rgba(139,92,246,.4),rgba(45,212,191,.34));border-color:rgba(167,139,250,.6);color:#fff}
.ai-hist-list{display:flex;flex-direction:column;gap:12px;margin-top:6px;max-height:420px;overflow:auto}
.ai-ana-meta{font-size:12px;font-weight:600;color:#c4b5fd;margin-left:8px}
.ai-ana-close{flex:none;margin-left:auto;width:22px;height:22px;line-height:20px;text-align:center;border-radius:6px;border:1px solid rgba(239,68,68,.4);background:rgba(239,68,68,.12);color:#fca5a5;font-size:13px;cursor:pointer;font-family:inherit}
.ai-ana-close:hover{background:rgba(239,68,68,.26);color:#fff}
.ai-panel .s3d-ai-input{min-height:120px;max-height:280px;font-size:13px}
.ai-panel-row{display:flex;gap:10px;align-items:center}
.ai-panel .s3d-ai-btn{flex:none;min-width:170px;padding:11px 22px}
.ai-panel .s3d-chat{flex:1;min-height:0;display:flex;flex-direction:column}
.s3d-chat-input .s3d-enter2{flex:none;height:38px;display:inline-flex;align-items:center;box-sizing:border-box}
.s3d-chat-head{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:700;color:#e8e6f5;margin-bottom:10px}
.s3d-chat-head svg{width:15px;height:15px;stroke:#2dd4bf}
.s3d-chat-head-tip{margin-left:auto;font-size:11px;font-weight:500;color:#7c7c96}
.s3d-chat-msgs{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:10px;padding:6px 4px;scrollbar-width:thin;scrollbar-color:rgba(139,92,246,.4) transparent}
.s3d-chat-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;flex:1;color:#6f6f8a;text-align:center;padding:24px 0}
.s3d-chat-empty-ico{width:48px;height:48px}
.s3d-chat-empty-ico svg{width:48px;height:48px;stroke:#7a5cff;fill:none;stroke-width:1.6}
.s3d-chat-empty p{margin:0;font-size:15px}
.s3d-chat-empty .s3d-chat-empty-sub{font-size:13.5px;color:#7c7c96;line-height:1.7}
.s3d-chat-msg{display:flex;gap:10px;max-width:92%;animation:s3dmsg .18s ease}
.s3d-chat-msg.user{align-self:flex-end;flex-direction:row-reverse}
.s3d-chat-msg.ai{align-self:flex-start}
.s3d-chat-ava{flex:none;width:32px;height:32px;border-radius:9px;background:linear-gradient(135deg,#8b5cf6,#2dd4bf);display:flex;align-items:center;justify-content:center}
.s3d-chat-ava svg{width:18px;height:18px;stroke:#fff;fill:none;stroke-width:2}
.s3d-chat-bubble{padding:12px 16px;border-radius:14px;font-size:15px;line-height:1.6;white-space:pre-wrap;word-break:break-word}
.s3d-chat-msg.user .s3d-chat-bubble{background:linear-gradient(135deg,#8b5cf6,#6d28d9);color:#fff;border-bottom-right-radius:4px}
.s3d-chat-msg.ai .s3d-chat-bubble{background:rgba(255,255,255,.07);color:#e6e4f5;border-bottom-left-radius:4px}
.s3d-chat-typing{display:inline-flex;gap:4px;align-items:center;padding:2px 0}
.s3d-chat-typing i{width:6px;height:6px;border-radius:50%;background:#a5a3c4;animation:s3dbounce 1.2s infinite}
.s3d-chat-typing i:nth-child(2){animation-delay:.15s}
.s3d-chat-typing i:nth-child(3){animation-delay:.3s}
@keyframes s3dbounce{0%,60%,100%{transform:translateY(0);opacity:.5}30%{transform:translateY(-4px);opacity:1}}
@keyframes s3dmsg{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
.s3d-chat-input{flex:none;display:flex;flex-direction:column;gap:8px;margin-top:auto;padding:12px;background:rgba(16,14,30,.66);border:1px solid rgba(139,92,246,.28);border-radius:16px;box-sizing:border-box}
.s3d-chat-input textarea{width:100%;resize:none;background:transparent;border:none;color:#e8e6f5;font-size:15px;line-height:1.6;padding:6px 6px;min-height:64px;max-height:180px;box-sizing:border-box;font-family:inherit;outline:none}
.s3d-chat-input textarea::placeholder{color:#6f6f8a}
.s3d-input-toolbar{flex:none;display:flex;align-items:center;gap:8px}
.ai-mode-icos{flex:none;display:flex;gap:6px}
.ai-mode-ico{flex:none;display:inline-flex;align-items:center;gap:6px;padding:8px 12px;border-radius:9px;border:1px solid rgba(139,92,246,.25);background:rgba(139,92,246,.06);color:#9a9ab8;font-size:12px;font-weight:600;cursor:pointer;font-family:inherit;transition:.15s;white-space:nowrap}
.ai-mode-ico svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ai-mode-ico:hover{background:rgba(139,92,246,.14);color:#c9c7e0}
.ai-mode-ico.active{background:linear-gradient(135deg,rgba(139,92,246,.45),rgba(45,212,191,.4));border-color:rgba(167,139,250,.6);color:#fff}
.s3d-input-ctrls{flex:none;display:flex;align-items:center;gap:7px;margin-left:auto}
.ai-sel{flex:none;height:34px;padding:0 8px;border-radius:9px;border:1px solid rgba(139,92,246,.28);background:rgba(10,10,20,.6);color:#c9c7e0;font-size:12px;font-weight:600;cursor:pointer;font-family:inherit;max-width:150px;outline:none}
.ai-sel:hover{border-color:rgba(167,139,250,.55)}
.ai-sel:focus{border-color:rgba(167,139,250,.75)}
.ai-sel option{background:#12101e;color:#e6e4f5}
/* 发送按钮：默认纯图标 44px；带积分价格时自适应加宽（✦N 复用 nop-gen-credit 样式） */
.s3d-chat-send{flex:none;width:auto;min-width:44px;height:44px;padding:0 13px;gap:7px;border-radius:11px;border:none;background:linear-gradient(135deg,#8b5cf6,#2dd4bf);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer}
.s3d-chat-send svg{width:19px;height:19px;stroke:#fff;fill:none;stroke-width:2;flex:none}
.s3d-chat-send:hover{filter:brightness(1.12)}
.s3d-chat-send:disabled{opacity:.5;cursor:not-allowed}
.s3d-chat-choice{margin-top:10px;display:flex}
.s3d-chat-choice-row{display:flex;gap:10px;flex-wrap:wrap}
.s3d-choice-btn{flex:none;display:inline-flex;align-items:center;gap:7px;padding:11px 20px;border-radius:11px;font-size:14px;font-weight:600;cursor:pointer;font-family:inherit;border:none}
.s3d-choice-btn.primary{background:linear-gradient(135deg,#8b5cf6,#6d28d9);color:#fff}
.s3d-choice-btn:not(.primary){background:rgba(255,255,255,.08);color:#e6e4f5;border:1px solid rgba(139,92,246,.35)}
.s3d-choice-btn svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:2}
.s3d-choice-btn:hover{filter:brightness(1.12)}
/* ===== AI 布景分析确认卡 ===== */
.ai-ana{display:flex;flex-direction:column;gap:12px;background:rgba(16,14,30,.72);border:1px solid rgba(139,92,246,.35);border-radius:14px;padding:16px;backdrop-filter:blur(6px)}
.ai-ana-head{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700;color:#e8e6f5;flex-wrap:wrap}
.ai-ana-head svg{width:17px;height:17px;stroke:#a78bfa;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ai-ana-cost{margin-left:auto;font-size:11.5px;font-weight:600;color:#fbbf24;background:rgba(251,191,36,.12);border:1px solid rgba(251,191,36,.32);padding:3px 10px;border-radius:999px;white-space:nowrap}
.ai-ana-sec{border-top:1px solid rgba(139,92,246,.16);padding-top:10px}
.ai-ana-sec h4{margin:0 0 8px;font-size:12.5px;font-weight:700;color:#c4b5fd;letter-spacing:.3px}
.ai-ana-row{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:12.5px;color:#c9c7e0;padding:7px 9px;margin:0 0 6px;background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.14);border-radius:9px}
.ai-ana-row:last-child{margin-bottom:0}
.ai-ana-row strong{color:#e8e6f5;font-weight:700}
.ai-ana-tag{flex:none;font-size:10.5px;font-weight:700;color:#a78bfa;background:rgba(139,92,246,.16);border:1px solid rgba(139,92,246,.3);padding:2px 7px;border-radius:6px}
.ai-ana-cell{color:#9a9ab8}
.ai-ana-sec-sub{margin-left:8px;font-size:10.5px;font-weight:400;color:#7c7c99;letter-spacing:0}
.ai-ana-del{flex:none;margin-left:auto;width:20px;height:20px;line-height:18px;text-align:center;border-radius:6px;border:1px solid rgba(239,68,68,.4);background:rgba(239,68,68,.12);color:#fca5a5;font-size:12px;cursor:pointer;font-family:inherit}
.ai-ana-del:hover{background:rgba(239,68,68,.26);color:#fff}
.ai-ana-empty{font-size:12px;color:#6f6f8a;padding:4px 2px}
.ai-ana-actions{display:flex;gap:10px;margin-top:4px;flex-wrap:wrap}
.s3d-confirm-build{flex:none;display:inline-flex;align-items:center;gap:7px;padding:11px 18px;border-radius:11px;font-size:13.5px;font-weight:700;cursor:pointer;font-family:inherit;border:none;background:linear-gradient(135deg,#8b5cf6,#2dd4bf);color:#fff}
.s3d-confirm-build svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.s3d-confirm-build:hover{filter:brightness(1.12)}
.s3d-reanalyze{flex:none;display:inline-flex;align-items:center;gap:7px;padding:11px 18px;border-radius:11px;font-size:13.5px;font-weight:600;cursor:pointer;font-family:inherit;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.06);color:#c9c7e0}
.s3d-reanalyze svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.s3d-reanalyze:hover{border-color:rgba(251,113,133,.5);color:#fb7185;background:rgba(251,113,133,.1)}
/* ===== 镜头视频询问弹窗 ===== */
.ai-video-ask{display:flex;flex-direction:column;gap:10px;min-width:min(420px,80vw)}
.ai-video-ask p{margin:0;font-size:13px;color:#9a9ab8;line-height:1.6}
.ai-video-moves{background:rgba(139,92,246,.1);border:1px solid rgba(139,92,246,.26);border-radius:10px;padding:10px 12px;color:#c4b5fd;font-size:12.5px;line-height:1.6}
.ai-video-cost{color:#fbbf24;font-weight:600}
.ai-video-actions{display:flex;gap:10px;margin-top:6px}
.b-crop-sel{position:absolute;box-sizing:border-box;border:1.5px solid #a78bfa;box-shadow:0 0 0 9999px rgba(0,0,0,.5);cursor:move;background:transparent}
.b-crop-h{position:absolute;width:12px;height:12px;border-radius:3px;background:#fff;border:2px solid #8b5cf6;box-shadow:0 1px 4px rgba(0,0,0,.5);box-sizing:border-box;padding:0}
.b-crop-h[data-h="nw"]{left:-7px;top:-7px;cursor:nwse-resize}
.b-crop-h[data-h="n"]{left:50%;top:-7px;margin-left:-6px;cursor:ns-resize}
.b-crop-h[data-h="ne"]{right:-7px;top:-7px;cursor:nesw-resize}
.b-crop-h[data-h="e"]{right:-7px;top:50%;margin-top:-6px;cursor:ew-resize}
.b-crop-h[data-h="w"]{left:-7px;top:50%;margin-top:-6px;cursor:ew-resize}
.b-crop-h[data-h="sw"]{left:-7px;bottom:-7px;cursor:nesw-resize}
.b-crop-h[data-h="s"]{left:50%;bottom:-7px;margin-left:-6px;cursor:ns-resize}
.b-crop-h[data-h="se"]{right:-7px;bottom:-7px;cursor:nwse-resize}
.crop-foot{flex:none;position:relative;z-index:30;display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 18px;border-top:1px solid rgba(255,255,255,.07)}
.crop-save,.crop-cancel{display:inline-flex;align-items:center;gap:9px;height:44px;padding:0 24px;border-radius:12px;font-size:15px;font-weight:600;cursor:pointer;color:#fff;transition:filter .15s,background .15s,border-color .15s}
.crop-save{background:linear-gradient(135deg,#8b5cf6,#6366f1);border:1px solid transparent}
.crop-save:hover{filter:brightness(1.12)}
.crop-cancel{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.15)}
.crop-cancel:hover{background:rgba(239,68,68,.5);border-color:rgba(239,68,68,.75)}
.crop-save svg,.crop-cancel svg{width:19px;height:19px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

/* ===== 图片/视频 中屏放大预览 ===== */
.node-zoom-mask{position:fixed;inset:0;z-index:10000;background:rgba(5,5,10,.72);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;padding:6vh 10vw;animation:nzFade .18s ease}
@keyframes nzFade{from{opacity:0}to{opacity:1}}
.node-zoom-box{position:relative;max-width:72vw;max-height:78vh;border-radius:10px;overflow:hidden;background:#0a0a14;border:1px solid rgba(139,92,246,.4);box-shadow:0 24px 70px -16px rgba(0,0,0,.85),0 0 0 1px rgba(139,92,246,.2);animation:nzPop .2s cubic-bezier(.2,.9,.3,1.2)}
@keyframes nzPop{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}
.node-zoom-box img{display:block;max-width:72vw;max-height:78vh;width:auto;height:auto;object-fit:contain}
.node-zoom-box video{display:block;max-width:72vw;max-height:78vh;width:auto;height:auto;background:#000}
.nz-close{position:absolute;top:10px;right:10px;width:34px;height:34px;border-radius:9px;border:1px solid rgba(255,255,255,.16);background:rgba(15,15,24,.6);backdrop-filter:blur(6px);color:#e6e4f5;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:2;padding:0;transition:background .15s,color .15s}
.nz-close:hover{background:rgba(139,92,246,.6);border-color:rgba(139,92,246,.8);color:#fff}
.nz-close svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round}

/* 画布节点统一蓝色高亮：边框亮蓝 + 外发光；背景纯色不透明（文字对比度更硬，观感更清晰） */
.board-viewport .b-node{border-color:rgba(96,165,250,.6)!important;box-shadow:0 0 18px -2px rgba(59,130,246,.5)!important}
.board-viewport .b-node.link-target{border-color:rgba(125,211,252,.9)!important;box-shadow:0 0 0 2px rgba(56,189,248,.3),0 0 26px -4px rgba(56,189,248,.65)!important}
.board-viewport .node-op-inner{border-color:rgba(255,255,255,.16)!important;box-shadow:0 12px 36px -10px rgba(0,0,0,.65)!important}
.board-viewport .node-op::before{background:rgba(255,255,255,.24)!important;box-shadow:none!important}
.board-viewport .nop-chat-input-box{border-color:rgba(255,255,255,.16)!important}
.board-viewport .nop-chat-input-box:focus-within{border-color:rgba(255,255,255,.22)!important}
.board-viewport .marquee-box{border-color:rgba(255,255,255,.42)!important;background:rgba(255,255,255,.04)!important}
.board-viewport .multi-selection-box{border-color:rgba(255,255,255,.38)!important;background:rgba(255,255,255,.03)!important}
.board-viewport .msb-port{background:#555b68!important;border-color:#171923!important;box-shadow:0 2px 10px rgba(0,0,0,.55)!important}
.board-viewport .msb-count{background:#4b505c!important;box-shadow:0 2px 8px rgba(0,0,0,.3)!important}

/* 画布与箭头统一为中性灰：保持方向和流动，仅统一视觉颜色 */
.board-viewport{background-color:#111318!important;background-image:radial-gradient(circle,rgba(156,163,175,.28) 1px,transparent 1px)!important}
.board-viewport .edge-path{stroke:rgba(156,163,175,.62)!important;filter:none!important}
.board-viewport .edge-hit:hover ~ .edge-path{stroke:#c4c9d1!important;filter:none!important}
.board-viewport .edge-g.sel .edge-path{stroke:#e5e7eb!important;filter:drop-shadow(0 0 4px rgba(229,231,235,.35))!important}
.board-viewport .edge-g.flowing .edge-path{stroke:#b8bec8!important;filter:drop-shadow(0 0 4px rgba(184,190,200,.4))!important}
.board-viewport .link-temp{stroke:#b8bec8!important}
.board-viewport .b-port{background:#8b929e!important;border-color:#1a1d24!important;box-shadow:0 0 8px rgba(156,163,175,.35)!important}
.board-viewport .b-port.near,.board-viewport .b-port.hot,.board-viewport .b-port.linking-port{background:#c4c9d1!important;box-shadow:0 0 0 5px rgba(196,201,209,.18),0 0 14px rgba(196,201,209,.55)!important}
.board-viewport .multi-selection-box{border-color:rgba(196,201,209,.5)!important;background:rgba(196,201,209,.04)!important}
.board-viewport .msb-port{background:#8b929e!important;box-shadow:0 2px 10px rgba(0,0,0,.5)!important}

/* ===== 设置-提示词规则：类型 tab + 规则列表管理 ===== */
.tr-tabs{display:flex;gap:8px;margin:10px 0 12px;flex-wrap:wrap}
.tr-tab{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border-radius:99px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);color:var(--ink,#e6e6f2);font-size:13px;font-weight:600;cursor:pointer;transition:.18s}
.tr-tab svg{width:15px;height:15px}
.tr-tab:hover{border-color:var(--violet);color:var(--violet)}
.tr-tab.on{border-color:var(--violet);background:rgba(139,92,246,.16);color:var(--violet);box-shadow:0 0 12px rgba(139,92,246,.18)}
.tr-list{display:flex;flex-direction:column;gap:8px}
.tr-row{border:1px solid rgba(255,255,255,.09);border-radius:12px;padding:10px 12px;background:rgba(255,255,255,.03);transition:.18s}
.tr-row:hover{border-color:rgba(139,92,246,.35)}
.tr-row-main{display:flex;align-items:center;gap:10px;min-width:0}
.tr-name{font-size:13px;font-weight:700;color:var(--ink,#e6e6f2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px;flex:none}
.tr-preview{font-size:11.5px;color:#8b89a3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}
.tr-row-btns{display:flex;gap:6px;margin-left:auto;flex:none}
.tr-row-btns .btn{padding:5px 10px;font-size:11.5px;border-radius:8px}
.tr-del:hover{color:#f87171!important;border-color:rgba(248,113,113,.45)!important}
.tr-editor{display:flex;flex-direction:column;gap:8px;margin-top:10px;padding-top:10px;border-top:1px dashed rgba(255,255,255,.12)}
.tr-editor .tr-name-input{font-weight:600}
.tr-editor-btns{display:flex;gap:8px;justify-content:flex-end}
.tr-empty{padding:18px;text-align:center;color:#8b89a3;font-size:12.5px;border:1px dashed rgba(255,255,255,.12);border-radius:12px}
.tr-add-row{margin-top:10px}
.tr-add-row .btn+.btn{margin-left:8px}
/* 分区标题：全局规则（上）与我的规则（下） */
.tr-sec-h{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:700;color:#b9b7d0;padding:2px 2px 0;letter-spacing:.5px}
.tr-sec-h svg{width:13px;height:13px;flex:none;stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.tr-sec-h em{font-style:normal;font-weight:500;font-size:10.5px;color:#7c7a96;margin-left:4px;letter-spacing:0}
.tr-sec-h.tr-sec-mine{margin-top:6px}
.tr-row-global{border-color:rgba(56,189,248,.25);background:rgba(56,189,248,.06)}
.tr-row-global:hover{border-color:rgba(56,189,248,.45)}
.tr-row-global .tr-name{color:#7dd3fc}
/* 节点芯片/下拉里的「全局」小标签 */
.nop-agent-global{font-style:normal;font-size:9.5px;line-height:1;padding:2.5px 5px;border-radius:5px;background:rgba(56,189,248,.18);color:#7dd3fc;flex:none;margin-left:3px;font-weight:600}

/* ===== 画布工具栏：提示词规则固定尺寸大面板 ===== */
.rules-pop{background:#191927;border:1px solid rgba(255,255,255,.12);border-radius:16px;box-shadow:0 24px 80px -12px rgba(0,0,0,.7);padding:18px;display:flex;flex-direction:column;overflow:hidden}
.rules-pop .tr-list{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding-right:2px}
.rules-pop .tr-add-row{flex:none;margin-top:12px}
.rules-pop-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.rules-pop-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:700;color:var(--ink,#e6e6f2)}
.rules-pop-title svg{width:14px;height:14px;color:var(--violet);stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.rules-pop-x{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;background:transparent;border:none;color:#8b89a3;cursor:pointer;transition:.15s}
.rules-pop-x svg{width:14px;height:14px}
.rules-pop-x:hover{background:rgba(255,255,255,.08);color:#f87171}
.rules-pop .tr-tabs{margin:0 0 10px}
.rules-pop-tip{margin:0 0 14px;font-size:11.5px;color:#8b89a3;line-height:1.5;flex:none}
/* 规则内容输入框：固定尺寸，禁止拖拽伸缩；旁边放大按钮 */
.tr-content-row{position:relative;display:flex;align-items:stretch;gap:6px}
.tr-content-row .tr-content-input{flex:1;min-height:140px!important;max-height:140px;resize:none;overflow-y:auto}
.tr-zoom{flex:none;align-self:flex-end}
.rules-pop .tr-name-input{max-width:280px}
/* 放大查看大窗：固定尺寸不可伸缩 */
.rule-zoom-mask{position:fixed;inset:0;background:rgba(0,0,0,.55);display:flex;align-items:center;justify-content:center;z-index:10000}
.rule-zoom{width:720px;height:560px;background:#191927;border:1px solid rgba(255,255,255,.14);border-radius:16px;box-shadow:0 24px 80px -12px rgba(0,0,0,.8);display:flex;flex-direction:column;padding:16px;gap:12px}
.rule-zoom-h{display:flex;align-items:center;justify-content:space-between}
.rule-zoom-title{display:flex;align-items:center;gap:6px;font-size:13.5px;font-weight:700;color:var(--ink,#e6e6f2)}
.rule-zoom-title svg{width:14px;height:14px;color:var(--violet);stroke:currentColor;fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.rule-zoom-ta{flex:1;resize:none!important;line-height:1.65;font-size:13px}
.rule-zoom-btns{display:flex;gap:8px;justify-content:flex-end}

/* ===== AI 超分按钮（本地 RealESRGAN x4）：顶栏图标按钮同款交互，紫色高亮区分 ===== */
.bn-sr{flex:none;width:40px;height:40px;border-radius:11px;border:1px solid rgba(139,92,246,.5);background:rgba(139,92,246,.16);color:#c4b5fd;display:flex;align-items:center;justify-content:center;padding:0;cursor:pointer;opacity:0;pointer-events:none;transform:translateY(3px);transition:opacity .18s ease,transform .18s ease,background .18s ease,color .18s ease,border-color .18s ease}
.b-node.sel .bn-sr{opacity:1;pointer-events:auto;transform:translateY(0)}
.b-node .bn-sr:hover{background:rgba(139,92,246,.5);border-color:rgba(139,92,246,.85);color:#fff}
.bn-sr svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.bn-sr.is-busy{width:auto;min-width:104px;padding:0 10px;gap:6px;border-radius:10px;white-space:nowrap;cursor:default}
.bn-sr.is-busy span{font-size:12px;line-height:1;font-weight:600}
.bn-sr.is-busy svg{width:15px;height:15px;animation:bnSrSpin 1s linear infinite}
@keyframes bnSrSpin{to{transform:rotate(360deg)}}
.bn-wm{flex:none;width:auto;min-width:84px;height:40px;border-radius:10px;border:1px solid rgba(245,158,11,.55);background:rgba(245,158,11,.16);color:#ffd27a;display:flex;align-items:center;justify-content:center;gap:5px;padding:0 10px;cursor:pointer;opacity:0;pointer-events:none;transform:translateY(3px);transition:opacity .18s ease,transform .18s ease,background .18s ease,color .18s ease,border-color .18s ease;white-space:nowrap}
.b-node.sel .bn-wm{opacity:1;pointer-events:auto;transform:translateY(0)}
.b-node .bn-wm:hover{background:rgba(245,158,11,.5);border-color:rgba(245,158,11,.85);color:#fff}
.bn-wm svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.bn-wm span{font-size:13px;line-height:1;font-weight:600;display:inline-flex;align-items:center;gap:3px}
.bn-wm b{font-style:normal;font-weight:700;color:#ffd27a}
.bn-wm.is-busy{min-width:104px;gap:6px;cursor:default}
.bn-wm.is-busy span{font-size:12px;line-height:1;font-weight:600}
.bn-wm.is-busy svg{width:15px;height:15px;animation:bnSrSpin 1s linear infinite}

/* ===== v383 任务详情·耗时时间轴 ===== */
.td-timeline{display:flex;flex-direction:column;gap:7px;padding:6px 2px}
.td-tl-row{display:flex;align-items:center;gap:10px}
.td-tl-stage{flex:0 0 150px;font-size:12px;color:#cfd3dc;line-height:1.35}
.td-tl-stage em{display:block;font-style:normal;font-size:10px;color:#7a8291}
.td-tl-bar{flex:1;height:10px;background:rgba(255,255,255,.08);border-radius:5px;overflow:hidden;min-width:60px}
.td-tl-bar i{display:block;height:100%;background:linear-gradient(90deg,#7c3aed,#4f46e5);border-radius:5px;transition:width .3s}
.td-tl-ms{flex:0 0 78px;text-align:right;font-size:12px;font-weight:600;color:#e8eaf0;font-variant-numeric:tabular-nums;white-space:nowrap}
.td-tl-row.bn .td-tl-bar i{background:linear-gradient(90deg,#e67e22,#d64545)}
.td-tl-row.bn .td-tl-stage,.td-tl-row.bn .td-tl-ms{color:#f0a35e}
.td-tl-row.total{border-top:1px dashed rgba(255,255,255,.15);padding-top:7px;margin-top:2px}
.td-tl-row.total .td-tl-bar{display:none}
.td-tl-row.total .td-tl-ms{flex:1;text-align:right;font-size:13px}
.td-tl-row.total .td-tl-stage{color:#fff;font-weight:700}

/* v458 扣费等待反馈：consume 网络耗时期间生成按钮禁用半透明，防急点复点 */
.nop-chat-gen.paying{opacity:.55;pointer-events:none;filter:grayscale(.4)}
