/* ===========================================================================
   Omni Studio 设计系统 —— 方向 C「栏线派 Column Rule」+「密度账本」精炼
   参考体系: GitHub Primer 的中性层级(canvas/subtle/default/muted)、8px 网格、
   "分组用带边框的 Box 而不是阴影"；强调色与密度取自用户选中的「密度账本」方向
   (深藏青 #1c2d4a、数字走等宽字、表格斑马纹、状态用色点而不是纯色底徽章)。

   规矩（新增页面必须遵守，违反会被 routes_ui_test.go 拦下）：
     1. 全站只有这一个样式表，禁止再建模块 CSS。
     2. 禁止 !important（[hidden] 除外）。
     3. 禁止 .app-page--<页名> 这类逐页覆盖选择器。
     4. 禁止别名令牌。令牌只有 --o-* 一层。
     5. 组件只在第 8 节定义一次。页面用它，不重写它。
   =========================================================================== */

/* ---------------------------------------------------------------- 1. 令牌 */
:root{
  color-scheme:light;

  /* 中性色: 单一家族, 冷暖不混 */
  --o-canvas:#f6f8fa;
  --o-surface:#ffffff;
  --o-subtle:#f6f8fa;
  --o-line:#d8dee4;
  --o-line-muted:#eaeef2;
  --o-fg:#1f2328;
  --o-muted:#59636e;
  --o-faint:#66717d;

  /* 强调: 深藏青(密度账本方向选定色) */
  --o-accent:#1c2d4a;
  --o-accent-hover:#15223a;
  --o-accent-active:#0f1928;
  --o-accent-soft:#e9ecf1;
  --o-accent-line:#b9c2d1;
  --o-on-accent:#ffffff;

  /* 语义 */
  --o-warn:#7d4e00;
  --o-warn-soft:#fff4e0;
  --o-warn-line:#e8c88a;
  --o-danger:#a40e26;
  --o-danger-soft:#fdeff1;
  --o-danger-line:#e6b3bd;

  /* 字号阶梯 */
  --o-t-xs:11.5px;
  --o-t-sm:12px;
  --o-t-md:13px;    /* 正文 */
  --o-t-lg:14px;
  --o-t-h2:17px;    /* 区块标题 —— 缺了这一档, 想要显眼小标题的页面只能去够
                       下面的 24px 页标题, 结果区块标题和页标题一样大甚至更大。 */
  --o-t-xl:24px;    /* 页标题, 与正文形成强对比 */

  /* 字重阶梯 */
  --o-w-normal:400;
  --o-w-medium:500;
  --o-w-bold:600;

  /* 间距阶梯: 8px 网格 */
  --o-s1:4px;  --o-s2:8px;  --o-s3:12px; --o-s4:16px;
  --o-s5:24px; --o-s6:32px; --o-s7:48px;

  --o-radius:3px;
  --o-sidebar:240px;
  --o-rail:288px;
  --o-control:32px;

  /* 行栅格: 表头与数据行共用同一个定义, 两处分别写死必然错位 */
  --o-rowgrid:minmax(0,1.3fr) minmax(0,1fr) 150px 268px;

  --o-font:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  --o-mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
}

/* ---------------------------------------------------------------- 2. 基础 */
.app-page{
  margin:0;
  min-width:320px;
  background:var(--o-canvas);
  color:var(--o-fg);
  font:var(--o-w-normal) var(--o-t-md)/1.6 var(--o-font);
  -webkit-font-smoothing:antialiased;
}
.app-page *{box-sizing:border-box}
.app-page [hidden]{display:none !important}
.app-page h1,.app-page h2,.app-page h3,.app-page h4,
.app-page p,.app-page dl,.app-page dd,.app-page dt,.app-page figure{margin:0}
.app-page a{color:var(--o-accent);text-decoration:none}
.app-page a:hover{text-decoration:underline;text-underline-offset:2px}
.app-page button,.app-page input,.app-page select,.app-page textarea{font-family:inherit}
.app-page code,.app-page kbd,.app-page samp{
  padding:1px 5px;
  border:1px solid var(--o-line-muted);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  font:var(--o-t-xs)/1.4 var(--o-mono);
}
.app-page ::selection{background:var(--o-accent-soft);color:var(--o-accent-hover)}
.app-page :focus-visible{outline:2px solid var(--o-accent);outline-offset:2px}
.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
/* Small uppercase label above a title. Most pages don't need one (dropped
   during migration); drama.html/drama.js still hardcode this name so it
   stays as a shared utility rather than a page-specific quarantine entry. */

.app-page h1{font-size:var(--o-t-xl);line-height:1.3;font-weight:var(--o-w-bold);text-wrap:balance}
.app-page h2{font-size:var(--o-t-h2);line-height:1.4;font-weight:var(--o-w-bold)}
.app-page h3{font-size:var(--o-t-lg);line-height:1.45;font-weight:var(--o-w-bold)}
.app-page h4{font-size:var(--o-t-sm);line-height:1.45;font-weight:var(--o-w-bold)}

/* ------------------------------------------------------------ 3. 应用骨架 */
.app-shell{
  display:grid;
  grid-template-columns:var(--o-sidebar) minmax(0,1fr) var(--o-rail-width,0px);
  align-items:stretch;
  min-height:100vh;
}
.app-page{--o-rail-width:var(--o-rail)}
.app-page.history-collapsed{--o-rail-width:40px}

.app-sidebar{
  position:sticky;
  inset:0 auto auto 0;
  z-index:30;
  display:flex;
  flex-direction:column;
  height:100vh;
  padding:var(--o-s5) var(--o-s3) var(--o-s3);
  overflow-y:auto;
  background:var(--o-surface);
  border-right:1px solid var(--o-line);
  scrollbar-width:thin;
}
.app-brand{
  display:flex;
  align-items:center;
  gap:var(--o-s2);
  margin-bottom:var(--o-s2);
  padding:0 var(--o-s2) var(--o-s5);
  border:0;
  border-bottom:1px solid var(--o-line-muted);
  border-radius:0;
  background:none;
  color:var(--o-fg);
  font:inherit;
  text-align:left;
  cursor:pointer;
}
.app-brand:hover{text-decoration:none}
.app-brand-mark{
  display:grid;
  place-items:center;
  flex:0 0 26px;
  width:26px;
  height:26px;
  border-radius:var(--o-radius);
  background:var(--o-accent);
  color:var(--o-on-accent);
  font-size:var(--o-t-sm);
}
.app-brand-copy b{display:block;font-size:var(--o-t-lg);font-weight:var(--o-w-bold);line-height:1.3}
.app-brand-copy small{display:block;color:var(--o-faint);font-size:var(--o-t-xs);line-height:1.4}
/* Static one-line disclaimer some workspaces put under the primary nav
   (product/avatar/creator/flux-studio/kontext). margin-top:auto pushes it to
   the bottom of the flex column, above wherever app-shell.js appends the
   system nav + logout button next. */
.app-sidebar-footer{
  margin-top:auto;
  padding:var(--o-s3) var(--o-s2) 2px;
  border-top:1px solid var(--o-line-muted);
  color:var(--o-faint);
  font-size:10.5px;
  line-height:1.55;
}

.app-nav,.app-system-nav{display:grid;gap:1px}
/* margin-top:auto keeps 管理与系统 pinned to the bottom on every page. Pages
   that also render .app-sidebar-footer already absorb the free space there,
   so this is a no-op for them and the two stay stacked at the bottom. */
.app-system-nav{margin-top:auto;padding-top:var(--o-s3)}
.app-nav-section,.app-system-nav-label,.app-page .navsec{
  padding:var(--o-s4) var(--o-s2) var(--o-s1);
  color:var(--o-faint);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-bold);
  letter-spacing:.03em;
}
.app-nav-item,.app-system-link,.app-logout,
.app-page .side-tab,.app-page .tab{
  display:flex;
  align-items:center;
  gap:var(--o-s2);
  width:100%;
  padding:6px var(--o-s2);
  border:0;
  border-radius:var(--o-radius);
  background:none;
  color:var(--o-fg);
  font-size:var(--o-t-md);
  font-weight:var(--o-w-normal);
  text-align:left;
  cursor:pointer;
}
.app-nav-item:hover,.app-system-link:hover,.app-logout:hover,
.app-page .side-tab:hover,.app-page .tab:hover{
  background:var(--o-subtle);
  text-decoration:none;
}
.app-nav-item svg,.app-system-link svg,.app-logout svg,
.app-page .side-tab svg,.app-page .tab svg{flex:0 0 16px;width:16px;height:16px;stroke-width:1.7}
.app-nav-item[aria-current="page"],.app-system-link[aria-current="page"],
.app-page .side-tab[aria-selected="true"],.app-page .tab[aria-selected="true"]{
  background:var(--o-accent-soft);
  box-shadow:inset 2px 0 0 var(--o-accent);
  color:var(--o-accent-hover);
  font-weight:var(--o-w-bold);
}
.app-nav-divider{height:1px;margin:var(--o-s3) var(--o-s2);background:var(--o-line)}
.app-logout{margin-top:var(--o-s1);color:var(--o-muted)}
.app-notification-badge{
  min-width:16px;
  margin-left:auto;
  padding:0 5px;
  border-radius:999px;
  background:var(--o-danger);
  color:#fff;
  font-size:10px;
  font-weight:var(--o-w-bold);
  line-height:16px;
  text-align:center;
}

.app-main{min-width:0;background:var(--o-canvas)}
.app-mobile-bar,.app-sidebar-backdrop{display:none}

/* -------------------------------------------------------------- 4. 历史轨 */
.app-history{
  position:sticky;
  inset:0 0 auto auto;
  z-index:20;
  display:flex;
  flex-direction:column;
  height:100vh;
  background:var(--o-surface);
  border-left:1px solid var(--o-line);
}
.app-history-tab{display:none}
.history-collapsed .app-history-inner{display:none}
.history-collapsed .app-history-tab{
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:var(--o-s2);
  height:100%;
  padding:var(--o-s3) 0;
  border:0;
  background:none;
  color:var(--o-muted);
  cursor:pointer;
}
.history-collapsed .app-history-tab:hover{background:var(--o-subtle);color:var(--o-fg)}
.app-history-tab svg{width:16px;height:16px}
.app-history-tab span{writing-mode:vertical-rl;font-size:var(--o-t-xs);letter-spacing:.1em}
.app-history-inner{display:flex;flex-direction:column;flex:1;min-height:0}
.app-history-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  padding:var(--o-s3) var(--o-s4);
  background:var(--o-subtle);
  border-bottom:1px solid var(--o-line);
}
.app-history-head strong{font-size:var(--o-t-md);font-weight:var(--o-w-bold)}
.app-history-collapse{
  display:grid;
  place-items:center;
  width:24px;
  height:24px;
  border:0;
  border-radius:var(--o-radius);
  background:none;
  color:var(--o-muted);
  cursor:pointer;
}
.app-history-collapse:hover{background:var(--o-line-muted);color:var(--o-fg)}
.app-history-collapse svg{width:14px;height:14px}
.app-history-filters{display:flex;gap:var(--o-s2);padding:var(--o-s3) var(--o-s4)}
.app-history-filters button{
  height:26px;
  padding:0 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-muted);
  font-size:var(--o-t-sm);
  cursor:pointer;
}
.app-history-filters button:hover{background:var(--o-subtle)}
.app-history-filters button.on{
  border-color:var(--o-accent-line);
  background:var(--o-accent-soft);
  color:var(--o-accent);
  font-weight:var(--o-w-bold);
}
.app-history-list{flex:1;min-height:0;overflow-y:auto;padding:0 var(--o-s3) var(--o-s3)}
.app-history-empty{padding:var(--o-s5) var(--o-s2);color:var(--o-faint);font-size:var(--o-t-sm)}
.app-history-item{
  display:grid;
  grid-template-columns:34px minmax(0,1fr);
  gap:var(--o-s2);
  align-items:center;
  padding:var(--o-s2);
  border-bottom:1px solid var(--o-line-muted);
  color:var(--o-fg);
}
.app-history-item:hover{background:var(--o-subtle);text-decoration:none}
.app-history-thumb{
  position:relative;
  display:grid;
  place-items:center;
  overflow:hidden;
  width:34px;
  height:34px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-subtle);
  color:var(--o-faint);
  font-size:var(--o-t-xs);
}
.app-history-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.app-history-text{display:grid;gap:1px;min-width:0}
.app-history-title{overflow:hidden;font-size:var(--o-t-sm);text-overflow:ellipsis;white-space:nowrap}
.app-history-item.is-unread .app-history-title{font-weight:var(--o-w-bold)}
.app-history-meta,.app-history-state{color:var(--o-faint);font-size:var(--o-t-xs);line-height:1.4}
.app-history-item[data-lifecycle="running"] .app-history-state,
.app-history-item[data-lifecycle="queued"] .app-history-state{color:var(--o-accent)}
.app-history-item[data-lifecycle="failed"] .app-history-state,
.app-history-item[data-lifecycle="needs_action"] .app-history-state{color:var(--o-danger)}
.app-history-foot{
  display:flex;
  gap:var(--o-s3);
  padding:var(--o-s3) var(--o-s4);
  border-top:1px solid var(--o-line);
}
.app-history-foot a{color:var(--o-muted);font-size:var(--o-t-xs)}

/* --------------------------------------------------------- 5. 预览层/提示 */
.app-preview{
  position:fixed;
  inset:0;
  z-index:60;
  display:grid;
  place-items:center;
  padding:var(--o-s5);
  background:rgb(31 35 40 / 42%);
}
.app-preview-panel{
  display:flex;
  flex-direction:column;
  width:min(720px,100%);
  max-height:86vh;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
}
.app-preview-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--o-s3);
  padding:var(--o-s3) var(--o-s4);
  background:var(--o-subtle);
  border-bottom:1px solid var(--o-line);
}
.app-preview-title{overflow:hidden;flex:1;font-size:var(--o-t-lg);font-weight:var(--o-w-bold);text-overflow:ellipsis;white-space:nowrap}
.app-preview-close{
  display:grid;
  place-items:center;
  width:26px;
  height:26px;
  border:0;
  border-radius:var(--o-radius);
  background:none;
  color:var(--o-muted);
  cursor:pointer;
}
.app-preview-close:hover{background:var(--o-line-muted);color:var(--o-fg)}
.app-preview-close svg{width:14px;height:14px}
.app-preview-body{display:grid;place-items:center;flex:1;min-height:0;overflow:auto;padding:var(--o-s4)}
.app-preview-body img,.app-preview-body video{max-width:100%;max-height:56vh;border-radius:var(--o-radius)}
.app-preview-body audio{width:100%}
.app-preview-empty{color:var(--o-faint);font-size:var(--o-t-md)}
.app-preview-meta{padding:0 var(--o-s4);color:var(--o-faint);font-size:var(--o-t-sm)}
.app-preview-foot{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--o-s2);
  margin-top:var(--o-s3);
  padding:var(--o-s3) var(--o-s4);
  border-top:1px solid var(--o-line);
}
.app-preview-send{display:flex;gap:var(--o-s2);flex:1;min-width:220px}
.app-toast{
  position:fixed;
  left:50%;
  bottom:var(--o-s5);
  z-index:70;
  transform:translateX(-50%);
  padding:var(--o-s2) var(--o-s4);
  border-radius:var(--o-radius);
  background:var(--o-fg);
  color:#fff;
  font-size:var(--o-t-md);
}

/* -------------------------------------------------------------- 6. 上传区 */
.ui-dropzone{
  display:grid;
  place-items:center;
  gap:var(--o-s1);
  padding:var(--o-s5);
  border:1px dashed var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-subtle);
  text-align:center;
  cursor:pointer;
}
.ui-dropzone:hover,.ui-dropzone.is-dragover{border-color:var(--o-accent);background:var(--o-accent-soft)}
.ui-dropzone.is-filled{border-style:solid;border-color:var(--o-accent-line)}
.ui-dropzone input[type="file"]{display:none}
.ui-dz-title{font-size:var(--o-t-md);font-weight:var(--o-w-bold)}
.ui-dz-hint{color:var(--o-muted);font-size:var(--o-t-sm)}
.ui-dropzone:has(input:disabled){opacity:.55;cursor:not-allowed}

/* ------------------------------------------------------------ 7. 页面骨架 */
.app-canvas{
  /* 命名容器 —— 页面里所有 @container page (...) 断点都挂在它身上。
     少了这一行，那些断点会静默失效(窄屏挤成一列竖排字)，别删。 */
  container:page / inline-size;
  width:100%;
  min-width:0;
  padding:var(--o-s6) var(--o-s6) var(--o-s7);
}
.app-page-head{
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:var(--o-s6);
  margin-bottom:var(--o-s5);
  padding-bottom:var(--o-s4);
  border-bottom:1px solid var(--o-line);
}
.app-page-head>div:first-child{min-width:0}
.app-page-head p{margin-top:var(--o-s1);max-width:62ch;color:var(--o-muted);font-size:var(--o-t-md);text-wrap:pretty}
.app-page-actions{display:flex;flex-wrap:wrap;gap:var(--o-s2);flex:none}
/* 全幅工作台(不挂 .app-canvas, 见第 7 节 skipCanvas)没有画布内边距可继承,
   页头和标签条自带左右内边距, 与下方分栏内容左缘对齐。 */
.app-page-head--bleed,.app-tabs--bleed{padding-inline:var(--o-s5)}
.app-page-head--bleed{padding-top:var(--o-s4)}

/* 窄的是画布本身(侧栏+右轨挤出来的), 不一定是窗口 —— 所以走 @container 而不是
   @media, 否则标题和工具条会挤成一列竖排字。 */
@container page (max-width:620px){
  .app-page-head{flex-direction:column;gap:var(--o-s3)}
  .boxhead{flex-direction:column;align-items:stretch;gap:var(--o-s2)}
  /* 右侧那组控件带 flex:none + select 有 140px 下限, 不放开会把画布顶宽
     (实测 /chat 溢出 104px)。 */
  .boxhead-actions{flex:1 1 auto}
  .boxhead-actions select{flex:1 1 auto;min-width:0}
}

.app-tabs{
  display:flex;
  flex-wrap:wrap;
  gap:var(--o-s2);
  margin-bottom:var(--o-s5);
  border-bottom:1px solid var(--o-line);
}
.app-tabs a,.app-tabs button{
  margin-bottom:-1px;
  padding:var(--o-s2) var(--o-s3);
  border:0;
  border-bottom:2px solid transparent;
  border-radius:var(--o-radius) var(--o-radius) 0 0;
  background:none;
  color:var(--o-fg);
  font-size:var(--o-t-md);
  cursor:pointer;
}
.app-tabs a:hover,.app-tabs button:hover{background:var(--o-subtle);text-decoration:none}
.app-tabs a[aria-current="page"],.app-tabs a[aria-selected="true"],.app-tabs button[aria-selected="true"]{
  border-bottom-color:var(--o-accent);
  font-weight:var(--o-w-bold);
}

/* 电影工作台(index.html)的子导航与其它页面一致: 横排在内容区上方。
   main 本身没有内边距, 这里补上与 .app-canvas 相同的水平留白; 视图自带顶部
   留白, 不再叠加 .app-tabs 的默认下边距, 避免出现两层空隙。 */
.movie-tabs{
  padding:var(--o-s6) var(--o-s6) 0;
  margin-bottom:0;
}

/* 一组相关但各自独立的页面(目前是数字人的 creator.html/avatar.html)之间的
   切换条; 不是标签页(不是同一份 DOM 的两个视图), 是两个不同路由。 */
.workspace-route-switch{display:grid;grid-template-columns:1fr 1fr;margin-bottom:var(--o-s5);border:1px solid var(--o-line);border-radius:var(--o-radius);overflow:hidden;background:var(--o-surface)}
.workspace-route-switch a{display:grid;gap:3px;min-width:0;padding:var(--o-s3) var(--o-s4);border-right:1px solid var(--o-line);color:var(--o-muted);text-decoration:none}
.workspace-route-switch a:last-child{border-right:0}
.workspace-route-switch a:hover{background:var(--o-subtle);color:var(--o-fg)}
.workspace-route-switch a[aria-current="page"]{background:var(--o-accent-soft);color:var(--o-accent);box-shadow:inset 0 -2px 0 var(--o-accent)}
.workspace-route-switch strong{font-size:var(--o-t-sm)}
.workspace-route-switch span{color:var(--o-faint);font-size:var(--o-t-xs);line-height:1.45}

/* -------------------------------------------------------------- 8. 组件层 */

/* 8.1 Box —— 唯一的分组容器。带头部条的 hairline 盒子，永远不用阴影 */
.box{
  overflow:hidden;
  margin-bottom:var(--o-s5);
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
}
.box:last-child{margin-bottom:0}
.boxhead{
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:var(--o-s5);
  padding:var(--o-s3) var(--o-s4);
  border-bottom:1px solid var(--o-line);
}
.boxhead>div:first-child{min-width:0}
.boxhead p{margin-top:2px;max-width:66ch;color:var(--o-muted);font-size:var(--o-t-sm);text-wrap:pretty}
.boxhead-actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--o-s2);flex:none}
.boxbody{padding:var(--o-s4)}

/* 8.2 统计条 —— 一个 Box, 内部竖栏线, 数字走等宽 */
.stats{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
  overflow:hidden;
  margin-bottom:var(--o-s5);
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
}
.stats>div{padding:var(--o-s3) var(--o-s4);border-left:1px solid var(--o-line-muted)}
.stats>div:first-child{border-left:0}
.stats dt{color:var(--o-muted);font-size:var(--o-t-sm)}
.stats dd{
  margin-top:2px;
  font:var(--o-w-bold) 22px/1.3 var(--o-mono);
  font-variant-numeric:tabular-nums;
}

/* 8.3 行项目 —— 左说明 / 中状态 / 右操作 */
.rowitem{
  display:grid;
  grid-template-columns:var(--o-rowgrid);
  gap:var(--o-s4);
  align-items:center;
  padding:var(--o-s3) var(--o-s4);
  border-bottom:1px solid var(--o-line-muted);
}
.rowitem:last-child{border-bottom:0}
.rowitem:hover{background:var(--o-subtle)}
.rowitem strong{display:block;font-size:var(--o-t-md);font-weight:var(--o-w-bold)}
.rowitem small,.rowitem>div>span{display:block;margin-top:2px;color:var(--o-muted);font-size:var(--o-t-sm)}
.rowhead{
  display:grid;
  grid-template-columns:var(--o-rowgrid);
  gap:var(--o-s4);
  padding:var(--o-s2) var(--o-s4);
  background:var(--o-subtle);
  border-bottom:1px solid var(--o-line);
  color:var(--o-faint);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-bold);
  letter-spacing:.03em;
}
.rowactions{display:flex;flex-wrap:wrap;gap:var(--o-s2);justify-content:flex-end}

/* 8.4 表格 */
.table{width:100%;border-collapse:collapse}
.table th{
  padding:var(--o-s2) var(--o-s4);
  background:var(--o-subtle);
  border-bottom:1px solid var(--o-line);
  color:var(--o-faint);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-bold);
  letter-spacing:.03em;
  text-align:left;
}
.table td{
  padding:var(--o-s3) var(--o-s4);
  border-bottom:1px solid var(--o-line-muted);
  font-size:var(--o-t-md);
  vertical-align:middle;
}
.table tr:last-child td{border-bottom:0}
.table tbody tr:nth-child(even){background:var(--o-subtle)}
.table tbody tr:hover{background:var(--o-line-muted)}
.table strong{display:block;font-weight:var(--o-w-bold)}
.table small{display:block;margin-top:2px;color:var(--o-faint);font-size:var(--o-t-xs)}
.table-scroll{overflow-x:auto}

/* 8.5 按钮 —— 主 / 次 / 危险 / 静音, 一套尺寸。
   主按钮选择器用 :where() 把特异度压到 0: 下面的别名是各旧页面(drama/hotpub/
   creator/avatar/product/kontext)各自重造过的主按钮外观, 统一接到这一份定义上,
   页面段里不再重复声明。页面自己的微调(宽度/边距/小号/matrix 自己的按钮规则)
   仍是普通规则, 天然压过这里。 */
:where(.btn,
  .product-primary,
  .kontext-submit,.kontext-primary,
  .creator-submit-row button,.creator-character-actions button,
  .avatar-actions button,
  .drama-form button,.heading-actions button,.task-actions button,
  .asset-actions button,.shot-actions button,
  .hotpub-form button,.queue-actions button,.toolbar button){
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:6px;
  height:var(--o-control);
  padding:0 var(--o-s3);
  border:1px solid rgb(31 35 40 / 15%);
  border-radius:var(--o-radius);
  background:var(--o-accent);
  color:var(--o-on-accent);
  font-size:var(--o-t-sm);
  font-weight:var(--o-w-bold);
  white-space:nowrap;
  cursor:pointer;
}
:where(.btn,
  .product-primary,
  .kontext-submit,.kontext-primary,
  .creator-submit-row button,.creator-character-actions button,
  .avatar-actions button,
  .drama-form button,.heading-actions button,.task-actions button,
  .asset-actions button,.shot-actions button,
  .hotpub-form button,.queue-actions button,.toolbar button):hover{
  background:var(--o-accent-hover);color:var(--o-on-accent);text-decoration:none
}
:where(.btn,
  .product-primary,
  .kontext-submit,.kontext-primary,
  .creator-submit-row button,.creator-character-actions button,
  .avatar-actions button,
  .drama-form button,.heading-actions button,.task-actions button,
  .asset-actions button,.shot-actions button,
  .hotpub-form button,.queue-actions button,.toolbar button):active:not(:disabled){
  background:var(--o-accent-active)
}
:where(.btn,
  .product-primary,
  .kontext-submit,.kontext-primary,
  .creator-submit-row button,.creator-character-actions button,
  .avatar-actions button,
  .drama-form button,.heading-actions button,.task-actions button,
  .asset-actions button,.shot-actions button,
  .hotpub-form button,.queue-actions button,.toolbar button):disabled{
  opacity:.55;cursor:not-allowed
}
.btn--sec{border-color:var(--o-line);background:var(--o-surface);color:var(--o-fg)}
.btn--sec:hover{border-color:#c3cbd3;background:var(--o-subtle);color:var(--o-fg)}
.btn--sec:active:not(:disabled){background:var(--o-line-muted)}
.btn--danger{border-color:var(--o-danger-line);background:var(--o-surface);color:var(--o-danger)}
.btn--danger:hover{background:var(--o-danger-soft);color:var(--o-danger)}
.btn--quiet{border-color:transparent;background:none;color:var(--o-muted)}
.btn--quiet:hover{background:var(--o-subtle);color:var(--o-fg)}
.btn--sm{height:26px;padding:0 10px;font-size:var(--o-t-sm)}
.btn--icon{width:26px;height:26px;padding:0;font-size:var(--o-t-lg);font-weight:var(--o-w-normal)}

/* 旧页面(drama/hotpub)JS 模板生成的 .button-secondary == 小号次级按钮
   (.btn--sec + .btn--sm), 原来在 drama 段和 hotpub 段各声明了一份, 统一到这里。
   双类名写法(特异度 0,2,0)用于在 .hotpub-form/.drama-form 里压过上面的
   :where() 元素规则, 保持"表单里次级按钮仍是次级"的既有语义。 */
.button-secondary,.button-secondary.button-secondary{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  height:26px;
  padding:0 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-fg);
  font-size:var(--o-t-sm);
  font-weight:var(--o-w-bold);
  white-space:nowrap;
  cursor:pointer;
}
.button-secondary:hover,.button-secondary.button-secondary:hover{border-color:#c3cbd3;background:var(--o-subtle);color:var(--o-fg)}
.button-secondary:disabled{opacity:.55;cursor:not-allowed}

/* 8.6 表单
   .field 同时支持两种写法: <label><span>标题</span><input></label>
   和标题直接写成文本节点的 <label>标题<input><small>说明</small></label> */
.field{
  display:block;
  margin-bottom:var(--o-s4);
  font-size:var(--o-t-sm);
  font-weight:var(--o-w-bold);
}
.field>span{display:block;font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.field>input,.field>select,.field>textarea,.field>span+*{margin-top:6px}
.field input,.field select,.field textarea,
.app-canvas input:not([type="checkbox"]):not([type="radio"]):not([type="file"]),
.app-canvas select,.app-canvas textarea{
  width:100%;
  min-height:var(--o-control);
  padding:6px 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-fg);
  font-family:inherit;
  font-size:var(--o-t-md);
  font-weight:var(--o-w-normal);
}
.app-canvas textarea{line-height:1.6;resize:vertical}
.app-canvas input::placeholder,.app-canvas textarea::placeholder{color:var(--o-faint)}
.app-canvas input:hover,.app-canvas select:hover,.app-canvas textarea:hover{border-color:#c3cbd3}
.app-canvas input:focus,.app-canvas select:focus,.app-canvas textarea:focus{
  outline:0;
  border-color:var(--o-accent);
  box-shadow:0 0 0 3px var(--o-accent-soft);
}
.field small,.fieldhelp{
  display:block;
  margin-top:5px;
  color:var(--o-muted);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-normal);
}
.checks{display:grid;gap:var(--o-s2);margin:var(--o-s4) 0}
.checks label{display:flex;align-items:center;gap:var(--o-s2);font-size:var(--o-t-md)}
.checks input{width:15px;min-height:15px;height:15px;accent-color:var(--o-accent)}
.formactions{
  display:flex;
  flex-wrap:wrap;
  gap:var(--o-s2);
  justify-content:flex-end;
  padding-top:var(--o-s3);
  border-top:1px solid var(--o-line-muted);
}

/* 旧页面表单标签(drama/hotpub/资产/镜头编辑器) —— 与 .field 语义一致, 但用
   grid 排布(label 直接包住控件)。原在页面段里几乎相同的两份声明合并到这里。 */
.drama-form label,.asset-toolbar label,.workspace-select,.hotpub-form label{
  display:grid;
  gap:6px;
  min-width:0;
  color:var(--o-muted);
  font-size:var(--o-t-sm);
  font-weight:var(--o-w-bold);
}
/* 共享字段规则刻意排除 [type=file](拖放区有自己的外观), 但文档类文件选择
   (小说导入等)不走拖放区, 补回字段外观 */
.drama-form input[type="file"]{
  width:100%;
  min-height:var(--o-control);
  padding:6px 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-fg);
}

/* 工具条里的控件按内容宽度排成一行, 不吃表单那套 100% 宽 */
.boxhead-actions select,.boxhead-actions input{width:auto;min-width:140px;min-height:26px;padding:2px 8px}
.boxhead-actions label{display:inline;margin:0;white-space:nowrap}

/* 8.7 标签 —— 一个描边 pill, 四种语气 */
.label{
  display:inline-flex;
  align-items:center;
  height:20px;
  padding:0 8px;
  border:1px solid var(--o-line);
  border-radius:999px;
  background:var(--o-surface);
  color:var(--o-muted);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-medium);
  white-space:nowrap;
}
.label--on{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.label--warn{border-color:var(--o-warn-line);background:var(--o-warn-soft);color:var(--o-warn)}
.label--danger{border-color:var(--o-danger-line);background:var(--o-danger-soft);color:var(--o-danger)}

/* 8.8 空态 —— Box 内居中, 无插图无虚线框 */
.empty{padding:var(--o-s7) var(--o-s5);background:var(--o-subtle);text-align:center}
.empty b{display:block;font-size:var(--o-t-lg);font-weight:var(--o-w-bold)}
.empty span{
  display:block;
  max-width:44ch;
  margin:6px auto var(--o-s4);
  color:var(--o-muted);
  font-size:var(--o-t-sm);
  text-wrap:pretty;
}

/* 8.9 行内提示 */
.msg{color:var(--o-muted);font-size:var(--o-t-sm)}
.msg.is-error{color:var(--o-danger)}
.msg.is-success{color:var(--o-accent)}
.msg:empty{display:none}

/* --------------------------------------------------------- 9. 页面专属 */
/* 每一页真正独有的排布放这里，按页分小节；组件一律复用第 8 节，不重新发明。
   两处都叫 "login" 但指不同东西: 9.1 是发布中心里"平台账号登录"这个子面板,
   9.2 是独立的系统登录页 (login.html), 互不相干, 别混。 */

/* 9.1 发布中心 (publishing.html) */
/* 编辑器隐藏时右栏自动收掉, 目录占满整行 */
.split{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--o-s5);align-items:start}
.split>.box{margin-bottom:0;container:row/inline-size}
.split>#platform-editor{width:344px}
/* 二维码必须被框死: 平台返回的图尺寸不可控, 不锁住会把整页撑开 */
.login-workspace{display:grid;grid-template-columns:172px minmax(0,1fr);gap:var(--o-s4);align-items:start}
.login-qr-wrap{width:172px;height:172px;max-width:100%;overflow:hidden;box-sizing:border-box;border:1px solid var(--o-line);border-radius:var(--o-radius)}
.login-qr{display:block;width:100%;height:100%;max-width:100%;max-height:100%;object-fit:contain}
.login-status{margin-bottom:var(--o-s3);color:var(--o-muted);font-size:var(--o-t-sm)}
.login-actions{display:flex;flex-wrap:wrap;gap:var(--o-s2)}

/* 9.2 系统登录页 (login.html) —— 独立品牌入口，认证表单仍沿用原有脚本和安全边界。 */
.login-page{
  min-height:100vh;
  background:#173832;
  color:#f4f0e8;
}
.login-page input{
  width:100%;
  min-height:var(--o-control);
  padding:6px 10px;
  border:1px solid #cfd3ca;
  border-radius:var(--o-radius);
  background:#fffdf8;
  color:#26332e;
  font-size:var(--o-t-md);
}
.login-page input:hover{border-color:#7d8a7c}
.login-page input:focus{outline:0;border-color:#25594e;box-shadow:0 0 0 3px #d9e4d6}
.login-layout{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(360px,440px);
  min-height:100vh;
}
.login-intro{display:grid;align-content:start;gap:clamp(28px,4.4vh,52px);min-height:100vh;padding:clamp(24px,5vw,72px) clamp(24px,7vw,120px);overflow:hidden}
.login-topbar{display:flex;align-items:center;justify-content:space-between;gap:var(--o-s3)}
.login-brand{display:flex;align-items:center;gap:var(--o-s3);color:#f4f0e8}
.login-brand:hover{text-decoration:none;color:#f4f0e8}
.login-mark{
  display:grid;
  place-items:center;
  flex:0 0 40px;
  width:40px;
  height:40px;
  border-radius:var(--o-radius);
  background:#e1b56f;
  color:#173832;
}
.login-mark svg{width:22px;height:22px;stroke-width:1.6}
.login-brand strong{display:block;font-size:15px;font-weight:var(--o-w-bold);line-height:1.25}
.login-brand small{display:block;color:#b8c8ba;font-size:var(--o-t-xs)}
.login-local-status{display:inline-flex;align-items:center;gap:6px;color:#dce5d7;font-size:var(--o-t-xs)}
.login-local-status span{width:7px;height:7px;border-radius:50%;background:#b9cd65;box-shadow:0 0 0 3px #32564c}
.login-copy{max-width:650px;animation:login-enter .72s cubic-bezier(.16,1,.3,1) both}
.login-kicker{color:#e1b56f;font-size:var(--o-t-xs);font-weight:var(--o-w-bold);letter-spacing:.09em;margin-bottom:var(--o-s3)}
.login-copy h1{margin:0 0 var(--o-s4);color:#f4f0e8;font-size:clamp(38px,4.2vw,64px);line-height:1.12;font-weight:600;letter-spacing:0}
.login-copy p{color:#c7d2c6;max-width:52ch;font-size:15px;line-height:1.75}
.login-flow{display:grid;gap:var(--o-s3);margin:0;max-width:700px;animation:login-enter .78s .1s cubic-bezier(.16,1,.3,1) both}
.login-flow-head,.login-flow-footer{display:flex;align-items:center;justify-content:space-between;gap:var(--o-s3);font-size:var(--o-t-xs)}
.login-flow-head{color:#acc0b0;letter-spacing:.06em}.login-flow-head span:last-child{color:#e1b56f;font-family:var(--o-mono);letter-spacing:0}
.login-flow-stage{display:grid;grid-template-columns:1.22fr .85fr 1.08fr;gap:8px;height:154px}
.login-flow-frame{position:relative;overflow:hidden;border:1px solid #507063;background-color:#2b4f46;background-position:center;background-size:cover}
.login-flow-frame::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 42%,rgba(16,41,35,.84))}
.login-flow-frame--one{background-image:linear-gradient(133deg,#608779 0%,#2e584d 38%,#b18a55 39%,#345e51 63%,#173832 100%)}
.login-flow-frame--two{background-image:linear-gradient(145deg,#1d4038 0%,#567b6c 47%,#d6b174 48%,#264b40 78%)}
.login-flow-frame--three{background-image:linear-gradient(130deg,#b89059 0%,#e3c585 28%,#426a5b 29%,#173832 68%,#305c4e 100%)}
.login-frame-label,.login-frame-time{position:absolute;z-index:1;bottom:9px;font-size:10px;font-family:var(--o-mono);letter-spacing:.04em}.login-frame-label{left:10px;color:#fff9e9}.login-frame-time{right:10px;color:#d6e2d5}
.login-flow-track{position:relative;display:flex;align-items:center;gap:5px;height:17px;padding:0 2px}.login-flow-track::before{content:"";position:absolute;left:0;right:0;height:1px;background:#668274}.login-flow-track span{position:relative;z-index:1;width:35%;height:3px;background:#e1b56f}.login-flow-track i{position:relative;z-index:1;width:5px;height:5px;border-radius:50%;background:#9eb5a5}.login-flow-track b{position:absolute;z-index:2;left:76%;width:1px;height:17px;background:#f6ead1;animation:login-playhead 4s ease-in-out infinite}
.login-flow-footer{color:#c9d6c9}.login-flow-footer b{display:block;color:#f4f0e8;font-size:var(--o-t-sm);font-weight:var(--o-w-medium)}.login-flow-footer small{display:block;color:#9fb2a4;font-size:var(--o-t-xs)}.login-flow-progress{color:#e1b56f;font-family:var(--o-mono);font-size:var(--o-t-sm)}
.login-capabilities{display:flex;flex-wrap:wrap;gap:8px 20px;color:#acc0b0;font-size:var(--o-t-xs)}.login-capabilities span::before{content:"/";margin-right:7px;color:#e1b56f}
.login-panel{align-self:center;margin:0  clamp(24px,6vw,88px) 0 0;padding:clamp(28px,4vw,52px);border:0;background:#f4f0e8;color:#26332e;box-shadow:none;animation:login-panel-enter .8s .16s cubic-bezier(.16,1,.3,1) both}
.login-form-head{margin-bottom:var(--o-s6)}
.login-form-head>p{color:#557266;font-size:var(--o-t-xs);font-weight:var(--o-w-bold);letter-spacing:.08em}
.login-form-head h2{margin:5px 0 var(--o-s2);font-size:28px;line-height:1.2}
.login-form-head>span{color:#617069;font-size:var(--o-t-sm)}
.login-notice{
  margin-bottom:var(--o-s4);
  padding:var(--o-s2) var(--o-s3);
  border:1px solid #aec3ad;
  border-radius:var(--o-radius);
  background:#e4ede0;
  color:#31594d;
  font-size:var(--o-t-sm);
}
#login-form label:not(.field){display:block;margin-bottom:var(--o-s1);color:#34443c;font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
#login-form>input{margin-bottom:var(--o-s4)}
.login-label-row{display:flex;align-items:center;justify-content:space-between}
.login-label-row label{margin-bottom:0}
.login-panel .btn--quiet{color:#36594e}.login-panel .btn--quiet:hover{background:#e4e9e0}
.login-panel .btn.login-submit{width:100%;justify-content:center;margin-top:var(--o-s2);border-color:#173832;background:#173832;color:#f4f0e8}.login-panel .btn.login-submit:hover{border-color:#25594e;background:#25594e}
.login-footnote{margin-top:var(--o-s5);color:#6e7b73;font-size:var(--o-t-xs)}
@keyframes login-enter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}
@keyframes login-panel-enter{from{opacity:0;transform:translateX(20px)}to{opacity:1;transform:translateX(0)}}
@keyframes login-playhead{0%,100%{left:35%}50%{left:92%}}
@media (max-width:760px){
  .login-layout{grid-template-columns:minmax(0,1fr)}
  .login-intro{min-height:auto;padding:24px 22px 32px;gap:28px}
  .login-copy h1{font-size:38px}.login-flow-stage{height:120px}
  .login-panel{width:auto;margin:0;padding:32px 22px 36px}.login-capabilities{display:none}
}
@media (prefers-reduced-motion:reduce){
  .login-copy,.login-flow,.login-panel{animation:none}
  .login-flow-track b{animation:none;left:76%}
}

/* 9.3 设置页 (settings.html) —— 这里只放纯排布、不带 JS 选择器耦合的类名。
   settings.js 用类名当选择器的那批(settings-section/settings-field/
   settings-disclosure/settings-state/service* 等)放第 10 节兼容隔离区。 */
.settings-health{display:grid;justify-items:end;gap:2px}
.settings-nav{
  position:sticky;
  top:0;
  z-index:10;
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  justify-content:space-between;
  gap:var(--o-s4);
  margin-bottom:var(--o-s2);
  padding-top:var(--o-s2);
  background:var(--o-canvas);
}
.settings-nav .app-tabs{flex:1;min-width:0;margin-bottom:0;border-bottom:0}
.settings-search{display:flex;align-items:center;gap:var(--o-s2);margin-bottom:var(--o-s4);color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.settings-search input{width:220px;min-height:30px;padding:4px 10px}
.settings-content{display:grid;gap:var(--o-s5)}
.settings-route-callout{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--o-s5);
  padding:var(--o-s4);
  border-top:1px solid var(--o-line);
  background:var(--o-subtle);
}
.settings-route-callout strong{display:block;font-size:var(--o-t-md)}
.settings-route-callout span{color:var(--o-muted);font-size:var(--o-t-sm)}
.service-health-panel{padding:var(--o-s4);border-bottom:1px solid var(--o-line)}
.service-health-top{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--o-s4);margin-bottom:var(--o-s3)}
.service-health-top h3{font-size:var(--o-t-md)}
.deployment-list{display:grid;grid-template-columns:220px minmax(0,1fr);margin:0}
.deployment-list dt,.deployment-list dd{padding:var(--o-s3) var(--o-s4);border-bottom:1px solid var(--o-line-muted)}
.deployment-list dt{color:var(--o-muted);font-weight:var(--o-w-bold)}
.deployment-list dd{overflow-wrap:anywhere;font-family:var(--o-mono);font-size:var(--o-t-sm)}
.settings-savebar{
  position:fixed;
  right:var(--o-s5);
  bottom:var(--o-s5);
  z-index:30;
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--o-s3);
  max-width:calc(100vw - var(--o-sidebar) - var(--o-s6));
  padding:var(--o-s2) var(--o-s2) var(--o-s2) var(--o-s4);
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  box-shadow:0 12px 32px rgb(31 35 40 / 14%);
}
.settings-savebar>span:first-child{color:var(--o-muted);font-size:var(--o-t-sm)}
@media (max-width:980px){
  .settings-nav{position:static;flex-direction:column;align-items:stretch}
  .settings-search{justify-content:space-between}
  .settings-search input{width:auto;flex:1}
  .settings-savebar{right:var(--o-s4);left:var(--o-s4);max-width:none}
}

/* 9.4 API 文档页 (api-docs.html) —— api-docs.js 把这批类名整段写进模板字符串
   (不是先建 DOM 再 classList.toggle), 所以名字必须原样保留, 但没有"读不读
   得到样式就会出行为 bug"的耦合, 纯样式, 直接照抄第 8 节的语言重做一遍。
   .app-canvas 已经在第 7 节设了 container:page/inline-size, 这里的窄屏
   断点走 @container 而不是 @media, 和发布中心/设置页保持同一套响应策略。 */
.api-docs-totals{display:flex;gap:var(--o-s5);flex:none}
.api-docs-total{display:flex;flex-direction:column;align-items:flex-end;gap:2px;white-space:nowrap}
.api-docs-total strong{font:var(--o-w-bold) 22px/1.2 var(--o-mono)}
.api-docs-total span{color:var(--o-muted);font-size:var(--o-t-xs)}
.api-empty{margin:0;padding:var(--o-s6) 0;color:var(--o-muted);text-align:center}
.api-connect{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(340px,.85fr);margin-bottom:var(--o-s5);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);overflow:hidden}
.api-connect-copy{min-width:0;padding:var(--o-s4)}
.api-connect-copy>p:not(.api-section-label){max-width:70ch;margin:var(--o-s2) 0 var(--o-s4);color:var(--o-muted);overflow-wrap:anywhere}
.api-connect dl{margin:0;display:grid;gap:var(--o-s3)}
.api-connect dl div{display:grid;grid-template-columns:104px minmax(0,1fr);gap:var(--o-s3);align-items:baseline}
.api-connect dt{color:var(--o-faint);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.api-connect dd{margin:0;min-width:0;font-size:var(--o-t-sm);overflow-wrap:anywhere}
.api-quickstart{min-width:0;padding:var(--o-s4);border-left:1px solid var(--o-line);background:var(--o-subtle)}
.api-code-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--o-s3);margin-bottom:var(--o-s2);color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.api-code-heading button,.api-endpoint-actions button,.api-module-index button,.api-load-more button{
  height:26px;
  padding:0 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-muted);
  font-size:var(--o-t-xs);
  cursor:pointer;
}
.api-code-heading button:hover,.api-endpoint-actions button:hover,.api-load-more button:hover{border-color:#c3cbd3;color:var(--o-fg)}
.api-quickstart pre,.api-endpoint-body pre{margin:0;overflow:auto;border:1px solid #2f3945;border-radius:var(--o-radius);background:#20262c;color:#e6ebef;font:var(--o-t-xs)/1.65 var(--o-mono)}
.api-quickstart pre{padding:var(--o-s3) var(--o-s4)}
.api-reference-links{display:flex;flex-wrap:wrap;gap:6px var(--o-s4);margin-top:var(--o-s3)}
.api-reference-links a{font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}

.api-safety{display:grid;grid-template-columns:auto auto auto auto minmax(260px,1fr);gap:var(--o-s3) var(--o-s5);align-items:center;margin-bottom:var(--o-s5);padding:var(--o-s3) var(--o-s4);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-muted);font-size:var(--o-t-sm)}
.api-safety strong{color:var(--o-fg)}
.api-safety span{display:flex;align-items:center;gap:6px;white-space:nowrap}
.api-safety p{min-width:0;margin:0;overflow-wrap:anywhere}
.api-access-dot{width:7px;height:7px;border-radius:50%;background:var(--o-faint)}
.api-access-dot.is-read{background:var(--o-accent)}
.api-access-dot.is-write{background:var(--o-fg)}
.api-access-dot.is-confirmed{background:var(--o-warn)}

.api-browser-heading,.skill-browser>.api-browser-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--o-s4)}
.api-browser-heading p:last-child{margin:0;color:var(--o-faint);font-size:var(--o-t-sm)}
.skill-intro{max-width:74ch;margin:var(--o-s3) 0 var(--o-s4);color:var(--o-muted);font-size:var(--o-t-sm)}
.api-filters{display:grid;grid-template-columns:minmax(240px,1fr) 200px 140px;gap:var(--o-s3);margin:var(--o-s4) 0}
.api-filters label{display:grid;min-width:0;gap:6px}
.api-filters label span{color:var(--o-faint);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.api-module-index{display:flex;flex-wrap:wrap;gap:6px;padding-bottom:var(--o-s4)}
.api-module-index button{border-radius:999px}
.api-module-index button[aria-pressed="true"]{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}

.api-results,.skill-results{border-top:1px solid var(--o-line)}
.api-module{scroll-margin-top:16px}
.api-module-header{display:grid;grid-template-columns:84px minmax(0,1fr) auto;gap:var(--o-s4);align-items:start;padding:var(--o-s4) 0 var(--o-s2);border-bottom:1px solid var(--o-line)}
.api-module-id{color:var(--o-accent);font:var(--o-w-bold) var(--o-t-xs)/1.4 var(--o-mono);letter-spacing:.04em}
.api-module-header p{margin:4px 0 0;max-width:70ch;color:var(--o-muted);font-size:var(--o-t-sm)}
.api-module-count{color:var(--o-faint);font-size:var(--o-t-sm);white-space:nowrap}
.api-endpoint,.skill-entry{border-bottom:1px solid var(--o-line-muted)}
.api-endpoint>summary,.skill-entry>summary{display:grid;grid-template-columns:70px minmax(250px,1.2fr) minmax(160px,.8fr) auto auto;gap:var(--o-s3);align-items:center;min-height:52px;padding:var(--o-s2) var(--o-s1);cursor:pointer;list-style:none}
.api-endpoint>summary::-webkit-details-marker,.skill-entry>summary::-webkit-details-marker{display:none}
.api-endpoint>summary::after,.skill-entry>summary::after{content:"+";grid-column:5;color:var(--o-faint);font-size:15px}
.api-endpoint[open]>summary::after,.skill-entry[open]>summary::after{content:"\2212"}
.api-endpoint>summary:hover,.skill-entry>summary:hover{background:var(--o-subtle)}
.api-method{display:inline-flex;align-items:center;justify-content:center;width:58px;height:22px;border-radius:var(--o-radius);background:var(--o-subtle);color:var(--o-fg);font:var(--o-w-bold) 10px/1 var(--o-mono);letter-spacing:.02em}
.api-method[data-method="GET"]{background:var(--o-accent-soft);color:var(--o-accent)}
.api-method[data-method="PATCH"],.api-method[data-method="PUT"]{background:var(--o-warn-soft);color:var(--o-warn)}
.api-method[data-method="DELETE"]{background:var(--o-danger-soft);color:var(--o-danger)}
.api-path{min-width:0;font-size:var(--o-t-sm);overflow-wrap:anywhere}
.api-summary{color:var(--o-muted);font-size:var(--o-t-sm)}
.api-access{justify-self:end;padding:2px 7px;border:1px solid var(--o-line);border-radius:999px;color:var(--o-faint);font-size:var(--o-t-xs);white-space:nowrap}
.api-access[data-access="confirmed-write"]{border-color:var(--o-warn-line);background:var(--o-warn-soft);color:var(--o-warn)}
.api-endpoint-body{display:grid;grid-template-columns:minmax(180px,.55fr) minmax(0,1.45fr);gap:var(--o-s5);padding:var(--o-s4) var(--o-s1) var(--o-s5);border-top:1px solid var(--o-line);background:var(--o-subtle)}
.api-endpoint-meta{margin:0;display:grid;align-content:start;gap:var(--o-s3)}
.api-endpoint-meta div{display:grid;gap:2px}
.api-endpoint-meta dt{color:var(--o-faint);font-size:10px;font-weight:var(--o-w-bold);letter-spacing:.05em;text-transform:uppercase}
.api-endpoint-meta dd{margin:0;font:var(--o-t-sm)/1.5 var(--o-mono);overflow-wrap:anywhere}
.api-endpoint-code{min-width:0}
.api-endpoint-body pre{padding:var(--o-s3);white-space:pre-wrap;overflow-wrap:anywhere}
.api-endpoint-actions{display:flex;flex-wrap:wrap;gap:var(--o-s2);margin-top:var(--o-s3)}
.api-endpoint-actions a{display:inline-flex;align-items:center;height:26px;padding:0 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.api-endpoint-actions a:hover{border-color:#c3cbd3;background:var(--o-surface)}
.api-loading{display:grid;gap:var(--o-s3);padding:var(--o-s5) 0}
.api-loading span{display:block;height:14px;border-radius:var(--o-radius);background:var(--o-line-muted)}
.api-loading span:nth-child(2){width:84%}
.api-loading span:nth-child(3){width:67%}
.api-load-more{display:flex;align-items:center;justify-content:center;gap:var(--o-s3);padding:var(--o-s4) 0;border-bottom:1px solid var(--o-line)}
.api-load-more button{height:32px;padding:0 var(--o-s3);border-color:var(--o-accent-line);color:var(--o-accent);font-weight:var(--o-w-bold)}
.api-load-more button:hover{background:var(--o-accent-soft)}
.api-load-more span{color:var(--o-faint);font-size:var(--o-t-sm)}

.skill-category{color:var(--o-accent);font-size:var(--o-t-xs);font-weight:var(--o-w-bold);letter-spacing:.02em}
.skill-name{display:grid;gap:2px;min-width:0}
.skill-name strong{font-size:var(--o-t-md)}
.skill-name small{max-width:72ch;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-normal)}
.skill-risk,.skill-step-count{white-space:nowrap;color:var(--o-faint);font-size:var(--o-t-xs)}
.skill-risk{padding:2px 7px;border:1px solid var(--o-line);border-radius:999px}
.skill-risk[data-risk="read_only"]{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.skill-risk[data-risk="provider_write"]{border-color:var(--o-warn-line);background:var(--o-warn-soft);color:var(--o-warn)}
.skill-risk[data-risk="external_write"]{border-color:var(--o-danger-line);background:var(--o-danger-soft);color:var(--o-danger)}
.skill-body{display:grid;grid-template-columns:minmax(180px,.7fr) minmax(360px,1.5fr) minmax(220px,.8fr);gap:var(--o-s5);padding:var(--o-s5) var(--o-s1) var(--o-s5);border-top:1px solid var(--o-line);background:var(--o-subtle)}
.skill-body h3{margin:0 0 var(--o-s3);color:var(--o-faint);font-size:10px;letter-spacing:.05em;text-transform:uppercase}
.skill-inputs{margin:0;display:grid;gap:var(--o-s3)}
.skill-inputs div{display:grid;gap:4px}
.skill-inputs dt{display:flex;align-items:center;gap:6px;font-size:var(--o-t-sm)}
.skill-inputs dt span{padding:1px 5px;border-radius:999px;background:var(--o-line-muted);color:var(--o-faint);font-size:9px}
.skill-inputs dd,.skill-no-inputs,.skill-policy p{margin:0;color:var(--o-muted);font-size:var(--o-t-sm)}
.skill-workflow ol{margin:0;padding:0;list-style:none;display:grid;gap:var(--o-s3)}
.skill-workflow li{display:grid;grid-template-columns:22px minmax(0,1fr) auto;gap:var(--o-s2);align-items:start}
.skill-step-index{display:grid;place-items:center;width:20px;height:20px;border-radius:50%;background:var(--o-line-muted);color:var(--o-faint);font-size:10px;font-weight:var(--o-w-bold)}
.skill-workflow li>div{display:grid;gap:2px;min-width:0}
.skill-workflow strong{font-size:var(--o-t-sm)}
.skill-workflow code{font:11px/1.45 var(--o-mono);overflow-wrap:anywhere}
.skill-workflow p{margin:0;color:var(--o-muted);font-size:11px}
.skill-confirm,.skill-checkpoint{align-self:start;padding:2px 6px;border:1px solid var(--o-line);border-radius:999px;color:var(--o-faint);font-size:9px;white-space:nowrap}
.skill-confirm{border-color:var(--o-warn-line);background:var(--o-warn-soft);color:var(--o-warn)}
.skill-actions{display:grid;gap:var(--o-s2);margin-top:var(--o-s4)}
.skill-actions a{display:flex;align-items:center;justify-content:center;height:30px;padding:0 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);font-size:11px;font-weight:var(--o-w-bold)}
.skill-actions a:hover{border-color:#c3cbd3;background:var(--o-surface)}

@container page (max-width:920px){
  .api-connect{grid-template-columns:1fr}
  .api-quickstart{border-left:0;border-top:1px solid var(--o-line)}
  .api-safety{grid-template-columns:1fr 1fr}
  .api-safety strong,.api-safety p{grid-column:1/-1}
  .api-filters{grid-template-columns:1fr 1fr}
  .api-filters label:first-child{grid-column:1/-1}
  .api-endpoint>summary,.skill-entry>summary{grid-template-columns:60px minmax(0,1fr) auto auto}
  .api-summary{grid-column:2}
  .api-access{grid-column:3;grid-row:1/3}
  .api-endpoint>summary::after,.skill-entry>summary::after{grid-column:4;grid-row:1/3}
  .skill-body{grid-template-columns:1fr 1.5fr}
  .skill-policy{grid-column:1/-1}
  .skill-actions{display:flex;flex-wrap:wrap}
  .skill-actions a{min-width:180px}
}
@container page (max-width:620px){
  .api-docs-totals{margin-top:var(--o-s4)}
  .api-connect dl div{grid-template-columns:1fr;gap:2px}
  .api-filters{grid-template-columns:1fr}
  .api-filters label:first-child{grid-column:auto}
  .api-module-header{grid-template-columns:52px minmax(0,1fr)}
  .api-module-count{grid-column:2}
  .api-endpoint>summary{grid-template-columns:52px minmax(0,1fr) auto;padding-inline:0}
  .api-summary{font-size:var(--o-t-xs)}
  .api-access{display:none}
  .api-endpoint>summary::after{grid-column:3}
  .api-endpoint-body{grid-template-columns:1fr;padding-inline:0}
  .api-endpoint-meta{grid-template-columns:1fr 1fr}
  .skill-entry>summary{grid-template-columns:minmax(0,1fr) auto 18px;padding-inline:0}
  .skill-category,.skill-name{grid-column:1}
  .skill-risk{grid-column:2;grid-row:1/3}
  .skill-step-count{display:none}
  .skill-entry>summary::after{grid-column:3;grid-row:1/3}
  .skill-body{grid-template-columns:1fr;padding-inline:0}
  .skill-policy{grid-column:auto}
  .skill-workflow li{grid-template-columns:22px minmax(0,1fr)}
  .skill-confirm,.skill-checkpoint{grid-column:2}
  .api-reference-links a{display:inline-flex;align-items:center;min-height:44px}
  .api-load-more{align-items:stretch;flex-direction:column}
  .api-load-more span{text-align:center}
  /* 窄屏下这批小按钮/链接是唯一的可点触点, 补到 44px 触控目标 */
  .api-code-heading button,.api-endpoint-actions button,.api-endpoint-actions a,
  .skill-actions a,.api-module-index button,.api-load-more button{min-height:44px}
}

/* 9.5 日志中心 (notifications.html) —— .notifications-summary/.operations-
   metrics-grid 是纯 HTML 排布, 直接用 class="stats" 复用第 8.2 节, 这里不重
   写。只放 stats 覆盖不了的东西: 故障诊断条 / 运行指标盒子 / 失败阶段 pill。
   notification-item 及其内部结构由 notifications.js 拼字符串生成, 放第 10 节。 */
.readiness-links{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:6px var(--o-s4);
  margin-bottom:var(--o-s5);
  padding:var(--o-s3) var(--o-s4);
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-subtle);
  font-size:var(--o-t-sm);
}
.readiness-links span{color:var(--o-muted);font-weight:var(--o-w-bold)}
.readiness-links a{font-weight:var(--o-w-bold)}
.operations-metrics-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--o-s4)}
.operations-metrics-heading>p{margin:0;color:var(--o-faint);font-size:var(--o-t-xs)}
.operations-metrics-grid dt{color:var(--o-faint);font-size:10px;font-weight:var(--o-w-bold)}
.operations-metrics-grid dd{margin-top:4px;font:var(--o-w-bold) 16px/1.3 var(--o-mono)}
.failure-stage-summary{display:grid;grid-template-columns:90px minmax(0,1fr);gap:var(--o-s3);margin-top:var(--o-s4);align-items:start}
.failure-stage-summary h3{margin-top:2px;font-size:var(--o-t-sm)}
.failure-stage-summary>p{margin:0;color:var(--o-faint);font-size:var(--o-t-xs)}
.failure-stage-summary ul{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}
.failure-stage-summary li{
  display:flex;
  gap:6px;
  padding:3px 8px;
  border:1px solid var(--o-danger-line);
  border-radius:999px;
  background:var(--o-danger-soft);
  color:var(--o-danger);
  font-size:10px;
}
.operations-metrics-note{max-width:75ch;margin-top:var(--o-s3);color:var(--o-faint);font-size:10px}
.notifications-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--o-s5);margin-bottom:var(--o-s4);border-bottom:1px solid var(--o-line)}
.notifications-toolbar .app-tabs{margin-bottom:0;border-bottom:0}
#notifications-status{margin:0 0 var(--o-s2);color:var(--o-faint);font-size:var(--o-t-xs)}
.notification-loading{display:grid;gap:var(--o-s3);padding:var(--o-s5) 0}
.notification-loading span{height:48px;border-radius:var(--o-radius);background:var(--o-line-muted);animation:notification-pulse 1.2s ease-in-out infinite alternate}
.notification-loading span:nth-child(2){animation-delay:.12s}
.notification-loading span:nth-child(3){animation-delay:.24s}
@keyframes notification-pulse{from{opacity:.5}to{opacity:.9}}
.notifications-footnote{margin-top:var(--o-s4);color:var(--o-faint);font-size:var(--o-t-xs)}
@media (max-width:760px){
  .notifications-toolbar{display:block}
  #notifications-status{margin:var(--o-s2) 0}
}
@media (max-width:430px){
  .operations-metrics-heading{display:grid}
  .operations-metrics-grid{grid-template-columns:1fr}
  .failure-stage-summary{grid-template-columns:1fr}
}
@media (prefers-reduced-motion:reduce){.notification-loading span{animation:none}}

/* 9.6 通知中心 (notification-center.html) —— summary 直接用 class="stats"
   (第 8.2 节), 这里只放 provider 目录卡片和底部保存条这些没处可归的排布。
   channel-row 及其内部结构由 notification-center.js 拼 DOM, 放第 10 节。 */
.provider-list{display:grid}
.provider-list article{
  display:grid;
  grid-template-columns:36px minmax(0,1fr) auto;
  gap:var(--o-s4);
  align-items:center;
  padding:var(--o-s3) 0;
  border-bottom:1px solid var(--o-line-muted);
}
.provider-list article:last-child{border-bottom:0}
.provider-mark{
  display:grid;
  place-items:center;
  width:32px;
  height:32px;
  border:1px solid var(--o-line);
  border-radius:50%;
  color:var(--o-muted);
  font-size:10px;
  font-weight:var(--o-w-bold);
}
.provider-list b{font-size:var(--o-t-md)}
.provider-list p{margin-top:2px;color:var(--o-faint);font-size:var(--o-t-xs)}
.provider-status{
  padding:3px 8px;
  border:1px solid var(--o-line);
  border-radius:999px;
  color:var(--o-faint);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-bold);
}
.provider-status.is-ready{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.notification-savebar{
  position:sticky;
  bottom:0;
  z-index:4;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--o-s5);
  margin-top:var(--o-s5);
  padding:var(--o-s4) 0;
  border-top:1px solid var(--o-line);
  background:color-mix(in srgb,var(--o-surface) 94%,transparent);
}
.notification-savebar>div{display:grid;gap:2px}
.notification-savebar b{font-size:var(--o-t-md)}
.notification-savebar span{color:var(--o-faint);font-size:var(--o-t-xs)}
#channel-message{margin-top:2px;color:var(--o-muted);font-size:var(--o-t-xs)}
#channel-message.is-error{color:var(--o-danger)}
#channel-message.is-success{color:var(--o-accent)}
@media (max-width:640px){
  .provider-list article{grid-template-columns:32px minmax(0,1fr)}
  .provider-status{grid-column:2;justify-self:start}
  .notification-savebar{display:grid}
  .notification-savebar button{width:100%}
}

/* 9.7 电商创作 (product.html) —— 整页视觉自成一套, 组件命名早已存在且被
   product.js 大量复用(见第 10 节), 这里整段重做颜色/圆角/间距, 不改类名。
   圆角统一 var(--o-radius); 灰阶/强调色统一走 --o-* 令牌, 不再有独立
   success/warning/danger 十六进制字面量。 */
.product-service{padding:6px 10px;border:1px solid var(--o-line);border-radius:999px;background:var(--o-surface);color:var(--o-muted);font-size:var(--o-t-sm);white-space:nowrap}
.product-service[data-state="ready"]{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.product-service[data-state="busy"]{border-color:var(--o-warn-line);background:var(--o-warn-soft);color:var(--o-warn)}
.product-service[data-state="error"]{border-color:var(--o-danger-line);background:var(--o-danger-soft);color:var(--o-danger)}

.product-guide{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin-bottom:var(--o-s5);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.product-guide>div{display:flex;gap:var(--o-s3);align-items:center;padding:var(--o-s3) var(--o-s4);border-right:1px solid var(--o-line-muted)}
.product-guide>div:last-child{border-right:0}
.product-guide b{display:grid;place-items:center;width:24px;height:24px;border-radius:var(--o-radius);background:var(--o-accent-soft);color:var(--o-accent);font-size:var(--o-t-xs)}
.product-guide strong{display:block;font-size:var(--o-t-md)}
.product-guide small{display:block;margin-top:2px;color:var(--o-faint);font-size:var(--o-t-xs)}

.product-project-bar--page{max-width:620px;margin:0 0 var(--o-s4)}
.product-tab-panel[hidden]{display:none}
.product-profile-summary{margin:0 0 var(--o-s4);padding:var(--o-s3);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle);color:var(--o-muted);font-size:var(--o-t-sm);line-height:1.7}
.product-visual-grid{margin-top:var(--o-s4)}
.product-fact-grid input[type="color"]{min-height:var(--o-control);padding:4px;cursor:pointer}

.product-grid{display:grid;grid-template-columns:minmax(360px,510px) minmax(0,1fr);gap:0;align-items:start}
.product-panel,.product-results{border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.product-panel{padding:var(--o-s5)}
.product-results{min-height:620px;padding:var(--o-s5);border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;background:var(--o-subtle)}
.product-panel-title{display:flex;gap:var(--o-s3);margin-bottom:var(--o-s4)}
.product-panel-title--compact{margin:var(--o-s5) 0 var(--o-s3);padding-top:var(--o-s4);border-top:1px solid var(--o-line)}
.product-panel-title>span{display:grid;place-items:center;flex:0 0 26px;width:26px;height:26px;border-radius:var(--o-radius);background:var(--o-accent-soft);color:var(--o-accent);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.product-panel-title p,.product-result-head p{margin-top:2px;color:var(--o-faint);font-size:var(--o-t-sm)}

.product-project-bar{display:flex;align-items:end;gap:var(--o-s2);margin-bottom:var(--o-s4)}
.product-project-bar label{display:grid;flex:1;gap:6px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.product-panel select,.product-panel textarea,.product-panel input:not([type]),.product-panel input[type="text"]{
  width:100%;padding:7px 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);font:var(--o-t-md) var(--o-font);
}
.product-panel textarea{min-height:75px;resize:vertical}

.product-upload{position:relative;display:grid;place-items:center;min-height:202px;overflow:hidden;border:1px dashed var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle);cursor:pointer}
.product-upload:hover{border-color:var(--o-accent);background:var(--o-accent-soft)}
.product-upload input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.product-upload img{display:none;width:100%;height:260px;object-fit:contain;background:var(--o-surface)}
.product-upload img.is-visible{display:block}
.product-upload span{display:grid;gap:4px;padding:var(--o-s4);text-align:center}
.product-upload b{font-size:var(--o-t-md)}
.product-upload small{color:var(--o-faint);font-size:var(--o-t-sm)}
.product-file-note{min-height:18px;margin-top:6px;color:var(--o-faint);font-size:var(--o-t-xs)}
.product-reference-list{display:flex;flex-wrap:wrap;gap:var(--o-s2);margin-top:var(--o-s3)}
.product-reference{display:grid;grid-template-columns:36px minmax(0,1fr);gap:6px;align-items:center;max-width:100%;padding:4px 7px 4px 4px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle);color:var(--o-muted);font-size:var(--o-t-xs)}
.product-reference:hover{border-color:var(--o-accent);color:var(--o-accent)}
.product-reference img{width:36px;height:36px;border-radius:calc(var(--o-radius) - 1px);object-fit:cover;background:var(--o-line-muted)}
.product-reference span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.product-csv-import{display:grid;grid-template-columns:minmax(0,1fr) auto auto auto;gap:var(--o-s2);align-items:center;margin-bottom:var(--o-s4);padding:var(--o-s3);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.product-csv-import strong{display:block;color:var(--o-fg);font-size:var(--o-t-sm)}
.product-csv-import p{display:block;margin-top:2px;color:var(--o-faint);font-size:var(--o-t-xs)}
.product-csv-import label{display:inline-flex;align-items:center;white-space:nowrap}
.product-csv-import input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.product-text-link{font-size:var(--o-t-sm);white-space:nowrap}

.product-fields{display:grid;grid-template-columns:1.1fr .9fr;gap:var(--o-s3)}
.product-panel>label,.product-fields label{display:block;margin:var(--o-s4) 0 6px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.product-fields label{margin-top:var(--o-s4)}
.product-platforms,.product-deliverables{margin-top:var(--o-s4);padding:var(--o-s3);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.product-platforms legend,.product-deliverables legend{padding:0 4px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.product-platforms{display:flex;flex-wrap:wrap;gap:var(--o-s2) var(--o-s3)}
.product-platforms label{display:flex;align-items:center;gap:5px;color:var(--o-muted);font-size:var(--o-t-sm)}
.product-facts{margin-top:var(--o-s4)}
.product-facts>p{margin:0 0 var(--o-s2);color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.product-fact-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--o-s2)}
.product-fact-grid label{display:grid;gap:5px;color:var(--o-muted);font-size:var(--o-t-xs)}
.product-fact-grid input{width:100%;padding:7px 9px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);font:var(--o-t-sm) var(--o-font)}

.product-style-options{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--o-s2)}
.product-style-options button{padding:var(--o-s3);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle);color:var(--o-muted);text-align:left;cursor:pointer}
.product-style-options button:hover,.product-style-options button[aria-pressed="true"]{border-color:var(--o-accent);background:var(--o-accent-soft);color:var(--o-accent)}
.product-style-options strong{display:block;font-size:var(--o-t-sm)}
.product-style-options small{display:block;margin-top:3px;color:var(--o-faint);font-size:10px}
.product-deliverables{display:grid;gap:var(--o-s2)}
.product-deliverables label{display:flex;gap:var(--o-s2);align-items:flex-start;padding:var(--o-s2);border:1px solid transparent;border-radius:var(--o-radius);cursor:pointer}
.product-deliverables label:hover{border-color:var(--o-line);background:var(--o-surface)}
.product-deliverables input{margin-top:2px}
.product-deliverables b{display:block;color:var(--o-fg);font-size:var(--o-t-sm)}
.product-deliverables small{display:block;margin-top:2px;color:var(--o-faint);font-size:var(--o-t-xs)}
.product-option-row{display:flex;flex-wrap:wrap;gap:var(--o-s4);margin-top:var(--o-s3);color:var(--o-muted);font-size:var(--o-t-sm)}
.product-option-row label{display:flex;align-items:center;gap:6px;cursor:pointer}
.product-actions{display:grid;grid-template-columns:minmax(120px,.7fr) minmax(170px,1.3fr);gap:var(--o-s2);margin-top:var(--o-s5)}
.product-primary{width:100%}
.product-secondary{height:var(--o-control);padding:0 var(--o-s3);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-muted);font:var(--o-t-sm) var(--o-font);cursor:pointer}
.product-secondary:hover{border-color:#c3cbd3;background:var(--o-subtle);color:var(--o-fg)}
.product-status{min-height:20px;margin-top:var(--o-s2);color:var(--o-muted);font-size:var(--o-t-sm)}
.product-status[data-state="error"]{color:var(--o-danger)}
.product-status[data-state="success"]{color:var(--o-accent)}

.product-result-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--o-s4)}
.product-result-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--o-s3);margin-top:var(--o-s5)}
/* product.js re-emits this exact tile (with a <strong>, not <b>) whenever a
   result list comes back empty — same load-bearing rule as section 10 below. */
.product-empty{display:grid;grid-column:1/-1;place-items:center;min-height:375px;padding:var(--o-s5);border:1px dashed var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle);text-align:center;color:var(--o-faint)}
.product-empty strong{color:var(--o-muted);font-size:var(--o-t-lg)}
.product-empty span{max-width:310px;margin-top:5px;font-size:var(--o-t-sm)}
.product-result-card{overflow:hidden;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.product-result-image{position:relative;display:grid;place-items:center;aspect-ratio:1;background:var(--o-line-muted)}
.product-result-image img,.product-result-image video{width:100%;height:100%;object-fit:cover}
.product-result-placeholder{padding:var(--o-s4);text-align:center;color:var(--o-faint);font-size:var(--o-t-sm)}
.product-result-state{position:absolute;top:8px;right:8px;padding:3px 7px;border:1px solid var(--o-line);border-radius:999px;background:rgb(255 255 255 / 92%);color:var(--o-muted);font-size:10px}
.product-result-state[data-state="done"]{border-color:var(--o-accent-line);color:var(--o-accent)}
.product-result-state[data-state="error"]{border-color:var(--o-danger-line);color:var(--o-danger)}
.product-result-meta{padding:var(--o-s3)}
.product-result-meta h3{font-size:var(--o-t-md)}
.product-result-meta p{min-height:33px;margin:4px 0 var(--o-s2);color:var(--o-faint);font-size:var(--o-t-xs)}
.product-result-actions{display:flex;align-items:center;gap:6px}
.product-result-actions a,.product-result-actions button{height:26px;padding:0 8px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-muted);font-size:var(--o-t-xs);cursor:pointer}
.product-result-actions a:hover,.product-result-actions button:hover{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.product-result-actions button:disabled{opacity:.55;cursor:wait}
.product-result-saved{color:var(--o-accent);font-size:var(--o-t-xs)}
.product-checklist{margin-top:var(--o-s5);padding-top:var(--o-s4);border-top:1px solid var(--o-line);color:var(--o-muted);font-size:var(--o-t-sm)}
.product-checklist strong{color:var(--o-fg)}
.product-checklist ul{margin:6px 0 0;padding-left:18px}
.product-checklist li+li{margin-top:4px}

.product-export-controls{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:var(--o-s2);align-items:end;margin-bottom:var(--o-s3)}
.product-export-controls label{display:grid;gap:5px;color:var(--o-muted);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.product-export-controls select{width:100%;padding:7px 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);font:var(--o-t-md) var(--o-font)}
.product-export-link{display:inline-flex;align-items:center;justify-content:center;font-size:var(--o-t-sm);white-space:nowrap}
.product-export-link[aria-disabled="true"]{opacity:.52;pointer-events:none}
.product-preflight-list{display:grid;gap:var(--o-s2)}
.product-preflight-head{margin-bottom:2px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.product-preflight-list article{display:grid;gap:3px;padding:var(--o-s3);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.product-preflight-list article strong{color:var(--o-fg);font-size:var(--o-t-sm)}
.product-preflight-list article span{color:var(--o-faint);font-size:var(--o-t-xs)}
.product-preflight-list article[data-level="error"]{border-color:var(--o-danger-line);background:var(--o-danger-soft)}
.product-preflight-list article[data-level="warning"]{border-color:var(--o-warn-line);background:var(--o-warn-soft)}
.product-preflight-list article[data-level="ok"]{border-color:var(--o-accent-line);background:var(--o-accent-soft)}

@media (max-width:1180px){
  .product-guide{grid-template-columns:repeat(2,minmax(0,1fr))}
  .product-guide>div:nth-child(2){border-right:0}
  .product-guide>div:nth-child(-n+2){border-bottom:1px solid var(--o-line-muted)}
}
@container page (max-width:980px){
  .product-grid{grid-template-columns:1fr}
  .product-results{min-height:0;border-top:0;border-left:1px solid var(--o-line);border-radius:0 0 var(--o-radius) var(--o-radius)}
  .product-empty{min-height:280px}
}
@container page (max-width:640px){
  .product-guide{grid-template-columns:1fr}
  .product-guide>div{border-right:0;border-bottom:1px solid var(--o-line-muted)}
  .product-guide>div:last-child{border-bottom:0}
  .product-panel,.product-results{padding:var(--o-s4)}
  .product-fields,.product-style-options,.product-result-grid,.product-fact-grid,.product-actions{grid-template-columns:1fr}
  .product-result-head{align-items:flex-start;flex-direction:column}
  .product-result-head .product-secondary{width:100%}
  .product-csv-import,.product-export-controls{grid-template-columns:1fr}
  .product-csv-import .product-secondary,.product-export-link{width:100%}
}

/* 9.8 数字人成片工作室 (creator.html) —— 整页视觉自成一套, 圆角统一
   var(--o-radius), 灰阶/强调色统一走 --o-* 令牌。creator-preview-empty/
   -result 由 creator.js 整体覆盖 className, 和 creator-character-choice /
   creator-job-row / creator-library-card 一样在这写死没关系, 因为都是
   "只被赋一次值, 从不 toggle" 的静态类名, 不需要单独放兼容隔离区。 */
.creator-status{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px}
.creator-status span,.creator-fixed-engine{display:inline-flex;align-items:center;height:26px;border:1px solid var(--o-line);border-radius:999px;padding:0 10px;background:var(--o-surface);color:var(--o-muted);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.creator-status span[data-status="ready"]{color:var(--o-accent)}
.creator-status span[data-status="error"]{color:var(--o-danger)}
.creator-workspace{display:grid;grid-template-columns:minmax(460px,1fr) minmax(360px,.72fr);border:1px solid var(--o-line);border-radius:var(--o-radius);overflow:hidden;background:var(--o-surface)}
.creator-compose{padding:var(--o-s5);border-right:1px solid var(--o-line)}
.creator-mode-switch{display:grid;grid-template-columns:1fr 1fr;gap:var(--o-s2);margin-bottom:var(--o-s5);padding-bottom:var(--o-s4);border-bottom:1px solid var(--o-line)}
.creator-mode-switch button{display:grid;gap:3px;min-height:60px;border:1px solid var(--o-line);border-radius:var(--o-radius);padding:var(--o-s3);background:var(--o-subtle);color:var(--o-fg);text-align:left;cursor:pointer}
.creator-mode-switch button:hover{border-color:#c3cbd3;background:var(--o-surface)}
.creator-mode-switch button[aria-pressed="true"]{border-color:var(--o-accent);background:var(--o-accent-soft);box-shadow:0 0 0 2px var(--o-accent-soft)}
.creator-mode-switch strong{font-size:var(--o-t-sm)}
.creator-mode-switch small{color:var(--o-muted);font-size:10px;line-height:1.45}
.creator-section-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--o-s4)}
.creator-section-heading--spaced{margin-top:var(--o-s5);padding-top:var(--o-s4);border-top:1px solid var(--o-line)}
.creator-section-heading>div{display:flex;align-items:center;gap:var(--o-s2)}
.creator-section-heading>div>span{display:grid;place-items:center;width:24px;height:24px;border-radius:var(--o-radius);background:var(--o-accent-soft);color:var(--o-accent);font-size:10px;font-weight:var(--o-w-bold)}
.creator-text-button,.creator-icon-button{border:0;background:transparent;color:var(--o-accent);font:var(--o-w-bold) var(--o-t-sm) var(--o-font);cursor:pointer}
.creator-text-button:hover{text-decoration:underline}
.creator-counter{color:var(--o-faint);font-size:var(--o-t-xs)}
.creator-character-picker{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--o-s2);margin-top:var(--o-s3)}
.creator-character-choice{position:relative;display:grid;gap:6px;min-width:0;border:1px solid var(--o-line);border-radius:var(--o-radius);padding:6px;background:var(--o-surface);color:var(--o-fg);text-align:left;cursor:pointer}
.creator-character-choice:hover{border-color:#c3cbd3;background:var(--o-subtle)}
.creator-character-choice[aria-checked="true"]{border-color:var(--o-accent);box-shadow:0 0 0 2px var(--o-accent-soft)}
.creator-character-choice img{width:100%;aspect-ratio:1;border-radius:calc(var(--o-radius) - 1px);object-fit:cover;background:var(--o-line-muted)}
.creator-character-choice strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 2px 2px;font-size:var(--o-t-xs)}
.creator-empty-copy{grid-column:1/-1;margin:var(--o-s2) 0;color:var(--o-faint);font-size:var(--o-t-sm)}
.creator-auto-character-option{display:flex;align-items:flex-start;gap:var(--o-s3);margin-top:var(--o-s3);border:1px solid var(--o-accent-line);border-radius:var(--o-radius);padding:var(--o-s3);background:var(--o-accent-soft);cursor:pointer}
.creator-auto-character-option input{flex:0 0 auto;width:16px;height:16px;margin:1px 0 0;accent-color:var(--o-accent)}
.creator-auto-character-option span{display:grid;gap:3px}
.creator-auto-character-option strong{font-size:var(--o-t-sm)}
.creator-auto-character-option small{color:var(--o-muted);font-size:10px;line-height:1.45}
.creator-character-picker[data-disabled="true"]{opacity:.4;filter:saturate(.5)}
.creator-character-picker[data-disabled="true"] .creator-character-choice{cursor:not-allowed}
.creator-field{display:grid;gap:6px;margin-top:var(--o-s4)}
.creator-field>span{color:var(--o-fg);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.creator-field input,.creator-field select,.creator-field textarea{width:100%;min-height:var(--o-control);padding:8px 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);font:var(--o-t-md) var(--o-font)}
.creator-field textarea{resize:vertical;line-height:1.65}
.creator-field input[type="file"]{padding:6px;background:var(--o-subtle)}
.creator-field input[type="file"]::file-selector-button{margin-right:var(--o-s2);border:1px solid var(--o-line);border-radius:var(--o-radius);padding:5px 9px;background:var(--o-surface);color:var(--o-fg);font:var(--o-w-bold) var(--o-t-sm) var(--o-font);cursor:pointer}
.creator-field-grid{display:grid;grid-template-columns:1.25fr .75fr;gap:var(--o-s3)}
.creator-check{display:flex;align-items:center;gap:var(--o-s3);margin-top:var(--o-s4);border:1px solid var(--o-line);border-radius:var(--o-radius);padding:var(--o-s3);background:var(--o-subtle);cursor:pointer}
.creator-check input{width:16px;height:16px;margin:0;accent-color:var(--o-accent)}
.creator-check span{display:grid;gap:2px}
.creator-check strong{font-size:var(--o-t-sm)}
.creator-check small{color:var(--o-muted);font-size:var(--o-t-xs)}
.creator-pipeline-list{display:grid;grid-template-columns:1fr 1fr;gap:var(--o-s2);margin:var(--o-s4) 0 0;padding:0;list-style:none}
.creator-pipeline-list li{display:flex;align-items:center;gap:var(--o-s3);min-width:0;border:1px solid var(--o-line);border-radius:var(--o-radius);padding:var(--o-s3);background:var(--o-subtle)}
.creator-pipeline-list li>span{display:grid;place-items:center;flex:0 0 22px;height:22px;border-radius:50%;background:var(--o-line-muted);color:var(--o-accent);font-size:10px;font-weight:var(--o-w-bold)}
.creator-pipeline-list div{display:grid;gap:2px;min-width:0}
.creator-pipeline-list strong{font-size:var(--o-t-xs)}
.creator-pipeline-list small{color:var(--o-muted);font-size:10px;line-height:1.4}
.creator-boundary-note{margin-top:var(--o-s3);border:1px solid var(--o-line);border-radius:var(--o-radius);padding:var(--o-s3);background:var(--o-subtle);color:var(--o-muted);font-size:10px;line-height:1.55}
.creator-submit-row{display:flex;align-items:center;gap:var(--o-s3);margin-top:var(--o-s5)}
.creator-submit-row button,.creator-character-actions button{height:var(--o-control);padding:0 var(--o-s4)}
.creator-submit-row span,.creator-character-actions span{color:var(--o-muted);font-size:var(--o-t-xs)}
.creator-output{min-width:0;padding:var(--o-s5);background:var(--o-subtle)}
.creator-output-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--o-s3)}
.creator-output-head p{margin-top:4px;color:var(--o-muted);font-size:var(--o-t-xs)}
.creator-icon-button{display:grid;place-items:center;width:30px;height:30px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);font-size:16px}
.creator-preview-empty{min-height:310px;display:grid;place-content:center;justify-items:center;gap:var(--o-s2);color:var(--o-faint);text-align:center}
.creator-preview-empty svg{width:38px;height:38px;stroke-width:1.25}
.creator-preview-empty strong{color:var(--o-muted);font-size:var(--o-t-md)}
.creator-preview-empty span{font-size:var(--o-t-xs)}
.creator-preview-result{margin-top:var(--o-s4)}
.creator-preview-result video{display:block;width:100%;max-height:58vh;border-radius:var(--o-radius);background:var(--o-line-muted)}
.creator-preview-meta{display:flex;align-items:center;gap:var(--o-s3);margin-top:var(--o-s3)}
.creator-preview-meta strong{font-size:var(--o-t-sm)}
.creator-preview-meta span{color:var(--o-muted);font-size:var(--o-t-xs)}
.creator-preview-meta a{margin-left:auto;color:var(--o-accent);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.creator-job-list{display:grid;margin-top:var(--o-s4);border-top:1px solid var(--o-line)}
.creator-job-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px var(--o-s3);width:100%;border:0;border-bottom:1px solid var(--o-line-muted);padding:var(--o-s3) 2px;background:transparent;color:var(--o-fg);text-align:left;cursor:pointer}
.creator-job-row:hover{background:var(--o-surface)}
.creator-job-row strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--o-t-sm)}
.creator-job-row small{grid-column:1/-1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--o-muted);font-size:10px}
.creator-job-state{font-size:10px;font-weight:var(--o-w-bold)}
.creator-job-state[data-status="done"]{color:var(--o-accent)}
.creator-job-state[data-status="error"]{color:var(--o-danger)}
.creator-job-state[data-status="queued"],.creator-job-state[data-status="running"]{color:var(--o-warn)}
.creator-library,.creator-character-create{margin-top:var(--o-s5);border:1px solid var(--o-line);border-radius:var(--o-radius);padding:var(--o-s5);background:var(--o-surface)}
.creator-eyebrow{margin:0 0 4px;color:var(--o-accent);font-size:10.5px;font-weight:var(--o-w-bold);letter-spacing:.06em;text-transform:uppercase}
.creator-library-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--o-s4)}
.creator-library-head span{display:block;margin-top:5px;color:var(--o-muted);font-size:var(--o-t-sm)}
.creator-library-head>a{border:1px solid var(--o-line);border-radius:var(--o-radius);padding:8px 11px;color:var(--o-fg);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.creator-library-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--o-s3);margin-top:var(--o-s4)}
.creator-library-card{min-width:0}
.creator-library-card img{display:block;width:100%;aspect-ratio:4/5;border-radius:var(--o-radius);object-fit:cover;background:var(--o-line-muted)}
.creator-library-card h3{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:var(--o-s2) 0 2px;font-size:var(--o-t-sm)}
.creator-library-card p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0;color:var(--o-muted);font-size:10px}
.creator-library-card .secondary{width:100%;margin-top:6px;height:26px;padding:0 8px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-muted);font-size:var(--o-t-xs);cursor:pointer}
.creator-library-card .secondary:hover{border-color:#c3cbd3;color:var(--o-fg)}
.creator-character-form{display:grid;grid-template-columns:1.25fr 1fr 1fr 1fr;gap:0 var(--o-s3);margin-top:4px}
.creator-field--wide{grid-column:1/4}
.creator-character-actions{display:flex;align-items:end;gap:var(--o-s3);padding-bottom:1px}
@container page (max-width:1100px){
  .creator-character-picker{grid-template-columns:repeat(3,minmax(0,1fr))}
  .creator-library-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
  .creator-character-form{grid-template-columns:1fr 1fr}
  .creator-field--wide{grid-column:1/2}
}
@container page (max-width:900px){
  .creator-workspace{grid-template-columns:1fr}
  .creator-compose{border-right:0;border-bottom:1px solid var(--o-line)}
  .creator-preview-empty{min-height:220px}
}
@container page (max-width:620px){
  .creator-status{justify-content:flex-start}
  .creator-compose,.creator-output,.creator-library,.creator-character-create{padding:var(--o-s4)}
  .creator-character-picker{grid-template-columns:repeat(2,minmax(0,1fr))}
  .creator-field-grid,.creator-character-form,.creator-mode-switch,.creator-pipeline-list{grid-template-columns:1fr}
  .creator-field--wide{grid-column:auto}
  .creator-library-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .creator-submit-row,.creator-character-actions{align-items:flex-start;flex-direction:column}
}

/* 9.9 数字人工作室 (avatar.html) —— 六个引擎共用同一套字段/高级参数外壳,
   全是静态 HTML(六段 hidden 切换), avatar.js 只生成任务列表那几行(见第
   10 节末尾一并列出, 没必要单独分节)。圆角统一 var(--o-radius)。 */
.avatar-job-state,.avatar-engine{display:inline-flex;align-items:center;height:26px;border:1px solid var(--o-line);border-radius:999px;padding:0 9px;color:var(--o-muted);background:var(--o-surface);font-size:var(--o-t-xs);font-weight:var(--o-w-bold);white-space:nowrap}
.avatar-job-state[data-status="completed"]{color:var(--o-accent)}
.avatar-job-state[data-status="queued"],.avatar-job-state[data-status="running"]{color:var(--o-warn)}
.avatar-job-state[data-status="failed"]{color:var(--o-danger)}
.avatar-engine{color:var(--o-accent);background:var(--o-accent-soft);border-color:var(--o-accent-line)}
.avatar-mode-groups{display:grid;grid-template-columns:minmax(0,2fr) minmax(320px,1fr);gap:var(--o-s4);margin-bottom:var(--o-s5)}
.avatar-mode-group{min-width:0}
.avatar-mode-group-head{display:flex;align-items:center;justify-content:space-between;gap:var(--o-s4);margin:0 2px var(--o-s2)}
.avatar-mode-group-head strong{font-size:var(--o-t-sm)}
.avatar-mode-group-head span{color:var(--o-faint);font-size:var(--o-t-xs)}
.avatar-mode-switch{display:grid;gap:6px;padding:5px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.avatar-mode-switch--speech{grid-template-columns:repeat(4,minmax(0,1fr))}
.avatar-mode-switch--motion{grid-template-columns:repeat(2,minmax(0,1fr))}
.avatar-mode-button{display:flex;align-items:flex-start;justify-content:center;flex-direction:column;gap:3px;min-height:62px;border:1px solid transparent;border-radius:var(--o-radius);padding:var(--o-s3);background:transparent;color:var(--o-muted);text-align:left;cursor:pointer}
.avatar-mode-button span{font-size:var(--o-t-md);font-weight:var(--o-w-bold);white-space:nowrap}
.avatar-mode-button small{color:var(--o-faint);font-size:var(--o-t-xs);line-height:1.35}
.avatar-mode-button:hover{background:var(--o-subtle)}
.avatar-mode-button[aria-selected="true"]{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.avatar-mode-button[aria-selected="true"] small{color:var(--o-muted)}
.avatar-workspace{display:grid;grid-template-columns:minmax(320px,420px) minmax(520px,1fr);gap:0;align-items:start}
.avatar-panel{border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.avatar-workspace>.avatar-panel+.avatar-panel{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;background:var(--o-subtle)}
.avatar-form{padding:var(--o-s5)}
.avatar-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--o-s4)}
.avatar-section-head p{margin-top:4px;color:var(--o-muted);font-size:var(--o-t-sm)}
.avatar-portrait-source{margin-top:var(--o-s4);padding:var(--o-s4);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.avatar-field-label{margin-bottom:var(--o-s2);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.avatar-source-switch{display:grid;grid-template-columns:1fr 1fr;padding:3px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.avatar-source-button{min-height:34px;border:1px solid transparent;border-radius:calc(var(--o-radius) - 1px);background:transparent;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold);cursor:pointer}
.avatar-source-button:hover{color:var(--o-fg);background:var(--o-subtle)}
.avatar-source-button[aria-pressed="true"]{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.avatar-ai-portrait{padding-top:3px}
.avatar-ai-options{display:grid;grid-template-columns:1fr 1fr;gap:var(--o-s3)}
.avatar-ai-actions{display:flex;align-items:center;gap:var(--o-s3);margin-top:var(--o-s4)}
.avatar-ai-actions button{border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);padding:8px 11px;font-size:var(--o-t-sm);font-weight:var(--o-w-bold);cursor:pointer}
.avatar-ai-actions button:hover{background:var(--o-subtle)}
.avatar-ai-actions button:disabled{opacity:.55;cursor:wait}
.avatar-ai-preview{display:grid;grid-template-columns:92px minmax(0,1fr);gap:var(--o-s3);align-items:center;margin-top:var(--o-s4);padding:var(--o-s3);border:1px solid var(--o-accent-line);border-radius:var(--o-radius);background:var(--o-surface)}
.avatar-ai-preview img{width:92px;height:92px;border-radius:calc(var(--o-radius) - 1px);object-fit:cover;background:var(--o-line-muted)}
.avatar-ai-preview figcaption{display:grid;gap:5px;min-width:0}
.avatar-ai-preview strong{color:var(--o-accent);font-size:var(--o-t-sm)}
.avatar-ai-preview span{overflow-wrap:anywhere;color:var(--o-muted);font-size:var(--o-t-xs);line-height:1.5}
.avatar-field{display:grid;gap:6px;margin-top:var(--o-s4)}
.avatar-field label{font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.avatar-field input,.avatar-field select,.avatar-field textarea{width:100%;min-height:var(--o-control);padding:8px 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);font:var(--o-t-md) var(--o-font)}
.avatar-field textarea{resize:vertical;line-height:1.55}
.avatar-field input[type="file"]{padding:6px;background:var(--o-subtle)}
.avatar-field input[type="file"]::file-selector-button{margin-right:var(--o-s2);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);padding:5px 9px;font:var(--o-w-bold) var(--o-t-sm) var(--o-font);cursor:pointer}
.avatar-field small{color:var(--o-faint);font-size:var(--o-t-xs);line-height:1.55}
.avatar-advanced{margin-top:var(--o-s4);padding-top:var(--o-s4);border-top:1px solid var(--o-line)}
.avatar-advanced summary{color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold);cursor:pointer}
.avatar-advanced-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--o-s3)}
.avatar-motion-basics{margin-top:2px}
.avatar-check{display:flex;align-items:center;gap:var(--o-s2);align-self:end;min-height:var(--o-control);color:var(--o-muted);font-size:var(--o-t-sm);cursor:pointer}
.avatar-check input{width:15px;height:15px;min-height:0;margin:0;accent-color:var(--o-accent)}
.avatar-actions{display:flex;align-items:center;gap:var(--o-s3);margin-top:var(--o-s5)}
.avatar-actions button{height:var(--o-control);padding:0 var(--o-s4)}
.avatar-form-status{color:var(--o-muted);font-size:var(--o-t-sm)}
.avatar-history{min-width:0;padding:var(--o-s5)}
.avatar-history-head{padding-bottom:var(--o-s4);border-bottom:1px solid var(--o-line)}
.avatar-history-layout{display:grid;grid-template-columns:minmax(210px,270px) minmax(0,1fr);min-height:500px}
.avatar-result{min-width:0;padding:var(--o-s4) 0 0 var(--o-s4);border-left:1px solid var(--o-line);display:flex;flex-direction:column}
.avatar-result-head h3{font-size:var(--o-t-lg)}
.avatar-empty{min-height:360px;display:grid;place-content:center;justify-items:center;gap:var(--o-s2);color:var(--o-faint);text-align:center}
.avatar-empty svg{width:38px;height:38px;stroke-width:1.35}
.avatar-empty strong{color:var(--o-muted);font-size:var(--o-t-md)}
.avatar-empty span{font-size:var(--o-t-xs)}
.avatar-result video{width:100%;max-height:58vh;margin-top:var(--o-s4);border-radius:var(--o-radius);background:var(--o-line-muted)}
.avatar-result-actions{display:flex;align-items:center;gap:var(--o-s3);margin-top:var(--o-s3);color:var(--o-muted);font-size:var(--o-t-sm)}
.avatar-download,.avatar-secondary{margin-left:auto;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);padding:8px 11px;text-decoration:none;font-size:var(--o-t-sm);font-weight:var(--o-w-bold);cursor:pointer}
.avatar-download--secondary{margin-left:0;color:var(--o-muted)}
.avatar-download:hover,.avatar-secondary:hover{background:var(--o-subtle)}
.avatar-error{margin-top:var(--o-s5);padding:var(--o-s3);border:1px solid var(--o-danger-line);border-radius:var(--o-radius);background:var(--o-danger-soft);color:var(--o-danger);font:var(--o-t-sm)/1.6 var(--o-mono);white-space:pre-wrap}
@container page (max-width:980px){
  .avatar-workspace>.avatar-panel+.avatar-panel{border-top:0;border-left:1px solid var(--o-line)}
  .avatar-mode-groups{grid-template-columns:1fr}
  .avatar-mode-switch--speech{grid-template-columns:repeat(2,minmax(0,1fr))}
  .avatar-workspace{grid-template-columns:1fr}
  .avatar-history-layout{grid-template-columns:minmax(200px,250px) minmax(0,1fr)}
  .avatar-result{min-height:420px}
}
@container page (max-width:620px){
  .avatar-mode-switch--speech,.avatar-mode-switch--motion{grid-template-columns:1fr}
  .avatar-mode-group-head{align-items:flex-start;flex-direction:column;gap:2px}
  .avatar-mode-button{align-items:flex-start;flex-direction:column;gap:3px}
  .avatar-advanced-grid{grid-template-columns:1fr}
  .avatar-ai-options{grid-template-columns:1fr}
  .avatar-ai-actions{align-items:flex-start;flex-direction:column}
  .avatar-history-layout{grid-template-columns:1fr}
  .avatar-job-list{max-height:280px;padding-right:0}
  .avatar-result{min-height:360px;padding:var(--o-s4) 0 0;border-top:1px solid var(--o-line);border-left:0}
  .avatar-empty{min-height:270px}
  .avatar-actions,.avatar-result-actions{align-items:flex-start;flex-direction:column}
  .avatar-download{margin-left:0}
}

/* 9.10 短剧工坊 (drama.html) —— 5 个子工作区共用同一套字段/列表/任务条组件,
   drama.js 生成的 task-item/asset-item/shot-editor 等一大批类名和静态 HTML
   共用同一套样式(没有 is-x 开关之外的耦合), 不需要单独分兼容隔离区。
   圆角统一 var(--o-radius); 原来唯一的 !important(.check-label) 通过提高
   选择器特异度(加回 .drama-form 前缀)去掉了, 不用强制覆盖。
   drama.html 里那条 ".app-page--drama .drama-main{padding-top:78px!important}"
   是给旧版 fixed 定位的移动端顶栏让位置; 新顶栏是 position:sticky、走文档流,
   不再需要手动让位, 这条随迁移一起删除。 */
.drama-live{display:grid;gap:4px;text-align:right;color:var(--o-faint)}
.drama-status{font-weight:var(--o-w-bold);color:var(--o-accent)}
.drama-layout{max-width:1380px;margin:0 auto;display:grid;grid-template-columns:minmax(0,1fr) 310px;align-items:start}
.drama-workspace{min-width:0;background:var(--o-surface);border:1px solid var(--o-line);border-radius:var(--o-radius)}
.drama-view{min-height:660px;padding:var(--o-s5) var(--o-s5) var(--o-s7)}
.task-rail{position:sticky;top:0;max-height:100vh;overflow:auto;padding:0 0 var(--o-s6) var(--o-s5)}
.task-rail-heading,.drama-section-heading,.subheading{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--o-s4)}
.drama-section-heading{margin-bottom:var(--o-s5);padding-bottom:var(--o-s4);border-bottom:1px solid var(--o-line)}
.drama-section-heading p,.task-rail-help{max-width:68ch;margin-top:6px;color:var(--o-muted)}
.task-rail-help{font-size:var(--o-t-sm);margin-bottom:var(--o-s4)}
.drama-form{display:grid;gap:var(--o-s4);max-width:760px}
.drama-form h3,.subheading h3{font-size:var(--o-t-md)}
.button-warning,.task-actions .button-warning{border-color:var(--o-warn);background:var(--o-warn);color:var(--o-on-accent)}
.text-button{padding:4px;border:0;background:transparent;color:var(--o-accent);cursor:pointer}
.field-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--o-s4)}
.drama-form label.check-label{display:flex;grid-template-columns:none;align-items:center;gap:var(--o-s2)}
.drama-form label.check-label input{width:16px;min-height:16px}
.reference-video{border:1px solid var(--o-line);border-radius:var(--o-radius)}
.reference-video summary{padding:11px;font-weight:var(--o-w-bold);cursor:pointer}
.reference-fields{display:grid;grid-template-columns:minmax(220px,1fr) 140px;gap:var(--o-s3);padding:2px var(--o-s3) var(--o-s4)}
.reference-fields .check-label{grid-column:1/-1}
.production-settings{border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line)}
.production-settings summary{padding:var(--o-s3) 2px;font-weight:var(--o-w-bold);cursor:pointer}
.production-settings-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--o-s3);padding:4px 0 var(--o-s4)}
.production-settings-grid label{display:grid;gap:6px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.production-settings-grid .span-2{grid-column:1/-1}
.production-settings-grid select[multiple]{min-height:116px}
.production-settings-grid small{font-weight:var(--o-w-normal);color:var(--o-faint)}
.form-actions,.heading-actions,.task-actions,.asset-actions,.shot-actions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--o-s2)}
.resubmit-authorization{display:flex;align-items:flex-start;gap:7px;width:100%;color:var(--o-warn);font-size:10px;line-height:1.45}
.resubmit-authorization input{width:15px;height:15px;margin:0;flex:0 0 auto}
.split-pane{display:grid;grid-template-columns:minmax(260px,.8fr) minmax(320px,1.2fr);gap:var(--o-s6);margin-bottom:var(--o-s6)}
.drama-list{border-top:1px solid var(--o-line)}
.list-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--o-s4);padding:var(--o-s3) 2px;border-bottom:1px solid var(--o-line-muted);align-items:center}
.list-row b{display:block}
.list-row p,.list-row small{display:block;margin-top:3px;color:var(--o-muted)}
.list-row button{border:0;background:transparent;color:var(--o-accent);font-weight:var(--o-w-bold);cursor:pointer}
.row-actions{display:flex;align-items:center;flex-wrap:wrap;justify-content:flex-end;gap:var(--o-s2)}
.review-queue{margin:0 0 var(--o-s6);padding:var(--o-s4) 0;border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line)}
.review-queue .subheading{margin-bottom:var(--o-s2)}
.style-workspace{margin:var(--o-s5) 0;padding:var(--o-s4) 0;border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line)}
.style-workspace .subheading{margin-bottom:var(--o-s3)}
.compact-grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr))}
.inline-editor{max-width:none;margin:var(--o-s6) 0;padding:var(--o-s5) 0;border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line);grid-template-columns:minmax(180px,.6fr) minmax(260px,1.4fr) auto;align-items:end}
.asset-toolbar{display:flex;gap:var(--o-s4);margin-bottom:var(--o-s4)}
.asset-toolbar label{min-width:180px}
.asset-toolbar label:last-child{flex:1}
.asset-maintenance{display:grid;grid-template-columns:minmax(180px,1fr) minmax(150px,.5fr) auto auto auto;gap:var(--o-s3);align-items:end;margin-bottom:var(--o-s5);padding:var(--o-s3) 0;border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line)}
.asset-maintenance>div{align-self:center}
.asset-maintenance b,.asset-maintenance span{display:block}
.asset-maintenance span{margin-top:3px;color:var(--o-muted);font-size:var(--o-t-xs)}
.asset-maintenance label{display:grid;gap:4px;color:var(--o-muted);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.asset-maintenance input{min-height:36px;padding:7px 9px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg)}
.asset-maintenance button{min-height:36px;padding:7px 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-fg);font-weight:var(--o-w-bold);cursor:pointer}
.asset-maintenance button:disabled{cursor:not-allowed;opacity:.45}
.asset-generator{margin-bottom:var(--o-s5);border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line)}
.asset-generator summary{padding:var(--o-s3) 2px;font-weight:var(--o-w-bold);cursor:pointer}
.asset-generator form{padding:2px 0 var(--o-s4)}
.asset-create-panel{margin:0 0 var(--o-s6);padding:var(--o-s4) 0 var(--o-s5)}
.asset-create-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--o-s4);margin-bottom:var(--o-s4)}
.asset-create-heading h3{font-size:var(--o-t-lg)}
.asset-create-heading p{max-width:68ch;margin-top:5px;color:var(--o-muted)}
.provider-badge{padding:4px 8px;border:1px solid var(--o-accent-line);border-radius:999px;background:var(--o-accent-soft);color:var(--o-accent);font-size:10px;font-weight:var(--o-w-bold);letter-spacing:.04em;white-space:nowrap}
.asset-create-form{max-width:none}
.generation-mode,.view-picker{margin:0;padding:0;border:0}
.generation-mode legend,.view-picker legend{margin-bottom:7px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.mode-switch{display:inline-flex;padding:3px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.mode-switch button{min-height:34px;padding:6px 14px;border:0;background:transparent;color:var(--o-muted)}
.mode-switch button[aria-pressed="true"]{background:var(--o-surface);color:var(--o-accent);box-shadow:0 1px 2px rgb(31 35 40 / 10%)}
.reference-workspace{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--o-s3);align-items:end;padding:var(--o-s4);background:var(--o-subtle);border:1px solid var(--o-line);border-radius:var(--o-radius)}
.reference-source{grid-column:1/-1;min-width:0}
.reference-source>label,.reference-workspace>label{display:grid;gap:6px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.reference-or{display:none}
.reference-preview{display:grid;grid-template-columns:64px minmax(0,1fr) auto;gap:var(--o-s3);align-items:center;margin-top:var(--o-s3);padding:9px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.reference-preview img{width:64px;height:64px;border-radius:calc(var(--o-radius) - 1px);object-fit:cover}
.reference-preview b,.reference-preview span{display:block;overflow:hidden;text-overflow:ellipsis}
.reference-preview span{margin-top:4px;color:var(--o-muted);font-size:var(--o-t-xs);font-weight:var(--o-w-normal)}
.character-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--o-s3)}
.character-fields label{display:grid;gap:6px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.view-options{display:grid;grid-template-columns:repeat(auto-fill,minmax(138px,1fr));gap:1px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-line);overflow:hidden}
.view-options label{display:flex;align-items:center;gap:7px;min-height:38px;padding:8px 10px;background:var(--o-surface);color:var(--o-fg);font-size:var(--o-t-xs);font-weight:var(--o-w-medium)}
.view-options input{width:15px;min-height:15px;margin:0;accent-color:var(--o-accent)}
.asset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:1px;background:var(--o-line);border:1px solid var(--o-line);border-radius:var(--o-radius);overflow:hidden}
.asset-grid>.empty-state{grid-column:1/-1;background:var(--o-surface)}
.asset-item{min-width:0;padding:var(--o-s4);background:var(--o-surface)}
.asset-preview{aspect-ratio:4/3;display:grid;place-items:center;margin-bottom:var(--o-s3);background:var(--o-subtle);overflow:hidden;color:var(--o-faint)}
.asset-preview img,.asset-preview video{width:100%;height:100%;object-fit:cover}
.asset-preview audio{width:calc(100% - 18px)}
.asset-item h3{font-size:var(--o-t-md)}
.asset-meta{margin:4px 0 var(--o-s3);color:var(--o-muted);font-size:var(--o-t-xs)}
.asset-select{display:flex;align-items:center;gap:6px;min-height:30px;margin:-5px 0 5px;color:var(--o-muted);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.asset-select input{width:16px;height:16px;accent-color:var(--o-accent)}
.asset-actions button,.asset-actions a,.shot-actions button,.task-actions button{min-height:30px;padding:5px 9px;font-size:var(--o-t-xs)}
.asset-actions a{display:inline-flex;align-items:center;text-decoration:none}
.workspace-select{max-width:480px;margin-bottom:var(--o-s4)}
.preflight-result{margin-bottom:var(--o-s4);color:var(--o-muted)}
.preflight-result.is-error{padding:var(--o-s3);border-radius:var(--o-radius);background:var(--o-danger-soft);color:var(--o-danger)}
.preflight-result.is-ready{padding:var(--o-s3);border-radius:var(--o-radius);background:var(--o-accent-soft);color:var(--o-accent)}
.revise-strip{max-width:none;grid-template-columns:minmax(280px,1fr) auto auto;align-items:end;margin:0 0 var(--o-s4);padding:var(--o-s3) 0;border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line)}
.revise-strip a{padding:9px 0;color:var(--o-accent);font-weight:var(--o-w-bold)}
.episode-output{display:grid;grid-template-columns:minmax(220px,.8fr) minmax(260px,1.2fr);gap:var(--o-s4);align-items:center;margin:0 0 var(--o-s5);padding:var(--o-s4);border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.episode-output video{width:100%;max-height:360px;background:#111}
.episode-output h3{margin:2px 0 7px;font-size:var(--o-t-lg)}
.episode-output p{margin:0;color:var(--o-muted)}
.episode-output-actions{display:flex;flex-wrap:wrap;gap:var(--o-s2);margin-top:var(--o-s3)}
.episode-output-actions a{padding:7px 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-accent);font-size:var(--o-t-xs);font-weight:var(--o-w-bold);text-decoration:none}
.shot-list{border-top:1px solid var(--o-line)}
.shot-editor{display:grid;grid-template-columns:80px minmax(0,1fr) minmax(0,1fr);gap:var(--o-s3);padding:var(--o-s4) 0;border-bottom:1px solid var(--o-line-muted)}
.shot-number{display:grid;align-content:start;gap:7px;font-weight:var(--o-w-bold);color:var(--o-accent)}
.shot-order-actions{display:flex;gap:2px}
.shot-order-actions button{min-width:32px;min-height:32px;border-radius:var(--o-radius)}
.shot-order-actions button:disabled{cursor:not-allowed;opacity:.35}
.shot-fields{display:grid;gap:var(--o-s2)}
.shot-fields label{display:grid;gap:4px;color:var(--o-muted);font-size:var(--o-t-xs)}
.shot-actions{grid-column:2/-1}
.asset-picker{max-height:170px;overflow:auto;padding:9px;border:1px solid var(--o-line);border-radius:var(--o-radius)}
.asset-picker legend{padding:0 4px;color:var(--o-muted);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.asset-picker label{display:flex;grid-template-columns:none;align-items:center;padding:4px 0}
.asset-picker input{width:15px;min-height:15px;margin-right:7px}
.import-strip{max-width:none;grid-template-columns:minmax(220px,1fr) minmax(160px,.7fr) minmax(140px,.5fr) auto;align-items:end;margin-bottom:var(--o-s6)}
.novel-pane{margin:0}
.chapter-workspace{min-height:360px;border-top:1px solid var(--o-line)}
.chapter-item{padding:var(--o-s4) 0;border-bottom:1px solid var(--o-line-muted)}
.chapter-item summary{font-weight:var(--o-w-bold);cursor:pointer}
.chapter-item textarea{width:100%;margin-top:var(--o-s3);padding:10px;border:1px solid var(--o-line);border-radius:var(--o-radius);font:inherit}
.novel-json-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--o-s3);padding:var(--o-s4) 0;border-bottom:1px solid var(--o-line-muted)}
.novel-json-grid label{display:grid;gap:5px;color:var(--o-muted);font-size:var(--o-t-xs)}
.novel-json-grid textarea{padding:10px;border:1px solid var(--o-line);border-radius:var(--o-radius);font:12px/1.5 var(--o-mono)}
.empty-state{display:grid;gap:5px;padding:var(--o-s6) 4px;color:var(--o-muted)}
.task-list{border-top:1px solid var(--o-line)}
.task-item{padding:var(--o-s3) 0;border-bottom:1px solid var(--o-line-muted)}
.task-top{display:flex;justify-content:space-between;gap:var(--o-s3)}
.task-top b{font-size:var(--o-t-sm)}
.task-state{font-size:var(--o-t-xs);color:var(--o-muted)}
.task-detail{min-height:34px;margin:5px 0;color:var(--o-muted);font-size:var(--o-t-xs)}
.task-progress{display:block;width:100%;height:4px;border:0;appearance:none;background:var(--o-line-muted);overflow:hidden}
.task-progress::-webkit-progress-bar{background:var(--o-line-muted)}
.task-progress::-webkit-progress-value{background:var(--o-accent)}
.task-progress::-moz-progress-bar{background:var(--o-accent)}
.provider-task{display:block;margin:-3px 0 7px;color:var(--o-faint);font:10px/1.4 var(--o-mono);overflow-wrap:anywhere}
.task-results{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px}
.task-results a{padding:3px 6px;border:1px solid var(--o-line);border-radius:6px;color:var(--o-accent);font-size:10px;text-decoration:none}
.task-notice{display:grid;gap:2px;margin:7px 0;padding:8px 9px;border:1px solid var(--o-line);border-radius:var(--o-radius);font-size:10px;line-height:1.45}
.task-notice b{font-size:10px}
.task-notice span{color:var(--o-muted)}
.task-notice.is-warning{border-color:var(--o-warn-line);background:var(--o-warn-soft)}
.task-notice.is-warning b{color:var(--o-warn)}
.task-detail.is-error{color:var(--o-danger);font-weight:var(--o-w-medium)}
.asset-step-loading{margin-top:9px;color:var(--o-faint);font-size:10px}
.asset-steps{margin-top:var(--o-s3);border-top:1px solid var(--o-line-muted)}
.asset-steps>summary{padding:8px 0;color:var(--o-accent);font-size:10px;font-weight:var(--o-w-bold);cursor:pointer}
.asset-step{padding:8px 0;border-top:1px solid var(--o-line-muted)}
.asset-step-head{display:flex;justify-content:space-between;gap:8px;font-size:10px}
.asset-step-head span{color:var(--o-muted)}
.asset-step[data-status="passed"] .asset-step-head span{color:var(--o-accent)}
.asset-step[data-status="failed"] .asset-step-head span{color:var(--o-danger)}
.asset-candidates{display:grid;gap:6px;margin-top:7px}
.asset-candidate{display:grid;grid-template-columns:52px minmax(0,1fr);gap:8px;padding:7px;border-radius:var(--o-radius);background:var(--o-subtle)}
.candidate-preview{width:52px;height:52px;display:grid;place-items:center;overflow:hidden;border-radius:calc(var(--o-radius) - 1px);background:var(--o-line-muted);color:var(--o-faint);font-size:9px}
.candidate-preview img{width:100%;height:100%;object-fit:cover}
.candidate-empty{color:var(--o-faint);font-size:9px}
.asset-candidate b,.asset-candidate small,.asset-candidate code{display:block;font-size:9px}
.asset-candidate small{margin-top:2px;color:var(--o-muted)}
.asset-candidate p{margin:3px 0;color:var(--o-danger);font-size:9px;line-height:1.4}
.asset-candidate code{margin-top:3px;color:var(--o-faint);overflow-wrap:anywhere}
@container page (max-width:1100px){
  .drama-layout{grid-template-columns:1fr}
  .drama-workspace{border-right:0}
  .task-rail{position:static;max-height:none;padding:var(--o-s6) 0;border-top:1px solid var(--o-line)}
}
@container page (max-width:760px){
  .field-row,.split-pane,.inline-editor,.import-strip,.shot-editor,.episode-output,.reference-fields,.revise-strip,.novel-json-grid,.reference-workspace,.character-fields,.production-settings-grid,.asset-maintenance{grid-template-columns:1fr}
  .production-settings-grid .span-2{grid-column:auto}
  .reference-fields .check-label{grid-column:auto}
  .shot-actions{grid-column:auto}
  .asset-toolbar{flex-direction:column}
  .asset-create-heading{align-items:flex-start;flex-direction:column}
  .reference-preview{grid-template-columns:56px minmax(0,1fr)}
  .reference-preview img{width:56px;height:56px}
  .reference-preview button{grid-column:1/-1}
  .view-options{grid-template-columns:1fr 1fr}
  .task-actions button{min-height:44px;padding:9px 12px}
  .resubmit-authorization{min-height:44px;align-items:center;font-size:var(--o-t-xs)}
  .resubmit-authorization input{width:20px;height:20px}
  .task-notice,.task-notice b{font-size:var(--o-t-xs)}
  .row-actions{justify-content:flex-start}
  .list-row{grid-template-columns:1fr}
  .asset-maintenance button{min-height:44px}
}
@media (prefers-reduced-motion:reduce){.task-progress span{transition:none}}

/* 9.11 AI 生成全幅工作台 (flux-studio.html) —— 全站唯一不挂 .app-canvas 的
   页面(见第 7 节 skipCanvas 豁免): 顶栏固定高度 + 左栏独立滚动表单 + 右栏
   结果区铺满整个视口, 更像图片编辑器而不是普通表单页, 所以这里的响应式断点
   是 @media(基于视口), 不是 @container(基于 .app-canvas 容器, 这页没有)。
   flux-studio.js 用到的 .chip/.seg/.gitem/.badge/.editbox 等类名在这一起
   定义, 没有 is-x 开关之外的 JS 耦合, 不需要单独放第 10 节。 */
.studio-credential{color:var(--o-faint);font-size:var(--o-t-xs);white-space:nowrap}
#release{height:30px;padding:0 var(--o-s3);border:1px solid var(--o-line);border-radius:var(--o-radius);background:transparent;color:var(--o-muted);font-size:var(--o-t-xs);cursor:pointer}
#release:hover{background:var(--o-subtle);color:var(--o-fg)}
.studio-tab{background:none;border:0;border-bottom:2px solid transparent;color:var(--o-muted);padding:8px 14px;font-size:14px;font-family:inherit;cursor:pointer;margin-bottom:-1px}
.studio-tab:hover{color:var(--o-fg)}
.studio-tab.on{color:var(--o-accent);border-bottom-color:var(--o-accent);font-weight:600}
.wrap[hidden]{display:none}
.wrap{width:100%;display:grid;grid-template-columns:380px minmax(0,1fr);gap:0;min-height:calc(100vh - 64px - 45px)}
.card{margin:0;border:0;border-radius:0;padding:0}
.wrap>.card:first-child{
  max-height:calc(100vh - 64px - 45px);
  overflow-y:auto;
  padding:var(--o-s5);
  background:var(--o-surface);
  border-right:1px solid var(--o-line);
  scrollbar-width:thin;
  scrollbar-color:var(--o-line) transparent;
}
.wrap>.card:last-child{min-width:0;padding:var(--o-s6);background:var(--o-subtle)}
.wrap label{display:block;font-size:var(--o-t-xs);color:var(--o-muted);font-weight:var(--o-w-medium);letter-spacing:.01em;margin:10px 0 4px}
.wrap label:first-child{margin-top:0}
.wrap details>summary{cursor:pointer;font-size:12px;color:var(--o-muted);margin:10px 0 4px}
.wrap details>summary:hover{color:var(--o-fg)}
.wrap textarea,.wrap select,.wrap input[type=text],.wrap input[type=number]{width:100%;background:var(--o-surface);border:1px solid var(--o-line);color:var(--o-fg);border-radius:var(--o-radius);padding:9px 10px;font-size:13px;font-family:inherit}
.wrap textarea{resize:vertical;min-height:66px}
.wrap .row{display:flex;gap:8px}
.wrap .row>div{flex:1}
.chips{display:flex;flex-wrap:wrap;gap:6px}
.chip{font-size:12px;padding:5px 10px;border:1px solid var(--o-line);border-radius:999px;background:transparent;color:var(--o-muted);cursor:pointer;user-select:none}
.chip:hover{border-color:var(--o-accent);color:var(--o-fg)}
.chip.on{background:var(--o-accent-soft);border-color:var(--o-accent);color:var(--o-fg)}
.seg{display:flex;gap:0;border:1px solid var(--o-line);border-radius:var(--o-radius);overflow:hidden}
.seg button{flex:1;background:var(--o-surface);color:var(--o-muted);border:0;border-right:1px solid var(--o-line);padding:7px 4px;font-size:12px;cursor:pointer}
.seg button:last-child{border-right:0}
.seg button:hover{background:var(--o-subtle);color:var(--o-fg)}
.seg button.on{background:var(--o-accent-soft);color:var(--o-fg)}
/* 表单比屏幕高时，生成按钮吸在视口底部，不用滚到底去找 */
button.go{position:sticky;bottom:8px;z-index:3;margin-top:14px;width:100%;background:var(--o-accent);color:var(--o-on-accent);border:0;border-radius:var(--o-radius);padding:11px;font-size:15px;font-weight:600;cursor:pointer}
button.go:hover{background:var(--o-accent-hover)}
button.go:disabled{background:var(--o-line-muted);color:var(--o-faint);cursor:not-allowed}
.mini{font-size:11px;color:var(--o-muted);margin-top:5px}
.status{min-height:22px;font-size:13px;margin-top:10px;color:var(--o-accent)}
.status.err{color:var(--o-danger)}
.result{text-align:center}
.result img,.result video{max-width:100%;border-radius:var(--o-radius);border:1px solid var(--o-line)}
.placeholder{min-height:360px;display:grid;place-items:center;color:var(--o-faint);border:1px dashed var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);padding:60px 20px;text-align:center}
.gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:10px;margin-top:24px}
.gitem{position:relative}
.gitem img,.gitem video{width:100%;aspect-ratio:1;object-fit:cover;border-radius:var(--o-radius);border:1px solid var(--o-line);cursor:pointer;display:block}
.gdel{position:absolute;top:3px;right:3px;width:20px;height:20px;padding:0;border:0;line-height:19px;text-align:center;border-radius:50%;background:rgb(31 35 40 / 78%);color:var(--o-on-accent);font-size:12px;cursor:pointer;opacity:0}
.gitem:hover .gdel{opacity:1}
.gdel:hover{background:var(--o-danger)}
.gru{position:absolute;top:3px;left:3px;width:20px;height:20px;padding:0;border:0;line-height:19px;text-align:center;border-radius:50%;background:rgb(31 35 40 / 78%);color:var(--o-on-accent);font-size:11px;cursor:pointer;opacity:0}
.gitem:hover .gru{opacity:1}
.pm-preview{width:56px;height:56px;object-fit:cover;border-radius:var(--o-radius);border:1px solid var(--o-line)}
.gru:hover{background:var(--o-accent)}
.gitem:focus-within .gdel,.gitem:focus-within .gru{opacity:1}
.tovid{margin-top:8px;background:var(--o-surface);color:var(--o-muted);border:1px solid var(--o-line);border-radius:var(--o-radius);padding:8px 14px;font-size:13px;cursor:pointer}
.tovid:hover{background:var(--o-subtle);color:var(--o-fg)}
.result-actions{display:flex;justify-content:center;gap:8px;flex-wrap:wrap}
.gt{font-size:12px;color:var(--o-faint);margin:24px 0 4px;font-weight:var(--o-w-medium)}
.mitem{margin-bottom:10px}
.mitem audio,.result audio{width:100%;margin-top:4px}
/* 密度账本方向: 状态徽章一律带前导色点(呼应色点+文字的记账状态标记),
   跨页面共用一条规则, 不用逐个 .badge{} 定义里重复写。 */
.badge::before{content:"";width:6px;height:6px;flex:none;border-radius:50%;background:currentColor;margin-right:6px}
.badge{display:inline-flex;align-items:center;font-size:11px;padding:3px 8px;border:1px solid var(--o-line);border-radius:999px;background:transparent;color:var(--o-muted)}
.badge.is-busy{color:var(--o-warn)}
.badge.is-ready{color:var(--o-accent)}
.badge.is-offline{color:var(--o-danger)}
.editbox{border:1px solid var(--o-line);border-radius:var(--o-radius);padding:10px;margin-top:6px}
.editbox.active{border-color:var(--o-accent)}
.editrow{display:flex;gap:10px;align-items:center}
.editrow img{width:64px;height:64px;object-fit:cover;border-radius:var(--o-radius);border:1px solid var(--o-line)}
.wrap input[type=range]{width:100%}
.x{color:var(--o-muted);cursor:pointer;font-size:12px}
.u-ai-001{font-size:11px;font-variant-numeric:tabular-nums}
.h3-note{display:grid;gap:4px;margin-top:10px;padding:10px 12px;border:1px solid color-mix(in srgb,var(--o-accent) 28%,var(--o-line));border-radius:var(--o-radius);background:color-mix(in srgb,var(--o-accent) 7%,transparent);font-size:12px;line-height:1.55;color:var(--o-muted)}
.h3-note[hidden]{display:none}
.h3-note strong{color:var(--o-fg);font-size:13px}
.u-ai-003{color:var(--o-faint)}
.u-ai-004{margin-top:6px}
.u-ai-005{border-color:var(--o-danger-line)}
.u-ai-006{display:flex;align-items:center;gap:6px;cursor:pointer}
.u-ai-007{width:auto}
.u-ai-008{min-height:42px}
.u-ai-009{display:flex;align-items:center;gap:6px;cursor:pointer;margin-top:14px}
.u-ai-010{margin-top:12px}
.u-ai-011{cursor:pointer;font-size:12px;color:var(--o-muted)}
.u-ai-012{margin-top:8px}
.u-ai-013{margin-top:0}
.u-ai-014{display:flex;gap:4px}
.u-ai-015{padding:0 8px}
.u-ai-016{font-size:12px}
.u-ai-017{margin-top:10px}
.u-ai-018{flex:1}
.u-ai-019{margin-top:6px}
.u-ai-020{display:flex;gap:8px;align-items:center;margin-bottom:4px}
.u-ai-021{width:90px}
.u-ai-022{border:1px solid var(--o-line);border-radius:var(--o-radius);cursor:crosshair;touch-action:none;max-width:100%}
.u-ai-023{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.u-ai-024{max-width:100%;border-radius:var(--o-radius);border:1px solid var(--o-line)}
.u-ai-025{color:var(--o-accent)}
.u-ai-026{max-width:100%;border-radius:var(--o-radius);border:1px solid var(--o-line);opacity:.92}
.u-ai-027{color:var(--o-muted)}
/* 尺寸提示可能把标签挤成两行，让同行的下拉底部对齐 */
.u-ai-028{align-items:flex-end}
@media (max-width:1180px){.wrap{grid-template-columns:340px minmax(0,1fr)}}
@media (max-width:860px){.wrap{grid-template-columns:1fr}}
/* 这页不挂 .app-canvas(见第 7 节 skipCanvas), 所以窄屏只能走 @media。
   凭据说明是装饰性文案且 nowrap 不肯收缩, 窄屏顶宽画布(实测溢出 37px)。 */
@media (max-width:620px){.studio-credential{display:none}}

/* 9.12 写实转 3D (kontext.html) —— 用 .app-canvas, 断点走 @container page。 */
.kontext-service{flex:0 0 auto;padding:7px 11px;border:1px solid var(--o-line);border-radius:999px;background:var(--o-surface);color:var(--o-muted);font-size:12px}
.kontext-service[data-state="ready"]{border-color:var(--o-accent-line);color:var(--o-accent);background:var(--o-accent-soft)}
.kontext-service[data-state="busy"]{border-color:var(--o-warn-line);color:var(--o-warn);background:var(--o-warn-soft)}
.kontext-service[data-state="error"],.kontext-service[data-state="offline"]{border-color:var(--o-danger-line);color:var(--o-danger);background:var(--o-danger-soft)}
.kontext-notice{margin-bottom:20px;padding:13px 16px;border:1px solid var(--o-accent-line);border-radius:var(--o-radius);background:var(--o-accent-soft);color:var(--o-muted);font-size:13px}
.kontext-notice b{color:var(--o-fg)}
.kontext-grid{display:grid;grid-template-columns:minmax(340px,460px) minmax(0,1fr);gap:0;align-items:start}
.kontext-panel,.kontext-history{border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.kontext-result-panel{border-left:0;background:var(--o-subtle);min-height:590px}
.kontext-panel{padding:22px}
.kontext-panel-title{display:flex;gap:12px;align-items:flex-start;margin-bottom:20px}
.kontext-panel-title>span{display:grid;place-items:center;width:28px;height:28px;border-radius:var(--o-radius);background:var(--o-accent-soft);color:var(--o-accent);font-size:11px;font-weight:750}
.kontext-panel-title h2,.kontext-history h2{margin:0;color:var(--o-fg);font-size:var(--o-t-h2);letter-spacing:-.01em}
.kontext-panel-title p{margin:2px 0 0;color:var(--o-faint);font-size:12px}
.kontext-upload{position:relative;min-height:196px;display:grid;place-items:center;margin:0 0 18px;overflow:hidden;border:1px dashed var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle);cursor:pointer}
.kontext-upload:hover{border-color:var(--o-accent);background:var(--o-accent-soft)}
.kontext-upload input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.kontext-upload img{display:none;width:100%;max-height:330px;object-fit:contain}
.kontext-upload img.is-visible{display:block}
.kontext-upload>span{display:grid;gap:4px;text-align:center}
.kontext-upload b{font-size:14px;color:var(--o-fg)}
.kontext-upload small{color:var(--o-faint)}
.kontext-panel>label,.kontext-fields label{margin:13px 0 6px;color:var(--o-muted);font-size:12px;font-weight:650}
.kontext-panel textarea{width:100%;min-height:126px;padding:11px 12px;resize:vertical;font-size:13px}
.kontext-presets{display:flex;flex-wrap:wrap;gap:7px;margin:9px 0 17px}
.kontext-presets button,.kontext-history>button{padding:6px 10px;border:1px solid var(--o-line);border-radius:999px;background:var(--o-surface);color:var(--o-muted);font-size:12px;cursor:pointer}
.kontext-presets button:hover,.kontext-presets button.is-selected,.kontext-history>button:hover{border-color:var(--o-accent);color:var(--o-accent);background:var(--o-accent-soft)}
.kontext-panel fieldset{margin:0;padding:0;border:0}
.kontext-panel legend{margin-bottom:6px;color:var(--o-muted);font-size:12px;font-weight:650}
.kontext-quality{display:grid;grid-template-columns:repeat(3,1fr);gap:7px}
.kontext-quality label{margin:0;cursor:pointer}
.kontext-quality input{position:absolute;opacity:0}
.kontext-quality span{display:flex;align-items:center;justify-content:space-between;padding:9px 10px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.kontext-quality small{color:var(--o-faint)}
.kontext-quality input:checked+span{border-color:var(--o-accent);background:var(--o-accent-soft);color:var(--o-accent)}
.kontext-advanced{margin-top:15px;border-top:1px solid var(--o-line);padding-top:12px}
.kontext-advanced summary{cursor:pointer;color:var(--o-muted);font-size:12px}
.kontext-fields{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.kontext-fields input{width:100%;padding:9px}
.kontext-fields small{display:block;margin-top:3px;color:var(--o-faint);font-weight:400}
.kontext-submit{width:100%;margin-top:18px;padding:11px}
.kontext-status{min-height:20px;margin:9px 0 0;color:var(--o-muted);font-size:12px}
.kontext-status[data-state="error"],.kontext-save-state[data-state="error"]{color:var(--o-danger)}
.kontext-result{min-height:430px;display:grid;place-items:center;overflow:hidden;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.kontext-result img{display:block;max-width:100%;max-height:620px;object-fit:contain}
.kontext-empty{display:grid;gap:6px;padding:30px;text-align:center;color:var(--o-faint)}
.kontext-empty b{color:var(--o-muted);font-size:14px}
.kontext-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:14px}
.kontext-actions a,.kontext-actions button{padding:8px 13px;text-decoration:none;font-size:13px}
.kontext-secondary{border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);color:var(--o-muted)}
.kontext-save-state{min-height:20px;margin:8px 0 0;text-align:right;color:var(--o-accent);font-size:12px}
.kontext-history{position:relative;margin-top:20px;padding:20px 22px}
.kontext-history>button{position:absolute;right:20px;top:20px}
.kontext-job-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:16px}
.kontext-job{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 12px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle);color:var(--o-fg);text-align:left;cursor:pointer}
.kontext-job:hover{border-color:var(--o-line);background:var(--o-line-muted)}
.kontext-job span{display:grid;min-width:0}
.kontext-job b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}
.kontext-job small{color:var(--o-faint);font-size:11px}
.kontext-job em{flex:0 0 auto;color:var(--o-warn);font-size:11px;font-style:normal}
.kontext-job em[data-status="completed"]{color:var(--o-accent)}
.kontext-job em[data-status="failed"]{color:var(--o-danger)}
@container page (max-width:920px){
  .kontext-result-panel{border-top:0;border-left:1px solid var(--o-line);min-height:0}
  .kontext-grid{grid-template-columns:1fr}
  .kontext-result{min-height:360px}
}
@container page (max-width:560px){
  .kontext-panel{padding:16px}
  .kontext-quality,.kontext-job-list,.kontext-fields{grid-template-columns:1fr}
  .kontext-result{min-height:280px}
  .kontext-actions{flex-direction:column}
  .kontext-actions a,.kontext-actions button{text-align:center}
}

/* 9.13 矩阵内容 (matrix.html) —— 9 个横向 tab 的最大工作台。matrix.html 曾
   经带一整套自己的 .shell/aside/.brand/.back 侧栏样式, 和 body 上同时挂着
   的共享 .app-shell/.app-sidebar/.app-brand 打平了架, 全部是被同名共享类
   盖过的死代码(bare 元素选择器或同特异度但后加载), 迁移时一并删掉, 侧栏
   完全交给共享骨架。matrix.js 生成的 asset-row/badge/system-state 等类名
   和静态 HTML 共用同一套样式, 不需要单独放第 10 节。 */
button{border:1px solid transparent;border-radius:var(--o-radius);background:var(--o-accent);padding:9px 14px;font-weight:680;cursor:pointer;color:var(--o-on-accent)}
button:hover{background:var(--o-accent-hover)}
button:active:not(:disabled){transform:translateY(1px)}
button:disabled{cursor:not-allowed;opacity:.48;transform:none}
.secondary{background:transparent;border-color:var(--o-line);color:var(--o-muted)}
.secondary:hover{background:var(--o-subtle);color:var(--o-fg)}
.danger{background:transparent;border-color:var(--o-danger-line);color:var(--o-danger)}
.danger:hover{background:var(--o-danger-soft)}
input,select,textarea{width:100%;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);padding:9px 11px;color:var(--o-fg);font:inherit}
/* 单选/复选是固有尺寸控件, 不能被上面那条 width:100% 拉宽 —— 视觉隐藏的
   radio(如 .kontext-quality)被拉到 390px 会把画布顶宽(实测 /ai/kontext 溢出 38px)。 */
input[type="radio"],input[type="checkbox"]{width:auto;padding:0}
textarea{resize:vertical}
.matrix-toolbar{display:flex;align-items:center;gap:var(--o-s4);margin-bottom:var(--o-s5);border-bottom:1px solid var(--o-line)}
.matrix-tab svg{width:16px;height:16px;stroke-width:1.8}
.system-state{flex:0 0 auto;margin-left:auto;white-space:nowrap}
.badge{display:inline-flex;align-items:center;border:1px solid var(--o-line);border-radius:999px;padding:2px 8px;font-size:11px;color:var(--o-muted);white-space:nowrap}
.badge.draft,.badge.queued,.badge.idea,.badge.blocked{color:var(--o-warn)}
.badge.planned,.badge.drafted,.badge.approved,.badge.running,.badge.rendered,.badge.ready,.badge.done,.badge.published,.badge.ok{color:var(--o-accent)}
.badge.archived,.badge.cancelled{color:var(--o-faint)}
.badge.error,.badge.failed{color:var(--o-danger)}
.section-head{display:flex;align-items:center;gap:10px;margin-bottom:13px}
.section-head>div{min-width:0}
.section-head>button{flex-shrink:0;white-space:nowrap}
.section-head p{margin:0;color:var(--o-muted)}
.section-head .push{margin-left:auto}
.surface{background:var(--o-surface);border:1px solid var(--o-line);border-radius:var(--o-radius)}
.create-panel{padding:var(--o-s4);margin-bottom:var(--o-s5)}
/* 内容工作台里"生成一批文案"缩成左栏, 与内容库并排, 不再独占整行;
   内容库更高时左栏吸顶, 生成表单始终可见 */
.content-top .create-panel{margin-bottom:0;position:sticky;top:var(--o-s4)}
.create-panel .form-note{margin-top:6px}
.create-grid{display:grid;grid-template-columns:minmax(0,1fr) 76px auto;gap:var(--o-s3);align-items:end}
.vertical-field{grid-column:1/-1}
.brief-field{grid-column:1/-1}
.brief-field textarea{min-height:44px}
.template-info{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;margin-top:14px;padding-top:13px;border-top:1px solid var(--o-line)}
.template-info:empty{display:none}
.template-info strong{display:block;font-size:12px;margin-bottom:3px}
.template-info span{display:block;color:var(--o-muted);font-size:12px}
.field{display:grid;gap:6px}
.field label,.label{font-size:12px;font-weight:680;color:var(--o-muted)}
.form-note,.hint{font-size:12px;color:var(--o-faint);margin:9px 0 0}
.status{min-height:22px;margin-top:10px;color:var(--o-muted)}
.status.error{color:var(--o-danger)}
details.advanced{margin-top:10px;border-top:1px solid var(--o-line);padding-top:8px}
details.advanced summary{color:var(--o-muted);font-size:12px;cursor:pointer}
.advanced-row{display:flex;align-items:center;gap:12px;margin-top:11px;flex-wrap:wrap}
.batch-voice-field{min-width:260px}
.check{display:flex;align-items:flex-start;gap:8px;color:var(--o-muted);font-size:12px}
.check input{width:auto;margin-top:3px}
.content-top{display:grid;grid-template-columns:minmax(320px,400px) minmax(0,1fr);gap:var(--o-s4);align-items:start;margin-bottom:var(--o-s5)}
/* 右列: 内容库在上、编辑器在下堆叠, 与左侧生成表单并排, 页面不再纵向拉长 */
.content-right{display:grid;gap:var(--o-s4);min-width:0}
.music-layout{display:grid;grid-template-columns:minmax(360px,.8fr) minmax(420px,1.2fr);gap:var(--o-s4);align-items:start}
.music-form,.music-results{padding:var(--o-s5)}
.music-form>.field{margin-top:14px}
.music-time-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:14px}
.music-source-preview{min-height:70px;margin-top:10px;padding:10px;border:1px solid var(--o-line);background:var(--o-subtle);display:grid;place-items:center;color:var(--o-faint);font-size:12px}
.music-source-preview audio,.music-source-preview video{display:block;width:100%;max-height:240px;background:var(--o-canvas)}
.music-prompt-help{margin:7px 0 0;color:var(--o-faint);font-size:12px}
.music-confirm{margin-top:15px;padding-top:14px;border-top:1px solid var(--o-line)}
.music-job-list{display:grid;gap:0;border-top:1px solid var(--o-line)}
.music-job{padding:16px 0;border-bottom:1px solid var(--o-line-muted)}
.music-job:last-child{border-bottom:0}
.music-job-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.music-job-head strong{display:block}
.music-job progress{width:100%;margin-top:13px}
.music-job video{display:block;width:min(100%,260px);max-height:460px;margin-top:13px;background:var(--o-line-muted);border:1px solid var(--o-line)}
.music-job-error{margin:12px 0 0;color:var(--o-danger);font-size:12px}
.music-job-time{margin-top:9px;color:var(--o-faint);font-size:11px}
.library{overflow:hidden}
.library-tools{display:grid;grid-template-columns:1fr 126px;gap:8px;padding:13px;border-bottom:1px solid var(--o-line)}
.avatar-batch-bar{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px 10px;padding:11px 13px;border-bottom:1px solid var(--o-line);background:var(--o-subtle)}
.avatar-batch-bar .check{align-items:center}
.avatar-batch-bar .check input{margin-top:0}
.avatar-batch-bar>span{align-self:center;color:var(--o-faint);font-size:11px;text-align:right}
.avatar-batch-bar select{grid-column:1/2}
.avatar-batch-bar button{grid-column:2/3;white-space:nowrap}
.content-list{max-height:340px;overflow:auto}
.content-select-row{display:grid;grid-template-columns:28px minmax(0,1fr);align-items:stretch;border-bottom:1px solid var(--o-line-muted)}
.content-select-row>label{display:grid;place-items:start center;padding-top:18px;cursor:pointer}
.content-select-row>label input{width:15px;height:15px;margin:0;accent-color:var(--o-accent)}
.content-row{display:block;width:100%;border:0;background:transparent;padding:14px 14px 14px 6px;text-align:left;font-weight:400;border-bottom:1px solid var(--o-line-muted)}
.content-row:last-child{border-bottom:0}
.content-row:hover{background:var(--o-subtle)}
.content-row[aria-current="true"]{background:var(--o-accent-soft)}
.content-row:active{transform:none}
.row-top{display:flex;align-items:center;gap:8px}
.row-title{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.row-top .badge{margin-left:auto}
.row-copy{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;color:var(--o-muted);font-size:12px;margin-top:7px}
.row-meta{color:var(--o-faint);font-size:11px;margin-top:8px}
.editor{padding:var(--o-s5);min-height:380px}
.editor-head{display:flex;align-items:center;gap:9px;margin-bottom:var(--o-s4)}
.editor-head .badge{margin-left:auto}
.editor-grid{display:grid;grid-template-columns:minmax(0,1fr) 250px;gap:var(--o-s4)}
.script{min-height:188px;line-height:1.7}
.compose-voice-field{margin-top:12px}
.button-row{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}
.content-asset-picker{margin-top:16px;padding-top:15px;border-top:1px solid var(--o-line)}
.content-asset-head{display:flex;align-items:flex-start;gap:12px;justify-content:space-between}
.content-asset-head p{margin:3px 0 0;color:var(--o-muted);font-size:12px;max-width:56ch}
.text-button{padding:0;border:0;background:transparent;color:var(--o-accent);font-size:12px;font-weight:680;white-space:nowrap;cursor:pointer}
.text-button:hover{background:transparent;color:var(--o-accent-hover);text-decoration:underline}
.content-asset-controls{display:grid;grid-template-columns:72px minmax(0,1fr);gap:9px;align-items:center;margin-top:11px}
.content-asset-controls label{color:var(--o-muted);font-size:12px;font-weight:680}
.content-asset-preview{display:grid;grid-template-columns:66px minmax(0,1fr);gap:10px;align-items:center;margin-top:11px;padding:9px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-subtle)}
.content-asset-preview img,.content-asset-preview video{width:66px;height:52px;object-fit:cover;border:1px solid var(--o-line);border-radius:calc(var(--o-radius) - 1px);background:var(--o-canvas)}
.content-asset-preview strong,.content-asset-preview span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.content-asset-preview span{margin-top:4px;color:var(--o-muted);font-size:11px}
.avatar-compose-row{display:grid;grid-template-columns:minmax(150px,.8fr) minmax(180px,1.2fr) auto;align-items:end;gap:8px;margin-top:16px;padding-top:14px;border-top:1px solid var(--o-line)}
.avatar-compose-row label{grid-column:1/-1;color:var(--o-muted);font-size:12px;font-weight:680}
.avatar-compose-row button{white-space:nowrap}
.avatar-compose-row>span{grid-column:1/-1;color:var(--o-faint);font-size:11px}
.review-note{font-size:12px;color:var(--o-faint);margin:10px 0 0}
.preview{border:1px solid var(--o-line);border-radius:var(--o-radius);overflow:hidden;background:var(--o-subtle);min-height:300px;display:grid;place-items:center}
.preview video{display:block;width:100%;max-height:440px;background:var(--o-line-muted)}
.preview-empty{padding:28px 18px;text-align:center;color:var(--o-faint);font-size:12px}
.stale-note{margin:9px 0 0;padding:9px 10px;border:1px solid var(--o-warn-line);border-radius:var(--o-radius);background:var(--o-warn-soft);color:var(--o-warn);font-size:12px}
.publish-box{margin-top:16px;padding-top:15px;border-top:1px solid var(--o-line)}
.publish-grid{display:grid;grid-template-columns:minmax(240px,.8fr) minmax(280px,1.2fr);gap:var(--o-s4);align-items:start}
.module-detail{min-height:2.8em;margin:7px 0 0;color:var(--o-muted);font-size:11px;line-height:1.45}
.button-link{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--o-line);border-radius:var(--o-radius);padding:9px 14px;color:var(--o-muted);font-weight:680;text-decoration:none;white-space:nowrap}
.button-link:hover{background:var(--o-subtle);color:var(--o-fg)}
.asset-toolbar{display:grid;grid-template-columns:minmax(220px,1fr) 150px 150px auto;gap:9px;align-items:center;margin-bottom:var(--o-s4)}
.asset-toolbar .badge{justify-self:end}
.asset-layout{display:grid;grid-template-columns:minmax(320px,.85fr) minmax(440px,1.15fr);gap:var(--o-s4);align-items:start}
.asset-library{overflow:hidden}
.asset-list{max-height:740px;overflow:auto}
.asset-row{display:grid;grid-template-columns:96px minmax(0,1fr);gap:13px;width:100%;padding:12px;border:0;background:transparent;text-align:left;font-weight:400;border-bottom:1px solid var(--o-line-muted)}
.asset-row:last-child{border-bottom:0}
.asset-row:hover{background:var(--o-subtle)}
.asset-row[aria-current="true"]{background:var(--o-accent-soft)}
.asset-row:active{transform:none}
.asset-thumb{width:96px;height:76px;object-fit:cover;border-radius:var(--o-radius);background:var(--o-line-muted);border:1px solid var(--o-line)}
.asset-row-copy{min-width:0}
.asset-row-copy strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.asset-row-copy span{display:block;margin-top:5px;color:var(--o-muted);font-size:12px}
.asset-row-copy small{display:block;margin-top:7px;color:var(--o-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.asset-editor{padding:var(--o-s4);position:sticky;top:24px}
.asset-preview{height:280px;overflow:hidden;border-radius:var(--o-radius);background:var(--o-line-muted);border:1px solid var(--o-line);display:grid;place-items:center;margin-bottom:16px}
.asset-preview img,.asset-preview video{width:100%;height:100%;object-fit:contain;background:var(--o-line-muted)}
.asset-fields{display:grid;grid-template-columns:minmax(0,1fr) 150px;gap:11px}
.asset-fields .asset-wide{grid-column:1/-1}
.asset-source{margin:14px 0 0;color:var(--o-faint);font-size:11px;overflow-wrap:anywhere}
.asset-bind,.asset-compose{margin-top:18px;padding-top:15px;border-top:1px solid var(--o-line)}
.asset-bind h3,.asset-compose h3{margin-bottom:9px}
.asset-compose p{margin:0 0 10px;color:var(--o-muted);font-size:12px;max-width:70ch}
.asset-bind-grid{display:grid;grid-template-columns:120px minmax(180px,1fr) 110px auto;gap:9px;align-items:end}
.asset-links{display:flex;gap:7px;flex-wrap:wrap;margin-top:11px}
.asset-link-chip{display:inline-flex;align-items:center;gap:7px;padding:5px 8px;border:1px solid var(--o-line);border-radius:999px;color:var(--o-muted);font-size:11px}
.asset-link-chip button{padding:0;border:0;background:transparent;color:var(--o-faint);font-size:14px;line-height:1}
.asset-link-chip button:hover{background:transparent;color:var(--o-danger)}
.asset-compose-row{display:grid;grid-template-columns:minmax(200px,1fr) minmax(180px,.8fr) auto;gap:9px;align-items:end}
.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.toolbar .push{margin-left:auto}
.table-wrap{overflow:auto;border:1px solid var(--o-line);border-radius:var(--o-radius)}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{text-align:left;padding:11px 13px;border-bottom:1px solid var(--o-line-muted);vertical-align:top}
th{color:var(--o-faint);font-size:11px;font-weight:680;background:var(--o-subtle);white-space:nowrap}
tbody tr:last-child td{border-bottom:0}
td{color:var(--o-muted)}
td strong{color:var(--o-fg)}
progress{width:110px;height:7px;accent-color:var(--o-accent)}
.queue-summary{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 10px}
.queue-summary span{display:inline-flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid var(--o-line);border-radius:999px;background:var(--o-surface);color:var(--o-muted);font-size:12px}
.queue-summary strong{color:var(--o-fg)}
.queue-resource{display:flex;align-items:center;gap:6px;white-space:nowrap}
.queue-gpu{color:var(--o-accent);font-size:11px;font-weight:680}
.queue-open{color:var(--o-accent);font-size:12px;font-weight:680;text-decoration:none}
.queue-open:hover{text-decoration:underline}
.resource-status{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0 0 var(--o-s4)}
.resource-state{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:10px 12px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.resource-state strong{font-size:13px}
.resource-state .hint{margin:2px 0 0;font-size:11px}
.page-grid{display:grid;grid-template-columns:minmax(280px,350px) minmax(0,1fr);gap:var(--o-s5);align-items:start}
.planner-grid{display:grid;grid-template-columns:minmax(160px,1fr) minmax(130px,.7fr) 92px 140px 92px auto;gap:10px;align-items:end}
.planner-grid .planner-brief{grid-column:1/-1}
.calendar-toolbar{display:flex;align-items:end;gap:10px;flex-wrap:wrap;margin-bottom:var(--o-s4)}
.calendar-toolbar .field{min-width:160px}
.calendar-layout{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(300px,.65fr);gap:var(--o-s4);align-items:start}
.calendar-surface{overflow:hidden}
.calendar-weekdays,.calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}
.calendar-weekdays{border-bottom:1px solid var(--o-line);color:var(--o-faint);font-size:11px;font-weight:680}
.calendar-weekdays span{padding:9px 10px}
.calendar-day{min-height:126px;padding:9px;border-right:1px solid var(--o-line-muted);border-bottom:1px solid var(--o-line-muted);background:var(--o-surface)}
.calendar-day:nth-child(7n){border-right:0}
.calendar-day.outside{background:var(--o-canvas)}
.calendar-date{display:flex;align-items:center;gap:6px;color:var(--o-faint);font-size:11px;margin-bottom:7px}
.calendar-date strong{color:var(--o-fg);font-size:12px}
.plan-chip{display:block;width:100%;margin-top:5px;padding:6px 7px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-line-muted);font-size:11px;font-weight:580;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.plan-chip:hover{background:var(--o-subtle)}
.plan-chip[aria-current="true"]{border-color:var(--o-accent-line);background:var(--o-accent-soft)}
.plan-chip:active{transform:none}
.plan-chip.drafted{color:var(--o-accent)}
.calendar-empty{padding:14px;color:var(--o-faint);font-size:12px}
.backlog{border-top:1px solid var(--o-line);padding:13px}
.backlog h3{font-size:12px;margin-bottom:8px;color:var(--o-muted)}
.backlog-list{display:flex;gap:7px;flex-wrap:wrap}
.plan-editor{padding:var(--o-s4);position:sticky;top:24px}
.plan-editor .field{margin-bottom:12px}
.plan-editor textarea{min-height:74px}
.plan-context{margin:-3px 0 13px;color:var(--o-faint);font-size:12px}
.form-panel{padding:var(--o-s4)}
.form-panel h2{margin-bottom:16px}
.form-panel .field{margin-bottom:13px}
.account-avatar-fields{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 10px;margin:16px 0;padding:14px 0;border:0;border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line)}
.account-avatar-fields legend{padding:0 8px 0 0;color:var(--o-fg);font-size:12px;font-weight:720}
.account-avatar-fields .field{margin-bottom:10px}
.account-avatar-wide{grid-column:1/-1}
.spec-strip{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;padding:13px 0;border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line);margin:14px 0}
.spec-strip strong{display:block;font-size:12px}
.spec-strip span{display:block;color:var(--o-faint);font-size:11px;margin-top:2px}
.schedule-layout{display:grid;grid-template-columns:minmax(290px,360px) minmax(0,1fr);gap:var(--o-s5);align-items:start}
.schedule-summary{font-size:12px;color:var(--o-muted);margin:0 0 13px}
.inline-actions{display:flex;gap:7px;flex-wrap:wrap}
.inline-actions button{padding:6px 9px;font-size:12px}
.account-note{max-width:38ch;color:var(--o-faint);font-size:11px}
.analytics-layout{display:grid;grid-template-columns:minmax(290px,350px) minmax(0,1fr);gap:var(--o-s5);align-items:start}
.analytics-layout>*{min-width:0}
.metrics-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:11px}
.metric-entry{position:sticky;top:24px}
.metric-target-note{min-height:38px;margin:0 0 13px;color:var(--o-faint);font-size:12px}
.metric-strip{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));border:1px solid var(--o-line);border-radius:var(--o-radius);overflow:hidden;margin-bottom:18px}
.metric-strip>div{padding:12px 13px;background:var(--o-surface);border-right:1px solid var(--o-line-muted)}
.metric-strip>div:last-child{border-right:0}
.metric-strip strong{display:block;font-size:17px;font-variant-numeric:tabular-nums}
.metric-strip span{display:block;color:var(--o-faint);font-size:11px;margin-top:2px}
.analytics-section{margin-top:20px}
.analytics-section h3{margin-bottom:10px}
.recommendations{margin:0;padding:0;list-style:none;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface)}
.recommendations li{padding:11px 13px;border-bottom:1px solid var(--o-line-muted);color:var(--o-muted)}
.recommendations li:last-child{border-bottom:0}
.recommendations li::before{content:"→";color:var(--o-accent);margin-right:8px}
.data-quality{margin:-7px 0 14px;color:var(--o-faint);font-size:12px}
.service-list{display:grid;gap:10px}
.service{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--o-line-muted)}
.service:last-child{border-bottom:0}
.service strong{font-size:13px}
.service span{margin-left:auto}
.toast{position:fixed;right:24px;bottom:24px;max-width:360px;padding:11px 15px;border:1px solid var(--o-line);border-radius:var(--o-radius);background:var(--o-surface);box-shadow:0 16px 40px rgb(31 35 40 / 14%);z-index:5}
.toast.error{border-color:var(--o-danger-line);color:var(--o-danger)}
@container page (max-width:1000px){
  .content-top{grid-template-columns:300px minmax(0,1fr)}
  .editor-grid{grid-template-columns:1fr}
  .preview{min-height:200px}
}
@container page (max-width:780px){
  .matrix-toolbar{align-items:flex-start}
  .create-grid,.content-top,.music-layout,.page-grid,.planner-grid,.calendar-layout,.schedule-layout,.asset-layout{grid-template-columns:1fr}
  .analytics-layout{grid-template-columns:minmax(0,1fr)}
  .brief-field,.planner-grid .planner-brief{grid-column:auto}
  .template-info{grid-template-columns:1fr}
  .spec-strip{grid-template-columns:1fr}
  .content-list{max-height:340px}
  .editor{min-height:0}
  .publish-grid{grid-template-columns:1fr}
  .avatar-compose-row{grid-template-columns:1fr}
  .avatar-compose-row label{grid-column:auto}
  .asset-toolbar,.asset-fields,.asset-bind-grid,.asset-compose-row{grid-template-columns:1fr}
  .asset-toolbar .badge{justify-self:start}
  .asset-fields .asset-wide{grid-column:auto}
  .asset-editor{position:static}
  .plan-editor{position:static}
  .metric-entry{position:static}
  .metric-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
  .metric-strip>div:nth-child(3){border-right:0}
  .metric-strip>div:nth-child(-n+3){border-bottom:1px solid var(--o-line-muted)}
  .calendar-weekdays{display:none}
  .calendar-grid{display:block}
  .calendar-day{min-height:0;border-right:0;padding:11px 13px}
  .calendar-day.outside.no-plans{display:none}
}
@container page (max-width:440px){
  .matrix-tab svg{display:none}
  .matrix-tabs .matrix-tab{padding-inline:9px}
  .library-tools{grid-template-columns:1fr}
  .avatar-batch-bar{grid-template-columns:1fr}
  .avatar-batch-bar>span{text-align:left}
  .avatar-batch-bar select,.avatar-batch-bar button{grid-column:auto}
  .account-avatar-fields{grid-template-columns:1fr}
  .account-avatar-wide{grid-column:auto}
  .metrics-grid{grid-template-columns:1fr}
  .music-time-grid{grid-template-columns:1fr}
  .metric-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
  .metric-strip>div:nth-child(3){border-right:1px solid var(--o-line-muted)}
  .metric-strip>div:nth-child(2n){border-right:0}
  .metric-strip>div:nth-child(-n+4){border-bottom:1px solid var(--o-line-muted)}
  .button-row button{flex:1}
}

/* 9.14 热点发布 (hotpub.html) —— 来源/自动任务/稿件/发布/评论/复盘/配置 7 个横向
   tab 的编辑台。大量类名(hotpub-card/table-row/run-status/empty-state 等)由
   hotpub.js 通过模板字符串生成, 不能改名, 直接保留原名retint。 */

/* 模块状态从原 hero 头部挪进 tab 行右侧(大横幅标题已去掉) */
.hotpub-tabs-status{
  display:flex;
  align-items:center;
  gap:var(--o-s2);
  margin-left:auto;
  padding:var(--o-s2) 0 0;
  color:var(--o-muted);
  font-size:var(--o-t-xs);
  white-space:nowrap;
}
.hotpub-tabs-status small{color:var(--o-faint)}

.status-dot {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 12px;
  font-weight: 700;
}

.status-dot::before {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--o-muted);
  content: "";
}

.status-dot.is-ready::before { background: var(--o-accent); }
.status-dot.is-error::before { background: var(--o-danger); }

.publishing-settings-link {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin: -2px 0 18px;
  padding: 12px 14px;
  border: 1px solid var(--o-line);
  border-radius: var(--o-radius);
  background: var(--o-line-muted);
  color: var(--o-muted);
}

.publishing-settings-link a {
  color: var(--o-accent);
  font-weight: 650;
  text-decoration: none;
}

.publishing-settings-link a:hover {
  text-decoration: underline;
}

.hotpub-section {
  margin: 0;
  padding: 28px 0;
  border: 0;
  border-bottom: 1px solid var(--o-line);
  border-radius: 0;
  background: transparent;
}

.hotpub-section[hidden],
.settings-panel[hidden] {
  display: none;
}

.section-heading {
  display: flex;
  justify-content: space-between;
  gap: 28px;
  align-items: flex-start;
  margin-bottom: 22px;
}

.section-heading h2,
.hotpub-form h3,
.subheading h3,
.insight-layout h3 {
  margin: 0;
  line-height: 1.3;
  letter-spacing: -.025em;
}

.section-heading > p {
  max-width: 64ch;
  margin: 2px 0 0;
  color: var(--o-muted);
  font-size: 14px;
  line-height: 1.65;
}

.hotpub-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0;
  border: 1px solid var(--o-line);
}

.hotpub-grid.three { grid-template-columns: repeat(3, minmax(0, 1fr)); }

.hotpub-form {
  display: grid;
  gap: 13px;
  padding: 18px;
  border: 1px solid var(--o-line);
  border-radius: 0;
  background: var(--o-surface);
}

.hotpub-grid > .hotpub-form {
  padding: 22px 24px;
  border: 0;
}

.hotpub-grid > .hotpub-form + .hotpub-form {
  border-left: 1px solid var(--o-line);
}

.hotpub-form fieldset {
  display: grid;
  gap: 12px;
  min-width: 0;
  margin: 0;
  padding: 14px;
  border: 1px solid var(--o-line);
  border-radius: 0;
}

.hotpub-form legend {
  padding: 0 7px;
  color: var(--o-muted);
  font-size: 12px;
  font-weight: 800;
}

button:disabled {
  cursor: not-allowed;
  opacity: .5;
}

.text-button,
.row-actions button,
.card-actions button,
.table-row button {
  border: 1px solid var(--o-line);
  border-radius: var(--o-radius);
  padding: 7px 9px;
  background: var(--o-surface);
  color: var(--o-fg);
  font: inherit;
  font-size: 12px;
  font-weight: 700;
  cursor: pointer;
}

.text-button:hover,
.row-actions button:hover,
.card-actions button:hover,
.table-row button:hover {
  border-color: var(--o-accent);
  color: var(--o-accent);
}

.status-message {
  min-height: 1.3em;
  margin: 10px 0 0;
  color: var(--o-muted);
  font-size: 13px;
}

.status-message.is-error,
.error-copy { color: var(--o-danger); }
.status-message.is-success { color: var(--o-accent); }

.hotpub-list,
.dense-list {
  display: grid;
  gap: 0;
  overflow: hidden;
  border: 1px solid var(--o-line);
}

.hotpub-list { margin-top: 18px; }

.hotpub-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 16px;
  align-items: start;
  padding: 16px var(--o-s4);
  border: 0;
  border-bottom: 1px solid var(--o-line);
  border-radius: 0;
  background: transparent;
}

.hotpub-card:last-child { border-bottom: 0; }

.hotpub-card > div,
.hotpub-card h3,
.hotpub-card p {
  min-width: 0;
}

.hotpub-card h3 {
  margin: 0;
  overflow-wrap: anywhere;
  font-size: 16px;
}

.hotpub-card p {
  margin: 6px 0 0;
  overflow-wrap: anywhere;
  color: var(--o-muted);
  font-size: 13px;
  line-height: 1.55;
}
.source-url { max-width: 76ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.hotpub-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
  margin-top: 10px;
  color: var(--o-muted);
  font-size: 12px;
}

.hotpub-chip {
  padding: 3px 7px;
  border: 1px solid var(--o-line);
  border-radius: 999px;
  background: var(--o-line-muted);
}

.card-actions,
.queue-actions,
.row-actions,
.form-actions,
.toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
}
.toolbar-field {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  color: var(--o-muted);
  font-size: 0.9rem;
}

.toolbar-field input {
  width: 5.5rem;
  min-height: 2.5rem;
}

.card-actions,
.queue-actions { justify-content: flex-end; }
.queue-actions select { min-width: 150px; }
.module-picker-label {
  display: grid;
  gap: 5px;
  min-width: 210px;
  color: var(--o-muted);
  font-size: 11px;
  font-weight: 750;
}
.module-contract {
  flex-basis: 100%;
  max-width: 58ch;
  color: var(--o-muted);
  font-size: 12px;
  line-height: 1.5;
  text-align: right;
}

.evidence-block {
  grid-column: 1 / -1;
  padding: 12px 0 0;
  border-top: 1px solid var(--o-line);
}

.evidence-block summary,
.history-block summary {
  cursor: pointer;
  color: var(--o-muted);
  font-size: 13px;
  font-weight: 700;
}

.evidence-list {
  display: grid;
  gap: 9px;
  margin-top: 10px;
}

.evidence-item {
  padding: 9px;
  border-radius: var(--o-radius);
  background: var(--o-line-muted);
  font-size: 13px;
}

.evidence-item a { color: var(--o-accent); font-weight: 700; text-decoration: none; }

.split-workspace,
.editor-layout,
.insight-layout {
  display: grid;
  grid-template-columns: minmax(280px, .8fr) minmax(440px, 1.2fr);
  gap: 20px;
  margin-top: 22px;
}

.insight-layout { grid-template-columns: minmax(520px, 1.25fr) minmax(320px, .75fr); }
.performance-overview {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 20px;
  margin-top: 22px;
}
.performance-table {
  overflow: hidden;
  border: 1px solid var(--o-line);
  border-radius: 0;
  background: var(--o-surface);
}
.performance-table article {
  display: grid;
  grid-template-columns: minmax(90px, 1.4fr) repeat(5, minmax(72px, 1fr));
  gap: 10px;
  padding: 10px 12px;
  border-bottom: 1px solid var(--o-line);
  font-size: 11px;
}
.performance-table article:last-child { border-bottom: 0; }
.performance-table span { color: var(--o-muted); }
.article-editor { margin: 0; }

.subheading {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  align-items: center;
  margin-bottom: 11px;
}

.topic-heading,
.run-heading { margin-top: 26px; }
.count-label { color: var(--o-muted); font-size: 12px; }

.dense-row,
.strategy-row {
  display: flex;
  justify-content: space-between;
  gap: 14px;
  align-items: center;
  padding: 13px var(--o-s4);
  border-bottom: 1px solid var(--o-line);
}

.dense-row:first-child,
.strategy-row:first-child { padding-top: 0; }
.dense-row:last-child,
.strategy-row:last-child { border-bottom: 0; }

.dense-row > div:first-child,
.strategy-row > div:first-child {
  display: grid;
  gap: 3px;
  min-width: 0;
}

.dense-row span,
.dense-row small,
.strategy-row span {
  color: var(--o-muted);
  font-size: 12px;
}

.strategy-row p {
  max-width: 65ch;
  margin: 5px 0;
  color: var(--o-fg);
  font-size: 13px;
  white-space: pre-wrap;
}

.field-pair {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 11px;
}

.toggle-label.toggle-label {
  display: flex;
  align-items: center;
  gap: 7px;
  min-height: 34px;
  white-space: nowrap;
}

.toggle-label.toggle-label input { width: auto; }

.check-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

.check-grid label {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 8px;
  border-radius: var(--o-radius);
  background: var(--o-surface);
}

.check-grid input { width: auto; }
.field-help { margin: 0; color: var(--o-muted); font-size: 12px; line-height: 1.6; }

.run-table {
  display: grid;
  overflow: hidden;
  border: 1px solid var(--o-line);
  border-radius: 0;
  background: var(--o-surface);
}

.table-row {
  display: grid;
  grid-template-columns: 64px 1fr 90px 180px auto;
  gap: 12px;
  align-items: center;
  padding: 11px 13px;
  border-bottom: 1px solid var(--o-line);
  font-size: 12px;
}

.table-row:last-child { border-bottom: 0; }
.run-summary { display: grid; gap: 3px; min-width: 0; }
.run-summary b,
.run-summary small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.run-summary small { color: var(--o-muted); font-size: 11px; font-weight: 500; }
.run-status { font-weight: 800; }
.run-status.is-done,
.run-status.is-good { color: var(--o-accent); }
.run-status.is-error,
.run-status.is-poor { color: var(--o-danger); }
.run-status.is-running { color: var(--o-accent); }

.run-steps {
  display: none;
  grid-column: 1 / -1;
  gap: 6px;
  padding: 10px;
  border-radius: var(--o-radius);
  background: var(--o-line-muted);
}

.run-steps.is-open { display: grid; }
.run-steps div { display: grid; grid-template-columns: 160px 1fr; gap: 12px; }
.run-steps span { color: var(--o-muted); }

.search-results { display: grid; gap: 8px; }
.search-result { padding: 10px 0; border-bottom: 1px solid var(--o-line); }
.search-result p { margin: 5px 0; color: var(--o-muted); font-size: 12px; }
.search-result button { padding: 6px 9px; font-size: 12px; }

.comment-row {
  display: grid;
  grid-template-columns: minmax(240px, .8fr) minmax(300px, 1.2fr) auto;
  gap: 16px;
  align-items: end;
  padding: 15px 0;
  border-bottom: 1px solid var(--o-line);
}

.comment-row:last-child { border-bottom: 0; }
.comment-row > div:first-child { display: grid; gap: 4px; }
.comment-row span { color: var(--o-muted); font-size: 12px; }
.comment-row p { margin: 5px 0 0; line-height: 1.55; }
.comment-row label { display: grid; gap: 6px; color: var(--o-muted); font-size: 12px; font-weight: 700; }

.history-block {
  margin-top: 20px;
  padding-top: 14px;
  border-top: 1px solid var(--o-line);
}

.history-block .run-table { margin-top: 12px; }
.reply-history { grid-template-columns: 120px 1fr 1fr 80px; }
.reply-summary { display: grid; gap: 4px; min-width: 0; }
.reply-summary a,
.reply-summary small { overflow: hidden; color: var(--o-muted); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
.reply-summary a:hover { color: var(--o-accent); }
.metric-row { grid-template-columns: minmax(180px, 1.8fr) repeat(4, .65fr) 80px; }
.publication-row { grid-template-columns: minmax(220px, 1.7fr) 90px 90px 180px auto; }
.publication-summary { display: grid; gap: 3px; min-width: 0; }
.publication-summary b,
.publication-summary small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.publication-summary small { color: var(--o-muted); font-size: 11px; font-weight: 500; }
.metric-summary { display: grid; gap: 3px; min-width: 0; }
.metric-summary b,
.metric-summary small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.metric-summary small { color: var(--o-muted); font-size: 11px; font-weight: 500; }

.toolbar { margin-bottom: 16px; }
.toolbar .status-message { margin: 0 0 0 4px; }

.empty-state {
  display: grid;
  gap: 4px;
  padding: 24px 16px;
  border: 1px dashed var(--o-line);
  border-radius: var(--o-radius);
  color: var(--o-muted);
  text-align: center;
}

.empty-state b { color: var(--o-fg); }
.empty-state span { font-size: 13px; }

.settings-note p { color: var(--o-muted); line-height: 1.65; }
.publisher-form {
  gap: 0;
  margin-top: 18px;
  padding: 0;
  border: 0;
}
.result-link { align-self: center; color: var(--o-accent); font-size: 13px; font-weight: 700; }

.settings-workspace {
  display: grid;
  grid-template-columns: 210px minmax(0, 1fr);
  gap: 30px;
  align-items: start;
}

.settings-rail {
  position: sticky;
  top: 66px;
  display: grid;
  gap: 3px;
  padding-right: 18px;
  border-right: 1px solid var(--o-line);
}

.settings-rail button,
.settings-rail .settings-tab-link {
  display: grid;
  gap: 3px;
  width: 100%;
  padding: 11px 12px 11px 15px;
  border: 0;
  border-radius: var(--o-radius);
  background: transparent;
  color: var(--o-muted);
  font: inherit;
  text-align: left;
  cursor: pointer;
  text-decoration: none;
}

.settings-rail button:hover,
.settings-rail button:focus-visible,
.settings-rail .settings-tab-link:hover,
.settings-rail .settings-tab-link:focus-visible {
  background: var(--o-line-muted);
  color: var(--o-fg);
}

.settings-rail button[aria-selected="true"] {
  box-shadow: inset 3px 0 0 var(--o-accent);
  background: var(--o-accent-soft);
  color: var(--o-accent);
}

.settings-rail .settings-tab-link {
  margin-top: 8px;
  border-top: 1px solid var(--o-line);
}

.settings-rail b {
  color: inherit;
  font-size: 13px;
  line-height: 1.35;
}

.settings-rail span {
  color: var(--o-muted);
  font-size: 11px;
  font-weight: 500;
  line-height: 1.45;
}

.settings-panel { min-width: 0; }

.settings-panel-heading {
  display: flex;
  justify-content: space-between;
  gap: 24px;
  margin-bottom: 20px;
  padding-bottom: 18px;
  border-bottom: 1px solid var(--o-line);
}

.settings-panel-heading h3 {
  margin: 0;
  color: var(--o-fg);
  font-size: 20px;
  letter-spacing: -.025em;
}

.settings-panel-heading > p {
  max-width: 48ch;
  margin: 0;
  font-size: 13px;
}

.publisher-form .settings-panel > fieldset {
  padding: 0 0 24px;
  border: 0;
}

.publisher-form .settings-panel > fieldset + fieldset {
  margin-top: 4px;
  padding-top: 24px;
  border-top: 1px solid var(--o-line);
}

.publisher-form .settings-panel > fieldset > legend {
  margin-bottom: 12px;
  padding: 0;
  color: var(--o-fg);
  font-size: 14px;
}

.settings-savebar {
  position: sticky;
  z-index: 4;
  bottom: 0;
  display: flex;
  justify-content: space-between;
  gap: 20px;
  align-items: center;
  margin-top: 30px;
  padding: 14px 16px;
  border: 1px solid var(--o-line);
  background: color-mix(in srgb, var(--o-surface) 94%, transparent);
  box-shadow: 0 -8px 22px color-mix(in srgb, var(--o-fg) 7%, transparent);
  backdrop-filter: blur(10px);
}

.settings-savebar > div {
  display: grid;
  gap: 2px;
}

.settings-savebar b { font-size: 13px; }
.settings-savebar span { color: var(--o-muted); font-size: 11px; }
.settings-savebar .status-message { margin: 2px 0 0; }
.settings-savebar > button { flex: none; }

.add-row-button {
  justify-self: start;
  margin-top: 10px;
}

.settings-grid {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.settings-grid .wide { grid-column: 1 / -1; }

.prompt-workspace {
  margin-top: 24px;
  padding-top: 20px;
  border-top: 1px solid var(--o-line);
}

.playbook-workspace {
  margin-top: 20px;
}

.section-heading.compact { margin-bottom: 12px; }
.prompt-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.prompt-card {
  display: grid;
  gap: 9px;
  padding: 14px;
  border: 1px solid var(--o-line);
  border-radius: 0;
  background: var(--o-surface);
}
.prompt-card textarea { min-height: 160px; }
.prompt-card small { color: var(--o-muted); }

.publisher-row,
.notification-row {
  display: grid;
  gap: 9px;
  align-items: end;
  padding: 12px 0;
  border-bottom: 1px solid var(--o-line);
}

.publisher-row { grid-template-columns: minmax(130px, .7fr) minmax(140px, .7fr) minmax(240px, 1.5fr) minmax(180px, 1fr); }
.publisher-row > .toggle-label { align-self: center; }
.publisher-row > .row-actions { grid-column: 3 / -1; justify-content: flex-end; }
.notification-row { grid-template-columns: repeat(4, minmax(120px, 1fr)); }
.notification-row > .row-actions { grid-column: 2 / -1; justify-content: flex-end; }
.publisher-row:last-child,
.notification-row:last-child { border-bottom: 0; }

.module-contract-list {
  overflow: hidden;
  border: 1px solid var(--o-line);
  background: var(--o-surface);
}

.module-contract-row {
  display: grid;
  grid-template-columns: minmax(150px, .9fr) minmax(180px, 1.2fr) auto;
  gap: 14px;
  align-items: center;
  padding: 11px var(--o-s4);
  border-bottom: 1px solid var(--o-line);
}

.module-contract-row:last-child { border-bottom: 0; }
.module-contract-row div { min-width: 0; }
.module-contract-row b,
.module-contract-row strong,
.module-contract-row span { display: block; }
.module-contract-row b,
.module-contract-row strong { color: var(--o-fg); font-size: 13px; }
.module-contract-row div > span { margin-top: 2px; color: var(--o-muted); font-size: 11px; }

.advanced-settings {
  padding: 12px;
  border: 1px solid var(--o-line);
  border-radius: 0;
  background: transparent;
}

.advanced-settings summary {
  cursor: pointer;
  color: var(--o-fg);
  font-weight: 700;
}

.advanced-settings[open] summary { margin-bottom: 12px; }

.compact-action-grid {
  display: grid;
  grid-template-columns: minmax(220px, 1fr) auto;
  gap: 10px;
  align-items: end;
}

.login-qr-result {
  margin-top: 12px;
  display: grid;
  justify-items: start;
  gap: 8px;
}

.login-qr-result img {
  width: min(260px, 100%);
  aspect-ratio: 1;
  object-fit: contain;
  padding: 10px;
  border: 1px solid var(--o-line);
  border-radius: var(--o-radius);
  background: var(--o-surface);
}

.platform-login-workspace {
  display: grid;
  gap: 28px;
  max-width: 760px;
}

.platform-login-section {
  display: grid;
  gap: 18px;
}

.platform-login-section + .platform-login-section {
  padding-top: 28px;
  border-top: 1px solid var(--o-line);
}

.platform-login-section-heading {
  display: flex;
  align-items: end;
  justify-content: space-between;
  gap: 18px;
}

.platform-login-section-heading h4 {
  margin: 2px 0 0;
  color: var(--o-fg);
  font-size: 20px;
}

.platform-login-section-heading > span {
  color: var(--o-muted);
  font-size: 12px;
}

.douyin-login-toolbar,
.toutiao-login-toolbar,
.douyin-qr-controls {
  display: grid;
  grid-template-columns: minmax(240px, 1fr) auto;
  gap: 14px;
  align-items: end;
}

.platform-login-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 8px;
}

.platform-login-status {
  display: grid;
  grid-template-columns: 14px minmax(0, 1fr);
  gap: 12px;
  align-items: start;
  padding: 16px 18px;
  border: 1px solid var(--o-line);
  background: var(--o-subtle);
}

.platform-login-status-mark {
  width: 10px;
  height: 10px;
  margin-top: 6px;
  border: 2px solid var(--o-line);
  border-radius: 50%;
  background: var(--o-surface);
}

.platform-login-status b,
.douyin-qr-controls h4 { color: var(--o-fg); }
.platform-login-status p,
.douyin-qr-controls p,
.platform-qr-result p { margin: 3px 0 0; color: var(--o-muted); font-size: 13px; }
.platform-login-status[data-state="checking"] .platform-login-status-mark,
.platform-login-status[data-state="waiting"] .platform-login-status-mark { border-color: var(--o-accent); background: var(--o-accent-soft); }
.platform-login-status[data-state="success"] .platform-login-status-mark { border-color: var(--o-accent); background: var(--o-accent); }
.platform-login-status[data-state="error"] .platform-login-status-mark { border-color: var(--o-danger); background: var(--o-danger); }

.douyin-qr-controls {
  padding-top: 18px;
  border-top: 1px solid var(--o-line);
}

.douyin-qr-controls h4 { margin: 0; font-size: 15px; }

.platform-qr-result {
  display: grid;
  gap: 9px;
  justify-items: start;
}

.platform-qr-result img {
  width: min(300px, 100%);
  aspect-ratio: 1;
  object-fit: contain;
  padding: 10px;
  border: 1px solid var(--o-line);
  background: var(--o-surface);
}

.platform-qr-caption {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px 14px;
}

.platform-login-fallback {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding-top: 16px;
  border-top: 1px solid var(--o-line);
}

.platform-login-fallback p {
  max-width: 58ch;
  margin: 0;
  color: var(--o-muted);
  font-size: 13px;
}

@container page (max-width:1080px) {
  .hotpub-grid.three { grid-template-columns: 1fr 1fr; }
  .insight-layout { grid-template-columns: 1fr; }
  .performance-overview { grid-template-columns: 1fr; }
  .publisher-row,
  .notification-row,
  .module-contract-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .publisher-row > .row-actions,
  .notification-row > .row-actions { grid-column: 1 / -1; }
  .check-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@container page (max-width:850px) {
  .hotpub-grid > .hotpub-form + .hotpub-form {
    border-top: 1px solid var(--o-line);
    border-left: 0;
  }
  .section-heading > p { margin-top: 10px; }
  .split-workspace,
  .editor-layout,
  .insight-layout,
  .prompt-grid,
  .hotpub-grid,
  .hotpub-grid.three { grid-template-columns: 1fr; }
  .table-row { grid-template-columns: 56px 1fr 80px auto; }
  .table-row > :nth-child(4) { display: none; }
  .metric-row,
  .reply-history { grid-template-columns: 1fr 1fr; }
  .metric-row > :nth-child(4) { display: block; }
  .publication-row { grid-template-columns: minmax(0, 1fr) 72px 72px auto; }
  .publication-row > :nth-child(4) { display: none; }
  .comment-row { grid-template-columns: 1fr; align-items: start; }
  .settings-workspace { grid-template-columns: 1fr; gap: 22px; }
  .settings-rail {
    position: static;
    grid-auto-flow: column;
    grid-auto-columns: minmax(155px, 1fr);
    overflow-x: auto;
    padding: 0 0 8px;
    border-right: 0;
    border-bottom: 1px solid var(--o-line);
  }
  .settings-rail button[aria-selected="true"] {
    box-shadow: inset 0 -3px 0 var(--o-accent);
  }
  .settings-panel-heading { display: block; }
  .settings-panel-heading > p { margin-top: 9px; }
}

@container page (max-width:540px) {
  .hotpub-section { padding: 17px; }
  .hotpub-card { grid-template-columns: 1fr; }
  .card-actions,
  .queue-actions { justify-content: flex-start; }
  .module-contract { text-align: left; }
  .field-pair,
  .settings-grid,
  .publisher-row,
  .notification-row,
  .check-grid { grid-template-columns: 1fr; }
  .settings-grid .wide { grid-column: auto; }
  .settings-savebar {
    position: static;
    display: grid;
    align-items: stretch;
  }
  .settings-savebar > button { width: 100%; }
  .compact-action-grid { grid-template-columns: 1fr; }
  .douyin-login-toolbar,
  .toutiao-login-toolbar,
  .douyin-qr-controls { grid-template-columns: 1fr; align-items: stretch; }
  .platform-login-fallback { align-items: flex-start; flex-direction: column; }
  .platform-login-section-heading { display: block; }
  .platform-login-section-heading > span { display: block; margin-top: 5px; }
  .platform-login-actions { justify-content: flex-start; }
  .dense-row,
  .strategy-row { align-items: flex-start; flex-direction: column; }
  .performance-table article { grid-template-columns: 1fr 1fr; }
  .source-url { max-width: 48ch; }
}

/* 9.15 电影工作台 (index.html) —— 任务库/新建任务/单任务工作台/批量目录/剧集追踪。
   这一页此前有一套独立的"发光"视觉语言(--panel/--accent-glow/--serif/--ease 等),
   与其它页面完全脱节, 这里整体退税成方向 C 的扁平系统。绝大多数类名不改(index.js 里
   classList 操作和大段 innerHTML 模板都靠这些名字), 只换视觉。
   两个真撞名的改了名字并同步改了 index.html/index.js(card→movie-card, field→
   movie-field, toast→movie-toast); button/input/select/textarea 基础样式、
   .hint/.fieldhelp、导航子项(已改成 .app-tabs 横排)全部复用别的页面已建立的共享规则,
   这里不重复定义; .wrap/.jobrow 是排查时发现的死代码(HTML 里已经不用了), 直接删。 */

.movie-card{position:relative;background:var(--o-surface);border:1px solid var(--o-line);border-radius:var(--o-radius);
  padding:26px 28px;margin-bottom:var(--o-s5);overflow:hidden}
.movie-card h2{line-height:1.3;margin:0 0 var(--o-s5);font-weight:var(--o-w-bold);color:var(--o-fg);
  display:flex;align-items:center;gap:11px}
.movie-card h2 .h2ic{width:17px;height:17px;color:var(--o-accent);flex:none;stroke-width:1.7}
.movie-card h2 .tagpill{font-size:10px;font-weight:var(--o-w-bold);color:var(--o-accent);background:var(--o-accent-soft);
  border:1px solid var(--o-accent-line);padding:4px 9px;border-radius:999px;letter-spacing:.6px;text-transform:uppercase}
.movie-card h2 .cnt,.movie-card h2 span[id]{color:var(--o-accent);font-size:13px;font-weight:var(--o-w-bold);letter-spacing:0}
.movie-card h2 .h2act{margin-left:auto;font-size:12px;font-weight:500}
.movie-card .sub{color:var(--o-muted);font-size:13px;margin:-12px 0 var(--o-s5)}

.row{display:flex;gap:var(--o-s4);flex-wrap:wrap;align-items:flex-end}
.movie-field{display:flex;flex-direction:column;gap:8px;margin-bottom:var(--o-s4);min-width:0}
.movie-field label{font-size:11px;color:var(--o-faint);font-weight:var(--o-w-bold);letter-spacing:.8px;text-transform:uppercase}

/* .ghost/.ghostbtn 是本页自己的次要按钮变体; 基础 button/input/select/textarea
   外观复用别处已建立的全局 reset(见 9.13), 这里不重复。 */
.ghost{background:var(--o-surface);color:var(--o-fg);border:1px solid var(--o-line);font-weight:500}
.ghost:hover{border-color:#c3cbd3;background:var(--o-subtle)}
.ghostbtn{display:inline-flex;align-items:center;justify-content:center;background:var(--o-surface);color:var(--o-fg);
  border:1px solid var(--o-line);padding:10px 18px;border-radius:var(--o-radius);font-size:13px;font-weight:500;text-decoration:none}
.ghostbtn:hover{border-color:#c3cbd3;background:var(--o-subtle)}

/* ── 制作目标选择器 ─────────────────────────────────────── */
.workflow-picker{margin:var(--o-s5) 0 var(--o-s5);border-top:1px solid var(--o-line);border-bottom:1px solid var(--o-line)}
.workflow-modes{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-bottom:1px solid var(--o-line)}
.workflow-tab{min-width:0;padding:15px 18px;border:0;border-right:1px solid var(--o-line);border-radius:0;
  background:transparent;color:var(--o-muted);text-align:left;cursor:pointer}
.workflow-tab:last-child{border-right:0}
.workflow-tab b,.workflow-tab span{display:block}
.workflow-tab b{font-size:14px;color:var(--o-fg);margin-bottom:3px}
.workflow-tab span{font-size:11.5px;line-height:1.45}
.workflow-tab:hover{background:var(--o-subtle)}
.workflow-tab.on{background:var(--o-accent-soft);box-shadow:inset 0 -2px 0 var(--o-accent)}
.workflow-tab.on b{color:var(--o-accent)}
.workflow-panel{padding:var(--o-s4) 0 2px}
.workflow-checkpoints{margin:0 0 var(--o-s4);border-top:1px solid var(--o-line);padding-top:12px}
.workflow-checkpoints summary{width:max-content;cursor:pointer;color:var(--o-muted);font-size:12px;font-weight:var(--o-w-bold);margin-bottom:12px}
.workflow-checkpoints summary:hover{color:var(--o-fg)}
.modegroup{margin-bottom:var(--o-s5)}
.modegroup-label{font-size:10.5px;font-weight:var(--o-w-bold);letter-spacing:2px;text-transform:uppercase;
  color:var(--o-faint);margin:0 0 12px 2px}
.modes{display:grid;grid-template-columns:repeat(auto-fit,minmax(218px,1fr));gap:var(--o-s3)}
.mode{position:relative;display:flex;gap:13px;align-items:flex-start;border:1px solid var(--o-line);
  border-radius:0;padding:15px 16px;cursor:pointer;background:var(--o-surface);overflow:hidden;
  color:var(--o-fg);width:100%;text-align:left}
.mode:hover{border-color:#c3cbd3;background:var(--o-subtle)}
.mode.on{border-color:var(--o-accent);background:var(--o-accent-soft);box-shadow:0 0 0 1px var(--o-accent)}
.mode .ic{width:34px;height:34px;border-radius:var(--o-radius);flex:none;display:grid;place-items:center;
  background:var(--o-line-muted);border:1px solid var(--o-line);color:var(--o-muted)}
.mode .ic svg{width:18px;height:18px;stroke-width:1.7}
.mode.on .ic{background:var(--o-accent);border-color:transparent;color:var(--o-on-accent)}
.mode .mt{min-width:0;padding-top:1px}
.mode b{display:block;margin-bottom:4px;font-size:14px;font-weight:var(--o-w-bold);letter-spacing:.1px}
.mode .mt>span{display:block;font-size:11.5px;color:var(--o-muted);line-height:1.45}
.mode.on::after{content:"";position:absolute;top:13px;right:13px;width:6px;height:6px;border-radius:50%;background:var(--o-accent)}
.mode.dis{opacity:.4;cursor:not-allowed}

/* ── 状态 / 进度 ──────────────────────────────────────────── */
#jobCard .status{display:flex;align-items:center;gap:12px;font-size:14px}
.dot{width:8px;height:8px;border-radius:50%;background:var(--o-faint);flex:none}
.dot.run{background:var(--o-accent);animation:movie-pulse 1.3s infinite}
.dot.done{background:var(--o-accent)}
.dot.err{background:var(--o-danger)}
@keyframes movie-pulse{0%,100%{opacity:.4}50%{opacity:1}}
.bar{display:block;width:100%;height:5px;margin-top:var(--o-s4);border:0;border-radius:5px;overflow:hidden;
  appearance:none;background:var(--o-line-muted)}
.bar::-webkit-progress-bar{background:var(--o-line-muted);border-radius:5px}
.bar::-webkit-progress-value{background:var(--o-accent);border-radius:5px}
.bar::-moz-progress-bar{background:var(--o-accent);border-radius:5px}
.bar.is-success::-webkit-progress-value{background:var(--o-accent)}
.bar.is-success::-moz-progress-bar{background:var(--o-accent)}
.bar.is-warning::-webkit-progress-value{background:var(--o-warn)}
.bar.is-warning::-moz-progress-bar{background:var(--o-warn)}
.bar.is-danger::-webkit-progress-value{background:var(--o-danger)}
.bar.is-danger::-moz-progress-bar{background:var(--o-danger)}

/* ── 折叠工具区(批量目录 / 剧集追踪) ───────────────────────── */
details.tool{position:relative;background:var(--o-surface);border:1px solid var(--o-line);border-radius:0;margin-bottom:var(--o-s5);
  overflow:hidden}
details.tool>summary{list-style:none;cursor:pointer;padding:20px 28px;display:flex;align-items:center;gap:11px;
  font-size:16px;font-weight:var(--o-w-bold);letter-spacing:-.01em;user-select:none}
details.tool>summary::-webkit-details-marker{display:none}
details.tool>summary .h2ic{width:17px;height:17px;color:var(--o-accent);stroke-width:1.7}
details.tool>summary .tagpill{font-size:10px;font-weight:var(--o-w-bold);color:var(--o-accent);background:var(--o-accent-soft);
  border:1px solid var(--o-accent-line);padding:4px 9px;border-radius:999px;letter-spacing:.6px;text-transform:uppercase}
details.tool>summary .chev{margin-left:auto;color:var(--o-faint)}
details.tool[open]>summary .chev{transform:rotate(180deg)}
details.tool>summary:hover{background:var(--o-subtle)}
details.tool .tbody{padding:0 28px 26px}
.view>details.tool{margin-bottom:0}

/* ── 精彩节拍 ─────────────────────────────────────────────── */
.beat{display:flex;gap:var(--o-s4);background:var(--o-subtle);border:1px solid var(--o-line);border-radius:0;padding:14px;margin-bottom:13px}
.beat .thumb{width:200px;height:112px;border-radius:var(--o-radius);object-fit:cover;background:var(--o-line-muted);flex:none}
.beat .meta{flex:1;min-width:0}
.beat .tline{display:flex;align-items:center;gap:11px;margin-bottom:7px}
.beat .idx{width:24px;height:24px;border-radius:var(--o-radius);background:var(--o-accent);color:var(--o-on-accent);display:grid;place-items:center;font-size:12px;font-weight:var(--o-w-bold);flex:none}
.beat .time{font-variant-numeric:tabular-nums;color:var(--o-accent);font-size:13px;font-weight:var(--o-w-bold)}
.beat .dur{color:var(--o-muted);font-size:12px}
.beat .why{font-weight:var(--o-w-bold);margin:2px 0 6px}
.beat .excerpt{color:var(--o-muted);font-size:13px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.beat .edit{display:flex;gap:8px;align-items:center;margin-top:10px;font-size:12px;color:var(--o-muted)}
.beat .edit input{width:72px;padding:6px 8px;min-width:0}
.beat .del{background:var(--o-danger-soft);border:1px solid var(--o-danger-line);color:var(--o-danger);padding:6px 13px;border-radius:var(--o-radius);cursor:pointer;font-size:12px;margin-left:auto;font-weight:500}
.beat .del:hover{background:var(--o-danger-soft)}

.src{font-size:11.5px;padding:4px 11px;border-radius:999px;background:var(--o-line-muted);border:1px solid var(--o-line);color:var(--o-muted);margin-left:8px;font-weight:500}
.err-box{background:var(--o-danger-soft);border:1px solid var(--o-danger-line);color:var(--o-danger);padding:13px 15px;border-radius:var(--o-radius);margin-top:var(--o-s4);font-size:13.5px}
video{width:100%;border-radius:var(--o-radius);background:var(--o-line-muted);margin-top:6px;border:1px solid var(--o-line)}

.grid2{display:grid;grid-template-columns:1fr 1fr;gap:0 26px}
.cfg-sec{grid-column:1/-1;font-size:10.5px;font-weight:var(--o-w-bold);letter-spacing:2px;text-transform:uppercase;color:var(--o-accent);
  margin:22px 0 10px;padding-top:18px;border-top:1px solid var(--o-line)}
.cfg-sec:first-child{border-top:0;padding-top:0;margin-top:0}
/* 配置页横向 tab */
.ctabs{display:flex;flex-wrap:wrap;gap:6px;border-bottom:1px solid var(--o-line);margin:4px 0 var(--o-s5)}
.ctab{padding:9px 15px;border:0;background:transparent;color:var(--o-muted);font-size:13px;font-weight:560;
  letter-spacing:.2px;cursor:pointer;border-radius:var(--o-radius) var(--o-radius) 0 0;position:relative}
.ctab:hover{color:var(--o-fg);background:var(--o-subtle)}
.ctab.on{color:var(--o-accent);background:transparent}
.ctab.on::after{content:"";position:absolute;left:6px;right:6px;bottom:-1px;height:2px;background:var(--o-accent)}
.ctab-panel{display:none}
.ctab-panel.on{display:block}

.movie-toast{position:fixed;bottom:30px;left:50%;transform:translateX(-50%) translateY(8px);
  background:var(--o-fg);color:var(--o-on-accent);border:1px solid var(--o-fg);
  padding:12px 26px;border-radius:999px;font-weight:560;font-size:13.5px;opacity:0;transition:opacity .3s,transform .3s;
  z-index:60;pointer-events:none}
.movie-toast.show{opacity:1;transform:translateX(-50%)}

.vchip{border:1px solid var(--o-line);background:var(--o-surface);color:var(--o-muted);border-radius:999px;padding:8px 14px;font-size:12.5px;cursor:pointer;font-weight:500}
.vchip:hover{border-color:var(--o-accent);color:var(--o-fg);background:var(--o-accent-soft)}

.plan{background:var(--o-subtle);border:1px solid var(--o-line);border-radius:0;padding:18px 20px}
.plan .psum{font-weight:var(--o-w-bold);margin-bottom:9px;font-size:15px}
.plan ul{margin:0 0 13px;padding-left:20px;color:var(--o-muted);font-size:13px}
.plan li{margin:4px 0}
.plan .pstyle{font-size:12px;color:var(--o-accent);margin-bottom:13px}

/* ── 解说稿编辑行 ─────────────────────────────────────────── */
.srow{display:flex;gap:14px;background:var(--o-subtle);border:1px solid var(--o-line);border-radius:0;padding:14px;margin-bottom:13px}
.srow .thumb{width:150px;height:84px;border-radius:var(--o-radius);object-fit:cover;background:var(--o-line-muted);flex:none}
.srow .sbody{flex:1;min-width:0}
.srow .smeta{display:flex;align-items:center;gap:9px;margin-bottom:8px;font-size:12px;color:var(--o-muted)}
.srow .sidx{width:22px;height:22px;border-radius:var(--o-radius);background:var(--o-accent);color:var(--o-on-accent);display:grid;place-items:center;font-size:12px;font-weight:var(--o-w-bold)}
.srow textarea{width:100%;background:var(--o-surface);border:1px solid var(--o-line);color:var(--o-fg);border-radius:var(--o-radius);padding:9px 11px;font-size:13px;line-height:1.6;resize:vertical;min-height:56px;font-family:inherit;outline:none}
.srow textarea:focus{border-color:var(--o-accent);box-shadow:0 0 0 3px var(--o-accent-soft)}
.srow .sacts{display:flex;gap:8px;margin-top:9px}
.srow .sacts button{padding:6px 13px;font-size:12px;border-radius:var(--o-radius)}
.srow .svis{font-size:12px;color:var(--o-muted);margin-top:7px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
/* 解说稿双栏对照 */
.scols{display:flex;gap:14px;margin-top:2px}
.sorig{flex:1;min-width:0;background:var(--o-line-muted);border:1px solid var(--o-line);border-radius:var(--o-radius);padding:10px 12px;font-size:12.5px;line-height:1.6}
.sorig .lbl{font-size:10.5px;color:var(--o-accent);font-weight:var(--o-w-bold);letter-spacing:.5px;text-transform:uppercase;margin-right:5px}
.sorig .od{color:var(--o-fg);margin-bottom:7px}
.sorig .ov{color:var(--o-muted)}
.snarr{flex:1.25;min-width:0}
.cast-fields{display:grid;grid-template-columns:minmax(100px,.7fr) minmax(170px,1.3fr);gap:8px;margin-top:8px}
.cast-fields label,.trans-output label{display:flex;flex-direction:column;gap:4px;color:var(--o-faint);font-size:10px;font-weight:var(--o-w-bold);letter-spacing:.55px;text-transform:uppercase}
.cast-fields input{min-width:0;padding:7px 9px;font-size:12px}
.trans-output{margin:0;min-width:170px}
.trans-output select{padding:9px 30px 9px 10px;font-size:12.5px}
.keepOrig{display:flex;align-items:center;gap:10px;padding:11px 13px;border:1px dashed var(--o-accent);border-radius:var(--o-radius);color:var(--o-accent);font-weight:var(--o-w-bold);background:var(--o-accent-soft)}
@container page (max-width:720px){.scols{flex-direction:column}}
@container page (max-width:520px){.cast-fields{grid-template-columns:1fr}.trans-output{width:100%}}

/* 横竖屏双预览 */
.previews{display:flex;gap:16px;align-items:flex-start}
.previews .pv{flex:1;min-width:0}
.previews .pv.vert{flex:0 0 auto;width:200px}
.previews video{margin-top:6px}
.previews .pvlbl{font-size:10.5px;color:var(--o-faint);font-weight:var(--o-w-bold);letter-spacing:.8px;text-transform:uppercase}

/* 剧情图谱 SVG */
#graphSvg{width:100%;height:auto;background:var(--o-subtle);border:1px solid var(--o-line);border-radius:0;margin-bottom:var(--o-s4)}
#graphSvg .edge{stroke:var(--o-line);stroke-width:1.4}
#graphSvg .edgelbl{fill:var(--o-muted);font-size:9px}
#graphSvg .node{fill:var(--o-accent)}
#graphSvg .nodetxt{fill:var(--o-fg);font-size:11px;font-weight:var(--o-w-bold);text-anchor:middle}
#graphTimeline{width:100%;height:auto;margin-bottom:8px}
#graphTimeline .ev{fill:var(--o-accent)}
#graphTimeline .evturn{fill:var(--o-accent)}
#graphTimeline .axis{stroke:var(--o-line);stroke-width:1}
/* 响度曲线 */
#loudSvg{width:100%;height:auto;background:var(--o-subtle);border:1px solid var(--o-line);border-radius:0}
#loudSvg .area{fill:var(--o-accent);opacity:.34}
#loudSvg .beatreg{fill:var(--o-accent);opacity:.22}
#loudSvg .thr{stroke:var(--o-muted);stroke-dasharray:4 4;stroke-width:1}

/* 整片镜头表 */
#shotTable{width:100%;border-collapse:collapse}
#shotTable th{font-weight:var(--o-w-bold);color:var(--o-muted);font-size:11px;letter-spacing:.4px}

/* ── 剪辑台 时间线 ────────────────────────────────────────── */
.tl{display:flex;flex-direction:column;gap:9px;margin-top:8px}
.tlrow{display:flex;align-items:center;gap:12px}
.tllbl{width:36px;flex:none;font-size:11px;color:var(--o-faint);font-weight:var(--o-w-bold);letter-spacing:.5px;text-align:right}
.track{position:relative;flex:1;min-width:0;height:34px;background:var(--o-line-muted);border:1px solid var(--o-line);border-radius:var(--o-radius);overflow:hidden}
.timeline-svg{display:block;width:100%;height:100%;overflow:hidden}
.timeline-block{stroke:rgba(31,35,40,.15);stroke-width:.25}
.timeline-block.narrated{fill:var(--o-accent)}
.timeline-block.silent,.timeline-block.highlight{fill:var(--o-warn)}
.timeline-block.montage{fill:var(--o-accent)}
.timeline-block.dub{fill:var(--o-accent)}
.timeline-block.sub{fill:var(--o-faint)}
#edlOut [data-action]{cursor:pointer}
#edlOut [data-action]:hover .timeline-block{opacity:.75}
.timeline-block.hot{stroke:var(--o-fg);stroke-width:1.2}
.playhead{stroke:var(--o-danger);stroke-width:.45;pointer-events:none}
.edllegend{display:flex;gap:16px;flex-wrap:wrap;margin-top:13px;font-size:11.5px;color:var(--o-muted)}
.edllegend i{display:inline-block;width:11px;height:11px;border-radius:2px;margin-right:5px;vertical-align:-1px;border:1px solid var(--o-line)}
.legend-swatch.narrated{background:var(--o-accent)}
.legend-swatch.highlight{background:var(--o-warn)}
.legend-swatch.montage{background:var(--o-accent)}
.legend-swatch.dub{background:var(--o-accent)}
.legend-swatch.sub{background:var(--o-faint)}
.shot-row{border-top:1px solid var(--o-line)}
.shot-row.is-highlighted{background:var(--o-accent-soft)}
.review-kind.is-error{color:var(--o-danger)}
.review-kind.is-warning{color:var(--o-warn)}
.score-value.is-success,.review-state.is-success{color:var(--o-accent)}
.score-value.is-warning,.review-state.is-warning{color:var(--o-warn)}
.score-value.is-danger,.review-state.is-danger{color:var(--o-danger)}
.review-empty{color:var(--o-muted)}

/* ── 任务库(首页) ─────────────────────────────────────────── */
.viewhead{display:flex;align-items:center;gap:12px;margin-bottom:10px}
.viewh{font-size:var(--o-t-xl);line-height:1.3;letter-spacing:-.01em;margin:0;font-weight:var(--o-w-bold)}
.viewcount{color:var(--o-accent);font-size:14px;font-weight:var(--o-w-bold)}
.backbtn{background:var(--o-surface);color:var(--o-muted);border:1px solid var(--o-line);padding:8px 15px;border-radius:999px;
  font-size:13px;font-weight:500}
.backbtn:hover{color:var(--o-fg);border-color:#c3cbd3;background:var(--o-subtle)}
.jobhead{display:flex;align-items:center;gap:16px;margin-bottom:var(--o-s5)}

/* 素材卡片状态徽章的额外颜色(pending/done/err/run 已有的没有覆盖到的两种) */
.badge.err{color:var(--o-danger)}
.badge.run{color:var(--o-accent)}

/* ── 任务库卡片墙 ─────────────────────────────────────────── */
.lib{display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:15px}
.jobcard{background:var(--o-surface);border:1px solid var(--o-line);border-radius:0;overflow:hidden;cursor:pointer;
  display:flex;flex-direction:column}
.jobcard:hover{border-color:#c3cbd3}
.jc-cover{position:relative;aspect-ratio:16/9;background:var(--o-line-muted);
  display:grid;place-items:center;overflow:hidden;border-bottom:1px solid var(--o-line)}
.jc-cover img{width:100%;height:100%;object-fit:cover;display:block}
.jc-ph{color:var(--o-accent);font-weight:var(--o-w-bold);font-size:13px;letter-spacing:.5px;opacity:.85}
.jc-cover .badge{position:absolute;top:9px;right:9px}
.jc-body{padding:13px 15px 6px;flex:1}
.jc-title{font-weight:var(--o-w-bold);font-size:14.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.jc-meta{font-size:11.5px;color:var(--o-muted);margin-top:4px}
.jc-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 12px 12px}
.jc-foot button{padding:6px 11px;font-size:11.5px;border-radius:var(--o-radius)}
.jc-acts{display:flex;gap:6px}

@container page (max-width:860px){
  .workflow-modes{grid-template-columns:1fr}
  .workflow-tab{border-right:0;border-bottom:1px solid var(--o-line)}
  .workflow-tab:last-child{border-bottom:0}
}

/* 旧编号工具类(HTML 里原地保留的一次性排布值), 只把发光配色残留换成方向 C 令牌 */
.u-movie-001{margin-left:auto;padding:7px 15px;font-size:12.5px}
.u-movie-002{margin-bottom:20px}
.u-movie-003{}
.u-movie-004{flex:1}
.u-movie-005{margin-top:6px}
.u-movie-006{flex:0 0 auto}
.u-movie-007{width:90px}
.u-movie-008{width:120px}
.u-movie-009{flex:1;min-width:200px}
.u-movie-010{align-items:flex-end}
.u-movie-011{min-width:160px}
.u-movie-012{margin:0 0 14px;flex:1;min-width:220px;align-self:flex-end}
.u-movie-013{min-width:150px}
.u-movie-014{flex:1;min-width:240px}
.u-movie-015{margin:0 0 14px;flex:1 0 100%}
.u-movie-016{margin-top:4px;align-items:center}
.u-movie-017{flex:0 0 auto;margin-bottom:0}
.u-movie-018{width:100%;border-radius:var(--o-radius);margin-bottom:8px}
.u-movie-019{margin-top:12px;display:flex;gap:10px;flex-wrap:wrap}
.u-movie-020{color:var(--o-accent);font-size:12px;font-weight:500;letter-spacing:0;text-transform:none}
.u-movie-021{display:flex;align-items:baseline;gap:8px}
.u-movie-022{font-size:26px;font-weight:var(--o-w-bold)}
.u-movie-023{color:var(--o-muted);font-size:13px}
.u-movie-024{margin-left:auto}
.u-movie-025{margin-top:8px}
.u-movie-026{margin-top:10px}
.u-movie-027{margin:6px 0 0;padding-left:18px;color:var(--o-muted);font-size:13px}
.u-movie-028{margin-top:0}
.u-movie-029{margin:6px 0 0;padding-left:18px;font-size:13px;line-height:1.7}
.u-movie-030{color:var(--o-accent)}
.u-movie-031{color:var(--o-accent);font-size:11px;text-transform:none;letter-spacing:0}
.u-movie-032{color:var(--o-muted);font-size:13px;margin:6px 0}
.u-movie-033{margin:4px 0 10px}
.u-movie-034{max-height:560px;overflow:auto;border:1px solid var(--o-line);border-radius:0}
.u-movie-035{width:100%;border-collapse:collapse;font-size:12.5px}
.u-movie-036{font-weight:var(--o-w-bold);margin-bottom:14px}
.u-movie-037{font-size:13px;color:var(--o-muted);margin:4px 0 6px}
.u-movie-038{margin:4px 0 10px}
.u-movie-039{font-size:12px;color:var(--o-accent)}
.u-movie-040{width:320px;max-width:100%;border-radius:var(--o-radius);margin-top:4px}
.u-movie-041{margin-top:10px;align-items:center}
.u-movie-042{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--o-muted)}
.u-movie-043{width:auto}
.u-movie-044{color:var(--o-accent);font-size:11px;text-transform:none;letter-spacing:0}
.u-movie-045{align-items:center}
.u-movie-046{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.u-movie-047{margin-top:14px}
.u-movie-048{margin-bottom:18px}
.u-movie-049{width:80px}
.u-movie-050{margin-top:8px;color:var(--o-muted)}
.u-movie-051{margin-top:8px;align-items:flex-end}
.u-movie-052{margin-top:8px;font-size:13px;color:var(--o-muted)}
.u-movie-053{margin-top:12px}
.u-movie-054{grid-column:1/-1}
.u-movie-055{color:var(--o-danger)}
.u-movie-056{font-size:13px;color:var(--o-muted);margin:6px 0 8px}
.u-movie-057{background:var(--o-subtle);border:1px solid var(--o-line);border-radius:0;padding:10px 12px;margin-bottom:8px}
.u-movie-058{font-weight:var(--o-w-bold)}
.u-movie-059{color:var(--o-muted);font-weight:var(--o-w-normal);font-size:12px}
.u-movie-060{font-size:12.5px;margin-top:4px}
.u-movie-061{font-size:12.5px;margin-top:2px}
.u-movie-062{color:var(--o-accent)}
.u-movie-063{font-size:13px;color:var(--o-muted);margin:14px 0 8px}
.u-movie-064{font-size:12.5px;margin-bottom:5px}
.u-movie-065{color:var(--o-muted)}
.u-movie-066{display:flex;gap:10px;margin-bottom:8px;cursor:pointer}
.u-movie-067{color:var(--o-accent);font-variant-numeric:tabular-nums;white-space:nowrap;min-width:64px}
.u-movie-068{color:var(--o-accent);font-weight:var(--o-w-bold)}
.u-movie-069{color:var(--o-muted);font-size:11px}
.u-movie-070{font-size:11.5px;color:var(--o-muted);margin-top:2px}
.u-movie-071{cursor:pointer}
.u-movie-072{fill:var(--o-muted);font-size:9px}
.u-movie-073{position:sticky;top:0;background:var(--o-subtle);text-align:left}
.u-movie-074{padding:7px 10px}
.u-movie-075{padding:6px 10px;color:var(--o-accent);font-weight:var(--o-w-bold)}
.u-movie-076{padding:6px 10px;white-space:nowrap;color:var(--o-muted);font-variant-numeric:tabular-nums}
.u-movie-077{padding:6px 10px;white-space:nowrap}
.u-movie-078{padding:6px 10px}
.u-movie-079{padding:6px 10px;color:var(--o-muted)}
.u-movie-080{display:inline-flex;align-items:center;gap:6px;margin:2px 12px 2px 0}
.u-movie-081{font-weight:var(--o-w-bold);margin-bottom:6px}
.u-movie-082{font-size:12px;color:var(--o-muted);margin-bottom:12px}
.u-movie-083{font-size:12.5px;color:var(--o-muted);margin-top:2px}
.u-movie-084{font-size:12px;margin-top:2px}
.u-movie-085{font-size:13px;color:var(--o-muted);margin:12px 0 8px}
.u-movie-086{font-size:12.5px;margin-bottom:6px}

/* 9.16 AI 对话 (chat.html) —— 会话栏 + 气泡对话流。气泡不用阴影，用底色和
   hairline 区分说话人；工具调用挂成回答下方的来源 chip，点开看原始返回。 */
.chat-layout{display:grid;grid-template-columns:minmax(0,3fr) minmax(0,7fr);gap:var(--o-s4);align-items:start}
.chat-layout>.box{margin-bottom:0}

/* 聊天页整页锁在视口内:外壳高度 = 视口,主列 flex 占满剩余高度,
   会话栏和消息区各自内部滚动,输入框/开关/提示永远可见,不用滚页面。 */
.chat-page .app-shell{height:100vh;height:100dvh;min-height:0;grid-template-rows:minmax(0,1fr)}
.chat-page .app-sidebar,.chat-page .app-main{min-height:0}
.chat-page .app-canvas{display:flex;flex-direction:column}
.chat-page .chat-layout{
  flex:1 1 auto;
  min-height:0;
  grid-template-rows:minmax(0,1fr);
  align-items:stretch;
}
.chat-page .chat-layout>.box{display:flex;flex-direction:column;min-height:0}
.chat-page .chat-layout>.box .boxhead{flex:none}
.chat-page .chat-layout>.box .boxbody{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow-y:auto}
.chat-page .chat-thread{flex:1 1 0;min-height:0;max-height:none}

/* 窄屏(≤820px)有 48px 移动顶栏顶在 body 前面,外壳高度要扣掉它 */
@media (max-width:820px){
  .chat-page .app-shell{height:calc(100dvh - 48px)}
}
/* 矮屏:收掉可省的上下装饰(快捷提问、底部提示),给消息区让位 */
@media (max-height:620px){
  .chat-page .chat-quick{display:none}
  .chat-page .app-canvas{padding-top:var(--o-s3);padding-bottom:var(--o-s3)}
  .chat-page .chat-layout>.box:first-child{max-height:12vh}
  .chat-page .chat-composer textarea{min-height:48px;padding-top:8px;padding-bottom:14px}
  .chat-page .chat-layout>.box .boxhead{padding-top:var(--o-s2);padding-bottom:var(--o-s2)}
}
.chat-session{
  display:block;
  width:100%;
  margin-bottom:var(--o-s1);
  padding:var(--o-s2) var(--o-s3);
  border:1px solid transparent;
  border-radius:var(--o-radius);
  background:none;
  color:var(--o-fg);
  text-align:left;
  cursor:pointer;
}
.chat-session:hover{background:var(--o-subtle)}
.chat-session.on{border-color:var(--o-accent-line);background:var(--o-accent-soft)}
.chat-session b{display:block;font-size:var(--o-t-md);font-weight:var(--o-w-medium);overflow-wrap:anywhere;line-height:1.4}
.chat-session small{display:block;margin-top:2px;color:var(--o-muted);font-size:var(--o-t-xs);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.chat-ident{display:flex;flex:1;gap:var(--o-s3);align-items:center;min-width:0}
.chat-ident>div{min-width:0}
.chat-ident b{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-avatar{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  flex:none;
  width:34px;
  height:34px;
  border-radius:var(--o-radius);
  background:var(--o-accent);
  color:var(--o-on-accent);
  font-size:var(--o-t-sm);
  font-weight:var(--o-w-bold);
  letter-spacing:.04em;
}
.chat-avatar--sm{width:26px;height:26px;font-size:var(--o-t-xs)}
.chat-live{display:inline-block;width:6px;height:6px;margin-right:6px;border-radius:50%;background:var(--o-accent);vertical-align:middle}
.chat-options{
  position:absolute;
  left:48px;
  bottom:12px;
  z-index:1;
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--o-s2) var(--o-s4);
}
.chat-option{display:inline-flex;align-items:center;gap:6px;cursor:pointer;color:var(--o-fg);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.chat-option input{width:15px;min-height:15px;height:15px;accent-color:var(--o-accent)}

.chat-thread{
  display:flex;
  flex-direction:column;
  gap:var(--o-s4);
  min-height:320px;
  max-height:min(56vh,620px);
  overflow-y:auto;
  padding:var(--o-s2) var(--o-s2) var(--o-s4);
}
.chat-turn{display:flex;gap:var(--o-s2);max-width:min(76ch,88%)}
.chat-turn--user{flex-direction:column;align-items:flex-end;align-self:flex-end;text-align:left}
.chat-turn--ai{align-self:flex-start}
.chat-turn-body{min-width:0}
.chat-who{display:block;margin-bottom:var(--o-s1);color:var(--o-muted);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.chat-bubble{
  padding:var(--o-s3) var(--o-s4);
  border:1px solid var(--o-line);
  border-radius:14px;
  background:var(--o-surface);
}
.chat-turn--user .chat-bubble{border-color:transparent;background:var(--o-accent);color:var(--o-on-accent);border-bottom-right-radius:4px}
.chat-turn--ai .chat-bubble{background:var(--o-subtle);border-bottom-left-radius:4px}
.chat-text{white-space:pre-wrap;word-break:break-word}
.chat-shot{display:block;max-width:min(300px,100%);margin-bottom:var(--o-s2);border-radius:var(--o-radius)}

.chat-sources{display:flex;flex-wrap:wrap;gap:var(--o-s2);margin-top:var(--o-s2)}
.chat-source{max-width:100%;font-size:var(--o-t-sm)}
.chat-source summary{
  display:inline-block;
  padding:2px 10px;
  border:1px solid var(--o-line);
  border-radius:999px;
  background:var(--o-surface);
  color:var(--o-muted);
  cursor:pointer;
}
.chat-source summary:hover{border-color:var(--o-accent-line);color:var(--o-fg)}
.chat-source[open] summary{border-color:var(--o-accent-line);color:var(--o-fg)}
.chat-source pre{
  overflow-x:auto;
  max-height:260px;
  margin-top:var(--o-s2);
  padding:var(--o-s2);
  border:1px solid var(--o-line-muted);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  font:var(--o-w-normal) var(--o-t-sm)/1.5 var(--o-mono);
  white-space:pre-wrap;
  word-break:break-word;
}

.chat-quick{display:flex;flex-wrap:wrap;gap:var(--o-s2);padding-top:var(--o-s3);border-top:1px solid var(--o-line-muted)}
.chat-attached{display:flex;flex-wrap:wrap;gap:var(--o-s2);padding-top:var(--o-s3)}
.chat-chip{position:relative;display:inline-flex}
.chat-chip img{width:56px;height:56px;object-fit:cover;border:1px solid var(--o-line);border-radius:var(--o-radius)}
.chat-chip button{
  position:absolute;
  top:-6px;
  right:-6px;
  width:18px;
  height:18px;
  padding:0;
  border:1px solid var(--o-line);
  border-radius:50%;
  background:var(--o-surface);
  color:var(--o-fg);
  font-size:var(--o-t-xs);
  line-height:1;
  cursor:pointer;
}
.chat-composer{position:relative;display:block;padding-top:var(--o-s3)}
.chat-composer textarea{
  display:block;
  min-height:96px;
  padding:12px 12px 52px 12px;
  resize:none;
}
/* 左下角加号 = 图片上传入口(嵌在输入框内,参考主流 AI 聊天页) */
.chat-add{
  position:absolute;
  left:8px;
  bottom:8px;
  z-index:1;
  display:grid;
  place-items:center;
  width:34px;
  height:34px;
  border:0;
  border-radius:var(--o-radius);
  background:transparent;
  color:var(--o-muted);
  font-size:20px;
  line-height:1;
  cursor:pointer;
}
.chat-add:hover{background:var(--o-subtle);color:var(--o-fg)}
/* 发送按钮嵌在输入框右下角,左侧是快捷键提示 */
.chat-send{position:absolute;right:8px;bottom:8px;z-index:1;display:flex;gap:var(--o-s3);align-items:center}
.chat-send-hint{color:var(--o-muted);font-size:var(--o-t-xs);white-space:nowrap}
/* 拖拽图片到输入框时高亮 */
.chat-composer.chat-dragging textarea{border-color:var(--o-accent);box-shadow:0 0 0 3px var(--o-accent-soft)}

@container page (max-width:760px){
  .chat-layout{grid-template-columns:minmax(0,1fr)}
  .chat-page .chat-layout{grid-template-rows:auto minmax(0,1fr)}
  .chat-page .chat-layout>.box:first-child{max-height:26vh}
  .chat-page .chat-quick{display:none}
  .chat-thread{max-height:52vh}
  .chat-turn{max-width:100%}
  /* 窄屏放不下「联网/允许写操作」与「快捷键提示 + 发送」并排的一行,
     两组绝对定位会叠字。提示只在宽屏出现, 开关组让出发送按钮的位置。 */
  .chat-send-hint{display:none}
  .chat-options{right:96px;flex-wrap:nowrap;overflow:hidden}
}

/* ---------------------------------------------------- 10. 兼容隔离区 */
/* 下面的类名由运行时 JS 生成（publishing.js / app-shell.js），行为层必须保持
   逐字节不变，所以名字不能改。这里不是新组件，只是把这些旧名字接到第 8 节
   已经定义过的同一个组件上。
   ⚠️ 这是隔离区，不是模式。新写的页面和新写的 JS 一律禁止使用这些名字。 */
.platform-row{
  display:grid;
  grid-template-columns:var(--o-rowgrid);
  gap:var(--o-s4);
  align-items:center;
  padding:var(--o-s3) var(--o-s4);
  border-bottom:1px solid var(--o-line-muted);
}
.platform-row:last-child{border-bottom:0}
.platform-row:hover{background:var(--o-subtle)}
.platform-identity strong{display:block;font-size:var(--o-t-md);font-weight:var(--o-w-bold)}
.platform-identity span,.platform-capability-detail,.platform-status small{
  display:block;
  margin-top:2px;
  color:var(--o-muted);
  font-size:var(--o-t-sm);
  overflow-wrap:anywhere;
}
.platform-capabilities{display:flex;flex-wrap:wrap;gap:5px}
.platform-actions{display:flex;flex-wrap:wrap;gap:var(--o-s2);justify-content:flex-end}

/* = .label */
.capability-chip,.status-badge{
  display:inline-flex;
  align-items:center;
  height:20px;
  padding:0 8px;
  border:1px solid var(--o-line);
  border-radius:999px;
  background:var(--o-surface);
  color:var(--o-muted);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-medium);
  white-space:nowrap;
}
/* = .label--on / --warn / --danger */
.status-badge.is-enabled,.status-badge.is-success{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.status-badge.is-warning{border-color:var(--o-warn-line);background:var(--o-warn-soft);color:var(--o-warn)}
.status-badge.is-error{border-color:var(--o-danger-line);background:var(--o-danger-soft);color:var(--o-danger)}

/* = .btn--danger 的基础尺寸(.button-secondary 已统一到 8.5) */
.button-danger{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  height:26px;
  padding:0 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-fg);
  font-size:var(--o-t-sm);
  font-weight:var(--o-w-bold);
  white-space:nowrap;
  cursor:pointer;
}
.button-danger:disabled{opacity:.55;cursor:not-allowed}
.button-danger{border-color:var(--o-danger-line);color:var(--o-danger)}
.button-danger:hover{background:var(--o-danger-soft)}

/* = .empty */
.publishing-empty{padding:var(--o-s7) var(--o-s5);background:var(--o-subtle);text-align:center}
.publishing-empty b{display:block;font-size:var(--o-t-lg);font-weight:var(--o-w-bold)}
.publishing-empty span{
  display:block;
  max-width:44ch;
  margin:6px auto 0;
  color:var(--o-muted);
  font-size:var(--o-t-sm);
}
/* = .msg */
.publishing-message,.page-message{color:var(--o-muted);font-size:var(--o-t-sm)}
.publishing-message.is-error,.page-message.is-error{color:var(--o-danger)}
.publishing-message:empty,.page-message:empty{display:none}

/* settings.js hardcodes these five class names as querySelectorAll/className
   selector strings (search filter, tab sync, service health poll) — they are
   load-bearing the same way publishing.js's names are above. */

/* = .box + .boxhead, but the field grid inside needs its own layout */
.settings-section{
  overflow:hidden;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
}
.settings-section-heading{
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:var(--o-s5);
  padding:var(--o-s3) var(--o-s4);
  background:var(--o-subtle);
  border-bottom:1px solid var(--o-line);
}
.settings-section-heading>div:first-child{min-width:0}
.settings-section-heading p{margin-top:2px;max-width:66ch;color:var(--o-muted);font-size:var(--o-t-sm)}
.settings-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}
.settings-field{
  display:grid;
  align-content:start;
  gap:6px;
  min-width:0;
  padding:var(--o-s4);
  border-bottom:1px solid var(--o-line-muted);
  border-left:1px solid var(--o-line-muted);
}
.settings-field:nth-child(odd){border-left:0}
.settings-field.is-wide{grid-column:1/-1;border-left:0}
.settings-field.is-hidden{display:none}
.settings-field label{display:block;margin-bottom:6px;font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.settings-field input,.settings-field select,.settings-field textarea{
  width:100%;
  min-height:var(--o-control);
  padding:6px 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-fg);
  font-size:var(--o-t-md);
}
.settings-field input:disabled{background:var(--o-subtle);color:var(--o-faint)}
.settings-field-help{margin:0;color:var(--o-muted);font-size:var(--o-t-xs)}
.settings-field-effect{
  justify-self:start;
  padding:1px 7px;
  border:1px solid var(--o-line);
  border-radius:999px;
  color:var(--o-faint);
  font-size:var(--o-t-xs);
}
.settings-field-effect.is-live{border-color:var(--o-accent-line);color:var(--o-accent);background:var(--o-accent-soft)}
.settings-field-effect.is-restart{border-color:var(--o-warn-line);color:var(--o-warn);background:var(--o-warn-soft)}
.settings-disclosure{border-top:1px solid var(--o-line)}
.settings-section-heading+.settings-disclosure{border-top:0}
.settings-disclosure.is-hidden{display:none}
.settings-disclosure summary{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--o-s5);
  padding:var(--o-s3) var(--o-s4);
  cursor:pointer;
  list-style:none;
}
.settings-disclosure summary::-webkit-details-marker{display:none}
.settings-disclosure summary:hover{background:var(--o-subtle)}
.settings-disclosure summary span{display:grid;gap:2px}
.settings-disclosure summary strong{font-size:var(--o-t-md)}
.settings-disclosure summary small{color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-normal)}
.settings-disclosure summary>b{
  margin-left:auto;
  padding:1px 7px;
  border:1px solid var(--o-line);
  border-radius:999px;
  color:var(--o-faint);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-normal);
  white-space:nowrap;
}
.settings-disclosure[open] summary{border-bottom:1px solid var(--o-line);background:var(--o-subtle)}
/* dead but reachable via JS: shortvidPublisherRow() builds this markup, only
   ever inserted into an id ("shortvid-publisher-list") that no longer exists
   in the page, so it never actually mounts. Cheap alias, no active use. */
.connection-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--o-s3);padding:var(--o-s4)}
.settings-check{display:flex;align-items:center;gap:var(--o-s2)}

/* = .label--on / --warn / --danger, keyed by the status word itself */
.settings-state{display:inline-flex;align-items:center;gap:6px;color:var(--o-warn);font-size:var(--o-t-sm);font-weight:var(--o-w-bold)}
.settings-state::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.settings-state.is-ready{color:var(--o-accent)}
.settings-state.is-busy{color:var(--o-warn)}
.settings-state.is-error{color:var(--o-danger)}

/* = .rowitem, for the "服务状态" health list built by loadServiceHealth() */
.service{
  display:grid;
  grid-template-columns:minmax(190px,.8fr) minmax(240px,1.3fr) auto;
  gap:var(--o-s4);
  align-items:center;
  padding:var(--o-s3) var(--o-s4);
  border-bottom:1px solid var(--o-line-muted);
}
.service:last-child{border-bottom:0}
.service strong{font-size:var(--o-t-md);font-weight:var(--o-w-bold)}
.service .detail{color:var(--o-muted);font-size:var(--o-t-sm)}
.service-actions{display:flex;justify-content:flex-end}
.advanced-link{
  padding:4px 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  color:var(--o-muted);
  font-size:var(--o-t-sm);
}
.advanced-link:hover{background:var(--o-subtle);color:var(--o-fg);text-decoration:none}
/* = .label, keyed by the raw status word (ready/busy/offline/error/unconfigured) */
.badge{
  display:inline-flex;
  align-items:center;
  height:20px;
  margin-left:8px;
  padding:0 8px;
  border:1px solid var(--o-line);
  border-radius:999px;
  color:var(--o-muted);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-medium);
}
.badge.ready{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.badge.busy{border-color:var(--o-warn-line);background:var(--o-warn-soft);color:var(--o-warn)}
.badge.offline,.badge.error{border-color:var(--o-danger-line);background:var(--o-danger-soft);color:var(--o-danger)}
/* = .msg, plus a third is-warning intent .msg doesn't need elsewhere */
.status-message{color:var(--o-muted);font-size:var(--o-t-sm)}
.status-message.is-error{color:var(--o-danger)}
.status-message.is-success{color:var(--o-accent)}
.status-message.is-warning{color:var(--o-warn)}
.status-message:empty{display:none}
@media (max-width:700px){
  .settings-fields{grid-template-columns:minmax(0,1fr)}
  .settings-field{border-left:0;border-bottom:1px solid var(--o-line-muted)}
  .service{grid-template-columns:minmax(0,1fr)}
  .service-actions{justify-content:flex-start}
}

/* notifications.js builds this whole subtree with document.createElement +
   literal className strings (makeNotification()) — same load-bearing rule
   as the two blocks above. */
.notification-list{display:grid;overflow:hidden;border:1px solid var(--o-line);background:var(--o-surface)}
.notification-item{
  display:grid;
  grid-template-columns:32px minmax(0,1fr) auto;
  gap:var(--o-s3);
  align-items:start;
  padding:var(--o-s4);
  border-bottom:1px solid var(--o-line-muted);
}
.notification-item:last-child{border-bottom:0}
.notification-item.is-unread{background:linear-gradient(90deg,var(--o-accent-soft),transparent 42%)}
.notification-state{
  display:grid;
  place-items:center;
  width:28px;
  height:28px;
  border:1px solid var(--o-line);
  border-radius:50%;
  background:var(--o-surface);
  color:var(--o-muted);
  font-size:13px;
  font-weight:var(--o-w-bold);
}
.notification-item[data-lifecycle="failed"] .notification-state{border-color:var(--o-danger-line);background:var(--o-danger-soft);color:var(--o-danger)}
.notification-item[data-lifecycle="needs_action"] .notification-state{border-color:var(--o-warn-line);background:var(--o-warn-soft);color:var(--o-warn)}
.notification-item[data-lifecycle="succeeded"] .notification-state{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.notification-copy{min-width:0}
.notification-heading{display:flex;align-items:center;gap:var(--o-s2);min-width:0}
.notification-heading a{overflow:hidden;font-size:var(--o-t-md);font-weight:var(--o-w-bold);text-overflow:ellipsis;white-space:nowrap}
.notification-unread-dot{width:7px;height:7px;flex:0 0 7px;border-radius:50%;background:var(--o-accent)}
.notification-meta{display:flex;flex-wrap:wrap;gap:4px var(--o-s3);margin-top:4px;color:var(--o-faint);font-size:var(--o-t-xs)}
.notification-detail{max-width:74ch;margin:6px 0 0;color:var(--o-muted);font-size:var(--o-t-sm);overflow-wrap:anywhere}
.notification-item-actions{display:flex;align-items:center;gap:6px}
.notification-item-actions button,.notification-item-actions a{
  height:28px;
  padding:0 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-muted);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-medium);
  white-space:nowrap;
  cursor:pointer;
}
.notification-item-actions button:hover,.notification-item-actions a:hover{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
@media (max-width:760px){
  .notification-item{grid-template-columns:30px minmax(0,1fr)}
  .notification-item-actions{grid-column:2;justify-content:flex-start}
}
@media (max-width:430px){
  .notification-item-actions{display:grid;grid-template-columns:1fr 1fr;width:100%}
  .notification-item-actions button,.notification-item-actions a{text-align:center}
}

/* notification-center.js builds this whole subtree with document.createElement
   + literal className strings (channelRow()) — same load-bearing rule as the
   blocks above. makeLabel() emits bare, unclassed <label> for most fields;
   style those via the .channel-fields > label descendant selector instead of
   a class that was never assigned. */
.channel-row{padding:var(--o-s4) 0;border-bottom:1px solid var(--o-line-muted)}
.channel-row:last-child{border-bottom:0}
.channel-row-header{display:flex;align-items:center;justify-content:space-between;gap:var(--o-s4);margin-bottom:var(--o-s3)}
.channel-identity{display:flex;align-items:center;gap:var(--o-s3);min-width:0}
.channel-kind-mark{
  display:grid;
  place-items:center;
  width:32px;
  height:32px;
  border:1px solid var(--o-line);
  border-radius:50%;
  background:var(--o-subtle);
  color:var(--o-accent);
  font-size:10px;
  font-weight:var(--o-w-bold);
}
.channel-identity div{display:grid;gap:1px}
.channel-identity b{font-size:var(--o-t-md)}
.channel-identity span{color:var(--o-faint);font-size:var(--o-t-xs)}
.channel-row-actions{display:flex;align-items:center;gap:var(--o-s2)}
.channel-row-actions button{
  height:28px;
  padding:0 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-muted);
  font-size:var(--o-t-xs);
  font-weight:var(--o-w-medium);
  cursor:pointer;
}
.channel-row-actions button:hover{border-color:var(--o-accent-line);background:var(--o-accent-soft);color:var(--o-accent)}
.channel-row-actions .remove-channel:hover{border-color:var(--o-danger-line);background:var(--o-danger-soft);color:var(--o-danger)}
.channel-toggle{display:flex;align-items:center;gap:6px;color:var(--o-muted);font-size:var(--o-t-sm);font-weight:var(--o-w-medium)}
.channel-toggle input{width:15px;height:15px;accent-color:var(--o-accent)}
.channel-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--o-s3) var(--o-s4)}
.channel-fields>label{display:grid;gap:6px;color:var(--o-muted);font-size:var(--o-t-xs);font-weight:var(--o-w-bold)}
.channel-fields input,.channel-fields select{
  width:100%;
  min-height:var(--o-control);
  padding:6px 10px;
  border:1px solid var(--o-line);
  border-radius:var(--o-radius);
  background:var(--o-surface);
  color:var(--o-fg);
  font:var(--o-t-md) var(--o-font);
}
.channel-fields input:focus,.channel-fields select:focus{outline:0;border-color:var(--o-accent);box-shadow:0 0 0 3px var(--o-accent-soft)}
.channel-fields .field-wide{grid-column:span 2}
.channel-fields [hidden]{display:none}
.field-help{margin-top:6px;color:var(--o-faint);font-size:var(--o-t-xs)}
@media (max-width:800px){
  .channel-fields{grid-template-columns:1fr 1fr}
}
@media (max-width:640px){
  .channel-row-header{align-items:flex-start}
  .channel-row-actions{flex-wrap:wrap;justify-content:flex-end}
  .channel-fields{grid-template-columns:1fr}
  .channel-fields .field-wide{grid-column:auto}
}
@media (max-width:430px){
  .channel-row-header{display:grid}
  .channel-row-actions{justify-content:flex-start}
  .channel-row-actions button{flex:1}
  .channel-toggle{margin-right:auto}
}

/* avatar.js builds job rows with document.createElement + literal className
   strings — same load-bearing rule as the blocks above. */
.avatar-job-list{display:grid;align-content:start;max-height:610px;overflow:auto;padding:var(--o-s2) var(--o-s4) 0 0}
.avatar-job-row{appearance:none;width:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--o-s4);padding:var(--o-s3) 4px;border:0;border-bottom:1px solid var(--o-line-muted);background:transparent;color:var(--o-fg);text-align:left;cursor:pointer}
.avatar-job-row:hover{background:var(--o-subtle)}
.avatar-job-row[aria-current="true"]{background:var(--o-accent-soft);color:var(--o-accent)}
.avatar-job-main{display:grid;gap:3px;min-width:0}
.avatar-job-main strong,.avatar-job-main small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.avatar-job-main strong{font-size:var(--o-t-sm)}
.avatar-job-main small,.avatar-muted{color:var(--o-muted);font-size:var(--o-t-xs)}
.avatar-error-inline{color:var(--o-danger);font-size:var(--o-t-sm)}

/* ------------------------------------------------------------ 11. 响应式 */
@media (max-width:1180px){
  :root{--o-sidebar:216px;--o-rail:248px}
  .split{grid-template-columns:minmax(0,1fr)}
  .split>#platform-editor{width:auto}
}
@media (max-width:980px){
  :root{--o-rowgrid:minmax(0,1fr) 150px 268px}
  .rowhead>span:nth-child(2),.platform-capability-cell{display:none}
}
/* 抽屉(#platform-editor)在 1280/1440px 视口打开时挤压左侧列表列——
   视口本身没变窄, 上面这条 @media 不会触发, 但列表列(.split>.box, 见 9.1
   的 container:row/inline-size)会变窄, 所以补一份等效的容器查询版本。
   两者并存: 一个管视口收窄, 一个管抽屉挤占导致的容器收窄。 */
@container row (max-width:980px){
  .rowhead,.platform-row{--o-rowgrid:minmax(0,1fr) 150px 268px}
  .rowhead>span:nth-child(2),.platform-capability-cell{display:none}
}
@media (max-width:820px){
  .app-shell{grid-template-columns:minmax(0,1fr)}
  .app-sidebar{
    position:fixed;
    z-index:50;
    width:var(--o-sidebar);
    transform:translateX(-100%);
    transition:transform .2s ease;
  }
  .sidebar-open .app-sidebar{transform:none}
  .sidebar-open .app-sidebar-backdrop{
    display:block;
    position:fixed;
    inset:0;
    z-index:40;
    background:rgb(31 35 40 / 35%);
  }
  .app-mobile-bar{
    position:sticky;
    top:0;
    z-index:35;
    display:flex;
    align-items:center;
    gap:var(--o-s3);
    height:48px;
    padding:0 var(--o-s3);
    background:var(--o-surface);
    border-bottom:1px solid var(--o-line);
  }
  .app-mobile-bar strong{font-size:var(--o-t-lg)}
  .app-mobile-bar span{color:var(--o-faint);font-size:var(--o-t-sm)}
  .app-mobile-menu{
    display:grid;
    place-items:center;
    width:32px;
    height:32px;
    border:1px solid var(--o-line);
    border-radius:var(--o-radius);
    background:var(--o-surface);
    cursor:pointer;
  }
  .app-mobile-menu svg{width:18px;height:18px}
  .app-history{position:fixed;right:0;width:min(288px,86vw);z-index:45}
  .app-page.history-collapsed .app-history{width:40px}
  .app-canvas{padding:var(--o-s4) var(--o-s4) var(--o-s6)}
  .app-page-head{flex-direction:column;gap:var(--o-s3)}
  .login-workspace{grid-template-columns:minmax(0,1fr)}
  /* 触摸目标: 窄屏下按钮/文件选择/导航项/折叠面板摘要至少 44px 高(WCAG) */
  :root{--o-control:44px}
  .app-page button,.app-page input[type="file"]{min-height:44px}
  .app-nav-item,.app-page .side-tab,.app-page .tab{min-height:44px}
  .app-page details>summary{min-height:44px;display:flex;align-items:center}
}
@media (max-width:640px){
  :root{--o-rowgrid:minmax(0,1fr)}
  .rowitem,.rowhead,.platform-row{gap:var(--o-s2)}
  .rowhead{display:none}
  .rowactions,.platform-actions{justify-content:flex-start}
}
@media (max-width:480px){
}
@media (prefers-reduced-motion:reduce){
  .app-page *,.app-page *::before,.app-page *::after{transition-duration:.01ms;animation-duration:.01ms}
}
