/* 工作台：无限画布 + 分镜条 + 底部统一提示条。
   形态照 Google Flow 那套：一条提示条发起所有生成，结果落成片段卡，
   片子的顺序由分镜条表达——不用连线，所以节点再多也不会变成意大利面。 */

/* 画布要占满视口，所以 flow 页签激活时把 #app 改成纵向 flex；
   header 的 sticky 在 flex 容器里没意义，压成 static。 */
body.flowon{overflow:hidden}
body.flowon #app{height:100vh;height:100dvh;display:flex;flex-direction:column}
body.flowon header{position:static;flex:0 0 auto}
body.flowon .tabbar{flex:0 0 auto}
#pane-flow{--library-width:248px;--dock-height:190px;flex:1;min-height:0;position:relative;display:flex;flex-direction:column}

.fw{flex:1;min-height:0;display:grid;grid-template-columns:var(--library-width) minmax(0,1fr)}
.fw-canvas{display:flex;flex-direction:column;min-height:0;overflow:hidden}
.fw-toolbar{display:flex;align-items:center;gap:8px;flex:0 0 48px;padding:0 20px;
  background:var(--surf);border-bottom:1px solid var(--line)}
.fw-toolbar h2,.fw-ing-hd h2{font-size:13px;font-weight:600;margin:0;color:var(--fg)}
.fw-count{min-width:20px;padding:0 5px;border-radius:4px;text-align:center;
  color:var(--dim);background:var(--hole);font-size:11px;font-variant-numeric:tabular-nums}
.fw-divider{width:1px;height:16px;background:var(--line);margin:0 5px}
.fw-mobile,.fw-scrim{display:none}

/* ---------- 左：素材库（Flow 的 ingredients：角色 / 场景 / 道具） ---------- */
.fw-ing{display:flex;flex-direction:column;min-height:0;padding:0 16px;gap:16px;
  background:var(--surf);border-right:1px solid var(--line)}
.fw-ing-hd{display:flex;align-items:center;gap:8px;min-height:48px;flex-shrink:0;color:var(--dim)}
.fw-ing-list{flex:1;min-height:0;overflow-y:auto;display:flex;flex-wrap:wrap;
  gap:10px;align-content:flex-start;padding:2px;overscroll-behavior:contain}
.fw-ing-list::-webkit-scrollbar{width:8px}
.fw-ing-list::-webkit-scrollbar-track{background:transparent}
.fw-ing-list::-webkit-scrollbar-thumb{background:var(--lo);border-radius:99px}
.fw-ing-empty{width:100%;color:var(--ph);font-size:12px;text-align:center;
  padding:36px 8px;display:flex;flex-direction:column;align-items:center;gap:12px}
.fw-ing-empty .ui-icon{width:30px;height:30px;opacity:.7}
.fw-ing-footer{padding:12px 0;border-top:1px solid var(--line);font-size:11px;color:var(--dim);flex-shrink:0}

/* 两列方块。不用 grid + aspect-ratio：Chrome 排网格行高时把卡片的内在高度算成 0，
   容器高度被平均分给每一行，卡片一张压一张。换成 flex 换行 + padding 撑高就没这个问题 */
.ing{position:relative;width:calc(50% - 5px);flex:0 0 auto;border-radius:6px;overflow:hidden;cursor:pointer;
  background:var(--hole);box-shadow:0 0 0 1px var(--line);transition:box-shadow .15s}
.ing::before{content:"";display:block;padding-top:100%}
.ing>img,.ing>video,.ing>.ic{position:absolute;inset:0;width:100%;height:100%}
.ing img,.ing video{object-fit:cover;display:block}
.ing-dur{position:absolute;left:5px;top:5px;padding:1px 6px;border-radius:9px;background:rgba(0,0,0,.55);color:#fff;font-size:10px;font-variant-numeric:tabular-nums}
.ing .ic.broken{color:var(--dim);font-size:11px}
.ing .ic.broken .ui-icon{width:22px;height:22px;opacity:.6}
.ing .ic.broken b{font-weight:400;font-size:11px}
.ing.on{box-shadow:0 0 0 2px var(--acc)}
.ing .n{position:absolute;left:0;right:0;bottom:0;padding:3px 5px;font-size:10px;
  color:#fff;background:linear-gradient(transparent,rgba(0,0,0,.7));
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ing .x{position:absolute;top:2px;right:2px;width:17px;height:17px;border-radius:50%;
  border:0;cursor:pointer;font:inherit;font-size:11px;line-height:1;
  background:rgba(0,0,0,.5);color:#fff;opacity:0;transition:opacity .15s}
.ing:hover .x,.ing:focus-within .x{opacity:1}
/* 选中时左上角标出它是第几张，和提示词里的 <Picture N> 对得上 */
.ing .i{position:absolute;top:3px;left:3px;min-width:16px;height:16px;border-radius:5px;
  font-size:10px;font-weight:700;line-height:16px;text-align:center;padding:0 3px;
  background:var(--acc);color:var(--on-accent)}

/* ---------- 中：无限画布 ---------- */
.fw-stage{flex:1;min-height:0;position:relative;overflow:hidden;outline:none;
  background-color:var(--bg);
  background-image:radial-gradient(circle at 1px 1px, var(--grid) 1px, transparent 0);
  background-size:24px 24px;
  cursor:grab;touch-action:none}
.fw-stage.pan{cursor:grabbing}
.fw-stage.drop{box-shadow:inset 0 0 0 2px var(--acc)}
.fw-stage:focus-visible{box-shadow:inset 0 0 0 2px var(--acc)}
.fw-world{position:absolute;left:0;top:0;transform-origin:0 0;will-change:transform}

.fw-hint{position:absolute;inset:0 16px calc(var(--dock-height) + 40px);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;
  text-align:center;color:var(--ph);pointer-events:none;overflow:hidden}
.fw-empty-icon{width:48px;height:48px;flex-shrink:0;opacity:.7}
.fw-hint h3{font-size:16px;font-weight:550;color:var(--dim);margin:0}
.fw-hint .mini{pointer-events:auto}

.fw-zoom{display:flex;align-items:center;gap:2px;font-size:11px;color:var(--dim)}
.fw-zoom button{width:30px;height:30px;padding:0;border:0;border-radius:5px;
  display:grid;place-items:center;cursor:pointer;background:transparent;color:var(--dim)}
.fw-zoom button:hover{color:var(--fg);background:var(--hole)}
.fw-zoom button:disabled{opacity:.35;cursor:default}
#fw-scale{width:46px;text-align:center;font-variant-numeric:tabular-nums}

/* ---------- 片段卡 ---------- */
.clip{position:absolute;left:0;top:0;width:264px;border-radius:8px;overflow:hidden;
  background:var(--surf);border:1px solid var(--line);box-shadow:0 3px 12px var(--lo);
  cursor:grab;user-select:none}
.clip:not(.aud){height:338px;display:flex;flex-direction:column}
.clip:not(.aud) .cv{flex:0 0 auto}
.clip.drag{cursor:grabbing;z-index:5;box-shadow:8px 8px 20px var(--lo), -8px -8px 20px var(--hi)}
.clip.on{box-shadow:0 0 0 2px var(--acc), 6px 6px 14px var(--lo)}
.clip:focus-visible{outline:2px solid var(--acc);outline-offset:3px}
.clip .cv{position:relative;background:var(--hole);aspect-ratio:16/9;overflow:hidden}
.clip .cv img,.clip .cv video{width:100%;height:100%;object-fit:contain;display:block}
.clip .cv .ph{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:9px;color:var(--ph);font-size:11.5px}
.clip .cv .bar{width:70%;height:6px;border-radius:4px;overflow:hidden;
  box-shadow:inset 2px 2px 4px var(--lo), inset -2px -2px 4px var(--hi)}
.clip .cv .bar i{display:block;height:100%;width:0;border-radius:4px;
  background:linear-gradient(90deg,var(--acc),var(--acc-d));transition:width .5s}
.clip .cv .play{position:absolute;inset:0;display:grid;place-items:center;cursor:pointer}
.clip .cv .play span{width:40px;height:40px;border-radius:50%;background:rgba(255,255,255,.82);
  display:grid;place-items:center;box-shadow:0 3px 10px rgba(0,0,0,.22)}
.clip .cv .play span::after{content:"";border-left:12px solid var(--acc-d);
  border-top:8px solid transparent;border-bottom:8px solid transparent;margin-left:3px}

.clip .cb{padding:12px;display:flex;flex-direction:column;gap:9px;flex:1}
.clip .cp{font-size:12px;line-height:1.65;color:var(--fg);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.clip .cm{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:10.5px;color:var(--ph)}
.clip .st{padding:2px 7px;border-radius:4px;background:var(--hole);box-shadow:none}
.clip .st.done{color:var(--ok)} .clip .st.running{color:var(--acc)}
.clip .st.pending{color:var(--warn)} .clip .st.draft{color:var(--warn)}
.clip .st.failed{color:var(--bad)}

/* 预留操作条高度，悬停时显现按钮不会推大卡片或遮住下一排。 */
.clip .ca{display:flex;gap:5px;flex-wrap:wrap;align-content:start;flex:0 0 66px;margin-top:auto;
  opacity:0;visibility:hidden;transition:opacity .15s}
.clip:hover .ca,.clip.on .ca,.clip:focus-within .ca{opacity:1;visibility:visible}
.clip.aud .ca{flex-basis:30px}
.clip .ca button{font:inherit;font-size:10.5px;padding:4px 8px;border:1px solid var(--line);border-radius:5px;
  cursor:pointer;background:var(--surf);color:var(--dim);box-shadow:none}
.clip .ca button:hover{color:var(--acc)}
.clip .ca button:active{box-shadow:inset 2px 2px 4px var(--lo), inset -2px -2px 4px var(--hi)}
.clip .ca button.del:hover{color:var(--bad)}
.clip .ca button:disabled{color:var(--ph);cursor:default;box-shadow:none}

/* 续拍出来的片段，用一条线连回源片段。只有这一种连线——它表示「时间上接着」，
   不是数据流，所以不会像节点图那样连成一团。 */
.fw-link{position:absolute;left:0;top:0;pointer-events:none;overflow:visible}
.fw-link path{fill:none;stroke:var(--acc);stroke-width:2;opacity:.34}
.fw-link path.jump{stroke-dasharray:5 4;opacity:.28}

/* ---------- 分镜条 ---------- */
/* ---------- 悬浮 dock：分镜条 + 提示条 ---------- */
/* 生成栏在画布内部居中，左侧留出素材库。 */
.fw-dock{position:absolute;left:calc(var(--library-width) + 24px);right:24px;bottom:24px;z-index:10;
  max-width:960px;margin-inline:auto;max-height:calc(100% - 64px);overflow-y:auto;
  display:flex;flex-direction:column;gap:10px;pointer-events:none}
.fw-dock > *{pointer-events:auto}

/* 磨砂：半透明底 + backdrop-filter。先给一个不透明的 background 兜底，
   老浏览器不支持 backdrop-filter 时至少不会变成一块透明的看不清的东西。 */
.fw-glass{background:var(--surf);background:color-mix(in srgb,var(--surf) 96%,transparent);
  backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  border:1px solid var(--line);box-shadow:0 8px 28px rgba(0,0,0,.07)}
html[data-theme="dark"] .fw-glass{box-shadow:0 8px 28px rgba(0,0,0,.24)}

.fw-scene{flex:0 0 auto;padding:9px 14px;border-radius:8px}
.fw-scene-hd{display:flex;align-items:center;gap:9px;margin-bottom:9px;
  font-size:12px;color:var(--dim);font-weight:600}
.fw-scene-hd .hint{font-weight:400;color:var(--ph);font-size:11.5px}
.fw-scene-hd .spacer{flex:1}
.fw-scene-hd button{font:inherit;font-size:11px;padding:4px 8px;border-radius:5px;
  cursor:pointer;color:var(--dim);
  background:color-mix(in srgb, var(--hole) 45%, transparent);
  border:1px solid color-mix(in srgb, var(--line) 60%, transparent)}
.fw-scene-hd button:hover:not(:disabled){color:var(--bad)}
.fw-scene-hd button:disabled{opacity:.45}
.fw-scene-row{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;min-height:0;
  align-items:stretch}
.fw-scene.empty .fw-scene-row{display:none}
.fw-scene-hd{margin-bottom:0}
.fw-scene:not(.empty) .fw-scene-hd{margin-bottom:9px}
.fw-scene-row::-webkit-scrollbar{height:7px}
.fw-scene-row::-webkit-scrollbar-track{background:transparent}
.fw-scene-row::-webkit-scrollbar-thumb{background:var(--lo);border-radius:99px}
.fw-scene-empty{color:var(--ph);font-size:11.5px;align-self:center;padding-left:2px}

.sc{position:relative;flex:0 0 auto;width:92px;border-radius:6px;overflow:hidden;
  cursor:grab;background:var(--hole);
  box-shadow:3px 3px 7px var(--lo), -3px -3px 7px var(--hi)}
.sc.drag{opacity:.45;cursor:grabbing}
.sc.over{box-shadow:0 0 0 2px var(--acc)}
.sc img{width:100%;height:44px;object-fit:cover;display:block}
.sc .n{position:absolute;top:2px;left:3px;font-size:9.5px;font-weight:700;color:#fff;
  text-shadow:0 1px 3px rgba(0,0,0,.8)}
.sc .d{font-size:9.5px;color:var(--dim);text-align:center;padding:2px 0 3px}
.sc .x{position:absolute;top:2px;right:2px;width:15px;height:15px;border-radius:50%;border:0;
  cursor:pointer;font-size:10px;line-height:1;background:rgba(0,0,0,.5);color:#fff;
  opacity:0;transition:opacity .15s}
.sc:hover .x{opacity:1}

/* ---------- 底部统一提示条：所有生成都从这里发起 ---------- */
.fw-bar{flex:0 0 auto;padding:16px;border-radius:8px}
.fw-bar:focus-within{border-color:color-mix(in srgb,var(--acc) 50%,var(--line))}

/* 续拍 / 跳转模式：把接的是哪一条、接的哪一帧摆出来，不然人不知道自己在什么上下文里 */
.fw-ctx{display:flex;align-items:center;gap:10px;margin-bottom:10px;padding:8px 11px;
  border-radius:6px;font-size:11.5px;color:var(--dim);
  background:color-mix(in srgb, var(--acc) 9%, transparent);
  border:1px solid color-mix(in srgb, var(--acc) 28%, transparent)}
.fw-ctx img{width:56px;height:32px;object-fit:cover;border-radius:7px;flex:0 0 auto;
  background:var(--hole)}
.fw-ctx b{color:var(--acc);font-weight:650}
.fw-ctx .spacer{flex:1}
.fw-ctx button{font:inherit;font-size:11px;padding:4px 10px;border:0;border-radius:8px;
  cursor:pointer;background:var(--surf);color:var(--dim);
  box-shadow:2px 2px 5px var(--lo), -2px -2px 5px var(--hi)}
.fw-ctx button:hover{color:var(--bad)}

.fw-chips{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:9px}
.fw-chips:empty{display:none}
.fw-chips.off .fw-chip{opacity:.38}
.fw-chip-note{font-size:11px;color:var(--warn);align-self:center;line-height:1.5}
.fw-chip{display:flex;align-items:center;gap:6px;padding:3px 7px 3px 4px;border-radius:5px;
  font-size:11px;color:var(--dim);
  background:color-mix(in srgb, var(--hole) 45%, transparent);
  border:1px solid color-mix(in srgb, var(--line) 55%, transparent)}
.fw-chip img{width:22px;height:22px;object-fit:cover;border-radius:6px}
.fw-chip button{border:0;background:transparent;color:var(--ph);cursor:pointer;
  font:inherit;font-size:12px;line-height:1;padding:0 2px}
.fw-chip button:hover{color:var(--bad)}

.fw-row{display:flex;align-items:flex-end;gap:10px}
/* 提示词框是 contenteditable 不是 textarea——要在文字中间显示素材缩略图 */
.fw-input{flex:1;min-width:0;min-height:64px;max-height:150px;overflow-y:auto;
  background:transparent;color:var(--fg);outline:none;border:0;border-radius:0;
  padding:6px 0;font:inherit;font-size:14px;line-height:1.7;
  white-space:pre-wrap;word-break:break-word;
  transition:border-color .15s, background .15s}
.fw-input:focus{background:transparent}
.fw-input:empty::before{content:attr(data-ph);color:var(--ph);pointer-events:none}
.fw-input::-webkit-scrollbar{width:7px}
.fw-input::-webkit-scrollbar-thumb{background:var(--lo);border-radius:99px}

/* 素材标签：整体是一个原子（contenteditable=false），退格一次就整块删掉 */
.pref{display:inline-flex;align-items:center;gap:3px;vertical-align:-4px;
  margin:0 2px;padding:1px 5px 1px 2px;border-radius:8px;user-select:none;
  background:color-mix(in srgb, var(--acc) 14%, transparent);
  border:1px solid color-mix(in srgb, var(--acc) 45%, transparent)}
.pref img{width:18px;height:18px;object-fit:cover;border-radius:5px;display:block}
.pref i{font-style:normal;font-size:10.5px;font-weight:700;color:var(--acc);line-height:1}
/* 对不上素材的编号：原样留着文字，标红，别显示成图 */
.pref.off{background:color-mix(in srgb, var(--bad) 12%, transparent);
  border-color:color-mix(in srgb, var(--bad) 40%, transparent);
  color:var(--bad);font-size:11.5px;padding:1px 6px;vertical-align:0}
/* 卡片上的那份小一号，行高别被撑开 */
.clip .cp .pref{vertical-align:-3px;padding:1px 4px 1px 1px}
.clip .cp .pref img{width:15px;height:15px}

.fw-go{flex:0 0 88px;width:88px;min-height:40px;border:0;border-radius:6px;padding:8px 16px;cursor:pointer;
  font:inherit;font-size:13px;font-weight:650;color:var(--on-accent);background:var(--acc)}
.fw-go:hover:not(:disabled){filter:brightness(.94)}
.fw-go:active:not(:disabled){filter:brightness(.94)}
.fw-go:disabled{background:var(--hole);color:var(--ph);cursor:default}

.fw-opts{display:flex;align-items:center;gap:6px;margin-top:12px;padding-top:12px;
  border-top:1px solid var(--line);flex-wrap:wrap}
.fw-opts select{width:auto;color:var(--fg);outline:none;
  background:transparent;border:1px solid var(--line);box-shadow:none;
  border-radius:5px;padding:6px 24px 6px 8px;font:inherit;font-size:11px;min-height:32px;max-width:100%;
  appearance:none;cursor:pointer}
.fw-opts select:hover{border-color:color-mix(in srgb, var(--acc) 45%, transparent)}
.fw-opts select option{background:var(--surf);color:var(--fg)}
.fw-opts .sw2{position:relative}
.fw-opts .sw2::after{content:"";position:absolute;right:10px;top:50%;width:5px;height:5px;
  margin-top:-3px;border-right:1.5px solid var(--ph);border-bottom:1.5px solid var(--ph);
  transform:rotate(45deg);pointer-events:none}
.fw-opts .spacer{flex:1}
.fw-est{font-size:11.5px;color:var(--ph);white-space:nowrap}
.fw-est b{color:var(--acc);font-weight:650}

/* ---------- AI 辅助：润色按钮、设置齿轮、弹窗 ---------- */
.fw-ing-btns{display:flex;gap:6px;flex-shrink:0}
.fw-ing-btns .mini{flex:1;min-width:0}

.fw-ai{flex:0 0 auto;width:40px;height:40px;border-radius:6px;cursor:pointer;font-size:17px;
  line-height:1;color:var(--dim);
  background:var(--hole);border:1px solid transparent;
  transition:color .15s, border-color .15s, transform .15s}
.fw-ai:hover:not(:disabled){color:var(--acc);
  border-color:color-mix(in srgb, var(--acc) 50%, transparent)}
.fw-ai:disabled{opacity:.5;cursor:default}
.fw-ai.busy{animation:fwpulse 1s ease-in-out infinite}
@keyframes fwpulse{50%{opacity:.45;transform:scale(.93)}}

.fw-undo{width:32px;height:32px;display:grid;place-items:center;padding:0;border-radius:5px;cursor:pointer;
  color:var(--warn);background:transparent;
  border:1px solid color-mix(in srgb, var(--warn) 40%, transparent)}
.fw-undo:hover{background:color-mix(in srgb, var(--warn) 12%, transparent)}

.fw-gear{width:32px;height:32px;border-radius:5px;cursor:pointer;flex:0 0 auto;display:grid;place-items:center;padding:0;
  color:var(--dim);background:transparent;border:1px solid transparent}
.fw-gear:hover{color:var(--acc);border-color:color-mix(in srgb, var(--acc) 40%, transparent)}
.fw-gear.on{background:var(--soft);color:var(--acc)}

.fw-modal{position:fixed;inset:0;z-index:60;display:grid;place-items:center;
  background:rgba(0,0,0,.28);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px)}
.fw-modal-box{width:min(520px, calc(100% - 32px));max-height:calc(100% - 40px);overflow-y:auto;
  border-radius:8px;padding:24px;overscroll-behavior:contain}
.fw-modal-box::-webkit-scrollbar{width:8px}
.fw-modal-box::-webkit-scrollbar-thumb{background:var(--lo);border-radius:99px}
.fw-modal-body h3{margin:0 0 4px;font-size:15.5px;font-weight:650;color:var(--fg)}
.fw-modal-body label{display:block;font-size:11.5px;color:var(--dim);margin:14px 0 6px;font-weight:600}
.fw-modal-body input,.fw-modal-body textarea,.fw-modal-body select{width:100%;font:inherit;
  font-size:13px;color:var(--fg);border-radius:6px;padding:10px 12px;outline:none;
  background:color-mix(in srgb, var(--hole) 55%, transparent);
  border:1px solid color-mix(in srgb, var(--line) 70%, transparent)}
.fw-modal-body textarea{min-height:84px;resize:vertical;line-height:1.55}
.fw-modal-body select{appearance:none;cursor:pointer}
.fw-modal-body input:focus,.fw-modal-body textarea:focus{
  border-color:color-mix(in srgb, var(--acc) 55%, transparent)}
.fw-modal-body input::placeholder,.fw-modal-body textarea::placeholder{color:var(--ph)}
.fw-m-note{font-size:11.5px;color:var(--hint);line-height:1.65;margin-top:8px}
.fw-m-two{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.fw-m-two label{margin-top:14px}
.fw-m-row{display:flex;align-items:center;gap:9px;margin-top:18px}
.fw-m-row .spacer{flex:1}
.fw-m-msg{font-size:11.5px;color:var(--ok);min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;max-width:210px}
.fw-m-msg.bad{color:var(--bad)}
.fw-m-go{font:inherit;font-size:13px;font-weight:650;padding:9px 20px;border:0;border-radius:6px;
  cursor:pointer;color:var(--on-accent);background:var(--acc)}
.fw-m-go:disabled{background:var(--lo);color:var(--ph);cursor:default;box-shadow:none}

/* ---------- 设置弹窗：分组 + 自动填充 ---------- */
/* Chrome 的自动填充会强行刷一层亮底色（暗色模式下就是截图里那块白），
   它用的是浏览器内部样式，改 background 盖不掉，只能拿 inset 阴影糊过去。 */
.fw-modal-body input:-webkit-autofill,
.fw-modal-body input:-webkit-autofill:hover,
.fw-modal-body input:-webkit-autofill:focus,
.fw-modal-body input:-webkit-autofill:active{
  -webkit-text-fill-color:var(--fg);
  -webkit-box-shadow:0 0 0 60px var(--hole) inset;
  caret-color:var(--fg);
  border-radius:6px;
  /* 顺带把它的背景过渡拖到天荒地老，某些版本靠这个才压得住 */
  transition:background-color 99999s ease-in-out 0s}

/* 暗色下那几个框原来的边框几乎看不见，单独提一档对比 */
html[data-theme="dark"] .fw-modal-body input,
html[data-theme="dark"] .fw-modal-body textarea,
html[data-theme="dark"] .fw-modal-body select{
  background:rgba(0,0,0,.24);border-color:rgba(255,255,255,.13)}
html[data-theme="dark"] .fw-modal-body input:focus,
html[data-theme="dark"] .fw-modal-body textarea:focus{
  border-color:color-mix(in srgb, var(--acc) 70%, transparent);
  background:rgba(0,0,0,.3)}

.fw-m-grp{margin-top:20px;padding:16px 0 0;border-top:1px solid var(--line)}
.fw-m-grp-hd{display:flex;align-items:baseline;gap:8px;
  font-size:12.5px;font-weight:700;color:var(--fg)}
.fw-m-grp-hd span{font-size:11px;font-weight:400;color:var(--ph)}
.fw-m-grp .fw-m-row{margin-top:12px}
.fw-modal-body .fw-m-grp label{margin-top:12px}
/* 复选框那行要横过来，压掉 label 默认的 block + 上边距 */
.fw-modal-body .fw-m-same{display:flex;align-items:center;gap:8px;margin:12px 0 0;
  cursor:pointer;font-weight:400;color:var(--dim)}
.fw-modal-body .fw-m-same input{width:auto;padding:0;margin:0;cursor:pointer;
  accent-color:var(--acc);border:0;background:none}

/* ---------- 提示词里的 <Picture N> 对上素材就亮起来 ---------- */
.fw-chip.used{color:var(--acc);
  background:color-mix(in srgb, var(--acc) 13%, transparent);
  border-color:color-mix(in srgb, var(--acc) 55%, transparent)}
.fw-ref-bad{font-size:11px;color:var(--bad);align-self:center;line-height:1.5}

/* 复选框：浏览器默认那个在暗色下是一块白，自己画一个 */
.fw-modal-body .fw-m-same input{
  appearance:none;-webkit-appearance:none;
  width:16px;height:16px;flex:0 0 auto;position:relative;border-radius:5px;cursor:pointer;
  border:1px solid color-mix(in srgb, var(--line) 90%, transparent);
  background:color-mix(in srgb, var(--hole) 60%, transparent)}
html[data-theme="dark"] .fw-modal-body .fw-m-same input{
  border-color:rgba(255,255,255,.22);background:rgba(0,0,0,.3)}
.fw-modal-body .fw-m-same input:checked{background:var(--acc);border-color:var(--acc)}
.fw-modal-body .fw-m-same input:checked::after{
  content:"";position:absolute;left:4.5px;top:1.5px;width:4px;height:8px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
.fw-modal-body .fw-m-same input:focus-visible{outline:2px solid var(--acc);outline-offset:2px}

/* 图标按钮：用 svg 跟随 currentColor，别用彩色 emoji——那两个小黄星和整体的单色调不搭 */
.fw-ai{display:grid;place-items:center}
.fw-ai svg{display:block}
.fw-ing-btns .mini{display:inline-flex;align-items:center;justify-content:center;gap:5px}
.fw-ing-btns .mini svg{display:block;opacity:.85}

/* ---------- 生成什么：视频 / 图片 / 音频 ---------- */
.fw-kind{display:inline-flex;gap:2px;padding:3px;border-radius:6px;flex:0 0 auto;background:var(--hole)}
.fw-kind button{font:inherit;font-size:11px;padding:4px 8px;border:0;border-radius:4px;min-height:28px;
  display:inline-flex;align-items:center;justify-content:center;gap:5px;
  cursor:pointer;background:transparent;color:var(--dim);transition:color .15s}
.fw-kind .ui-icon{width:14px;height:14px}
.fw-kind button:hover{color:var(--fg)}
.fw-kind button.on{color:var(--acc);background:var(--surf);box-shadow:var(--shadow)}
.fw-kgrp{display:inline-flex;align-items:center;gap:6px;max-width:100%;flex-wrap:wrap}

/* ---------- 音频卡：和视频片段并排摆在画布上 ---------- */
.clip.aud{cursor:grab}
.clip.aud .ahd{display:flex;align-items:center;gap:7px;padding:11px 12px 0;font-size:10.5px}
.clip.aud .akind{padding:2px 9px;border-radius:99px;font-weight:650;color:var(--acc);
  background:color-mix(in srgb, var(--acc) 13%, transparent)}
.clip.aud .adur{color:var(--ph);margin-left:auto}
.clip.aud .acv{padding:11px 12px 0}
/* Chrome 的 audio 控件不跟 color-scheme 走，暗色下也是一块浅色，硬掰（invert 之类）
   只会更难看。给个圆角让它看起来像卡片自带的播放条就行。
   color-scheme 那条仍然有用——select 的下拉菜单和滚动条是跟着走的。 */
.clip.aud audio{width:100%;height:34px;display:block;border-radius:10px}
.clip.aud video{width:100%;border-radius:10px;display:block}
.clip.aud .aph{display:flex;flex-direction:column;align-items:center;gap:9px;
  padding:18px 0 14px;color:var(--ph);font-size:11.5px}
.clip.aud .aph .bar{width:70%;height:6px;border-radius:4px;overflow:hidden;
  box-shadow:inset 2px 2px 4px var(--lo), inset -2px -2px 4px var(--hi)}
.clip.aud .aph .bar i{display:block;height:100%;width:0;border-radius:4px;
  background:linear-gradient(90deg,var(--acc),var(--acc-d));transition:width .5s}
.clip.aud .ca a.dl{font:inherit;font-size:10.5px;padding:4px 9px;border-radius:8px;
  color:var(--dim);text-decoration:none;background:var(--surf);
  box-shadow:2px 2px 5px var(--lo), -2px -2px 5px var(--hi)}
.clip.aud .ca a.dl:hover{color:var(--acc)}

/* 失败原因：摆出来，别让人去翻服务器日志。太长就截断，完整的在 title 里 */
.clip .ph.err,.clip .aph.err{color:var(--bad);text-align:center;padding:14px 12px}
.clip .ph.err span,.clip .aph.err span{
  display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;
  font-size:11px;line-height:1.5;word-break:break-word}

/* ---------- 更多：首尾帧 / 锚点 / 两个预览开关 ---------- */
.fw-more{margin-bottom:14px;padding:0 0 14px;max-height:200px;overflow-y:auto;
  overscroll-behavior:contain;border-bottom:1px solid var(--line)}
.fw-more-row{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.fw-more-row + .fw-more-row{margin-top:9px;padding-top:9px;
  border-top:1px solid color-mix(in srgb, var(--line) 45%, transparent)}
.fw-more-lb{font-size:11.5px;color:var(--dim);font-weight:600;flex:0 0 auto}
.fw-more-hint{font-size:11px;color:var(--warn);line-height:1.5}
.fw-sw{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--dim);cursor:pointer;margin:0}
.fw-sw input{appearance:none;-webkit-appearance:none;width:15px;height:15px;border-radius:5px;
  position:relative;cursor:pointer;
  border:1px solid color-mix(in srgb, var(--line) 90%, transparent);
  background:color-mix(in srgb, var(--hole) 60%, transparent)}
html[data-theme="dark"] .fw-sw input{border-color:rgba(255,255,255,.22);background:rgba(0,0,0,.3)}
.fw-sw input:checked{background:var(--acc);border-color:var(--acc)}
.fw-sw input:checked::after{content:"";position:absolute;left:4px;top:1px;width:4px;height:8px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}

.fw-frames,.fw-guides{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.fslot{position:relative;width:64px;height:40px;border-radius:5px;cursor:pointer;overflow:hidden;
  display:grid;place-items:center;font-size:10.5px;color:var(--ph);
  background:var(--hole);border:1px dashed var(--line)}
.fslot.on{box-shadow:0 0 0 1.5px var(--acc)}
.fslot img{width:100%;height:100%;object-fit:cover;display:block}
.fslot .x{position:absolute;top:1px;right:1px;width:15px;height:15px;border-radius:50%;border:0;
  cursor:pointer;font-size:10px;line-height:1;background:rgba(0,0,0,.55);color:#fff;opacity:0}
.fslot:hover .x{opacity:1}
.fslot .cap{position:absolute;left:0;right:0;bottom:0;font-size:9px;text-align:center;
  color:#fff;background:linear-gradient(transparent,rgba(0,0,0,.65))}

.grow2{display:flex;align-items:center;gap:6px;padding:4px 7px;border-radius:5px;font-size:10.5px;
  color:var(--dim);background:color-mix(in srgb, var(--hole) 45%, transparent);
  border:1px solid color-mix(in srgb, var(--line) 55%, transparent)}
.grow2 img{width:32px;height:20px;object-fit:cover;border-radius:5px}
.grow2 .ic{width:32px;height:20px;border-radius:5px;display:grid;place-items:center;font-size:11px;
  background:color-mix(in srgb, var(--acc) 14%, transparent);color:var(--acc)}
.grow2 input{width:52px;font:inherit;font-size:10.5px;padding:3px 5px;border-radius:6px;
  color:var(--fg);outline:none;
  background:color-mix(in srgb, var(--hole) 60%, transparent);
  border:1px solid color-mix(in srgb, var(--line) 60%, transparent)}
html[data-theme="dark"] .grow2 input{background:rgba(0,0,0,.3);border-color:rgba(255,255,255,.12)}
.grow2 button{border:0;background:transparent;color:var(--ph);cursor:pointer;font:inherit;
  font-size:12px;line-height:1;padding:0 2px}
.grow2 button:hover{color:var(--bad)}

/* 素材库里视频 / 音频没有画面，用图标占位 */
.ing .ic,.fw-chip .ic,.pref .ic{display:grid;place-items:center;color:var(--acc);
  background:color-mix(in srgb, var(--acc) 14%, transparent)}
.ing .ic{width:100%;height:100%;font-size:17px;flex-direction:column;gap:2px}
.ing .ic b{font-size:9px;font-weight:600;opacity:.8}
.fw-chip .ic{width:22px;height:22px;border-radius:6px;font-size:11px}
.pref .ic{width:18px;height:18px;border-radius:5px;font-size:9px}
.clip .cp .pref .ic{width:15px;height:15px;font-size:8px}

/* 窄屏保留素材入口，抽屉不挤压画布或生成栏。 */
@media(max-width:900px){
  #pane-flow{--library-width:0px}
  .fw{grid-template-columns:minmax(0,1fr)}
  .fw-mobile{display:grid}
  .fw-ing{display:none;position:absolute;inset:0 auto 0 0;width:min(300px,calc(100% - 48px));z-index:31;
    box-shadow:8px 0 28px rgba(0,0,0,.12)}
  #pane-flow.library-open .fw-ing{display:flex}
  .fw-scrim{display:block;position:absolute;inset:0;z-index:30;border:0;border-radius:0;
    background:rgba(0,0,0,.28);cursor:pointer}
  .fw-toolbar{padding:0 16px}
  .fw-dock{left:20px;right:20px;bottom:20px}
}
@media(max-width:600px){
  .fw-toolbar{padding:0 10px;flex-basis:46px}
  .fw-zoom button{width:32px;height:34px}
  .fw-dock{left:12px;right:12px;bottom:max(12px,env(safe-area-inset-bottom));gap:8px;max-height:calc(100% - 58px)}
  .fw-bar{padding:12px}
  .fw-row{gap:8px;flex-wrap:wrap;justify-content:flex-end}
  .fw-input{flex-basis:100%;min-height:54px;max-height:110px;font-size:16px}
  .fw-ai,.fw-go{min-height:36px;height:36px}
  .fw-ai{width:36px}
  .fw-opts{display:grid;grid-template-columns:minmax(0,1fr) repeat(3,30px);gap:8px 4px;margin-top:10px;padding-top:10px}
  .fw-opts > .spacer{display:none}
  .fw-kind{grid-column:1;grid-row:1;width:max-content}
  .fw-kind button{padding:4px 7px}
  .fw-kind .ui-icon{display:none}
  .fw-kgrp{grid-column:1/-1;grid-row:2;display:flex;flex-wrap:nowrap;gap:5px}
  .fw-kgrp .sw2{flex:1}
  #fw-opt-video .sw2:first-child{flex:1.4}
  #fw-opt-video .sw2:nth-child(3){flex:1.15}
  .fw-kgrp select{width:100%;padding:6px 20px 6px 7px}
  .fw-opts .sw2::after{right:8px}
  .fw-undo{grid-column:2;grid-row:1;width:30px}
  #fw-more-btn{grid-column:3;grid-row:1;width:30px}
  .fw-est{grid-column:1/-1;grid-row:3;font-size:10.5px}
  .fw-est:empty{display:none}
  .fw-scene{padding:7px 12px}
  .fw-scene-hd{gap:7px}
  .fw-scene-hd .hint{font-size:10.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .fw-hint{gap:12px}
  .fw-empty-icon{width:36px;height:36px}
  .fw-hint h3{font-size:14px}
  .fw-modal-box{padding:20px;max-height:calc(100% - 24px)}
  .fw-m-two{grid-template-columns:1fr;gap:0}
  .fw-m-row{flex-wrap:wrap}
  .fw-m-msg{max-width:100%;white-space:normal;overflow-wrap:anywhere}
  .fw-ctx{gap:6px;flex-wrap:wrap}
}
@media(max-height:640px){
  .fw-dock{bottom:8px;gap:6px}
  .fw-bar{padding:10px 12px}
  .fw-input{min-height:38px;max-height:72px}
  .fw-opts{margin-top:8px;padding-top:8px}
  .fw-hint{gap:8px}
  .fw-hint .fw-empty-icon{display:none}
}
@media(hover:none){
  .ing .x,.sc .x,.fslot .x{opacity:1;min-width:24px;min-height:24px}
  .clip .ca button{min-height:30px}
}
