* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: system-ui, -apple-system, "Segoe UI", "Microsoft YaHei", sans-serif; background: #f4f6f9; color: #1f2933; font-size: 14px; }
:root {
  /* 每个页面顶部留白的唯一真源＝.main 上内边距（2026-10-28 由 28px 统一减半为 14px）。
     钉顶条吃回的量、条内上内边距，全部由它推导，禁止再各处写死同一个数 */
  --pad-top: 14px;
  --c-app: #2563eb; --c-app-bg: #e4ecf7;      /* APP 后台 = 蓝 */
  --c-tuning: #7c3aed; --c-tuning-bg: #f0e9fb; /* 小年管家调参台 = 紫 */
  --c-tuning2: #ea580c; --c-tuning2-bg: #fdeadd; /* 小年调参台 = 橙（与管家紫拉开辨识） */
  --c-site: #0d9488; --c-site-bg: #dcf2ef;     /* 网站后台 = 绿 */
}
.hidden { display: none !important; }
.muted { color: #7b8794; font-size: 12px; }
.error { color: #c0392b; font-size: 13px; }
a { color: #2563eb; text-decoration: none; }
a:hover { text-decoration: underline; }

/* 登录 */
.login-wrap { display: flex; align-items: center; justify-content: center; min-height: 100vh; }
.login-card { background: #fff; padding: 40px 36px; border-radius: 12px; box-shadow: 0 8px 30px rgba(31,41,51,.08); width: 360px; display: flex; flex-direction: column; gap: 14px; }
.login-card h1 { font-size: 20px; }
.login-card label { display: flex; flex-direction: column; gap: 6px; font-size: 13px; color: #52606d; }
.login-card input { padding: 10px 12px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 14px; }
.login-card input:focus { outline: 2px solid #2563eb33; border-color: #2563eb; }
.login-card button { margin-top: 6px; }

/* 布局 */
.app { display: flex; flex-direction: column; height: 100vh; }
.topbar { position: relative; flex: 0 0 56px; display: flex; align-items: center; gap: 26px; background: #1f2933; color: #f5f7fa; padding: 0 22px; }
.brand { font-size: 16px; font-weight: 600; letter-spacing: 1px; white-space: nowrap; }
.top-tabs { position: absolute; left: 50%; top: 0; bottom: 0; transform: translateX(-50%); display: flex; align-items: center; gap: 2px; }
.top-tabs a { display: flex; align-items: center; height: 100%; padding: 0 13px; white-space: nowrap; color: #cbd2d9; font-size: 14px; border-bottom: 3px solid transparent; }
.top-tabs a:hover { background: #323f4b; text-decoration: none; }
.top-tabs a.active { background: #323f4b; color: #fff; font-weight: 600; }
.top-tabs a[data-tab="app"].active { border-bottom-color: var(--c-app); }
.top-tabs a[data-tab="panel"].active { border-bottom-color: var(--c-tuning); }
.top-tabs a[data-tab="panelProject"].active { border-bottom-color: var(--c-tuning2); }
.top-tabs a[data-tab="site"].active { border-bottom-color: var(--c-site); }
.top-tabs a .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; }
.top-tabs a[data-tab="app"] .dot { background: var(--c-app); }
.top-tabs a[data-tab="panel"] .dot { background: var(--c-tuning); }
.top-tabs a[data-tab="panelProject"] .dot { background: var(--c-tuning2); }
.top-tabs a[data-tab="site"] .dot { background: var(--c-site); }
.topbar-right { margin-left: auto; display: flex; align-items: center; gap: 14px; font-size: 12px; }
.topbar-right a { color: #9fb3c8; }
.app-body { flex: 1; display: flex; min-height: 0; }
.sidebar { flex: 0 0 147px; background: #f0f3f7; color: #1f2933; border-right: 1px solid #e4e9f0; padding: 12px 0 20px; overflow-y: auto; }
.side-group { margin-bottom: 8px; }
.sidebar nav { display: flex; flex-direction: column; }
.sidebar nav a { color: #52606d; padding: 12px 12px; font-size: 14px; }
.sidebar nav a:hover { background: #e4e9f0; text-decoration: none; }
.sidebar nav a.active { font-weight: 600; }
#sidebar-app nav a.active { background: var(--c-app-bg); color: var(--c-app); border-right: 3px solid var(--c-app); }
#sidebar-tuning nav a.active { background: var(--c-tuning-bg); color: var(--c-tuning); border-right: 3px solid var(--c-tuning); }
#sidebar-tuning-project nav a.active { background: var(--c-tuning2-bg); color: var(--c-tuning2); border-right: 3px solid var(--c-tuning2); }
#sidebar-site nav a.active { background: var(--c-site-bg); color: var(--c-site); border-right: 3px solid var(--c-site); }
.side-group-title { padding: 9px 10px; margin: 0 8px 8px; font-size: 13px; font-weight: 700; border-radius: 7px; }
.side-group-title.grp-app { color: #fff; background: var(--c-app); }
.side-group-title.grp-tuning { color: #fff; background: var(--c-tuning); }
.side-group-title.grp-tuning-project { color: #fff; background: var(--c-tuning2); }
.side-group-title.grp-site { color: #fff; background: var(--c-site); }
.main { flex: 1; min-width: 0; padding: var(--pad-top) 32px; overflow-y: auto; }
.frame-host { flex: 1; min-width: 0; background: #fff; }
.frame-host .embed { display: none; width: 100%; height: 100%; border: 0; }
.frame-host .embed.shown { display: block; }
.panel h2 { font-size: 18px; margin-bottom: 14px; }
.panel h3 { font-size: 15px; margin: 12px 0; }
.panel h3.block-title { font-size: 17px; margin: 30px 0 12px; padding-top: 22px; border-top: 1px solid #e3e9ef; }
.panel h3.block-title:first-of-type { margin-top: 18px; padding-top: 0; border-top: none; }

/* 增长权益：左右两栏（左免费额度券、右邀请满减），两栏等宽、中缝一条竖线；窄屏自动堆叠 */
.growth-columns { display: flex; flex-direction: row; align-items: flex-start; }
.growth-col { flex: 1 1 0; min-width: 0; padding: 0 28px; }
.growth-col:first-child { padding-left: 0; }
.growth-col:last-child { padding-right: 0; border-left: 1px solid #e3e9ef; }
.growth-col .panel-form.wide { max-width: none; }
/* 两栏的小节标题冻结：滚到下面也认得出自己在看哪一块；底色挡住下方滚过的内容 */
.growth-col .block-title { position: sticky; top: var(--pin-top, calc(-1 * var(--pad-top))); z-index: 4; background: #f4f6f9; }
/* 每组参数均分一行，输入框固定窄宽并允许换行，避免被 min-width:180px 撑出卡片 */
.growth-col .panel-form .row { flex-wrap: wrap; }
.growth-col .panel-form .row > label { flex: 1 1 0; min-width: 0; }
.growth-col .panel-form .row > label input[type=number] { min-width: 0; width: 88px; box-sizing: border-box; }
.growth-col .panel-form .row > label input[type=date] { min-width: 0; width: 128px; box-sizing: border-box; }
/* 左栏保存动作贴右下：按钮在右、说明在左可换行，按钮略收小 */
.growth-col .row-actions { display: flex; flex-direction: row-reverse; align-items: center; gap: 12px; white-space: normal; margin-top: 14px; }
.growth-col .row-actions button { flex: 0 0 auto; padding: 6px 16px; }
.growth-col .row-actions .muted { flex: 1 1 auto; }
@media (max-width: 1280px) {
  .growth-columns { flex-direction: column; }
  .growth-col { padding: 0; }
  .growth-col:last-child { border-left: none; }
}

/* 表格 */
/* ⚠️ 这里禁止写 overflow: hidden——那会把 thead 的 sticky 关在表格自己的盒子里、表头粘不住（圆角改由表头首末格收） */
.table { width: 100%; border-collapse: collapse; background: #fff; border-radius: 10px; box-shadow: 0 1px 4px rgba(31,41,51,.06); }
.table th, .table td { text-align: left; padding: 10px 14px; border-bottom: 1px solid #eef1f4; font-size: 13px; }
.table th { background: #f8fafc; color: #52606d; font-weight: 600; }
.table tr:last-child td { border-bottom: none; }
/* 全后台表格：表头冻结（像 Excel），内容再多也不会把表头翻走。
   top 取 -var(--pad-top) 是为了抵掉 .main 的上内边距，否则表头上方会留一条缝、行从缝里露出来（与 .panel-pin / .agents-sticky 同一口径）。
   border-collapse 下 th 自己的 border-bottom 不跟着 sticky 走，故设为透明、改用 box-shadow 画那根线 */
.table thead th { position: sticky; top: var(--pin-top, calc(-1 * var(--pad-top))); z-index: 3; border-bottom-color: transparent; box-shadow: 0 1px 0 #eef1f4; }
.table thead th:first-child { border-top-left-radius: 10px; }
.table thead th:last-child { border-top-right-radius: 10px; }
/* 这两类表本来就没有圆角，表头格子别替它补 */
.agent-task-table thead th:first-child, .agent-task-table thead th:last-child,
#vision-table thead th:first-child, #vision-table thead th:last-child, .vision-table-shared thead th:first-child, .vision-table-shared thead th:last-child { border-radius: 0; }
/* 这四页顶部本来就有一条冻结的置顶条，表头按 -var(--pad-top) 冻会整条钻进去看不见；
   偏移＝实测置顶条的内容高度（钉顶条自己吃回又还回去的那段上内边距不计，故与 --pad-top 无关）：
   一行页签条实测 47；报价条因后来把说明卡也并进了钉顶条，这一格仍按旧的 47 留原样未跟改 */
/* reviews 已改成两条钉顶条堆叠（页签行＋当前页签的说明段与筛选行），偏移必须跟着实测累加值走，
   写死 47 会把表头压进第二条底下；界面配置那页仍是单条页签行，保持 47 不动 */
#panel-content .table thead th { top: 47px; }
#panel-agents .table thead th { top: 47px; }
#panel-documentary .table thead th { top: 47px; }

/* 表单与按钮 */
label { display: block; margin-bottom: 12px; font-size: 13px; color: #52606d; }
input[type=text], input[type=password], textarea { width: 100%; max-width: 640px; padding: 9px 11px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 13px; font-family: inherit; }
textarea { font-family: ui-monospace, Consolas, monospace; max-width: 860px; }
button { padding: 8px 18px; border: 1px solid #cbd2d9; background: #fff; border-radius: 8px; cursor: pointer; font-size: 13px; }
button:hover { background: #f8fafc; }
button.primary { background: #2563eb; border-color: #2563eb; color: #fff; }
button.primary:hover { background: #1d4ed8; }
button.link { border: none; background: none; color: #2563eb; padding: 0; }
button:disabled { opacity: .5; cursor: not-allowed; }
.row { display: flex; gap: 10px; align-items: center; margin-top: 14px; }
/* 页面第一行就是工具行时，这 14px 与 .main 的上内边距叠成两条缝——顶部留白只认 --pad-top 一处 */
.panel > .row:first-child { margin-top: 0; }
.badge { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 12px; }
.badge.ok { background: #def7ec; color: #046c4e; }
.badge.off { background: #fde8e8; color: #c81e1e; }
.badge.mid { background: #e1effe; color: #1e429f; }

/* 智能体工作台 */
.panel-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 12px; }
.panel-head h2 { margin-bottom: 0; }
.panel-head-tools { display: flex; align-items: center; gap: 10px; padding-top: 2px; }
.panel-head-tools .muted { white-space: nowrap; }
.agents-sticky { position: sticky; top: calc(-1 * var(--pad-top)); z-index: 30; background: #f4f6f9; margin: calc(-1 * var(--pad-top)) -32px 0; padding: var(--pad-top) 32px 0; }
.agents-sticky .agent-tabs { margin: 0; }
.run-pre { background: #0f172a; color: #d7e3f4; border-radius: 10px; padding: 14px 16px; font-size: 12px; line-height: 1.7; white-space: pre-wrap; word-break: break-word; max-height: 460px; overflow: auto; max-width: 100%; }
#agents-runs-table td { vertical-align: top; }
#agents-runs-table td:nth-child(6), #agents-runs-table td:nth-child(7) { max-width: 260px; }
.stat-card.clickable { cursor: pointer; border: 1px solid transparent; }
.stat-card.clickable:hover { border-color: #9db8e8; }
.stat-card.clickable.is-active { border-color: #2563eb; box-shadow: 0 0 0 2px rgba(37,99,235,.14); }
.organizer-filter-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 4px 0 8px; padding: 8px 12px; background: #e4ecf7; border-radius: 8px; font-size: 13px; color: #1e429f; }
.organizer-filter-bar button.link { font-size: 13px; }
.organizer-report-view { background: #fff; border: 1px solid #e4e9f0; border-radius: 10px; padding: 16px 20px; }
.organizer-report-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 8px; }
.organizer-report-title { font-size: 16px; font-weight: 600; }
.organizer-report-meta { font-size: 12px; color: #52606d; margin-top: 4px; }
.organizer-report-nav { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.organizer-report-nav .muted { font-size: 12px; }
.organizer-report-part { margin: 14px 0 6px; font-size: 13px; font-weight: 600; color: #52606d; }
.organizer-report-body { white-space: pre-wrap; word-break: break-word; font-family: inherit; font-size: 13px; line-height: 1.9; color: #1f2933; background: #f8fafc; border-radius: 8px; padding: 12px 14px; margin: 0; max-height: 46vh; overflow: auto; }
.organizer-review-banner { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin: 10px 0 4px; padding: 10px 14px; background: #fdf1dc; border-radius: 8px; }
.organizer-review-text { display: flex; flex-direction: column; gap: 4px; }
.organizer-review-text strong { font-size: 13px; color: #b45309; }
.organizer-review-text span { font-size: 12px; color: #8a5a1a; }
.agent-tab-panel .agent-sub-title { margin: 0 0 8px; font-size: 15px; }
.agent-overview-head { margin-top: 18px; }

/* 素材审核台 */
.inline-label { display: flex; align-items: center; gap: 8px; margin-bottom: 0; }
.inline-label select { padding: 7px 10px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 13px; background: #fff; }
#reviews-table tbody tr { cursor: pointer; }
#reviews-table td { vertical-align: top; }

/* 素材初审的审核单改成浮窗（2026-10-29 用户裁决）：待审一多，内联展开会把整张列表挤到屏幕外。
   宽度 1900px、窄屏由 max-width:100% 自动收到遮罩内（2026-10-29 用户「再宽一点」：1680 → 1900），
   始终比全屏窄一圈，靠遮罩与圆角把层级分开；高度按遮罩内边距卡满，内容在浮窗里滚。
   层级排在图片 / 视频 / 文件预览层（100 / 110 / 115）之下、页面内容之上；后台确认弹窗（140）仍在它上面，
   点「通过」弹出的二次确认不会被浮窗挡住。 */
.review-modal-overlay { position: fixed; inset: 0; z-index: 90; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(15,23,42,.55); }
.review-modal-panel { display: flex; flex-direction: column; width: 1900px; max-width: 100%; max-height: 100%; background: #fff; border-radius: 12px; box-shadow: 0 18px 60px rgba(15,23,42,.32); overflow: hidden; }
.review-modal-head { flex: 0 0 auto; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 20px; background: #f8fafc; border-bottom: 1px solid #e4e9f0; }
.review-modal-head h3 { margin: 0; font-size: 16px; font-weight: 700; color: #1f2933; }
.review-modal-close { flex: 0 0 auto; display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 0; font-size: 22px; line-height: 1; color: #52606d; background: #fff; border-radius: 50%; }
.review-modal-close:hover { background: #e8edf4; color: #b91c1c; }
.review-modal-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 14px 20px 18px; }
/* 浮窗里只有一层滚动容器：表头按浮窗滚动区吸顶，别再吃页面上那两条钉顶条的偏移 */
.review-modal-body .table thead th { top: 0; }
.review-modal-body .vision-table-scroll { max-height: none; overflow: visible; box-shadow: none; }
.review-modal-body #review-detail-meta { margin-top: 0; }
.review-modal-foot { flex: 0 0 auto; padding: 10px 20px 12px; background: #fbfcfe; border-top: 1px solid #e4e9f0; }
.review-modal-foot .panel-form.wide { max-width: none; margin: 0; padding: 0; background: none; box-shadow: none; }
.review-modal-foot label { margin-bottom: 0; }
.review-modal-foot textarea { max-width: none; }
.review-modal-foot .row { margin-top: 8px; flex-wrap: wrap; }
/* 打开浮窗时锁住背后列表页的滚动：跟着 .hidden 走，切页签 / 切侧栏把浮窗一起藏起来时自动解锁 */
body:has(#review-detail-modal:not(.hidden)) .main { overflow: hidden; }
.flag-badge { display: inline-block; padding: 2px 8px; border-radius: 6px; font-size: 12px; font-weight: 600; }
.flag-badge.L1 { background: #fff1c2; color: #8a5a00; }
.flag-badge.L2 { background: #fbe3e4; color: #c81e1e; }
.flag-badge.L3 { background: #e3edfd; color: #1a49b8; }
.flag-count-cell { text-align: center; white-space: nowrap; width: 58px; }
.flag-count-cell .flag-badge { min-width: 24px; text-align: center; }
.audit-rules { margin: 10px 0 14px; border: 1px solid #e3e8ef; border-radius: 10px; background: #fbfcfe; }
.audit-rules-toggle { width: 100%; text-align: left; padding: 10px 14px; background: none; border: 0; font-size: 13px; font-weight: 600; color: #1f2d3d; cursor: pointer; display: flex; justify-content: space-between; align-items: center; gap: 10px; font-family: inherit; }
.audit-rules-arrow { font-weight: 400; color: #52606d; font-size: 12px; }
.audit-rules-body { padding: 0 14px 14px; }
.audit-rules-guide { white-space: pre-wrap; font-size: 12.5px; line-height: 1.75; color: #33415c; background: #fff; border-radius: 8px; padding: 10px 12px; }
.audit-rules-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-top: 10px; }
.audit-rule-card { border-radius: 8px; padding: 10px 12px; font-size: 12px; line-height: 1.6; }
.audit-rule-card strong { display: block; margin-bottom: 4px; font-size: 12.5px; }
.audit-rule-card p { margin: 0; }
.audit-rule-card.L1 { background: #fff6d6; border: 1px solid #f0d48a; }
.audit-rule-card.L2 { background: #fde4e4; border: 1px solid #efb3b3; }
.audit-rule-card.L3 { background: #e3eeff; border: 1px solid #b7cff2; }
.audit-rules-field { display: block; margin-top: 10px; font-size: 12px; color: #33415c; }
.audit-rules-field > span { display: block; margin-bottom: 4px; font-weight: 600; }
.audit-rules-field textarea { width: 100%; box-sizing: border-box; font-size: 12px; line-height: 1.6; padding: 8px 10px; border: 1px solid #d7dee8; border-radius: 8px; font-family: inherit; }
@media (max-width: 1100px) { .audit-rules-grid { grid-template-columns: 1fr; } }

.audit-mark { border-radius: 3px; padding: 0 2px; color: #000; }
.audit-mark.audit-L1 { background: #ffe066; box-shadow: inset 0 -2px 0 #d99a00; }
.audit-mark.audit-L2 { background: #ffb0b0; box-shadow: inset 0 -2px 0 #c81e1e; }
.audit-mark.audit-L3 { background: #a9cdff; box-shadow: inset 0 -2px 0 #1a49b8; }
.audit-mark.audit-emphasis { outline: 1px solid #c81e1e; outline-offset: 1px; }
.audit-legend { display: inline-flex; gap: 10px; flex-wrap: wrap; align-items: center; font-size: 12px; color: #52606d; }
.audit-legend > span { display: inline-flex; align-items: center; gap: 4px; }
.audit-dot { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
.audit-dot.L1 { background: #f2c94c; }
.audit-dot.L2 { background: #d64545; }
.audit-dot.L3 { background: #4a7fe0; }
.track-cols { display: flex; gap: 16px; align-items: flex-start; }
.track-cols > div { flex: 1; min-width: 0; }
.track-cols h4 { font-size: 13px; color: #52606d; margin: 10px 0 6px; font-weight: 600; }
.panel-form.wide { max-width: 860px; }
#review-flags-table td { vertical-align: top; }
#review-flags-table td:nth-child(3), #review-flags-table td:nth-child(4) { max-width: 300px; }

/* 成品终审（2026-10-27） */
.alert-banner.alert-warn { background: #fff8e6; border-color: #f0d199; color: #7a4b00; }
.final-check-group { margin: 14px 0 6px; font-size: 13px; font-weight: 600; color: #1f2933; }
.final-check-item { display: flex; align-items: flex-start; gap: 10px; padding: 8px 12px; background: #fff; border: 1px solid #e4e9f0; border-radius: 8px; margin-bottom: 6px; cursor: pointer; font-size: 13px; line-height: 1.6; }
.final-check-item input { margin-top: 3px; flex: none; }
.final-check-hint { color: #7b8794; font-size: 12px; }
.final-deliverable { background: #fff; border: 1px solid #e4e9f0; border-radius: 10px; padding: 14px 16px; margin-bottom: 12px; }
.final-deliverable-head { display: flex; flex-wrap: wrap; gap: 10px; align-items: baseline; margin-bottom: 10px; }
.final-deliverable-no { font-family: Consolas, Menlo, monospace; background: #eef2ff; color: #3730a3; padding: 1px 8px; border-radius: 4px; font-size: 12px; }
.final-kind-badge { display: inline-block; padding: 1px 8px; border-radius: 10px; background: #f1f5f9; color: #334155; font-size: 12px; white-space: nowrap; }
/* 中修 / 重修这类人工修复件：红底提醒审核员「这件是人工修的，要下载下来自己过一遍」 */
.final-manual-badge { display: inline-block; padding: 1px 8px; border-radius: 10px; background: #fef2f2; color: #b91c1c; border: 1px solid #fecaca; font-size: 12px; white-space: nowrap; }
/* 修复成品对比：原片与成品同尺寸并排，一眼看出修前修后 */
.repair-thumb { width: 132px; height: 96px; object-fit: cover; border-radius: 6px; border: 1px solid #e4e9f0; display: block; background: #f8fafc; }
.repair-status-succeeded { color: #15803d; }
.repair-status-running, .repair-status-pending { color: #b45309; }
.repair-status-failed, .repair-status-canceled { color: #b91c1c; }
/* 交付成品：点开一笔后在同页下方铺开，页签沿用全站那套 .agent-tab */
#delivery-detail { margin-top: 18px; padding-top: 14px; border-top: 1px dashed #cbd5e1; }
#delivery-doors { margin: 12px 0 10px; }
#delivery-door-body h4 { margin: 16px 0 6px; font-size: 14px; color: #1f2937; }
#delivery-download-bar { margin: 8px 0 4px; }
.final-deliverable-meta { color: #7b8794; font-size: 12px; }
.final-deliverable-note { color: #b45309; font-size: 12px; margin-top: 8px; }
#final-reviews-table td:nth-child(5) { max-width: 260px; }
#final-review-flags-table td { vertical-align: top; }
#final-review-flags-table td:nth-child(3), #final-review-flags-table td:nth-child(4) { max-width: 300px; }

/* 界面配置：首页这一屏的七块改成顶部一排二级按钮（2026-10-29 用户裁决"不要竖向排，不好点"）。
   容器 #content-list 在 index.html 上静态挂 .panel-pin，吸顶偏移一律由 syncPinOffsets 实测累加，
   这里不再写死第几层该往下挪多少像素。按钮两行：上行短名、下行发布状态（原卡片右侧那颗徽章搬进来）。
   七等分下最长的「首页服务价目表」七字要装得下：字号按容器宽度自动缩放、窄屏省略号兜底，
   禁把按钮压破版（口径照同页已有的 .archive-template-tabs） */
#content-list.content-block-tabs { container-type: inline-size; gap: 8px; padding-bottom: 12px; }
/* 说明文字已去掉（2026-10-30 用户要求）：上面一级页签行内部按钮那条 10px 下外边距会折出来，
   与这里的 -var(--pad-top) 相加成 -4px，二级那排的底色就会压住一级按钮底部 4px；
   换成 -10px 后折叠结果归零，静止时严丝合缝贴在上一排底边，和吸顶后的位置完全一样（滚动不跳） */
#content-tab-copy > #content-list { margin-top: -10px; }
/* 这颗按钮里是两行（名字＋已发布 vN），不能再吃 .agent-tab 那条 47px 死高：
   固定 47 会把两行压到 13px 高，配上 overflow:hidden 就是「字被上下切掉一半」（2026-10-30 用户截图）。改成自适应高、最低 47 与一级页签同高。 */
#content-list.content-block-tabs .content-page-btn { flex: 1 1 0; min-width: 0; height: auto; min-height: 47px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; padding: 8px 4px; line-height: 1.2; }
#content-list.content-block-tabs .block-tab-name { max-width: 100%; font-size: clamp(12px, 0.95cqw, 16px); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#content-list.content-block-tabs .block-tab-state { font-size: 11px; font-weight: 500; color: #046c4e; }
#content-list.content-block-tabs .block-tab-state.is-off { color: #c81e1e; }
/* 选中那颗是蓝底白字，绿色状态压在上面看不清，一律转成半透明白 */
#content-list.content-block-tabs .content-page-btn.primary .block-tab-state { color: rgba(255, 255, 255, .86); }

/* toast */
.toast { position: fixed; bottom: 28px; left: 50%; transform: translateX(-50%); background: #1f2933; color: #fff; padding: 10px 22px; border-radius: 8px; font-size: 13px; box-shadow: 0 6px 20px rgba(0,0,0,.25); }

/* 人生档案模板可视化编辑器 */
select { width: 100%; max-width: 640px; padding: 9px 11px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 13px; font-family: inherit; background: #fff; }
.archive-category { background: #fff; border: 1px solid #e4e9f0; border-radius: 10px; padding: 14px 16px; margin: 12px 0; box-shadow: 0 1px 4px rgba(31,41,51,.05); }
.archive-category-head { display: flex; gap: 10px; align-items: center; margin-bottom: 10px; }
.archive-category-head input[type=text] { max-width: 260px; }
.archive-icon-input { max-width: 90px !important; width: 90px !important; }
.archive-item { border-top: 1px dashed #e4e9f0; padding-top: 10px; margin-top: 10px; }
.archive-item label { margin-bottom: 8px; }
.archive-project { border: 1px dashed #c9d4e2; border-radius: 10px; padding: 12px 14px; margin: 14px 0; background: #f7fafd; }
.archive-project-head { display: flex; gap: 10px; align-items: center; }
.archive-editor h3 { margin: 18px 0 6px; font-size: 15px; }

/* 首页服务价目表编辑器 */
.service-tabs { display: flex; flex-wrap: wrap; gap: 8px; margin: 10px 0 14px; }
.service-tab { background: #fff; border: 1px solid #cbd2d9; color: #1f2933; padding: 8px 16px; border-radius: 999px; font-size: 13px; cursor: pointer; }
.service-tab:hover { border-color: #2563eb; color: #2563eb; }
.service-tab-active { background: #2563eb; border-color: #2563eb; color: #fff; }
.service-entry { background: #fff; border: 1px solid #e4e9f0; border-radius: 10px; padding: 14px 16px; margin: 0 0 12px; box-shadow: 0 1px 4px rgba(31,41,51,.05); }
.service-entry-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px; }
.service-entry-id { font-size: 12px; color: #52606d; background: #eef1f4; border-radius: 6px; padding: 3px 8px; font-family: Consolas, Menlo, monospace; }
.service-entry-toggle { display: inline-flex; align-items: center; gap: 6px; margin-bottom: 0; font-size: 13px; color: #1f2933; }
.service-entry-toggle input { width: auto; }
.service-entry label { margin-bottom: 8px; }
.service-entry textarea { width: 100%; max-width: 700px; padding: 9px 11px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 13px; font-family: inherit; line-height: 1.7; resize: vertical; }
/* 一行两列：屏幕很宽时单列要上下翻很久；每列最小约 480px，窄于 1280 退回一列 */
.service-list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0 16px; align-items: start; }
.service-list .service-entry input[type=text], .service-list .service-entry textarea { max-width: none; }
@media (max-width: 1500px) { .service-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 1050px) { .service-list { grid-template-columns: minmax(0, 1fr); } }
/* 价目表每项的样品素材：左边画现在长啥样，右边一颗「更换」＋规格说明 */
.service-sample { margin-top: 10px; padding-top: 10px; border-top: 1px dashed #e4e9f0; }
.service-sample-title { font-size: 12px; font-weight: 600; color: #334155; margin-bottom: 8px; }
.service-sample-body { display: flex; align-items: flex-start; gap: 12px; }
.service-sample-preview { flex: none; width: 200px; height: 113px; background: #0f172a; border-radius: 8px; overflow: hidden; display: flex; align-items: center; justify-content: center; }
.service-sample-preview.service-sample-empty { background: #f1f5f9; border: 1px dashed #cbd2d9; color: #64748b; font-size: 12px; line-height: 1.5; text-align: center; padding: 8px; box-sizing: border-box; }
.service-sample-media { width: 100%; height: 100%; object-fit: contain; display: block; }
.service-sample-audio { background: #f8fafc; border: 1px solid #e2e8f0; padding: 0 6px; }
.service-sample-audio .service-sample-media { height: 40px; object-fit: initial; }
.service-sample-side { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.service-sample-meta { margin: 0; font-size: 12px; color: #1f2933; line-height: 1.6; word-break: break-all; }
.service-sample-spec { margin: 0; font-size: 12px; color: #7b8794; line-height: 1.6; }
.service-sample-pick { align-self: flex-start; margin: 0; padding: 6px 16px; border: 1px solid #2563eb; border-radius: 8px; background: #fff; color: #2563eb; font-size: 13px; cursor: pointer; }
.service-sample-pick:hover { background: #eff6ff; }
.service-sample-pick:disabled { border-color: #cbd2d9; color: #94a3b8; cursor: not-allowed; background: #f8fafc; }
.archive-editor button.link { margin-top: 6px; margin-right: 16px; }
.archive-editor > button { margin-top: 12px; }

/* 密码可见性切换 */
.pw-wrap { position: relative; display: block; }
.pw-wrap input { padding-right: 76px; }
.pw-eye { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); margin-top: 0; padding: 4px 8px; border: none; background: none; color: #2563eb; font-size: 12px; cursor: pointer; }
.pw-eye:hover { background: none; text-decoration: underline; }
.pw-eye:disabled { color: #7b8794; cursor: not-allowed; text-decoration: none; }
.card-foot { text-align: right; font-size: 12px; }
.panel-form { background: #fff; border-radius: 10px; padding: 18px 20px; max-width: 460px; margin-top: 12px; box-shadow: 0 1px 4px rgba(31,41,51,.06); }

.inline-label { white-space: nowrap; }
/* 作品进度 */
.progress-cell { display: inline-flex; align-items: center; gap: 8px; }
.progress-bar { display: inline-block; width: 110px; height: 10px; background: #eef1f4; border-radius: 5px; overflow: hidden; }
.progress-bar i { display: block; height: 100%; background: #1e429f; border-radius: 5px; }
.progress-bar.high i { background: #046c4e; }
.progress-bar.low i { background: #b45309; }
.progress-value { font-size: 12px; color: #323f4b; min-width: 36px; }
#progress-table td { vertical-align: middle; }

/* 运营分析 */
.trend-list { background: #fff; border-radius: 10px; padding: 14px 16px; margin-top: 10px; box-shadow: 0 1px 4px rgba(31,41,51,.06); }
.trend-row { display: flex; align-items: center; gap: 10px; margin: 6px 0; font-size: 12px; }
.trend-date { width: 90px; color: #52606d; flex: none; }
.trend-bar { flex: 1; height: 12px; background: #eef1f4; border-radius: 6px; overflow: hidden; }
.trend-bar i { display: block; height: 100%; background: #1e429f; border-radius: 6px; }
.trend-count { width: 60px; text-align: right; color: #323f4b; flex: none; }
#analytics-reports-table tbody tr { cursor: pointer; }
#analytics-reports-table td { vertical-align: top; }

.inline-label input { padding: 7px 10px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 13px; background: #fff; min-width: 180px; }

/* 任务分发器 */
.nav-badge { display: inline-block; min-width: 18px; height: 18px; line-height: 18px; padding: 0 5px; margin-left: 6px; border-radius: 9px; background: #c81e1e; color: #fff; font-size: 11px; text-align: center; vertical-align: middle; }
.alert-banner { background: #fdecec; border: 1px solid #f3c2c2; color: #8a1f1f; border-radius: 10px; padding: 12px 14px; margin: 10px 0 4px; font-size: 13px; display: flex; flex-direction: column; gap: 6px; }
.alert-banner strong { font-size: 14px; }
.stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; margin: 8px 0; }
/* 安全中心：沿用既有表与页签样式，这里只补两条布局（不改任何既有板块外观） */
.sec-sub { margin: 18px 0 8px; font-size: 15px; }
#sec-cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin: 10px 0 4px; }
/* 纪录片栏里「单价由别的门面下发」的那几格：改不动（2026-11-02 用户裁决） */
input.fq-inherited { background: #f4f6f9; color: #52606d; cursor: not-allowed; }
/* /sec-css-anchor */
.stat-card { background: #fff; border-radius: 10px; padding: 12px 14px; box-shadow: 0 1px 4px rgba(31,41,51,.06); display: flex; flex-direction: column; gap: 4px; }
.stat-card strong { font-size: 22px; color: #1f2933; }
.stat-card span { font-size: 12px; color: #616e7c; }
.stat-card.ok strong { color: #046c4e; }
.stat-card.off strong { color: #b42318; }
.row-actions { white-space: nowrap; }
.row-actions button.link { margin-right: 8px; }
.row-actions button.link:last-child { margin-right: 0; }
#dispatch-rules-table td { vertical-align: middle; }
#dispatch-rules-table input[type="text"] { width: 100%; min-width: 110px; padding: 6px 8px; border: 1px solid #cbd2d9; border-radius: 6px; font-size: 13px; }
#dispatch-rules-table select { padding: 6px 8px; border: 1px solid #cbd2d9; border-radius: 6px; font-size: 13px; background: #fff; }
#events-table td:last-child { white-space: nowrap; }
.badge { white-space: nowrap; }
/* 派发记录：结果列的长文本不参与列宽计算，否则会把整张表撑出屏幕、其余列被压成"一个字一行" */
#events-table { table-layout: fixed; min-width: 100%; }
/* ⚠️ 表头必须保持 sticky：写成 relative 会把 .table thead th 的 sticky 顶掉，
   而它的 top 吃的是本屏钉顶条实测高度（这一屏 352px），表头就被整条推到表格中间去了（2026-10-31 用户反馈）。
   sticky 同样是绝对定位子元素（.col-grip 拖列宽把手）的包含块，把手照旧能拖。 */
#events-table th { white-space: nowrap; position: sticky; }
#events-table td { vertical-align: middle; padding: 16px 16px; }
#events-table th:nth-child(1), #events-table td:nth-child(1) { width: 150px; }
#events-table th:nth-child(2), #events-table td:nth-child(2) { width: 180px; }
#events-table th:nth-child(3), #events-table td:nth-child(3) { width: 168px; }
#events-table th:nth-child(4), #events-table td:nth-child(4) { width: 104px; }
#events-table th:nth-child(5), #events-table td:nth-child(5) { width: 112px; }
#events-table th:nth-child(6), #events-table td:nth-child(6) { width: 64px; }
#events-table th:nth-child(8), #events-table td:nth-child(8) { width: 140px; }
/* 日期、作品、这次派给谁、状态、尝试一律锁一行；来源允许折成两行 */
#events-table td:nth-child(1), #events-table td:nth-child(2), #events-table td:nth-child(3),
#events-table td:nth-child(4), #events-table td:nth-child(6) { white-space: nowrap; }
#events-table td:nth-child(2), #events-table td.event-who > div { overflow: hidden; text-overflow: ellipsis; }
/* 列分界线：按住左右拖就能改这一列宽度，宽度记在浏览器里，下次进来还在 */
/* ⚠️ 这里不能再写 overflow-x: auto——那会让包裹层自己变成滚动容器，表头 sticky 就贴着它（没有高度限制）等于没固定 */
.table-scroll { overflow: visible; }
#events-table th { border-right: 1px solid #dce4ee; }
#events-table th:last-child { border-right: none; }
#events-table .col-grip { position: absolute; top: 0; right: -5px; width: 11px; height: 100%; cursor: col-resize; z-index: 3; }
#events-table .col-grip::before, #events-table .col-grip::after { content: ''; position: absolute; top: 50%; margin-top: -9px; width: 1px; height: 18px; background: #9fb0c2; }
#events-table .col-grip::before { left: 4px; }
#events-table .col-grip::after { left: 6px; }
#events-table .col-grip:hover, #events-table .col-grip.dragging { background: #2563eb; }
#events-table .col-grip:hover::before, #events-table .col-grip:hover::after,
#events-table .col-grip.dragging::before, #events-table .col-grip.dragging::after { background: #fff; }
/* 结果列：一行装不下就接着往下排，最多四行，行距放宽；点这一行看全文 */
#events-table .event-result { line-height: 2.1; word-break: break-word; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; overflow: hidden; }

/* 派发事件详情：全屏铺开，正文滚到底也能看完；再点这一行、点遮罩、按 Esc 都收回 */
#event-detail { position: fixed; inset: 0; z-index: 80; background: rgba(15,23,42,.68); padding: 32px; display: flex; }
.event-detail-card { flex: 1; min-height: 0; display: flex; flex-direction: column; background: #0f172a; border-radius: 12px; overflow: hidden; box-shadow: 0 18px 60px rgba(0,0,0,.45); }
.event-detail-head { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 14px 20px; border-bottom: 1px solid #24344f; flex: none; }
.event-detail-head h3 { margin: 0; font-size: 15px; color: #e6edf7; }
.event-detail-head button.link { color: #93c5fd; font-size: 14px; white-space: nowrap; }
#event-detail-body { flex: 1; min-height: 0; max-height: none; border-radius: 0; padding: 18px 20px; font-size: 13px; line-height: 1.95; }

/* 识别核对：照片 / 语音 / 视频 / 文件 */
.media-preview { display: flex; flex-direction: column; gap: 6px; align-items: flex-start; min-width: 0; }
.media-thumb-button { display: block; width: 140px; padding: 0; border: 0; border-radius: 6px; background: transparent; cursor: zoom-in; overflow: hidden; }
.media-thumb-button:focus-visible { outline: 3px solid #2563eb; outline-offset: 2px; }
.media-thumb-button:hover { background: transparent; }
.media-thumb { width: 140px; max-height: 190px; object-fit: contain; display: block; }
.media-audio { width: 260px; max-width: 100%; }
.media-video { width: 240px; max-height: 180px; background: #000; border-radius: 6px; }
/* 视频缩略卡片：点一下就全屏播放，中央给一个播放标记（不再用原生 controls，三个点菜单去不掉） */
.media-video-box { position: relative; width: 100%; max-width: 240px; border-radius: 6px; overflow: hidden; background: #000; cursor: pointer; }
.media-video-box .media-video { display: block; width: 100%; max-height: 180px; border-radius: 0; }
.media-video-playmark { position: absolute; left: 50%; top: 50%; width: 34px; height: 34px; margin: -17px 0 0 -17px; border-radius: 50%; background: rgba(15,23,42,.6); color: #fff; font-size: 15px; line-height: 34px; text-align: center; pointer-events: none; }
.media-video-box:hover .media-video-playmark { background: rgba(37,99,235,.92); }
/* 视频时长角标：只有浏览器真读到 duration 才显示（H.265 在 Chrome 内核读不到就整块不出，不写死 00:00） */
.media-video-duration { position: absolute; right: 6px; bottom: 6px; padding: 1px 6px; border-radius: 4px; background: rgba(15,23,42,.72); color: #fff; font-size: 11px; line-height: 16px; font-variant-numeric: tabular-nums; pointer-events: none; }
/* 视频全屏舞台：视频contain铺满可视区，控制条常显在画面下方 */
.vision-video-overlay { position: fixed; inset: 0; z-index: 110; display: flex; align-items: center; justify-content: center; padding: 26px 24px 22px; background: rgba(15,23,42,.92); }
.vision-video-frame { display: flex; flex-direction: column; align-items: center; gap: 10px; width: min(1280px, calc(100vw - 48px)); }
#vision-video-player { display: block; width: 100%; max-height: calc(100vh - 170px); object-fit: contain; background: #000; border-radius: 8px; cursor: zoom-out; }
.vision-video-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 10px; width: 100%; padding: 8px 10px; border-radius: 8px; background: rgba(15,23,42,.78); }
.vision-video-seek { flex: 0 1 420px; min-width: 160px; height: 24px; cursor: pointer; accent-color: #2563eb; }
.vision-video-time { flex: 0 0 auto; color: #e5e7eb; font-size: 13px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.vision-video-btn { flex: 0 0 auto; padding: 7px 15px; border: 1px solid rgba(255,255,255,.32); border-radius: 6px; background: rgba(15,23,42,.6); color: #fff; font-size: 14px; line-height: 1.2; cursor: pointer; }
.vision-video-btn:hover { background: #2563eb; }
.vision-video-btn:focus-visible { outline: 3px solid #93c5fd; outline-offset: 2px; }
.vision-video-hint { color: #cbd5e1; font-size: 13px; line-height: 1.5; text-align: center; }
/* 右键菜单：缩略态与全屏态共用，跟着鼠标出 */
.vision-video-menu { position: fixed; z-index: 120; min-width: 132px; padding: 6px; border-radius: 8px; background: #fff; box-shadow: 0 12px 34px rgba(15,23,42,.3); }
.vision-video-menu-item { display: block; width: 100%; padding: 9px 14px; border: 0; border-radius: 6px; background: transparent; color: #1f2933; font-size: 14px; text-align: left; cursor: pointer; }
.vision-video-menu-item:hover { background: #eef2ff; }
.vision-video-menu-item:focus-visible { outline: 3px solid #2563eb; outline-offset: -2px; }
/* 语音/音频：自绘紧凑播放条（原生 audio 那三个点里有下载与倍速，改不掉） */
.media-audio-box { display: flex; align-items: center; gap: 6px; width: 100%; max-width: 260px; height: 34px; padding: 0 6px 0 8px; border-radius: 17px; background: #f1f3f5; box-sizing: border-box; }
.media-audio-btn { display: inline-flex; flex: 0 0 auto; align-items: center; justify-content: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: #1f2933; cursor: pointer; }
.media-audio-btn:hover { color: #2563eb; }
.media-audio-seek { flex: 1 1 auto; min-width: 40px; height: 16px; accent-color: #2563eb; cursor: pointer; }
.media-audio-time { flex: 0 0 auto; color: #6b7280; font-size: 11px; line-height: 1; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* 「小年回复」格里的朗读声音：只一个播放图标 + 总长，不摆滑条（列宽 9%，滑条会把回复文字挤没） */
.vision-reply-text { white-space: pre-wrap; overflow-wrap: anywhere; }
.vision-reply-audio { display: flex; align-items: center; gap: 4px; margin-top: 4px; }
.vision-reply-audio-btn { display: inline-flex; flex: 0 0 auto; align-items: center; justify-content: center; width: 20px; height: 20px; padding: 0; border: 1px solid #cbd5e1; border-radius: 50%; background: #fff; color: #2563eb; cursor: pointer; }
.vision-reply-audio-btn:hover { border-color: #2563eb; background: #eff6ff; }
.vision-reply-audio-time { flex: 0 0 auto; color: #6b7280; font-size: 11px; line-height: 1; font-variant-numeric: tabular-nums; }
/* 素材总表把「编号」并进「发送内容」格：审核意见靠编号指认，不能因为并列就丢掉 */
.vision-cell-no { margin-top: 4px; color: #6b7280; font-size: 11px; line-height: 1.4; }
/* 下载图标：蓝色、只占一个图标位，不再用整块文字按钮 */
.media-icon-btn { display: inline-flex; flex: 0 0 auto; align-items: center; justify-content: center; width: 24px; height: 24px; padding: 0; border: 0; border-radius: 6px; background: transparent; color: #2563eb; cursor: pointer; }
.media-icon-btn:hover { background: #e0e7ff; color: #1d4ed8; }
.media-file-box { display: flex; align-items: flex-start; gap: 6px; min-width: 0; }
.media-file-open { flex: 1 1 auto; min-width: 0; padding: 0; border: 0; background: transparent; color: #2563eb; font-size: 13px; line-height: 1.5; text-align: left; text-decoration: underline; word-break: break-all; cursor: pointer; }
.media-file-open:hover { color: #1d4ed8; }
.media-file-name { flex: 1 1 auto; min-width: 0; color: #52606d; font-size: 13px; line-height: 1.5; word-break: break-all; }
/* 照片大图浮层右上角的下载图标（在关闭钮左边） */
.vision-image-download { position: absolute; top: 18px; right: 78px; display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; padding: 0; border: 1px solid rgba(255,255,255,.35); border-radius: 50%; background: rgba(15,23,42,.55); color: #fff; cursor: pointer; }
.vision-image-download:hover { background: rgba(37,99,235,.9); }
.vision-image-download:focus-visible { outline: 3px solid #93c5fd; outline-offset: 2px; }

/* 文件在线查看：铺满可视区，PDF/文本走 iframe、图片走 img */
.vision-file-overlay { position: fixed; inset: 0; z-index: 115; display: flex; align-items: center; justify-content: center; padding: 22px; background: rgba(15,23,42,.9); }
.vision-file-panel { display: flex; flex-direction: column; gap: 10px; width: min(1280px, 100%); height: calc(100vh - 44px); padding: 12px; border-radius: 10px; background: #fff; }
.vision-file-bar { display: flex; align-items: center; gap: 10px; }
.vision-file-title { flex: 1 1 auto; min-width: 0; color: #1f2933; font-size: 14px; line-height: 1.5; word-break: break-all; }
.vision-file-btn { flex: 0 0 auto; padding: 6px 14px; border: 1px solid #cbd5e1; border-radius: 6px; background: #f8fafc; color: #1f2933; font-size: 13px; line-height: 1.4; cursor: pointer; }
.vision-file-btn:hover { background: #eef2ff; border-color: #a5b4fc; }
.vision-file-btn:focus-visible { outline: 3px solid #2563eb; outline-offset: 2px; }
.vision-file-body { flex: 1 1 auto; width: 100%; min-height: 0; border: 1px solid #e6ebf2; border-radius: 8px; background: #f8fafc; }
.vision-file-image { flex: 1 1 auto; width: 100%; min-height: 0; object-fit: contain; border-radius: 8px; background: #f8fafc; }
.vision-file-text { flex: 1 1 auto; min-height: 0; margin: 0; padding: 14px; overflow: auto; border: 1px solid #e6ebf2; border-radius: 8px; background: #f8fafc; color: #1f2933; font-size: 13px; line-height: 1.7; white-space: pre-wrap; word-break: break-word; }
.vision-file-fallback { margin: 0; padding: 18px; color: #52606d; font-size: 14px; line-height: 1.8; }
/* 表头列宽拖动：把手 14px 压在右边界线上，鼠标一进该列表头就显色提示，双击恢复默认 */
#vision-table thead th, .vision-table-shared thead th { position: relative; }
#vision-table thead th:hover, .vision-table-shared thead th:hover { z-index: 5; }
.vision-col-grip { position: absolute; top: 0; right: -5px; z-index: 6; width: 14px; height: 100%; cursor: col-resize; touch-action: none; }
.vision-col-grip::after { content: ''; position: absolute; top: 10%; left: 6px; width: 3px; height: 80%; background: #c3ccd9; border-radius: 2px; }
#vision-table thead th:hover .vision-col-grip::after, .vision-table-shared thead th:hover .vision-col-grip::after { background: #9aa8bd; }
.vision-col-grip:hover::after, .vision-col-grip.dragging::after { background: #2563eb; }
body.vision-col-resizing { cursor: col-resize; user-select: none; }



/* 识别核对：表格自己滚，表头钉在顶部；时间/类型收窄，用户原话优先占宽 */
.vision-table-scroll { max-height: calc(100vh - 278px); overflow: hidden auto; background: #fff; border-radius: 10px; box-shadow: 0 1px 4px rgba(31,41,51,.06); }

/* 小年管家识别校对（2026-10-28 第二次改版·用户裁决）：整张表与「小年识别校对」一模一样——
   列数、列序、列宽全部共用上面那套 .vision-table-shared .vision-col-* 规则，这里不再单独重排。
   原来那 10 条管家专用列宽规则已删：两屏各留一份列宽就是"看着对齐、其实差几像素"的根源。 */

/* 小年管家板块（2026-10-28 第三次改版）：顶部一排按钮切块（直接复用报价表同一套 .agent-tabs / .agent-tab），点开那块全宽铺开，不再两列并排。 */
/* 全宽下不需要横向滚动，但窗口拖窄时两张表仍能横向拖，不许压列宽 */
.plans-table-scroll { overflow-x: auto; }
#vision-table, .vision-table-shared { width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0; border-radius: 0; box-shadow: none; overflow: visible; }
#vision-table th, #vision-table td, .vision-table-shared th, .vision-table-shared td { padding: 9px 10px; vertical-align: top; border-right: 1px solid #e6ebf2; overflow-wrap: anywhere; }
#vision-table th:last-child, #vision-table td:last-child, .vision-table-shared th:last-child, .vision-table-shared td:last-child { border-right: none; }
#vision-table thead th, .vision-table-shared thead th { position: sticky; top: 0; z-index: 4; background: #f8fafc; box-shadow: 0 1px 0 #dce4ee; white-space: nowrap; }
#vision-table .vision-col-time, .vision-table-shared .vision-col-time { width: 6%; }
#vision-table .vision-col-type, .vision-table-shared .vision-col-type { width: 5.5%; }
/* 「用户」＝旧的「发送方」与最右侧那列 uid 合成的一列（2026-10-28）：既要装得下 24 位用户号，又不能把中间三列挤没 */
#vision-table .vision-col-user, .vision-table-shared .vision-col-user { width: 8%; }
#vision-table .vision-col-preview, .vision-table-shared .vision-col-preview { width: 10%; }
#vision-table .vision-col-user-note, .vision-table-shared .vision-col-user-note { width: 12.5%; }
#vision-table .vision-col-recognized, .vision-table-shared .vision-col-recognized { width: 23%; }
#vision-table .vision-col-reply, .vision-table-shared .vision-col-reply { width: 9%; }
/* 「校对结果」与「作品」同宽一档：两屏共用这一套，列边界才可能完全对齐 */
#vision-table .vision-col-check, .vision-table-shared .vision-col-check { width: 8%; }
#vision-table .vision-col-project, .vision-table-shared .vision-col-project { width: 7%; }
#vision-table .vision-col-size, .vision-table-shared .vision-col-size { width: 4.5%; }
#vision-table .vision-col-status, .vision-table-shared .vision-col-status { width: 6.5%; }
/* 「校对结果」一格：三个结论竖排成一列（横排在 8% 宽里放不下「回复不当」四个字），点中哪档染哪档的颜色，再点一次撤销。 */
.vision-check-cell { display: flex; flex-direction: column; align-items: stretch; gap: 4px; }
.vision-check-cell.is-busy { opacity: .45; pointer-events: none; }
.vision-check-btn { padding: 4px 6px; font-size: 12px; line-height: 1.4; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #475569; cursor: pointer; white-space: nowrap; }
.vision-check-btn:hover { border-color: #94a3b8; }
.vision-check-correct.is-on { background: #dcfce7; border-color: #16a34a; color: #14532d; font-weight: 600; }
.vision-check-reply_inappropriate.is-on { background: #ffedd5; border-color: #ea580c; color: #7c2d12; font-weight: 600; }
.vision-check-recognition_error.is-on { background: #fee2e2; border-color: #dc2626; color: #7f1d1d; font-weight: 600; }
.vision-check-none { color: #94a3b8; }
#vision-table .vision-cell-time, .vision-table-shared .vision-cell-time { white-space: pre-wrap; font-size: 12px; font-variant-numeric: tabular-nums; line-height: 1.65; }
#vision-table .vision-cell-type, .vision-table-shared .vision-cell-type { white-space: normal; font-size: 12px; }
/* 「类型」整列左右居中：两字的「语音」与五字「上传的照片」混排时不再看着错位。
   用 .vision-table-shared 一条同时覆盖「小年识别校对」与「小年管家识别校对」两张表（只有这两张在用），
   这就是用户要的「两边设置一样」；素材总表不在此列。 */
.vision-table-shared .vision-cell-type, .vision-table-shared .vision-head-type { text-align: center; }
/* 表头文字全部左右居中（2026-10-28 用户裁决）：与上面「类型」列同一套共用机制，一条同时覆盖「小年识别校对」与「小年管家识别校对」两张表，只动表头不动表体。 */
.vision-table-shared thead th { text-align: center; }

#vision-table .vision-cell-size, .vision-table-shared .vision-cell-size { white-space: normal; }
#vision-table .vision-cell-recognized, #vision-table .vision-cell-user-note, .vision-table-shared .vision-cell-recognized, .vision-table-shared .vision-cell-user-note { line-height: 1.65; white-space: pre-wrap; overflow-wrap: anywhere; }
#vision-table .vision-cell-user-note, .vision-table-shared .vision-cell-user-note { color: #1f2933; font-weight: 500; }
#vision-table .vision-cell-user, .vision-table-shared .vision-cell-user { font-size: 12px; line-height: 1.55; white-space: normal; overflow-wrap: anywhere; word-break: break-all; }
#vision-table .vision-cell-status, .vision-table-shared .vision-cell-status { white-space: normal; overflow-wrap: anywhere; }
#vision-table .media-thumb, #vision-table .media-video, #vision-table .media-audio, .vision-table-shared .media-thumb, .vision-table-shared .media-video, .vision-table-shared .media-audio { max-width: 100%; }

/* 精选列表「预览」列：行内小窗比核对页再小一号，视频点一下才全屏播、图片点一下看大图 */
#discover-table .media-video-box { width: 168px; }
#discover-table .media-video-box .media-video { max-height: 126px; }
#discover-table .media-audio { width: 210px; }
#discover-table .media-thumb, #discover-table .media-video, #discover-table .media-video-box, #discover-table .media-audio { max-width: 100%; }

/* 照片在当前页打开：点图再点图、点空白或按 Esc 复原，不跳新窗口、不触发下载 */
body.vision-lightbox-open { overflow: hidden; }
.vision-image-overlay { position: fixed; inset: 0; z-index: 100; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px; padding: 38px 28px 24px; background: rgba(15,23,42,.84); cursor: zoom-out; }
.vision-image-large { display: block; max-width: calc(100vw - 56px); max-height: calc(100vh - 118px); object-fit: contain; border-radius: 6px; background: #111827; box-shadow: 0 20px 70px rgba(0,0,0,.55); cursor: zoom-out; }
.vision-image-close { position: absolute; top: 18px; right: 22px; width: 44px; height: 44px; padding: 0; border: 1px solid rgba(255,255,255,.35); border-radius: 50%; background: rgba(15,23,42,.55); color: #fff; font-size: 22px; line-height: 1; }
.vision-image-close:hover { background: rgba(37,99,235,.9); }
.vision-image-hint { color: #e5e7eb; font-size: 13px; line-height: 1.5; text-align: center; }
#review-materials-table td { vertical-align: top; }
#review-materials-table td:nth-child(5) { max-width: 520px; }
#analytics-agent-table tbody tr { cursor: pointer; }
#analytics-agent-table td { vertical-align: top; }
#analytics-commerce-table td:last-child, #analytics-commerce-table th:last-child { text-align: right; }
#review-history-table td { vertical-align: top; }

/* 筛选下拉在窄屏不许被挤成一个箭头 */
#reviews-status, #reviews-project, #vision-type, #vision-project, #review-material-type { min-width: 132px; }

/* 智能体工作台 / 报价表：顶部切换栏（口径照「界面配置」的 .content-tabs —— 等分铺满整行、选中蓝底白字） */
/* 实测数字（浏览器量真实盒模型，不是估）：旧写法 grid minmax(150px,1fr) 十颗一排时每轨 150px，
   而「影像修复创作智能体」不折行要 156px → 折成两行把整排撑到 63.6px，比「界面配置」那排的 47px 高出一截。
   现在按列自动排：轨道下限取 max-content（永不折行），上限 1fr（够宽时十颗等分铺满，跟原来一样），
   整排实在放不下时容器横向滚动；页签固定 47px 高（盒模型 border-box，含边框）。报价表顶部共用这套 class，一并对齐。
   实测：1864/2158/2600 十颗等宽 177/207/251、1280 起横滚，六档高度一律 47、折行 0、截字 0。 */
.agent-tabs { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(max-content, 1fr); gap: 10px; margin: 12px 0 14px; overflow-x: auto; }
/* 面板第一块就是这排页签时（小年管家），上外边距与 .main 的 14px 上内边距叠成两条缝，
   页签会比左侧栏首项低 12px。第一块一律贴到内容区最上沿（2026-10-30 用户指正） */
.panel > .agent-tabs:first-child { margin-top: 0; }
.agent-tab, .content-page-btn { height: 47px; display: inline-flex; align-items: center; justify-content: center; text-align: center; gap: 4px; padding: 0 6px; white-space: nowrap; border: 1px solid #cbd2d9; border-radius: 10px; background: #fff; color: #1f2933; cursor: pointer; font-size: 14px; font-weight: 600; line-height: 1.2; }
.agent-tab:hover, .content-page-btn:hover { background: #f8fafc; border-color: #2563eb; }
.agent-tab.active { background: #2563eb; border-color: #2563eb; color: #fff; }
.agent-tab.active:hover { background: #1d4ed8; border-color: #1d4ed8; }
.agent-tab-count { flex: 0 0 auto; display: inline-block; padding: 1px 5px; border-radius: 9px; background: #e4e9f0; color: #323f4b; font-size: 10px; line-height: 1.4; text-align: center; }
.agent-tab.active .agent-tab-count { background: rgba(255, 255, 255, .24); color: #fff; }
.agent-tab-panel { background: #fff; border: 1px solid #e4e9f0; border-radius: 10px; padding: 16px; }
.agent-tab-head { display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px; }
.agent-tab-title { font-size: 16px; font-weight: 600; }
.agent-tab-stats { font-size: 12px; color: #52606d; }
.agent-task-bar { display: inline-block; width: 180px; max-width: 40%; height: 10px; background: #eef1f4; border-radius: 5px; overflow: hidden; }
.agent-task-bar i { display: block; height: 100%; background: #046c4e; }
.agent-task-table { box-shadow: none; border-radius: 0; }
.agent-task-table td { vertical-align: top; }
.agent-task-table td:nth-child(5), .agent-task-table td:nth-child(6) { max-width: 380px; }
.agent-task-note { margin: 0; padding: 8px 16px 14px; }

/* 报价表：顶部标签行钉死（照 .agents-sticky 同款）。sticky 偏移按内容盒顶算，.main 的上内边距会成一条露内容的缝，
   所以钉顶条自己往上吃回 --pad-top 并左右出血，再把这段还成条内上内边距——静止时观感不变，滚动时缝被底色盖死 */
.quote-pin { position: sticky; top: calc(-1 * var(--pad-top)); z-index: 6; background: #f4f6f9; margin: calc(-1 * var(--pad-top)) -32px 0; padding: var(--pad-top) 32px 0; }
.quote-pin .agent-tabs { margin-top: 0; }
.quote-pin-lead { background: #fff; border: 1px solid #e4e9f0; border-top: none; border-radius: 0 0 10px 10px; padding: 11px 16px; margin-bottom: 14px; line-height: 1.8; }
.quote-tab-body { margin-top: 10px; }
/* 报价表底部常驻的「保存并发布」（2026-10-30 用户裁决）：六栏共用一条，表格再长也点得到。
   为什么要有：影像修复/声画复刻的发布按钮在页顶、做纪录片的在最底下，找不着就等于没有。
   sticky 的滚动参照是 .main 这个滚动容器，与上面 .quote-pin 吸顶同一套口径；
   左右负 margin 顶到边、底边抵掉 .main 的 14px 内边距，滚到底不露缝 */
.quote-save-bar { position: sticky; bottom: 0; z-index: 6; display: flex; flex-direction: row; align-items: center; justify-content: flex-end; gap: 14px; margin: 18px -32px -14px; padding: 12px 32px; background: #f4f6f9; border-top: 1px solid #e4e9f0; }
.quote-save-what { margin-right: auto; font-weight: 600; }

/* 报价表：发给用户的文案——照客户那一屏整页仿真，点哪句改哪句 */
.copy-sheet { background: #fff; border-radius: 12px; padding: 4px 22px 20px; margin-top: 12px; box-shadow: 0 1px 4px rgba(31,41,51,.06); }
.ce-legend-off { background: #fff6dd; color: #8a5a00; padding: 0 5px; border-radius: 4px; }
.ce-block { border-top: 1px dashed #e2e8f0; padding: 18px 0 2px; }
.ce-block:first-child { border-top: none; }
.ce-block-head { font-size: 13px; color: #7b8794; font-weight: 700; margin-bottom: 10px; }
.ce-block-head em { font-style: normal; font-weight: 400; color: #9aa5b1; margin-left: 8px; }

/* 客户那一屏的卡片：色值照 App 报价页抄（蓝 #1677FF、绿 #EAF8EE/#1E9E4A、橙 #E85D04） */
.ce-card { border: 1px solid #ebebeb; border-radius: 12px; padding: 14px 16px 16px; background: #fcfdff; }
.ce-card-entry { display: flex; flex-direction: row; align-items: center; gap: 12px; }
.ce-card-entry .ce-slot { flex: 1; min-width: 0; }
.ce-card-arrow { font-size: 26px; line-height: 1; color: #c2cbd5; }
.ce-card-name { font-size: 15px; font-weight: 700; color: #111827; }
.ce-card-price { margin: 2px 0 4px; font-size: 26px; font-weight: 900; color: #e85d04; }
.ce-list-head { margin-top: 10px; font-size: 14px; font-weight: 700; color: #111827; }
.ce-list-inner div { font-size: 13px; line-height: 1.9; color: #4b5563; }
.ce-states { display: flex; flex-direction: row; flex-wrap: wrap; align-items: flex-start; gap: 10px; margin-top: 12px; padding-top: 10px; border-top: 1px dashed #eef1f4; }
.ce-states-head { align-self: center; font-size: 12px; color: #9aa5b1; }
.ce-states .ce-slot { flex: 0 1 300px; }

/* 左右并排：② 基础制作费卡 | ③ 最终报价表，各占一半；窄于 1400 时增项名列会被挤扁，退回一列 */
.ce-columns { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0 24px; align-items: start; }
@media (max-width: 1400px) { .ce-columns { grid-template-columns: minmax(0, 1fr); } }

/* 就地编辑的格子：平时看着就是客户那行字，点进去才现框 */
.ce-slot { margin-top: 6px; }
.copy-sheet .ce { display: block; width: 100%; max-width: none; padding: 6px 9px; border: 1px dashed transparent; border-radius: 8px; background: #f6f8fb; font-family: inherit; }
.copy-sheet textarea.ce { min-height: 46px; line-height: 1.8; resize: vertical; }
.copy-sheet .ce-off { background: #fff8e6; }
.ce-out { margin-top: 3px; padding-left: 2px; font-size: 12px; color: #1677ff; }
.ce-out-hidden { display: none; }

/* 每一处按它在 App 上的真实长相排版（必须排在上面通用格子之后，且同样带 .copy-sheet 前缀才压得住） */
.copy-sheet .ce-entry-title { font-size: 16px; font-weight: 700; color: #111827; }
.copy-sheet .ce-entry-sub { font-size: 13px; color: #6b7280; }
.copy-sheet .ce-line { font-size: 14px; font-weight: 700; color: #111827; }
.copy-sheet .ce-pay-state { flex: 0 0 auto; padding: 9px 26px; font-size: 14px; font-weight: 700; text-align: center; color: #fff; background: #1677ff; border-radius: 20px; }
.copy-sheet .ce-pay-state-paid { background: #1e9e4a; }
.ce-columns .ce-block { border-top: none; }

/* 悬停与聚焦态排最后：无论哪种形态，点进去都变成白底深字，改字时永远看得清 */
.ce-slot:hover > .ce { border-color: #b9c6d6; }
.copy-sheet .ce:focus { outline: none; border-color: #1677ff; background: #fff; color: #111827; box-shadow: 0 0 0 2px rgba(22,119,255,.12); }

/* 发布条不钉屏底：钉着会盖住正在编辑的内容（10-25 用户裁决），跟着内容走，就在「支付基础制作费」那张卡后面 */
#documentary-save-row { margin-top: 14px; padding: 10px 0; border-top: 1px solid #e4e9f0; background: #f4f6f9; }
.ce-focus-readout { margin-left: auto; font-size: 12px; color: #52606d; }

/* 报价表：宽屏整条铺满，长说明完整可读（只作用于这一页，不影响其他面板） */
#panel-documentary .panel-form.wide { max-width: none; }
#panel-documentary #documentary-base-description { width: 100%; min-height: 150px; line-height: 1.7; }
#documentary-base-includes, #documentary-base-excludes { display: block; width: 100%; line-height: 1.7; }
#panel-documentary .panel-form.wide .row > label { flex: 1 1 0; min-width: 0; }
#panel-documentary .panel-form.wide .row > label input { width: 100%; }
#documentary-items-table { table-layout: fixed; width: 100%; }
#documentary-items-table th:nth-child(1), #documentary-items-table td:nth-child(1) { width: 210px; }
#documentary-items-table th:nth-child(2), #documentary-items-table td:nth-child(2) { width: 62px; }
#documentary-items-table th:nth-child(3), #documentary-items-table td:nth-child(3) { width: 120px; }
#documentary-items-table th:nth-child(4), #documentary-items-table td:nth-child(4) { width: 120px; }
#documentary-items-table th:nth-child(5), #documentary-items-table td:nth-child(5) { width: 78px; }
#documentary-items-table td:last-child { width: auto; }
#documentary-items-table input { width: 100%; padding: 7px 10px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 14px; }
#documentary-items-table textarea { display: block; width: 100%; min-height: 116px; padding: 8px 10px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 14px; line-height: 1.7; }
#documentary-quotes-table { width: 100%; }

/* 报价表纸上直接可改：金额、时长、清单逐条、增值项目逐行都是输入框 */
.ce-card-price { display: flex; align-items: baseline; gap: 4px; margin: 4px 0 6px; }
.ce-money-input { width: 96px; padding: 2px 6px; border: 1px dashed #cbd2d9; border-radius: 6px; font-size: 22px; font-weight: 700; color: #b45309; background: #fff; }
/* 基础价与成片时长只读：唯一入口在内容管理，这里用实底灰框提示「看得见、改不了」 */
.ce-money-readonly { border-style: solid; border-color: #e1e6ec; background: #f4f6f9; color: #52606d; cursor: default; }
.ce-money-readonly:focus { outline: none; border-color: #e1e6ec; }
.ce-source-note { margin: 2px 0 8px; font-size: 12px; line-height: 1.6; }
.ce-money-unit { font-size: 13px; color: #52606d; }
.ce-minutes { display: flex; align-items: center; gap: 6px; margin: 6px 0; font-size: 13px; color: #52606d; }
.ce-minutes-input { width: 64px; font-size: 14px; font-weight: 400; color: #1f2933; }
.ce-list-input { display: block; width: 100%; padding: 4px 8px; border: 1px dashed #cbd2d9; border-radius: 6px; font-size: 13px; color: #1f2933; background: #fff; }
.ce-list-row { display: flex; flex-direction: row; align-items: center; gap: 6px; margin-bottom: 4px; }
.ce-list-row .ce-list-input { flex: 1; min-width: 0; }
.ce-row-del { flex: 0 0 auto; width: 24px; height: 24px; padding: 0; border: 1px solid #d7dee7; border-radius: 6px; background: #fff; color: #8a5a00; font-size: 15px; line-height: 1; cursor: pointer; }
.ce-row-del:hover { border-color: #e0a1a1; background: #fdf1f1; color: #c0392b; }
.ce-row-add { display: block; width: 100%; margin: 6px 0 2px; padding: 5px 8px; border: 1px dashed #b9c6d6; border-radius: 6px; background: #f7fafd; color: #1677ff; font-size: 13px; font-weight: 700; cursor: pointer; }
.ce-row-add:hover { border-color: #1677ff; background: #eef5ff; }

/* ③ 最终报价表：增项 × 数量 → 小计，底部四行合计 */
.fq { margin-top: 2px; }
.fq-row { display: grid; grid-template-columns: minmax(0, 1fr) 74px 46px 56px 84px 46px; align-items: center; gap: 6px; margin-bottom: 6px; }
.fq-head { margin-bottom: 4px; font-size: 12px; color: #8a97a5; }
.fq-head span { text-align: center; }
.fq-head span:first-child { text-align: left; }
.fq input { min-width: 0; padding: 4px 6px; border: 1px dashed #cbd2d9; border-radius: 6px; font-size: 13px; color: #1f2933; background: #fff; }
.fq-name { width: 100%; }
.fq-num { width: 100%; text-align: right; font-weight: 700; color: #b45309; }
.fq-sub { text-align: right; font-size: 13px; font-weight: 700; color: #111827; white-space: nowrap; }
.fq-ops { text-align: center; font-size: 12px; color: #b0bac5; }
.fq-row-custom { background: #fbfcfe; border-radius: 6px; }
.fq-add { margin-top: 2px; }
.fq-dropped { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 6px; margin: 2px 0 4px; font-size: 12px; color: #8a97a5; }
.fq-chip { padding: 3px 9px; border: 1px dashed #cbd2d9; border-radius: 12px; background: #fff; color: #1677ff; font-size: 12px; cursor: pointer; }
.fq-chip:hover { border-color: #1677ff; background: #eef5ff; }
.fq-sum { margin-top: 10px; padding-top: 8px; border-top: 1px solid #eef1f4; }
.fq-sum-row { display: flex; flex-direction: row; align-items: center; gap: 10px; padding: 2px 0; font-size: 13px; color: #52606d; }
.fq-sum-label { flex: 1; min-width: 0; }
.fq-sum-money { flex: 0 0 auto; font-weight: 700; color: #111827; white-space: nowrap; }
.fq-sum-final { margin-top: 2px; padding-top: 6px; border-top: 1px dashed #eef1f4; font-size: 14px; font-weight: 700; color: #111827; }
.fq-sum-final .fq-sum-money { font-size: 17px; color: #e85d04; }

/* 启动页广告：图片 / 视频两个槽位 */
.launch-ad-slot { background: #fff; border: 1px solid #e4e9f0; border-radius: 10px; padding: 14px 16px; margin: 12px 0; box-shadow: 0 1px 4px rgba(31,41,51,.05); }
.launch-ad-slot-head { display: flex; flex-direction: row; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 12px; }
.launch-ad-slot-body { display: flex; flex-direction: row; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
/* 预览框按 9:16 竖着定死，运营一眼就能看出素材是不是竖的；空态文字由 JS 写，不用 CSS content */
.launch-ad-preview { flex: 0 0 auto; width: 132px; min-height: 235px; border: 1px dashed #cbd2d9; border-radius: 8px; background: #f4f6f9; display: flex; flex-direction: row; align-items: center; justify-content: center; overflow: hidden; font-size: 12px; color: #9aa5b1; text-align: center; }
.launch-ad-thumb { width: 130px; height: 233px; object-fit: cover; border-radius: 7px; background: #000; }
.launch-ad-meta { flex: 1; min-width: 220px; font-size: 13px; color: #323f4b; line-height: 1.7; }
.launch-ad-actions { flex-basis: 100%; margin-top: 0; }
/* 启动页广告两个槽位：一行两列并排（图片在左、视频在右），窄屏退回单列 */
.launch-ad-slot-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; align-items: stretch; margin-top: 12px; }
.launch-ad-slot-grid .launch-ad-slot { margin: 0; }
@media (max-width: 1100px) { .launch-ad-slot-grid { grid-template-columns: minmax(0, 1fr); } }

/* 界面配置：页内五个页签照 App 底部导航排（首页 / 精选 / 创建作品 / 作品 / 我），五等分整行 */
.content-tabs { display: flex; gap: 10px; margin-top: 0; margin-bottom: 10px; }

/* 页头吸顶：.main 才是滚动容器（overflow-y:auto，上内边距 var(--pad-top)）。照抄 .quote-pin 的口径——
   钉住时自己往上吃回 --pad-top、左右出血到容器外，再把这段还成条内上内边距，
   静止时观感不变、滚动时页头压在视口最上沿不露缝。一级页签行与二级编辑页顶栏各钉一条，
   二级那条 top 取 47px = 一级页签实测高度（.content-page-btn/.agent-tab 都是 47px），正好接在下面不重叠。 */
.panel-pin { position: sticky; top: var(--pin-self-top, calc(-1 * var(--pad-top))); z-index: 30; background: #f4f6f9; margin: calc(-1 * var(--pad-top)) -32px 0; padding: var(--pad-top) 32px 0; }

/* 安全中心这排页签（2026-11-03 用户指正：往上提到与左侧栏首项同一高度）：
   它同时挂 .agent-tabs 与 .panel-pin，上面那条 .panel > .agent-tabs:first-child{margin-top:0}
   把 .panel-pin 吃回 .main 上内边距的负边距顶掉了，静止时页签顶边＝.main 的 14 ＋ 条内 14 ＝ 28，
   而左侧栏首项在 12，整整低了 16px。
   这里按 id 单独吃回 16px（--pad-top 的 14 再减掉侧栏首项那 2px 差），
   条内 padding-top 与 --pin-self-top 一律不动，吸顶时不露缝。全站只有 #sec-tabs 是这副结构。 */
#sec-tabs { margin: calc(-1 * var(--pad-top) - 2px) -32px 0; padding-top: 12px; }
/* 七页顶部冻结（说明段＋工具行/总览行）：条底留一行呼吸，只挂新页用的 .panel-pin-flow，
   reviews / content 那两条已按写死的 47px 表头偏移配好，加高会把表头推进条底下，一律不受本条影响 */
.panel-pin-flow { padding-bottom: 0; }
/* 营销页两个小节标题要"一点都不动"：sticky 的吸顶线＝钉顶条底，而它自己带 18px 上外边距，
   滚动时必须先滚掉这 18px 才贴住那条线——观感就是标题跟着往上挪一点。
   上外边距归零、同样的呼吸改由这一页钉顶条的下内边距出（12＋18＝30），自然位置与吸顶位置恒等，零位移 */
#panel-growth .growth-col > .block-title:first-of-type { margin-top: 0; }
/* 条底那 30px 是当初为「标题零位移」挪过来的呼吸，实际观感就是说明条下面一大块空。
   小节标题的上外边距已经归零，吸顶线仍等于条底，去掉这 30px 不会重新引入抖动（2026-10-30 用户裁决往上提）。 */
#panel-growth .panel-pin { padding-bottom: 0; }
/* 条内第一行的上外边距会与条内上内边距叠成两条缝（同 .panel > .row:first-child 的口径） */
.panel-pin > .row:first-child { margin-top: 0; }
.panel-pin > h3:first-child { margin-top: 0; }
/* top 一律吃实测：47px 是"只有一排页签"那阵子量出来的，界面配置现在多了一排二级按钮，
   再写死就会把标题行压在二级按钮上面。--pin-top 由 syncPinOffsets 按面板内各条 .panel-pin 实际高度累加 */
.panel-pin-sub { top: var(--pin-top, 47px); z-index: 29; margin: 0 -32px; padding: 8px 32px 8px; border-bottom: 1px solid #e4e9f0; }
/* 二级页顶栏标题：15px 的 .panel h3 滚进二级页几乎看不见，这里放大加粗 */
.panel-pin-sub #editor-title { font-size: 18px; font-weight: 700; margin: 0; }

/* 后台内确认弹窗：遮罩与居中方式照抄本页已有的 .vision-image-overlay / .vision-file-overlay */
.admin-confirm-overlay { position: fixed; inset: 0; z-index: 140; display: flex; align-items: center; justify-content: center; padding: 22px; background: rgba(15,23,42,.55); }
.admin-confirm-card { width: min(560px, 100%); background: #fff; border-radius: 12px; box-shadow: 0 18px 48px rgba(15,23,42,.3); overflow: hidden; }
.admin-confirm-head { padding: 15px 22px; background: #2563eb; color: #fff; font-size: 17px; font-weight: 700; }
.admin-confirm-danger .admin-confirm-head { background: #b91c1c; }
.admin-confirm-body { padding: 20px 22px 4px; font-size: 16px; line-height: 1.85; color: #1f2933; white-space: pre-line; }
.admin-confirm-actions { display: flex; flex-direction: row-reverse; justify-content: flex-start; gap: 12px; padding: 20px 22px 22px; }
.admin-confirm-actions button { min-width: 104px; padding: 10px 18px; font-size: 16px; font-weight: 700; border-radius: 8px; }
.admin-confirm-ok { background: #2563eb; border: 1px solid #2563eb; color: #fff; }
.admin-confirm-ok:hover { background: #1d4ed8; }
.admin-confirm-danger .admin-confirm-ok { background: #b91c1c; border-color: #b91c1c; color: #fff; }
.admin-confirm-danger .admin-confirm-ok:hover { background: #991b1b; }
.admin-confirm-cancel { background: #fff; border: 1px solid #cbd2d9; color: #1f2933; }
.admin-confirm-cancel:hover { background: #f1f5f9; }
/* 带输入框的弹窗：正文分段、下拉与输入框占满整行，字号按长辈可读放大；必填没填时给一条红字提示 */
.admin-confirm-msg { margin: 0 0 12px; font-size: 16px; line-height: 1.85; color: #1f2933; white-space: pre-line; }
.admin-confirm-label { display: block; margin: 0 0 6px; font-size: 14px; font-weight: 700; color: #52606d; }
.admin-confirm-field { display: block; width: 100%; min-height: 44px; margin: 0 0 12px; padding: 10px 12px; font-size: 16px; line-height: 1.6; color: #1f2933; border: 1px solid #cbd2d9; border-radius: 8px; background: #fff; font-family: inherit; resize: vertical; }
.admin-confirm-field:focus { outline: none; border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37,99,235,.15); }
.admin-confirm-warn { margin: 0; font-size: 14px; font-weight: 700; color: #b91c1c; }
/* 外观统一交给 .agent-tab 那一份，这条只留等分布局（2026-10-30 用户裁决：页签只准有一套样子） */
.content-tabs .content-page-btn { flex: 1 1 0; min-width: 0; }
/* 作品审核台：成品终审选中时用绿色，和素材初审的蓝色一眼分开 */
.content-tabs .content-page-btn[data-review-page="final"].primary { background: #16a34a; border-color: #16a34a; }
.content-tabs .content-page-btn[data-review-page="final"].primary:hover { background: #15803d; border-color: #15803d; }
#review-page-tabs { margin: 0 0 16px; }
/* 审核页签的未读红点：徽标必须绝对定位，不能跟着文字排。
   .nav-badge 是 18px 的 inline-block，混进 15px 文字的行盒会把行盒从约 18px 撑到约 25px，
   红点一出现整排页签当场跳一行。描一圈白光环是因为选中态是蓝底/绿底，
   #c81e1e 压在 #2563eb 上边缘对比只有约 1.2:1，不描边看不出这里有个角标。 */
#review-page-tabs .content-page-btn { position: relative; }
#review-page-tabs .content-page-btn .nav-badge {
  position: absolute; right: 12px; top: 50%; transform: translateY(-50%);
  margin-left: 0; box-shadow: 0 0 0 2px rgba(255, 255, 255, .9);
}
/* 资料上传进度表：两级页签，选中态一律沿用上面的 button.primary（蓝底白字），两级高度都是 47px。
   第一级只有两个大类，一行两列，字号与界面配置那排页签同档；
   第二级随大类切换列数：14 类那一栏整行 14 等分放不下 12 字全名，字号按 1/14 自动缩放；
   8 项那一栏一列宽得多，用全后缀，字号上限放到 15px。窄屏一律省略号兜底不破版 */
.archive-template-groups { gap: 10px; margin: 0 0 8px; }
.content-tabs.archive-template-groups .content-page-btn { flex: 1 1 0; min-width: 0; height: 47px; padding: 0 8px; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* 「唱首歌曲」这一类整排改绿色：大类页签与它下面八项一起变，与左边蓝色的「纪录片回忆录AI故人」一眼分开；
   色值照抄审核台「成品终审」那条已确立的绿灯——再淡一档的绿配白字对比度不够，长辈看不清字。
   纪录片那一类不写规则，两级都自然沿用 button.primary 的蓝 */
.content-tabs.archive-template-groups .content-page-btn[data-archive-group="song"].primary,
.content-tabs.archive-template-tabs.group-song .content-page-btn.primary { background: #16a34a; border-color: #16a34a; }
.content-tabs.archive-template-groups .content-page-btn[data-archive-group="song"].primary:hover,
.content-tabs.archive-template-tabs.group-song .content-page-btn.primary:hover { background: #15803d; border-color: #15803d; }
.archive-template-tabs { container-type: inline-size; gap: 6px; margin: 0 0 10px; }
.content-tabs.archive-template-tabs .content-page-btn { flex: 1 1 0; min-width: 0; height: 47px; padding: 0 2px; line-height: 1.15; font-size: clamp(10px, 0.78cqw, 14px); text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.content-tabs.archive-template-tabs.cols-8 .content-page-btn { font-size: clamp(11px, 1.05cqw, 15px); }
/* 首页六格：后台直接摆成和手机一样的 2×3 宫格，拖 ⠿ 对调，点格子里的字直接改 */
.home-grid-editor, .home-copy-editor { background: #fff; border: 1px solid #e4e9f0; border-radius: 10px; padding: 14px 16px; margin: 0 0 14px; }
.home-grid-editor h3, .home-copy-editor h3 { margin: 0 0 4px; font-size: 15px; }
.home-grid-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.home-grid-head h3 { margin: 0; }
.home-grid-reset { flex: 0 0 auto; padding: 6px 14px; font-size: 13px; }
.home-grid-board { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-top: 10px; }
@media (max-width: 1100px) { .home-grid-board { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.home-grid-cell { position: relative; height: 108px; background: #f8fafc; border: 1px solid #dbe3ec; border-radius: 12px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 10px 12px 18px; }
.home-grid-cell-index { position: absolute; left: 10px; top: 8px; width: 20px; height: 20px; border-radius: 50%; background: #e6edf6; color: #52606d; font-size: 12px; display: flex; align-items: center; justify-content: center; }
.home-grid-cell-drag { position: absolute; left: 10px; bottom: 6px; width: 24px; height: 22px; color: #9aa5b1; font-size: 16px; line-height: 22px; text-align: center; cursor: grab; }
.home-grid-cell-drag:active { cursor: grabbing; }
.home-grid-cell input.home-grid-cell-input { width: 100%; max-width: none; border: 1px solid transparent; background: transparent; font-size: 16px; font-weight: 600; color: #1f2933; text-align: center; padding: 4px 6px; }
.home-grid-cell input.home-grid-cell-input:hover { border-color: #cbd2d9; background: #fff; }
.home-grid-cell input.home-grid-cell-input:focus { border-color: #2563eb; background: #fff; }
.home-grid-cell-note { font-size: 11px; color: #7b8794; line-height: 15px; }
.home-grid-cell-target { border-color: #2563eb; box-shadow: 0 0 0 2px rgba(37,99,235,.18); background: #eef5ff; }
.home-grid-cell-dragging { opacity: .45; }
#content-page-intro { margin: 0 0 14px; }
.ui-copy-row { display: flex; align-items: flex-start; margin-bottom: 10px; }
.ui-copy-row > label { flex: 1 1 0; min-width: 0; max-width: 760px; margin-bottom: 0; }
.ui-copy-row input[type=text] { max-width: none; }
.ui-copy-title { display: block; font-weight: 600; color: #323f4b; margin-bottom: 2px; }
.ui-copy-hint { display: block; color: #7b8794; font-size: 12px; margin-bottom: 4px; }

/* 营销与优惠·免费额度券参数：三列网格，每格「名称 / 输入框 / 单位」三列对齐；框体收小、高度降低 */
#panel-growth .growth-fields { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: 22px; row-gap: 10px; margin-top: 12px; }
#panel-growth .growth-fields > .row { display: contents; }
#panel-growth .growth-fields .inline-label { display: grid; grid-template-columns: minmax(0, 1fr) 68px 16px; align-items: center; column-gap: 8px; margin-bottom: 0; }
#panel-growth .growth-fields .inline-label input[type=number] { width: 68px; min-width: 0; height: 28px; padding: 0 6px; box-sizing: border-box; text-align: center; }
/* 营销与优惠·邀请满减参数：同样三列对齐；日期框 128、数字框 68，高度与左栏一致 */
#panel-growth .campaign-fields { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: 22px; row-gap: 10px; margin-top: 12px; }
#panel-growth .campaign-fields > .row { display: contents; }
#panel-growth .campaign-fields .inline-label { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: 8px; margin-bottom: 0; }
#panel-growth .campaign-fields .inline-label input[type=date] { width: 128px; min-width: 0; height: 28px; padding: 0 6px; box-sizing: border-box; }
#panel-growth .campaign-fields .inline-label input[type=number] { width: 68px; min-width: 0; height: 28px; padding: 0 6px; box-sizing: border-box; text-align: center; }

/* 用户列表看板（2026-10-28 重做）：筛选项多必须能换行；控件高度与本页其余筛选控件统一取 28px */
.users-filter { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 8px; margin: 4px 0 14px; }
.users-filter > input, .users-filter > select { min-width: 0; height: 28px; padding: 0 6px; box-sizing: border-box; border: 1px solid #cbd2d9; border-radius: 6px; font-size: 13px; background: #fff; }
.users-filter > input[type=search] { width: 210px; }
.users-filter > input[type=text] { width: 168px; }
.users-filter > select { width: 132px; }
.users-filter > button { height: 28px; }
.users-range { display: inline-flex; flex-direction: row; align-items: center; gap: 4px; font-size: 13px; color: #323f4b; }
.users-range > input { min-width: 0; width: 62px; height: 28px; padding: 0 6px; box-sizing: border-box; border: 1px solid #cbd2d9; border-radius: 6px; font-size: 13px; }
.users-range > input[type=date] { width: 138px; }
.users-inline { display: inline-flex; flex-direction: row; align-items: center; gap: 4px; font-size: 13px; color: #323f4b; }

/* 地域分组与订单副标记：浅底色块，文字本身已可读，不靠纯色单独表意 */
.users-tag { display: inline-block; margin-left: 4px; padding: 1px 6px; border-radius: 8px; font-size: 11px; line-height: 1.5; white-space: nowrap; }
.users-tag-cn { background: #e8f4ec; color: #046c4e; }
.users-tag-hmt { background: #fff4e0; color: #92600a; }
.users-tag-os { background: #eaeefb; color: #2b3d8f; }
.users-tag-warn { background: #fdecec; color: #b42318; }

/* 成交漏斗与活跃分布：名称定宽、条形按比例、数值靠右，整行可点所以给 hover 反馈 */
.users-funnel-row { display: grid; grid-template-columns: 168px minmax(0, 1fr) 168px; align-items: center; gap: 10px; padding: 6px 0; cursor: pointer; }
.users-funnel-row:hover { background: #f8fafc; }
.users-funnel-name { font-size: 13px; color: #1f2933; }
.users-funnel-bar { display: block; height: 12px; border-radius: 6px; background: linear-gradient(90deg, #4c86ff, #2563eb); }
.users-funnel-value { font-size: 13px; color: #323f4b; text-align: right; white-space: nowrap; }

/* 用户明细：基础信息横向铺开可换行，各小表之间留距 */
.users-facts { display: flex; flex-direction: row; flex-wrap: wrap; gap: 8px 14px; margin: 8px 0 16px; }
.users-fact { font-size: 13px; color: #1f2933; background: #f4f6f9; border-radius: 8px; padding: 5px 10px; }
.users-detail-block { margin-top: 18px; }
.users-detail-block > .agent-tab-head { font-weight: 600; }

/* 用户表列宽固定（2026-10-28 修横向溢出）：13 列自动布局会被内容撑出容器，整页横向滚动、147px 的侧栏被顶出屏幕，
   点完菜单还得横向滚回左边才能再点。table-layout: fixed 让列宽按声明分配、总宽恒等于 100%，
   长内容用省略号收掉（账号是 32 位 hash，必须 nowrap），操作列留够三个按钮的宽度。 */
#users-table { table-layout: fixed; width: 100%; }
#users-table th, #users-table td { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#users-table th:nth-child(1), #users-table td:nth-child(1) { width: 150px; }
#users-table th:nth-child(2), #users-table td:nth-child(2) { width: 80px; }
#users-table th:nth-child(3), #users-table td:nth-child(3) { width: 92px; }
#users-table th:nth-child(4), #users-table td:nth-child(4) { width: 116px; }
#users-table th:nth-child(5), #users-table td:nth-child(5) { width: 62px; }
#users-table th:nth-child(6), #users-table td:nth-child(6) { width: 58px; }
#users-table th:nth-child(7), #users-table td:nth-child(7) { width: 96px; }
#users-table th:nth-child(8), #users-table td:nth-child(8) { width: 96px; }
#users-table th:nth-child(9), #users-table td:nth-child(9) { width: 62px; }
#users-table th:nth-child(10), #users-table td:nth-child(10) { width: 62px; }
#users-table th:nth-child(11), #users-table td:nth-child(11) { width: 76px; }
#users-table th:nth-child(12), #users-table td:nth-child(12) { width: 100px; }
#users-table th:nth-child(13), #users-table td:nth-child(13) { width: 68px; }
#users-table th:nth-child(14), #users-table td:nth-child(14) { width: 68px; }
#users-table th:nth-child(15), #users-table td:nth-child(15) { width: 82px; }
#users-table th:nth-child(16), #users-table td:nth-child(16) { width: 190px; }
/* 操作列三个按钮必须完整露出，不吃省略号那套 */
#users-table td:nth-child(16) { white-space: normal; overflow: visible; }

/* 小年识别校对：表格高度原来按 278px 固定扣减（2026-10-28 修）。
   实际顶部筛选栏没有 278px 高，多扣的那几十像素全变成表格下方的空白，白占屏幕。
   这里改按 200px 扣，并用变量兜住，将来筛选栏高度变了只改一个数。
   注意：不改上面 394 行那条原始规则，只在末尾覆盖，别人再调那条也不会被删。 */
:root { --vision-chrome: 200px; }
.vision-table-scroll { max-height: calc(100vh - var(--vision-chrome)); }
#users-table td:nth-child(15) { white-space: normal; overflow: visible; }

/* 用户列表·分享与拉新页签（2026-10-28）：分享次数来自 share_events、拉新人数来自 referral_relations，两组数字分开摆，不混算。 */
.users-stat-row { display: flex; flex-direction: row; flex-wrap: wrap; gap: 12px; margin: 6px 0 18px; }
.users-stat { flex: 1 1 180px; background: #fff; border: 1px solid #e4e9f0; border-radius: 10px; padding: 12px 14px; }
.users-stat strong { display: block; font-size: 22px; color: #1f2933; }
.users-stat span { font-size: 12px; color: #616e7c; }
.users-channel-row { display: flex; flex-direction: row; align-items: center; gap: 12px; padding: 6px 0; }
.users-channel-name { width: 96px; font-size: 13px; color: #1f2933; }
.users-channel-bar { height: 12px; border-radius: 6px; background: linear-gradient(90deg, #4c86ff, #2563eb); }
.users-channel-value { font-size: 13px; color: #323f4b; white-space: nowrap; }#users-table td:nth-child(13) { white-space: normal; overflow: visible; }

/* 全局兜底：内容超宽时在 .main 内部横向滚动（2026-10-28）。
   原先 .main 只有 overflow-y、没有 overflow-x，任何一页的内容（宽表格、两列表单）一旦超宽，
   就会顶破 .app-body 让整个 .app 横向滚动，147px 的侧栏被推出屏幕左边——
   用户点完菜单想再换一页，得先横向滚回左边，表现为「点了就退不回来」。
   .main 本来就是 overflow-y 的滚动容器，补 overflow-x 不改变它的 sticky 基准，
   表头吸顶行为与原先一致；这里只兜底，各页该收的宽度仍要各自收（见用户表的固定列宽）。 */
.main { overflow-x: auto; }

/* 外壳防塌（2026-10-28 用户报「很多页面打开后左边项目栏不见了、退不回来」）。
   左侧栏必须是「固定宽、不许被挤、不许被滚走、不许被隐藏」四件事同时成立，差一条就会有页面丢侧栏：
   ① .app / .app-body 一律不许横向滚动——横滚只允许发生在 .main 内部，否则一宽就整壳右移、147px 侧栏被推出屏外；
   ② .main 必须能被压缩（flex-basis 0 + min-width 0），否则它按内容最小宽度撑开、把侧栏挤扁；
   ③ 侧栏写死 width 与 min-width，任何 flex 收缩都拿它没辙；
   ④ 加 !important 兜一道显示，万一别处给它挂了 .hidden（那是 display:none !important）也不至于整栏消失。
   这是后台壳的通用写法（Ant Design Pro 一类都是「根节点 overflow:hidden + 内容区自己滚」）。 */
.app { overflow: hidden; }
.app-body { min-width: 0; overflow: hidden; }
.app-body > .sidebar { display: block !important; width: 147px; min-width: 147px; }
.main { flex: 1 1 0; min-width: 0; overflow: auto; }

/* 运营分析：核心指标与订单状态并排（2026-10-28）。
   两块都是三列小表，本来各占一整行、内容很少却要往下翻；并排后一屏看全。
   用 flex + 440px 最小宽度：宽屏两列、窄屏自动回落成一列（回落时不画分隔线，见 media 查询）。 */
.analytics-two-col { display: flex; flex-direction: row; flex-wrap: wrap; column-gap: 34px; row-gap: 0; }
.analytics-col { flex: 1 1 440px; min-width: 0; }
@media (min-width: 1000px) {
  .analytics-two-col > .analytics-col + .analytics-col { border-left: 1px solid #e4e9f0; padding-left: 34px; }
}

/* ---------- 小年识别校对（#panel-vision）顶部筛选栏 ----------
   这一栏要锁死三件事，缺一条刷新按钮就会被挤成上下两行：
   ① 筛选控件按内容定宽、不参与压缩（button 左右内边距共 36px，"刷新"两字要 26px，
      整栏可用宽一旦小于内容总宽，被压缩的是按钮而不是控件，按钮高就从 37px 变 56px）；
   ② 刷新按钮永不压缩、永不换行；
   ③ 右侧统计文字吃掉剩余宽度，放不下时整块换到下一行，而不是去挤压按钮。 */
#panel-vision > .row { flex-wrap: wrap; }
#panel-vision > .row > .inline-label { flex: 0 0 auto; }
#panel-vision > .row .inline-label select { width: auto; max-width: 220px; }
#panel-vision > .row .inline-label input { min-width: 0; width: 150px; }
#panel-vision > .row > #vision-refresh { flex: 0 0 auto; white-space: nowrap; }
#panel-vision > .row > #vision-meta { flex: 1 1 320px; min-width: 220px; }
/* xdn-vision-filter-lock */

/* ---------- 小年识别校对（#panel-vision）顶部筛选栏 ----------
   这一栏要锁死三件事，缺一条刷新按钮就会被挤成上下两行：
   ① 筛选控件按内容定宽、不参与压缩（button 左右内边距共 36px，"刷新"两字要 26px，
      整栏可用宽一旦小于内容总宽，被压缩的是按钮而不是控件，按钮高就从 37px 变 56px）；
   ② 刷新按钮永不压缩、永不换行；
   ③ 右侧统计文字吃掉剩余宽度，放不下时整块换到下一行，而不是去挤压按钮。 */
#panel-vision > .row { flex-wrap: wrap; }
#panel-vision > .row > .inline-label { flex: 0 0 auto; }
#panel-vision > .row .inline-label select { width: auto; max-width: 220px; }
#panel-vision > .row .inline-label input { min-width: 0; width: 150px; }
#panel-vision > .row > #vision-refresh { flex: 0 0 auto; white-space: nowrap; }
#panel-vision > .row > #vision-meta { flex: 1 1 320px; min-width: 220px; }
/* xdn-vision-filter-lock */

/* ---------- 小年管家 ›「小年管家识别校对」顶部筛选栏（xdn-butler-vision-filter-lock） ----------
   这一屏是照「小年识别校对」复刻的，复刻时漏了防按钮挤成竖排的那三条，刷新按钮又变成上下两行
   （button 左右内边距共 36px，「刷新」两字要 26px，整栏不够宽时被压的是按钮）。三条缺一条都会复发：
   ① 筛选控件按内容定宽、不参与压缩；② 刷新按钮永不压缩永不换行；
   ③ 右侧统计文字吃掉剩余宽度、放不下时整块换下一行（只给 flex:1 1 auto 无效，
      中文 min-content ≈ 1 字宽，它永远不换行、只会自己竖成一列）。只在本屏作用域内改，不动全局 .row */
#butler-tab-vision > .row { flex-wrap: wrap; }
#butler-tab-vision > .row > .inline-label { flex: 0 0 auto; }
#butler-tab-vision > .row .inline-label select { width: auto; max-width: 220px; }
#butler-tab-vision > .row .inline-label input { min-width: 0; width: 150px; }
#butler-tab-vision > .row > #butler-vision-refresh { flex: 0 0 auto; white-space: nowrap; }
#butler-tab-vision > .row > #butler-vision-meta { flex: 1 1 320px; min-width: 220px; }
/* xdn-butler-vision-filter-lock */

/* ── 功能图标配置页（2026-10-28）：这一页自带一套 .fn-icon-* 样式 ──
   原先复用 .chat-icon-*，那套类随「跟小年管家聊天」卡被删后线上已不存在，
   预览框变成没有宽高的空 div —— 运营看不见"现在长什么样"就没法对照换图。 */
/* 分组页签这一排钉住了（2026-10-30 用户要求"往下翻一下就不见了，很难找"）。
   容器 .panel-pin 自带条内上内边距与条底呼吸，这里必须把 .agent-tabs 自带的 12/14 上下外边距归零
   （口径照 .agents-sticky .agent-tabs 与 .users-pin .agent-tabs），否则两条缝叠加、下外边距还会折出去顶到下一条 */
.fn-groups-pin .agent-tabs { margin: 0; }
/* 容器里没有页签时（格子清单没读到的错误态）整条隐藏，别留一条只有内边距的空白带；
   隐藏后 offsetHeight 为 0，syncPinOffsets 会自动跳过这一条 */
.fn-groups-pin:empty { display: none; }
.fn-icon-spec { background: #f7faff; border: 1px solid #d8e6fb; border-radius: 10px; padding: 8px 12px; margin: 0 0 10px; color: #323f4b; line-height: 1.55; font-size: 13px; }
.fn-icon-spec b { color: #1d4f91; font-size: 13px; }
.fn-icon-spec ul { margin: 3px 0 0; padding-left: 18px; display: grid; grid-template-columns: repeat(auto-fit, minmax(640px, 1fr)); column-gap: 26px; row-gap: 1px; align-items: start; }
/* 五条规格竖排要占五行、每行还带 1.8 行高（用户原话"给我省一点空间"）。改成两列并排：
   格式在左、尺寸在右，体积在左、画法在右，最后一条自己占一列。
   列宽下限 640px 走 auto-fit：实测只有两条 640px 真放得下时并排才省高度（1896 视口省 46px），
   窗口再窄就自动退回单列——1440 视口下并排会让每条各挤两行、等于白干，退回单列反而省 24px */
.fn-icon-spec li { display: list-item; }
/* 最后一条自己占一列会在右下留一个空洞，跨两列铺满，两列下边缘才齐（用户原话"对齐一下，左右对齐"） */
.fn-icon-spec li:last-child { grid-column: 1 / -1; }
.fn-icon-slot { min-width: 0; background: #fff; border: 1px solid #e4e9f0; border-radius: 12px; padding: 12px 14px; margin: 0 0 12px; box-shadow: 0 1px 4px rgba(31,41,51,.05); }
.fn-icon-slot-head h4 { margin: 0 0 3px; font-size: 14px; color: #1f2933; }
/* 卡片顶部只这一行规格（2026-10-30 用户裁决"不需要写那么多话"）：格式 · 建议像素 · 上限 · 显示尺寸 */
.fn-icon-slot-spec { font-size: 12px; line-height: 1.5; color: #6b7280; }
.fn-icon-slot-body { display: flex; flex-direction: row; align-items: flex-start; gap: 10px; margin-top: 10px; padding-top: 10px; border-top: 1px dashed #e4e9f0; }
.fn-icon-slot-info { flex: 1 1 auto; min-width: 0; }
/* 预览框：透明棋盘格，"现在长这样"和"已换成的新图"都画在这里。
   96px 是"一行一卡"那阵子的尺寸，一行四卡以后太占地方（用户原话"图标和文字都搞得太大了"），收到 64px */
.fn-icon-preview { flex: 0 0 auto; width: 64px; height: 64px; border: 1px dashed #b9c6d6; border-radius: 10px; display: flex; align-items: center; justify-content: center; overflow: hidden; background-color: #f8fafc; background-image: linear-gradient(45deg, #e9edf3 25%, transparent 25%), linear-gradient(-45deg, #e9edf3 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #e9edf3 75%), linear-gradient(-45deg, transparent 75%, #e9edf3 75%); background-size: 12px 12px; background-position: 0 0, 0 6px, 6px -6px, -6px 0; }
.fn-icon-thumb { width: 60px; height: 60px; object-fit: contain; }
/* 现在是一个字符/表情时，把它放大画在框里，让人一眼看见"原来是这个" */
.fn-icon-default { width: 46px; height: 46px; border-radius: 12px; background: #eaf2ff; color: #1d4f91; display: flex; align-items: center; justify-content: center; font-size: 26px; line-height: 1; font-weight: 600; }
.fn-icon-meta { min-height: 18px; font-size: 12px; line-height: 1.5; color: #52606d; overflow-wrap: anywhere; }
.fn-icon-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 6px; }
.fn-icon-actions button { padding: 5px 12px; font-size: 12px; }
.fn-icon-actions .muted { flex-basis: 100%; font-size: 12px; line-height: 1.5; }
/* 2026-10-29 用户裁决：功能图标这一页每格整行堆一列，内容不多却要翻很久——改一行三列。
   2026-10-30 用户再裁决：三列改四列，且同一行卡片高度必须统一（"第一个最高、中间最低、右边第二低，都不统一"）。
   等高的正解＝grid 用 align-items: stretch（原先写 start，每张卡才各自按内容缩着）＋卡片撑满所在格、
   内部按列排，档位区吃掉剩余高度。窄屏逐级退回三列、两列、一列。 */
.fn-icon-body { margin-top: 6px; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; align-items: stretch; }
.fn-icon-body > h3 { grid-column: 1 / -1; margin: 0; }
.fn-icon-body .fn-icon-slot { margin: 0; height: 100%; display: flex; flex-direction: column; }
.fn-icon-body .fn-icon-variants { flex: 1 1 auto; }
.fn-icon-body .fn-icon-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (max-width: 1700px) { .fn-icon-body { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 1500px) { .fn-icon-body { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 1050px) { .fn-icon-body { grid-template-columns: minmax(0, 1fr); } }
.fn-icon-label { display: block; margin-top: 10px; font-size: 13px; }
.fn-icon-label input[type=text] { display: block; width: 100%; max-width: 520px; margin-top: 4px; }

/* 功能图标：一格内的状态档位并排成列（2026-10-29 用户裁决，"一列往下翻太久、右边空着"）。
   列数由 .fn-icon-cols-N 给，N＝这一格实际有几档（全库只有 1 / 2 / 4 档）。
   格子内部仍是"预览在左、文字与按钮在右"，所以四列时每列约 450px、放得下两颗按钮；
   窗口窄下来逐级退回两列、单列，不靠 JS 量宽度。 */
.fn-icon-variants { display: grid; gap: 0 18px; align-items: start; }
.fn-icon-cols-1 { grid-template-columns: minmax(0, 1fr); }
.fn-icon-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.fn-icon-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 1500px) { .fn-icon-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 980px) { .fn-icon-cols-2, .fn-icon-cols-4 { grid-template-columns: minmax(0, 1fr); } }

/* ---------- 22 套作品资料收集 · 可编辑任务配置控制台（2026-10-29） ---------- */
.archive-console { display: flex; flex-direction: column; gap: 10px; margin: 10px 0 24px; }
.arc-cat { background: #fff; border-radius: 10px; box-shadow: 0 1px 4px rgba(31,41,51,.06); overflow: hidden; }
.arc-cat-head { width: 100%; display: flex; align-items: center; gap: 10px; padding: 12px 14px; background: #fff; border: 0; border-bottom: 1px solid #eef1f5; cursor: pointer; font-size: 15px; color: #1f2933; text-align: left; }
.arc-cat-head:hover { background: #f7f9fc; }
.arc-caret { width: 14px; flex: 0 0 14px; color: #616e7c; }
.arc-cat-title { flex: 1; font-weight: 600; }
.arc-cat-count { flex: 0 0 auto; font-size: 12px; color: #616e7c; }
.arc-cat-body { padding: 4px 12px 12px; }
.arc-table { margin-top: 8px; }
/* 资料上传进度表是「一个页签下十几张小表」，每张几行到十几行，表头吸顶本来就没意义；
   而 .table thead th 的 sticky top 吃的是全站 --pin-top（这一屏等于钉顶条高度，80px 起），
   表头自然位置比那个值更靠上，浏览器就把它整行往下推到第一行数据之后——
   2026-10-30 用户看到的就是「表头跑到了『本人近照』下面」，22 个页签默认展开的首个分类全中招。
   这里把吸顶关掉，表头老老实实待在表格第一行；分隔线仍由 box-shadow 承担。 */
.arc-table thead th { position: static; }
.arc-table th, .arc-table td { vertical-align: top; }
.arc-table th:nth-child(1), .arc-table td:nth-child(1) { width: 92px; }
.arc-table th:nth-child(3), .arc-table td:nth-child(3) { width: 96px; }
.arc-table th:nth-child(5), .arc-table td:nth-child(5) { width: 160px; }
.arc-table th:nth-child(6), .arc-table td:nth-child(6) { width: 84px; }
.arc-input, .arc-select, .arc-textarea { width: 100%; box-sizing: border-box; }
.arc-textarea { min-height: 54px; resize: vertical; font-family: inherit; font-size: 13px; line-height: 1.5; }
.arc-count { width: 64px; box-sizing: border-box; }
.arc-sub { font-size: 11px; color: #9aa5b1; margin-top: 3px; }
.arc-badge { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 12px; white-space: nowrap; }
.arc-badge.arc-uploaded { background: #e6f6ec; color: #046c4e; }
.arc-badge.arc-missing { background: #fdeceb; color: #b42318; }
.arc-badge.arc-hidden { background: #f1f3f5; color: #616e7c; }
.arc-type { display: inline-block; padding: 2px 8px; border-radius: 6px; background: #eef2f8; color: #2c3e50; font-size: 12px; }
.arc-uploaded-count { font-size: 12px; color: #616e7c; }
.arc-ignored { background: #fff9e8; border: 1px solid #ffe3a3; border-radius: 10px; padding: 10px 14px; }
.arc-ignored p { margin: 0; font-size: 13px; line-height: 1.6; }
.arc-ignored-toggle { margin-top: 8px; }
.arc-ignored-list { margin: 6px 0 0; padding-left: 20px; font-size: 13px; color: #616e7c; line-height: 1.7; }
.arc-output-wrap { margin: 10px 0 24px; }
.arc-output { background: #0f172a; color: #e2e8f0; border-radius: 10px; padding: 14px; white-space: pre-wrap; word-break: break-word; font-size: 13px; line-height: 1.7; margin: 8px 0 0; }
.stat-card.wide strong { font-size: 15px; line-height: 1.5; }
/* 窄窗口兜底：表格横向滚动、工具栏按钮不压缩换行、概览卡最小可读宽度（2026-10-29） */
.arc-table-wrap { overflow-x: auto; }
.arc-table { min-width: 960px; }
#archive-console-overview { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
#panel-archive-template > .row > button,
#panel-archive-template > .row > .inline-label { flex: 0 0 auto; white-space: nowrap; }
#panel-archive-template > .row > #archive-template-meta { flex: 1 1 240px; min-width: 200px; }

/* 人生槽位面板（2026-10-29） */
.arc-slots { background: #fff; border-radius: 10px; box-shadow: 0 1px 4px rgba(31,41,51,.06); overflow: hidden; margin: 10px 0; }
.arc-slot-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px dashed #eef1f5; }
.arc-slot-row:last-child { border-bottom: 0; }
.arc-slot-question { flex: 1 1 auto; min-width: 260px; font-size: 13px; line-height: 1.6; }
.arc-slot-path { flex: 0 0 auto; font-family: Consolas, monospace; font-size: 12px; color: #2c3e50; background: #eef2f8; padding: 2px 8px; border-radius: 6px; }
.arc-slot-value { flex: 0 0 auto; font-size: 13px; color: #046c4e; }
.arc-slot-row .arc-select { flex: 0 0 160px; }
.arc-slot-row .arc-input { flex: 0 0 160px; }

/* 价格文字（2026-10-30 用户裁决）：金额是灰块点不动，其余的字是可编辑输入框，宽度跟着字数走 */

/* 页面说明收纳（2026-10-30 用户裁决）：各页顶部那几段超长说明默认收起，只留一颗「使用说明」按钮。
   形态照审核台已有的 .audit-rules（撑满整行、右端展开/收起），按钮再给一层浅蓝底，一眼看得出能点。 */
.page-help { margin: 0 0 10px; border: 1px solid #d7e3f6; border-radius: 10px; background: #fff; overflow: hidden; }
.page-help-toggle { width: 100%; text-align: left; padding: 7px 14px; border: 0; background: #e8f0fe; color: #1d4ed8; font-size: 13px; font-weight: 600; font-family: inherit; display: flex; justify-content: space-between; align-items: center; gap: 10px; cursor: pointer; }
.page-help-toggle:hover { background: #dbe7fd; }
.page-help-arrow { font-weight: 400; font-size: 12px; color: #2563eb; }
.page-help-body { padding: 12px 14px 14px; }
.page-help-body > p.muted { color: #33415c; font-size: 12.5px; line-height: 1.85; }

/* 用户列表（2026-10-30 用户裁决）：页签行挪到页面最顶部并单独钉住，「刷新 / 导出」一行与汇总卡挪到它下面；
   筛选栏不再单独吸顶——原先两条钉顶条叠着、条高随接口数据变化，滚动时会来回跳，只留一条就贴死了。 */
.users-pin .agent-tabs { margin: 0; }
.users-filter-actions { display: flex; flex-direction: row; align-items: center; gap: 8px; margin-left: auto; }

.empty-cell { text-align: center; color: #9aa5b1; font-size: 13px; padding: 30px 0; }

/* 折叠条一套（2026-10-30 用户裁决）：审核规则与使用说明同外观，同页出现两条也不打架 */
.audit-rules { margin: 10px 0 14px; border: 1px solid #d7e3f6; border-radius: 10px; background: #fff; overflow: hidden; }
.audit-rules-toggle { width: 100%; text-align: left; padding: 10px 14px; border: 0; background: #e8f0fe; color: #1d4ed8; font-size: 13px; font-weight: 600; font-family: inherit; display: flex; justify-content: space-between; align-items: center; gap: 10px; cursor: pointer; }
.audit-rules-toggle:hover { background: #dbe7fd; }
.audit-rules-arrow { font-weight: 400; font-size: 12px; color: #2563eb; }
.audit-rules-body { padding: 12px 14px 14px; }

/* 侧栏分组小标题（2026-10-30）：13 项平铺太长，按业务域分 5 组，文字小而灰、不与菜单项抢眼 */
.side-sub-title { padding: 12px 12px 5px; font-size: 14px; font-weight: 700; color: #1f2d3d; letter-spacing: .3px; }
.side-sub-title:first-child { padding-top: 2px; }

/* 首页价目表：入口归属下拉与增减档位（2026-10-30）*/
.service-door-field { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: #1f2933; margin-bottom: 0; }
.service-door-field select { padding: 6px 10px; border: 1px solid #cbd2d9; border-radius: 8px; font-size: 13px; font-family: inherit; background: #fff; color: #1f2933; max-width: 240px; }
.service-entry-add { display: block; margin: 0 0 12px; padding: 7px 16px; border: 1px dashed #2563eb; border-radius: 999px; background: #fff; color: #2563eb; font-size: 13px; cursor: pointer; }
.service-entry-remove { margin-top: 10px; padding: 5px 12px; border: 1px solid #e3b4b4; border-radius: 8px; background: #fff; color: #c81e1e; font-size: 12.5px; cursor: pointer; }

/* 开票台账（2026-10-31）：与订单同页，靠一道分隔线分开；代录表单与行内编辑两列排，窄屏退一列。
   只借现成色板，不新造颜色；表格本身继续吃 .table 与全站通用的列宽拖拽。 */
.invoice-block { margin-top: 0; padding-top: 0; border-top: 0; }
.invoice-title { margin: 0 0 10px; font-size: 16px; font-weight: 700; color: #1f2933; }
.invoice-filter-row { align-items: flex-end; }
.invoice-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 18px; margin: 12px 0 14px; padding: 14px 16px; background: #fcfdff; border: 1px solid #e4e9f0; border-radius: 10px; }
.invoice-form label { margin-bottom: 10px; }
.invoice-form input, .invoice-form select, .invoice-form textarea { width: 100%; box-sizing: border-box; }
.invoice-edit-head { grid-column: 1 / -1; font-size: 13px; font-weight: 700; color: #323f4b; margin-bottom: 6px; }
@media (max-width: 980px) { .invoice-form { grid-template-columns: minmax(0, 1fr); } }

/* 开发票：行内两颗按钮之间留白（审核通过 · 更新） */
#invoice-table td button + button { margin-left: 8px; }

/* 开票渠道（2026-11-01）：页签与全站一套外观；放进吸顶条必须归零自带的上下外边距
   （口径同 .quote-pin / .users-pin / .fn-groups-pin，否则与条内边距叠加、还会折出去顶到下一条） */
.panel-pin .agent-tabs { margin: 0; }
.invoice-channel-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 12px 20px; margin-bottom: 6px; }
.invoice-channel-grid > label { display: flex; flex-direction: column; gap: 6px; font-size: 13px; color: #323f4b; }
.invoice-channel-grid > label.invoice-channel-check { flex-direction: row; align-items: center; gap: 8px; font-size: 14px; }
.invoice-channel-grid input[type="text"], .invoice-channel-grid input[type="email"] { width: 100%; box-sizing: border-box; }
.invoice-channel-sub { font-size: 14px; font-weight: 700; color: #323f4b; margin: 20px 0 10px; }
.invoice-channel-missing { background: #fff4e5; border: 1px solid #f0c48a; color: #8a4b08; padding: 10px 14px; border-radius: 6px; margin-bottom: 14px; font-size: 14px; line-height: 1.7; }
/* 对照表里的输入框要撑满格子：19 位税收分类编码填一半看不见后半截，错了也没人发现 */
#invch-goods-table input { width: 100%; box-sizing: border-box; }
/* 一行最多五颗按钮：换行时要有上下呼吸，不能贴成一坨 */
#invoice-table td button { margin-top: 2px; margin-bottom: 2px; }

/* xdn-review-filter-lock · 2026-11-01 用户点名：素材初审那颗「刷新」被右侧长统计挤成一竖行，难看。
   三条锁死（与 xdn-vision-filter-lock 同一套）：控件不抢宽、按钮不折行且字改小一号、统计整块可换行。 */
#review-tab-draft .row,
#review-tab-final .row,
#review-tab-progress .row { flex-wrap: wrap; }
#review-tab-draft .row > .inline-label,
#review-tab-final .row > .inline-label { flex: 0 1 auto; min-width: 0; }
#review-tab-draft .row .inline-label select,
#review-tab-final .row .inline-label select { width: auto; max-width: 230px; }
#review-tab-draft .row > button,
#review-tab-final .row > button,
#review-tab-progress .row > button { flex: 0 0 auto; white-space: nowrap; height: 30px; padding: 0 12px; font-size: 12px; }
#review-tab-draft .row > .muted,
#review-tab-final .row > .muted,
#review-tab-progress .row > .muted { flex: 1 1 260px; min-width: 0; font-size: 12px; line-height: 1.5; }

/* 重复与待确认（2026-11-03）：并进素材初审的作品详情下方，只标注、不删素材 */
#review-dup-wrap { margin-top: 16px; }
#dup-check-table { width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0; }
#dup-check-table td.dup-text { word-break: break-all; }
#dup-check-table .dup-detail-cell { background: #f8fafc; padding: 10px 12px; }
#dup-check-table .dup-verdict { margin: 0 6px 0 0; }
#dup-check-table .dup-verdict.active { background: #2563eb; border-color: #2563eb; color: #fff; }
