/* UIOPT-R4 · 编辑器面板 + 侧边栏浮窗化 + 颜色阶梯统一（占位头，bot 按 TASK-R4-EDITOR.md 及其补单填充）
   挂载：入口 index.html 静态 link（仲裁方 09-20 加，挂载序最后）——全局 chrome 不得懒加载注入。
   变量全复用 uiopt-r1.css :root，禁新增灰/禁新增 token。

   主审颜色阶梯裁定（全应用唯一源）：
   L0 桌面 = --canvas-bg ｜ L1 浮窗/面板/菜单/弹层 = --surface（胶囊工具栏/zoom 用 --surface-soft+blur）
   L2 窗内版块/分组块 = --chip-bg ｜ 卡片 = --card-bg
   文字 = --ink-1/2/3 ｜ 紫 --accent-ui = 交互强调唯一（选中/激活/主钮/slider 拇指）
   黄 --accent-marker = 件数签/星钉 ｜ 青桃绿 --card-tint-* = 染色与垫背，仅这两用途
   暗岛仅两处：编辑器视口（专业编辑环境）+ toast 墨丸。面板分界靠色阶+阴影，不靠描边。

   主审圆角裁定（蒋哥 09-20 追问 + 仲裁统一）：
   左侧边栏、编辑器各面板 = 浮起圆角窗口：外窗 --r-pop(10) + 离屏 10px 呼吸缝 + --sh-lift，不贴边直角；
   窗内每个版块/分组块 = --r-card(8) 浅灰底（白窗套灰块两层阶）；slider 行在版块内，轨道 chip 灰/拇指紫。 */

/* ===== UIOPT-R4 实现（bot，TASK-R4-EDITOR + 补单①②③④ + 补单2 + 补单3） =====
   挂载现实：r4 静态挂载早于运行时追加的 r2/r3/workspace-shell-p0.css——同特异度平票会输，
   故侧栏/rail 用 .canvas-shell> 直系子复合选择器抬到 (0,4,0) 压过 ws-p0 的 (0,3,0) 几何行；
   编辑器面复刻 refinement 的 .editor-layer.ws[data-ed-demo] .ws .X 前缀（同特异度、静态后挂=判给 r4）。
   补单3①勘正：旧实现曾直采 refinement 暗岛旧字面——该字面=纯黑相违禁，已由 E 段 --ed-island 契约 token 取代；
   token 化系补单3④「暗岛反色条款改 token 不硬编码」明裁，组成本文件唯一新增 :root 变量（墨丸同族合成，零新增灰值）。其余值仍全复用 r1 :root token。 */

/* —— A1. 左侧边栏浮窗（离屏缝：上38=顶栏28+10／下10／左=rail10+54+缝10=74；白窗+sh-lift+去右描边） —— */
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar {
  top: 38px; bottom: 10px; left: 74px;
  padding-top: 0;                       /* 原 36px 顶补偿随浮窗作废 */
  border-radius: var(--r-pop);
  background: var(--surface);
  border-right: 0;
  box-shadow: var(--sh-lift);
  overflow: hidden;
  z-index: 23;
}
/* 白窗套灰块：页签行/工具行/脚注 = L2 chip 版块（分界靠色阶，去行分隔描边） */
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .sidebar-tabs,
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .material-toolbar,
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .file-toolbar,
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .sidebar-foot {
  background: var(--chip-bg);
  border-radius: var(--r-card);
  border-bottom: 0;
  border-top: 0;
  margin-left: 10px;
  margin-right: 10px;
}
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .file-toolbar .sidebar-search { margin: 0; background: var(--surface); } /* 灰块内输入=白面 */
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .file-toolbar button { background: var(--surface); border: 0; border-radius: var(--r-ctl); }
/* 选中/激活=紫唯一（清旧绿 rgb(54,84,68)/#e9e9e4 绿垫与 #263a31 深绿语汇；r1 :137-138 页签紫已由 r1 覆盖） */
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .material-scopes button,
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .view-switch button { border-radius: var(--r-ctl); color: var(--ink-2); }
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .material-scopes button.active,
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar .view-switch button.active { background: var(--accent-ui); color: var(--surface); }
.app-frame:has(.canvas-shell) .canvas-shell > .sidebar input[type="range"] { accent-color: var(--accent-ui); } /* 现网侧栏 slider 行实测=0（缺口登记），规则为合同完整性 */

/* —— A2. left-rail 浮起胶囊窗（r-pop 起步；r-pill 对照截图见自验，取视觉净者定稿） —— */
.app-frame:has(.canvas-shell) .canvas-shell > .left-rail {
  top: 38px; bottom: 10px; left: 10px;
  background: var(--surface);
  border-radius: var(--r-pop);
  border-right: 0;
  box-shadow: var(--sh-lift);
  overflow: hidden;
  z-index: 24;
}

/* —— B/C. 编辑器外窗浮起 + 暗岛视口 + 窗内版块同阶 —— */
.editor-layer.ws .ws {
  top: 38px; right: 10px; bottom: 10px;  /* ② 主窗上沿降到画布页眉(28px)之下——原 10px 顶边与页眉带重叠（本层 z-index:130 高于页眉，
                                             白面盖住页眉文字）；右/下缘 10px 不变，与左卡 38/10 统一 */
  border-radius: var(--r-pop);
  background: var(--surface);            /* L1 白窗（旧 #ecebe4 暖灰整体作废） */
  box-shadow: var(--sh-lift);
  overflow: hidden;
}
.editor-layer.ws .ws .ws-canvas {        /* 补单3① 暗岛=契约仅两处之一：编辑器视口；色=--ed-island 契约 token（墨丸同族深调，非纯黑），旧硬编码作废 */
  top: 12px; left: 12px; right: 12px; bottom: 140px; /* 旧 inset:12/底132 随浮窗内缩同步+8 */
  background: var(--ed-island);
  border-radius: var(--r-card);
}
.editor-layer.ws[data-ed-demo] .ws .ed-toolbar {
  top: 10px; right: 10px; bottom: 140px; /* 让位右下 controls 版块（10缝+120带+10缝） */
  background: var(--chip-bg);
  border-left: 0; border-bottom: 0;
  border-radius: var(--r-card);
}
/* 特异度镜像 refinement:3964/3979（(0,5,0)/(0,5,1) 系）：r4 静态后挂=同特异度判给 r4 */
.editor-layer.ws .ws .ed-tool,
.editor-layer.ws[data-ed-demo] .ws .ed-tool { border-radius: var(--r-ctl); color: var(--ink-1); } /* r8→契约 r-ctl 6 */
.editor-layer.ws .ws .ed-tool:hover,
.editor-layer.ws[data-ed-demo] .ws .ed-tool:hover { background: var(--ctl-hover); } /* 旧 rgba(28,38,33,.10) 深绿 hover 作废 */
.editor-layer.ws[data-ed-demo] .ws .ed-tool.active,
.editor-layer.ws .ws .ed-tool.active { background: var(--accent-ui); color: var(--surface); } /* 黄 #efce6e 作废：黄只留件数签/星钉 */
.editor-layer.ws[data-ed-demo] .ws .ed-draw-properties,
.editor-layer.ws[data-ed-demo] .ws .ed-toolbar > .ed-draw-properties { background: var(--surface); border: 0; border-radius: var(--r-card); } /* 镜像 :5223（#f8f7f2+描边+8 0 0 8 作废）：灰条工具列内的属性浮出白块 */
.editor-layer.ws[data-ed-demo] .ws .ws-controls.ws-controls-demo {
  right: 10px; bottom: 10px;
  background: var(--chip-bg);
  border-top: 0; border-left: 0;
  border-radius: var(--r-card);
} /* 镜像 :3983 双类复合对手（(0,6,0)） */
.editor-layer.ws .ws .ws-ctrl { border-radius: var(--r-ctl); }
.editor-layer.ws[data-ed-demo] .ws .ws-controls-demo .ws-ctrl:hover,
.editor-layer.ws[data-ed-demo] .ws .ws-controls-demo .ws-ctrl-back:hover { background: var(--ctl-hover); } /* 镜像 :4006/4009 深绿 hover */
.editor-layer.ws[data-ed-demo] .ws .ws-controls-demo .ws-ctrl:focus-visible { outline-color: var(--accent-ui); } /* 镜像 :4012：旧 #456052 绿作废 */
.editor-layer.ws[data-ed-demo] .ws .ws-controls-demo .ws-ctrl-back:active { background: var(--ctl-hover); } /* 镜像 :4010 深绿按压底作废（不新增灰） */
.editor-layer.ws[data-ed-demo] .ws .ws-controls.ws-controls-demo .ed-c-send:hover:not([disabled]) { background: var(--ctl-hover); } /* 镜像 :4900 */
.editor-layer.ws[data-ed-demo] .ws .ws-controls.ws-controls-demo .ed-c-send:focus-visible { outline-color: var(--accent-ui); } /* 镜像 :4902 */
.editor-layer.ws[data-ed-demo] .ws .ed-history {
  left: 10px; bottom: 10px;
  right: calc(66px + var(--preview-composer-width, 340px)); /* 旧 46px 基线 + rail/工具列浮窗缝 20 */
  background: var(--chip-bg);
  border-top: 0;
  border-radius: var(--r-card);
}
.editor-layer.ws .ws .ed-hist-item { border-radius: var(--r-ctl); }
.editor-layer.ws .ws .ed-hist-item:hover { background: var(--ctl-hover); }
.editor-layer.ws[data-ed-demo] .ws .ed-rail { top: 10px; bottom: 10px; right: 66px; gap: 10px; } /* 与工具列胶囊留 10 缝 */
.editor-layer.ws[data-ed-demo] .ws .ed-wf-panel {
  background: var(--chip-bg);
  border-left: 0;
  border-radius: var(--r-card);
}
.editor-layer.ws[data-ed-demo] .ws .ed-composer {   /* 补单3③ 文本对话框=独立浮窗（L1 白面+离屏缝由 rail gap:10 供+lift 影），旧窗内灰块版作废 */
  background: var(--surface);
  border-left: 0; border-top: 0; border-right: 0; border-bottom: 0;
  border-radius: var(--r-pop);
  box-shadow: var(--sh-lift);
}
.editor-layer.ws[data-ed-demo] .ws .ed-composer textarea {   /* ③白窗套灰输入面（与侧边栏两层阶同语言反转） */
  background: var(--chip-bg);
  border: 0;
  border-radius: var(--r-ctl);
  color: var(--ink-1);
}

/* —— C. 上拉弹层（z100 不动，#676 合同）：白面+sh-pop+r-pop，去描边 —— */
/* 09-20 补单2 勘正：旧选择器 (0,3,0) 被 refinement:4665/:4936 (0,5,0) 全量压制（r4-shots-r4-sh-r1.log 实测 rgb(251,250,245)/b1px/r5px/rgba(20,26,22,.18) 4px 14px）→ 镜像特异度，静态挂载序在 refinement 后同分判序胜 */
.editor-layer.ws[data-ed-demo] .ws .ed-topt-pop { background: var(--surface); border: 0; border-radius: var(--r-pop); box-shadow: var(--sh-pop); }

/* —— C. slider 统一：轨道 chip 灰、拇指 --accent-ui（含画笔面板 #2e6b4f 绿拇指作废） —— */
/* 特异度镜像 refinement:4671 .ed-topt-pop / :4674 .ed-attrzone .ed-brushpanel / :5102 appearance:auto（#2e6b4f 绿与原生外观全作废） */
.editor-layer.ws input[type="range"],
.editor-layer.ws[data-ed-demo] .ws .ed-topt-pop input[type="range"],
.editor-layer.ws[data-ed-demo] .ws .ed-attrzone .ed-brushpanel input[type="range"],
.editor-layer.ws[data-ed-demo] .ws .ed-draw-properties .ed-horizontal-value input[type="range"] {
  -webkit-appearance: none; appearance: none; background: transparent; accent-color: var(--accent-ui); height: 18px;
}
.editor-layer.ws input[type="range"]::-webkit-slider-runnable-track { height: 4px; border-radius: var(--r-pill); background: var(--chip-bg); }
.editor-layer.ws input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 14px; height: 14px; margin-top: -5px; border: 0; border-radius: var(--r-pill); background: var(--accent-ui); }
.editor-layer.ws input[type="range"]::-moz-range-track { height: 4px; border-radius: var(--r-pill); background: var(--chip-bg); }
.editor-layer.ws input[type="range"]::-moz-range-thumb { width: 14px; height: 14px; border: 0; border-radius: var(--r-pill); background: var(--accent-ui); }

/* —— B(②). 图标线宽归一：demo JS :120 内联 sw=1.5 系（源不可写）→ CSS presentation 属性压过属性值，
      编辑器域全部描边图标统一 1.8（主画布 icon() 系本已 1.8，域外零触）—— */
.editor-layer.ws svg[stroke-width], .editor-layer.ws svg [stroke-width] { stroke-width: 1.8; }
.editor-layer.ws[data-ed-demo] .ws .ws-controls-demo .ed-c-send svg { stroke-width: 1.8; } /* 镜像 :4887 纸飞机 stroke:2 特例并入 1.8 统一（尺寸 12 保留） */

/* —— D. 补单2 · 阴影归阶梯（09-20）：亮 chrome 面板族 legacy box-shadow → rest/lift/pop 三 token；
      暗岛豁免与逐条判定表在 REPORT-R4-EDITOR.md §D。全部镜像 refinement 同特异度，r4 静态挂载在后、同分判序胜。
      只动阴影行：颜色/描边/圆角遗留散色归补单3 处置，此处不越权 —— */
.project-card.is-expanded { box-shadow: var(--sh-lift); } /* 压 refinement:1869 三重选择器 none（:1383 绿味线上已死，CSSOM 实形 none，diag-pc-1.log 存证）；与 r1:74 hover=lift 同阶梯，静息=rest */
.editor-layer.ws .ws .ws-panel { box-shadow: var(--sh-pop); } /* 压 :3723 legacy 0 16px 40px rgba(28,34,30,.18) */
.editor-layer.ws[data-ed-demo] .ws .ed-cropbar { box-shadow: var(--sh-pop); } /* 压 :4109 legacy 0 8px 20px rgba(20,26,22,.3)（裁剪态瞬态 DOM，线上腿未展开=缺口登记） */
.editor-layer.ws[data-ed-demo] .ws .ed-confirm { box-shadow: var(--sh-pop); } /* 压 :4162 legacy 0 18px 44px rgba(20,26,22,.35)（确认态瞬态 DOM，同上登记） */
.editor-layer.ws[data-ed-demo] .ws .ed-attrzone .ed-brushpanel:not(.ed-topt-pop) { box-shadow: var(--sh-rest); } /* 压 :4656 legacy 0 1px 3px rgba(20,26,22,.06)（属性带内联展开块） */
.editor-layer.ws[data-ed-demo] .ws .ed-wf-tile:hover { box-shadow: var(--sh-rest); } /* 压 :4974 legacy 0 2px 6px #20211f25（金边描边色保留待补单3 裁定） */
.editor-layer.ws[data-ed-demo] .ws .ed-template-dialog { box-shadow: var(--sh-pop); } /* 压 :4987 legacy 0 18px 80px #0003；r3:85 同值 pop 双保险 */

/* ===== E. 补单3（09-20 蒋哥看图明裁）：契约暗岛 token／未加载诚实占位／文本对话框同进同出零预留／散色归阶梯 =====
   ① 黑填充违禁根因具名：div.ws-canvas（编辑器视口岛）此前在 r4 暗岛行直采旧深色字面（同 refinement cmp 岛先例），
      近纯黑违反「暗岛=契约暗调」——本段起岛色唯一来源 :root --ed-island（ink-1 88% + surface 合成 = 中性深灰、
      与 toast 墨丸同族，实测 rgb(48,48,48)）；refinement 侧旧字面属禁碰件，由本段镜像覆写（同特异度、r4 静态后挂判序胜）。
   ④ token 化授权：新增 :root 变量系本票「暗岛反色条款改 token 不硬编码」明裁，非自主扩词表；豁免清单见 REPORT 判定表。 */
:root {
  --ed-island: color-mix(in srgb, var(--ink-1) 88%, var(--surface)); /* 契约暗岛色：中性 48/48/48，非纯黑 */
  --ed-island-ink: var(--surface);                                    /* 岛面反色文字/徽标统一引用，禁白字硬编码 */
}

/* —— ① 未加载态诚实占位：底图缺失（读取失败徽标在场）→ 岛面改浅灰 + 文案，禁黑屏 —— */
.editor-layer.ws .ws:has(.ed-robadge[data-ed-nobase]) .ws-canvas { background: var(--chip-bg); }
/* ① 读取失败徽标归墨丸同族（压 refinement:4483 橙棕底+描边）：深墨底反白、去描边 */
.editor-layer.ws .ws .ed-robadge { background: var(--ink-1); color: var(--ed-island-ink); border: 0; }

/* —— ③ 文本对话框与工作流窗同进同出 + 隐藏零预留（岛宽动态让出/收回由既有 --ed-wf 机制承担） —— */
.editor-layer.ws[data-ed-demo] .ws:not([data-ed-wf-open]) .ed-rail,
.editor-layer.ws[data-ed-demo] .ws:not([data-ed-wf-open]) .ed-composer { display: none; } /* 闭合=整列离屏不留空槽；内容持久（DOM 常驻）开态不持久（无 wf-open 属性即藏） */

/* —— ④ 散色归阶梯（查看面 chrome 镜像逐条；demo 面被更高特异度 demo-scope 行保留原位，判定表见 REPORT） —— */
.editor-layer.ws .ws .ws-ctrl:hover { background: var(--ctl-hover); } /* 压 refinement:3668 白α.16 hover → 编辑器 hover 语汇统一 */
.editor-layer.ws .ws .ws-ctrl.ws-ctrl-save { background: var(--accent-ui); color: var(--surface); } /* 压 :3670 黄保存=主操作→紫唯一（黄只留件数签/星钉） */
.editor-layer.ws .ws .ws-ctrl.ws-ctrl-save:hover { background: color-mix(in srgb, var(--accent-ui) 85%, #000); } /* 压 :3671 亮黄 hover → 同族加深 */
.editor-layer.ws .ws .ws-ctrl.ws-ctrl-back { background: var(--chip-bg); } /* 压 :3672 深绿返回 → 中性 chip */
.editor-layer.ws .ws .ws-statusbar { color: var(--ink-2); } /* 压 :3675 散灰 → ink-2 */
.editor-layer.ws .ws .ws-statusbar .ws-dirty { color: var(--ink-2); } /* 压 :3687 黄褐 dirty → ink-2（未保存语义已有文案，颜色不占黄阶） */
.editor-layer.ws[data-ed-demo] .ws .ed-cropbar [data-ed-crop-ok] { background: var(--accent-ui); color: var(--surface); } /* 压 :4121 绿确认 → 紫交互唯一。C-U14-R1 注：maskop-ok 有意不并入本装饰层——--accent-ui 现值 #b8860b+--surface 对 11px 字仅 3.04:1<AA 4.5；蒙版确认钮停基座 #2e7d5b/#fff=5.0:1（裁剪确认钮的原始主题语义），现网裁剪钮不变 */
.editor-layer.ws[data-ed-demo] .ws .ed-cropbar [data-ed-crop-cancel],
.editor-layer.ws[data-ed-demo] .ws .ed-cropbar [data-ed-maskop-cancel],
.editor-layer.ws[data-ed-demo] .ws .ed-cropbar [data-ed-wand-cancel] { /* C-U14-MAGIC-WAND：取消钮两层全并=与现主题裁剪/蒙版取消计算值逐字相同（沿〔173〕） */ background: var(--chip-bg); color: var(--ink-1); } /* 压 :4122 深灰绿取消 → 中性 chip；C-U14-R1：取消钮并入 */
/* 暗岛第二处（分屏比较台）随契约 token 同步反色（:4611 旧字面镜像；tag/x 岛面反色统一走 --ed-island*） */
.editor-layer.ws[data-ed-demo] .ws .ed-cmp-splitstage { background: var(--ed-island); }
.editor-layer.ws[data-ed-demo] .ws .ed-cmp-tag { background: color-mix(in srgb, var(--ed-island) 80%, transparent); color: var(--ed-island-ink); border: 0; }
.editor-layer.ws[data-ed-demo] .ws .ed-cmp-x { color: var(--ed-island-ink); }

/* —— G5-VIS1 腿L（09-21）：wf 关暗台缩裹 —— 闭合态画布宽 = 图 fit box（--ed-fit-w，编辑器 layout 发出的待裁扩展）+ ≤24px 环；
   左沿锚（inset left 与 cx 左锚）不动 → 变量翻转与 wf 开/关零跳变；宽图无横带时变量不发。
   变量未定义（现包/demo 面未扩）→ calc(var(--ed-fit-w)+24px) 无效置 IACVT → width 回 initial auto → 左右 inset 拉伸=现状形，
   判前行为逐字节不变（fail-closed）。横带实测 dark=432169>预算 79248（m-port 6x8@1920x1080，log-vis1measure-vis1m6）；
   模拟注入 fit-w=687px 后 ring R=24 dark=33672≤79248（probe-vis1 留证）。demo.js 一行发值=写面扩展候裁，见 REPORT-G5-VIS-1.md §L。 */
.editor-layer.ws[data-ed-demo] .ws:not([data-ed-wf-open]) .ws-canvas { width: calc(var(--ed-fit-w) + 24px); }

/* Candidate: keep the three work entries and original send aligned with the composer. */
.editor-layer.ws[data-ed-demo].ed-composer-docked [data-ed-composer] { min-height: var(--ed-actions-min-height); }
.work-floats.ed-composer-actions {
  position: fixed; left: var(--ed-action-left); top: var(--ed-action-top); right: auto; bottom: auto;
  width: 32px; height: var(--ed-action-height); gap: var(--ed-action-gap); justify-content: space-between; z-index: var(--z-editor-actions, 131);
}
.work-floats.ed-composer-actions .float-head {
  position: relative; width: 32px; height: 32px; box-sizing: border-box; padding: 3px; flex: 0 0 32px;
}
.work-floats.ed-composer-actions .float-label {
  position: absolute; right: calc(100% + 4px); margin-left: 0; padding: 0;
  background: var(--surface); border-radius: var(--r-ctl);
}
.editor-layer.ws[data-ed-demo] .ws .ws-controls-demo .ws-ctrl-sendslot.ed-composer-send {
  position: fixed; left: var(--ed-action-left); top: var(--ed-action-top); right: auto; bottom: auto; height: 32px;
}

/* ===== B-REDLINE-20261010（用户红字 ①③④ 编辑器侧）——限 editor 命名空间，canvas/按钮现有行为零改 =====
   ①：「文字框需要加大」→ 正文带改自适应高（原 120px 定高被 .ed-cfg/.ed-references 挤瘪）；
      长文内滚可读；发送钮由 44px 通高立柱改 34×34 落右下角（不再占满正文高、不压字）。
   ③：可见合成 / 活动图层 两短标签无语义 → 常显一行短义 + 每项短注（.ed-ai-input-note/.ed-ai-input-hint）。
   ④：单图通道与参数=短表（summary 带读数）+ 折叠说明（.ed-cfg-notes），给编辑区留空间。
   高度改值由 JS 按真实几何回读（--ed-rail-reserve，editor-demo.js:7965），工具列随动不遮挡。 */
.editor-layer.ws[data-ed-demo] .ws .ed-composer,
.editor-layer.ws[data-ed-demo].ed-composer-docked [data-ed-composer] {
  flex: 0 0 auto; height: auto; min-height: clamp(150px, 20vh, 200px); max-height: 58vh; /* 矮屏自适应：800px 视口=160px，仍高于父 140px；高视口长到 200 封顶 */
}
.editor-layer.ws[data-ed-demo] .ws .ed-composer textarea {
  height: auto; min-height: 104px; flex: 1 1 auto;
}
.editor-layer.ws[data-ed-demo] .ws .ed-composer .ed-references { max-height: 44px; }
.editor-layer.ws[data-ed-demo] .ws .ed-c-tawrap > .ed-c-send,
.editor-layer.ws[data-ed-demo] .ws .ed-c-tawrap > .ed-c-send.ed-wf-run {
  flex: 0 0 34px; width: 34px; min-width: 34px; height: 34px; min-height: 34px; align-self: flex-end;
}
.editor-layer.ws[data-ed-demo] .ws .ed-ai-input-note { display: block; margin: 3px 0 2px; font-size: 10.5px; line-height: 1.45; color: var(--u6-ink-soft, #777970); }
.editor-layer.ws[data-ed-demo] .ws .ed-ai-input-note.dim { color: var(--u6-ink-soft, #8a8d84); }
.editor-layer.ws[data-ed-demo] .ws .ed-ai-input-hint { margin-left: 4px; font-size: 10px; color: var(--u6-ink-soft, #8a8d84); }
.editor-layer.ws[data-ed-demo] .ws .ed-cfg-sum { margin-left: 6px; font-size: 10px; font-weight: 400; color: var(--u6-ink-soft, #777970); }
.editor-layer.ws[data-ed-demo] .ws .ed-cfg-notes { margin-top: 4px; }
.editor-layer.ws[data-ed-demo] .ws .ed-cfg-notes > summary { cursor: pointer; font-size: 10px; color: var(--u6-ink-soft, #777970); }
.editor-layer.ws[data-ed-demo] .ws .ed-cfg-notes[open] > summary { margin-bottom: 2px; }
.editor-layer.ws[data-ed-demo] .ws .ed-ai-input-help > summary { cursor: pointer; font-size: 10px; color: var(--u6-ink-soft, #777970); }
.editor-layer.ws[data-ed-demo] .ws .ed-ai-input-help[open] > summary { margin-bottom: 2px; }

/* ===== B-POINTER-20261010（返回控件指针遮挡窄修；承接 B-REDLINE-20261010）——限 editor 命名空间 + 短屏 + 网格展开态 =====
   父真实指针反例（1360×800，冻结 555 源）：refinement.css 短屏尾段预算（B-R445）把 .recipe-batch 定为
   flex:1 1 auto / min-height:0 / overflow-y:auto，尾段可见高 196px 装不下「批量块自然高 170 + 单图配置 91」，
   批量块被内裁成 99px——而它**尾部是交互控件**：[data-recipe-return]「返回当前编辑图」rect y558..580 落进
   section 自身可视盒 416..515 之外 ⇒ 目标中心 (963,569) 处 elementFromPoint 命中相邻 cfgrow 的「执行」药丸，
   真指针永远点不到返回（父也失败，非“上层元素未新增”即无回归）。
   最小改法：仅当网格已展开（返回钮在场、非 [hidden]）时生效——
     a) 尾段 .ed-wf-foot 成为唯一滚动容器（批量块不再被父级裁剪，尾部控件按自然高铺开）；
     b) 只压掉批量块内的纯空白与重复说明（生成张数/模型分配并排、状态行行距、配置行前置内边距），
        使返回钮与配置入口无需滚动即处于尾段可视盒内；超出部分由尾段自身滚动（不再存在“不可达控件”）。
   单图（默认）态 :has() 不匹配 ⇒ 全部走冻结规则，逐像素不变。 */
@media (max-height: 820px) {
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) { flex: 0 1 auto; min-height: 0; overflow-y: auto; }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-batch { flex: 0 0 auto; min-height: 0; overflow-y: visible; padding: 2px 0; }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-batch > .recipe-quantity,
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-batch > .recipe-mode { display: inline-flex; align-items: center; vertical-align: middle; }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-batch > .recipe-mode { margin-left: 8px; }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-batch > p { margin: 1px 0; line-height: 1.4; }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-single-config .ed-cfg { padding-top: 0; }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-single-config .ed-generation-control { padding-top: 0; margin-top: 0; }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-single-config .ed-c-cfgrow { margin-top: 0; }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-single-config .ed-cfg-notes,
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-single-config .ed-cfg-sum { display: none; }
}

/* ===== B-SV-20261010（小视口窄修：907×533 六张数被遮挡）——限 editor 命名空间 + 极短板(≤720) + recipe 批量块在场 =====
   父真实指针反例（907×533 单图态，冻结 555 源，公开入口直达）：面板盒 349px 装不下自身内容 614px。
   B-R445 短屏预算把 .ed-wf-body 锁死 200px（refinement.css:4249 冻器断言），其上各块皆 flex:0 0 auto ⇒
   尾段 .ed-wf-foot（flex:0 1 auto）独自吸掉全部 164px 缺口至 **4px**，其内 .recipe-batch 被内裁到 12px
   （自然高 116px）⇒ 六张数 rect y420..445 落在自身可视盒 414..426 之外；且内容外溢到面板盒外，
   正被 rail 内 .ed-composer（z:8，y371..521）盖住 ⇒ 九宫 0/9，真实指针中心命中 textarea，真点击 4s 超时。
   为什么不改 .ed-wf-panel{overflow}:refinement.css:4263 有冻结合同「尾段上拉菜单可出面板缘不被裁切，
   唯一滚动区仍是 .ed-wf-body」——把面板变滚动容器会裁掉设置药丸的上拉菜单，故不动。
   最小改法（只此三行，均在短板媒体内）：
     a) 让被锁死的模板浏览区在最短板下先行收缩（96px≈仍见一行 64px 缩略图，自身仍可滚），
        把高度让给真正承载交互的尾段；
     b) 尾段保持「唯一滚动容器」语义（沿上一票 Fix-1），批量块按自然高铺开不再被内裁 ⇒
        六张数首行即处尾段可视盒内、无需滚动；超出部分由尾段自身滚动（末项 9 / 返回 可达）。
   长屏(>720)与无批量块的面板一字不动；实测边界：batch 可视 25px@H720 绿 / 15px@H710 红。 */
@media (max-height: 720px) {
  .editor-layer.ws[data-ed-demo] .ws:has(.ed-wf-panel .recipe-batch) .ed-wf-body { min-height: 0; max-height: 96px; }
  .editor-layer.ws[data-ed-demo] .ws:has(.ed-wf-panel .recipe-batch) .ed-wf-foot { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
  .editor-layer.ws[data-ed-demo] .ws:has(.ed-wf-panel .recipe-batch) .ed-wf-foot .recipe-batch { flex: 0 0 auto; min-height: 0; overflow-y: visible; }
}

/* ===== B-ETL-20261010（IMG-01.04 最右工具 / Argus / 规范入口 分组与避让）——纯 CSS，限 editor 命名空间 =====
   红字 ⑥（用户 Impeccable 预览标注）：「规范 思想 argus 等位置要调整，跟按钮冲突↑」。

   一次代表状态视觉评估（真宿主 Chromium，1360×800 / 1440×900 / 1920×1080 / 907×533 四尺寸实测同构）：
   三个入口（△思想 / 规规范 / A Argus，main.js:3883 floatObject）既没有自己的车道，也没有与 29 个工具钮的分组边界。
   · 态A（编辑器在场、配方面板未开 → composer display:none → image-editor-demo.js edDockSend 守卫
     `r.height < minimum` 判负 → restore() 不落停靠类）：三入口回退到 refinement.css:1276 默认块
     `position:absolute; right:12px; bottom:84px; z-index:12`，挂在 section.canvas-stage 上，
     **与 .editor-layer(z:130) 竞争根栈上下文** ⇒ 被编辑器右列整条盖住。
     实测 1360×800：floats x1306..1348 y582..716；三头 own=false（中心命中 .ed-drawing-tools / button.ed-tool /
     button.ed-tool[tool=workflow]）；与工具列相交 true；wfTop−tbBottom = **−124**（即整段落在工具列内）；
     距发送带仅 6px；三个入口真实点击全部 4s 超时 ⇒ 不可见且不可达（真缺陷，非仪器伪影）。
   · 态B（配方面板打开 = 代表性态，ed-composer-docked）：停靠生效 → z:131，三头 own=true，
     与工具列/发送/模式下拉均不相交，但仍与 29 个工具钮**同处 vw−66..vw−20 这一条 46px 竖列**，
     紧贴末位工具与发送钮，两侧无分隔 ⇒ 用户所读「跟按钮冲突」。

   避让关系（几何饱和，故只让位不改停靠几何）：面板右缘 = vw−76、rail 左缘 = vw−66 ⇒ 右侧仅余 10px 天沟，
   composer 正文带 (x916..1272) 占满面板下带 ⇒ 态B 无处可迁，只能**成组**；态A 必须**给车道**。
   全部锚点为视口相对常量（与尺寸无关，四尺寸实测一致）：
     .ws 底 = vh−10；rail 列 x = [vw−66, vw−20]（中心 vw−43）；底部动作带 h=84、顶 = vh−104；
     未停靠工具列底 = vh−94（= .ws 底 −84）。
   车道：W 固定 32px 列，右缘 vw−27（与态B 停靠列实测右缘 1333 逐像素一致）⇒ 列心 = vw−43 = rail 中心。
   避让：W 底 = vh−114（距动作带顶 10px）、W 顶 = vh−230（3×32 + 2×10 = 116 自然高）；
         未停靠工具列底抬到 vh−240（距 W 顶 10px）⇒ 三处 10px 净空、零相交。
   成组：三头共用一枚岛面（::before，inset −4/−3，pointer-events:none，z-index:-1 只画在 W 盒内）
         把「三个入口」与「工具钮」在视觉上分区；态B 沿用同一岛面 ⇒ 两态同一分组身份、零布局代价。
   影响面：仅 .work-floats（三入口）+ 未停靠态 .ed-toolbar 底界；停靠态几何一字不动（JS 发值链不变）；
           canvas 视图无 .editor-layer ⇒ :has() 不匹配（closeEditor→render 整段 innerHTML 替换，main.js:4802/4493），
           故画布视图 right:12px/bottom:84px/z:12 原样。 */
.app-frame:has(.editor-layer.ws[data-ed-demo]) .canvas-stage .work-floats:not(.ed-composer-actions) {
  position: fixed; left: auto; right: 27px; top: auto; bottom: 114px;
  width: 32px; align-items: center; z-index: calc(var(--z-editor-actions, 131) + 1);
}
.app-frame:has(.editor-layer.ws[data-ed-demo]) .canvas-stage .work-floats:not(.ed-composer-actions) .float-head {
  position: relative; width: 32px; height: 32px; box-sizing: border-box; padding: 3px; flex: 0 0 32px;
}
.app-frame:has(.editor-layer.ws[data-ed-demo]) .canvas-stage .work-floats:not(.ed-composer-actions) .float-label {
  position: absolute; right: calc(100% + 4px); margin-left: 0; padding: 0;
  background: var(--surface); border-radius: var(--r-ctl);
}
.editor-layer.ws[data-ed-demo]:not(.ed-composer-docked) .ws .ed-toolbar { bottom: 230px; }
.app-frame:has(.editor-layer.ws[data-ed-demo]) .canvas-stage .work-floats::before {
  content: ''; position: absolute; inset: -4px -3px; z-index: -1; pointer-events: none;
  border-radius: var(--r-card, 10px); background: var(--surface);
  border: 1px solid var(--u6-line, #d8d7d0); box-shadow: var(--sh-rest);
}

/* ===== B-PARAMPOINTER-20261010（IMG-08 高级参数弹层 width/height/steps/seed 指针不可达窄修）
   ——纯 CSS，限 editor 命名空间 + 上拉菜单打开态 =====
   红字项（续 A 票 author-freeze/REPORT.md §5.4 OPEN：数字输入 locator.click 中心 6s 超时，根因未定位）。
   真宿主 1360×800 / 1440×900 / 1920×1080 三尺寸复现，几何同构 ⇒ 非偶发、非短屏媒体、非仪器：
     · 真实指针点「设置」药丸 [data-ed-topt="cfg-adv"] 可开（own=true），弹层 .ed-cfg-pop 实测 224×300
       （宽由 JS image-editor-demo.js:3493 写 min(224,row.width)；高由 :3494 写 min(300, tg.top-ws.top-10)，
       即「向上展开 + 按 .ws 顶部避让」）；
     · 弹层的**包含块是配置行 .ed-c-cfgrow**（bottom:32px 实测 557 = 行盒底 589−32，left:132 = min(…, row.width−224)），
       而该行位于 refinement.css:5410 的 `.recipe-single-config[open]{max-height:160px;overflow:auto}` 之内
       ⇒ 绝对定位子元素被这个裁剪容器按自身盒（实测 y511..608，高 97）裁掉顶部 254px；
     · 后果：width/height/steps/seed 四输入（y315/362/409/456…）整体落在裁剪区外，
       elementFromPoint 在其中心返回 aside.ed-wf-panel / section.recipe-batch（面板本体）而非输入框，
       Playwright 中心点击 6s 超时；唯一「半露」的 resolution select（y503..527，中心 515 恰在 511 之下）可点 ⇒
       裁剪边界与判据吻合，非 z-index、非 viewport 外、非滚动不足（scrollIntoViewIfNeeded 实测无效，弹层盒不变）。
   与既有冻结合同一致：refinement.css:4263 的合同写明「尾段上拉菜单可出面板缘不被裁切，唯一滚动区仍是 .ed-wf-body」，
   本条 5410 的 overflow:auto 恰是该合同的反例；故本修法只是让菜单回到合同语义。
   **最小改法**：仅当配置详情块 [open] 且其内确有上拉菜单已打开（:has(.ed-topt-pop:not([hidden]))）时，
   把裁剪解除（overflow:auto → visible）。**max-height:160px 一字不动** ⇒ 弹层未开时逐像素同冻结态；
   弹层打开时行盒/足迹亦不变（实测 .recipe-single-config scrollHeight ≤ clientHeight，本就不可滚，overflow 值不影响布局），
   只移除对绝对定位菜单的裁切。菜单关闭（JS :3491 edToptClose 置 hidden）⇒ :has() 不匹配 ⇒ 立即复原。
   影响面：仅 .recipe-single-config[open] 且菜单打开态的裁剪；.ed-wf-body 仍是唯一滚动区；工具车道/native/保存链零触碰。 */
.editor-layer.ws[data-ed-demo] .ws .recipe-single-config[open]:has(.ed-topt-pop:not([hidden])) {
  overflow: visible;
}

/* ===== B-GRIDRET-PRESERVE-20261010（907×533 网格开态：返回真可点，且**不吞**状态文字与模板区）——限 editor 命名空间 + 极短板(≤650) + 网格展开态 =====
   承接上一票（b-short-grid-return-20261010）被判 HOLD 的 UX 回退：那一版靠 `display:none` 掉状态行
   p[data-recipe-status]、并把 .ed-wf-body 压成 0（该区含**交互**模板卡，不是"非交互空白"）⇒ 拒发/忙碌/结果
   反馈与模板入口被吞。**本版零隐藏**：不改 display / visibility / max-height:0，两区都不吞。
   父真实指针反例（907×533，冻结 r6 源，同态复现）：网格展开后 .ed-wf-foot 可视盒仅 45px，而它要滚的内容
   高 242px（.recipe-batch 自然高 171px，尾部即返回钮，其后还有逐图配置）⇒ 返回钮 rect (523,457,93,22)
   落在面板盒 (511,12,320,349) 之外、正处 docked .ed-composer(511,371,320,150,z:8) 区间，中心 (570,468)
   命中其 textarea(523,389,296,124)——真指针永远点不到（需要先把尾段滚 ~105px 才露出来）。
   最小改法（只此两处，均在短板媒体内、且仅网格展开态 :has() 匹配）：
     a) 尾段（refinement.css:4248 起、B-POINTER 起已是 scroll container）内，把返回钮
        `position: sticky; bottom: 0` 钉在该 scrollport 底缘 ⇒ 无需滚动即落在可视窗内
        （底边 351 < composer 顶边 371），真指针与中心命中都在按钮自身；给出不透明底色避免与其下滚动内容
        叠字。批量块其余内容（六张数 / 三模式 / 逐图来源 / **状态文字**）仍按自然高留在尾段滚动里。
     b) 把 B-SV 锁的模板浏览区从 96px 收到 **64px**（=一行模板缩略图的高，仍是可滚区，卡片照旧可滚可点），
        让出的 32px 给尾段 ⇒ 可视窗 45→77px，**状态行 46px 与返回钮 22px 可同时上屏**
        （状态行上缘 ~290、返回钮 329..351，仅底部 7px 视觉相邻）。
   为什么不隐藏：状态行是真实反馈口（实测静息态已带产品文本「逐图分配已就绪：点「发送」…」），
   模板区是交互入口；两个 HOLD 理由都在本版**不成立**，且由仪器以「computed 未吞 + 真实滚达 + 中心命中」
   三判据实测，不只查 DOM 存在。
   sticky 的边界（诚实披露）：sticky 永不出其包含块（.recipe-batch）；用户把尾段滚到底时返回钮会随之
   上移出窗（自然态与常规滚动区内不受影响，Sol 复跑的自然态即本修法目标态）。
   影响面：仅 ≤650px 高且网格展开（返回钮非 [hidden]）；网格收起或 ≥660px 时 :has() 不匹配 ⇒ 逐像素回冻结态。
   实测边界（907 宽扫高度，冻结 r6 源）：533/600/640 红 · 660/700 绿 ⇒ 仍取 650 为界。 */
@media (max-height: 650px) {
  .editor-layer.ws[data-ed-demo] .ws:has(.ed-wf-panel .recipe-batch > [data-recipe-return]:not([hidden])) .ed-wf-body {
    min-height: 64px;
    max-height: 64px;
  }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-batch > [data-recipe-return] {
    position: sticky;
    bottom: 0;
    background: var(--u6-paper, #f4f2ea);
    box-shadow: 0 -8px 10px -8px rgba(0, 0, 0, .22);
  }
}

/* =====================================================================================
   N360（2026-10-10 蒋哥票 b-editor-narrow360-20261010）：360x800 窄窗 rail 离屏修（纯 CSS 追加，≤640 宽生效）。
   已具名反例（冻结 r7 板，真宿主 Chromium 360x800，真鼠标）：JS 注入规则 image-editor-demo.js:3589-3594
   给 .ws --ed-recipe-width:320px（≤1000 宽），image-editor-demo.js:3591 又写
   .ws[data-ed-wf-open] .ed-rail{width:var(--ed-recipe-width)}，而 .ed-rail 为 right:66px 右锚（uiopt-r4:116）；
   同一时刻 .ws(role=dialog) 在 360 只有 left:74px/right:10px ⇒ 276 宽且 overflow:hidden
   ⇒ rail 左缘 = 74+276-66-320 = -36，**比容器左缘再向左 110px 出屏并被裁**：
     rail [-36,12,320,776] · .ed-wf-panel [-36,12,320,606] · .ed-composer [-36,628,320,160] · textarea x=-24；
   「效果图模板」tile 中心 (11,88) 命中 section.canvas-stage 而非自身 ⇒ 真实点击不生效，
   data-wf-view 停在 list ⇒ 6 个张数、返回、状态行、模板条**全部不在 DOM**（不是被藏，是那一屏根本没渲染）。
   修法①：给 rail 一个只有装不下时才咬合的宽度上限——rail 右缘已由 right:66px 钉在 ws 右缘内，
   故 max-width:calc(100% - 66px) 在 ws ≥ 386px 时**恒惰性**（907/1360 实测几何逐字段不变），
   在 360 下把 rail 收成 210px（=276-66）与 ws 左缘齐平，面板/输入框整体回到屏内。
   修法②：同票要求「返回/发送中心不被覆盖」。360 下网格展开时尾段窗口只有 179px 而 .recipe-batch 自然高 297px，
   返回钮落在窗尾、正好被停靠的 .ed-composer（顶 628）盖住（中心命中 div.ed-composer，own=false，真实点击关不掉网格）
   ——与 907x533 已发布修法**同因同解**，故逐字复用其两条声明（模板条 96→64 让出 32px、返回 sticky bottom:0），
   仅把生效条件从 (max-height:650px) 扩到 (max-width:640px)：640 覆盖上述 vw-84 < rail+66 的整个窄带
   （340/320+66 需 vw≥470），且 907/1360 两保护腿宽度 >640 ⇒ 本块对它们零生效。
   不隐藏任何东西（零 display:none/visibility:hidden/max-height:0 于反馈面）；不动 JS、不动生成协议、不动 r7 既有规则。 */
@media (max-width: 640px) {
  .editor-layer.ws[data-ed-demo] .ws .ed-rail {
    max-width: calc(100% - 66px); /* 与 .ed-rail 既有 right:66px 配对：装不下才收，装得下恒零影响 */
  }
  .editor-layer.ws[data-ed-demo] .ws:has(.ed-wf-panel .recipe-batch > [data-recipe-return]:not([hidden])) .ed-wf-body {
    min-height: 64px;
    max-height: 64px;
  }
  .editor-layer.ws[data-ed-demo] .ws .ed-wf-foot:has(.recipe-batch > [data-recipe-return]:not([hidden])) .recipe-batch > [data-recipe-return] {
    position: sticky;
    bottom: 0;
    background: var(--u6-paper, #f4f2ea);
    box-shadow: 0 -8px 10px -8px rgba(0, 0, 0, .22);
  }
}
