/* ai-chat-studio-training.css - training: the console in the Studio frame, the collapsed rail, the agent editor and object page.
   One of the Studio stylesheet's 7 parts (part 7). They are contiguous slices of what used to be one
   file, and ai-chat-styles.liquid loads them in this order - the cascade depends on it, so a new part goes at the
   end of its own section, never between two others (gate: scripts/ui/studio-css-parts.test.mjs). */

/* ── 训练模式:住进 Studio 工作台原框(owner 2026-09-02"框架完全一致,内容不同")。
   侧栏/分割条/会议室窗框/手机 duo-sheet 上拉全是同一批 DOM;这里只写【两态内容互换】。 ── */
/* 默认(非训练):训练件全不显 */
/* 段落节奏:聊天基准的 margin 带 !important,同重量才压得住(缩进/表格/hr 仍归基准) */
.studio-view-page .tc-feed .bubble.md-rendered p,
.studio-view-page .tc-feed .bubble.md-rendered ul,
.studio-view-page .tc-feed .bubble.md-rendered ol { margin: var(--tc-para) 0 !important; }
/* 文字块与过程行之间原来是 4(末段下边距)+ 6(行距)= 10px,减半到 5:末段不留下边距(聊天基准本来就
   这么定,是上面那条 !important 把它盖掉了),边界只由行距一处决定(owner 2026-09-03) */
.studio-view-page .tc-feed .bubble.md-rendered > :last-child { margin-bottom: 0 !important; }
.studio-view-page .tc-feed .bubble.md-rendered > :first-child { margin-top: 0 !important; }
.studio-view-page.is-training .tc-feed > * + * { margin-top: var(--tc-gap); }
/* 步骤行与运行里的工具行:跟正文【一样大】,灰的是颜色不是字号 —— 12px 灰是上一版靠缩字做层级
   留下的,owner 2026-09-04 说看着太小。它们在会议室仍是 12px:那是聊天,这是工作记录。 */
.studio-view-page .tc-feed .studio-meeting-step,
.studio-view-page .tc-feed .agent-light-row,
.studio-view-page .tc-feed .agent-seg-head { font-size: var(--tc-text); line-height: var(--tc-line); }
.studio-view-page .tc-feed .tc-start-card-desc { font-size: var(--tc-text); }
/* 正文也归训练台自己的字号:tc-feed 挂着 .chat-messages,所以主聊天那条 16px 气泡规则(带 !important)一直
   压着它 —— 过程行 14、正文 16,"跟正文一样大"名存实亡(owner 2026-09-06:agent 这边字偏大)。同重量才压得住。 */
.studio-view-page .tc-feed .bubble,
.studio-view-page .tc-feed .bubble.md-rendered { font-size: var(--tc-text) !important; line-height: var(--tc-line) !important; }
/* tc-feed 不在这张单子里:它是房间自己的列表,标记只在训练态挂着(挂/摘在 console 的 enter/exit) */
.tp-left, .tp-title, .studio-view-page .tc-chips, .studio-view-page .tc-start { display: none; }
.training-composer.composer-bar { display: none; }
/* 训练态:studio 内容退席,训练内容入席 —— 同一对 section、同一根分割条。
   本地手绿灯【不退席】(owner 2026-09-02):它是"机器在不在"的常驻信号,展开坐 header 原位、
   折叠走 .studio-org-folded 现成的"竖条最下面"规则 */
/* ★这张名单删成员只许删【整行】,且最后一行必须自带 { display: none; }(2026-09-03 事故:
   删掉末member连块头一起没了,整串逗号并进下一条 display:flex → studio 内容在训练态全体亮相) */
.studio-view-page.is-training #studioOrgScroll,
.studio-view-page.is-training .studio-org-brand-wrap,
.studio-view-page.is-training .studio-meeting-composer,
.studio-view-page.is-training .studio-meeting-header .project-collaborators { display: none; }
/* 三点菜单在训练态照常(owner 2026-09-03:训练设置从同一颗三点进) */
.studio-view-page.is-training .tp-left { display: flex; }
.studio-view-page.is-training .tp-title { display: inline; }
/* 维度圈只在【选中了对象】才显(owner 2026-09-05):选择页上没有对象可指,一排圈读起来像已经在练什么 */
.studio-view-page.is-training.is-training-object .tc-chips { display: flex; gap: 8px; min-width: 0; }
/* 对象身份只在手机显(桌面左栏本来就摆着它):头像与会员圈同一基准,名字 14px/500,放不下省略;margin-right:auto 把它顶到最左 */
.tc-object { display: none; }
@media (max-width: 768px), (max-height: 500px) {
  .studio-view-page.is-training.is-training-object .tc-object { display: flex; align-items: center; gap: 8px; min-width: 0; margin-right: auto; }
  .tc-object .studio-brand-icon { width: 32px; height: 32px; font-size: 11px; flex: 0 0 auto; }
  .tc-object .project-avatar { flex: 0 0 auto; }
  .tc-object-name { font-size: 14px; font-weight: 500; color: var(--color-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
}
.studio-view-page.is-training .tc-start { display: inline-flex; }
.studio-view-page.is-training .tc-start[hidden] { display: none; }
/* 坐席规则同 .studio-meeting-composer(同一把椅子,换个人坐) */
.studio-view-page.is-training .training-composer.composer-bar { display: block; flex-shrink: 0; }
/* 窄到内容最小宽以下,会议室【本来就会】收成竖条(layoutSplit 的 MEET_MIN,唯一那处判断)。训练件必须跟着收:
   它们的选择器比房间那条 stand-down 更具体,不点名就会赖在 60px 竖条里,把窗口顶出横滑条。 */
.studio-view-page.is-training .studio-meeting.studio-meeting-folded .tc-feed,
.studio-view-page.is-training .studio-meeting.studio-meeting-folded .training-composer.composer-bar { display: none; }
/* 翻页箭头只在【选中了对象】才有意义 */

/* 会议室头在训练态里【不换排布】:圆圈坐的就是会员头像组那一格 —— 房间里在右上,训练页也在右上,
   两边切来切去那一排圈不会跳位(owner 2026-09-05:圆圈位置三处要一致)。所以这里不覆盖 justify-content,
   由 .studio-meeting-header 自己的 flex-end 说了算;chips 在 DOM 里也挂在会员组原来的位置。 */
/* 左栏训练内容。对象身份 = 品牌/agent 同一格式(owner 2026-09-02):居中大图 + 名字在下,
   离顶 24px(编辑面原生内距值,别顶格)。图 140 与 agent 头像预览同档;
   品牌方图标走库里现成的 22.4% 比例圆角(app 图标比例),字号按 140 档同比(80→24 的同一比率) */
.training-identity { display: flex; flex-direction: column; align-items: center; gap: 12px; margin: 40px 0 16px; }   /* 离顶 40(owner 2026-09-02 定值) */
.training-identity .studio-brand-icon { width: 140px; height: 140px; border-radius: var(--tile-radius-pct); font-size: 42px; }
.training-identity-name { font-size: 16px; font-weight: 500; color: var(--color-text); }
/* 桌面上对象页的这两块各大一档(owner 2026-09-04:方块/头像 140→160、六维图 +20)。手机维持原尺寸,
   所以只写在桌面尺寸里。★位置也是规矩:必须留在下面【折叠竖条】那组【之前】—— 那组把卡与图标一律钉成
   48,和这里同特异性,靠写在后面取胜;把这段挪到它后面,折叠竖条里会冒出 160 的头像。 */
@media (min-width: 769px) and (min-height: 501px) {
  .studio-view-page.is-training-object .tp-object-identity .studio-brand-icon,
  .studio-view-page.is-training-object .tp-object-identity .edit-profile-avatar-wrap,
  .studio-view-page.is-training-object .tp-object-identity .studio-agent-icon { width: 150px; height: 150px; font-size: 45px; }
  /* ★宽高一起按 212:180 走 —— 那两个数就是 svg 的 viewBox,只改一边图不会被拉伸、只会在盒子里留白。
     写在盒子上而不是 svg 上:等图时占位的空盒子读的是同两个数,两者不会各大各的。 */
  .studio-view-page.is-training-object .studio-ability-hex { --hex-w: 232px; --hex-h: 197px; }
}
/* 左栏内容底部同样留白(编辑面动作行/品牌图不贴底),两侧共用滚动区这一条 */
.tp-left { padding-bottom: 24px; box-sizing: border-box; }
.tp-left .studio-training-grid { margin: 0 0 24px; }
/* 枢纽页上下平分两个区域(owner 2026-09-02):Brand 上半 / Agents 下半,各占一半高、各自滚动。
   宿主(.tp-left)本就是 studio-org-scroll 的竖 flex,fork 吃满剩余高;两半 min-height:0 才滚得起来。
   ★别给 .tp-left 再写显示规则:裸 :has 版(0,2,0)曾压过"非训练态隐藏训练件"的默认规则,
   退回 studio 后 fork 混进组织架构页(owner 2026-09-02 实拍);显隐只归 1633/1644 那两条 */
.studio-training-fork { flex: 1 1 auto; min-height: 0; display: grid; grid-template-rows: 1fr 1fr auto; padding-top: 24px; box-sizing: border-box; }   /* Brand / Agents share the height; Market sense is one entry row */   /* Brand 段离顶 24(同 org 横向内距档,owner:别顶格) */
.studio-training-half { min-height: 0; overflow-y: auto; }
/* 分组标题(Brand/Agents)钉在各自滚动区顶上,滑动不遮(owner 2026-09-03):
   桌面半区自己滚 → 钉半区顶;底色面板色,内容从底下过。
   Desktop only: on the phone the halves do not scroll (.tp-left does), so a sticky label would park at the column's
   top and cover its own cards as they scroll under it (measured 2026-09-16: label 79-107, card row 51-135). */
.studio-view-page.is-training .studio-training-half > .project-settings-label { padding: 4px 0; }
@media (min-width: 769px) and (min-height: 501px) {
  /* The hub's Market sense row wears the row card on desktop too (owner 2026-09-16: alone under two grids it read as a
     loose line). The phone already gives it this card through project-settings-cards; these are that card's values. */
  .studio-market-card { border-radius: calc(24px * var(--corner-k)); overflow: hidden; background: rgba(0,0,0,0.03); }
  .dark-mode-active .studio-market-card { background: rgba(255,255,255,0.05); }
  .studio-market-card > .studio-market-entry { padding: 14px 16px; border-bottom: none; }
  .studio-view-page.is-training .studio-training-half > .project-settings-label {
    position: sticky; top: 0; z-index: 1;
    background: var(--color-bg-page);   /* 窗口地色(三窗口规则):panel 在暗色是 #2a2a2a,会浅出一条 */
  }
}

/* 手机:与组织页头像同档(那边同断点定 60/14)—— 训练页不另立尺寸;圆角按家族公式随 60 缩。
   上下平分是桌面设计:手机改整页自然流(owner 2026-09-02"没有滚动条可以吗")——
   两半不再各自内滚,滚动交还 tp-left,分区边界不再拦腰裁头像、内滚条消失 */
@media (max-width: 768px), (max-height: 500px) {
  /* flex:none, not the desktop's 1 1 auto: as a shrinkable item the fork was squeezed to the column and its children spilled
     past it, so the column's bottom padding sat under the spill and reserved nothing (measured 2026-09-16: 72px of padding, the
     scroll height unchanged). At its content height the padding lands after the last row, where the bubble needs it. */
  .studio-training-fork { display: block; height: auto; flex: none; }
  .studio-training-half { overflow: visible; }
  /* 手机手指滑动不需要可见滚动条(owner 2026-09-02"去掉可以吗";duo-scroll 有意例外,与移动端 sheet 同规)。
     只用标准 scrollbar-width:现代 iOS/Chrome 都认,且标准属性一在场 webkit 版本本就被忽略 */
  .studio-view-page.is-training .tp-left,
  .studio-view-page.is-training .studio-org-chart { scrollbar-width: none; }
  /* 这个头【不许】sticky(2026-09-04 取证):它的滚动祖先是永不滚动的 .studio-view-page(overflow:hidden),
     sticky 在布局上是空转,却让 iOS 单独给它开一个合成层、紧挨着下面 .tp-left 的加速滚动层 ——
     WebKit 那族"sticky 不绘制但仍可点击"的 bug 正是这个形状(owner 实拍:胶囊闪一下消失、点那位置还能下拉)。
     真正的滚动器是 .tp-left,头是它上面的 flex 兄弟,本来就滚不走,不需要钉。 */
  /* ★tp-left 就是手机的真滚动器(2026-09-03 实证:放开它的 overflow = 对象页整页失去滚动,已回滚)。
     它从 org 头下面开始,分组标题钉它顶上(top:0)不会被头遮 —— 桌面那条 top:0 就是对的,手机不另设偏移 */
  .studio-training-fork .studio-brand-grid,
  .studio-training-fork .studio-agent-grid { grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); }
  .studio-training-fork .studio-brand-grid .studio-brand-icon { width: 60px; height: 60px; font-size: 14px; border-radius: calc(var(--tile-radius) * 60 / 48); }
  .studio-training-fork .studio-agent-grid .studio-agent-icon { width: 60px; height: 60px; font-size: 14px; }
}
/* 训练页 agent 卡永远全亮(owner 2026-09-02):"有没有摆进当前系列"在这页没有意义 */
.tp-left .studio-agent-card:not(.placed) { opacity: 1; }

/* ── 折叠竖条里的训练页 = studio 折叠同一套语言(owner 2026-09-02):只留图标一列,名字/标题全藏。
   数值全抄 .studio-org-folded 现有折叠规则(14px 6px 内距 / 48 圆 / 10 间距 / 名字 display:none) ── */
/* ★设 display 的折叠规则必须带 .is-training:不带的话(0,3,0)压过默认隐藏,studio 折叠态会显出空训练件 */
.studio-view-page.is-training .studio-org-chart.studio-org-folded .tp-left { padding: 14px 6px; overflow: hidden; display: block; }
/* 折叠不再上下平分:一条竖流(两半各自的滚动交还给 tp-left) */
.studio-org-chart.studio-org-folded .studio-training-fork { display: block; }
.studio-org-chart.studio-org-folded .studio-training-half { overflow: visible; }
.studio-org-chart.studio-org-folded .tp-left .project-settings-label,
.studio-org-chart.studio-org-folded .tp-left .studio-brand-name,
.studio-org-chart.studio-org-folded .tp-left .studio-agent-name { display: none; }
.studio-org-chart.studio-org-folded .tp-left .studio-training-grid { display: flex; flex-direction: column; align-items: center; gap: 10px; margin: 0 0 10px; }
/* 折叠尺寸档自带(studio 折叠把胶囊钉 24 圆的同一做法):卡/图标一律 48,任何上游大尺寸进不了竖条 */
.studio-org-chart.studio-org-folded .tp-left .studio-brand-card,
.studio-org-chart.studio-org-folded .tp-left .studio-agent-card { width: 48px; }
.studio-org-chart.studio-org-folded .tp-left .studio-brand-card .studio-brand-icon,
.studio-org-chart.studio-org-folded .tp-left .studio-agent-card .studio-agent-icon,
.studio-org-chart.studio-org-folded .tp-left .studio-training-mosaic { width: 48px; height: 48px; font-size: 13px; }
/* 对象页:身份折成 48 图标(同折叠头像圆的直径),名字/六维图收起 */
/* 折叠竖条:两页同一条 —— 只剩身份那一颗(48),图/行/页脚全收(竖条里没有"可编辑"这回事) */
.studio-org-chart.studio-org-folded .tp-object-identity { margin: 0 0 10px; gap: 0; }
.studio-org-chart.studio-org-folded .tp-object-head { display: block; margin-bottom: 0; }
.studio-org-chart.studio-org-folded .tp-left .tp-object-hex,
.studio-org-chart.studio-org-folded .tp-left .tp-object-dna,
.studio-org-chart.studio-org-folded .tp-left .tp-dna-actions,
.studio-org-chart.studio-org-folded .training-identity-name,
.studio-org-chart.studio-org-folded .tp-object-identity .edit-profile-avatar-camera,
.studio-org-chart.studio-org-folded .tp-object-identity .edit-profile-avatar-remove { display: none; }
.studio-org-chart.studio-org-folded .tp-object-identity .studio-brand-icon { border-radius: var(--tile-radius); }
.studio-org-chart.studio-org-folded .tp-object-identity .studio-brand-icon,
.studio-org-chart.studio-org-folded .tp-object-identity .edit-profile-avatar-wrap,
.studio-org-chart.studio-org-folded .tp-object-identity .studio-agent-icon { width: 48px; height: 48px; font-size: 13px; }
/* 标题折成圆圈图标(owner 2026-09-02):圆做在 .tp-title 元素本身 —— 与 collection 折叠的品牌彩点
   (.studio-org-folded .studio-org-brand-name.is-clickable)同一份度量与位置:同 24 圆、同 header 居中 */
.tp-title-ic { display: none; }
/* ★:not(.is-training-object) 不是装饰:对象态那条隐藏规则只有 4 个类,本条 5 个,不排除就永远压过它 ——
   折叠 + 品牌页于是同时出现"六边形圆圈 + 品牌彩点"两个身份(owner 2026-09-03 实拍)。对象态的身份只有彩点。 */
.studio-view-page.is-training:not(.is-training-object) .studio-org-chart.studio-org-folded .tp-title {
  width: 24px; height: 24px; padding: 0; border-radius: 50%; corner-shape: round;
  display: inline-flex; align-items: center; justify-content: center;
  overflow: hidden; flex: 0 0 auto;
  box-shadow: 0 0 0 1px var(--color-border);   /* 训练没有品牌色,圆以 token 描边成形 */
}
.studio-org-chart.studio-org-folded .tp-title-ic { display: inline-flex; align-items: center; justify-content: center; }
.studio-org-chart.studio-org-folded .tp-title-ic svg { width: var(--icon-size-sm); height: var(--icon-size-sm); display: block; }
.studio-org-chart.studio-org-folded .tp-title-tx { display: none; }
/* 对象胶囊折成 24 色圆走 studio 那条现成规则(同类同名);圆里不摆 chevron */
.studio-org-chart.studio-org-folded .tp-obj-select .settings-lang-chevron { display: none; }
/* 对象/维度选择 = 设置页下拉真源(本项目禁胶囊选择器 —— owner 2026-09-02) */
.tp-obj-select { display: none; }
.studio-view-page.is-training.is-training-object .tp-obj-select { display: inline-flex; }
.studio-view-page.is-training.is-training-object .tp-title { display: none; }
/* Market sense is a singleton: its capsule names it like any object but has nothing to switch to - no chevron, no hand */
.studio-view-page.is-training-market .tp-obj-select .settings-lang-chevron { display: none; }
.studio-view-page.is-training-market .tp-obj-select #tpObjTrigger { cursor: default; }
/* ── Agent training (desktop): the ONE agent editor lands inside the left column - no popup
   (owner 2026-09-02). Shell neutralised here; every inner wire stays the modal source's. ── */
/* ★不吃满剩余高(flex:1 曾在这里):壳一长满,列里就没有剩余高度可分,居中那条 auto 边距
   当场算成 0 —— 内容贴顶、下面空一大块(实测 412px)。真正的滚动器是 .tp-left,壳不必长满。 */
.studio-agent-editor.is-inframe { position: static; inset: auto; z-index: auto; display: flex; flex-direction: column; flex: 0 0 auto; min-height: 0; }
.studio-agent-editor.is-inframe .project-settings-modal-content {
  position: static; width: 100%; max-width: none; box-shadow: none;
  background: transparent; animation: none; padding: 0; border-radius: 0;
  /* 编辑面【就是】那一列:头/列表/页脚要摆得和品牌训练页一样,它必须自己是那根竖列 */
  display: flex; flex-direction: column; flex: 1; min-height: 0;
}
/* 训练页只留头像与能力图:名字/职位/岗位/专长在 agent 页上改(owner 2026-09-02)。它们仍在 DOM 里 ——
   保存要读 —— 所以整块藏起来,不是逐条挑着藏。 */
.tp-object-fields { display: none; }
/* ── 对象页(品牌 / agent)的【唯一格式真源】(owner 2026-09-03 "不要分叉"):两页同一套骨架 ——
   头 .tp-object-head(身份 .tp-object-identity | 六维图 .tp-object-hex)/ 列表 .tp-object-dna(五格行 + 对比行)
   / 页脚 .tp-dna-actions。两个 DOM 生产者(品牌控制台 / agent 编辑面)吐同一批类名,位置只在这里定一次。
   两半与 50px 间距沿用编辑面原本的双栏度量;折叠竖条另有单列规则(它本来就不画图)。 */
@media (min-width: 769px) and (min-height: 501px) {
  /* ★品牌对象页是【头 / 列表 / 页脚】三段的竖列(.tp-left 本就是 .studio-org-scroll 的 flex 列),不是一整张网格。
     整列做成网格时每行高度由【剩余高度平摊】决定,组间距和行间距因此永远相等 —— 实测 1040 高时两处都是 55、
     760 高时两处都是 20,owner 2026-09-03 报的"上面太挤、行之间太散"就是这一条。头与列表之间现在是设计值,
     行之间由行自己的 44px 节奏决定,页脚 margin-top:auto 落到列底(分享弹窗那族的页脚做法)。 */
  .studio-view-page.is-training-object .tp-left { padding-top: 40px; }
  .tp-object-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: 50px; align-items: center; margin-bottom: 70px; }
  .tp-object-head > .tp-object-identity { margin: 0; }
}
/* 身份块两页同一个形:头像在上、名字在下,竖排居中(编辑面本来是横排的 preview —— 训练页里跟着骨架走) */
.tp-object-identity { display: flex; flex-direction: column; align-items: center; justify-content: flex-start; gap: 12px; }
.tp-object-identity .edit-profile-avatar-wrap { margin: 0; }
/* 图在页头里就不再是行栈的一员:那条分隔线会变成图下面一道断线 */
.tp-object-head > .tp-object-hex > .studio-ability-hexrow { border-bottom: 0; }
/* 一组行的【最后一行】不画分隔线(与 .settings-memory-toggle-group 同一条规矩):不去掉的话,
   列表末尾那道线就成了页脚上方的一道横杠 —— agent 页那份没有它(owner 2026-09-03 实拍:线贴着按钮)。 */
.tp-object-dna > .settings-row:last-child { border-bottom: none; }
/* 页脚落到列底 —— ★只是桌面那张布局的事。手机上页脚是一张设置行卡,它不该拿这条的 padding
   (那 20px 会跑到卡【里面】去),也不该被它压掉卡与卡之间的 12px;所以这条只在桌面尺寸里生效
   (owner 2026-09-04 实拍:两张卡贴死)。导出在左下角、导入在右下角 —— 一左一右复用既有那条(.studio-brand-del-btn 的 margin-right:auto),
   不新造页脚形态。列表与页脚之间的空白因此长在页脚上方,不再摊进行距。
   ★padding-top 是【下限】不是装饰:margin-top:auto 只在有剩余高度时撑得开,内容一满(手机)就塌成 0,
   按钮当场贴上列表。20 = agent 页动作行与上方那组之间的同一个值。 */
@media (min-width: 769px) and (min-height: 501px) {
  .studio-view-page.is-training-object .tp-left .tp-dna-actions { margin-top: auto; padding-top: 20px; }
  /* 删除落左下角、导出/导入落右下角(owner 2026-09-04)。这一排只有桌面才存在(手机上它们是卡),
     所以排序也只写在这里:删除拿 order:-1 排到最前,它自带的 margin-right:auto 吃掉剩余空白,
     另两颗被推到右边。写在外面 = 手机上按钮也跑到说明前面去。 */
  .tp-obj-row .studio-brand-del-btn { order: -1; }
}
/* 一左一右靠删除那颗自带的 margin-right:auto(.studio-brand-del-btn)。
   ★这里曾经还有一条只认 data-action="dna-export" 的同款规则 —— 它只命中品牌页那颗,
   于是两页的导出位置对不上(owner 2026-09-04 看出来的)。页脚现在只有一个生产者,不再按页命名。 */
/* 这一面只看不改:编辑器自带的那排动作钮(Delete/Save)和头像上的编辑入口不出现。
   ★藏不拆 —— 拆了元素,编辑器后面的接线会撞 null(paint() 要写 avatarRemove.hidden),
   一抛就把六边形和能力行一起带走(owner 2026-09-04 实拍)。表单列一直就是这么藏的。 */
/* ★带上 .project-settings-modal-content 不是装饰:要藏的那排动作钮被
   .project-settings-modal-content .project-modal-actions { display: flex }(0,2,0)撑着,
   裸 .tp-editor-actions(0,1,0)永远输 —— 规则写在表里、按钮却一直在页上(owner 2026-09-04 实拍)。
   同特异性靠本表后加载取胜。 */
.project-settings-modal-content .tp-editor-actions,
.studio-view-page.is-training-object .tp-left .edit-profile-avatar-camera,
.studio-view-page.is-training-object .tp-left .edit-profile-avatar-remove { display: none; }
/* 内容整块在列里【上下居中】(owner 2026-09-04:下面空太多)。页脚仍旧落底 ——
   首块和页脚各拿一个 auto,剩余高度就在两处平分,而不是全堆在列表下面。
   ★认【列的第一个子元素】而不是 .tp-object-head:品牌页的头是列的直接子元素,agent 页的内容
   还包在编辑器那层壳里,写死 head 只有一页生效。内容一满 auto 自己算成 0,和页脚那条同脾气。 */
.studio-view-page.is-training-object .tp-left > *:first-child { margin-top: auto; }
/* the market page has no head: its one row starts at the top, the footer keeps its place at the bottom */
.studio-view-page.is-training-object.is-training-market .tp-left > *:first-child { margin-top: 0; }
/* The dimension / ability rows on the object pages are a meter list on a pane, not settings rows in a dialog:
   they take the sidebar row height (44px, the pane-row tier) instead of the dialog row's 16px padding
   (owner 2026-09-02: too loose). Content stays centred by the rows' own align-items. */
/* ★不画分隔线也写在这里(owner 2026-09-04)。此前品牌那边"没有线"纯属意外:它的行是个 <button>,
   顺手带了 border:0 的按钮复位,把 .settings-row 的 1px 一起抹了;agent 那边是 <div>,线就留着 ——
   同一份骨架两个样子,而没有一条规则说过"这一档不画线",所以门也无从对比(它只能比写下来的东西)。 */
.studio-view-page.is-training-object .tp-left .settings-row.studio-dna-dim-row,
.studio-agent-editor.is-inframe .settings-row.studio-ability-bar-row { padding-top: 0; padding-bottom: 0; min-height: 44px; border-bottom: none; }
/* agent 那一面与品牌那一面【是同一页】(owner 2026-09-05):引擎接好之后,这里原本那段"歇菜"规则
   (chips/记录/起跑卡/输入框全藏)已经退役 —— 再藏着就是把已经能用的东西关在门外。 */

/* Training header dropdown triggers wear the brand capsule source (.studio-org-brand-name.is-clickable);
   press states = the same filter pair the wrap gives the org-header pill (true colour untouched) */
html:not([data-input="touch"]) .settings-lang-trigger.studio-org-brand-name.is-clickable:hover { filter: brightness(var(--press-hover)); }
.settings-lang-trigger.studio-org-brand-name.is-clickable:active { filter: none; background-image: linear-gradient(var(--press-overlay), var(--press-overlay)); }
/* The capsule keeps ITS text colour under hover and press: the generic trigger's state colour (.dark-mode
   .settings-lang-trigger:active = white 0.9) outranked the capsule and the black-on-yellow name flashed white on tap
   (owner 2026-09-06 phone). Specificity here beats that rule; the neutral (agent) capsule keeps the text token. */
html:not([data-input="touch"]) .settings-lang-trigger.studio-org-brand-name.is-clickable:hover,
.settings-lang-trigger.studio-org-brand-name.is-clickable:active,
html:not([data-input="touch"]) .dark-mode .settings-lang-trigger.studio-org-brand-name.is-clickable:hover,
.dark-mode .settings-lang-trigger.studio-org-brand-name.is-clickable:active { color: var(--studio-brand-fg); }
html:not([data-input="touch"]) .settings-lang-trigger.studio-org-brand-name.is-clickable.tc-obj-neutral:hover,
.settings-lang-trigger.studio-org-brand-name.is-clickable.tc-obj-neutral:active,
html:not([data-input="touch"]) .dark-mode .settings-lang-trigger.studio-org-brand-name.is-clickable.tc-obj-neutral:hover,
.dark-mode .settings-lang-trigger.studio-org-brand-name.is-clickable.tc-obj-neutral:active { color: var(--color-text); }
/* Room-header dimension pill: same capsule metrics, NO brand colour (owner 2026-09-02) - a visible capsule at
   rest, not only on hover: filled with the room's neutral capsule token (.studio-meeting-day), press = the next
   step up the same ladder (--color-bg-card, the hover fill of .code-copy-btn / .ask-choice-nav), not a filter */
.tc-dim-stack .project-avatar.is-current {
  background: var(--avatar-bg-lit);
  position: relative; z-index: 1;
}
/* Attached-file names under the user's text: same ink, quieter (no new colour) */
.studio-view-page .tc-feed .msg.user .tc-file-cards { margin-top: 6px; }
/* Entry thumbnail (signature pieces): the unified thumb language - --img-radius container crop,
   token ring via 1px shadow, 1:1 cover; the img itself carries no radius (site law) */
.studio-dna-thumb { width: 48px; height: 48px; border-radius: var(--tile-radius); overflow: hidden; box-shadow: 0 0 0 1px var(--color-border); margin-top: 6px; flex: 0 0 auto; }
.studio-dna-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* 条目材料是个文件(3D 模型这种)时画的是全站那张文件卡:它是块级的,贴着正文就没法读(owner 2026-09-04) */
.studio-dna-file { margin-top: var(--img-gap); }
.tc-line-saved .studio-meeting-step-label, .tc-line-saved { color: var(--color-text-secondary); }
.tc-line-error { color: var(--color-danger); }
/* Result lines carry free text (an API error is one long token: req-id, cf-ray). In a flex row that text is an
   anonymous item whose min-content is the longest word - wider than the box it leaks out and widens the whole
   feed (measured: 492 in a 430 box, the sideways scroll). Same wrap the chat bubble uses. */
.tc-line-saved, .tc-line-stopped, .tc-line-error { word-break: break-word; }

/* 三点菜单里【跑动中不能用】的项(换对话):置灰走全站同一个 --dim,与 runLock 锁死换对象/换维度同一条规矩。
   历史列表里非当前的那几行同理 —— 点了没反应会被读成"坏了",置灰是把"现在不行"说出来。 */
.studio-meeting-menu .project-menu-item.is-disabled,
.project-settings-cards .settings-row.is-disabled { opacity: var(--dim); cursor: default; pointer-events: none; }

/* Training console > Chat history: the search sits flush with the sheet content; on the phone it keeps the same
   16px side margin as the card group below it (.project-settings-cards .settings-memory-toggle-group). */
.studio-chat-search { margin: 0 0 12px; }
@media (max-width: 768px), (max-height: 500px) {
  .project-settings-cards .studio-chat-search { margin: 0 16px 12px; }
}
