/* ==========================================================================
   后台统一 UI 组件库样式（2026-10-25 · A01）
   ak- 前缀，与 admin.css 现有 admin-* 类完全隔离。
   这样可以分批迁移、随时回退，迁移完成后统一清理旧类。
   规则来源：三月兽-12 总纲 §5.6「后台列表页通用规范」（用户 2026-10-25 拍板）
   ========================================================================== */

/* ---------- 1. 统一筛选工具条 ---------- */
.ak-filter-bar {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 12px;
  padding: 10px 12px;
  background: var(--ding-surface, #ffffff);
  border: 1px solid var(--ding-border, #e5e6eb);
  border-radius: var(--ding-radius-lg, 10px);
  box-shadow: var(--ding-shadow-sm, 0 1px 2px rgba(15, 23, 42, 0.04));
}
/* ---------- 筛选控件区：改用 Grid（2026-10-25 修「筛选框重叠」）----------
   根因：flex 布局下，Element 的 el-select / el-date-editor 是 Vue 组件，
   内部结构（两个 range input + 分隔符）会按自身规则排版，
   父级即使 flex-wrap 也压不住内部溢出 → 视觉上就是「叠在一起」。
   修法：Grid 布局。每个控件独占一个格子，格子宽度自适应，
   放不下自动换行到下一行，**结构上不可能重叠**。 */
.ak-filter-bar__filters {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  align-items: center;
  gap: 10px;
  flex: 1 1 auto;
  min-width: 0;
}
.ak-filter-bar__filters > .el-input,
.ak-filter-bar__filters > .el-select,
.ak-filter-bar__filters > .el-date-editor,
.ak-filter-bar__filters > .el-checkbox {
  width: 100% !important;
  min-width: 0;
}
/* 🔴 2026-10-25 修「第2/3/4个筛选框互相盖住」
   根因：下面这两条是**后代选择器**，会命中 Element 复合控件**内部**的 .el-input：
   Element UI 的 el-select 结构是 .el-select > .el-input > input，
   于是 `.ak-filter-bar .el-input{width:220px}` 把每个下拉框的内部输入框撑成 220px，
   而外层 .el-select 只有一格宽（~150px）→ 内部溢出、盖住右边那个控件。
   修法：宽度只作用在 grid 的**直接子级**；复合控件内部强制跟随外层宽度。 */
.ak-filter-bar .el-select > .el-input,
.ak-filter-bar .el-date-editor > .el-input {
  width: 100% !important;
  min-width: 0;
}
.ak-filter-bar .el-select .el-input__inner { width: 100%; }
/* 日期区间占两格（两个输入框才放得下） */
.ak-filter-bar__filters > .el-date-editor--daterange,
.ak-filter-bar__filters > .el-date-editor--datetimerange {
  grid-column: span 2;
}
.ak-filter-bar__ops {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
}
.ak-filter-bar__actions {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
  flex: 0 0 auto;
}
/* ---------- 筛选控件尺寸（2026-10-25 修「操作日志搜索框重叠」） ----------
   🔴 第二次修同一个 bug：这次是**后代选择器**造成的。
   Element UI 的结构是 `.el-select > .el-input > input`，
   旧规则 `.ak-filter-bar .el-input { width: 220px }` 会命中**下拉框内部**那个
   .el-input → 内部输入框 220px、外层 .el-select 只有一格（~150px）
   → 内部溢出到右边，被下一个筛选框盖住 → 看起来「第2/3/4个筛选框互相重叠」。
   修法：宽度只作用在 grid 的**直接子级**；复合控件内部强制 100% 跟随外层。 */
.ak-filter-bar .el-input__inner { height: 32px; line-height: 32px; }
.ak-filter-bar .el-button { margin-left: 0; }
/* 日期控件内部：两个 range 输入按百分比收缩，不再撑破外层 */
.ak-filter-bar .el-date-editor .el-range-input { min-width: 0; width: 39%; }
.ak-filter-bar .el-date-editor--daterange,
.ak-filter-bar .el-date-editor--datetimerange { min-width: 0; }
.ak-filter-bar .el-date-editor--monthrange { min-width: 0; }
/* 换行策略：按钮组与主操作各自成组，不被挤散 */
.ak-filter-bar__ops,
.ak-filter-bar__actions {
  row-gap: 8px;
}
/* 窄屏（<1280px）时，主操作另起一行靠右，避免和筛选按钮重叠 */
@media (max-width: 1280px) {
  .ak-filter-bar__actions {
    margin-left: 0;
    width: 100%;
    justify-content: flex-end;
  }
}

/* ---------- 告警与异常 / 编排异常子签 ---------- */
.ops-center-page { display: flex; flex-direction: column; gap: 12px; }
.ops-center-intro { margin-bottom: 0; }
.ops-center-main-tabs > .el-tabs__content { padding: 12px 0 0; }
.ops-center-main-tabs .admin-list-page { border: none; box-shadow: none; }
.exception-sub-tabs { margin-bottom: 8px; }
.exception-sub-tabs .el-tabs__header { margin-bottom: 0; }
.exception-sub-tabs .el-tabs__nav-wrap { overflow: visible; }
.exception-sub-tabs .el-tabs__nav-scroll { overflow-x: auto; overflow-y: hidden; }
.exception-tab-badge { margin-left: 6px; vertical-align: text-top; }
.exception-tab-badge .el-badge__content { border: none; }
.exception-center-pane > .ak-filter-bar { margin-top: 4px; }

/* ---------- 2. 统一分页（右下角） ---------- */
.ak-pager {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 12px;
  padding-top: 12px;
}
.ak-pager__total {
  color: var(--ding-muted, #646a73);
  font-size: 13px;
  white-space: nowrap;
}
.ak-pager .el-pagination { padding: 0; }
.ak-pager .el-pagination__total { font-weight: 400; }

/* ---------- 3. 统一弹窗表单 ---------- */
.ak-form__error {
  margin-bottom: 12px;
  padding: 8px 12px;
  border-radius: var(--ding-radius-sm, 6px);
  background: #fef0f0;
  border: 1px solid #fbc4c4;
  color: #d93026;
  font-size: 13px;
  line-height: 1.6;
}
.ak-form__body { max-height: 62vh; overflow-y: auto; }
.ak-form__footer { display: inline-flex; gap: 8px; }
.ak-form__footer .el-button { margin-left: 0; }

/* 表单行：标签在上、输入在下、错误紧跟其后（错误不飘提示） */
.ak-field { margin-bottom: 14px; }
.ak-field:last-child { margin-bottom: 0; }
.ak-field__label {
  display: block;
  margin-bottom: 6px;
  font-size: 13px;
  color: var(--ding-text-secondary, #373c43);
}
.ak-field__label .ak-field__required { color: #d93026; margin-left: 2px; }
.ak-field__error {
  margin: 6px 0 0;
  color: #d93026;
  font-size: 12px;
  line-height: 1.5;
}
.ak-field__hint {
  margin: 6px 0 0;
  color: var(--ding-placeholder, #8f959e);
  font-size: 12px;
  line-height: 1.5;
}

/* ---------- 4. 统一表格 ---------- */
.ak-table { width: 100%; }
.ak-table .el-table__header th {
  background: #fafbfc;
  font-weight: 500;
  color: var(--ding-text-secondary, #373c43);
}
.ak-table .cell { word-break: break-word; }
.ak-table .el-table__body tr:hover > td { background: var(--ding-brand-soft, #e6f3ff); }

/* ---------- 5. 统一空态 ---------- */
.ak-empty {
  padding: 44px 0;
  text-align: center;
  color: var(--ding-placeholder, #8f959e);
}
.ak-empty__icon {
  font-size: 30px;
  color: var(--ding-border, #e5e6eb);
  display: block;
  margin-bottom: 8px;
}
.ak-empty__text { margin: 0; font-size: 13px; color: var(--ding-muted, #646a73); }
.ak-empty__hint { margin: 6px 0 0; font-size: 12px; color: var(--ding-placeholder, #8f959e); }

.dash-kpi-label-title .el-tooltip {
  display: inline;
  vertical-align: baseline;
}

.dash-kpi-label-title .ak-help-icon {
  margin-left: 3px;
}

.ak-help-icon {
  margin-left: 4px;
  font-size: 14px;
  color: #c0c4cc;
  cursor: help;
  vertical-align: -1px;
  transition: color 0.15s;
}

.ak-help-icon:hover {
  color: #909399;
}

.el-tooltip__popper.ak-help-tooltip {
  max-width: 360px;
  line-height: 1.55;
  font-size: 12px;
  padding: 10px 12px;
}

/* ---------- 6. 统一页面外壳（配合 admin-list-page 使用） ---------- */
.ak-page {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
.ak-page__body {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
.ak-page__table {
  flex: 1;
  min-height: 0;
  overflow: hidden;
}

/* ---------- 7. tab 右侧的补充说明（靠右，不挤在筛选框里） ---------- */
.admin-subtabs-hint {
  margin-left: auto;
  color: var(--ding-muted, #646a73);
  font-size: 12px;
  white-space: nowrap;
}

/* ==========================================================================
   8. 全局弹框统一规格
   所有弹框都是「整个后台页面」的浮层：弹框与遮罩都挂到 body（append-to-body +
   modal-append-to-body 必须同时给），这样遮罩永远在弹框之下、内容之上，
   不会被页面里的滚动容器裁剪。
   z-index 由 Element UI 的 PopupManager 统一递增加载 —— **不要在 CSS 里写死 z-index**，
   否则嵌套弹框会互相盖住。这里只统一视觉规格。
   ========================================================================== */
.el-dialog {
  border-radius: var(--ding-radius-lg, 10px);
  overflow: hidden;
}
.el-dialog__header {
  padding: 16px 20px;
  border-bottom: 1px solid var(--ding-border, #e5e6eb);
}
.el-dialog__title {
  font-size: 15px;
  font-weight: 500;
  color: var(--ding-text, #1f2329);
  line-height: 1.4;
}
.el-dialog__headerbtn {
  top: 18px;
  right: 18px;
}
.el-dialog__body {
  padding: 20px;
  color: var(--ding-text-secondary, #373c43);
  line-height: 1.6;
}
.el-dialog__footer {
  padding: 12px 20px;
  border-top: 1px solid var(--ding-border, #e5e6eb);
}
.el-dialog__footer .el-button + .el-button { margin-left: 8px; }

/* ==========================================================================
   券模版页专属样式（bt- 前缀 = bojun template）
   2026-10-25 [A01]：本页样式定稿，之后不再改动
   ========================================================================== */

/* 「全适用」的标记：门店数/商品数为「全部」时显示 */
.bt-scope-all {
  display: inline-block;
  padding: 0 8px;
  border-radius: 10px;
  background: var(--ding-brand-soft, #e6f3ff);
  color: var(--ding-brand, #0089ff);
  font-size: 12px;
  line-height: 20px;
}

/* 有明细可展开的行 */
.bt-row-clickable { cursor: pointer; }
.bt-row-clickable:hover > td { background: var(--ding-brand-soft, #e6f3ff) !important; }

/* 「查看明细」 */
.bt-link { color: var(--ding-brand, #0089ff); cursor: pointer; }
.bt-link:hover { text-decoration: underline; }
.bt-bound-prize { color: #f56c6c; font-weight: 600; }

/* ---------- 同步明细抽屉 ---------- */
.bt-sync-detail { padding: 0 20px 24px; }
.bt-sync-detail__meta {
  padding: 10px 12px;
  margin-bottom: 16px;
  border-radius: var(--ding-radius-md, 8px);
  background: var(--ding-bg, #f2f4f7);
  color: var(--ding-muted, #646a73);
  font-size: 12px;
  line-height: 1.8;
}
.bt-sync-detail__group { margin-bottom: 20px; }
.bt-sync-detail__head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding-bottom: 8px;
  margin-bottom: 2px;
  border-bottom: 1px solid var(--ding-divider, #eff0f1);
}
.bt-sync-detail__dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex: 0 0 auto;
}
.bt-sync-detail__dot--success { background: #67c23a; }
.bt-sync-detail__dot--warning { background: #e6a23c; }
.bt-sync-detail__dot--danger { background: #f56c6c; }
.bt-sync-detail__label {
  font-size: 13px;
  font-weight: 500;
  color: var(--ding-text, #1f2329);
}
.bt-sync-detail__count {
  margin-left: auto;
  padding: 0 7px;
  border-radius: 9px;
  background: var(--ding-bg, #f2f4f7);
  color: var(--ding-muted, #646a73);
  font-size: 12px;
  line-height: 18px;
}
.bt-sync-detail__none {
  padding: 8px 0;
  color: #c0c4cc;
  font-size: 12px;
}
.bt-sync-detail__item {
  padding: 9px 0;
  border-bottom: 1px solid var(--ding-bg, #f2f4f7);
}
.bt-sync-detail__item:last-child { border-bottom: none; }
.bt-sync-detail__name {
  font-size: 13px;
  font-weight: 500;
  color: var(--ding-text, #1f2329);
}
.bt-sync-detail__code {
  margin-top: 2px;
  color: var(--ding-placeholder, #8f959e);
  font-size: 12px;
}

/* ==========================================================================
   9. 包装奖品页：奖品描述列完整展示
   用户 2026-10-25 要求「奖品描述要显示完整」——
   描述是多行文本（券规则 + 适用门店/商品清单），不能用 show-overflow-tooltip 截断。
   ========================================================================== */
.pkg-desc-cell {
  white-space: pre-wrap;      /* 保留描述里的换行，逐条显示 */
  word-break: break-word;     /* 长门店名/商品名不撑破表格 */
  line-height: 1.6;
  font-size: 12px;
  color: var(--ding-text-secondary, #373c43);
  max-height: 132px;          /* 约 6 行，超出部分可滚动查看 */
  overflow-y: auto;
}
.col-prize-desc .cell {
  padding-top: 8px;
  padding-bottom: 8px;
  vertical-align: top;
}

/* ==========================================================================
   10. 浮层层级兜底（2026-10-25 [A01] 修「遮罩压住抽屉」）
   ------------------------------------------------------------------
   根因：Element UI 的弹层 z-index 是 inline 写在 wrapper 上的，由
        PopupManager 递增分配；遮罩（.v-modal）也是 inline，且**只有一个全局实例**。
        如果弹层不 append-to-body，它就留在页面容器里 —— 它的 inline z-index
        只在「祖先的层叠上下文」内部有效，而遮罩挂在 body 顶层，
        于是出现「遮罩压在弹层上面」的怪现象（用户 2026-10-25 实测复现）。

   修法（主）：**所有弹层必须 append-to-body + modal-append-to-body**，
        弹层与遮罩同在 body 下 → 同一层叠上下文 → Element 自己的 z-index 分配就正确。
        已加检查脚本 scripts/check-admin-overlays.js 防止漏加。

   修法（辅）：wrapper 层禁止残留 transform。
        transform 会创建层叠上下文，把弹层的 inline z-index 困住。
        **只作用于 wrapper**，不动 .el-drawer / .el-dialog 内层 ——
        那两层是 Element 滑出/淡入动画的主体，写 transform 会破坏动画。
   ------------------------------------------------------------------
   注意：**这里绝不写死 z-index**。Element 的 PopupManager 会给每次打开的
        弹层递增分配，写死会导致嵌套弹框互相盖住。
   ========================================================================== */
.el-dialog__wrapper,
.el-drawer__wrapper {
  transform: none;
}

/* ==========================================================================
   11. 活动总览（2026-10-25 [A01] 重排）
   用户要求：
   - 「活动总览不要用渐变色，实在太丑了，换一个配色」
   - 「不需要显示这3个点（兑换积分/奖品库存/规则说明）」
   - 「这3个活动不能同时编辑」→ 页签切换，只渲染当前一个
   ========================================================================== */
.activity-hub {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
/* 2026-10-25 [A01]：顶部页签栏已删除（用户要求：总览卡片本身就是入口，
   页签可点会让人以为三个活动能同时编辑）。 */
/* 2026-10-29 重设计（用户拍板）：一行一卡竖排铺满，无阴影；左图标+标题+状态+描述 / 中 3 指标 / 右按钮+更新时间 */
.activity-hub-grid {
  display: flex;
  flex-direction: column;
  gap: 18px;
}
/* ---------- 卡片：浅色渐变背景（对齐 2026-10-29 用户拍板 demo），无阴影 ---------- */
.activity-hub-tile {
  display: flex;
  align-items: center;
  gap: 32px;
  padding: 26px 28px;
  border-radius: 16px;
  border: 2px solid #191c1e;
  position: relative;
  overflow: hidden;
  cursor: pointer;
  transition: transform 0.12s ease;
}
.activity-hub-tile::after {
  /* 右上角装饰圆（对齐 demo） */
  content: '';
  position: absolute;
  right: -46px;
  top: -46px;
  width: 150px;
  height: 150px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.55);
  border: 2px dashed rgba(25, 28, 30, 0.10);
  pointer-events: none;
}
.activity-hub-tile:hover { transform: translateY(-1px); }
/* 渐变背景（对齐 demo：140deg 三色渐变，最终落白） */
.activity-hub-tile--redeem { background: linear-gradient(140deg, #d9f3fa 0%, #f4fbff 60%, #ffffff 100%); }
.activity-hub-tile--wheel  { background: linear-gradient(140deg, #e8e0fc 0%, #f6f3ff 60%, #ffffff 100%); }
.activity-hub-tile--enroll { background: linear-gradient(140deg, #ffe9c8 0%, #fff8ec 60%, #ffffff 100%); }

/* 左：图标 + 标题状态描述 */
.activity-hub-tile-left {
  display: flex;
  align-items: center;
  gap: 18px;
  flex: 0 0 34%;
  min-width: 0;
}
.activity-hub-icon-wrap {
  flex-shrink: 0;
  width: 60px;
  height: 60px;
  border-radius: 16px;
  border: 2px solid #191c1e;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 28px;
  color: #191c1e;
}
.activity-hub-icon-wrap--redeem { background: #b9ecf7; }
.activity-hub-icon-wrap--wheel  { background: #e0d8fb; }
.activity-hub-icon-wrap--enroll { background: #ffe8c2; }
.activity-hub-tile-id { min-width: 0; }
.activity-hub-tile-title-row {
  display: flex;
  align-items: center;
  gap: 10px;
}
.activity-hub-tile-title {
  font-size: 20px;
  font-weight: 900;
  color: #191c1e;
  line-height: 1.3;
  white-space: nowrap;
}
.activity-hub-tile-status {
  font-size: 12px;
  font-weight: 800;
  padding: 4px 11px;
  border-radius: 999px;
  border: 2px solid #191c1e;
  background: #fff;
  white-space: nowrap;
  line-height: 1.4;
}
.activity-hub-tile-status--live { background: #d8f5e3; color: #1d7a44; }
.activity-hub-tile-status--none { background: #eceff1; color: #6b7280; }
.activity-hub-tile-desc {
  font-size: 13px;
  color: #506165;
  line-height: 1.5;
  margin-top: 8px;
}

/* 中：数据指标 */
.activity-hub-tile-metrics {
  display: flex;
  gap: 22px;
  flex: 1;
  min-width: 0;
  position: relative;
  z-index: 1;
}
.activity-hub-tile-metric {
  flex: 1;
  max-width: 150px;
  background: rgba(255, 255, 255, 0.88);
  border: 1.5px solid #191c1e;
  border-radius: 12px;
  padding: 12px 10px;
  text-align: center;
}
.activity-hub-tile-metric b {
  display: block;
  font-size: 20px;
  font-weight: 900;
  color: #191c1e;
  line-height: 1.2;
}
.activity-hub-tile-metric span {
  display: block;
  font-size: 12px;
  color: #506165;
  margin-top: 4px;
  white-space: nowrap;
}

/* 右：箭头 icon + 更新时间（用户要求不要按钮，用箭头） */
.activity-hub-tile-right {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 10px;
  position: relative;
  z-index: 1;
}
.activity-hub-tile-arrow {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: #191c1e;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 18px;
  font-weight: 800;
  transition: transform 0.12s ease;
}
.activity-hub-tile:hover .activity-hub-tile-arrow { transform: translateX(4px); }
.activity-hub-tile-updated {
  font-size: 11px;
  color: #909399;
  white-space: nowrap;
}

/* ==========================================================================
   12. 活动配置页（兑换机 / 大转盘统一）
   2026-10-25 [A01] 重写。act- 前缀（activity），与通用 ak- 组件库隔离。
   ========================================================================== */
.act-page {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
.act-page__inner {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 16px;
  /* 底部给常驻保存条让出位置，避免「投放奖品」和「保存配置」贴在一起 */
  padding-bottom: 16px;
}

/* ---------- 配置卡片 ---------- */
.act-card {
  flex: 0 0 auto;
  background: var(--ding-surface, #ffffff);
  border: 1px solid var(--ding-border, #e5e6eb);
  border-radius: var(--ding-radius-lg, 10px);
  box-shadow: var(--ding-shadow-sm, 0 1px 2px rgba(15, 23, 42, 0.04));
  overflow: hidden;
}
.act-card--grow {
  flex: 1 1 auto;
  min-height: 220px;
  max-height: 60vh;
  display: flex;
  flex-direction: column;
}
.act-card__head {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--ding-border, #e5e6eb);
  background: var(--ding-bg, #f7f8fa);
}
.act-card__title {
  font-size: 14px;
  font-weight: 600;
  color: var(--ding-text, #1f2329);
}
.act-card__ops {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 10px;
}
.act-card__body {
  padding: 16px;
}
.act-card__body--table {
  flex: 1;
  min-height: 0;
  padding: 0;
  overflow: hidden;
}
.act-form .el-form-item { margin-bottom: 16px; }
.act-form .el-form-item:last-child { margin-bottom: 0; }

/* ---------- 库存单元格（限量开关 + 数量） ----------
   用户反馈：「如果开启限量之后，这个页面会抖动一下，加载出来那个限量的输入框」
   修法：输入框**始终占位**（不因限量开关切换而增删 DOM），
   关闭限量时置灰禁用 → 切换不改变行高/列宽，表格不抖动。 */
.act-stock {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  flex-wrap: nowrap;
}
.act-stock .el-switch { flex: 0 0 auto; }
.act-stock__num {
  flex: 0 0 auto;
  width: 112px;
}

/* ---------- 奖品单元格 ---------- */
.act-prize-cell {
  display: flex;
  align-items: center;
  gap: 10px;
}
.act-prize-cell__thumb {
  width: 40px;
  height: 40px;
  flex: 0 0 auto;
  border-radius: 8px;
  object-fit: cover;
  background: var(--ding-bg, #f2f4f7);
}
.act-prize-cell__info { min-width: 0; }
.act-prize-cell__name {
  font-size: 13px;
  font-weight: 500;
  color: var(--ding-text, #1f2329);
  line-height: 1.4;
}
.act-prize-cell__sku {
  font-size: 12px;
  color: var(--ding-placeholder, #8f959e);
  margin-top: 2px;
}

/* ---------- 活动页：图片上传行（报名活动详情长图） ---------- */
.act-upload-row {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
}
.act-upload-preview {
  margin-top: 8px;
  max-width: 260px;
  max-height: 180px;
  border: 1px solid var(--ding-border, #e5e6eb);
  border-radius: 8px;
  background: var(--ding-bg, #f7f8fa);
}
.act-upload-hint {
  color: var(--ding-placeholder, #8f959e);
  font-size: 12px;
}
/* 多张详情长图缩略图列表（竖向拼接预览，可删除） */
.act-detail-imgs {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 10px;
}
.act-detail-img-item {
  position: relative;
  width: 96px;
  height: 130px;
  border: 1px solid var(--ding-border, #e5e6eb);
  border-radius: 8px;
  overflow: hidden;
  background: var(--ding-bg, #f7f8fa);
}
.act-detail-img-thumb {
  width: 100%;
  height: 100%;
  display: block;
}
.act-detail-img-del {
  position: absolute;
  top: 2px;
  right: 2px;
  width: 20px;
  height: 20px;
  line-height: 18px;
  text-align: center;
  border-radius: 50%;
  background: rgba(25, 28, 30, 0.65);
  color: #fff;
  font-size: 14px;
  cursor: pointer;
}
.act-detail-img-idx {
  position: absolute;
  left: 2px;
  bottom: 2px;
  padding: 0 6px;
  border-radius: 8px;
  background: rgba(25, 28, 30, 0.6);
  color: #fff;
  font-size: 11px;
}

/* ---------- 添加奖品弹框 ---------- */
.act-pick {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.act-pick__list {
  height: 380px;
  overflow-y: auto;
  border: 1px solid var(--ding-border, #e5e6eb);
  border-radius: var(--ding-radius-md, 8px);
}
.act-pick__empty {
  padding: 48px 0;
  text-align: center;
  color: var(--ding-placeholder, #8f959e);
  font-size: 13px;
}
.act-pick__item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 12px;
  border-bottom: 1px solid var(--ding-bg, #f2f4f7);
}
.act-pick__item:last-child { border-bottom: none; }
.act-pick__item:hover { background: var(--ding-bg, #f7f8fa); }
.act-pick__thumb {
  width: 44px;
  height: 44px;
  flex: 0 0 auto;
  border-radius: 8px;
  object-fit: cover;
  background: var(--ding-bg, #f2f4f7);
}
/* 2026-10-25 用户要求：「我不需要默认图，没有图片就是没有图片」
   → 无图时显示占位块（不再偷偷塞 goods-1.png） */
.act-pick__noimg {
  width: 44px;
  height: 44px;
  flex: 0 0 auto;
  border-radius: 8px;
  background: var(--ding-bg, #f2f4f7);
  border: 1px dashed var(--ding-border, #e5e6eb);
  color: var(--ding-placeholder, #8f959e);
  font-size: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.act-pick__info { flex: 1; min-width: 0; }
.act-pick__name {
  font-size: 13px;
  font-weight: 500;
  color: var(--ding-text, #1f2329);
  line-height: 1.4;
}
.act-pick__sku {
  font-size: 12px;
  color: var(--ding-placeholder, #8f959e);
  margin-top: 2px;
}

/* ---------- 大转盘专属格（感谢参与 / 再抽一次） ---------- */
.act-special {
  padding: 14px 16px 12px;
  border-bottom: 1px solid var(--ding-border, #e5e6eb);
  margin-bottom: 0;
  flex: 0 0 auto;
}
.act-special .el-form-item { margin-bottom: 12px; }
.act-special .el-form-item:last-child { margin-bottom: 0; }
.act-special__sep {
  margin: 0 8rpx 0 12rpx;
  font-size: 13px;
  color: var(--ding-text-secondary, #506165);
}
/* 2026-10-25：概率明细（让用户看清合计 100% 是怎么凑出来的） */
.act-weight-detail {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 0 0 12px;
  font-size: 12px;
  color: var(--ding-text-secondary, #506165);
}
.act-weight-detail__label {
  font-weight: 500;
  color: var(--ding-text, #1f2329);
}
.act-weight-detail__item {
  padding: 2px 8px;
  border-radius: 10px;
  background: var(--ding-bg, #f2f4f7);
}
.act-weight-detail__item--total {
  background: transparent;
  font-weight: 500;
  color: var(--ding-text, #1f2329);
}
/* 2026-10-25：明细放到「投放奖品」标题后（head 内联）时，去掉页面体内默认的底部留白 */
.act-weight-detail--head {
  padding: 0;
  flex: 1;
  min-width: 0;
}

/* ==========================================================================
   13. 报名活动（列表页 + 配置页）2026-10-25 [A01]
   ========================================================================== */
.act-card--list {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
.act-card__body--list {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  padding: 16px;
}
.act-list {
  flex: 1;
  min-height: 0;
  overflow: hidden;
}
.act-roster {
  min-height: 320px;
  max-height: 460px;
  overflow-y: auto;
}
