/* =========================================================================
 * app.css — 本项目扩展组件（在 coke.css 参考皮肤之上叠加）
 * 加载顺序：coke.css → app.css（本文件在后，同权重时覆盖参考皮肤）
 * 组成：① 设计令牌 + 全局重置  ② 新皮肤缺失的少量补丁
 *      ③ 本项目既有组件（登录 / 共创 / 发布 / 生成 / 预览 / 角色库 / @引用）
 * ========================================================================= */

/* ───────────────────────── ① 设计令牌（参考皮肤未定义的部分） ───────────────────────── */
:root {
  --bg: #07080a;
  --panel: #0f1218;
  --panel-2: #14181f;
  --surface: rgba(255, 255, 255, 0.05);
  --line: rgba(255, 255, 255, 0.08);
  --line-2: rgba(255, 255, 255, 0.14);
  --tx: #eceef1;
  --tx-2: #9aa1ad;
  --tx-3: #616975;
  --spark: #ff6a3d;
  --spark-2: #ffb15c;
  --ok: #46d88a;
  --font: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB",
    "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
  --mono: ui-monospace, "SF Mono", Menlo, monospace;
}

* { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; }
html, body { height: 100%; }
body { overflow: hidden; font-family: var(--font); -webkit-font-smoothing: antialiased; }
button { font-family: inherit; }

/* ───────────────────────── ② 新皮肤补丁 ───────────────────────── */

/* 关键：本文件里凡是内联 SVG，都必须显式给定 width/height，
 * 否则 SVG 会退化成 300×150 的巨型图标把版面撑爆。 */

/* 尚未换皮的页签（榜单/社区/我的/创作中心）的内部滚动容器
 * （参考皮肤的 .screen 是「手机外壳」，不能再当滚动区用） */
.legacy-screen { height: 100%; overflow-y: auto; overscroll-behavior: contain; }
.legacy-screen::-webkit-scrollbar { width: 0; }

/* ── 首页 feed / 剧情页：真实画面铺底 ──
 * 参考皮肤的 .video-backdrop 用 CSS 渐变当「假视频」；我们换成真实剧照/视频，
 * 但保留同一套渐变压暗层（.vm-scrim），保证观感完全一致。 */
.video-backdrop.has-cover { background-image: none; }
.video-backdrop .vm-cover,
.video-backdrop .vm-video {
  position: absolute;
  inset: 0;
  z-index: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  background: #05070a;
}
.video-backdrop .vm-video { z-index: 1; }
.video-backdrop .vm-scrim {
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  background-image: linear-gradient(180deg, rgba(0, 0, 0, .08), rgba(0, 0, 0, .22) 46%, rgba(0, 0, 0, .86) 92%);
}
/* 横屏（16:9）片段在竖屏机身里做信箱式呈现，不裁画面（决策 D28） */
.video-backdrop.r-169 { background-color: #05070a; background-image: none; }
.video-backdrop.r-169 .vm-cover,
.video-backdrop.r-169 .vm-video { object-fit: contain; }

/* ── 剧情页：播放状态图标（用户需求：暂停时给一个额外的图标提示） ──
 * 暂停 → 画面正中常驻一颗「播放三角」，提示「点一下继续播放」；
 * 继续播放 → 闪现一下「暂停双竖条」确认已经接着播（约 0.6s 后自动淡出）。
 * ★ 这一层是**纯视觉**的：z-index 2（画面之上、选项层 3 之下），
 *   pointer-events:none —— 点击照旧穿透到 data-story-act="main"，
 *   也就是「点画面 = 暂停 / 继续」这条语义完全不变。
 * （为什么不给参考皮肤加：参考 demo 是 3 秒假倒计时、没有真实暂停，
 *   所以它压根没有这个图标；这是我们刻意的第三处偏离。） */
.vm-state {
  position: absolute;
  inset: 0;
  z-index: 2;
  display: grid;
  place-items: center;
  pointer-events: none;
}
.vm-state-badge {
  grid-area: 1 / 1;      /* 两颗图标叠在同一格里（不加会上下排开） */
  display: grid;
  place-items: center;
  width: 76px;
  height: 76px;
  border-radius: 50%;
  color: #fff;
  background: rgba(8, 10, 14, .4);
  border: 1px solid rgba(255, 255, 255, .18);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
  opacity: 0;
  transform: scale(.86);
  transition: opacity .18s ease, transform .18s ease;
}
.vm-state-badge svg { width: 30px; height: 30px; display: block; }
/* 播放三角在 24 格视图里本来就是偏右的，往左挪一点才是几何正中 */
.vm-state-play svg { margin-left: -2px; }
.vm-state.is-paused .vm-state-play { opacity: 1; transform: scale(1); }
/* 继续播放时「暂停双竖条」闪一下：放完靠 forwards 停在透明，js 届时摘掉类 */
.vm-state.is-flash .vm-state-pause { animation: vmStateFlash .62s ease forwards; }
@keyframes vmStateFlash {
  0%   { opacity: 0; transform: scale(1.3); }
  20%  { opacity: 1; transform: scale(1); }
  70%  { opacity: 1; transform: scale(1); }
  100% { opacity: 0; transform: scale(.94); }
}

/* 首页 feed 与剧情页共用上面这套铺底：
 * 首页也自动播放当前剧「第 1 集」（静音循环，见 js 的 startFeedPlayback()）。 */

/* ── 剧情页：底部进度条可拖拽（用户需求） ──
 * 参考皮肤的 `.video-progress-track` 只有 3px 高、`bottom: 1px` 贴在机身最底部，
 * 手指根本点不准。**视觉完全不动**：只在它上方铺一层透明的拖拽热区
 * （`.video-progress` 自身就是那 3px 的盒子，用 ::before 向上撑开 26px）。
 * 热区默认 `pointer-events: none` —— 只有播放中（.seekable）才打开，
 * 否则选项层弹出来后，贴着屏幕底部的那颗按钮会被这层挡住点不到。 */
.video-progress { cursor: pointer; }
.video-progress::before {
  content: "";
  position: absolute;
  left: -10px;
  right: -10px;
  bottom: 0;
  height: 26px;
  pointer-events: none;
}
.video-progress.seekable::before { pointer-events: auto; }
/* 拖动/按住时给进度条一点亮度反馈（没有新增元素，也没多一行文案） */
.video-progress.seekable:active .video-progress-fill { filter: brightness(1.14); }

/* 剧情页：没有公开选项时的占位 */
.story-options-empty {
  padding: 16px 12px;
  text-align: center;
  color: rgba(255, 255, 255, .62);
  font-size: 12px;
  line-height: 1.6;
}

/* ── 剧情页「播完 → 选项层」：参考皮肤在真实数据下的两处破相（D87） ──
 * ① 没居中：`.story-options-shell` 只有宽度 min(320px,100%)、**没有 margin:auto**，
 *    而它的兄弟 `.story-finished-copy` 写了 `margin: 0 auto 12px`。
 *    同一栏里就出现「标题居中 35..355、卡片靠左 16..336」的 19px 错位。
 * ② 选项只有 1 条时留 144px 空档：外壳写死 252px 高，而 `.story-options` 上的
 *    `align-self: end` 是**空操作**（父元素 `.story-options-scroll` 是普通块，
 *    align-self 只对 flex/grid 子项生效）→ 66px 的卡片停在 252px 框的**顶部**，
 *    离底部那颗「我也要共创」空出 144px。
 *    ★ 全站 19 个有选项的节点里 **16 个只有 1 条选项**，所以几乎每集都会看到。
 * 修法：外壳水平居中 + 高度跟着内容收缩（上限仍是参考的 252px，超出照旧滚动）。 */
.story-options-shell { margin: 0 auto; height: auto; max-height: 252px; }
/* 拖拽/滚动上限 = 252 − 52（为底部那颗绝对定位按钮预留的 padding-bottom）：
 * 与参考皮肤「选项区可用高度 200px」完全对齐，6 条选项时照旧滚动。 */
.story-options-scroll { height: auto; max-height: 200px; }

/* 头部圆形按钮（本项目各全屏面板用） */
.icon-btn { width: 33px; height: 33px; border-radius: 50%; display: grid; place-items: center; flex-shrink: 0; background: rgba(14, 16, 21, 0.5); backdrop-filter: blur(12px); border: 1px solid rgba(255, 255, 255, 0.14); color: #fff; cursor: pointer; transition: 0.16s; }
.icon-btn:hover { background: rgba(255, 255, 255, 0.16); }
.icon-btn:active { transform: scale(0.9); }
.icon-btn svg { width: 16px; height: 16px; }

/* ── 榜单：结构/样式 100% 用 coke.css 的 .rank-item / .rank-no / .hot / .creator-avatar
 *    （它们是从参考 <style> 逐字搬来的），这里只补两处参考里没有的东西 ── */
/* 剧集榜缩略图放**真实剧封面**：盖住参考的雪碧图（没封面时自然露出雪碧图兜底） */
/* ⚠️ coke.css 里写的是 url("assets/prototype-small.png") —— 参考 demo 中那是**内联 <style>**，
 *    相对 HTML 解析成 /assets/… 没问题；搬成独立 css 文件后会被解析成 /css/assets/… → 404。
 *    这里把路径拨正（雪碧图的 background-position 偏移仍在 coke.css 里，不受影响）。 */
.rank-item .thumb {
  background-image: linear-gradient(145deg, rgba(10, 12, 18, .08), rgba(10, 12, 18, .32)), url("../assets/prototype-small.png");
  overflow: hidden;
}
.rank-item .thumb > img { display: block; width: 100%; height: 100%; object-fit: cover; }
/* 空区间（例如「本月」里还没有任何内容） */
.rank-empty { padding: 34px 16px; text-align: center; color: rgba(255, 255, 255, .5); font-size: 12px; line-height: 1.7; }

/* ───────────────────────── ③ 项目既有组件 ───────────────────────── */

/* ── 全屏面板（登录 / 共创 / 生成 / 预览 / 发布） ── */
.sheet-full { position: absolute; inset: 0; z-index: 30; background: #0b0d11; display: flex; flex-direction: column; animation: fadeUp 0.32s cubic-bezier(0.16, 1, 0.3, 1); }
.sf-head { display: flex; align-items: center; gap: 11px; padding: 14px 14px 12px; border-bottom: 1px solid var(--line); }
.sf-head .sf-t { flex: 1; }
.sf-head .sf-t b { font-size: 14px; font-weight: 700; }
.sf-head .sf-t span { display: block; font-size: 10.5px; color: var(--tx-3); margin-top: 2px; }
.sf-body { flex: 1; overflow-y: auto; padding: 15px 14px; }
.sf-foot { padding: 12px 14px calc(16px + env(safe-area-inset-bottom)); border-top: 1px solid var(--line); display: flex; gap: 10px; }

.field-label { font-size: 11.5px; color: var(--tx-2); font-weight: 600; margin-bottom: 9px; display: flex; align-items: center; gap: 7px; }
.field-label .fl-ico { color: var(--spark); display: inline-flex; }
.field-label svg { width: 13px; height: 13px; }
.field-label .fl-note { margin-left: auto; font-weight: 400; font-size: 10px; color: var(--tx-3); }

/* ── 登录 / 引用按钮（剩下的新皮肤外挂件都集中在下面几段） ── */
.btn { flex: 1; padding: 13px; border-radius: 15px; border: none; font-size: 13.5px; font-weight: 600; font-family: inherit; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px; transition: 0.18s; }
.btn:active { transform: scale(0.98); }
.btn-primary { background: linear-gradient(135deg, var(--spark), #ff8a4c); color: #fff; box-shadow: 0 10px 26px -10px rgba(255, 106, 61, 0.8); }
.btn-primary:hover { filter: brightness(1.08); }
.btn-primary:disabled { opacity: 0.4; cursor: not-allowed; box-shadow: none; filter: none; }
.btn-soft { background: var(--surface); border: 1px solid var(--line-2); color: var(--tx-2); flex: 0 0 auto; padding-left: 18px; padding-right: 18px; }
.btn-soft:hover { color: var(--tx); }
.btn svg { width: 15px; height: 15px; }

/* ───────────────── 创作页 form 态：参考皮肤里没有的扩展件 ─────────────────
 * 参考图格子（.cv-*）/ @ 引用候选（.at-*）/ 上传分类选择
 * 注：`.reference-row` / `.image-tile` / `.add-tile` / `.chip-grid` / `.form-card`
 *     等骨架类名都来自参考皮肤 coke.css，这里只补它没覆盖到的部分。 */
.cv-tile { position: relative; width: 62px; height: 62px; border-radius: 8px; overflow: hidden; flex: 0 0 auto; background: #1b1d25; border: 1px solid rgba(255, 255, 255, .12); }
.cv-tile img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cv-tile.is-at { border-color: rgba(70, 216, 138, .42); }
.cv-ph { width: 100%; height: 100%; display: grid; place-items: center; color: rgba(255, 255, 255, .42); }
.cv-ph svg { width: 20px; height: 20px; }
.cv-badge { position: absolute; left: 3px; bottom: 3px; padding: 1px 5px; border-radius: 5px; font-size: 9px; font-weight: 800; background: rgba(9, 11, 14, .8); color: #ffb08e; }
.cv-del { position: absolute; right: 2px; top: 2px; width: 17px; height: 17px; padding: 0; border: 0; border-radius: 50%; display: grid; place-items: center; background: rgba(9, 11, 14, .82); color: #fff; cursor: pointer; }
.cv-del svg { width: 11px; height: 11px; }
.cv-pending { position: absolute; inset: 0; display: grid; place-items: center; background: rgba(9, 11, 14, .62); color: #fff; font-size: 9px; }

.cv-refhint { margin-top: 9px; min-height: 18px; }
.cv-hint { font-size: 10px; line-height: 1.55; color: rgba(255, 255, 255, .42); }
.cv-hint b { color: #ffb08e; }
.cv-pick { margin: 0 6px 6px 0; padding: 5px 11px; border-radius: 999px; border: 1px solid rgba(255, 138, 22, .55); background: rgba(255, 91, 31, .12); color: #ffb08e; font-family: inherit; font-size: 11px; font-weight: 800; cursor: pointer; }
.cv-pick.cancel { border-color: rgba(255, 255, 255, .16); background: transparent; color: rgba(255, 255, 255, .5); }

/* ── @ 引用资产的候选层（贴在提示词输入框下方） ── */
.at-sug { margin-top: 8px; max-height: 208px; overflow-y: auto; border-radius: 8px; border: 1px solid rgba(255, 255, 255, .1); background: #0d1015; padding: 4px; }
.at-row { display: flex; align-items: center; gap: 9px; width: 100%; padding: 7px 8px; border: 0; border-radius: 6px; background: transparent; color: #fff; font-family: inherit; text-align: left; cursor: pointer; }
.at-row.on, .at-row:hover { background: rgba(255, 91, 31, .14); }
.at-ava { width: 30px; height: 30px; border-radius: 6px; overflow: hidden; flex: 0 0 auto; display: grid; place-items: center; background: rgba(255, 255, 255, .07); color: rgba(255, 255, 255, .45); }
.at-ava img { width: 100%; height: 100%; object-fit: cover; }
.at-ava svg { width: 15px; height: 15px; }
.at-main { flex: 1; min-width: 0; }
.at-main b { display: block; font-size: 12px; font-weight: 800; }
.at-main span { display: block; font-size: 10px; color: rgba(255, 255, 255, .42); margin-top: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.at-tag { flex: 0 0 auto; padding: 2px 7px; border-radius: 999px; background: rgba(255, 255, 255, .08); color: rgba(255, 255, 255, .55); font-size: 9px; font-weight: 800; }
.at-empty { padding: 14px 10px; text-align: center; font-size: 10.5px; line-height: 1.6; color: rgba(255, 255, 255, .42); }

/* ───────────────── 生成中：结构 100% 用 coke.css 的 `.ai-generating` ─────────────────
 * .orb / .percent / .generate-progress-track / .generate-progress-fill / .generate-checks
 * 全部来自参考皮肤，这里**只补两件参考没有的**：
 *   ① 布局：`.ai-generating` 在参考里用 `min-height: calc(100vh - 190px)` 撑高，
 *      而我们的面板是盖在手机外壳（.sheet-full）里的一层，100vh 会超出外壳 → 改成在外壳内居中；
 *   ② 进度态：未走到的步骤先压暗，做出「走到哪一步」的真实反馈（参考是 5 条全亮）。
 * ⚠️ 不要在这里加任何新的可见元素（参考 demo 的生成面板只有 orb / h2 / p / 百分比 / 进度条 / 5 条清单）。 */
.create-view.gen-view { display: flex; padding: 44px 14px; }
.gen-view > .ai-generating { margin: auto; width: 100%; min-height: auto; }
.generate-checks span { opacity: .34; transition: opacity .3s, color .3s; }
.generate-checks span.active { opacity: 1; color: #ffbd4a; }
.generate-checks span.active i { color: #ffbd4a; }
.generate-checks span.done { opacity: 1; }

/* ───────────────── 发布页：把参考的 `.preview-box` 换成真实画面 ───────────────── */
.preview-box.has-media { background: #000; padding: 0; overflow: hidden; }
.preview-box.has-media video,
.preview-box.has-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.preview-box.has-media.r-169 video,
.preview-box.has-media.r-169 img { object-fit: contain; }
.pb-warn { display: flex; align-items: flex-start; gap: 7px; font-size: 11px; line-height: 1.6; color: #ffc4ab; }
.pb-warn svg { width: 13px; height: 13px; flex: 0 0 auto; margin-top: 2px; }
.pb-warn b { color: #fff; }
/* 退出确认：参考的 .rank-meta 是单行省略号，这里要放开成多行说明 */
.create-exit-dialog .rank-meta { white-space: normal; line-height: 1.65; font-size: 11.5px; }

/* ── 我的 / 创作中心（旧皮肤，待第三步换参考皮肤）
 *    榜单已换参考皮肤（见下方「榜单」段），这里只剩 .tab-page / .tp-title / .tp-sub
 *    （社区占位页在用）与 .tp-card / .tp-body / .tp-text / .tp-node / .tp-fire（我的页在用）。── */
.tab-page { padding: 10px 16px 20px; }
.tp-title { font-size: 19px; font-weight: 700; letter-spacing: -0.02em; margin-bottom: 4px; }
.tp-sub { font-size: 11.5px; color: var(--tx-3); margin-bottom: 16px; }
.tp-card { display: flex; gap: 12px; align-items: flex-start; padding: 12px; border-radius: 16px; background: rgba(255, 255, 255, 0.035); border: 1px solid var(--line); margin-bottom: 10px; cursor: pointer; transition: 0.16s; }
.tp-card:hover { border-color: rgba(255, 106, 61, 0.32); background: rgba(255, 106, 61, 0.06); }
.tp-body { flex: 1; min-width: 0; }
.tp-text { font-size: 13.5px; font-weight: 600; line-height: 1.4; }
.tp-node { font-size: 10.5px; color: var(--tx-3); margin-top: 6px; }
.tp-fire { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; font-weight: 700; color: var(--spark-2); flex-shrink: 0; }
.tp-fire svg { width: 13px; height: 13px; color: var(--spark); }

.task-card { padding: 13px; border-radius: 16px; background: rgba(255, 255, 255, 0.035); border: 1px solid var(--line); margin-bottom: 11px; }
.tc-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.tc-text { font-size: 13.5px; font-weight: 600; line-height: 1.4; flex: 1; }
/* 新剧集任务卡的标题带一个 film 图标：SVG 没有内联尺寸，必须在这里限死，
   否则在弹层里会撑成一大块（旧的 .legacy-screen 里靠全局规则兜着） */
.task-card .tc-text svg { width: 14px; height: 14px; margin-right: 4px; vertical-align: -2px; }
.status-pill { font-size: 10px; font-weight: 600; padding: 3px 9px; border-radius: 999px; white-space: nowrap; }
.status-pill.generating { background: rgba(255, 177, 92, 0.16); color: #ffc98a; }
.status-pill.draft { background: rgba(139, 147, 163, 0.18); color: #aab2c0; }
.status-pill.published { background: rgba(70, 216, 138, 0.16); color: #7fe1a6; }
.status-pill.failed { background: rgba(255, 96, 96, 0.16); color: #ff9d9d; }
.tc-meta { font-size: 10.5px; color: var(--tx-3); margin-top: 8px; line-height: 1.6; }
.tc-bar { height: 3px; border-radius: 3px; background: rgba(255, 255, 255, 0.08); overflow: hidden; margin-top: 10px; }
.tc-bar i { display: block; height: 100%; background: linear-gradient(90deg, var(--spark), var(--spark-2)); }
.tc-actions { display: flex; gap: 8px; margin-top: 11px; }
.tc-btn { padding: 7px 13px; border-radius: 10px; font-size: 11.5px; font-weight: 600; font-family: inherit; cursor: pointer; border: 1px solid var(--line-2); background: var(--surface); color: var(--tx-2); transition: 0.15s; }
.tc-btn:hover { color: var(--tx); }
.tc-btn.primary { background: rgba(255, 106, 61, 0.14); border-color: rgba(255, 106, 61, 0.4); color: #ff9d76; }
.tc-video { width: 100%; border-radius: 12px; margin-top: 10px; max-height: 200px; background: #000; display: block; }
.tp-empty { text-align: center; padding: 40px 20px; color: var(--tx-3); font-size: 12px; line-height: 1.7; }
.tp-empty svg { width: 34px; height: 34px; color: var(--line-2); margin-bottom: 10px; }

/* ── 社区（占位页） ── */
.ph-card { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 30px 20px; border-radius: 18px; border: 1px dashed var(--line-2); background: rgba(255, 255, 255, 0.02); }
.ph-ico { width: 54px; height: 54px; border-radius: 17px; display: grid; place-items: center; color: var(--spark); background: rgba(255, 106, 61, 0.1); border: 1px solid rgba(255, 106, 61, 0.24); margin-bottom: 14px; }
.ph-ico svg { width: 26px; height: 26px; }
.ph-card b { font-size: 15px; font-weight: 700; }
.ph-card p { font-size: 11.5px; color: var(--tx-3); line-height: 1.7; margin-top: 9px; max-width: 280px; }
.ph-tags { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; margin-top: 16px; }
.ph-tag { font-size: 10px; padding: 4px 10px; border-radius: 999px; background: rgba(255, 255, 255, 0.05); border: 1px solid var(--line); color: var(--tx-3); }

/* ── 我的 ────────────────────────────────────────────────────────────
 * 骨架（.profile-head / .profile-actions / .avatar / .stats / .shortcut-grid /
 * .mine-tabs / .work-grid / .work-card）全部来自 coke.css（参考逐字搬运），
 * 这里只补本项目需要的几条：真实封面、空态、未登录头像、弹层内部件。 */

/* 作品卡缩略图放**真实剧封面**：img 撑满 + 一层暗化渐变，保证底部白字可读 */
.work-card .work-thumb { position: relative; overflow: hidden; }
.work-card .work-thumb > img { display: block; width: 100%; height: 100%; border-radius: 6px; object-fit: cover; }
.work-card .work-thumb::after { content: ""; position: absolute; inset: 0; border-radius: 6px; background: linear-gradient(180deg, rgba(0, 0, 0, 0.06), rgba(0, 0, 0, 0.52)); }

/* 空态（参考里没有）：占满网格整行 */
.work-empty { grid-column: 1 / -1; padding: 34px 16px; border-radius: 8px; border: 1px dashed rgba(255, 255, 255, 0.16); color: rgba(255, 255, 255, 0.5); font-size: 12px; line-height: 1.8; text-align: center; }

/* 未登录的头像：参考的 `+` 角标在访客态没意义，去掉 */
.avatar.guest { background: rgba(255, 255, 255, 0.08); border: 1px dashed rgba(255, 255, 255, 0.24); color: rgba(255, 255, 255, 0.6); }
.avatar.guest::after { display: none; }

/* ── 我的 · 弹层（.overlay / .dialog 由 coke.css 提供） ── */
.dialog.wide { width: min(460px, 100%); }
/* 内容多了要能在弹层里滚（参考的 .dialog 没有这层限制，任务中心会撑出手机壳被裁掉） */
.dialog { max-height: calc(100% - 44px); overflow-y: auto; }
.ms-balance { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 14px; border-radius: 8px; background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.08); }
.ms-balance span { color: rgba(255, 255, 255, 0.6); font-size: 11.5px; font-weight: 700; }
.ms-balance strong { color: #fff; font-size: 20px; font-variant-numeric: tabular-nums; }
.ms-note { margin: 10px 0 6px; color: rgba(255, 255, 255, 0.42); font-size: 11px; line-height: 1.7; }
.ms-row { display: flex; align-items: center; gap: 10px; padding: 9px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.07); }
.ms-row:last-child { border-bottom: none; }
.ms-row-main { flex: 1; min-width: 0; }
.ms-row-main b { display: block; color: #fff; font-size: 12.5px; font-weight: 760; line-height: 1.45; }
.ms-row-main span { display: block; margin-top: 3px; color: rgba(255, 255, 255, 0.42); font-size: 10.5px; }
.ms-row-val { flex-shrink: 0; color: #ff8a16; font-size: 12.5px; font-weight: 800; font-variant-numeric: tabular-nums; }
.ms-row-val.flame svg { display: block; width: 15px; height: 15px; color: #ff8a16; }
.ms-total { display: flex; justify-content: space-between; gap: 10px; margin-top: 12px; padding-top: 11px; border-top: 1px solid rgba(255, 255, 255, 0.1); color: rgba(255, 255, 255, 0.6); font-size: 12px; font-weight: 700; }
.ms-total strong { color: #fff; }
.ms-empty { padding: 26px 10px; text-align: center; color: rgba(255, 255, 255, 0.42); font-size: 11.5px; }
.ms-kpis { display: grid; grid-template-columns: repeat(2, 1fr); gap: 9px; margin: 4px 0 12px; }
.ms-kpi { padding: 10px; border-radius: 8px; background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.08); text-align: center; }
.ms-kpi strong { display: block; color: #fff; font-size: 18px; font-weight: 900; font-variant-numeric: tabular-nums; }
.ms-kpi span { display: block; margin-top: 3px; color: rgba(255, 255, 255, 0.5); font-size: 10.5px; }
.ms-invite { padding: 16px; border-radius: 8px; background: linear-gradient(135deg, rgba(255, 138, 22, 0.16), rgba(227, 49, 24, 0.12)); border: 1px solid rgba(255, 138, 22, 0.3); text-align: center; }
.ms-invite-code { color: #fff; font-size: 22px; font-weight: 900; letter-spacing: 0.06em; }
.ms-invite p { margin: 9px 0 0; color: rgba(255, 255, 255, 0.62); font-size: 11.5px; line-height: 1.7; }
.ms-btn { display: block; width: 100%; margin-top: 10px; padding: 11px; border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.12); background: rgba(255, 255, 255, 0.06); color: #fff; font-family: inherit; font-size: 13px; font-weight: 800; cursor: pointer; }
.ms-btn.primary { background: linear-gradient(135deg, #ff5a1f, #e33118); border-color: rgba(255, 138, 22, 0.42); }
.ms-rows { margin-bottom: 4px; }
.ms-kv { display: flex; justify-content: space-between; gap: 10px; padding: 9px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.07); font-size: 12.5px; }
.ms-kv:last-child { border-bottom: none; }
.ms-kv span { color: rgba(255, 255, 255, 0.5); font-weight: 700; }
.ms-kv b { color: #fff; font-weight: 800; }

/* ── 登录输入框（MVP 昵称即账号） ── */
.ps-input { width: 100%; padding: 12px 13px; border-radius: 14px; background: rgba(255, 255, 255, 0.04); border: 1px solid var(--line-2); color: var(--tx); font-size: 13.5px; font-family: inherit; outline: none; transition: 0.18s; }
.ps-input:focus { border-color: rgba(255, 106, 61, 0.55); background: rgba(255, 106, 61, 0.05); }
.ps-input::placeholder { color: var(--tx-3); }

/* ── 登录（MVP 昵称即账号） ── */
.login-hero { text-align: center; padding: 12px 0 22px; }
.lh-orb { width: 62px; height: 62px; border-radius: 20px; margin: 0 auto 14px; display: grid; place-items: center; background: linear-gradient(135deg, var(--spark), #ff8a4c); color: #fff; box-shadow: 0 14px 30px -12px rgba(255, 106, 61, 0.9); animation: orb 3.4s ease-in-out infinite; }
.lh-orb svg { width: 32px; height: 32px; }
.login-hero b { font-size: 16px; font-weight: 700; display: block; }
.login-hero p { font-size: 11.5px; color: var(--tx-3); line-height: 1.7; margin-top: 8px; max-width: 270px; margin-left: auto; margin-right: auto; }
.login-quick { margin-top: 16px; }
.login-quick:empty { display: none; }
.lq-label { font-size: 10.5px; color: var(--tx-3); margin-bottom: 9px; }
.lq-row { display: flex; flex-wrap: wrap; gap: 8px; }
.lq-chip { display: inline-flex; align-items: center; gap: 7px; padding: 6px 12px 6px 6px; border-radius: 999px; border: 1px solid var(--line-2); background: rgba(255, 255, 255, 0.035); color: var(--tx-2); font-family: inherit; font-size: 11.5px; cursor: pointer; transition: 0.15s; }
.lq-chip:hover { border-color: rgba(255, 106, 61, 0.45); color: var(--tx); }
.lq-ava { width: 22px; height: 22px; border-radius: 50%; display: grid; place-items: center; font-size: 10px; font-weight: 700; color: #fff; background: linear-gradient(135deg, var(--spark), #ff8a4c); }

/* ───────────────────────── Keyframes ───────────────────────── */
@keyframes orb { 0%, 100% { transform: scale(1); opacity: 0.85; } 50% { transform: scale(1.14); opacity: 0.45; } }
@keyframes fadeUp { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: translateY(0); } }

@media (prefers-reduced-motion: reduce) {
  * { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; }
}
