/* ============================================================
 * GVA Admin — 业务局部样式（layuiAdmin 之外的最小补丁）。
 * Chrome / 顶栏 / 侧栏 / 主题 全由 /static/adminui/adminui/dist/css/admin.css
 * 接管，本文件不再覆盖任何 .layui-layout-admin / .layui-side / .layui-header。
 * ============================================================ */

/* ---------- 子页 iframe body 边距 ----------
   子页 (layouts/base.gohtml) <body class="gva-iframe-page"> 是独立 document，
   原本紧贴 iframe 边沿。给 .gva-content 留 14px 内边距，避免 layui-card 直接
   贴 iframe 滚动条；同时给 body 一个浅灰底，避免内容短时露出白边。
   各主题可在 themes/*.css 里覆盖 body bg。 */
body.gva-iframe-page {
  margin: 0;
  background: #f2f3f5;
}
.gva-iframe-page .gva-content {
  padding: 14px;
  box-sizing: border-box;
}
/* 卡片之间统一上间距（业务模板里有些没写 margin-top） */
.gva-iframe-page .gva-content > .layui-card + .layui-card,
.gva-iframe-page .gva-content > .layui-row + .layui-card,
.gva-iframe-page .gva-content > .layui-card + .layui-row {
  margin-top: 12px;
}

/* ---------- 通用辅助文案 ---------- */
.layui-word-aux-12 { color: #909399; font-size: 12px; }
.layui-word-aux-11 { color: #909399; font-size: 11px; }
/* 空数据态：自有静态表 .layui-empty-row 与 layui.table 渲染的 .layui-none
   统一——居中弱化文字 + 上方一个淡图标（layui-icon-survey \e6b2），
   比纯灰字更"完成"。图标用 iconfont ::before，不引外部资源。 */
.layui-empty-row,
.layui-table-view .layui-none {
  text-align: center;
  color: #a6abb3;
  padding: 48px 0;
  font-size: 13px;
}
.layui-empty-row::before,
.layui-table-view .layui-none::before {
  content: "\e6b2";
  font-family: 'layui-icon' !important;
  display: block;
  font-size: 44px;
  line-height: 1;
  color: #dfe2e7;
  margin-bottom: 10px;
}

/* ---------- 列表主表最低高度（防加载抖动） ----------
   renderOpts 未设 height → layui 让表体随内容收缩；首屏/翻页/重载的瞬间
   表体高度≈0，分页条直接贴到列头下方，数据回来后整块又往下跳一截。
   给「列表页主表体」一个适度最低高度撑住加载态，布局不抖；高度取 260px，
   够放空数据提示又不至于撑出浏览器滚动条。
   作用域严格限定 .gva-content 内 .layui-card-body 的直接 table-view —
   弹层 / 选择器(.layui-layer 内) 的小表不受影响。
   只命中 .layui-table-main（中间滚动体），左右固定列体不动，避免错位。
   注意：不可用 flex 居中 .layui-table-main —— 该体内层 table 宽度=所有列宽
   之和，常宽于视口，flex 会把「暂无数据」按超宽内容居中而跑到视口右侧。
   layui 的 .layui-none 本身 width=容器宽 + text-align:center，已在视口内居中。 */
.gva-content .layui-card-body > .layui-table-view .layui-table-body.layui-table-main {
  min-height: 480px;
}
/* 无数据时（done 回调按本页实际渲染行数为 0 打 .biz-table-empty）：
   隐藏吸底分页条，空表不再拖一条空的分页框。 */
.gva-content .layui-card-body > .layui-table-view.biz-table-empty .layui-table-page {
  display: none;
}

/* ---------- 过滤条网格 ----------
   simple_list.gohtml 的搜索卡片现在用 layui-row + layui-col-* 排列：
     .biz-filter-grid  → 外层 layui-row 容器
     .biz-filter-cell  → 每个 filter（已带 layui-col-xs12 / sm6 / md4 / xl3）
     .biz-filter-cell > label + .biz-filter-control（flex 左右对齐）
   保证：
     - 每行各 filter 同高同行，上下对齐
     - 输入控件随列宽自适应
     - daterange / numrange 占双倍宽（md6 / xl6）
*/
.biz-filter-grid { margin-bottom: 8px; }
.biz-filter-cell {
  display: flex;
  align-items: center;
  padding-bottom: 10px;
}
.biz-filter-cell > .layui-form-label {
  flex: 0 0 78px;
  width: 78px;
  min-width: 0;
  padding: 0 8px 0 0;
  text-align: right;
  font-size: 13px;
  line-height: 34px;
  height: 34px;
}
.biz-filter-cell > .biz-filter-control {
  flex: 1;
  min-width: 0;
  position: relative;
}
.biz-filter-cell > .biz-filter-control .layui-input,
.biz-filter-cell > .biz-filter-control select,
.biz-filter-cell > .biz-filter-control .layui-select-title input {
  width: 100%;
}
/* 操作按钮单独一行，右对齐 */
.biz-filter-actions {
  text-align: right;
  margin-top: 4px;
  padding-top: 8px;
  border-top: 1px dashed #ebeef5;
  clear: both;
}
.biz-filter-actions .layui-btn + .layui-btn { margin-left: 8px; }
/* 紧跟在折叠开关之后时，操作行不再画虚线（折叠开关自带左右两条灰线，重复了） */
.biz-filter-collapse + .biz-filter-actions {
  border-top: 0;
  padding-top: 4px;
  margin-top: 0;
}
/* 展开/收起 toggle —— 独占一行，居中 */
.biz-filter-collapse {
  text-align: center;
  margin-top: 6px;
  padding: 2px 0;
  position: relative;
}
.biz-filter-collapse::before,
.biz-filter-collapse::after {
  content: '';
  position: absolute;
  top: 50%;
  width: calc(50% - 50px);
  height: 1px;
  background: #ebeef5;
}
.biz-filter-collapse::before { left: 0; }
.biz-filter-collapse::after { right: 0; }
.biz-filter-toggle {
  display: inline-block;
  position: relative;
  padding: 2px 12px;
  background: #fff;
  color: #909399;
  font-size: 13px;
  line-height: 22px;
  text-decoration: none;
  cursor: pointer;
  border-radius: 12px;
  transition: color .15s;
}
.biz-filter-toggle:hover { color: #1e9fff; }
.biz-filter-toggle .layui-icon { font-size: 14px; margin-right: 4px; vertical-align: middle; }

/* 收起态：响应式按列数截断到「约 2 行」高度 */
@media (min-width: 1200px) {
  /* xl: 普通 cell 占 col-xl3（4 列/行），2 行 = 8 个 */
  .biz-filter-grid.is-collapsed > .biz-filter-cell:nth-child(n+9) { display: none; }
}
@media (min-width: 992px) and (max-width: 1199.98px) {
  /* md: 普通 cell 占 col-md4（3 列/行），2 行 = 6 个 */
  .biz-filter-grid.is-collapsed > .biz-filter-cell:nth-child(n+7) { display: none; }
}
@media (min-width: 768px) and (max-width: 991.98px) {
  /* sm: 2 列/行，2 行 = 4 个 */
  .biz-filter-grid.is-collapsed > .biz-filter-cell:nth-child(n+5) { display: none; }
}
@media (max-width: 767.98px) {
  /* xs: 1 列/行，2 行 = 2 个 */
  .biz-filter-grid.is-collapsed > .biz-filter-cell:nth-child(n+3) { display: none; }
}

/* 窄屏：label 左对齐避免文字被截 */
@media (max-width: 768px) {
  .biz-filter-cell > .layui-form-label { text-align: left; }
}

/* ---------- 批量操作工具条（贴在表格左上角） ----------
   simple_list.gohtml：BatchOps 不再混在主工具栏，单独放在表格卡片内部、表格上方。
   按钮在上、"已选 N 行"小字在下，靠左对齐。 */
.biz-batch-toolbar {
  padding: 10px 16px 8px;
  border-bottom: 1px solid #ebeef5;
  background: #fff;
}
/* 窄屏自动换行（按钮组内仍 nowrap 整体不被拆开） */
.biz-batch-toolbar-actions {
  display: flex !important;
  flex-wrap: wrap !important;
  align-items: center;
  gap: 8px 12px;
  margin-bottom: 4px;
}
/* 直接子项不允许被挤压 */
.biz-batch-toolbar-actions > .layui-btn,
.biz-batch-toolbar-actions > .layui-btn-group {
  margin: 0 !important;
  flex: 0 0 auto !important;
  flex-shrink: 0 !important;
  white-space: nowrap !important;
  vertical-align: middle;
}
/* 组内按钮也不允许换行 / 缩小 */
.biz-batch-toolbar-actions > .layui-btn-group {
  display: inline-flex !important;
  flex-wrap: nowrap !important;
}
.biz-batch-toolbar-actions > .layui-btn-group > .layui-btn {
  margin: 0 !important;
  flex: 0 0 auto !important;
  flex-shrink: 0 !important;
  white-space: nowrap !important;
}
.biz-batch-toolbar-selected {
  font-size: 12px;
  color: #909399;
  line-height: 1.4;
}
.biz-batch-toolbar-selected #biz-selected-count { font-weight: 500; }

/* ---------- 含图片的 cell：撑高、垂直对齐、允许多图换行 ----------
   单元格高度自适应由下方通用 .layui-table-cell 规则统一处理；这里只额外
   把含 .biz-img-thumb 的 cell 拉到 min-height 56px + flex 居中，让 40×40
   缩略图四周有 padding 不贴边。多图列（imgs 数组）也走这条规则换行排列。
   :has() 选择器 Chrome 105+/Safari 15.4+/Firefox 121+ 支持，老浏览器退化到
   纯文本对齐显示。 */
.layui-table-view .layui-table-cell:has(.biz-img-thumb),
.layui-table-view .layui-table-cell:has(img.biz-img-thumb) {
  height: auto !important;
  min-height: 56px;
  padding-top: 8px !important;
  padding-bottom: 8px !important;
  display: flex !important;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px;
  white-space: normal;
}
/* 多图列 imgs（数组）— 允许换行排列 */
.biz-img-thumb { vertical-align: middle; }

/* ---------- 业务列表表格（stats/page.gohtml 静态表） ---------- */
.biz-list-table { table-layout: auto; }
.biz-list-table th,
.biz-list-table td { white-space: normal; vertical-align: middle; word-break: break-word; }
.biz-list-table .biz-img-thumb { display: inline-block; }

/* ---------- 表格内容完整展示（不再 nowrap + ellipsis，按列宽自动换行） ----------
   原本 .layui-table td 强制 nowrap+ellipsis+悬停 title，长名称必须 hover 才能看全；
   现在让 cell 内容按列宽换行，长字符串（hex ID、URL、备注）也整段展示。 */

/* layui 默认 .layui-table-cell { height: 28px; overflow: hidden; padding: 0 15px; white-space: nowrap }
   —— 全部解除，让单元格按内容自适应高度且允许文字换行。
   syncFixedRowHeight 会把同一行所有 cell 拉到一致高度。
   text-overflow 与 overflow:visible 互斥不写；K-V 多行列由下方独立规则负责 ellipsis。 */
.layui-table-view .layui-table-cell {
  height: auto !important;
  min-height: 36px;
  line-height: 1.6;
  padding-top: 8px;
  padding-bottom: 8px;
  white-space: normal !important;
  word-break: break-word;
}

/* 表头单元格保持单行：上面的 white-space:normal 会让可排序列的排序三角
   （layui-table-sort）掉到标题下一行换行。表头恢复 nowrap + 排序图标与
   标题同行，并收紧左右内边距让窄列（点击/点赞/收藏 等 60~70px）放得下。 */
.layui-table-view .layui-table-header .layui-table-cell {
  white-space: nowrap !important;
  word-break: keep-all !important;
  padding-left: 8px !important;
  padding-right: 8px !important;
}
.layui-table-view .layui-table-header .layui-table-cell .layui-table-sort {
  display: inline-block;
  vertical-align: middle;
  width: 10px;
  margin-left: 2px;
}

/* 业务文本包装类 — 默认 inline，跟随父级（cell 或 K-V 内层 div）的 white-space。
   单值列：父级 cell 是 white-space: normal → 内容按列宽自动换行。
   K-V 多行列：父级 inner div 是 white-space: nowrap → 内容单行 + ellipsis。
   span 自身不再 inline-block 撑宽度，避免在窄列里被自己的 max-width 推出列边界。 */
.biz-list-table td .biz-cell-text,
.biz-cell-text {
  display: inline;
  word-break: break-word;
  vertical-align: middle;
}

/* 列表模糊筛选命中关键字高亮（标题/内容列 Highlight:true）。 */
.biz-hl {
  background: #fff3a0;
  color: #d4380d;
  padding: 0 1px;
  border-radius: 2px;
  font-weight: 600;
}

/* td 不再强制 max-width / nowrap：让 layui colgroup 的列宽决定 td 宽度。
   原 max-width:300px 会反向把 td 缩到 300，导致 thead/tbody 列宽错位。
   长文本换行展示由 .layui-table-cell 的 word-break 接管。 */
.layui-table td:has(.layui-form-checkbox),
.layui-table td:has(input[type="checkbox"]) {
  vertical-align: middle;
}

/* 多行 K-V 列：内层「label + value」一行 — 超出列宽用 ellipsis 截断；
   value 上的 .biz-cell-text 已带 title="<原值>"，hover 显示全文。
   旧选择器 `.layui-table td > div[..]` 没匹配上 — 实际结构多一层
   `.layui-table-cell`，这里改写匹配后者。 */
.layui-table-view .layui-table-body .layui-table-cell > div[style*="line-height"] {
  max-width: 100%;
}
.layui-table-view .layui-table-body .layui-table-cell > div[style*="line-height"] > div {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 100%;
}
/* 操作列（最后一列）不截断，按钮想几个有几个 */
.layui-table tr td:last-child {
  max-width: none;
  overflow: visible;
  white-space: nowrap;
}
/* 操作列（最后一列）保持按钮不换行的子元素行为 */
.layui-table tr td:last-child .layui-table-cell {
  white-space: normal !important;
}

/* 复选框 cell 保留 layui 默认尺寸，不参与上方 cell 自适应。 */
.layui-table-view .layui-table-body .laytable-cell-checkbox {
  height: 30px !important;
  min-height: 0;
}

/* 数值范围过滤：[min] - [max] 在一行内排齐
   simple_list.gohtml 输出 .biz-numrange-block 容器内两个 .layui-input + 一个分隔 span。
   layui .layui-input 默认 width:100% block，会导致换行，这里用 flex 把它们挤回一行。 */
.biz-numrange-block {
  display: flex;
  align-items: center;
  gap: 6px;
}
.biz-numrange-block > .layui-input { flex: 1; min-width: 0; }
.biz-numrange-sep { color: #c0c4cc; flex: 0 0 auto; }

/* 固定操作列允许按钮多行均匀排布 */
.layui-table-view td[data-field="__actions"] .layui-table-cell,
.layui-table-view .layui-table-fixed-r td .layui-table-cell {
  white-space: normal !important;
  overflow: visible !important;
  height: auto !important;
  padding: 6px 6px !important;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 4px 6px;
}
.layui-table-view td[data-field="__actions"] .layui-table-cell > a,
.layui-table-view .layui-table-fixed-r td .layui-table-cell > a {
  margin: 0;
}

/* flash 提示由 gva.js 转成 layer toast，先隐藏避免闪烁 */
.gva-flash { display: none; }

/* ---------- 导航箭头风格 ----------
   layui element 模块给可展开的 nav 项自动注入 <span class="layui-nav-more">，
   默认是 CSS 三角。这里按 body 上的开关类替换成 chevron / plus 风格。
   存档：localStorage.gva_nav_arrow（在 shell.gohtml 引导脚本里读写）。 */

/* 关键三步：
   1) 抵消 layui 默认的 transform: rotate(180deg) —— 不然我的两态字符会被反转
   2) 用 descendant 选择器（> a .layui-nav-more）匹配 layui 实际注入的 DOM
   3) 不动 width/height/border：让 layui 自己的位置/font-size 接管，只换 ::before 字符 */
body.nav-arrow-chevron .layui-nav-tree .layui-nav-more,
body.nav-arrow-chevron .layui-nav-tree .layui-nav-itemed > a .layui-nav-more,
body.nav-arrow-plus    .layui-nav-tree .layui-nav-more,
body.nav-arrow-plus    .layui-nav-tree .layui-nav-itemed > a .layui-nav-more {
  transform: none !important;
  border: 0 !important;
  background: transparent !important;
  font-size: 14px !important;
}

/* ::before 通用样式：layui-icon 字体 + 居中 */
body.nav-arrow-chevron .layui-nav-tree .layui-nav-more::before,
body.nav-arrow-plus    .layui-nav-tree .layui-nav-more::before {
  display: inline-block;
  font-family: layui-icon !important;
  font-style: normal;
  font-size: 14px;
  line-height: 1;
  color: inherit;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
}

/* chevron：› 折叠 / ⌄ 展开 */
body.nav-arrow-chevron .layui-nav-tree .layui-nav-more::before {
  content: '\e602';                                /* layui-icon-right */
}
body.nav-arrow-chevron .layui-nav-tree .layui-nav-itemed > a .layui-nav-more::before {
  content: '\e61a';                                /* layui-icon-down */
}

/* plus：+ 折叠 / − 展开 */
body.nav-arrow-plus .layui-nav-tree .layui-nav-more::before {
  content: '\e654';                                /* layui-icon-add-1 */
}
body.nav-arrow-plus .layui-nav-tree .layui-nav-itemed > a .layui-nav-more::before {
  content: '\e67e';                                /* layui-icon-subtraction */
}

/* ---------- 用户头像下拉菜单图标对齐 ----------
   shell.gohtml 顶栏右上角"用户名"展开后的菜单：每项 a 内首个 .layui-icon 固定宽度，
   保证「角色 / 切换 / 修改密码 / 退出」前缀图标列对齐。 */
.gva-user-menu dd a .layui-icon:first-child {
  display: inline-block;
  width: 18px;
  text-align: center;
  margin-right: 4px;
  font-size: 14px;
  color: inherit;
  vertical-align: middle;
}
.gva-user-menu dd a { padding-left: 14px !important; padding-right: 14px !important; }
.gva-user-menu hr { margin: 4px 0; border-color: #ebeef5; }

/* iframe 切换/加载过场 spinner —— shell.gohtml 在每个 tab body 内 append 一个，
   iframe load 事件触发后隐藏。z-index 必须高于 iframe，否则被遮住。 */
.gva-iframe-loading {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 32px;
  height: 32px;
  margin: -16px 0 0 -16px;
  font-size: 32px;
  line-height: 32px;
  color: #16baaa;
  z-index: 10;
  pointer-events: none;
}
.gva-iframe-loading.gva-iframe-loading--hidden { display: none; }

/* ============================================================
   biz-form 双列 / 节内分组 / 折叠文档面板
   - form.biz-form-grid 用 CSS Grid 两列布局
   - .biz-form-half  半行 form-item（占一列）
   - 其它直接子节点（section / 整行 form-item / hidden / 注释）跨两列
   - .biz-form-section 分组横线 + 标题
   - .biz-form-doc / .biz-form-help-html  HelpHTML 折叠面板
   ============================================================ */
.biz-form-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 14px;
  row-gap: 2px;
  align-items: start;
}
/* layui-tab-item 默认 display:none，被 .biz-form-grid 的 display:grid 覆盖会
   导致两个 tab-item 同时显示。这里按 layui-show 状态切换：未激活 tab → none，
   激活 tab → grid。
   注意：layui.css 里 `.layui-show { display:block !important }` 用了 !important，
   会把激活 tab 强制成 display:block，使 grid 两列失效。所以激活态规则也加 !important。 */
.layui-tab-item.biz-form-grid { display: none; }
.layui-tab-item.biz-form-grid.layui-show { display: grid !important; }
.biz-form-grid > .layui-form-item { margin-bottom: 6px; }
.biz-form-grid > .layui-form-item:not(.biz-form-half),
.biz-form-grid > .biz-form-section,
.biz-form-grid > input[type="hidden"] {
  grid-column: 1 / -1;
}
.biz-form-grid > .layui-form-item.biz-form-half {
  grid-column: span 1;
  min-width: 0; /* 让 grid 单元真正约束子元素宽度，避免 textarea/input 溢出 */
}
.biz-form-grid > .layui-form-item.biz-form-half .layui-input-block {
  margin-right: 0;
}
@media (max-width: 720px) {
  .biz-form-grid {
    grid-template-columns: 1fr;
  }
  .biz-form-grid > .layui-form-item.biz-form-half {
    grid-column: 1 / -1;
  }
}

/* 必填字段 label 前的红 * — 对齐 PHP admin.css，layui-form-label 上加
   .layui-form-required 即自动渲染。post/detail.gohtml 等自定义 form 直接复用。 */
.layui-form-required:before {
  content: "*";
  display: inline-block;
  font-family: SimSun;
  margin-right: 4px;
  font-size: 14px;
  line-height: 1;
  color: #ed4014;
}

/* ---------- 图标按钮单选（biz-iconradio：所属板块等）----------
   原生 radio + label 伪装按钮：选择走浏览器原生（必可点、值随 FormData
   提交）；选中高亮用 :has(input:checked)，.on 为 JS 兜底。!important 压过
   layui 对 <button>/<label> 的默认样式，确保选中态肉眼可辨。 */
.biz-iconradio { display: flex; flex-wrap: wrap; gap: 8px; padding-top: 2px; }
.biz-iconradio-btn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font: inherit;
  font-size: 13px;
  line-height: 1;
  padding: 8px 15px;
  border: 1px solid #dcdfe6;
  border-radius: 6px;
  background: #fff;
  color: #5a6472;
  cursor: pointer;
  user-select: none;
  margin: 0;
  transition: color .15s, border-color .15s, background-color .15s;
}
/* 原生 radio 视觉隐藏但仍参与表单提交与 :checked 状态 */
.biz-iconradio-btn > input[type=radio] {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
  margin: 0;
  pointer-events: none;
}
.biz-iconradio-btn .layui-icon { font-size: 15px; color: #a6abb3; transition: color .15s; }
.biz-iconradio-btn:hover {
  border-color: var(--app-primary, #1e9fff);
  color: var(--app-primary, #1e9fff);
}
.biz-iconradio-btn:hover .layui-icon { color: var(--app-primary, #1e9fff); }
.biz-iconradio-btn:has(input[type=radio]:checked),
.biz-iconradio-btn.on {
  border-color: var(--app-primary, #1e9fff) !important;
  background: var(--app-primary, #1e9fff) !important;
  color: #fff !important;
}
.biz-iconradio-btn:has(input[type=radio]:checked) .layui-icon,
.biz-iconradio-btn.on .layui-icon { color: #fff !important; }

/* layui-tab 套在表单内时的样式微调：紧凑些以减少弹窗滚动条。 */
.biz-form-tabs { margin: 0; }
.biz-form-tabs > .layui-tab-content { padding: 10px 0 0; min-height: 0; }
.biz-form-tabs > .layui-tab-content > .layui-tab-item.biz-form-grid { padding: 0; }
/* 折叠的配置说明在收起态尽量贴紧上方 filter 输入框 */
.biz-form-doc { margin-top: 2px; }
.biz-form-doc > summary { padding: 4px 10px; }
/* filter textarea 的 rows=4 在弹窗里偏高，统一一点 */
.biz-form-tabs textarea.layui-textarea { min-height: 72px; }

.biz-form-section {
  position: relative;
  margin: 14px 0 10px;
  height: 1px;
  background: #e8eaec;
  clear: both;
}
.biz-form-section > span {
  position: absolute;
  top: -10px;
  left: 12px;
  padding: 0 8px;
  background: #fff;
  color: #515a6e;
  font-size: 12.5px;
  font-weight: 600;
}

.biz-form-doc {
  border: 1px solid #e8eaec;
  border-radius: 4px;
  background: #fafbfc;
  padding: 0;
  font-size: 12.5px;
  color: #515a6e;
}
.biz-form-doc > summary {
  cursor: pointer;
  padding: 6px 10px;
  color: #2d8cf0;
  list-style: none;
  user-select: none;
}
.biz-form-doc > summary::-webkit-details-marker { display: none; }
.biz-form-doc > summary::before {
  content: "▸ ";
  display: inline-block;
  margin-right: 4px;
  transition: transform 0.15s;
}
.biz-form-doc[open] > summary::before { content: "▾ "; }
.biz-form-doc-body {
  padding: 4px 12px 10px;
  border-top: 1px dashed #e8eaec;
  line-height: 1.7;
}
.biz-form-doc-body p { margin: 6px 0; }
.biz-form-doc-body ul { margin: 4px 0 6px 18px; padding: 0; }
.biz-form-doc-body code {
  background: #eef1f6;
  padding: 0 4px;
  border-radius: 3px;
  font-size: 12px;
  color: #c7254e;
}
.biz-form-doc-table {
  width: 100%;
  border-collapse: collapse;
  margin: 6px 0 8px;
}
.biz-form-doc-table th,
.biz-form-doc-table td {
  border: 1px solid #e8eaec;
  padding: 4px 8px;
  text-align: left;
  font-size: 12px;
}
.biz-form-doc-table th {
  background: #f4f6f9;
  font-weight: 600;
}
.biz-form-doc-code {
  background: #2d3e50;
  color: #e8f0fa;
  padding: 8px 12px;
  border-radius: 3px;
  font-family: Menlo, Consolas, monospace;
  font-size: 12px;
  line-height: 1.6;
  margin: 4px 0 8px;
  overflow-x: auto;
  white-space: pre;
}
.biz-form-doc-note {
  color: #d97706;
  font-size: 12px;
  margin-top: 6px !important;
}

/* 新增/编辑右侧抽屉：从右侧划入动画（layui anim:-1 关掉了内置缩放，这里接管） */
@keyframes bizDrawerIn {
  from { transform: translateX(100%); }
  to   { transform: translateX(0); }
}
.layui-layer.biz-drawer {
  animation: bizDrawerIn 0.26s cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* P0-5 遮罩淡入：抽屉是滑入的，但 layui 黑遮罩硬出现，割裂。
   layui 把目标 opacity 写在行内（默认 ~.3），动画带 forwards 收口到 .35
   统一深度，与抽屉/弹窗同步进场，结束无回跳。reduced-motion 下整体禁用，
   届时回退到 layui 行内 opacity，遮罩照常显示（只是不淡入）。 */
@keyframes gvaShadeIn { from { opacity: 0; } to { opacity: .35; } }
.layui-layer-shade { animation: gvaShadeIn .22s ease both; }

/* A 抽屉/遮罩关闭动画：开有 bizDrawerIn 滑入，关原本 layer.close 瞬断，
   观感不对称。gva.js patch 了 layer.close —— 关闭前给抽屉挂
   .biz-drawer-closing、给遮罩挂 .biz-shade-closing，等 .22s 动画跑完再真正
   销毁 DOM。退出曲线用 ease-in（加速离场），与进场的缓出呼应。 */
@keyframes bizDrawerOut { from { transform: translateX(0); } to { transform: translateX(100%); } }
.layui-layer.biz-drawer.biz-drawer-closing {
  animation: bizDrawerOut .22s cubic-bezier(.55, .06, .68, .19) both;
}
@keyframes gvaShadeOut { from { opacity: .35; } to { opacity: 0; } }
.layui-layer-shade.biz-shade-closing { animation: gvaShadeOut .22s ease both; }

/* 列表分页吸底（JS 驱动 fixed 钉位）：
   长表格滚动时分页条钉在可视区底部，不必滚到最底才看到。
   原 `position:sticky;bottom:0` 在 layuiAdmin iframe 子页里偶发不生效
   （多层滚动上下文 / 浏览器差异），改 JS 按 `.layui-table-view` 是否伸出
   视口下方来切 `.biz-page-pin` —— 见 gva.js bizSetupPagePin。
   pin 时分页条 fixed 在视口底，view 补等高 padding 保证整体高度不变，
   切换瞬间不抖、不会形成"伸缩-翻转"的临界振荡。
   必须高于 layui 固定列 .layui-table-fixed(z-index:101)，否则左右固定列
   的行会盖在吸底分页条上面（中间空白、两侧行透出）。 */
.layui-table-view .layui-table-page {
  background: #fff;
  border-top: 1px solid #ebeef5;
  padding: 7px 14px;
}
.layui-table-view.biz-page-pin {
  padding-bottom: var(--biz-pin-pad, 42px);
}
.layui-table-view.biz-page-pin > .layui-table-page {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 110;
  box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.04);
}
/* layui 默认 laypage select(22px) 与跳页 input(30px) 高度不一致 —— 统一对齐 */
.layui-table-view .layui-table-page .layui-laypage select,
.layui-table-view .layui-table-page .layui-laypage input {
  height: 28px;
  box-sizing: border-box;
  vertical-align: middle;
  border-radius: 2px;
}
.layui-table-view .layui-table-page .layui-laypage select {
  padding: 0 6px;
}
.layui-table-view .layui-table-page .layui-laypage input {
  line-height: 26px;
}
/* layui 末段 `.layui-laypage span{margin-left:0;padding:0}` 把所有 span 都剥成
   零内距，导致 count / limits / refresh / skip 的中文文案（如「共 50 条」）
   贴边——加上 `.layui-laypage > *{margin:0 -1px 5px 0}` 的负 1px 重叠，紧邻按钮
   的左边框会盖住末字（视觉上「条」缺一截）。这里给四类「文本性元素」补回
   左右内距和右外距，且把 count 锚到段首，避免又被翻页按钮的负 margin 拉过来。 */
.layui-table-view .layui-table-page .layui-laypage .layui-laypage-count,
.layui-table-view .layui-table-page .layui-laypage .layui-laypage-limits,
.layui-table-view .layui-table-page .layui-laypage .layui-laypage-refresh,
.layui-table-view .layui-table-page .layui-laypage .layui-laypage-skip {
  padding: 0 4px;
  margin-right: 10px;
}
.layui-table-view .layui-table-page .layui-laypage .layui-laypage-count {
  margin-left: 0;
  margin-right: 12px;
}

/* ============================================================
 * P1-1 全站可复用骨架屏（token 化，亮/暗自适配）。
 * 仪表盘自带一套局部 .gva-skel（沿用不动）；这里提供独立命名的
 * .gva-skeleton 供其它页面复用，配色走 currentColor 半透明，深色主题
 * 自然变暗，不再是写死的浅灰板。用法：
 *   <span class="gva-skeleton gva-skeleton--text"></span>
 *   <div  class="gva-skeleton gva-skeleton--block" style="height:160px"></div>
 * ============================================================ */
@keyframes gvaShimmer {
  0%   { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}
.gva-skeleton {
  display: inline-block;
  border-radius: var(--app-radius, 4px);
  background: linear-gradient(90deg,
    color-mix(in srgb, currentColor 9%, transparent) 25%,
    color-mix(in srgb, currentColor 4%, transparent) 37%,
    color-mix(in srgb, currentColor 9%, transparent) 63%);
  background-size: 400% 100%;
  animation: gvaShimmer 1.3s ease-in-out infinite;
  color: transparent !important;
  user-select: none;
  pointer-events: none;
}
.gva-skeleton--text { width: 100%; height: 1em; vertical-align: middle; }
.gva-skeleton--block { display: block; width: 100%; height: 100%; }

/* 无障碍：减弱动态。admin.css 在 iframe 子页也加载，shell-only 的
   chrome.css 兜底覆盖不到子页，这里自带一份覆盖本文件的动效。 */
@media (prefers-reduced-motion: reduce) {
  .layui-layer.biz-drawer,
  .layui-layer.biz-drawer.biz-drawer-closing,
  .layui-layer-shade,
  .layui-layer-shade.biz-shade-closing,
  .gva-skeleton {
    animation: none !important;
  }
}

/* ===== block 样式可视化选择器（视频模块编辑用，仿主题选择器视觉） ===== */
.biz-stylepicker-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;}
.biz-spk-card{position:relative;padding:8px;border:1px solid #ebeef5;border-radius:4px;
  cursor:pointer;background:#fff;transition:border-color .15s,background .15s;text-align:center;}
.biz-spk-card:hover{border-color:#c6d8f5;}
.biz-spk-card.on{border-color:#1e9fff;background:#ecf5ff;}
.biz-spk-badge{display:none;position:absolute;top:4px;right:4px;font-size:10px;
  padding:1px 4px;border-radius:8px;background:#67c23a;color:#fff;line-height:1.4;}
.biz-spk-card.on .biz-spk-badge{display:block;}
.biz-spk-thumb{height:58px;display:flex;align-items:center;justify-content:center;
  background:#f7f9fc;border:1px solid #eef1f6;border-radius:3px;overflow:hidden;padding:5px;box-sizing:border-box;}
.biz-spk-label{margin-top:6px;font-size:11px;color:#5a6472;line-height:1.35;word-break:break-all;}
.biz-spk-card.on .biz-spk-label{color:#1e6fd9;}
/* 缩略图原子：横卡 16:9 / 竖卡 2:3 / 圆头像 / 昵称线 / tab 条 / 广告位 */
.biz-spk-thumb .spk-h{display:inline-block;width:24px;height:13px;background:#bcd6f5;border-radius:2px;flex:none;}
.biz-spk-thumb .spk-v{display:inline-block;width:12px;height:18px;background:#bcd6f5;border-radius:2px;flex:none;}
.biz-spk-thumb .spk-c{display:inline-block;width:15px;height:15px;border-radius:50%;background:#bcd6f5;flex:none;}
.biz-spk-thumb .spk-ln{display:block;width:14px;height:3px;background:#d6e4f7;border-radius:2px;}
.biz-spk-thumb .spk-row{display:flex;gap:4px;align-items:center;justify-content:center;}
.biz-spk-thumb .spk-col{display:flex;flex-direction:column;gap:4px;}
.biz-spk-thumb .spk-fade{opacity:.35;}
.biz-spk-thumb .spk-tab{display:flex;gap:3px;}
.biz-spk-thumb .spk-tab i{display:inline-block;width:14px;height:5px;border-radius:2px;background:#d6e4f7;}
.biz-spk-thumb .spk-tab i:first-child{background:#1e9fff;}
.biz-spk-thumb .spk-ad{display:flex;align-items:center;justify-content:center;width:78%;height:30px;
  border:1px dashed #c6c9ce;border-radius:3px;color:#a6abb3;font-size:11px;
  background:repeating-linear-gradient(45deg,#f4f5f7,#f4f5f7 5px,#eceef1 5px,#eceef1 10px);}
.biz-spk-card.on .spk-h,.biz-spk-card.on .spk-v,.biz-spk-card.on .spk-c{background:#1e9fff;}
@media (max-width:1100px){.biz-stylepicker-grid{grid-template-columns:repeat(3,1fr);}}

/* ===== 样式卡悬停浮窗：高保真还原 C 端组件 + 真实影片数据 ===== */
.biz-spk-pop{position:fixed;width:348px;max-height:82vh;overflow:hidden;z-index:2147483000;
  background:#fff;border:1px solid #e4e7ed;border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.18);
  padding:0;pointer-events:auto;font-size:12px;color:#303133;}
/* 列表「预览」按钮弹出的原生抽屉（fixed 在视口左侧，自渲蒙版 + 标题 + 三段内容）
   .biz-spk-modal 在抽屉里走 flex:1 撑满；强制覆盖 .biz-spk-pop 的浮窗定位 */
.biz-spk-pop.biz-spk-modal{position:static !important;width:auto !important;
  max-height:none !important;border:none !important;border-radius:0 !important;
  box-shadow:none !important;padding:0;}
#biz-spk-drawer .biz-spk-modal{flex:1 1 0 !important;min-height:0 !important;}
#biz-spk-drawer .biz-spk-bkbar{flex:0 0 auto;}
#biz-spk-drawer .biz-spk-statusbar{flex:0 0 auto;}
/* !important 覆盖通用 .biz-spk-bkbody{min-height:360px}（防止 4+ 模块时只显示一屏） */
#biz-spk-drawer .biz-spk-bkbody{flex:1 1 0 !important;min-height:0 !important;overflow-y:auto !important;}
/* 预览弹窗顶部固定免责说明（提醒运营：以 C 端实际样式为准） */
.biz-spk-pop .biz-spk-disclaimer{padding:5px 10px;font-size:10px;line-height:1.5;
  color:#a96b00;background:#fff8e1;border-bottom:1px solid #f3e3a6;}
.biz-spk-pop .biz-spk-disclaimer b{color:#7a4a00;font-weight:600;}
/* 状态条（白底）：显示"样式 / 命中数 / tab name"等 admin 元数据，与下方深色预览分层 */
.biz-spk-pop .biz-spk-statusbar{padding:6px 10px;background:#fff;border-bottom:1px solid #eee;
  font-size:11px;color:#5a6472;line-height:1.55;}
/* 内容区（命中数据 / 卡片）→ 对齐 DFA-02「黄豆短剧」保真稿粉白主题：浅粉白底 + 深色文字
   min-height 撑住基线高度，切 tab / backend 时 body 短暂只显示"加载中…"占位也不收缩；
   避免高度跳变 → 浮窗位置看起来稳定 */
.biz-spk-pop .biz-spk-bkbody{padding:10px 12px;min-height:360px;
  background:linear-gradient(135deg,#FDEFF4 0%,#F8F3F4 55%,#FFFFFF 100%);
  color:#2E2E2E;}
.biz-spk-pop .biz-spk-bkbody .spp-hd b{color:#2E2E2E;}
.biz-spk-pop .biz-spk-bkbody .spp-hd span{color:#9aa0a6;}
/* 浮窗内点击全部 stop：避免穿透 / 冒泡到下方 layer shade 触发 shadeClose */
.biz-spk-pop .spp-cap{font-size:11px;color:#9aa0a6;margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid #f0f2f5;}
.biz-spk-pop .spp-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:7px;}
.biz-spk-pop .spp-hd b{font-size:13px;color:#303133;}
.biz-spk-pop .spp-hd span{font-size:11px;color:#9aa0a6;}
.biz-spk-pop .spp-body{max-height:62vh;overflow:hidden;}
/* 对齐 DFA-02 保真稿卡片：白底卡 + 柔粉描边 + 圆角 8px */
.biz-spk-pop .spp-card{display:flex;flex-direction:column;gap:0;min-width:0;
  background:#fff;border:1px solid #EFE2E7;border-radius:8px;overflow:hidden;box-shadow:0 1px 4px rgba(242,138,174,.08);}
.biz-spk-pop .spp-cv{position:relative;background:#F6EAEF;border-radius:8px 8px 0 0;overflow:hidden;width:100%;}
.biz-spk-pop .spp-cv img{width:100%;height:100%;object-fit:cover;display:block;}
/* aspect 严格对齐 swift-client _imageRatio：
   横卡 16/9（movie_style4._imageRatio）/ 竖卡 3/4（movie_style11/12._imageRatio） */
.biz-spk-pop .spp-h{aspect-ratio:16/9;}
.biz-spk-pop .spp-v{aspect-ratio:3/4;}
/* 对齐 DFA-02 保真稿卡片标题：textPrimary 深色 / fontSize 14 / w500 */
.biz-spk-pop .spp-t{font-size:11px;line-height:1.45;color:#2E2E2E;font-weight:500;
  padding:5px 7px 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/* 横滑 */
.biz-spk-pop .spp-scroll{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;}
.biz-spk-pop .spp-scroll::-webkit-scrollbar{height:5px;}
.biz-spk-pop .spp-scroll::-webkit-scrollbar-thumb{background:#dcdfe6;border-radius:3px;}
.biz-spk-pop .spp-scroll .spp-card{flex:0 0 auto;}
.biz-spk-pop .spp-scroll .spp-h{width:150px;}
.biz-spk-pop .spp-scroll .spp-v{width:84px;}
/* style 1 横滑大横卡（swift-client itemW=300） — 浮窗按比例缩到 ~240px */
.biz-spk-pop .spp-scroll .spp-w240{width:240px;}
/* style 2 / 3 满宽横卡（vertical ListView 单列） */
.biz-spk-pop .spp-vlist .spp-full{width:100%;}
/* 纵列表 / 网格 / 复合 */
.biz-spk-pop .spp-vlist{display:flex;flex-direction:column;gap:9px;}
.biz-spk-pop .spp-g2{display:grid;grid-template-columns:1fr 1fr;gap:8px;}
.biz-spk-pop .spp-g3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:7px;}
.biz-spk-pop .spp-mix{display:flex;flex-direction:column;gap:8px;}
.biz-spk-pop .spp-mix .spp-big{}
/* 瀑布流 */
/* 瀑布流：对齐 swift-client MovieStyle30 MasonryGridView.count(crossAxisCount:2) */
.biz-spk-pop .spp-mason{column-count:2;column-gap:8px;}
.biz-spk-pop .spp-mason .spp-card{break-inside:avoid;margin-bottom:8px;}
/* 隔行高卡模拟瀑布流错落：默认 3:4，spp-tall 拉成 3:5 让视觉错位 */
.biz-spk-pop .spp-mason .spp-tall{aspect-ratio:3/5;}
/* UP头像 */
/* movie_style20: itemW=60，imageRatio=1（正方形头像），文字 fontSize 12 居中 */
.biz-spk-pop .spp-up{display:flex;flex-direction:column;align-items:center;gap:5px;flex:0 0 auto;width:60px;}
.biz-spk-pop .spp-ava{width:60px;height:60px;border-radius:50%;background:#F6EAEF;}
.biz-spk-pop .spp-up .spp-t{text-align:center;max-width:60px;padding:2px 0 0;color:#2E2E2E;font-size:11px;}
/* tab 容器 */
/* 视频卡片左上角付费标签（对齐截图绿色"免费" chip） */
.biz-spk-pop .spp-pay{position:absolute;top:5px;left:5px;z-index:2;
  font-size:9px;line-height:1;padding:3px 6px;border-radius:4px;
  color:#fff;font-weight:600;letter-spacing:.5px;}
.biz-spk-pop .spp-pay-free{background:#22c55e;}
.biz-spk-pop .spp-pay-vip{background:#fbbf24;color:#7c5e00;}
.biz-spk-pop .spp-pay-money{background:#fb923c;}
/* 视频卡片底部叠加层（对齐截图：播放图标+数字 / 时长） */
.biz-spk-pop .spp-meta{position:absolute;left:0;right:0;bottom:0;z-index:2;
  display:flex;justify-content:space-between;align-items:center;
  padding:10px 6px 4px;font-size:9px;color:#fff;
  background:linear-gradient(180deg,transparent,rgba(0,0,0,.55));pointer-events:none;}
.biz-spk-pop .spp-meta-l,.biz-spk-pop .spp-meta-r{color:#fff;font-weight:500;}
/* 竖卡 meta 字号更小 + 内边距更紧凑（横滑 84px 竖卡内才放得下） */
.biz-spk-pop .spp-meta-sm{font-size:8px;padding:6px 4px 2px;}

/* 内嵌 tab 切换（对齐截图"最新 最热"行）：未选灰、选中粉红，无背景填充 */
.biz-spk-pop .spp-tabs{display:flex;gap:16px;margin-bottom:10px;padding:6px 2px;flex-wrap:wrap;}
.biz-spk-pop .spp-tabs i{font-style:normal;font-size:14px;line-height:1.5;
  color:#9aa0a6;padding:2px 2px;font-weight:500;
  transition:color .15s;}
.biz-spk-pop .spp-tabs i.on{color:#F28AAE;font-weight:700;}
/* 广告占位（旧统一 .spp-ad-box 已替换为按 style 分形态的 .spp-ad-wrap，保留 .spp-ad-box
   兜底防止运行时漏掉某些路径调旧函数 → 仍可渲一个通用底） */
.biz-spk-pop .spp-ad-box{display:flex;flex-direction:column;align-items:center;justify-content:center;
  height:120px;color:#a6abb3;font-size:12px;line-height:1.9;text-align:center;
  border:1px dashed #d0d3d8;border-radius:6px;
  background:repeating-linear-gradient(45deg,#f7f8fa,#f7f8fa 7px,#eef0f3 7px,#eef0f3 14px);}
.biz-spk-pop .spp-ad-box i{font-style:normal;font-size:11px;color:#bfc4cb;}

/* ===== 广告样式专项预览（区分 -1 / -2 / -3 / -10 四种排版）=====
   - 在深底容器（.biz-spk-bkbody）内呈现，使用半透明亮色 + dashed 边框作骨架
   - cell.AD 文字标签让运营一眼看清这是占位（C 端 SDK 渲真广告）
   - 排列形态对齐 movie_nav_logic.go::advBlock 返的 style → Flutter widget 映射 */
.biz-spk-pop .spp-ad-wrap{margin:2px 0 4px;}
.biz-spk-pop .spp-ad-label{font-size:11px;color:#666;margin-bottom:6px;line-height:1.55;}
.biz-spk-pop .spp-ad-tag-scroll{display:inline-block;margin-left:6px;font-size:10px;color:#e06b94;
  background:rgba(242,138,174,.16);border-radius:8px;padding:1px 6px;}
.biz-spk-pop .spp-ad-hint{margin-top:6px;font-size:10px;color:#9aa0a6;line-height:1.6;}
/* 公用 cell：浅粉占位 + dashed 边 + "AD" 居中标签 */
.biz-spk-pop .spp-ad-cell{display:flex;align-items:center;justify-content:center;
  background:#FBEEF3;border:1px dashed #F0CBD9;border-radius:6px;
  color:#C77E99;font-size:11px;font-weight:600;letter-spacing:1px;}
.biz-spk-pop .spp-ad-cell i{font-style:normal;}
/* 行容器 */
.biz-spk-pop .spp-ad-row{display:grid;gap:6px;}
.biz-spk-pop .spp-ad-row-1{grid-template-columns:1fr;}
.biz-spk-pop .spp-ad-row-3{grid-template-columns:repeat(3,1fr);}
.biz-spk-pop .spp-ad-row-5{grid-template-columns:repeat(5,1fr);}
/* 横滑：内部用 flex + overflow 暗示可滚 */
.biz-spk-pop .spp-ad-scroll{display:flex;gap:6px;overflow-x:auto;padding-bottom:4px;
  -webkit-mask-image:linear-gradient(to right,#000 90%,transparent);
  mask-image:linear-gradient(to right,#000 90%,transparent);}
.biz-spk-pop .spp-ad-scroll .spp-ad-cell{flex:0 0 38%;}
/* 各 style 的尺寸特征：让运营一眼区分 */
.biz-spk-pop .spp-ad-banner{height:84px;}                    /* -1 横长 banner */
.biz-spk-pop .spp-ad-cube{aspect-ratio:1/1;}                  /* -2 1*3 方块 */
.biz-spk-pop .spp-ad-hcard{aspect-ratio:16/9;height:74px;}    /* -3 横滑横卡 */
.biz-spk-pop .spp-ad-icon{aspect-ratio:1/1;border-radius:14px;font-size:9px;}  /* -10 App 应用块圆角 icon */

/* ===== 全域扩展：book/post 缩略原子 + nav 整页骨架 + 浮窗 post 卡片 ===== */
/* 缩略原子补充 */
.biz-spk-thumb .spk-sq{display:inline-block;width:15px;height:15px;border-radius:3px;background:#bcd6f5;flex:none;}
.biz-spk-thumb .spk-th{display:inline-block;width:16px;height:16px;border-radius:3px;background:#bcd6f5;flex:none;}
.biz-spk-card.on .spk-sq,.biz-spk-card.on .spk-th{background:#1e9fff;}
/* nav 整页模式骨架 */
.biz-navstyle-grid{grid-template-columns:repeat(3,1fr);}
.biz-spk-thumb-nav{height:62px;align-items:stretch;}
.spk-page{width:100%;display:flex;flex-direction:column;gap:3px;padding:3px;box-sizing:border-box;}
.spk-page .spk-pg-blk{border:1px solid #d6e0ee;border-radius:2px;padding:2px 3px;}
.spk-page .spk-pg-blk b{display:block;width:30px;height:3px;background:#9bbceb;border-radius:1px;margin-bottom:2px;}
.spk-page .spk-pg-blk span{display:flex;gap:2px;}
.spk-page .spk-pg-blk span i{flex:1;height:8px;background:#cfe0f6;border-radius:1px;}
.spk-page .spk-pg-bar{height:6px;background:#d6e4f7;border-radius:2px;flex:none;}
.spk-page .spk-pg-grid{flex:1;display:grid;grid-template-columns:1fr 1fr;gap:3px;}
.spk-page .spk-pg-grid i{background:#cfe0f6;border-radius:1px;min-height:10px;}
.spk-page .spk-pg-tabs{display:flex;gap:4px;flex:none;}
.spk-page .spk-pg-tabs u{width:14px;height:4px;border-radius:1px;background:#d6e4f7;}
.spk-page .spk-pg-tabs u.on{background:#1e9fff;}
.biz-spk-card.on .spk-pg-blk span i,.biz-spk-card.on .spk-pg-grid i{background:#9bc4f0;}
.biz-spk-card.on .spk-pg-bar{background:#1e9fff;}
/* 浮窗：novel/audio 方卡(style20) */
.biz-spk-pop .spp-sq{aspect-ratio:1/1;}
.biz-spk-pop .spp-scroll .spp-sq{width:64px;}
/* 浮窗：post 仿微信列表卡 */
/* === photo 域 2 列写真卡（对齐 swift-client 写真页截图） === */
.biz-spk-pop .spp-photo-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
/* min-width:0 必须 — 否则 grid item 默认 min-content 让 img 撑爆，2 列变成 1 大列+溢出 */
.biz-spk-pop .spp-photo-card{display:flex;flex-direction:column;gap:4px;min-width:0;}
.biz-spk-pop .spp-photo-cv{position:relative;width:100%;aspect-ratio:3/4;
  background:rgba(255,255,255,.06);border-radius:8px;overflow:hidden;}
.biz-spk-pop .spp-photo-cv img{width:100%;height:100%;object-fit:cover;display:block;}
/* 右上 付费标签 */
.biz-spk-pop .spp-photo-pay{position:absolute;top:6px;right:6px;z-index:2;
  font-size:10px;padding:1px 7px;border-radius:3px;color:#fff;font-weight:600;
  line-height:1.4;letter-spacing:.5px;}
.biz-spk-pop .spp-photo-pay-free{background:#22c55e;}
.biz-spk-pop .spp-photo-pay-vip{background:#fbbf24;color:#7c5e00;}
.biz-spk-pop .spp-photo-pay-money{background:#fb923c;}
/* 标题 */
.biz-spk-pop .spp-photo-tt{font-size:12px;color:#2E2E2E;line-height:1.4;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:2px 0;}
/* 底部统计 — 图片数靠左 / 点赞数靠右（space-between，对齐 C 端） */
.biz-spk-pop .spp-photo-bot{display:flex;align-items:center;justify-content:space-between;
  color:#9aa0a6;font-size:11px;line-height:1.3;}
.biz-spk-pop .spp-photo-met{display:inline-flex;align-items:center;gap:3px;}
.biz-spk-pop .spp-photo-met i{font-style:normal;font-size:11px;opacity:.9;}

/* === post style 1 完整卡片（对齐 swift-client post_style1.dart） === */
.biz-spk-pop .spp-post-list{display:flex;flex-direction:column;gap:10px;}
.biz-spk-pop .spp-post-card{background:#fff;border:1px solid #EFE2E7;border-radius:8px;padding:10px 11px;
  display:flex;flex-direction:column;gap:8px;color:#2E2E2E;overflow:hidden;box-shadow:0 1px 4px rgba(242,138,174,.08);}
.biz-spk-pop .spp-post-tt{font-size:13px;font-weight:600;color:#2E2E2E;line-height:1.4;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.biz-spk-pop .spp-post-tx{font-size:11px;color:#9aa0a6;line-height:1.5;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
/* media 区：3 列等分网格（swift-client Row + 3 Expanded + AspectRatio 1） */
.biz-spk-pop .spp-post-media-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;}
.biz-spk-pop .spp-post-media-3 .spp-post-mi{aspect-ratio:1;}
/* 不足 3 图：单大图 16:8 横版（aspect 329/170 ≈ 1.93） */
.biz-spk-pop .spp-post-media-big .spp-post-mi{aspect-ratio:329/170;}
.biz-spk-pop .spp-post-mi{position:relative;background:#F6EAEF;
  border-radius:8px;overflow:hidden;}
.biz-spk-pop .spp-post-mi img{width:100%;height:100%;object-fit:cover;display:block;}
/* 视频帖中央 ▶ 播放图标（48px 圆 + 半透白底，对齐 post_style1._buildMediaItem） */
.biz-spk-pop .spp-post-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:30px;height:30px;border-radius:50%;background:rgba(255,255,255,.32);
  display:flex;align-items:center;justify-content:center;color:#fff;font-size:12px;line-height:1;
  pointer-events:none;}
/* 底部数据行：左 👁 click / 右 ☆ favorite + 👍 love + 💬 comment */
.biz-spk-pop .spp-post-bot{display:flex;align-items:center;font-size:11px;color:#888;
  margin-top:2px;}
.biz-spk-pop .spp-post-met{display:inline-flex;align-items:center;gap:3px;line-height:1;}
.biz-spk-pop .spp-post-met-i{font-style:normal;font-size:11px;opacity:.85;}
.biz-spk-pop .spp-post-met-l{margin-right:auto;}
.biz-spk-pop .spp-post-met-r{display:inline-flex;align-items:center;gap:12px;}

.biz-spk-pop .spp-pw{display:flex;gap:9px;align-items:flex-start;}
.biz-spk-pop .spp-pw-th{width:56px;height:56px;border-radius:5px;flex:none;background:#eef1f6;overflow:hidden;}
.biz-spk-pop .spp-pw-th img{width:100%;height:100%;object-fit:cover;display:block;}
.biz-spk-pop .spp-pw-tx{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px;padding-top:2px;}
.biz-spk-pop .spp-pw-tt{font-size:12px;color:#303133;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.biz-spk-pop .spp-pw-ln{height:7px;background:#eef1f6;border-radius:3px;}
.biz-spk-pop .spp-pw-ln.s{width:55%;}
/* 浮窗：post 仿论坛纯文列表 */
.biz-spk-pop .spp-fm{padding:7px 0;border-bottom:1px solid #EFE2E7;}
.biz-spk-pop .spp-fm:last-child{border-bottom:0;}
.biz-spk-pop .spp-forum .spp-pw-tt{margin-bottom:6px;}
/* 容器 .biz-spk-bkbody 是深紫→黑渐变背景（line 831-833），但 .spp-pw-tt 默认色
   是深灰 #303133（设计初衷为白底卡片）—— 在深底下黑底黑字看不见。仅在 bkbody
   作用域内覆盖为亮色；白底其它用法（如 disclaimer 区）保持原色。 */
.biz-spk-pop .biz-spk-bkbody .spp-pw-tt{color:#2E2E2E;}

/* ===== nav 顶部菜单整页模式浮窗（粉白卡片风格） ===== */
.biz-spk-pop .spp-navmod{border:1px solid #EFE2E7;border-radius:8px;padding:8px;
  margin-bottom:8px;background:#fff;}
.biz-spk-pop .spp-navmod:last-child{margin-bottom:0;}
.biz-spk-pop .spp-navmod .spp-hd{margin-bottom:6px;}
.biz-spk-pop .spp-navbar{display:flex;gap:8px;margin-bottom:8px;}
.biz-spk-pop .spp-navbar i{font-style:normal;font-size:11px;color:#5a6472;background:#f0f2f5;border-radius:12px;padding:3px 10px;}
/* 顶部板块/频道栏（C 端 HomeView 全局顶部）：当前 position 高亮 */
/* 顶部一级 tab（看片/动漫/漫画/小说/色图）：白字加粗 + 选中紫色下划线，对齐 swift-client home_view */
.biz-spk-pop .spp-board{display:flex;gap:18px;align-items:center;padding:8px 2px 10px;margin-bottom:0;}
.biz-spk-pop .spp-board i{font-style:normal;font-size:14px;color:#9aa0a6;font-weight:600;}
.biz-spk-pop .spp-board i.on{color:#2E2E2E;font-weight:700;font-size:16px;position:relative;}
.biz-spk-pop .spp-board i.on::after{content:"";position:absolute;left:25%;right:25%;bottom:-6px;height:2px;background:#F28AAE;border-radius:1px;}
/* 二级 nav 列表（同 position 下所有 nav 横滑切换条，当前编辑的高亮）
   对齐截图："最新 里番 同人 肉番 3D MMD HMV VAM" — 选中白字加粗（无下划线） */
.biz-spk-pop .spp-navlist{display:flex;gap:18px;overflow-x:auto;padding:8px 2px 10px;
  margin-bottom:8px;scrollbar-width:none;}
.biz-spk-pop .spp-navlist::-webkit-scrollbar{display:none;}
.biz-spk-pop .spp-navlist i{font-style:normal;font-size:13px;color:#9aa0a6;
  white-space:nowrap;flex:0 0 auto;font-weight:500;}
.biz-spk-pop .spp-navlist i.on{color:#2E2E2E;font-weight:700;font-size:14px;}
/* _2/_3 顶部 banner 示意条 */
.biz-spk-pop .spp-banner{height:46px;display:flex;align-items:center;justify-content:center;margin-bottom:8px;
  border:1px dashed #F0CBD9;border-radius:8px;background:#FBEEF3;
  color:#C77E99;font-size:11px;}
/* _2/_3 标签筛选条（model.tags） */
.biz-spk-pop .spp-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px;}
.biz-spk-pop .spp-tags i{font-style:normal;font-size:11px;color:#7a828f;
  background:#F3E8ED;border-radius:12px;padding:3px 10px;}
.biz-spk-pop .spp-tags i.on{background:#F28AAE;color:#fff;}
.biz-spk-pop .spp-navwrap{max-height:58vh;overflow-y:auto;overflow-x:hidden;padding-right:2px;}
.biz-spk-pop .spp-navwrap::-webkit-scrollbar{width:5px;}
.biz-spk-pop .spp-navwrap::-webkit-scrollbar-thumb{background:#dcdfe6;border-radius:3px;}
.biz-spk-pop .spp-empty{font-size:12px;color:#9aa0a6;line-height:1.7;padding:10px 4px;}
.biz-spk-pop .spp-empty code{background:#f0f2f5;color:#5a6472;border-radius:3px;padding:1px 5px;font-size:11px;}
.biz-spk-pop .spp-note{font-size:11px;color:#b0884a;background:#fff8ec;border:1px solid #f5e3c2;border-radius:4px;padding:6px 8px;margin-top:8px;line-height:1.6;}

/* ===== 样式选择框再次调小（与抽屉并列时编辑 layer 变窄，按钮也要更紧凑） ===== */
.biz-stylepicker-grid{grid-template-columns:repeat(5,1fr);gap:4px;}
.biz-spk-card{padding:3px;border-radius:3px;}
.biz-spk-thumb{height:34px;padding:3px;}
.biz-spk-label{font-size:9px;margin-top:2px;line-height:1.25;}
.biz-spk-badge{font-size:8px;padding:0 2px;top:2px;right:2px;}
/* 缩略原子等比缩小 */
.biz-spk-thumb .spk-h{width:16px;height:9px;}
.biz-spk-thumb .spk-v{width:8px;height:12px;}
.biz-spk-thumb .spk-c,.biz-spk-thumb .spk-sq,.biz-spk-thumb .spk-th{width:10px;height:10px;}
.biz-spk-thumb .spk-ln{width:12px;height:2px;}
/* nav 模式卡同步收紧 */
.biz-navstyle-grid{grid-template-columns:repeat(3,1fr);}
.biz-spk-thumb-nav{height:50px;}
.spk-page{gap:2px;padding:2px;}
.spk-page .spk-pg-blk b{width:22px;height:2px;}
.spk-page .spk-pg-blk span i{height:6px;}
@media (max-width:1100px){.biz-stylepicker-grid{grid-template-columns:repeat(3,1fr);}}

/* ===== 预览弹窗（layer 内复用 spkPreviewNav，非悬停浮窗） ===== */
.biz-spk-pop.biz-spk-modal{position:static;width:auto;max-height:none;display:block;
  box-shadow:none;border:0;border-radius:0;pointer-events:auto;padding:12px 14px;}
.biz-spk-pop.biz-spk-modal .spp-body{max-height:none;}

/* ===== 预览弹层标题省略修正：横滑/瀑布卡片宽度锁定封面宽，长标题单行省略(对齐C端) ===== */
/* 横滑：卡片宽=封面宽，nowrap 标题不再撑宽卡片，超出省略号 */
.biz-spk-pop .spp-scroll .spp-card{flex:0 0 auto;max-width:160px;overflow:hidden;}
.biz-spk-pop .spp-scroll .spp-card:has(.spp-h){width:150px;max-width:150px;}
.biz-spk-pop .spp-scroll .spp-card:has(.spp-v){width:84px;max-width:84px;}
.biz-spk-pop .spp-scroll .spp-card:has(.spp-sq){width:64px;max-width:64px;}
/* 瀑布：卡片随列宽，标题不溢出列 */
.biz-spk-pop .spp-mason .spp-card{overflow:hidden;}
/* 标题统一：单行省略，绝不撑开父级 */
.biz-spk-pop .spp-t{display:block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.biz-spk-pop .spp-card{min-width:0;overflow:hidden;}
.biz-spk-pop .spp-pw-tt{max-width:100%;}

/* ===== 搜索条件 JSON 编辑器 + 按样式字段面板 ===== */
.biz-jsone{display:flex;flex-direction:column;gap:6px;}
.biz-jsone-bar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.biz-jsone-bar .layui-btn-xs{margin:0;}
.biz-jsone-status{font-size:12px;margin-left:4px;color:#9aa0a6;}
.biz-jsone-status.ok{color:#3a8f3a;}
.biz-jsone-status.bad{color:#d9534f;}
/* JSON 编辑区：textarea 窄、右侧字段面板宽（运营更常点 chip 不直接打字） */
.biz-jsone-main{display:flex;gap:8px;align-items:stretch;flex-wrap:wrap;}
.biz-jsone-ta{flex:1 1 200px;min-width:180px;min-height:130px;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;
  line-height:1.6;tab-size:2;white-space:pre;overflow:auto;resize:vertical;}
.biz-jsone-ta.jse-ok{border-color:#9ccd9c;}
.biz-jsone-ta.jse-bad{border-color:#e8a9a6;background:#fff7f7;}
.biz-jsone-fields{flex:0 0 320px;max-width:320px;max-height:320px;overflow-y:auto;
  border:1px solid #ebeef5;border-radius:5px;background:#fafbfc;padding:8px 9px;box-sizing:border-box;}
.biz-jse-mode{font-size:11px;color:#8a93a2;line-height:1.5;background:#eef3fb;
  border-radius:4px;padding:5px 7px;margin-bottom:8px;}
.biz-jse-st{font-size:11px;color:#5a6472;font-weight:600;margin:8px 0 5px;}
.biz-jse-st:first-of-type{margin-top:0;}
.biz-jse-grp{display:flex;flex-wrap:wrap;gap:5px 6px;}
.biz-jse-chip{font:inherit;font-size:11px;line-height:1.6;color:#3a6ea5;cursor:pointer;
  background:#eaf2fc;border:1px solid #d4e3f5;border-radius:3px;padding:1px 7px;}
.biz-jse-chip:hover{background:#1e9fff;border-color:#1e9fff;color:#fff;}
/* picker 类 chip（tag/category 弹窗触发）：tag 橙、category 绿，颜色区分 */
.biz-jse-chip-picker{background:#fff4d6;border-color:#f5e0a8;color:#a37500;font-weight:600;}
.biz-jse-chip-picker:hover{background:#f0a020;border-color:#f0a020;color:#fff;}
.biz-jse-chip-catpicker{background:#dcfce7;border-color:#86efac;color:#166534;font-weight:600;}
.biz-jse-chip-catpicker:hover{background:#22c55e;border-color:#22c55e;color:#fff;}
@media (max-width:900px){.biz-jsone-fields{flex-basis:100%;max-width:100%;}}
/* 模块模式：搜索条件锁定（只读 + 工具栏禁用 + 提示） */
.biz-jsone-locked .biz-jsone-ta{opacity:.55;cursor:not-allowed;}
.biz-jse-dis{pointer-events:none;opacity:.45;cursor:not-allowed;}
.biz-jse-lock{font-size:12px;color:#8a6d3b;background:#fcf4e3;border:1px solid #f2e2bd;
  border-radius:5px;padding:10px 12px;line-height:1.7;}
.biz-jse-lock b{color:#a9762a;}
.biz-jse-lock p{margin:6px 0 0;color:#8a6d3b;}
.biz-jse-lock u{text-decoration:underline;}
.biz-jse-gomod{margin-top:9px;background:#1e9fff;color:#fff;}
/* 「实时预览」开关按钮（工具栏最前，data-jse="preview"）— iOS 风 toggle switch
   开：绿色轨道 + 圆滑块右移 + 文字加粗；关：灰色轨道 + 滑块左 */
.biz-jse-rt-toggle{display:inline-flex;align-items:center;gap:6px;
  cursor:pointer;background:transparent;border:none;padding:2px 6px;
  font-size:12px;color:#666;line-height:1.4;outline:none;-webkit-appearance:none;}
.biz-jse-rt-toggle:hover .biz-rt-label{color:#16a34a;}
.biz-rt-track{position:relative;width:28px;height:16px;border-radius:8px;
  background:#cbd5e1;transition:background .2s ease;display:inline-block;flex-shrink:0;}
.biz-rt-thumb{position:absolute;top:2px;left:2px;width:12px;height:12px;
  border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);
  transition:left .2s ease;}
.biz-rt-label{transition:color .2s ease,font-weight .2s ease;}
.biz-jse-rt-on .biz-rt-track{background:#22c55e;}
.biz-jse-rt-on .biz-rt-thumb{left:14px;}
.biz-jse-rt-on .biz-rt-label{color:#16a34a;font-weight:600;}
.biz-jse-rt-off .biz-rt-label{color:#94a3b8;}
/* 顶部 backend bar：现代 segmented control 风格（ES / Mongo 紧贴一组），右侧状态文字 + × */
.biz-spk-bkbar{pointer-events:auto;display:flex;align-items:center;gap:10px;
  padding:8px 12px;border-bottom:1px solid #eee;background:#fff;font-size:11px;}
/* segmented control：两 chip 紧贴成一组，选中态明显 */
.biz-spk-bkseg{pointer-events:auto;display:inline-flex;border:1px solid #d8dae0;
  border-radius:6px;overflow:hidden;background:#f4f5f7;}
.biz-spk-bkseg .biz-spk-bkbtn{pointer-events:auto;display:inline-block;padding:4px 14px;
  color:#5a6472;background:transparent;text-decoration:none;font-size:12px;line-height:1.4;
  font-weight:500;cursor:pointer;transition:background .15s,color .15s;border:none;}
.biz-spk-bkseg .biz-spk-bkbtn + .biz-spk-bkbtn{border-left:1px solid #d8dae0;}
.biz-spk-bkseg .biz-spk-bkbtn:hover{color:#1e9fff;background:#eaf2fc;}
.biz-spk-bkseg .biz-spk-bkbtn.on{background:#1e9fff;color:#fff;font-weight:600;}
.biz-spk-bkseg .biz-spk-bkbtn.on:hover{background:#1e9fff;color:#fff;}
.biz-spk-bkstate{margin-left:auto;font-size:11px;color:#909399;}
.biz-spk-popclose{pointer-events:auto;color:#999;font-size:18px;line-height:1;
  text-decoration:none;padding:0 4px;cursor:pointer;}
.biz-spk-popclose:hover{color:#ef4444;}
/* 顶部 tab 切换条已废弃：切换由内容里的 .spp-tabs-live 承担（对齐 C 端 TabBar） */
/* 预览内容里的内嵌 tab（仿 C 端 40/41 tab UI）— 开 pointer-events 让点击可切换 */
.biz-spk-pop .spp-tabs-live{pointer-events:auto;}
.biz-spk-pop .spp-tabs-live i[data-tabidx]{pointer-events:auto;cursor:pointer;}
.biz-spk-pop .spp-tabs-live i[data-tabidx]:hover{color:#10b981;}
.biz-jse-gomod:hover{background:#0d8ae0;color:#fff;}
/* === jsoneditor tab 条（数组样式独有） === */
.biz-jsone-tabbar{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:4px 0 0;}
.biz-jsone-tabchip{display:inline-flex;align-items:center;padding:2px 4px 2px 10px;
  border:1px solid #d4e3f5;background:#eaf2fc;color:#3a6ea5;border-radius:14px;
  font-size:11px;line-height:1.6;cursor:pointer;transition:all .15s;}
.biz-jsone-tabchip:hover{border-color:#1e9fff;color:#1e9fff;}
.biz-jsone-tabchip.on{background:#1e9fff;border-color:#1e9fff;color:#fff;font-weight:600;}
.biz-jsone-tabchip-name{cursor:text;padding:0 2px;outline:none;border-radius:2px;min-width:30px;text-align:center;}
.biz-jsone-tabchip-name:focus{background:rgba(255,255,255,.85);color:#333;}
.biz-jsone-tabchip-del{margin-left:4px;color:inherit;opacity:.6;text-decoration:none;
  font-size:13px;line-height:1;padding:0 4px;}
.biz-jsone-tabchip-del:hover{opacity:1;color:#ef4444;}
.biz-jsone-tabchip.on .biz-jsone-tabchip-del:hover{color:#fee;}
.biz-jsone-tabadd{display:inline-flex;align-items:center;padding:2px 8px;
  border:1px dashed #c6d8f5;background:#fff;color:#3a6ea5;border-radius:14px;
  font-size:11px;line-height:1.6;cursor:pointer;text-decoration:none;
  transition:all .15s;}
.biz-jsone-tabadd:hover{border-color:#1e9fff;background:#eaf2fc;color:#1e9fff;}
.biz-jsone-tabhint{margin-left:6px;color:#b0b6c0;font-size:10px;line-height:1.6;
  font-weight:400;user-select:none;pointer-events:none;}
/* 实时预览刷新时的 loading 蒙版（schedulePreview 立即 add，spkModalSet 完成 remove） */
.biz-spk-modal .biz-spk-bkbody{position:relative;}
.biz-spk-modal .biz-spk-bkbody.biz-spk-loading::after{
  content:'';position:absolute;inset:0;z-index:10;
  background:rgba(10,10,15,.35);
  backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);
  animation:bizSpkMaskIn .15s ease-out;pointer-events:none;}
.biz-spk-modal .biz-spk-bkbody.biz-spk-loading::before{
  content:'';position:absolute;left:50%;top:50%;z-index:11;
  width:32px;height:32px;margin:-16px 0 0 -16px;
  border:3px solid rgba(255,255,255,.25);border-top-color:#fff;
  border-radius:50%;animation:bizSpkSpin .8s linear infinite;pointer-events:none;}
@keyframes bizSpkMaskIn{from{opacity:0}to{opacity:1}}
@keyframes bizSpkSpin{to{transform:rotate(360deg)}}
/* 切板块专属 tip:蒙版色加深 + spinner 下方"正在切换板块中"文字浮层 */
.biz-spk-modal .biz-spk-bkbody.biz-spk-switching::after{background:rgba(10,10,15,.55);}
.biz-spk-modal .biz-spk-bkbody .biz-spk-switching-tip{
  position:absolute;left:0;right:0;top:50%;margin-top:28px;z-index:12;
  text-align:center;color:#fff;font-size:13px;letter-spacing:1px;
  text-shadow:0 1px 2px rgba(0,0,0,.6);pointer-events:none;
  animation:bizSpkMaskIn .15s ease-out;}
/* 模块列表里 block.filter.position ≠ 所属 nav.position 错配徽章 */
.biz-block-pos-mismatch{display:inline-block;margin-left:6px;padding:0 6px;
  font-size:11px;line-height:18px;color:#fff;background:#e25d52;
  border-radius:9px;cursor:help;vertical-align:middle;user-select:none;}
.biz-block-pos-mismatch:hover{background:#c94036;}

/* JSON 编辑器输入框：深色代码编辑器风格（后置覆盖前述浅色基线） */
.biz-jsone-ta{background:#1e2430;color:#e6edf3;border:1px solid #3a4252;border-radius:5px;
  caret-color:#58a6ff;padding:8px 10px;}
.biz-jsone-ta::placeholder{color:#6b7689;}
.biz-jsone-ta::selection{background:#2f4670;color:#fff;}
.biz-jsone-ta:focus{border-color:#4a90d9;box-shadow:0 0 0 2px rgba(74,144,217,.18);outline:none;}
.biz-jsone-ta.jse-ok{background:#1e2430;border-color:#3fae6a;}
.biz-jsone-ta.jse-bad{background:#27201f;border-color:#e0625c;}
.biz-jsone-ta::-webkit-scrollbar{width:9px;height:9px;}
.biz-jsone-ta::-webkit-scrollbar-thumb{background:#3a4252;border-radius:4px;}
.biz-jsone-ta::-webkit-scrollbar-track{background:transparent;}

/* 修正：JSON 编辑器深底白字——提高特异性 + !important，压过 layui/主题的 .layui-textarea 色与 text-fill */
textarea.biz-jsone-ta,
.biz-jsone .biz-jsone-ta{
  background:#1e2430 !important;
  color:#e6edf3 !important;
  -webkit-text-fill-color:#e6edf3 !important;
  caret-color:#58a6ff !important;
}
textarea.biz-jsone-ta.jse-ok,.biz-jsone .biz-jsone-ta.jse-ok{background:#1e2430 !important;border-color:#3fae6a !important;}
textarea.biz-jsone-ta.jse-bad,.biz-jsone .biz-jsone-ta.jse-bad{background:#27201f !important;border-color:#e0625c !important;color:#e6edf3 !important;-webkit-text-fill-color:#e6edf3 !important;}
textarea.biz-jsone-ta::selection,.biz-jsone .biz-jsone-ta::selection{background:#2f4670;color:#fff;-webkit-text-fill-color:#fff;}

/* 富文本编辑器（wangEditor）—— Type:"richtext" 字段（文章内容等） */
.biz-richtext-raw{display:none;}
.biz-richtext-editor{border:1px solid #e6e6e6;border-radius:3px;}
.biz-richtext-editor .w-e-toolbar{flex-wrap:wrap;}
.biz-richtext-editor .w-e-text-container{border-color:#f0f0f0 !important;}
.biz-richtext-editor .w-e-text{padding:8px 14px;}
/* 「源码」视图：HTML 源码编辑文本域（与所见即所得视图同高，互斥显示） */
.biz-richtext-src{display:none;width:100%;height:300px;box-sizing:border-box;
  padding:9px 13px;margin:0;border:0;border-top:1px solid #f0f0f0;resize:vertical;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:12.5px;line-height:1.7;color:#33485e;background:#f8fafc;outline:none;}
.biz-richtext-src:focus{background:#fff;}
/* 源码模式下其余菜单禁用（仅「源码」按钮可点） */
.biz-richtext.src-on .w-e-menu:not(.biz-rt-srcbtn){pointer-events:none;opacity:.35;}

/* 数字框 affix（步进器）：聚焦时分隔线跟随主题色，而非 layui 内置绿 */
.layui-input-wrap .layui-input:focus + .layui-input-split{border-color:var(--app-primary) !important;}

/* 标签输入框（Type:"chips"）—— 服务项目这类用户自由输入的多 tag 字段 */
.biz-chips-box{display:flex;flex-wrap:wrap;align-items:center;gap:5px 6px;
  min-height:38px;padding:4px 8px;border:1px solid #e6e6e6;border-radius:2px;
  background:#fff;cursor:text;transition:border-color .15s;}
.biz-chips-box:focus-within{border-color:var(--app-primary);}
.biz-chips-chip{display:inline-flex;align-items:center;gap:2px;
  padding:2px 4px 2px 9px;border-radius:2px;background:#f3f4f6;color:#374151;
  font-size:12px;line-height:1.8;border:1px solid #e5e7eb;user-select:none;}
.biz-chips-chip .biz-chips-x{display:inline-block;width:16px;height:16px;
  line-height:14px;text-align:center;color:#9ca3af;border-radius:50%;
  cursor:pointer;font-size:14px;}
.biz-chips-chip .biz-chips-x:hover{background:rgba(0,0,0,.08);color:#ef4444;}
.biz-chips-input{flex:1;min-width:120px;border:0;outline:none;background:transparent;
  height:28px;font-size:13px;color:inherit;padding:0 2px;}

/* === episodepicker 可视化选集网格（短剧「指定会员集」） === */
.biz-eppicker-grid{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px;
  max-height:180px;overflow-y:auto;padding:2px;}
.biz-eppicker-cell{width:40px;height:32px;border:1px solid #d9dde3;border-radius:6px;
  background:#fff;color:#555;font-size:13px;line-height:30px;text-align:center;
  cursor:pointer;padding:0;transition:.12s;}
.biz-eppicker-cell:hover{border-color:var(--app-primary);}
.biz-eppicker-cell.on{background:#ffb800;border-color:#f0a500;color:#fff;font-weight:600;}
.biz-eppicker-hint{color:#999;font-size:12px;line-height:32px;}

/* === picker_multi 可视化内容选择器（专题短剧 / 关联短剧等） === */
.biz-pm-list{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px;}
.biz-pm-empty{color:#9aa0a6;font-size:12px;padding:6px 2px;}
.biz-pm-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px 4px 6px;
  border:1px solid #e5e7eb;border-radius:6px;background:#f7f8fa;max-width:220px;
  cursor:default;user-select:none;}
.biz-pm-chip[draggable=true]{cursor:grab;}
.biz-pm-chip .biz-pm-ord{flex:none;width:16px;height:16px;line-height:16px;text-align:center;
  font-size:11px;color:#fff;background:var(--app-primary,#3a6ea5);border-radius:50%;}
.biz-pm-cover{flex:none;width:26px;height:35px;object-fit:cover;border-radius:3px;background:#e9ebef;}
.biz-pm-cover-ph{display:inline-block;}
.biz-pm-label{font-size:12px;color:#374151;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.biz-pm-chip .biz-pm-x{flex:none;width:16px;height:16px;line-height:14px;text-align:center;
  color:#9ca3af;border-radius:50%;cursor:pointer;font-size:14px;}
.biz-pm-chip .biz-pm-x:hover{background:rgba(0,0,0,.08);color:#ef4444;}
/* 弹层：搜索 + 封面网格 + 分页 */
.biz-pm-dlg{padding:12px 16px;display:flex;flex-direction:column;height:100%;box-sizing:border-box;}
.biz-pm-dlg-head{flex:none;margin-bottom:10px;display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
.biz-pm-dlg-head .biz-pm-search{flex:1;min-width:200px;}
.biz-pm-filters{display:flex;gap:8px;flex-wrap:wrap;}
.biz-pm-filter{height:38px;border:1px solid #e6e6e6;border-radius:4px;padding:0 8px;
  font-size:13px;color:#374151;background:#fff;cursor:pointer;max-width:150px;}
.biz-pm-grid{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;display:grid;
  grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;align-content:start;}
.biz-pm-loading{grid-column:1/-1;text-align:center;color:#9aa0a6;padding:30px 0;}
.biz-pm-card{position:relative;min-width:0;box-sizing:border-box;border:2px solid #eceef2;
  border-radius:8px;padding:6px;cursor:pointer;transition:border-color .12s,box-shadow .12s;background:#fff;}
.biz-pm-card:hover{border-color:#c7d4e6;}
.biz-pm-card.on{border-color:var(--app-primary,#3a6ea5);box-shadow:0 0 0 2px rgba(58,110,165,.12);}
.biz-pm-card-cover{display:block;width:100%;max-width:100%;height:130px;object-fit:cover;
  border-radius:5px;background:#e9ebef;}
.biz-pm-card-name{display:block;margin-top:5px;font-size:12px;color:#374151;line-height:1.35;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.biz-pm-card-tick{position:absolute;top:8px;right:8px;width:20px;height:20px;line-height:20px;
  text-align:center;border-radius:50%;background:var(--app-primary,#3a6ea5);color:#fff;font-size:12px;
  opacity:0;transform:scale(.6);transition:.12s;}
.biz-pm-card.on .biz-pm-card-tick{opacity:1;transform:scale(1);}
.biz-pm-pager{flex:none;display:flex;justify-content:center;align-items:center;gap:8px;padding-top:10px;}
.biz-pm-page{font-size:12px;color:#3a6ea5;cursor:pointer;padding:3px 10px;border:1px solid #dbe3ee;border-radius:4px;}
.biz-pm-page.cur{color:#606266;border-color:transparent;cursor:default;}
.biz-pm-page.disabled{color:#c0c4cc;border-color:#eceef2;cursor:not-allowed;}

/* 跳转路由单选框下方的逐项说明 */
.biz-route-help{font-size:12px;color:#5a6472;line-height:1.7;background:#fafbfc;
  border:1px solid #ebeef5;border-radius:5px;padding:7px 10px;margin-top:4px;}
.biz-route-help>b{color:#303133;}
.biz-route-help ul{margin:5px 0 0;padding-left:18px;}
.biz-route-help li{margin:2px 0;}
.biz-route-help li b{color:#303133;}

/* 分组 checkboxes 按钮风格（feature_codes 等"复选按钮"场景）：
   隐藏原生 input，label 渲染为两行按钮（上：名称 / 下：编码）；
   选中态用 :has(input:checked) 实时反映，不依赖 JS 切 class。 */
.biz-cb-btn-group{display:flex;flex-wrap:wrap;align-items:flex-start;gap:6px 10px;flex:1;}
.biz-cb-btn{position:relative;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;
  min-width:108px;padding:6px 12px;border:1px solid #dcdfe6;border-radius:4px;
  background:#fff;cursor:pointer;transition:all .15s;line-height:1.25;user-select:none;
  overflow:hidden;}
.biz-cb-btn:hover{border-color:#a3a6ad;}
.biz-cb-btn .biz-cb-name{font-size:13px;color:#303133;}
.biz-cb-btn .biz-cb-code{font-size:11px;color:#909399;margin-top:2px;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;}
.biz-cb-btn input[type=checkbox]{position:absolute;width:0;height:0;
  opacity:0;pointer-events:none;}
.biz-cb-btn:has(input:checked){border-color:#1e9fff;background:#ecf5ff;}
.biz-cb-btn:has(input:checked) .biz-cb-name{color:#1e6fd9;font-weight:500;}
.biz-cb-btn:has(input:checked) .biz-cb-code{color:#1e9fff;}
/* 选中态右上角勾标：::after 画蓝色直角三角，::before 在三角上叠白色 ✓。
   默认 opacity:0（不占位），选中切到 1，纯 CSS 不依赖 JS。 */
.biz-cb-btn::after{content:"";position:absolute;top:0;right:0;width:18px;height:18px;
  background:#1e9fff;clip-path:polygon(100% 0,100% 100%,0 0);
  opacity:0;transition:opacity .12s;pointer-events:none;}
.biz-cb-btn::before{content:"\2713";position:absolute;top:0;right:1px;
  color:#fff;font-size:11px;line-height:1;font-weight:700;z-index:2;
  opacity:0;transition:opacity .12s;pointer-events:none;}
.biz-cb-btn:has(input:checked)::after,
.biz-cb-btn:has(input:checked)::before{opacity:1;}

/* 视频编辑表单的内联标签复选按钮 —— 紧凑变体 + 内联分组容器。
   仅 movie/_movie_detail_form.gohtml 使用；其它内容编辑页仍走共用弹窗 biz_tagfield。 */
.biz-cb-btn.biz-cb-btn-compact{flex-direction:row;align-items:center;gap:6px;
  min-width:0;padding:3px 9px;line-height:1.5;}
.biz-cb-btn.biz-cb-btn-compact .biz-cb-name{font-size:12.5px;}
.biz-cb-btn.biz-cb-btn-compact .biz-cb-code{font-size:11px;color:#a8b0bb;margin:0;}
.biz-cb-btn.biz-cb-btn-compact::after{width:14px;height:14px;}
.biz-cb-btn.biz-cb-btn-compact::before{font-size:9px;right:1px;top:-1px;}

.biz-tagfield-inline .biz-tagfield-group{margin-bottom:8px;}
.biz-tagfield-inline .biz-tagfield-group-title{
  color:#606266;font-size:13px;font-weight:500;margin:4px 0 4px;}
.biz-tagfield-inline .biz-tagfield-btn-group{
  display:flex;flex-wrap:wrap;gap:5px 7px;}
.biz-tagfield-inline .biz-cb-btn.biz-tag-hidden{display:none;}

/* ===== 顶部一键清缓存按钮（扫把 emoji 对齐其它 layui-icon 视觉） ===== */
/* layui 内置图标没有"扫把"款；用 unicode 🧹（U+1F9F9）渲染，跨平台均有 emoji
   字形。font-size 与 .layui-icon 默认（18px）对齐，行高继承 nav。
   click 时加 .biz-pending 半透明态防双击。 */
.gva-broom{font-size:18px;line-height:1;display:inline-block;vertical-align:middle;
  transform:translateY(-1px);font-style:normal;}
[data-clear-cache].biz-pending{opacity:.5;pointer-events:none;}
[data-clear-cache]:hover .gva-broom{transform:translateY(-1px) rotate(-12deg);
  transition:transform .15s ease-out;}

/* 所属菜单 sidebar 主题色变量 — 每个主题各自的主色派生
   (color-mix 现代浏览器支持;后台环境无兼容包袱) */
body { --biz-sidebar-accent: #3b82f6; }
body.theme-default      { --biz-sidebar-accent: var(--gva-primary, #3b82f6); }
body.theme-celadon      { --biz-sidebar-accent: var(--cel-primary, #2f9b8b); }
body.theme-cream        { --biz-sidebar-accent: var(--cream-primary, #c0673c); }
body.theme-graphite     { --biz-sidebar-accent: var(--gp-accent,   #5e6ad2); }
body.theme-iris         { --biz-sidebar-accent: var(--iris-primary, #7857d8); }
body.theme-midnight     { --biz-sidebar-accent: var(--mid-primary,  #6366f1); }
body.theme-ocean        { --biz-sidebar-accent: var(--ocean-primary,#1890ff); }
body.theme-pearl        { --biz-sidebar-accent: var(--pearl-primary,#1e9fff); }
body.theme-rouge        { --biz-sidebar-accent: var(--rouge-primary,#c43d52); }
body.theme-sunset       { --biz-sidebar-accent: var(--sunset-primary,#f97316); }
body {
  --biz-sidebar-accent-strong:      color-mix(in srgb, var(--biz-sidebar-accent) 75%, #000);
  --biz-sidebar-accent-soft:        color-mix(in srgb, var(--biz-sidebar-accent) 12%, #fff);
  --biz-sidebar-accent-soft-border: color-mix(in srgb, var(--biz-sidebar-accent) 30%, #fff);
}

/* 模块列表左侧"所属菜单"sidebar(JS 注入,无对应 HTML)
   - left 12px:跟左侧 admin 主菜单留间距
   - top 12px:跟右侧 toolbar 顶部对齐(layui-card-body 自带 padding 一致)
   - bottom 12px:跟整个 layout 留底边距
   - 260px 宽,边框+轻阴影,卡片化(跟右侧主区视觉一致) */
#biz-block-nav-sidebar {
  position: fixed;
  left: 12px;
  top: 12px;
  bottom: 12px; /* 跟右侧 table card 底部对齐(三边等距 12px) */
  width: 230px;
  background: #fff;
  border: 1px solid #e4e7ed;
  border-radius: 4px;
  box-shadow: 0 2px 6px rgba(0,0,0,.06);
  z-index: 50;
  overflow-y: auto;
  font-size: 13px;
}
#biz-block-nav-sidebar .biz-bn-head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 14px;
  border-bottom: 1px solid #ebeef5;
  background: #fafbfc;
  position: sticky; top: 0; z-index: 1;
}
#biz-block-nav-sidebar .biz-bn-title {
  font-weight: 600;
  color: #303133;
  flex: 0 0 auto;
}
#biz-block-nav-sidebar .biz-bn-spacer { flex: 1; }
#biz-block-nav-sidebar .biz-bn-refresh {
  color: #909399; font-size: 16px; text-decoration: none;
  padding: 0 4px; cursor: pointer; transition: color .15s;
  display: inline-block;
}
#biz-block-nav-sidebar .biz-bn-refresh:hover { color: var(--biz-sidebar-accent, #3b82f6); }
#biz-block-nav-sidebar .biz-bn-refresh.spin { animation: biz-bn-spin .6s linear; }
@keyframes biz-bn-spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}
#biz-block-nav-sidebar .biz-bn-all {
  display: inline-block;
  padding: 3px 12px;
  background: #f5f7fa;
  border: 1px solid #dcdfe6;
  border-radius: 3px;
  color: #606266;
  text-decoration: none;
  font-size: 12px;
  transition: all .15s;
}
#biz-block-nav-sidebar .biz-bn-all:hover {
  background: var(--biz-sidebar-accent-soft, #ecf5ff);
  border-color: var(--biz-sidebar-accent, #3b82f6);
  color: var(--biz-sidebar-accent, #3b82f6);
}
#biz-block-nav-sidebar .biz-bn-all.on {
  background: var(--biz-sidebar-accent, #3b82f6);
  border-color: var(--biz-sidebar-accent, #3b82f6);
  color: #fff;
}
#biz-block-nav-sidebar .biz-bn-list { padding: 6px 0; }
#biz-block-nav-sidebar .biz-bn-item {
  display: block;
  padding: 8px 16px;
  color: #303133;
  text-decoration: none;
  border-left: 3px solid transparent;
  line-height: 1.4;
  transition: background .15s;
}
#biz-block-nav-sidebar .biz-bn-item:hover { background: #f5f7fa; color: var(--biz-sidebar-accent, #3b82f6); }
#biz-block-nav-sidebar .biz-bn-item.on {
  background: var(--biz-sidebar-accent-soft, #ecf5ff);
  color: var(--biz-sidebar-accent, #3b82f6);
  border-left-color: var(--biz-sidebar-accent, #3b82f6);
  font-weight: 500;
}
#biz-block-nav-sidebar .biz-bn-item.disabled {
  color: #c0c4cc;
  text-decoration: line-through;
}
#biz-block-nav-sidebar .biz-bn-item { display: flex; align-items: center; gap: 6px; }
#biz-block-nav-sidebar .biz-bn-item .biz-bn-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#biz-block-nav-sidebar .biz-bn-style {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 11px;
  color: var(--biz-sidebar-accent-strong, #1d4ed8);
  background: var(--biz-sidebar-accent-soft, #ecf5ff);
  padding: 1px 6px;
  border-radius: 3px;
  line-height: 1.4;
}
#biz-block-nav-sidebar .biz-bn-style-key {
  font-family: SFMono-Regular, Consolas, monospace;
}
#biz-block-nav-sidebar .biz-bn-style-sep { opacity: .4; }
#biz-block-nav-sidebar .biz-bn-style-mode { font-weight: 500; }
#biz-block-nav-sidebar .biz-bn-style.nonmod {
  color: #909399;
  background: #f5f7fa;
}

/* 非模块样式占位:点击非模块 nav 时,layui-table-view 隐藏,这块顶上,
   居中显示在 card-body 内,仿 layui 暂无数据视觉但语义不同。 */
.biz-nonmod-placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 380px;
  height: 100%;
}
.biz-nonmod-ph-inner {
  text-align: center;
  padding: 24px 32px;
  max-width: 460px;
}
.biz-nonmod-ph-title {
  font-size: 16px;
  font-weight: 600;
  color: #606266;
  margin-bottom: 10px;
}
.biz-nonmod-ph-style {
  font-size: 13px;
  color: #909399;
  margin-bottom: 10px;
}
.biz-nonmod-ph-style code {
  background: #f5f7fa;
  color: #606266;
  padding: 2px 8px;
  border-radius: 3px;
  font-family: SFMono-Regular, Consolas, monospace;
  font-size: 12px;
}
.biz-nonmod-ph-hint {
  font-size: 12px;
  color: #c0c4cc;
  line-height: 1.6;
}
#biz-block-nav-sidebar .biz-bn-pos {
  color: #909399;
  font-size: 11px;
  font-family: SFMono-Regular, Consolas, monospace;
}
#biz-block-nav-sidebar .biz-bn-empty {
  padding: 24px 16px;
  text-align: center;
  color: #c0c4cc;
}

/* 当 sidebar 注入时给主区左内边距(sidebar 在左) */
body.biz-with-nav-sidebar,
.layui-card-body.biz-with-nav-sidebar { padding-left: 236px !important; }

/* 模块列表筛选项工具栏 (独立 card 包裹后,这里只管内部 flex 布局) */
#biz-block-toolbar {
  display: flex;
  gap: 16px;
  align-items: center;
}
/* 包 toolbar 的独立 card — 放在 table 之上,z-index 提到 100
   (盖过 layui-table-fixed 列的绝对定位层,避免滚动时遮挡 toolbar) */
.biz-toolbar-card {
  position: relative;
  z-index: 100;
}
.biz-toolbar-card .layui-card-body {
  padding: 14px 16px;
}

/* nav 分组 — 醒目色块化:左侧蓝色色条 + 浅蓝背景 + 蓝粗体字 + 圆形数字徽章 */
#biz-block-nav-sidebar .biz-bn-group { padding: 0; }
#biz-block-nav-sidebar .biz-bn-group + .biz-bn-group { margin-top: 8px; }
/* 分组头 — 中性灰底色块,跟菜单选中(主题色)明显区分:
   - 深灰背景色块,有"标题区"实体感
   - 深灰粗体字凸显
   - 左侧细灰条做标题徽记
   - 完全不用主题色,避免跟选中态混 */
#biz-block-nav-sidebar .biz-bn-group-head {
  padding: 8px 12px;
  font-size: 12px;
  color: #303133;
  font-weight: 700;
  letter-spacing: .3px;
  background: #f0f2f5;
  border-left: 3px solid #909399;
  border-bottom: 1px solid #e4e7ed;
  display: flex;
  align-items: center;
}
#biz-block-nav-sidebar .biz-bn-group-key {
  margin-left: 6px;
  font-family: SFMono-Regular, Consolas, monospace;
  font-size: 11px;
  font-weight: 500;
  color: #909399;
}
#biz-block-nav-sidebar .biz-bn-group-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 18px;
  background: #606266;
  color: #fff;
  font-size: 11px;
  padding: 0 6px;
  border-radius: 9px;
  margin-left: 8px;
  font-weight: 600;
}

/* ============ 模块列表表内滚动模式(仅 *Block/list 启用) ============
   锁定 .layui-table-view 高度,让 layui 原生 .layui-table-main 接管表数据滚动。
   高度由 JS bizApplyInternalScroll 动态算,这里只设 flex column 让内部三段
   (tool / box / page)正确比例。 */
body.biz-list-internal-scroll .layui-table-view {
  display: flex;
  flex-direction: column;
  min-height: 480px; /* layui reload 重建 view → JS fit 之间 view 无 height,兜住防塌 0 */
}
body.biz-list-internal-scroll .layui-table-tool { flex: 0 0 auto; }
body.biz-list-internal-scroll .layui-table-box {
  flex: 1 1 0;
  min-height: 0;
  position: relative;
}
body.biz-list-internal-scroll .layui-table-page { flex: 0 0 auto; }
body.biz-list-internal-scroll .layui-table-main {
  overflow-y: auto !important;
  height: 100% !important;
  max-height: none !important;
  min-height: 360px;
}
body.biz-list-internal-scroll .layui-table-fixed .layui-table-body {
  overflow: hidden;
  height: 100%;
}

#biz-block-toolbar .biz-bt-cell { display: flex; align-items: center; gap: 6px; }
#biz-block-toolbar label { font-size: 13px; color: #606266; margin: 0; white-space: nowrap; }
#biz-block-toolbar .biz-bt-name {
  height: 32px; width: 220px;
  padding: 0 10px; border: 1px solid #dcdfe6; border-radius: 3px;
  outline: none; transition: border-color .15s;
}
#biz-block-toolbar .biz-bt-name:focus { border-color: #3b82f6; }
#biz-block-toolbar .biz-bt-disabled {
  height: 32px; width: 110px;
  padding: 0 8px; border: 1px solid #dcdfe6; border-radius: 3px;
  background: #fff; outline: none;
}

/* 只读·中台同步字段（SimpleField.Disabled）：变灰 + 禁交互（后端 Save 也忽略，UI 仅表象） */
.biz-form-disabled .layui-input,
.biz-form-disabled .layui-textarea,
.biz-form-disabled select,
.biz-form-disabled .layui-form-radio,
.biz-form-disabled .layui-input-block img { opacity:.6; pointer-events:none; background:#F6F2F3; cursor:not-allowed; }
.biz-form-disabled .layui-input-block { pointer-events:none; }
.biz-form-lock { font-size:11px; color:#C77E99; font-weight:400; margin-left:4px; }
