  /* ---- v189：拖「＋」选择窗（画布内嵌，跟随平移缩放） + 功能节点面板卡 ---- */
  /* v191：选择窗 UI 参考截图重做 —— 深色圆角面板、小灰字标题、每行「图标 + 文字」；
     颜色全走 var()（两主题自动适配），旧的 plus-win 深色镜像条值与 var 同值，保留不冲突 */
  /* v241：窗口加宽一点（176 → 200）+ 文字放大（标题 12→13、选项 13.5→15、图标 17→18）；v325 再放大一档（窗 248→300、标题 15→17、选项 18→20、图标 22→24），且窗口不再跟随画布缩放 */
  .plus-win189{position:absolute;z-index:34;transform-origin:0 0;min-width:260px;background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:0 12px 34px rgba(10,12,20,.22);padding:12px;user-select:none}
  .plus-win189[hidden]{display:none}
  .plus-win-head189{display:flex;align-items:center;justify-content:space-between;font:500 17px/1 var(--sans);color:var(--text-3);padding:6px 8px 12px;cursor:move}
  .plus-win-x189{border:0;background:none;color:var(--text-3);cursor:pointer;font-size:17px;line-height:1;padding:2px 6px;border-radius:6px}
  .plus-win-x189:hover{color:var(--text)}
    /* v270：整窗文字放大一档，窗口跟着加大（min-width 248 / 选项 18 / 图标 22）；v325：窗 300 / 选项 20 / 图标 24，且不再跟随画布缩放 */
  .plus-opt189{display:flex;align-items:center;gap:16px;width:100%;text-align:left;border:0;background:none;font:500 20px/1 var(--sans);color:var(--text);padding:15px 14px;border-radius:9px;cursor:pointer}
  .plus-opt189 svg{width:24px;height:24px;flex:none;color:var(--text-3)}
  /* v328：行间距 +8px（用户口径「减小宽度，增加行间距（对应适配高度调整）」——
     窗子没有固定高，选项行距拉开后高度自然长出来；宽度 300 -> 260 同口径） */
  .plus-opt189 + .plus-opt189{margin-top:8px}
  .plus-opt189:hover{background:var(--sunken)}
  .plus-opt189:hover svg{color:var(--accent)}
  /* v346：「实体节点」母选项 + 悬浮子列表（角色 / 怪物 / NPC / 道具 · 图标 / 地图）整块退役
     —— 三档平铺进「添加节点」窗，与四类功能节点同一行样式（见上面 .plus-opt189）。 */
  /* v192：模式键被功能节点藏掉时必须真消失 —— .mode-switch button 自带 display:inline-flex，会盖掉 [hidden] */
  .mode-switch button[hidden]{display:none!important}

  .prow189 .sel,.prow189 textarea{flex:1;min-width:0}
  .prow189 textarea{resize:vertical;font:inherit;color:var(--text)}
  #typedHint189{margin:0 0 10px;padding:9px 12px;border:1px dashed var(--line);border-radius:8px;font:500 12px/1.5 var(--sans);color:var(--dim)}
  #typedHint189[hidden]{display:none}
  .sheet[data-node189="gen"] .sheet-cols > .card:not(#cardGen189){display:none}
  .sheet[data-node189="vgen"] .sheet-cols > .card:not(#cardVgen189){display:none}
  .sheet[data-node189="vframes"] .sheet-cols > .card:not(#cardFrames){display:none}
  .sheet[data-mixed189="1"] .sheet-body > *:not(#typedHint189){display:none!important}
  html[data-theme="dark"] .plus-win189{background:#191c24;border-color:#262a35;box-shadow:0 10px 30px rgba(0,0,0,.5)}
  html[data-theme="dark"] .plus-win-head189{color:#8b91a3}
  html[data-theme="dark"] .plus-win-x189{color:#8b91a3}
  html[data-theme="dark"] .plus-win-x189:hover{color:#e8eaf1}
  html[data-theme="dark"] .plus-opt189{color:#e8eaf1}
  html[data-theme="dark"] .plus-opt189:hover{background:#262a35;border-color:#323748}

  /* v225：提示词区贴近卡底、弱描边（参考图的无框输入观感） */
  html[data-theme="dark"] .prow189 textarea{color:#e8eaf1;background:#1b1d24;border-color:#21232b;border-radius:10px}
  /* v230：vgen 卡即梦式布局 —— 大提示词区无框无标签；底部一排 = 文字式参数下拉 + 生成钮 */
  /* v246：gen 卡提示词并入 vgen 同款（原只 scope 到 #cardVgen189，gen 的是裸 textarea 小框）——
     输入区铺满整卡内容宽（用户红框范围）、无框无拖拽手柄；min-height 150 即整块红色区域 */
  #cardGen189 .vgen-prompt230, #cardVgen189 .vgen-prompt230{
    display:block;width:100%;resize:none;font:inherit;font-size:13px;line-height:1.7;   /* v242：右下角拖拽调高手柄删 */
    color:var(--text);background:transparent;border:none;outline:none;
    padding:4px 2px;min-height:150px;
  }
  #cardGen189 .vgen-prompt230::placeholder, #cardVgen189 .vgen-prompt230::placeholder{color:var(--text-3)}
  .vgen-bar230{display:flex;align-items:center;gap:14px;margin-top:10px;flex-wrap:wrap}
  .vgen-chip230{
    margin-left:0;flex:0 0 auto;background:transparent;border:none;color:var(--text);
    font:inherit;font-size:12.5px;padding:7px 10px;cursor:pointer;border-radius:10px;transition:.15s;
  }
  .vgen-chip230:hover{background:var(--accent-soft)}
  .vgen-chip230:focus{outline:none;box-shadow:none}
  /* v257：芯片键的**常态 = 与窗口同色**（没有框、没有底色），只有鼠标压上去才显色。
     ⚠️ 默认暗色下看到的那颗「框」来自 `html[data-theme="dark"] .sel{background:#232631}`
     —— 它的优先级（0,2,1）压过 .vgen-chip230（0,1,0），所以要用同权重补一条盖回去。 */
  html[data-theme="dark"] .vgen-chip230{background:transparent;border-color:transparent;color:var(--text)}
  html[data-theme="dark"] .vgen-chip230:hover{background:var(--accent-soft);color:var(--text)}
  /* v249：比例 / 分辨率合并键弹窗（即梦式双段点选；双主题双轨）
     v257：从「卡内 absolute」改成**独立浮层** —— 打开时挂到 body + position:fixed。
     理由跟 v157 菜单 / v166 随机窗完全一样：.sheet 的 overflow:hidden（+ will-change）会把
     卡内 absolute 弹层整块裁掉（用户口径「它应该是另外单独的一个窗口，就算超出了这个窗口
     之外，它也是能显示完整的」）；位置由 JS 按触发按钮的**视口位置**算（与按钮左右居中），
     并从按钮那儿**放大出来**（origin = 底边中点）。 */
  .spec-pop249{
    position:fixed;left:0;top:0;z-index:60;min-width:280px;
    background:var(--card);border:1px solid var(--line);border-radius:14px;
    box-shadow:0 12px 34px rgba(10,12,20,.22);padding:12px;user-select:none;
    transform-origin:50% 100%;animation:specPop257 .15s ease-out;
  }
  .spec-pop249[hidden]{display:none}
  /* v257：从按钮那儿「放大出来」—— 起点压在按钮上（origin = 底边中点），缩放 + 轻微上移 */
  @keyframes specPop257{
    from{opacity:0;transform:scale(.82) translateY(8px)}
    to{opacity:1;transform:none}
  }
  .spec-sec249{font:500 12px/1 var(--sans);color:var(--text-3);margin:2px 2px 8px}
  .spec-sec249 + .spec-row249{margin-bottom:10px}
  .spec-row249{display:flex;flex-wrap:wrap;gap:6px}
  .spec-opt249{
    display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:5px;
    min-width:56px;padding:9px 8px 7px;border:1px solid var(--line);border-radius:10px;
    background:var(--card);color:var(--text);font:500 12.5px/1 var(--sans);cursor:pointer;transition:.15s;
    white-space:nowrap;   /* v257：一排挤多个时「21:9」不许折成两行 */
  }
  .spec-opt249 .spec-ico249{display:block;border:1.6px solid currentColor;border-radius:3px;color:var(--text-2)}
  .spec-opt249:hover{border-color:var(--accent);color:var(--accent)}
  .spec-opt249.on{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}
  .spec-opt249.on .spec-ico249{color:var(--accent)}
  html[data-theme="dark"] .spec-pop249{background:#191c24;border-color:#262a35;box-shadow:0 10px 30px rgba(0,0,0,.5)}
  html[data-theme="dark"] .spec-opt249{background:#232631;border-color:transparent;color:#e8eaf1}
  html[data-theme="dark"] .spec-opt249 .spec-ico249{color:#8b91a3}
  html[data-theme="dark"] .spec-opt249:hover{background:#262a35;color:var(--accent)}
  html[data-theme="dark"] .spec-opt249.on{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}
  /* ---- v255：规格弹窗口径（图片 / 视频同款）----
     ① 弹窗加宽到 340px —— 用户口径「分辨率右边那块很空，把框拉长」；
     ② 比例行三列铺满（6 档 = 两行三列，小图形不被挤扁）；
     ③ 分辨率行 chip 拉满整宽（flex:1 1 0，几档就均分成几份，不再左边挤一堆右边空着）。 */
  .spec-pop249.spec-pop255{width:340px;min-width:0;max-width:calc(100% - 24px)}
  /* v257：比例**一整排**（6 档 = 一行六列，不再折成两行三列）—— 列窄了就把内边距收一点，
     图标（最宽 20px）与文字（「21:9」约 27px）在 ~48px 的格子里还放得下。 */
  .spec-row249.spec-ratio255{flex-wrap:nowrap}
  .spec-row249.spec-ratio255 .spec-opt249{flex:1 1 calc(16.666% - 5px);min-width:0;padding:7px 3px 6px;gap:4px}
  .spec-row249.spec-res255 .spec-opt249{flex:1 1 0;min-width:0}
  /* v257：模型选择也走同款弹窗 —— 一个框、选项**上下排列**（各占整行、左对齐，不参与均分） */
  .spec-row249.spec-model257{flex-wrap:nowrap;flex-direction:column;gap:4px}
  .spec-row249.spec-model257 .spec-opt249{
    flex:0 0 auto;width:100%;min-width:0;flex-direction:row;align-items:center;
    justify-content:flex-start;gap:8px;padding:8px 10px;text-align:left;
  }
  /* v255：时长弹窗 —— 左进度条 + 右秒数输入框 + 两端刻度（复用 .rng / .rng-num，双主题自带） */
  .dur-row255{display:flex;align-items:center;gap:10px}
  .dur-rng255{width:auto;flex:1 1 auto;min-width:0}
  .dur-val255{flex:0 0 auto;display:flex;align-items:center;gap:3px}
  .dur-val255 em{font:500 11.5px/1 var(--sans);color:var(--text-3);font-style:normal}
  .vgen-sp230{flex:1 1 auto;min-width:0;text-align:right}
  .vgen-bar230 .btn.primary{width:auto;margin:0;height:34px;padding:0 18px;font-size:13px;border-radius:9px}
  /* v232：gen/vgen 即梦式整卡 —— 顶栏隐藏、参考图缩略区、圆形生成钮、右上角面板放大钮 */
  .sheet[data-node189="gen"] .sheet-bar, .sheet[data-node189="vgen"] .sheet-bar{display:none}
  #cardGen189, #cardVgen189{position:relative}
  .panel-max230{
    position:absolute;top:2px;right:2px;z-index:5;width:30px;height:30px;border-radius:8px;
    border:none;background:transparent;color:var(--text-3);cursor:pointer;display:grid;place-items:center;transition:.15s;
  }
  .panel-max230 svg{width:16px;height:16px}
  .panel-max230:hover{background:var(--accent-soft);color:var(--accent)}
  .vgen-ref230{display:flex;gap:8px;margin:0 0 12px;min-height:64px;flex-wrap:wrap}
  .vgen-ref230 img{width:64px;height:64px;object-fit:cover;border-radius:10px;display:block;border:1px solid var(--line)}
  /* v258：加号位改成**常驻**（空态就它一格；有参考图时跟在最后一张后面），可点 → 弹「上传 / 从画布选择」 */
  .vgen-ref-add230{width:64px;height:64px;border-radius:10px;background:var(--card);border:1px dashed var(--line-strong);color:var(--text-3);display:grid;place-items:center;font-size:22px;line-height:1;flex:0 0 auto;cursor:pointer;transition:.15s}
  .vgen-ref-add230:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}
  html[data-theme="dark"] .vgen-ref-add230:hover{background:rgba(90,143,163,.14)}
  /* v252：参考图可以有**多张**（gen / vgen 接多个上游）—— 每张一个 1:1 缩略块，
     右上角一颗 ✕ 只摘这一张（窗内点击 stopPropagation，不冒泡到「点窗外关」那条） */
  .vgen-ref-it252{position:relative;width:64px;height:64px;flex:0 0 auto}
  .vgen-ref-x252{
    position:absolute;top:-5px;right:-5px;width:18px;height:18px;padding:0;border-radius:50%;
    border:1px solid var(--line);background:var(--card);color:var(--text-2);
    font:inherit;font-size:12px;line-height:1;display:grid;place-items:center;cursor:pointer;transition:.15s;
  }
  .vgen-ref-x252:hover{color:#fff;background:#e0564f;border-color:#e0564f}
  html[data-theme="dark"] .vgen-ref-x252{background:#232631;border-color:#333846;color:#c9cdd8}
  /* v259：参考图「从画布选择」拾取态 —— **整个画面最底部**通栏一条蓝色渐变 + 上飘的像素方块。
     渐变口径（用户原话）：从下往上 —— 下面实（不透明），越往上越虚，到顶完全看不见。
     方块：小、**大小 / 角度都随机**，跟渐变一起从下往上飘、到一定高度淡掉；纯 CSS 动画
     （不占 rAF、不参与 drawStage 重绘，逐格 --x/--s/--r/--o/--t/--d 全硬编码在 nth-child 表里）。
     底条本身 pointer-events:none —— 画布手势（平移 / 缩放 / 点选 / 框选）一个都不挡。
     v260：定位改 **fixed + top:auto + bottom:0** —— 用户环境实锤 canvasWrap 里的 absolute:bottom
     落到了视口**顶**上（同一张截图里 .app 直属的缩放胶囊是对的）⇒ 直接锚视口底，并挪出 canvasWrap
     跟缩放胶囊同层（HTML 一并挪到 .app 直属）；padding-left 让开左下角的缩放胶囊。
     v262：渐变**整体降低透明度**（用户口径「进入功能后界面完全保持原本的样子，只增加下面的蓝色渐变
     就可以了 —— 已有的蓝色渐变整体降低透明度，变的更透明」）；深色主题下条上文字转浅色保可读。 */
  .ref-pick258{
    position:fixed;left:0;right:0;top:auto;bottom:0;z-index:46;height:86px;
    display:flex;align-items:center;gap:14px;padding:0 22px 12px 206px;
    color:#04141b;font-size:14px;font-weight:700;letter-spacing:.2px;
    background:linear-gradient(0deg,rgba(90,143,163,.55) 0%,rgba(90,143,163,.32) 26%,rgba(90,143,163,0) 58%,rgba(90,143,163,0) 100%);
    overflow:hidden;pointer-events:none;
  }
  .ref-pick258[hidden]{display:none}
  .rp-dots258{position:absolute;left:0;right:0;bottom:0;height:86px;overflow:hidden;pointer-events:none}
  .rp-px258{
    position:absolute;left:var(--x,50%);bottom:-10px;width:var(--s,5px);height:var(--s,5px);
    background:rgba(255,255,255,.95);border-radius:1px;opacity:0;
    animation:rpRise258 var(--t,2.8s) linear var(--d,0s) infinite;
  }
  @keyframes rpRise258{
    0%{opacity:0;transform:translateY(0) rotate(var(--r,0deg))}
    12%{opacity:var(--o,.9)}
    58%{opacity:var(--o,.9)}
    100%{opacity:0;transform:translateY(-96px) rotate(calc(var(--r,0deg) + 90deg))}
  }
  .rp-px258:nth-child(1){--x:2%;--s:6px;--r:12deg;--o:0.95;--t:2.6s;--d:-0.2s}
  .rp-px258:nth-child(2){--x:6%;--s:4px;--r:58deg;--o:0.7;--t:3.1s;--d:-1.1s}
  .rp-px258:nth-child(3){--x:10%;--s:5px;--r:132deg;--o:0.85;--t:2.4s;--d:-2.0s}
  .rp-px258:nth-child(4){--x:14%;--s:4px;--r:205deg;--o:0.6;--t:3.4s;--d:-0.6s}
  .rp-px258:nth-child(5){--x:18%;--s:7px;--r:27deg;--o:0.95;--t:2.8s;--d:-1.7s}
  .rp-px258:nth-child(6){--x:23%;--s:5px;--r:88deg;--o:0.75;--t:3.2s;--d:-2.5s}
  .rp-px258:nth-child(7){--x:27%;--s:4px;--r:156deg;--o:0.65;--t:2.5s;--d:-0.9s}
  .rp-px258:nth-child(8){--x:31%;--s:6px;--r:240deg;--o:0.9;--t:3.6s;--d:-1.4s}
  .rp-px258:nth-child(9){--x:36%;--s:5px;--r:311deg;--o:0.8;--t:2.7s;--d:-2.3s}
  .rp-px258:nth-child(10){--x:40%;--s:8px;--r:44deg;--o:1;--t:3.1s;--d:-0.4s}
  .rp-px258:nth-child(11){--x:44%;--s:4px;--r:118deg;--o:0.7;--t:2.9s;--d:-1.9s}
  .rp-px258:nth-child(12){--x:49%;--s:5px;--r:176deg;--o:0.85;--t:3.3s;--d:-0.8s}
  .rp-px258:nth-child(13){--x:53%;--s:6px;--r:262deg;--o:0.9;--t:2.6s;--d:-2.7s}
  .rp-px258:nth-child(14){--x:58%;--s:4px;--r:331deg;--o:0.65;--t:3.5s;--d:-1.2s}
  .rp-px258:nth-child(15){--x:62%;--s:7px;--r:20deg;--o:0.95;--t:2.4s;--d:-2.1s}
  .rp-px258:nth-child(16){--x:67%;--s:5px;--r:96deg;--o:0.75;--t:3.0s;--d:-0.5s}
  .rp-px258:nth-child(17){--x:71%;--s:4px;--r:148deg;--o:0.6;--t:3.4s;--d:-1.6s}
  .rp-px258:nth-child(18){--x:75%;--s:6px;--r:214deg;--o:0.9;--t:2.8s;--d:-2.6s}
  .rp-px258:nth-child(19){--x:80%;--s:5px;--r:287deg;--o:0.8;--t:3.2s;--d:-1.0s}
  .rp-px258:nth-child(20){--x:85%;--s:4px;--r:8deg;--o:0.7;--t:2.5s;--d:-2.4s}
  .rp-px258:nth-child(21){--x:89%;--s:6px;--r:74deg;--o:0.85;--t:3.6s;--d:-1.8s}
  .rp-px258:nth-child(22){--x:93%;--s:5px;--r:190deg;--o:0.95;--t:2.9s;--d:-0.3s}
  .rp-px258:nth-child(23){--x:96%;--s:7px;--r:305deg;--o:0.8;--t:3.3s;--d:-2.2s}
  .rp-px258:nth-child(24){--x:97%;--s:4px;--r:350deg;--o:0.9;--t:2.7s;--d:-1.5s}
  .rp-txt258{position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);text-align:center;z-index:1}
  .rp-cancel258{
    position:relative;z-index:1;margin-left:auto;font:inherit;font-size:13px;font-weight:700;
    padding:7px 16px;border-radius:20px;cursor:pointer;transition:.15s;pointer-events:auto;
    border:1px solid rgba(4,20,27,.45);background:rgba(255,255,255,.62);color:#04141b;
  }
  .rp-cancel258:hover{background:#fff;border-color:rgba(4,20,27,.7)}
  html[data-theme="dark"] .ref-pick258{color:#eafcff}
  /* v268：参考图拾取态 —— 顶栏（logo / 工作流·地图绘制 / 登录区）整体上移出画面、
     左下角缩放胶囊 / 缩放弹层 / 小地图下移出画面（带动画，退出拾取态原路移回）。
     只在 body 挂 ref-pick-ui268 时生效，平时一个像素都不动。 */
  .topbar,.zoom-pill,.zoom-pop,.mini-map{transition:transform .35s ease}
  body.ref-pick-ui268 .topbar{transform:translateY(calc(-100% - 20px))}
  body.ref-pick-ui268 .zoom-pill{transform:translateY(calc(100% + 20px))}
  body.ref-pick-ui268 .zoom-pop{transform:translateY(calc(100% + 80px))}
  body.ref-pick-ui268 .mini-map{transform:translateY(calc(100% + 60px))}
  /* v258：参考图「添加」弹窗比规格弹窗窄（两个短标签） */
  .spec-pop249.spec-pop255.ref-pop258{width:216px}
  .spec-opt249 .rp-ico258{width:15px;height:15px;flex:0 0 auto}
  /* v300：发送键左边的预计积分胶囊（按当前模型 / 规格 / 时长实时换算；成功后才真扣） */
  .cr-hint300{flex:0 0 auto;font:600 12px/1 var(--sans);color:var(--text-2);background:var(--sunken);border:1px solid var(--line);border-radius:999px;padding:7px 10px;white-space:nowrap}
  /* v315：全站发送键统一 —— 34px 圆形 + accent 渐变底 + 深字，悬停 / 禁用 / 停止三态一致 */
  .vgen-bar230 .run-pil230{
    width:34px;height:34px;border-radius:50%;border:none;cursor:pointer;flex:0 0 auto;
    background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#0b0d12;
    display:grid;place-items:center;transition:.15s;
  }
  .vgen-bar230 .run-pil230 svg{width:17px;height:17px}
  .vgen-bar230 .run-pil230:hover{filter:brightness(1.06)}
  .vgen-bar230 .run-pil230[aria-disabled="true"]{opacity:.45;cursor:not-allowed}
  /* v232：面板放大（非全屏）—— 压过 JS 内联定位，钉右上角大卡 */
  .sheet.max230{
    /* v242：大窗上下左右居中（原钉右上角） */
    transform:translate(-50%,-50%) !important;left:50% !important;top:50% !important;right:auto;
    width:min(1200px,calc(100vw - 24px));max-height:min(94vh,calc(100vh - 24px));
  }
  html[data-theme="dark"] #typedHint189{border-color:#262a35;color:#8b91a3}
  /* ================= v458：＋ 窗按四类分组（分类落到界面上） =================
     四个小组标题 + 九颗选项；分组名与顺序取自 js/src/94-nodecat457.js 的 NODE_CAT457。
     配色全走主题变量。⚠️ `.plus-opt189 + .plus-opt189{margin-top:8px}` 是**相邻兄弟**选择器
     （闸门钉着那条原文），跨组的选项不再互为相邻兄弟 ⇒ 跨组间距由 .plus-grp458 自己负责。
     另：窗子从 7 行涨到 9 行 + 4 个组标题 ⇒ 补一个高度上限自己滚（v346 的「窗子永不出屏」
     只钳位置、不限制高度）。 */
  .plus-grp458{font:500 12px/1 var(--sans);color:var(--text-3);letter-spacing:.06em;padding:11px 10px 7px}
  .plus-win189 .plus-opt189{padding:11px 14px}
  .plus-win189{max-height:min(84vh,760px);overflow-y:auto;overflow-x:hidden}

  /* ================= v566：＋ 窗对齐即梦（用户令 5 条） =================
     ① 字号改小对齐即梦（原 17/20/24 一档太大 ⇒ 标题 13 / 选项 14 / 图标 17、行距收紧）；
     ② 组标题小字退役（上面那条 .plus-grp458 变死规则、原文保留 —— 闸门钉着）；
     ③ 分类之间改横线分隔（.plus-sep566）；④ 标题更名「新建节点」；⑤ 右上角关闭钮撤。
     ⚠️ 本块是**文件尾后置覆盖**：上面的原文一字未动（v191 / v241 / v325 / v328 / v458 的钉扎都还钉着原文）。 */
  .plus-win-head189{font:500 13px/1 var(--sans);padding:8px 10px 10px}
  .plus-opt189{font:500 14px/1 var(--sans);gap:12px;padding:9px 12px;border-radius:8px}
  .plus-opt189 svg{width:17px;height:17px}
  .plus-opt189 + .plus-opt189{margin-top:2px}
  .plus-win189 .plus-opt189{padding:9px 12px}
  .plus-sep566{height:1px;background:var(--line);margin:7px 8px}
  html[data-theme="dark"] .plus-sep566{background:#262a35}

  /* ================= v568：＋ 窗宽度收一点（用户令「宽度减少一点」，2026-10-12） =================
     文件尾后置覆盖：窗体 min-width 260 → 236、内边距 12 → 10、选项水平内边距 12 → 11
     （整窗收约 24px；字号 / 行距 / 分隔线 v566 那套一字不动）。 */
  .plus-win189{min-width:236px;padding:10px}
  .plus-win189 .plus-opt189{padding:9px 11px}


  /* ================= v569：GPT 比例两排 4+4（用户令 2026-10-12：
     第一排 1:1 · 2:3 · 3:4 · 9:16 / 第二排 3:2 · 4:3 · 16:9 · 21:9） =================
     .spec-row249 是 flex-wrap 容器（gap 6px）⇒ 一颗 flex-basis:100% 的零高占位就是「强制换行」；
     上下的 6px 间距各吃掉 3px（margin:-3px 0）⇒ 两排之间仍是 6px，与行内间距一致。 */
  .spec-row249 .spec-br568{flex:0 0 100%;height:0;margin:-3px 0}
  /* ================= v581：GPT 8 档比例两排 4+4 铺满（修「选择比例挤成一坨」） =================
     根因：比例行 v257 起是 flex-wrap:nowrap（6 档一排时代口径）；v569 往里塞 flex-basis:100%
     的换行占位（.spec-br568）想排两排 4+4 —— nowrap 容器换不了行，占位反而吃掉整行宽，
     8 颗按钮被压成 0 宽（下面那条 min-width:0 放行了压缩）⇒ 图标叠条、文字竖排。
     修法（09-nodes.css 文件尾后置覆盖，同权重后加载者赢；有占位的行由 102 尾部加
     .spec-ratio2x4 修饰类）：放开换行 + 该类下按钮提到 25% 一档（两排各 4 颗正好铺满）；
     方舟 5 档无类 ⇒ 16.666% 一排照旧（5 × 16.666% = 83% 放得下，不折行）。 */
  .spec-row249.spec-ratio255{flex-wrap:wrap}
  .spec-row249.spec-ratio255.spec-ratio2x4 .spec-opt249{flex:1 1 calc(25% - 5px)}

  /* ================= v583：规格弹窗四段统一满行（用户令 2026-10-12 深夜） =================
     ① 换行占位在 25% 一档下自己占一排、把第一排挤成 3 颗 ⇒ 8 颗按钮本来就是 4+4 等宽，
        占位藏掉就归位（DOM 留着 —— [v568]⑧ / [v581]① 的钉扎与断言不破）；
     ② 画质 / 背景两行 3 等分满行（gap 6px ⇒ calc(33.333% - 5px) 三颗正好铺满）；
        分辨率行本来就是 .spec-res255（flex:1 1 0）⇒ 加到 3 档自动等宽，不用另写。 */
  .spec-row249.spec-ratio255.spec-ratio2x4 .spec-br568{display:none}
  #genQRow568 .spec-opt249{flex:1 1 calc(33.333% - 5px);min-width:0}
  #genBgRow568 .spec-opt249{flex:1 1 calc(33.333% - 5px);min-width:0}


  /* ================= v594：比例行两排等高（用户报 2026-10-13，截图点名） =================
     现象：GPT 比例行 4+4 两排，第一排比第二排高约 8px。
     根因：.spec-opt249 没有固定高度（09-nodes.css:82-87），行高由「这一排里最高的那颗按钮」
           决定；而按钮里的比例图标是**按比例画的方框**（JS 里逐颗给 width/height）——
           第一排含 9:16（图标高 20）与 2:3（18），第二排最高的才 4:3（13）、21:9 只有 9
           ⇒ 第一排被撑到 ~50px，第二排只有 ~42px。
     修法：给比例行的按钮一个统一的最小高度 + 内容居中。两排都被拉到同一高度，
           图标与文字在原位置（justify-content 由 flex-end 改成 center，行内更居中）。
     注：视频的规格弹窗复用同一个 .spec-ratio255 类 ⇒ 一并统一（它本来也是 6 档一排，
         加了 min-height 之后与图片侧观感一致，不算副作用）。
     ⚠️ 上面 104 / 105 / 278 / 279 四条被 verify-page 逐字钉着 —— 一字不动，这里只做后置覆盖。
     ================================================================================ */
  .spec-row249.spec-ratio255 .spec-opt249{min-height:50px;justify-content:center}
