/* =====================================================================
   赴星 · v2.0 视觉升级（星夜极光 · Starry Aurora）
   —— 加载于 styles.css / styles-v130.css 之后的覆盖层 ——
   仅改外观：不影响任何功能、接口、DOM 结构。
   主题：浅色「晨星极光」/ 暗色「深空极光」，同一套层次逻辑。
===================================================================== */

/* ---------- 0. 主题扩展变量 ---------- */
:root {
  --ink-hi: #1b2140;
  --aurora-1: rgba(99,128,255,.5);
  --aurora-2: rgba(167,120,255,.4);
  --aurora-3: rgba(255,142,190,.32);
  --aurora-4: rgba(255,180,94,.2);
  --ring-hi: rgba(255,255,255,.92);
  --shell-border: rgba(255,255,255,.7);
  
  /* v1.8.06：AI 入口专用渐变（UI 部定稿）—— 只作用于五处 AI 入口，不动 --grad-brand / .btn-primary */
  
  
  
  
}


/* ---------- 1. 画布：晨星 / 深空 ---------- */
body {
  background:
    radial-gradient(1100px 620px at 8% -8%, rgba(140,160,255,.34), transparent 60%),
    radial-gradient(900px 640px at 104% 6%, rgba(205,150,255,.30), transparent 55%),
    radial-gradient(1000px 760px at 60% 112%, rgba(255,164,206,.24), transparent 60%),
    linear-gradient(150deg,#e6e9fb 0%,#e9e6fa 42%,#efe7f8 100%);
}
[data-theme="dark"] body {
  background:
    radial-gradient(1100px 640px at 6% -10%, rgba(74,96,204,.35), transparent 60%),
    radial-gradient(900px 660px at 104% 4%, rgba(140,80,216,.26), transparent 55%),
    radial-gradient(1000px 800px at 55% 114%, rgba(214,70,150,.14), transparent 60%),
    linear-gradient(150deg,#070a15 0%,#0a0d1e 48%,#0e1024 100%);
}

.phone-shell {
  background:
    radial-gradient(480px 360px at 85% -10%, var(--aurora-1), transparent 62%),
    radial-gradient(460px 400px at -12% 34%, var(--aurora-2), transparent 60%),
    radial-gradient(520px 460px at 78% 108%, var(--aurora-3), transparent 62%),
    radial-gradient(300px 220px at 12% 88%, var(--aurora-4), transparent 70%),
    linear-gradient(168deg,#e7ebfc 0%,#ece7fb 48%,#f7e9f4 100%);
  box-shadow: 0 24px 70px rgba(31,38,135,.2), 0 6px 20px rgba(31,38,135,.1);
}
[data-theme="dark"] .phone-shell {
  background:
    radial-gradient(520px 400px at 88% -12%, rgba(96,120,255,.30), transparent 60%),
    radial-gradient(500px 420px at -14% 30%, rgba(132,92,238,.22), transparent 60%),
    radial-gradient(560px 500px at 80% 112%, rgba(233,74,150,.16), transparent 62%),
    radial-gradient(320px 240px at 10% 90%, rgba(255,176,80,.10), transparent 70%),
    linear-gradient(168deg,#0a0d1e 0%,#0d0f23 50%,#120f26 100%);
}

/* 彩色光斑更柔、更大 */
.phone-shell::before {
  width: 430px; height: 430px; top: -130px; right: -120px;
  background: radial-gradient(circle, rgba(120,146,255,.5), transparent 66%);
  opacity:.8;
}
.phone-shell::after {
  width: 400px; height: 400px; bottom: 6%; left: -130px;
  background: radial-gradient(circle, rgba(196,130,255,.42), transparent 66%);
  opacity:.75;
}
#app::before {
  background: radial-gradient(circle, rgba(255,158,200,.5), transparent 68%);
  width: 340px; height: 340px; right: -140px; top: 42%;
}
[data-theme="dark"] .phone-shell::before { background: radial-gradient(circle, rgba(110,138,255,.42), transparent 66%); opacity:.9; }
[data-theme="dark"] .phone-shell::after  { background: radial-gradient(circle, rgba(168,110,255,.34), transparent 66%); opacity:.85; }
[data-theme="dark"] #app::before { background: radial-gradient(circle, rgba(255,120,170,.28), transparent 68%); }

/* 星星带柔光、暗夜更亮 */
.deco-star { background: rgba(255,255,255,.9); box-shadow: 0 0 10px rgba(255,255,255,.7); opacity:.5; }
[data-theme="dark"] .deco-star { background:#fff; box-shadow:0 0 12px rgba(180,196,255,.9); opacity:.75; }

/* ---------- 2. 顶栏标题：尾缀星光 + 更深渐变 ---------- */
.topbar .title {
  background: linear-gradient(120deg,#3a56d4 0%,#7c5cf0 45%,#a855f7 78%,#d946b8 100%);
  -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
}
[data-theme="dark"] .topbar .title { background: linear-gradient(120deg,#9fb6ff,#b79bff 45%,#d7a2ff 78%,#ff9fe0); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; }
.topbar .title::after {
  content:"✦";
  -webkit-text-fill-color:#f5b94e; color:#f5b94e;
  font-size:46%; font-weight:700; margin-left:7px;
  vertical-align:6px; display:inline-block;
  filter:drop-shadow(0 0 8px rgba(245,185,78,.75));
  animation: sparkleDrift 3.4s ease-in-out infinite;
}
@keyframes sparkleDrift { 0%,100%{ transform:scale(1) rotate(0deg); opacity:.85 } 50%{ transform:scale(1.18) rotate(16deg); opacity:1 } }
.topbar .sub { letter-spacing:.2px; }


.greet-name { font-size:16px; }
.greet-tail { color:var(--text-2); font-size:12px; }

/* ---------- 3. 卡片：微光纸 + 发丝描边 ---------- */
.card {
  background:
    linear-gradient(160deg, rgba(255,255,255,.94), rgba(246,246,255,.96) 55%, rgba(252,243,255,.94));
  border:1px solid rgba(255,255,255,.9);
  box-shadow:
    0 0 0 .5px rgba(99,112,255,.10),
    0 10px 26px rgba(31,38,135,.07),
    0 2px 6px rgba(31,38,135,.05),
    inset 0 1px 0 rgba(255,255,255,.95);
}
[data-theme="dark"] .card {
  background:linear-gradient(160deg, rgba(26,31,52,.92), rgba(24,27,48,.94) 55%, rgba(31,26,52,.92));
  border-color:rgba(255,255,255,.09);
  box-shadow:
    0 0 0 .5px rgba(255,255,255,.04),
    0 14px 34px rgba(0,0,0,.45),
    inset 0 1px 0 rgba(255,255,255,.09);
}
.card h3 { letter-spacing:.2px; }

/* 分段控件：极光容器 */
.seg {
  background:rgba(124,92,240,.07);
  
  
}
[data-theme="dark"] .seg { background:rgba(255,255,255,.05); border-color:rgba(255,255,255,.07); }
.seg button.on {
  
  
  color:#5b4bd6;
}
[data-theme="dark"] .seg button.on {   box-shadow:0 4px 14px rgba(0,0,0,.35); }
.seg button.on svg { stroke:#7c5cf0; }

/* chip / 分类胶囊 */

/* 标签 */
.tag { letter-spacing:.3px; }
.tag-blue { background:linear-gradient(135deg,rgba(74,108,247,.16),rgba(124,92,240,.16)); }
.tag-gold { background:linear-gradient(135deg,rgba(245,185,78,.2),rgba(245,150,80,.2)); }

/* 输入框 */
.input,.textarea {
  background:linear-gradient(160deg, rgba(255,255,255,.92), rgba(247,246,255,.9));
  border:1px solid rgba(124,92,240,.14);
  box-shadow:inset 0 2px 6px rgba(31,38,135,.04);
}
[data-theme="dark"] .input,[data-theme="dark"] .textarea { background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.1); }
.input:focus,.textarea:focus {
  border-color:transparent;
  background:linear-gradient(160deg,#fff,#fbfaff);
  box-shadow:0 0 0 3px rgba(109,92,231,.18);
}
[data-theme="dark"] .input:focus,[data-theme="dark"] .textarea:focus { background:rgba(255,255,255,.09); box-shadow:0 0 0 3px rgba(139,122,246,.26); }

/* ---------- 4. 按钮：流光 ---------- */
.btn-primary {
  background:linear-gradient(135deg,#4a6cf7 0%,#6d5ce7 48%,#8b5cf6 74%,#a855f7 100%);
  background-size:170% 170%;
  
}

.btn-ghost {   backdrop-filter:blur(14px); }





/* ---------- 5. Hero：星夜航程 ---------- */
.hero-card { /* 非首页通用 hero（纪念页等） */
  background:
    radial-gradient(140% 90% at 14% 0%, rgba(140,160,255,.9), transparent 55%),
    radial-gradient(120% 100% at 92% 12%, rgba(178,120,255,.85), transparent 55%),
    linear-gradient(135deg,#3a4fd0 0%,#5545c8 48%,#7b3aa8 100%);
  box-shadow:0 18px 44px rgba(74,70,180,.4), 0 4px 12px rgba(74,70,180,.22);
}
.hero-card::after { background:linear-gradient(150deg,rgba(255,255,255,.22),rgba(255,255,255,.06) 42%,transparent 70%); }


[data-theme="dark"] .hero-home { background:
    radial-gradient(130% 90% at 8% -6%, rgba(96,120,255,.6), transparent 55%),
    radial-gradient(120% 110% at 96% 6%, rgba(150,100,255,.5), transparent 55%),
    radial-gradient(130% 120% at 60% 118%, rgba(233,96,168,.32), transparent 60%),
    linear-gradient(150deg,#141a3c,#241f50 52%,#4a2158 100%);
}
.hero-home::before {
  background:
    radial-gradient(circle at 82% 18%, rgba(255,255,255,.28), transparent 26%),
    linear-gradient(180deg, rgba(6,9,28,.05) 0%, rgba(6,9,28,.16) 42%, rgba(6,9,28,.5) 78%, rgba(6,9,28,.72) 100%);
}

@keyframes heroDrift { 0%,100%{ background-position:0 0, 115% 0 } 50%{ background-position:0 0, -20% 0 } }
/* v1.5.34：.hero-home .hero-pill 已随「下一场」一起删（状态胶囊挪到左侧，样式仍走下面这条） */
.hero-home .hero-status {
  font-weight:700; letter-spacing:.6px;
  background:rgba(255,255,255,.16); border:1px solid rgba(255,255,255,.28);
  padding:2px 10px; border-radius:999px; backdrop-filter:blur(6px);
}
.hero-home .artist { font-size:22px; font-weight:700; letter-spacing:.4px;
  background:linear-gradient(100deg,#fff 30%,#ffe9b0 55%,#fff 80%);
  -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;
  text-shadow:none;
}
[data-theme="dark"] .hero-home .artist { background:linear-gradient(100deg,#fff 30%,#ffe6ad 55%,#fff 80%); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; }
.hero-home .place { color:#ffffff; font-weight:600; }
.hero-home .place svg { stroke:#ffe9a8; }

.hero-home .countdown .unit::after { content:''; position:absolute; inset:0; border-radius:inherit; background:linear-gradient(180deg,rgba(255,255,255,.14),transparent 55%); pointer-events:none; }


.hero-top { z-index:2; }

/* 空状态 / 首页其它卡片入口 */
.empty-start .ei { box-shadow:0 10px 24px rgba(124,92,240,.35), inset 0 1px 0 rgba(255,255,255,.5); }

/* 首页迷你统计（ht）：彩色冰格 */


.ht b {   background-clip:text;   }
[data-theme="dark"] .ht b { background:linear-gradient(120deg,#8fb0ff,#b79bff 70%,#d7a2ff);  background-clip:text;  }

[data-theme="dark"] .ht-ic { border-color:rgba(255,255,255,.14); }

/* 速办 / 快捷入口 */


.qt:active,.f:active,.ht:active { transform:scale(.97); }

.qt-bar i { background:linear-gradient(90deg,#6d5ce7,#a855f7);  }

/* 首页「大家都在聊」 */


.hot-cv { box-shadow:inset 0 0 0 1px rgba(255,255,255,.5); }

/* 年度回忆册入口：暗紫烫金 */
.recap-banner {
  background:
    radial-gradient(120% 160% at 88% -30%, rgba(255,255,255,.34), transparent 55%),
    radial-gradient(110% 150% at -12% 120%, rgba(255,200,120,.3), transparent 55%),
    linear-gradient(120deg,#3f3a92 0%,#5b3fae 52%,#8d3f9c 100%);
  box-shadow:0 12px 30px rgba(74,50,160,.32), inset 0 1px 0 rgba(255,255,255,.3);
}
[data-theme="dark"] .recap-banner { box-shadow:0 12px 30px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.16); }
.recap-banner::after {
  background:
    radial-gradient(2px 2px at 24% 22%, rgba(255,255,255,.9), transparent),
    radial-gradient(2px 2px at 66% 34%, rgba(255,255,255,.7), transparent),
    radial-gradient(circle, rgba(255,255,255,.4), transparent 70%);
  background-size:auto,auto,100% 100%;
}
.recap-banner-title { color:#fff; }
.recap-banner-sub { color:#ffffff; }

.recap-banner-go { background:rgba(255,255,255,.2);  }

/* ---------- 6. 回忆页 ---------- */
.view-cap { color:var(--text-3); letter-spacing:.3px; }
.stat-grid .stat { background:linear-gradient(170deg, rgba(255,255,255,.92), rgba(246,246,255,.96)); }
[data-theme="dark"] .stat-grid .stat { background:linear-gradient(170deg, rgba(26,31,52,.9), rgba(23,25,44,.95)); border-color:rgba(255,255,255,.08); }
.stat .n { background:linear-gradient(120deg,#3a56d4,#7c5cf0 60%,#a855f7); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; }
[data-theme="dark"] .stat .n { background:linear-gradient(120deg,#9fb6ff,#b79bff 60%,#e0a2ff); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; }

/* 票根：夜场质感 */
.ticket {
  border:1px solid rgba(124,92,240,.12);
  box-shadow:0 16px 34px rgba(31,38,135,.13), 0 4px 10px rgba(31,38,135,.06);
  background:linear-gradient(120deg,#fff 0%,#fbfaff 100%);
}
[data-theme="dark"] .ticket { border-color:rgba(255,255,255,.1); background:linear-gradient(120deg,#1c2036,#191c31); }
.ticket::before {
  content:''; position:absolute; left:50px; top:0; bottom:0; z-index:2; pointer-events:none;
  border-left:2px dashed rgba(124,92,240,.22);
}
[data-theme="dark"] .ticket::before { border-left-color:rgba(255,255,255,.16); }
.t-side { box-shadow:inset 0 0 0 1px rgba(255,255,255,.2), inset 0 0 24px rgba(255,255,255,.12); }
.t-side-mark { filter:drop-shadow(0 0 8px rgba(255,255,255,.85)); animation:markGlow 3s ease-in-out infinite; }
@keyframes markGlow { 0%,100%{ opacity:.85; transform:scale(1) } 50%{ opacity:1; transform:scale(1.12) } }
.t-name { letter-spacing:.3px; }
.t-flag { letter-spacing:.6px; }
.ticket.st-night { box-shadow:0 18px 36px rgba(20,15,40,.35); }
.ticket.st-night::before { border-left-color:rgba(215,179,94,.3); }
.ticket.st-paper::before { border-left-color:rgba(150,110,60,.35); }
.ticket.st-live::before { border-left-color:rgba(74,150,255,.3); }
/* 观演印章：更真实 */
.stamp {
  display:flex; align-items:center; justify-content:center; text-align:center;
  width:40px; height:40px; border-radius:50%;
  background:rgba(255,255,255,.82); border:2.5px double #e5484d; color:#dc3545;
  font-size:11px; font-weight:700; line-height:1.15; letter-spacing:.5px;
  transform:rotate(-14deg); box-shadow:0 2px 6px rgba(229,72,77,.18);
}
[data-theme="dark"] .stamp { background:rgba(20,22,38,.8); }

/* 时间轴：发丝光轨 + 星点 */
.tl::before { background:linear-gradient(to bottom, rgba(124,92,240,.9), rgba(124,92,240,.34) 60%, rgba(168,85,247,.08)); width:3px; box-shadow:0 0 10px rgba(124,92,240,.5); }
.tl-node::before { border-color:#fff;  }

.tl-sec-head { display:flex; align-items:baseline; gap:8px; }




.tl-card { background:linear-gradient(165deg, rgba(255,255,255,.96), rgba(247,245,255,.94)); border:1px solid rgba(124,92,240,.1); box-shadow:0 6px 18px rgba(31,38,135,.05); }
[data-theme="dark"] .tl-card { background:linear-gradient(165deg, rgba(33,37,60,.94), rgba(28,30,50,.95)); border-color:rgba(255,255,255,.07); }





.tl-artist { letter-spacing:.2px; }

/* 足迹地图卡片 */
.map-wrap { border:1px solid rgba(124,92,240,.14); box-shadow:0 8px 22px rgba(31,38,135,.06); }
.map-rank-num { border:1px solid rgba(255,255,255,.6); }
.map-hint { font-size:11px; font-weight:600; color:var(--text-3); margin-left:6px; }
.map-unmatched { margin-top:12px; padding:10px 12px; border-radius:10px; background:rgba(124,92,240,.07); border:1px solid rgba(124,92,240,.18); font-size:12px; line-height:1.65; color:var(--text-2); }
.map-wrap .china-map { cursor:grab; }
.map-wrap .china-map:active { cursor:grabbing; }
.map-ctl {
  position:absolute; top:10px; right:10px; z-index:5;
  display:flex; flex-direction:column; gap:6px;
}
.map-ctl-btn {
  width:30px; height:30px; padding:0;
  display:flex; align-items:center; justify-content:center;
  border-radius:12px; font-size:18px; line-height:1;
   color:#6d5ce7;
  
  
  backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
}
.map-ctl-btn:active { transform:scale(.92); }
.map-ctl-btn[data-map-ctl="reset"] { font-size:16px; }
[data-theme="dark"] .map-ctl-btn {  color:#c4b2ff;  box-shadow:0 4px 12px rgba(0,0,0,.4); }

/* ---- 纪念票整票大版：票纸嵌套海报 + 票面信息 + 圆形裁剪副券 ---- */
.memt-grid { display:flex; flex-direction:column; gap:38px; margin-top:8px; }
.memt {
  position:relative; cursor:pointer; -webkit-tap-highlight-color:transparent;
  filter:drop-shadow(0 20px 30px rgba(52,38,12,.16));
  transition:transform .14s ease, filter .14s ease;
}
[data-theme="dark"] .memt { filter:drop-shadow(0 22px 36px rgba(0,0,0,.55)); }
.memt:active { transform:scale(.984); filter:drop-shadow(0 12px 18px rgba(52,38,12,.12)); }
.memt-inner {
  position:relative;
  border-radius:26px 26px 0 0;
  padding-top:24px;
  
}
.memt-inner::before { /* 票纸顶部极细金色压线（沿圆角内侧） */
  content:''; position:absolute; left:24px; right:24px; top:0; height:1px;
  background:linear-gradient(90deg, transparent, rgba(190,156,100,.5) 22%, rgba(190,156,100,.5) 78%, transparent);
}
[data-theme="dark"] .memt-inner { background:linear-gradient(180deg,#fbf3e2 0%,#f2e7d0 46%,#eee0c6 100%); }

/* 内嵌大海报 */
.mt-poster {
  position:relative; aspect-ratio:.96; margin:0 20px;
  border-radius:8px; overflow:hidden;
  display:flex; flex-direction:column; justify-content:flex-end;
  padding:15px 16px 17px; color:#fff;
  background-color:#23244d;
  box-shadow:0 1px 0 rgba(255,255,255,.5), 0 10px 20px -6px rgba(74,46,8,.38), 0 0 0 1px rgba(172,132,62,.62);
}
.mt-poster::before {
  content:''; position:absolute; inset:0; pointer-events:none;
  background:
    radial-gradient(120% 64% at 88% -10%, rgba(255,255,255,.16), transparent 54%),
    radial-gradient(120% 80% at 8% 110%, rgba(255,255,255,.06), transparent 58%),
    linear-gradient(180deg, rgba(8,9,20,.14) 0%, rgba(8,9,20,0) 28%, rgba(8,9,20,.02) 50%, rgba(6,7,15,.4) 74%, rgba(4,5,10,.9) 100%);
}
.mt-fx {
  position:absolute; top:68px; right:10px; z-index:0;
  display:none; font-size:40px; line-height:1; text-align:right;
  font-weight:900; letter-spacing:4px; color:rgba(255,255,255,.15);
  font-family:Georgia,'Times New Roman',serif;
}
.mt-poster.noart .mt-fx { display:block; }
.mt-poster-top { position:relative; z-index:2; display:flex; align-items:center; justify-content:space-between; gap:10px; }
.mt-brand {
  display:inline-flex; align-items:center; gap:6px;
  font-size:11px; font-weight:800; letter-spacing:1.5px;
  padding:6px 12px; border-radius:999px; white-space:nowrap;
  color:#fff; background:rgba(16,18,40,.3);
  border:1px solid rgba(255,255,255,.3);
  backdrop-filter:blur(9px); -webkit-backdrop-filter:blur(9px);
  box-shadow:0 2px 10px rgba(0,0,0,.14);
}
.mt-brand i { font-style:normal; font-size:10px; color:#ffd98a; text-shadow:0 0 8px rgba(255,217,138,.75); }
.mt-pill {
  flex:none; display:inline-flex; align-items:center;
  font-size:11px; font-weight:800; letter-spacing:.6px;
  padding:6px 12px; border-radius:999px; white-space:nowrap;
  color:#fff; background:rgba(14,16,34,.32);
  border:1px solid rgba(255,255,255,.24);
  backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
}
.mt-pill.ok { color:#4a3000; background:linear-gradient(135deg,#ffd98a,#efae3f); border-color:rgba(255,255,255,.66); box-shadow:0 4px 16px rgba(238,160,50,.5); }
.mt-pill.miss { color:rgba(255,255,255,.85); background:rgba(14,16,34,.38); }
.mt-poster-copy { position:relative; z-index:2; margin-top:auto; min-width:0; }
.mt-name {
  font-size:28px; font-weight:900; line-height:1.16; letter-spacing:.4px;
  text-shadow:0 2px 18px rgba(0,0,0,.55);
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.mt-line { display:flex; flex-wrap:wrap; gap:7px 16px; margin-top:13px; }
.mt-line-i { display:inline-flex; align-items:center; gap:5px; font-size:12.5px; font-weight:600; color:rgba(255,255,255,.97); text-shadow:0 1px 8px rgba(0,0,0,.5); }
.mt-line-i svg { flex:none; }
.mt-where { display:flex; align-items:center; gap:5px; margin-top:6px; font-size:12.5px; font-weight:600; color:rgba(255,255,255,.94); text-shadow:0 1px 8px rgba(0,0,0,.5); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.mt-where svg { flex:none; }

/* 票面信息区（票纸纸面，紧接海报下方） */
.mt-body { position:relative; padding:18px 20px 8px; }
.mt-event { position:relative; z-index:1; display:flex; align-items:flex-start; justify-content:space-between; gap:12px; }
.mt-event-l { min-width:0; }
.mt-event-name { font-size:16px; font-weight:800; line-height:1.32; color:#2b2315; letter-spacing:.3px; overflow:hidden; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
.mt-event-sub { display:flex; align-items:center; gap:5px; margin-top:6px; font-size:9.5px; letter-spacing:2px; color:#a2885a; font-weight:600; }
.mt-event-sub svg { flex:none; }
.mt-seal {
  flex:none;  margin-top:3px;  
     
    
  
  
  
  
  
  
  
}

@keyframes mtHolo {
  0%, 20% { transform:translateX(-80%) skewX(-12deg); }
  55%, 100% { transform:translateX(80%) skewX(-12deg); }
}
.mt-grid { position:relative; z-index:1; display:grid; grid-template-columns:1fr 1fr; gap:16px 24px; margin-top:16px; }
.mt-cell { display:flex; flex-direction:column; min-width:0; }
.mt-cell > span { font-size:9.5px; letter-spacing:1.4px; color:#ab9366; margin-bottom:3px; }
.mt-cell b { font-size:14px; font-weight:700; color:#382d1a; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; font-variant-numeric:tabular-nums; }
.mt-cell-price b { font-size:18px; font-weight:800; color:#963a26; letter-spacing:.2px; }
.mt-msg {
  position:relative; z-index:1; margin:15px 0 4px; text-align:center;
  font-size:12px; line-height:1.55; color:#8d7444; letter-spacing:.5px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}

/* 圆形裁剪副券：居中对称版式（月桂两侧 + 专属编号），保留打孔虚线/扇贝齿 */
.mt-stub {
  position:relative; display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:4px; padding:14px 20px 23px; text-align:center;
}
.mt-stub::before { /* 主票与副券之间的打孔虚线：简洁虚线 */
  content:''; position:absolute; left:0; right:0; top:0; height:1px; pointer-events:none;
  border-top:2px dashed rgba(150,116,60,.5);
  background:none;
}
.mt-stub::after { /* 底部半圆齿裁剪：纸面向下延伸的扇贝沿（非三角撕边） */
  content:''; position:absolute; left:0; right:0; top:100%; height:13px; pointer-events:none;
  background-image:radial-gradient(circle at 13px .5px, #f6ecd6 0 12px, rgba(246,236,214,0) 12.8px);
  background-size:26px 13px; background-repeat:repeat-x; background-position:center 0;
}
[data-theme="dark"] .mt-stub::after {
  background-image:radial-gradient(circle at 13px .5px, #eee0c6 0 12px, rgba(238,224,198,0) 12.8px);
}
[data-theme="dark"] .mt-stub::before {
  content:''; position:absolute; left:0; right:0; top:0; height:1px; pointer-events:none;
  border-top:2px dashed rgba(160,128,74,.55);
  background:none;
}
.mt-stub-crest { position:relative; z-index:1; display:flex; align-items:center; justify-content:center; gap:10px; min-width:0; }
.mt-lau { position:relative; z-index:1; flex:none; width:30px; height:26px; color:#c19a4e; opacity:.9; display:inline-flex; align-items:center; justify-content:center; }
.mt-lau svg { width:30px; height:26px; overflow:visible; }
.mt-lau-r { transform:scaleX(-1); }
.mt-stub-mark {
  position:relative; z-index:1; flex:none; font-style:normal; font-size:13px; line-height:1;
  color:#b8893a; display:inline-flex; align-items:center; justify-content:center;
  width:26px; height:26px; border-radius:50%;
  background:#fffdf6; border:1px solid #dfc48e;
  box-shadow:0 0 0 2px rgba(226,202,151,.32), inset 0 0 0 1px #fff;
}
.mt-stub-brand {
  position:relative; z-index:1; font-size:12.5px; font-weight:900; letter-spacing:2.2px;
  color:#33291a; white-space:nowrap;
}
.mt-stub-note {
  position:relative; z-index:1; display:block; max-width:250px;
  font-size:9.5px; font-weight:500; letter-spacing:1.2px; color:#8a7348;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin-top:2px;
}
.mt-serial { position:relative; z-index:1; display:flex; flex-direction:column; align-items:center; gap:3px; margin-top:3px; min-width:0; }
.mt-serial span { font-size:8.5px; letter-spacing:2.2px; color:#a08a60; }
.mt-serial b {
  position:relative; font-size:15px; font-weight:800; letter-spacing:3px; font-variant-numeric:tabular-nums; white-space:nowrap;
  color:#6b5126; font-family:Georgia,'Times New Roman',serif;
}
.mt-wm {
  position:absolute; z-index:0; left:0; right:0; top:33%; transform:translateY(-50%);
  text-align:center; font-style:normal; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  pointer-events:none; user-select:none; max-width:86%; margin:0 auto;
  font-size:30px; font-weight:900; letter-spacing:3px; line-height:1.2;
  color:rgba(96,72,34,.065); font-family:Georgia,'Times New Roman',serif;
}
[data-theme="dark"] .mt-wm { color:rgba(255,255,255,.05); }
/* ---- 纪念票双页瀑布（与大图 100% 同款，仅整体缩小）+ 大图页 ---- */
.memt-masonry { display:flex; align-items:flex-start; gap:12px; margin-top:12px; }
.mtm-col { flex:1; min-width:0; display:flex; flex-direction:column; gap:16px; }
.mtm-cell { position:relative; cursor:pointer; -webkit-tap-highlight-color:transparent; }
.mtm-cell .memt { pointer-events:none; }
.mtm-stage { transform-origin:top left; will-change:transform; }
.mtm-cell:active { opacity:.86; }

.mt-show { margin-top:10px; }
.mt-show .memt { filter:drop-shadow(0 20px 30px rgba(52,38,12,.16)); }
.mt-show-back {
  display:flex; align-items:center; justify-content:center; gap:6px;
  margin:20px auto 30px; padding:10px 18px; border:none; cursor:pointer;
  font-size:12.5px; font-weight:700; color:#6d5a38;
  background:rgba(255,255,255,.6); border:1px solid rgba(190,160,95,.4);
  border-radius:999px; backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
}
.mt-show-back:active { transform:scale(.97); }

/* 纪念票大图页：编辑样式入口 + 纯净截图小眼睛 */
.mt-show-page { position:relative; }
.mt-tools { display:inline-flex; align-items:center; gap:7px; }
.mt-edit, .mt-clean {
  display:inline-flex; align-items:center; justify-content:center;
  border-radius:999px; cursor:pointer; border:1px solid transparent;
  font-size:11.5px; font-weight:700; transition:background .2s ease, color .2s ease, border-color .2s ease, opacity .3s ease, transform .15s ease;
  -webkit-tap-highlight-color:transparent;
}
.mt-edit {
  gap:4px; padding:6px 11px;  white-space:nowrap;
   
}
.mt-edit svg { width:12px !important; height:12px !important; stroke:currentColor; }
.mt-clean {
  width:27px; height:27px; color:#fff; flex:none;
  background:rgba(14,16,44,.22); border-color:rgba(255,255,255,.5);
  backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
}
.mt-clean svg { width:14px !important; height:14px !important; stroke:#fff; }
.mt-edit:hover, .mt-clean:hover, .mt-clean.on { background:#6d5ce7; color:#fff; border-color:transparent; }
.mt-edit:active, .mt-clean:active { transform:scale(.92); }
.mt-show-page > .mt-clean { position:absolute; top:10px; right:12px; }
body.clean-armed .mt-clean { opacity:0; pointer-events:none; }
body.clean-shot .mt-show-page .back-bar,
body.clean-shot .mt-show-page .mt-show-back { display:none !important; }
[data-theme="dark"] .mt-edit { background:rgba(255,255,255,.1); color:#c3b8ef; border-color:rgba(160,140,240,.35); }
[data-theme="dark"] .mt-clean { background:rgba(255,255,255,.12); border-color:rgba(255,255,255,.3); }

/* ---------- 7. 社区：星光公告 + 杂志瀑布 ---------- */
.community-banner {
  background:
    radial-gradient(130% 200% at 92% -40%, rgba(255,255,255,.4), transparent 55%),
    linear-gradient(120deg,#41409c 0%,#5a3eae 55%,#873a94 100%);
  border:none; color:#fff;
  box-shadow:0 10px 24px rgba(80,60,180,.26), inset 0 1px 0 rgba(255,255,255,.28);
}
[data-theme="dark"] .community-banner { box-shadow:0 10px 24px rgba(0,0,0,.35), inset 0 1px 0 rgba(255,255,255,.14); }
.community-banner .banner-icon {
     display:inline-flex;  
   background:rgba(255,255,255,.2); color:#f5b94e; 
  
}
.community-banner .banner-title { color:#fff; }
.community-banner .banner-desc { color:#ffffff; }



.search-box {
  background:linear-gradient(160deg, rgba(255,255,255,.94), rgba(248,246,255,.9));
  border:1px solid rgba(124,92,240,.14);
  box-shadow:0 4px 14px rgba(31,38,135,.06), inset 0 1px 0 rgba(255,255,255,.8);
}
[data-theme="dark"] .search-box { background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.1); }
.search-box:focus-within { border-color:rgba(124,92,240,.5); box-shadow:0 0 0 4px rgba(124,92,240,.14); }
[data-theme="dark"] .search-box:focus-within { box-shadow:0 0 0 4px rgba(139,122,246,.22); }


[data-theme="dark"] .cat-tab {  border-color:rgba(255,255,255,.1); color:#a8b0c8; }
.cat-tab.on {
  background:linear-gradient(135deg,#4a6cf7,#7c5cf0 60%,#a855f7);
  
}


/* 帖子封面渐变画布（无图帖） */
.xh-cover .xh-ph { color:#fff; }
.xh-ph { background:linear-gradient(150deg,#5b6cf5 0%,#7c5cf0 55%,#a855f7 100%); }
.xh-ph::after {
   position:absolute; inset:0; pointer-events:none;
  background:
    radial-gradient(2px 2px at 24% 18%, rgba(255,255,255,.95), transparent),
    radial-gradient(3px 3px at 70% 12%, rgba(255,255,255,.8), transparent),
    radial-gradient(2px 2px at 44% 34%, rgba(255,255,255,.7), transparent),
    radial-gradient(110% 90% at 90% 6%, rgba(255,255,255,.28), transparent 55%),
    radial-gradient(90% 80% at 0% 100%, rgba(255,200,120,.3), transparent 60%);
}
.xh-ph i { position:relative;   }
.xh-ph span { position:relative;  text-shadow:0 1px 8px rgba(0,0,0,.35); }
.xh-ph-guide    { background:linear-gradient(150deg,#4a6cf7 0%,#6d5ce7 55%,#9d5cff 100%); }
.xh-ph-checklist{ background:linear-gradient(150deg,#0e9f8f 0%,#14b8a6 45%,#2f7cf0 115%); }
.xh-ph-chat     { background:linear-gradient(150deg,#f0577e 0%,#d946b8 55%,#7c5cf0 115%); }
.xh-ph-ticket   { background:linear-gradient(150deg,#f0942e 0%,#f5b94e 45%,#ec4899 120%); }
.xh-ph-ticket::after { background:
    radial-gradient(2px 2px at 24% 18%, rgba(255,255,255,.9), transparent),
    radial-gradient(3px 3px at 70% 12%, rgba(255,255,255,.75), transparent),
    radial-gradient(110% 90% at 90% 6%, rgba(255,255,255,.3), transparent 55%),
    radial-gradient(90% 90% at 4% 100%, rgba(255,110,150,.4), transparent 60%);
}
.xh-ph-0, .xh-ph-undefined { background:linear-gradient(150deg,#4a6cf7,#8b5cf6 60%,#a855f7); }



.xh-cover { border-radius:0; }
.xh-card .xh-body { background:linear-gradient(180deg, rgba(255,255,255,.98), rgba(251,250,255,.98)); }
[data-theme="dark"] .xh-card .xh-body { background:linear-gradient(180deg, #1d2033, #191c2e); }
.xh-title { font-weight:700; letter-spacing:.2px; }
.xh-cat {    letter-spacing:.6px;  }

.xh-count {  color:#fff;  }
.xh-avatar { box-shadow:0 0 0 1.5px #fff; }
[data-theme="dark"] .xh-avatar { box-shadow:0 0 0 1.5px #262a42; }
.xh-like { background:rgba(124,92,240,.08); color:#6d5ce7; }
[data-theme="dark"] .xh-like { background:rgba(139,122,246,.14); color:#c4b2ff; }

/* 排序行小胶囊 */



/* ---------- 8. 我的：极光主页卡 ---------- */
.pr-head {
  background:
    radial-gradient(130% 130% at 88% -18%, rgba(255,255,255,.26), transparent 52%),
    radial-gradient(120% 130% at -10% 20%, rgba(120,146,255,.5), transparent 60%),
    radial-gradient(120% 130% at 100% 105%, rgba(255,120,190,.4), transparent 60%),
    linear-gradient(150deg,#191d4a 0%,#2a2760 48%,#5a2a68 100%);
  box-shadow:0 14px 34px rgba(30,24,80,.28), inset 0 1px 0 rgba(255,255,255,.22);
}
[data-theme="dark"] .pr-head { box-shadow:0 14px 34px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.1); }
.pr-avatar { border-color:rgba(255,255,255,.8); box-shadow:0 4px 12px rgba(0,0,0,.25); }
.pr-badge { background:linear-gradient(135deg,rgba(255,215,130,.25),rgba(255,180,90,.18)); color:#f5b94e; }
.li-ico { box-shadow:inset 0 1px 0 rgba(255,255,255,.8); }
[data-theme="dark"] .li-ico { box-shadow:inset 0 1px 0 rgba(255,255,255,.08); }
.grp-label { letter-spacing:1.2px; }
.pr-links { border-radius:16px; overflow:hidden; }

/* ---------- 9. 返回栏 / 弹层 / 其它 ---------- */
.back-bar { background:linear-gradient(180deg, rgba(236,238,252,.9), rgba(238,236,252,0)); }
[data-theme="dark"] .back-bar { background:linear-gradient(180deg, rgba(12,14,26,.92), rgba(12,14,26,0)); }
.bb-back { border:1px solid rgba(124,92,240,.14); background:linear-gradient(160deg,rgba(255,255,255,.9),rgba(248,246,255,.85)); box-shadow:0 3px 10px rgba(31,38,135,.06); }
[data-theme="dark"] .bb-back { background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.1); }

.forbid-banner { border-color:rgba(245,185,78,.4); box-shadow:0 6px 16px rgba(245,185,78,.12); }

.modal-mask { background:rgba(11,15,28,.46); backdrop-filter:blur(4px); -webkit-backdrop-filter:blur(4px); }
.modal-panel {
  border:1px solid rgba(255,255,255,.75);
  box-shadow:0 30px 80px rgba(15,20,50,.4), inset 0 1px 0 rgba(255,255,255,.85);
}
[data-theme="dark"] .modal-panel { border-color:rgba(255,255,255,.12); }

.link-more { color:#6d5ce7; background:rgba(124,92,240,.1); border-color:rgba(124,92,240,.16); }
[data-theme="dark"] .link-more { background:rgba(139,122,246,.14);  color:#c4b2ff; }
.todo-item > .muted, .link-card > .muted { background:rgba(124,92,240,.14); }

/* ---------- 10. 底部导航：星辉胶囊 ---------- */


.tab.on {
  background:linear-gradient(135deg,#4a6cf7,#7c5cf0 55%,#a855f7);
  box-shadow:
    0 8px 22px rgba(109,92,231,.42),
    0 2px 6px rgba(109,92,231,.3),
    inset 0 1px 0 rgba(255,255,255,.4),
    inset 0 -4px 10px rgba(168,85,247,.35);
}
[data-theme="dark"] .tab.on { box-shadow:0 8px 22px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.25); }

/* ---------- 11. 暗色补全：白卡组件反色 ---------- */
[data-theme="dark"] .community-banner .banner-icon { color:#f5b94e; }
[data-theme="dark"] .greet-tail { color:var(--text-3); }
[data-theme="dark"] .card .ticket { box-shadow:0 14px 30px rgba(0,0,0,.5); }
[data-theme="dark"] .map-wrap { border-color:rgba(255,255,255,.1); }
[data-theme="dark"] .recap-banner-title svg { stroke:#ffd98e; }

/* ---- 修正：倒计时格相对定位，柔光只留在格内 ---- */




/* ================= v2.1 视觉收口（瓷瓶化） ================= */

/* 1) 全局菜单头：标题与标语拉开呼吸感 */
.topbar { margin-bottom: 18px; }
.topbar .title { font-size: 22px; line-height: 1.14; }
.topbar .sub { margin-top: 10px; font-size: 12px; line-height: 1.5; }
.home-topbar { margin-bottom: 16px; }
.home-topbar .greet { margin-top: 9px; }
@media (max-width: 500px) {
  .topbar .title { font-size: 22px; }
  .topbar .sub { font-size: 12px; margin-top: 9px; }
}

/* 2) 首页主卡：去掉左侧大光球/星球，保留干净星夜渐变 */
.hero-home::before { content: none; }
.hero-home {
  background:
    radial-gradient(105% 85% at 94% -10%, rgba(155,125,255,.55), transparent 58%),
    radial-gradient(120% 95% at 8% 118%, rgba(120,105,255,.22), transparent 62%),
    linear-gradient(150deg, #232a63 0%, #342c70 54%, #5a2b70 100%);
  box-shadow: 0 16px 40px rgba(40,44,150,.34), 0 4px 12px rgba(40,44,150,.18);
}

/* 3) 首页统计四格：白瓷小卡（参考图1/图2） */
.ht-grid { gap: 10px; margin: 2px 0 14px; }
.ht {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 6px; padding: 15px 4px 13px; border-radius: 20px;
  background: linear-gradient(165deg, #ffffff, #fbf9ff);
  
  
}
[data-theme="dark"] .ht {
  background: linear-gradient(165deg, #1d2038, #171a30);
  border-color: rgba(255,255,255,.08);
  box-shadow: 0 8px 20px rgba(0,0,0,.32);
}
.ht-ic {
  width: 44px; height: 44px; border-radius: 14px; border: none; box-shadow: none;
  display: flex; align-items: center; justify-content: center;
}
.ht-ic svg { width: 22px !important; height: 22px !important; }
.ht b {
  -webkit-background-clip:text;
  background: none; -webkit-text-fill-color: currentColor; color: #6d5ce7;
  font-size: 18px; line-height: 1; font-weight: 700; font-variant-numeric: tabular-nums; margin-top: 2px;
}
[data-theme="dark"] .ht b {
  -webkit-background-clip:text; -webkit-text-fill-color: currentColor; color: #c4b2ff; }
.ht span { font-size: 11px; color: #6b7390; letter-spacing: .2px; }
[data-theme="dark"] .ht span { color: #a8b0c8; }
.ht-c1 { background: #7c5cfc; color: #fff; }
.ht-c2 { background: #3b82f6; color: #fff; }
.ht-c3 { background: #f59e0b; color: #fff; }
.ht-c4 { background: #10b981; color: #fff; }
.ht:nth-child(1) b { color: #6d5ce7; }
.ht:nth-child(2) b { color: #4a6cf7; }
.ht:nth-child(3) b { color: #f5b94e; }
.ht:nth-child(4) b { color: #1f9d63; }
[data-theme="dark"] .ht:nth-child(1) b { color: #c4b2ff; }
[data-theme="dark"] .ht:nth-child(2) b { color: #6b85ff; }
[data-theme="dark"] .ht:nth-child(3) b { color: #f5b94e; }
[data-theme="dark"] .ht:nth-child(4) b { color: #5fd39b; }
/* 3b) 首页「本场速办」：去掉外层白卡，按钮白瓷格 */
.hero-home + .card { background: transparent; border: none; box-shadow: none; padding: 0; }

/* v1.5.35：速办卡片头把「本场速办 + 自选」放同一行（第 6 格「更多」已接管「整场筹备」，头部不再需要换行） */
.hero-home + .card .card-head {
  padding: 0 2px;
  margin-bottom: 10px; display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.hero-home + .card h3 { margin-bottom: 0; }
/* v1.5.35：本场速办改 6 格 —— 3 列 × 2 行，每格正方形（图标 + 名称 + 一行小字 + 进度条）*/
.qt-grid { grid-template-columns: repeat(3, 1fr); gap: 9px; }
.qt {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 6px; padding: 10px 6px; border-radius: 18px; text-align: center;
  aspect-ratio: 1 / 1; overflow: hidden;
  background: linear-gradient(165deg, #ffffff, #fbf9ff);
  
  
}
[data-theme="dark"] .qt {
  background: linear-gradient(165deg, #1d2038, #171a30);
  border-color: rgba(255,255,255,.08);
  box-shadow: 0 8px 20px rgba(0,0,0,.32);
}/* v1.5.45：速办卡里的条子必须「跟着按钮走」。以前 .qt-bd 是随内容收缩的，
   子文案一长（行程时间线会带上节点名 + 时间）就把文字块撑宽，84% 是相对那条被撑宽的
   文字块算的 → 条子比别的卡长，顶到卡边、圆头被裁掉（产品原话「线条延长至按钮外」）。
   现在文字块撑满整格（长文案走省略号），四张卡的条子宽度完全一致。 */
.qt-bd { display: flex; flex-direction: column; align-items: center; gap: 4px; min-width: 0; width: 100%; }
.qt-bd b { font-size: 12px; line-height: 1.2; color: #1a1f36; }
[data-theme="dark"] .qt-bd b { color: #eef1ff; }
.qt-bd > span { font-size: 11px; line-height: 1.4; color: #6b7390; max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
[data-theme="dark"] .qt-bd > span { color: #a8b0c8; }
.qt-ic { width: 36px; height: 36px; border-radius: 12px; box-shadow: none; display: flex; align-items: center; justify-content: center; color: #fff; }
.qt-ic svg { width: 19px !important; height: 19px !important; }
.qt-grid .qt:nth-child(1) .qt-ic { background: #7c5cfc; }
.qt-grid .qt:nth-child(2) .qt-ic { background: #3b82f6; }
.qt-grid .qt:nth-child(3) .qt-ic { background: #f59e0b; }
.qt-grid .qt:nth-child(4) .qt-ic { background: #10b981; }
.qt-grid .qt:nth-child(5) .qt-ic { background: #ec4899; }
/* 第 6 格「更多」＝次要入口：淡底 + 主题色图标，不抢前面 5 格的色块 */


.qt-bar { width: 84%; max-width: 100%; box-sizing: border-box; height: 4px; border-radius: 99px; background: rgba(124,92,252,.14); overflow: hidden; margin-top: 3px; }
.qt-bar i { display: block; height: 100%; border-radius: 99px; box-shadow: none; }/* 4) 年度回忆入口：白瓷卡 */
.card.link-card {
  border-radius: 22px; padding: 16px; gap: 12px;
  
  
  margin-top: 2px;
}
[data-theme="dark"] .card.link-card {
  
  box-shadow: 0 10px 24px rgba(0,0,0,.3);
}


.link-card b { font-size: 16px; }
.link-card .grow { display: flex; flex-direction: column; gap: 3px; }
.link-card .grow span { font-size: 11px; line-height: 1.4; color: #6b7390; }
[data-theme="dark"] .link-card .grow span { color: #a8b0c8; }
.card.link-card > .muted {
  width: 30px; height: 30px; border-radius: 50%; flex: none;
  display: flex; align-items: center; justify-content: center;
  background: #f0edff; color: #6d5ce7; font-size: 14px;
}
[data-theme="dark"] .card.link-card > .muted { background: rgba(139,122,246,.2); color: #c4b2ff; }/* 5) 首页「大家都在聊」：社区化迷你卡片 */
.hot-row { gap: 10px; }
.hot-mini {
  display: flex; align-items: center; gap: 10px; padding: 9px 10px; border-radius: 18px;
  
  
  
}
[data-theme="dark"] .hot-mini {
  
  border-color: rgba(255,255,255,.08);
  box-shadow: 0 6px 16px rgba(0,0,0,.3);
}
.hot-cv {   border-radius: 14px; flex: none; background-size: cover; background-position: center; background-color: #e9e6ff; }
.hot-cv-ph { display: flex; align-items: center; justify-content: center; color: #fff; background: linear-gradient(150deg, #7c5cfc, #d946b8); box-shadow: inset 0 0 0 1px rgba(255,255,255,.2); }
.hot-cv-ph svg { width: 20px !important; height: 20px !important; }
.hot-txt { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.hot-txt b {
  font-size: 12px; line-height: 1.4; color: #1a1f36;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
[data-theme="dark"] .hot-txt b { color: #eef1ff; }
.hot-txt span { font-size: 11px; color: #6b7390; }
[data-theme="dark"] .hot-txt span { color: #a8b0c8; }/* 6) 行程卡片：图3 渐变紫卡（排版不变） */
.concert-card {
  position: relative; overflow: hidden;
  background: linear-gradient(150deg, #4a55cf 0%, #5d4bd0 46%, #7c3fa8 100%);
  border: none; border-radius: 22px; padding: 12px;
  box-shadow: 0 12px 26px rgba(64,60,170,.24), inset 0 1px 0 rgba(255,255,255,.25);
  color: #fff;
}
[data-theme="dark"] .concert-card {
  background: linear-gradient(150deg, #3c46b8 0%, #4c3eb6 48%, #6b3090 100%);
  box-shadow: 0 12px 26px rgba(0,0,0,.35), inset 0 1px 0 rgba(255,255,255,.14);
}
.concert-card::before { content: ''; position: absolute; top: -70px; right: -52px; width: 190px; height: 190px; border-radius: 50%; background: radial-gradient(circle, rgba(255,255,255,.30), transparent 66%); pointer-events: none; }
.concert-card::after { content: ''; position: absolute; left: -42px; bottom: -84px; width: 170px; height: 170px; border-radius: 50%; background: radial-gradient(circle, rgba(140,200,255,.24), transparent 68%); pointer-events: none; }
.concert-card .concert-cover {
  width: 88px;  border-radius: 16px; flex: none;   /* v1.6.0：88×92 → 88×88，小图统一 1:1 */
  background: rgba(255,255,255,.18); border: 1px solid rgba(255,255,255,.24);
  box-shadow: none; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);
}
.concert-card .concert-cover img { width: 100%; height: 100%; object-fit: cover; border-radius: 0; }
.concert-card .concert-cover .cc-ico { color: #fff; opacity: .95; margin: auto; }.concert-card .concert-body { position: relative; z-index: 1; padding: 2px 2px 2px 6px; }
.concert-card .cc-name { color: #fff; font-size: 16px; padding-right: 70px; text-shadow: 0 1px 6px rgba(0,0,0,.16); }
.concert-card .cc-meta, .concert-card .cc-date { color: #ffffff; }
.concert-card .tag { background: rgba(255,255,255,.22); color: #fff; border: 1px solid rgba(255,255,255,.34); text-shadow: 0 1px 4px rgba(0,0,0,.18); }
.concert-card .tag-blue { background: rgba(255,255,255,.24); color: #fff; }
.concert-card .tag-red { background: rgba(255,110,105,.44); color: #fff; border-color: rgba(255,190,185,.5); }
.concert-card .tag-gold { background: rgba(245,180,70,.5); color: #fff; border-color: rgba(255,215,140,.55); }
.concert-card .tag-gray { background: rgba(255,255,255,.18); color: #fff; }






/* 7) 社区：瓷瓶大圆角 */

.search-box { border-radius: 18px; }


.xh-feed .xh-card { margin-bottom: 11px; }

[data-theme="dark"] .xh-card { border-color: rgba(255,255,255,.08);  }




.xh-like { border-radius: 999px;  }/* v2.1-final 首页主卡：左右侧无光球，仅右上极光 */
.hero-home, [data-theme="dark"] .hero-home {
  background:
    radial-gradient(110% 88% at 96% -8%, rgba(155,125,255,.42), rgba(0,0,0,0) 55%),
    linear-gradient(150deg, #232a63 0%, #342c70 55%, #5b2a70 100%);
}

/* ================= v2.2 polish (static nickname / squares / single-column community / CTA & ticket tweaks) ================= */

/* 1) static nickname gradient (no shimmer animation)
   v1.6.25：去掉两条 !important —— LV.12+ 的流动昵称要能盖上来（见文件末尾 v1.6.25 段） */
.greet-name {
  animation: none;
  background-size: auto;
}

/* 2) countdown cells: square */





/* 3) home "everyone is chatting" thumbnails: square */
.hot-cv { width: 56px !important; height: 56px !important; }

/* 4) bottom nav: rounded-square tiles */


/* 5) trip CTA: clearer button */



/* 6) community feed: single column, memories-style full-width cards */




.xh-title {
    
  display: -webkit-box;   overflow: hidden;
}





/* 7) ticket stub: whole card editable + inside "custom style" chip */
.ticket { cursor: pointer; }
.t-edit { display: flex; justify-content: flex-end; margin-top: 8px; }
.t-custom {
  display: inline-flex; align-items: center; gap: 4px;
  background: rgba(124,92,252,.1); color: #6d5ce7;
  font-size: 11px; font-weight: 700; letter-spacing: .2px;
  padding: 4px 10px; border-radius: 999px;
}
[data-theme="dark"] .t-custom { background: rgba(150,125,255,.18); color: #c4b2ff; }

/* ============ v2.3 恢复毛玻璃：倒计时方块格 + 底栏（用户反馈） ============ */

/* 倒计时：可见的正方形毛玻璃格 */

.hero-home .countdown .num { color: #fff; }


/* 底部导航：恢复半透明毛玻璃（保留圆角方块选中态） */
.tabbar {
  background: linear-gradient(170deg, rgba(255,255,255,.52), rgba(248,246,255,.34));
  backdrop-filter: blur(34px) saturate(190%);
  -webkit-backdrop-filter: blur(34px) saturate(190%);
  
}
[data-theme="dark"] .tabbar {
  background: linear-gradient(170deg, rgba(24,28,48,.52), rgba(18,20,36,.32));
  
}

/* ============ v2.4 行程CTA去塑料感 + 底栏放大（用户反馈） ============ */

/* 行程卡《准备清单》：磨砂玻璃胶囊，不再白亮塑料 */
.concert-card .cc-next {
  align-self: flex-start;
    
    
  
  
  
     
  
  
  
  
}

.concert-card.past .cc-next {  border-color: rgba(255,255,255,.45);  }


/* 底部导航：整体放大 */

.tab { min-height: 58px; padding: 7px 2px; gap: 3px; font-size: 11px; border-radius: 16px; }
.tab .ti svg { width: 24px !important; height: 24px !important; }

/* ============ v2.5 社区双列贴纸 + 顶部留白 + 四大卡统一浅紫蓝调 + 记账(去进度条换»)(用户反馈) ============ */

/* 社区：顶部呼吸感 */
.community-banner { margin-bottom: 14px; }
.community-header { padding-top: 8px; }
.search-box { margin-bottom: 10px; }
.cat-tabs { gap: 8px; padding: 8px 0 6px; }



.xh-card, .search-box { touch-action: pan-y; }
/* ===== v1.4.29 分类条横向滑动恢复（原先 .cat-tabs 也被设成 pan-y，横向滚动被锁死，只能看到前 4 类） ===== */
.cat-tabs, .community-header { touch-action: pan-x pan-y; }

/* 社区：双列竖贴纸卡片 */
.xh-feed {  column-gap: 10px;  }

.xh-card {  overflow: hidden; background: #fff;
  border: 1px solid rgba(255,255,255,.95);
  box-shadow: 0 10px 26px rgba(31,38,135,.09), 0 2px 8px rgba(31,38,135,.05); }
.xh-cover { aspect-ratio: 3 / 3.55; }
.xh-body { padding: 10px 12px 12px; }
.xh-title {
  -webkit-box-orient: vertical; font-size: 12px; line-height: 1.45; min-height: 0; -webkit-line-clamp: 2; }
.xh-meta { margin-top: 8px; gap: 6px; }
.xh-avatar { width: 19px; height: 19px; font-size: 11px; }
.xh-name { font-size: 11px; }
.xh-like {  padding: 2px 9px; }


.xh-feed.single .xh-card { max-width: 300px; margin-left: auto; margin-right: auto; }

/* 首页主卡 / 行程卡 / 回忆条卡 / 我的资料卡：统一浅紫蓝调（更淡更协调） */
.hero-home, .recap-banner, .pr-head, .concert-card {
  background:
    radial-gradient(120% 130% at 92% -12%, rgba(255,255,255,.22), transparent 52%),
    linear-gradient(150deg, #4a55cf 0%, #5d4bd0 50%, #7c3fa8 100%);
}
[data-theme="dark"] .hero-home, [data-theme="dark"] .recap-banner, [data-theme="dark"] .pr-head, [data-theme="dark"] .concert-card {
  background:
    radial-gradient(120% 130% at 92% -12%, rgba(255,255,255,.1), transparent 52%),
    linear-gradient(150deg, #3c46b8 0%, #4c3eb6 50%, #6b3090 100%);
}
.recap-banner-go { color: #fff; }
.recap-banner .recap-banner-title svg { stroke: #ffe9b0; }

/* 记账卡：进度条换成 » 角标 */

[data-theme="dark"] .qt-go { color: #a8b0c8; }

/* ============ v2.6/v2.7 倒计时更透更小 / 预算金额普通样式 / 社区欢迎卡对照回忆馆条卡 / 首页头像同步(用户反馈) ============ */

/* 首页头像与主页头像同步 */
/* v1.6.24：头像框的 ::after 画在头像外沿 3.5px 处 —— 父层不能再 overflow:hidden（会把它裁掉）。
   改成里层 .greet-ava-in 自己裁成圆，并把内容抬到 z-index 2 压住渐变盘（与 .pr-ava-wrap 同一路数）。 */
.greet-ava { position: relative; border-radius: 50%; }
.greet-ava-in { position: absolute; inset: 0; z-index: 2; display: flex; align-items: center; justify-content: center; border-radius: 50%; overflow: hidden; }
.greet-ava .greet-ava-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }

/* 倒计时：更透明 + 整体缩小（字号不变） */





/* 预算记账卡：金额普通样式（去掉渐变特效） */

[data-theme="dark"] .qt-money {
  color: #eef1ff; background: none;
  -webkit-background-clip: initial; background-clip: initial; -webkit-text-fill-color: initial;
}
.qt-sub2 { font-size: 11px; line-height: 1.35; color: #6b7390; margin-top: 2px; }
[data-theme="dark"] .qt-sub2 { color: #a8b0c8; }

/* 社区欢迎卡：尺寸对照回忆馆「年度回忆册」条卡（紧凑），前置圆圈缩小 */
.community-banner { padding: 9px 12px !important; margin: 2px 0 8px !important; border-radius: 13px !important; }
.community-banner .banner-icon {
  align-items:center;
  justify-content:center;
  width: 26px !important; height: 26px !important; font-size: 12px !important; flex: none;
  border-radius: 50% !important; box-shadow: 0 0 0 3px rgba(255,255,255,.16);
}
.community-banner .banner-title { font-size: 12px !important; }
.community-banner .banner-desc { font-size: 11px !important; margin-top: 2px !important; line-height: 1.4 !important; }
/* ============ v2.8 记账弹窗：支出/预算 二选一（用户反馈：缺少预算录入入口） ============ */
.exp-kind { display: flex; gap: 8px; }
.exp-opt {
  position: relative; flex: 1; display: flex; align-items: center; justify-content: center; gap: 6px;
  padding: 9px 6px; border-radius: 12px; background: #f1f0fa; color: #6b7390;
  font-size: 12px; font-weight: 600; cursor: pointer; border: 1px solid transparent; transition: all .15s ease;
}
[data-theme="dark"] .exp-opt { background: rgba(255,255,255,.07); color: #a8b0c8; }
.exp-opt input { position: absolute; opacity: 0; pointer-events: none; }
.exp-opt.on {
  background: linear-gradient(135deg, #6d5ce7, #8b5cf6); color: #fff;
  box-shadow: 0 6px 14px rgba(109,92,231,.28);
}
/* ============ v2.9 主卡淡渐变纱幕铺底 + 倒计时方块放大1/4（用户反馈） ============ */
.hero-home::after {
  
  position: absolute; inset: 0; z-index: 1; pointer-events: none;
  
}
.hero-home .countdown { gap: 10px; justify-content: space-between; }
.hero-home .countdown .unit {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  width: 72px; height: 72px; aspect-ratio: auto; padding: 6px 2px;
  background: linear-gradient(180deg, rgba(255,255,255,.18), rgba(255,255,255,.05));
  border: 1px solid rgba(255,255,255,.34); border-radius: 18px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.32), 0 6px 14px rgba(6,8,26,.18);
  backdrop-filter: blur(12px) saturate(150%);
  -webkit-backdrop-filter: blur(12px) saturate(150%);
}
.hero-home .countdown .num { font-size: 22px; }
.hero-home .countdown .lbl {
  color: #ffffff; font-size: 11px; margin-top: 3px; }
/* ============ v1.3.2 修正：准备清单勾选对比 / 详情卡原图直出 / 主卡倒计时贴底短渐变 ============ */
.cbox { border-color:#6a74ad;  box-shadow:0 1px 3px rgba(80,90,160,.18); }
[data-theme="dark"] .cbox { border-color:#4d5575; background:rgba(255,255,255,.07); box-shadow:none; }
.cbox:active { transform:scale(.92); }
.hero-card.detail-hero.has-cover::before,
.hero-card.detail-hero.has-cover::after { content:none; }
.hero-card.detail-hero.has-cover .stars-bg { display:none; }
.hero-card.detail-hero.has-cover > div { text-shadow:0 1px 8px rgba(3,6,24,.45); }


/* ============ v1.3.4 首页演唱会主卡：按需求取消底部纱幕渐变（原图直出） ============ */
.hero-home::after { content: none; }
/* ============ v1.3.7 首页演唱会主卡：可自定义版式（用户反馈） ============ */
/* 版式入口按钮 */
.hero-top-r { display:inline-flex; align-items:center; gap:7px; }
.hc-lay { display:inline-flex; align-items:center; justify-content:center; width:27px; height:27px; padding:0; border-radius:50%;
    color:#fff; cursor:pointer;
     }
.hc-lay:active { transform:scale(.9); }


/* 版式一：经典沉底（保持原样，无需覆写） */

/* 版式二：倒计时置顶 */
.hero-card.hero-home[data-lay="cdtop"] { justify-content:flex-start; }
.hero-card.hero-home[data-lay="cdtop"] > .hero-top { order:1; }
.hero-card.hero-home[data-lay="cdtop"] > .countdown { order:2; margin:12px auto 0; align-self:center; justify-content:center; }
.hero-card.hero-home[data-lay="cdtop"] > .artist { order:3; margin-top:auto; padding-top:18px; }
.hero-card.hero-home[data-lay="cdtop"] > .place { order:4; margin-top:4px; }

/* 版式三：标题居中 */
.hero-card.hero-home[data-lay="center"] > .artist,
.hero-card.hero-home[data-lay="center"] > .place { align-self:center; text-align:center; }
.hero-card.hero-home[data-lay="center"] > .artist { margin-top:auto; }
.hero-card.hero-home[data-lay="center"] > .place { margin-top:5px; }
.hero-card.hero-home[data-lay="center"] > .countdown { margin-top:13px; align-self:center; justify-content:center; }

/* 版式四：海报分栏（左标题 + 右倒计时 2x2） */
.hero-card.hero-home[data-lay="split"] > .artist { margin-top:auto; padding-right:126px; }
.hero-card.hero-home[data-lay="split"] > .place { margin-top:4px; padding-right:126px; }
.hero-card.hero-home[data-lay="split"] > .countdown {
  position:absolute; right:12px; bottom:12px; margin:0; z-index:2;
  display:grid; grid-template-columns:1fr 1fr; gap:6px; width:110px; justify-content:initial;
}
.hero-card.hero-home[data-lay="split"] > .countdown .unit { width:52px; height:52px; border-radius:14px; padding:4px 2px; }
.hero-card.hero-home[data-lay="split"] > .countdown .num { font-size:18px; }
.hero-card.hero-home[data-lay="split"] > .countdown .lbl { font-size:11px; margin-top:2px; }

/* 版式选择弹层 */
.hcs-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.hcs-item { margin:0; display:flex; flex-direction:column; align-items:center; gap:6px; padding:10px 8px 9px;
  border-radius:14px; cursor:pointer; text-align:center;
  border:1.5px solid rgba(124,92,240,.20); background:linear-gradient(165deg,#fff,#fbf8ff);
  box-shadow:0 2px 8px rgba(40,45,120,.05); transition:transform .15s,border-color .15s,box-shadow .15s; }
[data-theme="dark"] .hcs-item { background:linear-gradient(165deg,#232648,#1c1e38); }
.hcs-item:active { transform:scale(.97); }
.hcs-item.on { border-color:#7c5cfc; box-shadow:0 6px 16px rgba(109,92,231,.28); }
.hcs-item .hcs-name { font-size:12px; font-weight:700; color:#1a1f36; letter-spacing:.2px; }
[data-theme="dark"] .hcs-item .hcs-name { color:#eef1ff; }
.hcs-item .hcs-sub { font-size:11px; color:#6b7390; line-height:1.35; }
[data-theme="dark"] .hcs-item .hcs-sub { color:#a8b0c8; }
.hc-tb { position:relative; display:block; width:100%; height:50px; border-radius:10px; overflow:hidden;
  background:linear-gradient(150deg,#232a63 0%,#3f2a78 55%,#5a2b70 100%);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.28), 0 2px 6px rgba(20,24,80,.2); }
.hc-tb i { position:absolute; display:block; border-radius:3px; }
.hc-tb .hd { top:7px; left:8px; width:34px; height:6px; background:rgba(255,255,255,.55); }
.hc-tb .hn { width:58%; height:8px; background:linear-gradient(90deg,#fff,#ffe3a6); }
.hc-tb .hm { width:44%; height:4px; background:rgba(255,255,255,.5); }
.hc-tb .cd { position:absolute; display:flex; gap:3px; align-items:stretch; }
/* W-038：缩略图倒计时 = 首页现版「左大天数条 + 右 3 小块」 */
.hc-tb .cd b { position:static; flex:0 0 9px; height:10px; border-radius:3px; background:rgba(255,255,255,.92); box-shadow:0 1px 2px rgba(0,0,0,.3); }
.hc-tb .cd b.dd { flex:1 1 auto; background:linear-gradient(90deg,#fff,#ffe3a6); }
.hc-tb.classic .hn { left:9%; bottom:46%; }
.hc-tb.classic .hm { left:9%; bottom:36%; }
.hc-tb.classic .cd { left:9%; right:9%; bottom:9%; }
.hc-tb.cdtop .hn { left:9%; bottom:36%; }
.hc-tb.cdtop .hm { left:9%; bottom:26%; }
.hc-tb.cdtop .cd { left:9%; right:9%; top:32%; }
.hc-tb.center .hn { left:50%; transform:translateX(-50%); bottom:48%; }
.hc-tb.center .hm { left:50%; transform:translateX(-50%); bottom:38%; }
.hc-tb.center .cd { left:18%; right:18%; bottom:9%; }
.hc-tb.split .hn { left:8%; bottom:34%; width:42%; }
.hc-tb.split .hm { left:8%; bottom:24%; width:34%; }
.hc-tb.split .cd { left:56%; right:8%; bottom:12%; }
.modal-done-row { display:flex; justify-content:flex-end; margin-top:14px; }
.modal .modal-done-row .btn.btn-sm.modal-done { height:32px !important; min-height:32px !important; padding:0 18px !important; font-size:13px !important; font-weight:600 !important; line-height:32px; border-radius:999px; background:#7c5cfc !important; color:#fff !important; flex:0 0 auto; }


/* ========== v1.4.1 游客模式：欢迎页 + 游客横幅 + 长条按钮 ========== */
/* UX-0926-03（2026-09-26）：圆角 18px 方角 → 999px 胶囊，跟授权页 / 登录页一条线。
   .btn-xl 全仓只有 app.js 第 404/405/406 行那三颗（欢迎页「登录 / 微信一键登录 / 不登录，随便逛逛」）在用，
   所以直接改这里 = 只影响欢迎页，其它页面零波及。高度 54px 本来就达标，不动。 */
.btn-xl { min-height: 54px; font-size: 18px; font-weight: 700; border-radius: 999px; letter-spacing: 1px; }
.btn-xl:active { transform: scale(0.98); }
.btn-glass {
  background: var(--card); border: 1px solid var(--border); color: var(--text);
  -webkit-backdrop-filter: var(--glass-blur); backdrop-filter: var(--glass-blur);
  box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.7);
}
[data-theme="dark"] .btn-glass {
  background: rgba(255,255,255,0.07); border-color: rgba(255,255,255,0.16);
  box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.06);
}
.btn-glass:hover { transform: translateY(-1px); }

.welcome-page {
  position: relative; z-index: 1; min-height: 100%;
  display: flex; flex-direction: column; justify-content: space-between;
  padding: calc(7vh + env(safe-area-inset-top)) 26px calc(7vh + env(safe-area-inset-bottom));
  overflow: hidden;
}
.welcome-glow {
  position: absolute; width: 320px; height: 320px; border-radius: 50%;
  background: radial-gradient(circle, rgba(124,92,255,0.28), transparent 65%);
  top: 10%; left: 50%; transform: translateX(-50%); filter: blur(24px);
  pointer-events: none; z-index: 0;
}
.welcome-inner { position: relative; z-index: 1; text-align: center; }
.welcome-logo { font-size: 28px; }
.welcome-title { margin-top: 10px; font-size: 28px; font-weight: 700; letter-spacing: 1px; }
.welcome-sub { margin-top: 8px; font-size: 14px; color: var(--text-2); }
.welcome-points {    flex-wrap: wrap; justify-content: center;  }
.welcome-points span {
      
    
  -webkit-backdrop-filter: var(--glass-blur); backdrop-filter: var(--glass-blur);
   
}

.welcome-points svg { color: var(--primary); }
.welcome-actions { position: relative; z-index: 1; display: flex; flex-direction: column; gap: 12px; }
.welcome-note { margin-top: 4px; text-align: center; font-size: 12px; color: var(--text-3); }

.guest-banner {
  position: sticky; top: 0; z-index: 60;
  display: flex; align-items: center; gap: 9px; padding: 8px 12px;
  font-size: 12px; color: #fff;
  background: linear-gradient(90deg, rgba(74,108,247,0.96), rgba(124,92,255,0.96));
  box-shadow: 0 4px 14px rgba(40,45,120,0.22);
}
[data-theme="dark"] .guest-banner { box-shadow: 0 4px 14px rgba(0,0,0,0.4); }
.guest-banner .gb-dot {
  width: 7px; height: 7px; border-radius: 50%; background: #ffe08a; flex: none;
  box-shadow: 0 0 8px #ffe08a; animation: gbPulse 1.6s ease-in-out infinite;
}
@keyframes gbPulse { 0%,100% { opacity: 1; } 50% { opacity: 0.45; } }
.guest-banner .gb-txt { flex: 1; opacity: 0.96; }
.guest-banner .gb-btn {
  flex: none; border: none; cursor: pointer; padding: 5px 14px; border-radius: 999px;
  background: rgba(255,255,255,0.22); color: #fff; font-size: 12px; font-weight: 600;
}
.guest-banner .gb-btn:active { transform: scale(0.97); }

/* ========== v1.4.1 本场速办自选 / 纯净截图 / 社区顶部分类收敛 ========== */
.card-head .head-mini { display:inline-flex; align-items:center; gap:3px; font-size:11px; }
.qk-list { display:flex; flex-direction:column; gap:8px; max-height:48vh; overflow:auto; padding:2px; }
.qk-row { display:flex; align-items:center; gap:10px; width:100%; text-align:left; padding:9px 12px; border-radius:12px;  background:linear-gradient(160deg, rgba(255,255,255,.9), rgba(248,246,255,.86)); cursor:pointer; transition:all .2s; }
[data-theme="dark"] .qk-row { background:rgba(255,255,255,.05); border-color:rgba(255,255,255,.1); }
.qk-row .qk-ic { width:32px; height:32px; flex:none; display:inline-flex; align-items:center; justify-content:center; border-radius:9px; background:rgba(124,92,240,.1); color:#6d5ce7; }
[data-theme="dark"] .qk-row .qk-ic { background:rgba(139,122,246,.16); color:#c4b2ff; }
.qk-tx { flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
.qk-tx b { font-size:12px; }
.qk-tx span { font-size:11px; color:#6b7390; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.qk-check { width:22px; height:22px; flex:none; border-radius:50%; border:1.5px solid #d6d9e6; display:none; align-items:center; justify-content:center; color:#fff; }
.qk-row.on .qk-check { display:inline-flex; background:linear-gradient(135deg,#4a6cf7,#7c5cf0); border-color:transparent; }
.qk-row.on { border-color:rgba(74,108,247,.45); }

/* 纯净截图：隐藏首页主卡与纪念票根上的角标 / 操作按钮 */
body.clean-shot .hero-home .hero-status,
body.clean-shot .hero-home .hc-lay,
body.clean-shot .ticket .t-flag,
body.clean-shot .ticket .t-edit,
body.clean-shot .ticket .t-act-btn { display:none !important; }

/* 社区顶部分类按钮小一号 + 左侧留白 */
.community-header .cat-tabs { gap:6px; padding:8px 2px 6px; }
.cat-tab { font-size:11px !important;  border-radius:12px !important; }



/* v1.4.1 预算记账：与打包清单同款进度条（有预算显示，超支满条变红） */
.qt-bar.over i { background:linear-gradient(90deg,#ef4444,#f97316); box-shadow:0 0 8px rgba(239,68,68,.45); }
[data-theme="dark"] .qt-bar.over i { box-shadow:0 0 8px rgba(239,68,68,.35); }

/* ========== v1.4.2 欢迎页与登录页：功能点高级化 + 扁平化 ========== */
/* 1) 欢迎页功能点：玻璃胶囊 -> 2x2 扁平白卡（克制留白、轻阴影、图标紫调） */
.welcome-points {
  display:grid; grid-template-columns:repeat(2, 1fr); gap:10px;
  max-width:344px; margin:28px auto 0;
}
.welcome-points span {
  display:flex; align-items:center; justify-content:flex-start; gap:8px;
  padding:13px 13px; border-radius:16px;
  background:#ffffff; border:1px solid rgba(124,92,240,.13); color:#5a6178;
  font-size:12px; font-weight:600; letter-spacing:.3px;
  box-shadow:0 6px 18px rgba(90,80,200,.07);
}
.welcome-points span svg { color:#6d5ce7; flex:none; }
[data-theme="dark"] .welcome-points span {
  background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.12);
  color:#eef1ff; box-shadow:none;
}
[data-theme="dark"] .welcome-points span svg { color:#c4b2ff; }

/* 2) 长条主/次按钮：扁平纯色，去流光渐变与顶部高光（欢迎页 + 登录页 + 引导页） */
.welcome-page .btn::after, .auth-wrap .btn::after, .onb-wrap .btn::after { content:none; }
.welcome-page .btn-primary, .auth-wrap .btn-primary, .onb-wrap .btn-primary {
  background:#6d5ce7; background-image:none; border:none;
  box-shadow:0 4px 12px rgba(109,92,231,.22);
}
[data-theme="dark"] .welcome-page .btn-primary, [data-theme="dark"] .auth-wrap .btn-primary, [data-theme="dark"] .onb-wrap .btn-primary {
  background:#6f62e6; box-shadow:none;
}
.welcome-page .btn-primary:hover, .auth-wrap .btn-primary:hover, .onb-wrap .btn-primary:hover {
  transform:none; box-shadow:0 6px 16px rgba(109,92,231,.26); filter:brightness(1.06);
}
[data-theme="dark"] .welcome-page .btn-primary:hover, [data-theme="dark"] .auth-wrap .btn-primary:hover, [data-theme="dark"] .onb-wrap .btn-primary:hover { filter:brightness(1.12); }
/* 欢迎页「随便逛逛」玻璃按钮 -> 扁平白底描边 */
.welcome-page .btn-glass {
  background:#ffffff; border:1px solid rgba(124,92,240,.24); color:#1a1f36;
  backdrop-filter:none; -webkit-backdrop-filter:none; box-shadow:none;
}
[data-theme="dark"] .welcome-page .btn-glass {
  background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.16); color:#eef1ff;
}
.welcome-page .btn-glass:hover { transform:none; background:#f7f5ff; }
[data-theme="dark"] .welcome-page .btn-glass:hover { background:rgba(255,255,255,.1); }

/* 3) 登录页卡片/输入框/分段/幽灵按钮：去玻璃改扁平白 */
.auth-wrap .card {
  background:#ffffff; backdrop-filter:none; -webkit-backdrop-filter:none;
  border:1px solid rgba(124,92,240,.10); box-shadow:0 10px 28px rgba(80,75,190,.08);
}
[data-theme="dark"] .auth-wrap .card { background:#1d2038; border-color:rgba(255,255,255,.1); box-shadow:0 10px 28px rgba(0,0,0,.3); }
.auth-wrap .input, .auth-wrap .textarea {
  background:#fafaff; backdrop-filter:none; -webkit-backdrop-filter:none;
  border:1px solid rgba(124,92,240,.16); box-shadow:none;
}
[data-theme="dark"] .auth-wrap .input, [data-theme="dark"] .auth-wrap .textarea { background:rgba(255,255,255,.07); border-color:rgba(255,255,255,.12); }
.auth-wrap .input:focus, .auth-wrap .textarea:focus {
  background:#ffffff; border-color:#6d5ce7;
  box-shadow:0 0 0 3px rgba(109,92,231,.14);
}
[data-theme="dark"] .auth-wrap .input:focus { background:rgba(255,255,255,.09); box-shadow:0 0 0 3px rgba(139,122,246,.22); }
.auth-wrap .seg { background:#f1f0fb; backdrop-filter:none; -webkit-backdrop-filter:none; border:1px solid transparent; box-shadow:none; }
[data-theme="dark"] .auth-wrap .seg { background:rgba(255,255,255,.06); }
.auth-wrap .seg button.on { background:#ffffff; color:#1a1f36; box-shadow:none; }
[data-theme="dark"] .auth-wrap .seg button.on { background:rgba(255,255,255,.14); color:#fff; box-shadow:none; }





/* 4) 品牌字标：去渐变与光晕，改扁平纯色（欢迎/登录） */
.welcome-page .auth-logo-icon img, .auth-wrap .auth-logo-icon img { filter:none; }
.welcome-page .auth-logo, .auth-wrap .auth-logo {
  background:none; -webkit-background-clip:initial; background-clip:initial;
  -webkit-text-fill-color:initial; color:#6d5ce7; filter:none; text-shadow:none;
}
[data-theme="dark"] .welcome-page .auth-logo, [data-theme="dark"] .auth-wrap .auth-logo { color:#c4b2ff; }

/* ========== v1.4.3 录入表单增强：仅作用于「录入」作用域，其它页面/控件零影响 ==========
   作用域 = 演唱会新增/编辑(form[data-form=concert])、票根录入(form[data-form=ticket])、
   弹窗内表单(.modal form：记一笔/设置预算/添加交通住宿同行时间线/添加物品/现场记录/编辑资料)、
   社区发帖(.fx-form)。 */

/* ---- 标签：对比提升 + 主题色小竖条 ---- */
form[data-form="concert"] .field label,
form[data-form="ticket"] .field label,
.modal form .field label,
.fx-form .field label,
.fx-form .field-head label { color:#5a6178; letter-spacing:.2px; }
form[data-form="concert"] .field label::before,
form[data-form="ticket"] .field label::before,
.modal form .field label::before,
.fx-form .field label::before,
.fx-form .field-head label::before {
  content:''; display:inline-block; width:3px; height:13px; border-radius:2px; margin-right:7px; vertical-align:-2px;
  background:linear-gradient(180deg,#6d5ce7,#a06ff0);
}

/* ---- 输入框/文本域/下拉：白底 + 细紫描边 + 大圆角 + 明确聚焦 ---- */
form[data-form="concert"] .input,
form[data-form="ticket"] .input,
.modal form .input,
.fx-form .input,
form[data-form="concert"] .textarea,
form[data-form="ticket"] .textarea,
.modal form .textarea,
.fx-form textarea.input {
  background:#fff; border:1px solid rgba(124,92,240,.18); border-radius:14px;
   color:var(--text);
  font-size:16px; 
  
}
form[data-form="concert"] .input,
form[data-form="ticket"] .input,
.modal form .input,
.fx-form .input { height:auto; padding:9px 12px; line-height:20px; }
form[data-form="concert"] .textarea,
form[data-form="ticket"] .textarea,
.modal form .textarea,
.fx-form textarea.input { min-height:84px; height:auto; padding:10px 12px; line-height:1.6; }
/* 日期/时间选择器自带 22px 内容盒（普通输入框是 20px）→ 上下留白各减 1px，
   保证同一行里「日期 / 城市」「开场时间 / 座位区域」四个框完全等高 */
form[data-form="concert"] input[type="date"], form[data-form="concert"] input[type="time"],
form[data-form="ticket"] input[type="date"], form[data-form="ticket"] input[type="time"],
.modal form input[type="date"], .modal form input[type="time"],
.fx-form input[type="date"], .fx-form input[type="time"] { padding-top:8px; padding-bottom:8px; }
form[data-form="concert"] .input:focus,
form[data-form="ticket"] .input:focus,
.modal form .input:focus,
.fx-form .input:focus,
form[data-form="concert"] .textarea:focus,
form[data-form="ticket"] .textarea:focus,
.modal form .textarea:focus,
.fx-form textarea.input:focus {
   background:#fff; 
  
}
form[data-form="concert"] .input::placeholder,
form[data-form="ticket"] .input::placeholder,
.modal form .input::placeholder,
.fx-form .input::placeholder,
form[data-form="concert"] .textarea::placeholder,
form[data-form="ticket"] .textarea::placeholder,
.modal form .textarea::placeholder,
.fx-form textarea.input::placeholder { color:#6b7390; font-size:14px; }

/* ===== v1.5.34 录入表单「再紧一点」（产品口径：所有编辑页布局紧凑一些）=====
   （详注见 git 历史 · W-023 样式表瘦身） */
form[data-form="concert"] .field,
form[data-form="ticket"] .field,
.modal form .field,
.fx-form .field { margin-bottom: 7px; }
form[data-form="concert"] .field label,
form[data-form="ticket"] .field label,
.modal form .field label,
.fx-form .field label { margin-bottom: 2px; font-size: 11px; }

/* 下拉：去掉原生箭头，换主题色小箭头 */
.modal form select.input,
.fx-form select.input {
  appearance:none; -webkit-appearance:none; padding-right:36px; color:var(--text);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%236d5ce7' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 13px center; background-size:16px 16px;
}

/* ---- 图片选择：虚线上传区 + 品牌化“选择文件”按钮 ---- */
form[data-form="concert"] input[type="file"],
form[data-form="ticket"] input[type="file"],
.modal form input[type="file"],
.fx-form input[type="file"] {
      
    
     box-shadow:none;
}
form[data-form="concert"] input[type="file"]::file-selector-button,
form[data-form="ticket"] input[type="file"]::file-selector-button,
.modal form input[type="file"]::file-selector-button,
.fx-form input[type="file"]::file-selector-button {
  background:#6d5ce7; color:#fff; border:none; border-radius:12px; padding:9px 16px;
  font-family:inherit; font-size:12px; font-weight:600; margin-right:12px; cursor:pointer;
  box-shadow:0 4px 10px rgba(109,92,231,.22);
}


/* ---- 选择控件：实际支出/预算 二选一 ---- */
.modal form .exp-opt { background:#fff; border:1px solid rgba(124,92,240,.22); color:#6b7390; border-radius:14px; padding:10px 6px; }
.modal form .exp-opt.on { background:#6d5ce7; border-color:#6d5ce7; color:#fff; box-shadow:0 6px 14px rgba(109,92,231,.26); }

/* ---- 票面样式 chip（仅票根录入页） ---- */
form[data-form="ticket"] .chip.tkopt { background:#fff; border:1.5px solid rgba(124,92,240,.2); color:#6b7390;  border-radius:12px;  box-shadow:none; }
form[data-form="ticket"] .chip.tkopt.active {    box-shadow:0 5px 12px rgba(109,92,231,.26); }
form[data-form="ticket"] .chip.tkopt.active .sw { box-shadow:inset 0 0 0 1px rgba(255,255,255,.4); }

/* ---- 社区发帖分类 chip ---- */
.fx-form .cat-option { background:#fff; border:1.5px solid rgba(124,92,240,.2); color:#6b7390; }
.fx-form .cat-option.on {    box-shadow:0 5px 12px rgba(109,92,231,.26); }

/* 复选/单选标记用主题色 */
.modal form input[type="checkbox"],
.modal form input[type="radio"],
form[data-form="ticket"] input[type="checkbox"],
.fx-form input[type="checkbox"] { accent-color:#6d5ce7; }

/* ---- 暗色主题对应 ---- */
[data-theme="dark"] form[data-form="concert"] .field label,
[data-theme="dark"] form[data-form="ticket"] .field label,
[data-theme="dark"] .modal form .field label,
[data-theme="dark"] .fx-form .field label,
[data-theme="dark"] .fx-form .field-head label { color:#6b85ff; }
[data-theme="dark"] form[data-form="concert"] .input,
[data-theme="dark"] form[data-form="ticket"] .input,
[data-theme="dark"] .modal form .input,
[data-theme="dark"] .fx-form .input,
[data-theme="dark"] form[data-form="concert"] .textarea,
[data-theme="dark"] form[data-form="ticket"] .textarea,
[data-theme="dark"] .modal form .textarea,
[data-theme="dark"] .fx-form textarea.input {
  background:rgba(255,255,255,.07); border-color:rgba(139,122,246,.4); color:#eef1ff; box-shadow:none;
}
[data-theme="dark"] form[data-form="concert"] .input:focus,
[data-theme="dark"] form[data-form="ticket"] .input:focus,
[data-theme="dark"] .modal form .input:focus,
[data-theme="dark"] .fx-form .input:focus,
[data-theme="dark"] form[data-form="concert"] .textarea:focus,
[data-theme="dark"] form[data-form="ticket"] .textarea:focus,
[data-theme="dark"] .modal form .textarea:focus,
[data-theme="dark"] .fx-form textarea.input:focus {
  background:rgba(255,255,255,.1); border-color:#8b7cf0;
  box-shadow:0 0 0 3px rgba(139,122,246,.26);
}
[data-theme="dark"] form[data-form="concert"] .input::placeholder,
[data-theme="dark"] form[data-form="ticket"] .input::placeholder,
[data-theme="dark"] .modal form .input::placeholder,
[data-theme="dark"] .fx-form .input::placeholder,
[data-theme="dark"] form[data-form="concert"] .textarea::placeholder,
[data-theme="dark"] form[data-form="ticket"] .textarea::placeholder,
[data-theme="dark"] .modal form .textarea::placeholder,
[data-theme="dark"] .fx-form textarea.input::placeholder { color:#a8b0c8; }
[data-theme="dark"] form[data-form="concert"] input[type="file"],
[data-theme="dark"] form[data-form="ticket"] input[type="file"],
[data-theme="dark"] .modal form input[type="file"],
[data-theme="dark"] .fx-form input[type="file"] { background:rgba(139,122,246,.08); border-color:rgba(139,122,246,.5); color:#a8b0c8; }
[data-theme="dark"] .modal form .exp-opt { background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.16); color:#a8b0c8; }
[data-theme="dark"] .modal form .exp-opt.on { background:#7c5cf0; border-color:#7c5cf0; }
[data-theme="dark"] form[data-form="ticket"] .chip.tkopt,
[data-theme="dark"] .fx-form .cat-option { background:rgba(255,255,255,.07); border-color:rgba(255,255,255,.18); color:#6b85ff; }
[data-theme="dark"] form[data-form="ticket"] .chip.tkopt.active,
[data-theme="dark"] .fx-form .cat-option.on { background:#7c5cf0; border-color:#7c5cf0; color:#fff; }

/* ====== v1.4.3 微调 2：字段标签装饰只作用于标签本体、描边/上传/文本域细节 ====== */
/* 标签颜色与竖条改为「直系标签」，排除 chip/复选框类 label */
form[data-form="concert"] .field > label,
form[data-form="ticket"] .field > label,
.modal form .field > label,
.fx-form .field > label { color:#5a6178; letter-spacing:.2px; }
form[data-form="concert"] .field > label::before,
form[data-form="ticket"] .field > label::before,
.modal form .field > label::before,
.fx-form .field > label::before {
  content:''; display:inline-block; width:3px; height:13px; border-radius:2px; margin-right:7px; vertical-align:-2px;
  background:linear-gradient(180deg,#6d5ce7,#a06ff0);
}
.modal form label.exp-opt::before,
.fx-form .cat-select label::before { content:none !important; }

/* 静止描边更清晰 */

form[data-form="concert"] .input:focus,
form[data-form="ticket"] .input:focus,
.modal form .input:focus,
.fx-form .input:focus,
form[data-form="concert"] .textarea:focus,
form[data-form="ticket"] .textarea:focus,
.modal form .textarea:focus,
.fx-form textarea.input:focus {
  outline:none;
  border-color:#6d5ce7; box-shadow:0 0 0 3px rgba(109,92,231,.20), 0 2px 10px rgba(31,38,135,.07);
}

/* 上传区：虚线与底色更精致 */
form[data-form="concert"] input[type="file"],
form[data-form="ticket"] input[type="file"],
.modal form input[type="file"],
.fx-form input[type="file"] {
  display:flex;
  align-items:center;
  height:auto;
  padding:6px 10px;
  border:1.5px dashed rgba(124,92,240,.34);
  border-radius:14px;
  cursor:pointer;
  min-height:54px; border-width:2px; border-color:rgba(109,92,231,.38);
  background:linear-gradient(180deg, rgba(124,92,240,.07), rgba(124,92,240,.03));
  color:#6b7390; font-size:12px;
}
form[data-form="concert"] input[type="file"]:hover,
form[data-form="ticket"] input[type="file"]:hover,
.modal form input[type="file"]:hover,
.fx-form input[type="file"]:hover { border-color:rgba(109,92,231,.62); background:rgba(124,92,240,.08); }

/* 发帖文本域：隐藏右下角调节柄，保持干净 */
.fx-form textarea::-webkit-resizer { display:none; }
.fx-form textarea { scrollbar-width:thin; }

/* v1.4.3 微调 3：静止描边再清晰一档（不刺眼） */
form[data-form="concert"] .input,
form[data-form="ticket"] .input,
.modal form .input,
.fx-form .input,
form[data-form="concert"] .textarea,
form[data-form="ticket"] .textarea,
.modal form .textarea,
.fx-form textarea.input {
  caret-color:#6d5ce7;
  transition:border-color .18s ease, box-shadow .18s ease, background .18s ease;
  box-shadow:0 1px 2px rgba(31,38,135,.04); border-color:rgba(109,92,231,.34); }

/* ========== v1.4.4 综合收口：行程/票根样式扩展/社区/欢迎/纯净快捷钮 ========== */

/* ---- 4) 「我的行程」统计：场次数字突出 ---- */
.trip-sum { gap:7px; padding:2px 2px 10px; align-items:baseline; }
.tsum-n { font-size:22px; line-height:1; font-weight:700; letter-spacing:-.3px;
  background:linear-gradient(120deg,#6d5ce7 10%,#8b5cf6 55%,#ec4899 105%);
  -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;
  filter:drop-shadow(0 2px 6px rgba(109,92,231,.18));
}
.tsum-n em { font-style:normal; font-size:14px; margin-left:2px; -webkit-text-fill-color:#6d5ce7; letter-spacing:0; }
.tsum-t { color:#6b7390; font-size:12px; font-weight:600; }

/* ---- 2) 行程卡片：已赴星海与即将奔赴同语言（同紫蓝家族、仅更沉稳） ---- */
.concert-card.past {
  background:linear-gradient(150deg,#414cbd 0%,#5140be 46%,#6d3f97 100%);
  box-shadow:0 12px 26px rgba(58,50,150,.22), inset 0 1px 0 rgba(255,255,255,.22);
}
[data-theme="dark"] .concert-card.past { background:linear-gradient(150deg,#39429f 0%,#45379f 48%,#5c3380 100%); }


.concert-card.past .cc-name { color:#fff; }

/* ---- 7) 行程卡操作按钮：白底胶囊 + 紫色图标格（不再是塑料玻璃） ---- */
.concert-card .cc-next {
  display:inline-flex; align-items:center; gap:0;
  min-height:32px; margin-top:9px; padding:3px 14px 3px 4px; border-radius:17px;
   
   font-size:11px; font-weight:700; letter-spacing:.3px;
  
}
.concert-card .cc-next svg {
     box-sizing:border-box;
  border-radius:11px; margin-right:7px; 
   
}
.concert-card .cc-next:hover { transform:translateY(-.6px) !important; }
.concert-card .cc-next:active { transform:scale(.96); }



/* ---- 9) 社区：顶栏去背景色条（只留胶囊本身），卡片背景不外露 ---- */
.community-header { background:transparent !important; backdrop-filter:none !important; -webkit-backdrop-filter:none !important; }
[data-theme="dark"] .community-header { background:transparent !important; }
.community-header .cat-tabs { padding-top:4px; }
.cat-tab { background:rgba(255,255,255,.75); }
.cat-tab.on { box-shadow:0 4px 12px rgba(109,92,231,.26); }
[data-theme="dark"] .cat-tab { background:rgba(255,255,255,.06); }
[data-theme="dark"] .cat-tab.on { box-shadow:0 4px 12px rgba(0,0,0,.35); }
.xh-feed { background:transparent !important; }
.xh-feed .xh-card,
.xh-card { overflow:hidden !important; background:#fff !important; }
[data-theme="dark"] .xh-card { background:#1a1d30 !important; }

/* ---- 1) 纯净截图快捷钮（hero / 票根） ---- */
.hc-clean, .t-clean {
  display:inline-flex; align-items:center; justify-content:center; padding:0;
  border-radius:999px; cursor:pointer; color:#fff;
  background:rgba(14,16,44,.24); border:1px solid rgba(255,255,255,.45);
  backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
  transition:opacity .3s ease, background .2s ease, transform .15s ease;
}
.hc-clean { width:27px; height:27px; }
.hc-clean svg, .t-clean svg { width:13px !important; height:13px !important; stroke:#fff; }
.hc-clean.on, .hc-clean:hover, .t-clean:hover { background:#6d5ce7; border-color:transparent; }
.hc-clean:active, .t-clean:active { transform:scale(.9); }
.t-clean { position:absolute; right:8px; top:8px; width:25px; height:25px; z-index:3; }
.ticket.has-clean .t-top { padding-right:40px; }
body.clean-armed .hc-clean, body.clean-armed .t-clean { opacity:0; pointer-events:none; }
body.clean-shot .ticket.has-clean .t-flag { display:none !important; }
[data-theme="dark"] .hc-clean { background:rgba(255,255,255,.1); border-color:rgba(255,255,255,.3); }
[data-theme="dark"] .hc-clean.on { background:#6d5ce7; }

/* ---- 5) 票根新样式：星河流光 / 落日霓虹 ---- */
.ticket.st-aurora { background:linear-gradient(165deg,#eef1ff,#f6f2ff 60%,#e8ecff); border-color:#dcdfff; box-shadow:0 10px 26px rgba(80,70,220,.16); }
.ticket.st-aurora .t-side { background:
  radial-gradient(circle at 82% 12%, rgba(255,255,255,.55), transparent 44%),
  radial-gradient(circle at 12% 88%, rgba(255,255,255,.28), transparent 48%),
  linear-gradient(160deg,#4a6cf7 0%,#6d5ce7 46%,#2e9bff 118%); color:#fff; }
.ticket.st-aurora .t-side::after { background:
  radial-gradient(1.5px 1.5px at 22% 30%, rgba(255,255,255,.95), transparent),
  radial-gradient(2px 2px at 74% 22%, rgba(255,255,255,.9), transparent),
  radial-gradient(1.5px 1.5px at 48% 62%, rgba(255,255,255,.8), transparent),
  repeating-linear-gradient(115deg, rgba(255,255,255,.1) 0 10px, transparent 10px 24px); }
.ticket.st-aurora .t-name { color:#4a6cf7; }
.ticket.st-aurora .t-where, .ticket.st-aurora .t-msg { color:#6b7390; }
.ticket.st-aurora .t-cell .k { color:#6b7390; }
.ticket.st-aurora .t-cell b { color:#4a6cf7; }
.ticket.st-aurora .t-cols { border-top-color:rgba(124,92,240,.28); }
.ticket.st-aurora .t-flag { color:#6d5ce7; background:rgba(124,92,240,.1); }
.ticket.st-aurora .t-flag.done { color:#dc3545; background:rgba(226,80,74,.1); }

.ticket.st-rose { background:linear-gradient(165deg,#fff7f8,#fff1f6 55%,#fff6ee); border-color:#ffd9dc; box-shadow:0 10px 26px rgba(240,80,140,.15); }
.ticket.st-rose .t-side { background:
  radial-gradient(circle at 84% 12%, rgba(255,255,255,.55), transparent 44%),
  radial-gradient(circle at 12% 90%, rgba(255,170,90,.5), transparent 52%),
  linear-gradient(160deg,#ff5e7e 0%,#f253b0 45%,#ff9f5a 120%); color:#fff; }
.ticket.st-rose .t-side::after { background:
  radial-gradient(1.5px 1.5px at 70% 24%, rgba(255,255,255,.9), transparent),
  radial-gradient(2px 2px at 26% 62%, rgba(255,255,255,.85), transparent),
  repeating-linear-gradient(115deg, rgba(255,255,255,.12) 0 10px, transparent 10px 22px); }
.ticket.st-rose .t-name { color:#d6457f; }
.ticket.st-rose .t-where, .ticket.st-rose .t-msg { color:#6b7390; }
.ticket.st-rose .t-cell .k { color:#6b7390; }
.ticket.st-rose .t-cell b { color:#d6457f; }
.ticket.st-rose .t-cols { border-top-color:rgba(226,80,110,.26); }
.ticket.st-rose .t-flag { color:#dc3545; background:rgba(240,80,140,.1); }
.ticket.st-rose .t-flag.done { color:#dc3545; background:rgba(217,72,72,.1); }
.ticket.st-rose .t-cell.price b { color:#dc3545; }
.ticket.st-aurora .t-cell.price b { color:#dc3545; }

/* ---- 5.1) 票根自定义照片：封面主视觉(全样式) + 电子票小卡快照 ---- */
.ticket.has-cover .t-side { color:#fff; }
.ticket.has-cover .t-side-head,
.ticket.has-cover .t-side-date { color:#fff; text-shadow:0 1px 5px rgba(8,10,28,.45); }
.ticket.has-cover .t-side-mark { color:#fff; text-shadow:0 2px 12px rgba(8,10,28,.45); }
.ticket.has-cover .t-side-shade { background:linear-gradient(180deg, rgba(10,12,32,.05) 0%, rgba(10,12,32,.22) 45%, rgba(10,12,32,.52) 100%); }
.ticket.has-cover .t-side::after { opacity:.26; }
.t-edit { align-items:center; gap:10px; }
.t-photo {
  align-self:flex-end; flex:none; position:relative; z-index:1;
  width:58px; height:42px; padding:3px;
  border-radius:7px; background:#fff;
  box-shadow:0 3px 10px rgba(20,24,60,.2);
  transform:rotate(-1.6deg);
}
.t-photo::after { content:''; position:absolute; inset:0; border-radius:7px; border:1px solid rgba(20,24,60,.06); pointer-events:none; }
.t-photo img { display:block; width:100%; height:100%; object-fit:cover; border-radius:4px; }
[data-theme="dark"] .t-photo { background:rgba(36,40,68,.98); box-shadow:0 3px 12px rgba(0,0,0,.5); }
body.clean-shot .ticket .t-photo { display:none !important; }

/* ---- 6) 欢迎页功能点：轻特效（保持白卡扁平，只加氛围） ---- */
.welcome-points span { position:relative; overflow:hidden; animation:fxPointIn .55s cubic-bezier(.2,.8,.2,1) both; }
.welcome-points span:nth-child(1){ animation-delay:.06s; }
.welcome-points span:nth-child(2){ animation-delay:.14s; }
.welcome-points span:nth-child(3){ animation-delay:.22s; }
.welcome-points span:nth-child(4){ animation-delay:.30s; }
.welcome-points span::after {
  content:''; position:absolute; inset:0; pointer-events:none;
  background:linear-gradient(115deg, transparent 34%, rgba(124,92,231,.12) 47%, rgba(244,114,182,.10) 54%, transparent 68%);
  transform:translateX(-130%); animation:fxSheen 4.6s ease-in-out 1.4s infinite;
}
.welcome-points span svg { position:relative; z-index:1; animation:fxIconPulse 3.4s ease-in-out infinite; }
.welcome-points span:hover { transform:translateY(-2px); border-color:rgba(109,92,231,.36); box-shadow:0 10px 24px rgba(90,80,200,.15); }
.welcome-points span:active { transform:scale(.97); }
@keyframes fxPointIn { from { opacity:0; transform:translateY(10px) scale(.96); } to { opacity:1; transform:none; } }
@keyframes fxSheen { 0%,62% { transform:translateX(-130%); } 84%,100% { transform:translateX(130%); } }
@keyframes fxIconPulse { 0%,100% { transform:scale(1); } 50% { transform:scale(1.18); } }
[data-theme="dark"] .welcome-points span::after { background:linear-gradient(115deg, transparent 34%, rgba(183,167,255,.12) 47%, rgba(244,150,200,.1) 54%, transparent 68%); }





.mt-event-l { padding-right:64px; }
.mt-seal {
  position:absolute; top:-26px; right:6px; width:60px; height:60px; margin:0;
  display:flex; align-items:center; justify-content:center; overflow:hidden;
  font-size:14px; font-weight:900; letter-spacing:.4px; line-height:1.18;
  color:#4c3d6b;
  border-radius:50%;
  background:
    radial-gradient(circle at 32% 25%, rgba(255,255,255,.92) 0%, rgba(255,255,255,.5) 28%, rgba(255,255,255,0) 54%),
    conic-gradient(from 200deg, #d0a8ef, #9fc0ff, #a5e6cd, #ffe09a, #ffaec6, #d5a8f2, #d0a8ef);
  border:3px solid #fff;
  box-shadow:
    inset 0 1px 1px rgba(255,255,255,.55),
    0 0 0 1px rgba(120,92,180,.16),
    0 1px 1px rgba(46,30,80,.16),
    0 3px 5px -1px rgba(46,30,80,.3),
    0 8px 14px -3px rgba(46,30,80,.32),
    0 14px 26px -8px rgba(46,30,80,.3);
  transform:rotate(-9deg);
  text-shadow:0 1px 0 rgba(255,255,255,.55);
}
.mt-seal.long { font-size:12px; letter-spacing:.2px; }

.mt-seal::after {
  content:''; position:absolute; inset:-24% -85%; pointer-events:none;
  background:linear-gradient(115deg, transparent 28%, rgba(255,255,255,.98) 40%, rgba(255,255,255,.6) 47%, rgba(255,255,255,1) 54%, rgba(255,255,255,.25) 61%, transparent 74%);
  box-shadow:inset 0 0 14px rgba(255,255,255,.4);
  transform:translateX(-95%) skewX(-15deg);
  animation:mtHolo 3.4s ease-in-out infinite;
}

.mt-seal-ring { position:absolute; inset:0; width:100%; height:100%; pointer-events:none; }
.mt-seal-rtxt {
  font-size:8px; font-weight:800; letter-spacing:2.2px;
  fill:rgba(255,255,255,.96);
  font-family:Georgia,'Times New Roman','Songti SC',serif;
  filter:drop-shadow(0 0 1px rgba(86,64,138,.45));
}
.mt-seal-txt { position:relative; font-size:14px; }

/* ========== 计划一览（行程 → 演唱会详情 → 筹备中心）：参考图高保真版 ========== */
.plan-page { background: linear-gradient(180deg, #f4f6fa 0%, #eef0f7 100%); }
[data-theme="dark"] .plan-page { background: linear-gradient(180deg, #0d1224 0%, #0a0e1e 100%); }
.plan-head { margin: 6px 2px 2px; text-align: center; }
.plan-head h2 { font-size: 18px; font-weight: 700; letter-spacing: .2px; color: #1a1f36; }
.plan-head p { margin-top: 6px; font-size: 12px; color: #1a1f36; line-height: 1.6; display: flex; justify-content: center; flex-wrap: wrap; gap: 6px; }
.plan-sep { font-style: normal; color: #6b7390; }
[data-theme="dark"] .plan-head h2 { color: #eef1ff; }
[data-theme="dark"] .plan-head p { color: #a8b0c8; }
.plan-src { margin: 8px 4px 16px; text-align: center; font-size: 11px; color: #5a6178; line-height: 1.6; }
.plan-src b { color: #6d5ce7; font-weight: 700; }
[data-theme="dark"] .plan-src { color: #a8b0c8; }
[data-theme="dark"] .plan-src b { color: #c4b2ff; }
/* v1.5.35：计划一览跨多天时，每天的日期小标题（页面与长图同构） */
.plan-day { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin: 16px 4px 9px; }
.plan-day b { font-size: 12px; font-weight: 700; color: #1a1f36; letter-spacing: .2px; display: inline-flex; align-items: center; gap: 6px; }
.plan-day b::before { content: ''; display: inline-block; width: 3px; height: 13px; border-radius: 2px; background: linear-gradient(180deg, #6d5ce7, #a06ff0); }
.plan-day span { font-size: 11px; color: #5a6178; }
[data-theme="dark"] .plan-day b { color: #eef1ff; }
[data-theme="dark"] .plan-day span { color: #a8b0c8; }
.plan-list { padding: 2px 0 4px; }
.plan-row { position: relative; padding-left: 42px; margin-bottom: 14px; }
.plan-rail { position: absolute; left: 0; top: 0; bottom: -12px; width: 32px; }
.plan-rail::before { content: ''; position: absolute; left: 15px; top: 25px; bottom: 0; width: 2px; border-radius: 2px; background: var(--rc, rgba(205, 210, 225, .9)); }
.plan-row:last-child .plan-rail::before { display: none; }
[data-theme="dark"] .plan-rail::before { background: var(--rc, rgba(90, 100, 140, .5)); }
.plan-num { position: absolute; top: 3px; left: 4px; width: 26px; height: 26px; border-radius: 50%; color: #fff; font-size: 12px; font-weight: 700; font-style: normal; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 0 3px rgba(255,255,255,.92), 0 2px 7px rgba(31,38,135,.2); }
[data-theme="dark"] .plan-num { box-shadow: 0 0 0 3px rgba(13,18,36,.9), 0 2px 7px rgba(0,0,0,.4); }
.plan-card { position: relative; display: flex; gap: 12px; min-width: 0; background: #fff; border: 1px solid rgba(226,229,240,.9); border-radius: 16px; padding: 12px 14px; box-shadow: 0 3px 12px rgba(31,38,135,.05); overflow: hidden; }
.plan-card::before { content: ''; position: absolute; inset: 0; border-radius: inherit; background: var(--ct, rgba(148,163,184,.05)); pointer-events: none; }
.plan-card > * { position: relative; }
[data-theme="dark"] .plan-card { background: #171d31; border-color: rgba(255,255,255,.07); box-shadow: 0 4px 16px rgba(0,0,0,.3); }
.plan-main { flex: 1; min-width: 0; }
.plan-time { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; color: var(--c, #3b82f6); letter-spacing: .3px; }
.plan-time i { font-style: normal; color: var(--c, #3b82f6); opacity: .5; font-weight: 600; }
.plan-time-empty { color: #5a6178; }
[data-theme="dark"] .plan-time { color: var(--c, #7aa2ff); }
[data-theme="dark"] .plan-time i { color: var(--c, #7aa2ff); }
.plan-t { margin-top: 2px; font-size: 16px; font-weight: 700; line-height: 1.35; color: #1a1f36; overflow-wrap: break-word; }
[data-theme="dark"] .plan-t { color: #eef1ff; }
.plan-d { margin-top: 4px; font-size: 12px; line-height: 1.5; color: #1a1f36; overflow-wrap: break-word; }
[data-theme="dark"] .plan-d { color: #a8b0c8; }
.plan-pill { flex: none; align-self: flex-start; margin-top: 2px; padding: 4px 11px; border-radius: 999px; font-size: 11px; font-weight: 700; white-space: nowrap; color: var(--c, #3b82f6); background: var(--pt, rgba(148,163,184,.14)); border: 0; }
[data-theme="dark"] .plan-pill { background: var(--pt, rgba(255,255,255,.07)); }
.plan-card.is-core { border-color: rgba(16,185,129,.55); box-shadow: 0 5px 16px rgba(16,185,129,.14); }
.plan-card.is-core::before { background: var(--ct, rgba(16,185,129,.12)); }
.plan-card.is-core .plan-t { color: #1a1f36; }
[data-theme="dark"] .plan-card.is-core .plan-t { color: #eef1ff; }
.plan-hl { margin: 18px 2px 4px; background: linear-gradient(160deg, #efeefb 0%, #f4ecf8 100%); border: 1px solid rgba(139,92,246,.14); border-radius: 16px; padding: 13px 15px; }
[data-theme="dark"] .plan-hl { background: rgba(139,92,246,.12); border-color: rgba(139,92,246,.25); }
.plan-hl h3 { font-size: 14px; font-weight: 700; color: #5b4bd6; display: flex; align-items: center; gap: 6px; }
.plan-hl h3 svg { color: #6d5ce7; }
[data-theme="dark"] .plan-hl h3 { color: #c4b2ff; }
.plan-hl ol { list-style: none; margin: 6px 0 0; padding: 0; }
.plan-hl li { display: flex; gap: 7px; margin-top: 7px; font-size: 12px; line-height: 1.6; color: #5a6178; }
[data-theme="dark"] .plan-hl li { color: #c4b2ff; }
.plan-hl li b { flex: none; color: #6d5ce7; font-weight: 700; }
/* v1.6.84（老板图 2）：自行计划页那排 8 颗胶囊**整块下线** ——
   根因是没有 flex-wrap，被塞进一行后互相压字、边缘被裁；入口改由「卡片里那 4 行 + 底部工具栏」承担，
   这条选择器在源码与样式表里出现 0 次（冒烟钉着，见 styles-v200.css 尾部 v1.6.84 区块）。 */

/* ===== v1.4.8 触摸边界锁定：主滚动区禁止橡皮筋拖拽（微信 web-view 社区页内容被整块拖走） ===== */
html, body { overscroll-behavior-y: none; }


/* ===== v1.4.9 横向溢出锁：修复微信 web-view 左右拖动内容乱跑（community-header 全宽出血多出 4px 致 #app 可横滑） ===== */
#app {
  overscroll-behavior-y: contain; overflow-x: hidden; }

/* ===== v1.4.11 社区卡片长按不再整卡半透明：按住封面=微信 web-view 原生文本选择高亮扫过整卡；整卡禁原生选择/拖拽，仅保留点击跳转 ===== */
.xh-cover img { pointer-events: none; -webkit-touch-callout: none; -webkit-user-drag: none; user-select: none; -webkit-user-select: none; }
.xh-feed, .xh-feed * { -webkit-user-select: none !important; user-select: none !important; -webkit-touch-callout: none !important; -webkit-user-drag: none !important; }

/* ===== v1.4.7 行程·筹备中心「计划一览」发布（2026-09-08）：全自动联动时间轴 .plan-* ===== */

/* ===== v1.4.18 新用户指引支持左右滑动翻页：补一条滑动提示 ===== */
.onb-hint { text-align: center; font-size: 12px; color: var(--text-3, #9aa0ae); margin: -10px 0 14px; letter-spacing: .5px; }
[data-theme="dark"] .onb-hint { color: #a8b0c8; }
/* UX-0926-03（2026-09-26）· 图3：引导页（新用户指引「规划每一次奔赴 / 下一步」）的长条按钮。
   原来吃的是基础 .btn（styles.css:282 的 padding:13px 22px + 小圆角），实测只有 36px 高 / 圆角 12px，
   比授权页和登录页的 54px 胶囊矮一档 —— 产品截图圈的就是这颗。这里对齐到 主 54 / 胶囊。
   只作用于 .onb-wrap（全仓只有 app.js 的 onboardingView 用它），其它页面零波及。*/
.onb-wrap .btn { height: 54px; min-height: 54px; border-radius: 999px; }

/* ===== v1.4.21 登录页：微信一键登录推荐引导 + 手机号占坑 ===== */
.wx-rec-card { position: relative; }
.wx-rec-head { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; }
.wx-rec-badge {
  font-size: 11px; font-weight: 700; color: #fff; letter-spacing: 1px;
  background: linear-gradient(135deg, #5B6CFF 0%, #7C5CFF 100%);
  border-radius: 999px; padding: 2px 9px;
}
.wx-rec-title { font-size: 16px; font-weight: 700; color: var(--text); }
.wx-rec-list { display: flex; flex-direction: column; gap: 8px; margin-top: 14px; }
.wx-rec-list span { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text-2); }
.wx-rec-list svg { flex: 0 0 auto; color: var(--primary); }
.wx-rec-note { margin-top: 10px; font-size: 11px; line-height: 1.5; color: var(--text-3); }
.phone-soon { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.phone-soon .ps-title { font-size: 14px; font-weight: 600; color: var(--text-2); }
.phone-soon .ps-tag {
  flex: 0 0 auto; font-size: 11px; color: var(--text-3);
  border: 1px solid currentColor; border-radius: 999px; padding: 1px 9px;
}

/* ===== v1.4.26 首次同意弹窗 / 用户协议·隐私政策页 ===== */
/* v1.5.3：从「整屏深色模糊遮罩 + 居中卡片」改成「浅蒙层 + 底部抽屉」。
   冷启动不再弹（见 app.js 的 boot），只在真正要拿头像昵称时（点微信一键登录、页面上又没有勾选框）才从底部滑出。
   蒙层只压暗、不模糊 —— backdrop-filter 要额外合成一整屏，低端机上正是「闪一下」的来源。 */
.consent-mask{position:fixed;inset:0;z-index:9500;display:flex;align-items:flex-end;justify-content:center;background:rgba(10,14,32,.34);animation:consentFade .2s ease;}
.consent-sheet{width:100%;max-width:430px;border-radius:20px 20px 0 0;padding:10px 20px calc(16px + env(safe-area-inset-bottom,0px));background:var(--card-solid);box-shadow:0 -12px 34px rgba(20,24,60,.2);animation:consentUp .32s cubic-bezier(.2,.9,.3,1);}
@keyframes consentFade{from{opacity:0;}to{opacity:1;}}
@keyframes consentUp{from{transform:translateY(100%);}to{transform:none;}}
.consent-grab{width:36px;height:4px;border-radius:999px;background:var(--border);margin:2px auto 14px;}
.consent-head{display:flex;align-items:center;gap:10px;}
.consent-logo{width:30px;height:30px;flex:0 0 auto;}
.consent-logo svg{width:100%;height:100%;display:block;}
.consent-title{font-size:16px;font-weight:700;color:var(--text);}
.consent-desc{margin-top:10px;font-size:12px;line-height:1.7;color:var(--text-3);}
.consent-check{display:flex;gap:8px;align-items:flex-start;margin:14px 0 16px;font-size:12px;line-height:1.6;color:var(--text);}
/* 全局 input 关掉了原生外观，复选框需显式还原，否则看不见 */
.consent-check input[type="checkbox"]{-webkit-appearance:auto;appearance:auto;width:17px;height:17px;min-width:17px;margin-top:2px;flex:0 0 auto;border:1px solid var(--border);border-radius:4px;background:#fff;accent-color:var(--primary);}
[data-theme="dark"] .consent-check input[type="checkbox"]{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.3);}
.consent-check a{color:var(--primary);text-decoration:none;}
.consent-skip{margin-top:10px;}
.legal-links{display:flex;justify-content:center;align-items:center;gap:8px;margin-top:14px;font-size:12px;color:var(--text-3);}
/* ===== v1.4.27 登录页协议勾选（默认不勾选，须用户主动选择） ===== */
.login-consent{display:flex;gap:8px;align-items:flex-start;margin:14px 0 12px;font-size:12px;line-height:1.65;color:var(--text-2);text-align:left;}
.login-consent input[type="checkbox"]{-webkit-appearance:auto;appearance:auto;width:17px;height:17px;min-width:17px;margin-top:1px;flex:0 0 auto;border:1px solid var(--border);border-radius:4px;background:#fff;accent-color:var(--primary);}
[data-theme="dark"] .login-consent input[type="checkbox"]{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.3);}
.login-consent a{color:var(--primary);text-decoration:none;}
.login-consent.need-check{animation:loginConsentShake .5s ease;}
.login-consent.need-check span{color:#dc3545;}
@keyframes loginConsentShake{0%,100%{transform:translateX(0);}20%{transform:translateX(-4px);}40%{transform:translateX(4px);}60%{transform:translateX(-3px);}80%{transform:translateX(3px);}}
.legal-links a{color:var(--primary);text-decoration:none;}
.legal-doc{padding:18px 16px 20px;}
.legal-updated{font-size:12px;color:var(--text-3);margin-bottom:12px;}
.legal-h{font-size:14px;font-weight:700;margin:16px 0 8px;color:var(--text);}
.legal-h:first-of-type{margin-top:0;}
.legal-p{font-size:14px;line-height:1.85;color:var(--text);margin:0 0 8px;}


/* v1.4.26：页脚运营主体 / ICP 备案号（拿到备案号后自动显示） */
.pr-foot a{color:var(--primary);text-decoration:none;}
.legal-contact a{color:var(--primary);text-decoration:none;}
.legal-contact{
  margin-top:16px;
  padding-top:12px;
  border-top:1px dashed var(--border-soft);line-height:1.9;}

/* ===== v1.4.29 纪念票分享图（生成带小程序码的竖版长图） ===== */
/* v1.6.96（老板澄清）：《生成分享图》按钮**不是**要改的地方 —— 已原样还原 v1.6.94；
   本轮真正要改的是「纪念票分享图」抽屉弹窗的内容（见本文件 v1.6.96 段 .tk-share-*）。 */
.mt-share-cta{display:flex;align-items:center;justify-content:center;gap:7px;width:100%;margin:16px 0 10px;padding:15px 16px;border:none;border-radius:15px;background:linear-gradient(135deg,#7c5cff,#5b6cf7);color:#fff;font-size:14.5px;font-weight:600;letter-spacing:.3px;box-shadow:0 10px 24px rgba(124,92,255,.32);}
.mt-share-cta:active{transform:scale(.98);}
.mt-share-cta svg{width:16px !important;height:16px !important;stroke:#fff;}
[data-theme="dark"] .mt-share-cta{background:linear-gradient(135deg,#6d5ce7,#4a58e0);}
/* 分享图要能被长按保存，所以单独放开 webkit 的长按菜单限制 */
/* v1.4.40 计划一览 / 准备清单长图：预览限高，保存的仍是原图分辨率 */
.sheet-img{width:100%;max-width:360px;max-height:54vh;height:auto;object-fit:contain;display:block;margin:0 auto;border-radius:14px;box-shadow:0 12px 32px rgba(0,0,0,.2);-webkit-touch-callout:default !important;user-select:auto !important;-webkit-user-select:auto !important;}
.share-ticket-img{width:100%;max-width:340px;display:block;margin:0 auto;border-radius:14px;box-shadow:0 12px 32px rgba(0,0,0,.2);-webkit-touch-callout:default !important;user-select:auto !important;-webkit-user-select:auto !important;}

/* ============ v1.4.34 / v1.4.35 · 历史补丁合并注释（v1.9.01 注释归并；声明已随后续版本收敛出库） ============
   v1.4.35 社区列表瀑布流「卡片退回 block」—— 根因：.xh-feed 用 CSS 多列（columns: 2）做双列瀑布，
     但卡片从 styles-v130.css 起一直被设成 display: inline-block，而 inline 级盒子不参与多列断开，
     Chrome 会把它们全部塞进第一列、第二列永远空着——手机上只是右边留一条缝，电脑微信小程序窗口
     一宽就是右半边整片空白。改回 block 后：① 多卡正确分列；② 单卡 .xh-feed.single 的 margin:auto
     才生效（auto 外边距对 inline 级盒子无效，所以只有一条帖子时卡片一直贴左边、没有居中）。
   v1.4.34 社区列表头像裁圆 —— 根因：.xh-avatar 的基础样式（styles-v130.css）只给了渐变底 + 白描边，
     没有圆角，社区列表卡片里的头像一直是方形；补上圆角（配合 overflow:hidden 裁掉方图）。 */


/* ============ v1.4.33 · 社区头像 / 互动消息红点 / 清单勾选不重渲染 ============ */
/* 头像：有图用图，无图回落昵称首字（父级统一裁圆，避免方形图溢出） */
.xh-avatar {
  border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; overflow: hidden; line-height: 1; }
.xh-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.avatar-sm { overflow: hidden; }
.avatar-sm img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* 互动消息入口（社区标题右侧） */
.notif-bell { position: relative; flex: none; margin-left: auto; width: 34px; height: 34px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;  color: #5b4bd6;  }
.notif-bell:active { transform: scale(.94); }
[data-theme="dark"] .notif-bell {  color: #c4b2ff;  }
.notif-dot { position: absolute; top: -4px; right: -4px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: #ef4444; color: #fff; font-size: 11px; font-weight: 700; font-style: normal; line-height: 16px; text-align: center; box-shadow: 0 0 0 1.5px #fff; }
[data-theme="dark"] .notif-dot { box-shadow: 0 0 0 1.5px #1b1e33; }

/* 互动消息列表 */
.notif-item { display: flex; gap: 10px; padding: 12px 0; border-bottom: 1px solid var(--border-soft); }
.notif-item:last-child { border-bottom: none; }
.notif-item:active { opacity: .7; }
.notif-body { flex: 1; min-width: 0; }
.notif-line { font-size: 12px; }
.notif-post { font-size: 12px; color: var(--text-2); margin-top: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.notif-preview { font-size: 12px; color: var(--text-3); margin-top: 3px; line-height: 1.5; }
.notif-time { font-size: 11px; color: var(--text-3); margin-top: 4px; }

/* ============ v1.4.36 · 社区「无图帖」长按闪动/消失修复 ============ */
/* 现象：手机小程序里手指按住纯文字帖（渐变占位封面 .xh-ph）的卡片会闪动，甚至整卡消失，松开即恢复。
   有图帖不会（.xh-cover img 已在 v1.4.10/v1.4.11 处理过）。差异在于无图帖的封面上叠了两层
   各自会独立生成合成层的效果：① 图标 i 的 filter:drop-shadow；② 角标 .xh-cat/.xh-count 的
   backdrop-filter:blur。卡片按住时还有 :active{transform:scale(.985)}，按压瞬间会重建合成层——
   安卓微信 XWeb / iOS WKWebView 在「圆角 + overflow:hidden + 父级 transform」容器里遇到
   filter / backdrop-filter 子元素时，常见整块重绘闪烁或整卡变透明。
   处理：① 封面对指针透明（沿用 v1.4.10 给封面图 pointer-events:none 的思路：长按命中的是整张
   卡片，而不是封面里的文字节点，微信原生「长按选字」不会启动）；② 摘掉这两处 filter /
   backdrop-filter，角标改用等效的实色半透明，视觉几乎无差。 */


.xh-cat { backdrop-filter: none; -webkit-backdrop-filter: none;  }
.xh-count { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(10,12,28,.6); }

/* ============ v1.4.37 · 社区卡片按住闪动第二刀：去掉按压 transform + 封面里的多余层 ============ */
/* v1.4.36 摘掉封面的 filter / backdrop-filter 后仍会闪，说明「按下去」才是触发器——整条链路里
   按压时唯一会变的就是 .xh-card:active 的 transform:scale(.985)：卡片本身是「圆角 + overflow:hidden」，
   一 transform 就要在微信 XWeb / WKWebView 里重建合成层，并给封面里所有独立成层的东西重裁一次圆角
   （封面里的 28px SVG 图标也要重新栅格化）。而恰好在无图帖的封面上有两层多余的东西：::after 星点
   覆盖层，以及为了压在它上面被设成 z-index:1 的图标 i 与文字 span；有图帖封面只有一张 img，
   没有这些层，所以只有无图帖会闪。「两刀一起下」：
   ① 按压反馈改成阴影收紧，不再动 transform —— 手感还在，但按压时不再有层重建/重裁；
   ② 星点并进 .xh-ph 自己的 background 多层（同一张画布、零额外元素），i / span 不再需要 z-index。
   注：不再有 transform 之后，.xh-feed 的 CSS 多列（columns:2）也不会再被「多列 + transform」这个
   已知易出毛病的组合碰到，所以多列瀑布的布局保持不动。 */

/* ① 按压：阴影收紧代替缩放（不产生合成层） */


/* ② 星点并入封面背景；封面上不再有覆盖层与额外栈上下文 */
.xh-ph {
  --ph-spark:
    radial-gradient(2px 2px at 24% 18%, rgba(255,255,255,.95), transparent),
    radial-gradient(3px 3px at 70% 12%, rgba(255,255,255,.8), transparent),
    radial-gradient(2px 2px at 44% 34%, rgba(255,255,255,.7), transparent),
    radial-gradient(110% 90% at 90% 6%, rgba(255,255,255,.28), transparent 55%),
    radial-gradient(90% 80% at 0% 100%, rgba(255,200,120,.3), transparent 60%);
  background: var(--ph-spark), linear-gradient(150deg,#5b6cf5 0%,#7c5cf0 55%,#a855f7 100%);
}
.xh-ph::after { content: none; }
.xh-ph i {
  filter: none; z-index: auto; }
.xh-ph span { z-index: auto; }
.xh-ph-guide     { background: var(--ph-spark), linear-gradient(150deg,#4a6cf7 0%,#6d5ce7 55%,#9d5cff 100%); }
.xh-ph-checklist { background: var(--ph-spark), linear-gradient(150deg,#0e9f8f 0%,#14b8a6 45%,#2f7cf0 115%); }
.xh-ph-chat      { background: var(--ph-spark), linear-gradient(150deg,#f0577e 0%,#d946b8 55%,#7c5cf0 115%); }
.xh-ph-ticket {
  --ph-spark:
    radial-gradient(2px 2px at 24% 18%, rgba(255,255,255,.9), transparent),
    radial-gradient(3px 3px at 70% 12%, rgba(255,255,255,.75), transparent),
    radial-gradient(110% 90% at 90% 6%, rgba(255,255,255,.3), transparent 55%),
    radial-gradient(90% 90% at 4% 100%, rgba(255,110,150,.4), transparent 60%);
  background: var(--ph-spark), linear-gradient(150deg,#f0942e 0%,#f5b94e 45%,#ec4899 120%);
}
.xh-ph-0, .xh-ph-undefined { background: var(--ph-spark), linear-gradient(150deg,#4a6cf7,#8b5cf6 60%,#a855f7); }

/* ============ v1.4.38 · 社区卡片按住闪动第三刀：把会闪的绘制结构拆掉（2026-09-11） ============ */
/* 现象（用户手机复现）：小程序里按住社区那条纯文字帖（无图帖，标题「11」）会闪动、甚至整卡变透明，松开恢复。
   v1.4.36（摘掉封面 filter / backdrop-filter）、v1.4.37（去掉按压 transform）都没断根，说明问题不在
   某个具体属性，而在卡片的绘制结构本身。这一版从结构上拆四件事：

   ① 角标从来没有过 position —— .xh-cat / .xh-count / .xh-hot 只写了 left/top/right/bottom，
      实际一直是 position:static，靠 backdrop-filter 生成的独立合成层“浮”在封面上（巧合，不是设计）。
      v1.4.36 摘掉 backdrop-filter 后它们立刻被 absolute 的封面盖住 —— 线上角标其实已经看不见了，
      这是上一版留下的回归。现在补真正的 position:absolute + z-index，不再依赖任何滤镜/合成层。
   ② 瀑布流原来是 CSS 多列（columns:2 + break-inside:avoid）。多列容器里任何一个子元素重绘，都要
      重排整列、重裁圆角，是 WebKit / 微信 XWeb 上最容易「整块闪一下」的组合。改成显式两列
      （.xh-col，普通 flex 子项）后，卡片就是普通块级元素，重绘范围只落在自己身上。
   ③ 按压反馈不再改任何「会触发重绘」的属性：transform 与 box-shadow 在按住时与基础样式完全一致。
      按下去 = 这一块什么都没变，浏览器就没有理由重绘，也就没有可闪的东西（跳页反馈交给路由）。
   ④ 无图帖的封面渐变单独提升为稳定图层（translateZ(0)），父级重绘时不会被重新栅格化；卡片本身在
      WebKit 侧加 backface-visibility:hidden 做同样保险。
   注：不再有 CSS 多列之后，「多列 + transform」这个已知易出毛病的组合也一并消失。 */

/* ② 双列瀑布：显式两列 */
.xh-feed { display: flex; columns: auto; gap: 10px; align-items: flex-start; padding-bottom: 4px; }
.xh-col  { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column;  }
.xh-feed .xh-card {
  overflow: hidden; display: block; width: 100%; margin: 0 !important; break-inside: auto; vertical-align: baseline; }
.xh-feed.single {
  columns: 1; display: block; }
.xh-feed.single .xh-col { max-width: 300px; margin: 0 auto; }

/* ① 角标补真正的定位（此前只有 left/top，从来没有 position） */
.xh-cat, .xh-count, .xh-hot {
  position: absolute; z-index: 3; display: inline-block;
  line-height: 1.6; white-space: nowrap; border-radius: 6px;
}




/* ③ 按压不改变任何可绘制属性（与基础样式一致 = 零重绘） */
.xh-card:active { transform: none; box-shadow: 0 5px 16px rgba(15,23,42,.07); }

/* ④ 封面渐变与卡片保持稳定栅格化 */
.xh-ph {
  pointer-events: none; transform: translateZ(0); }

/* ============ v1.4.39 · 计划一览：可编辑 + 一键导入 + 注意事项（2026-09-12） ============ */
/* 环节行可点开编辑：只加指针与轻微按压反馈，不改尺寸（避免影响已定稿的排版） */
.plan-row[data-act] { cursor: pointer; }
.plan-row[data-act] .plan-card { transition: transform .12s ease; }
.plan-row[data-act]:active .plan-card { transform: scale(.994); }

/* 注意事项块：沿用「本次新增游玩亮点」的卡片语言，配色走琥珀色警示感 */
.plan-notes { margin: 16px 2px 4px; background: linear-gradient(160deg, #fdf6e9 0%, #fbf1e4 100%); border: 1px solid rgba(245,158,11,.18); border-radius: 16px; padding: 13px 15px; }
[data-theme="dark"] .plan-notes { background: rgba(245,158,11,.10); border-color: rgba(245,158,11,.24); }
.plan-notes h3 { font-size: 14px; font-weight: 700; color: #5a6178; display: flex; align-items: center; gap: 6px; }
.plan-notes h3 svg { color: #f5b94e; }
.plan-notes h3 .btn-text { margin-left: auto; font-size: 12px; font-weight: 700; color: #8a5a00; }
[data-theme="dark"] .plan-notes h3 { color: #f5b94e; }
[data-theme="dark"] .plan-notes h3 .btn-text { color: #f5b94e; }
.plan-notes ol { list-style: none; margin: 6px 0 0; padding: 0; }
.plan-notes li { display: flex; gap: 7px; margin-top: 7px; font-size: 12px; line-height: 1.6; color: #1a1f36; }
[data-theme="dark"] .plan-notes li { color: #f5b94e; }
.plan-notes li b { flex: none; color: #f5b94e; font-weight: 700; }
.plan-notes .pn-empty { margin: 6px 0 0; font-size: 12px; color: #6b7390; }

/* 导入预览：环节清单 + 提醒，超过一屏可滚动 */
.pi-list { max-height: 38vh; overflow: auto; margin: 0 -2px; }
.pi-row { display: flex; align-items: center; gap: 8px; padding: 7px 2px; border-bottom: 1px dashed rgba(148,163,184,.22); font-size: 12px; }
.pi-row:last-child { border-bottom: 0; }
.pi-no { flex: none; width: 20px; height: 20px; border-radius: 50%; background: rgba(109,92,231,.12); color: #6d5ce7; font-size: 11px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.pi-t { flex: 1; min-width: 0; color: var(--text); line-height: 1.5; }
.pi-tag { flex: none; padding: 2px 7px; border-radius: 999px;   font-size: 11px; font-weight: 700; }
.pi-time { flex: none; color: #6b7390; font-variant-numeric: tabular-nums; font-size: 11px; }
.pi-notes { margin-top: 10px; padding-top: 10px; border-top: 1px solid rgba(148,163,184,.22); }
.pi-notes b { font-size: 12px; color: #8a5a00; }
.pi-notes p { margin: 4px 0 0; font-size: 12px; line-height: 1.6; color: var(--text-3); }
/* ========== v1.4.41 准备清单 · 一键导入预览 ========== */
.pk-list { max-height: 52vh; overflow: auto; margin: 0 -2px; }
.pk-row { display: flex; align-items: center; gap: 8px; padding: 7px 2px; border-bottom: 1px dashed rgba(148,163,184,.22); }
.pk-row:last-child { border-bottom: 0; }
.pk-t { flex: 1; min-width: 0; font-size: 12px; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pk-sel { flex: none; width: 100px; font-size: 12px; padding: 5px 6px; border-radius: 9px; border: 1px solid var(--border, rgba(124,92,240,.14)); background: var(--card, #fff); color: var(--text); }

/* ========== v1.4.43 首页倒计时：以《开场时间》为准 + 已开演状态 ========== */
.countdown.is-live { display: block; }
.countdown .cd-live {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  padding: 13px 10px; border-radius: 14px;
  background: rgba(255,255,255,0.18);
  border: 1px solid rgba(255,255,255,0.3);
  backdrop-filter: blur(12px);
  font-size: 14px; font-weight: 700; letter-spacing: .4px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.3), 0 2px 8px rgba(0,0,0,0.1);
}

/* ========== v1.4.42 计划一览 · 全天节奏进度条 ========== */
.plan-tl { margin: 2px 2px 16px; padding: 13px 14px 12px; background: #fff; border: 1px solid rgba(226,229,240,.9); border-radius: 16px; box-shadow: 0 3px 12px rgba(31,38,135,.05); }
[data-theme="dark"] .plan-tl { background: #171d31; border-color: rgba(255,255,255,.07); box-shadow: 0 4px 16px rgba(0,0,0,.3); }
.plan-tl-bar { position: relative; height: 13px; border-radius: 999px; background: rgba(148,163,184,.16); }
[data-theme="dark"] .plan-tl-bar { background: rgba(148,163,184,.13); }
.plan-tl-seg { position: absolute; top: 0; bottom: 0; min-width: 3px; border-radius: 999px; background: var(--sc, #94a3b8); opacity: .3; transition: opacity .45s ease, box-shadow .45s ease; }
.plan-tl-seg.is-done { opacity: .92; }
.plan-tl-seg.is-todo { opacity: .26; }
.plan-tl-seg.is-live { opacity: 1; box-shadow: 0 0 0 1.5px rgba(255,255,255,.85), 0 2px 9px var(--sc, #94a3b8); animation: planTlPulse 2.2s ease-in-out infinite; }
[data-theme="dark"] .plan-tl-seg.is-live { box-shadow: 0 0 0 1.5px rgba(23,29,49,.9), 0 2px 10px var(--sc, #94a3b8); }
.plan-tl-now { position: absolute; top: -4px; bottom: -4px; width: 2px; margin-left: -1px; border-radius: 2px; background: #ef4444; box-shadow: 0 0 8px rgba(239,68,68,.5); }
.plan-tl-now::after { content: ''; position: absolute; left: 50%; top: -4px; width: 7px; height: 7px; margin-left: -3.5px; border-radius: 50%; background: #ef4444; box-shadow: 0 0 0 2px rgba(255,255,255,.92); }
.plan-tl.is-live .plan-tl-now { animation: planTlNow 2.2s ease-in-out infinite; }
.plan-tl-meta { display: flex; align-items: center; gap: 6px; margin-top: 10px; font-size: 11px; color: #1a1f36; }
.plan-tl-ico { display: flex; align-items: center; color: #4a6cf7; }
.plan-tl-txt { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-tl.is-live .plan-tl-txt { color: #1a1f36; font-weight: 700; }
.plan-tl.is-done .plan-tl-txt { color: #5a6178; }
.plan-tl-end { flex: none; font-size: 11px; font-weight: 700; color: #5a6178; font-variant-numeric: tabular-nums; }
[data-theme="dark"] .plan-tl-meta { color: #a8b0c8; }
[data-theme="dark"] .plan-tl.is-live .plan-tl-txt { color: #5fd39b; }
[data-theme="dark"] .plan-tl-end { color: #a8b0c8; }
@keyframes planTlPulse { 0%, 100% { filter: brightness(1); } 50% { filter: brightness(1.14); } }
@keyframes planTlNow { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
/* 每行的小进度条：当天行程里，已过=满格、进行中=实时增长、未到=空 */
.plan-card-pg { position: absolute; left: 0; bottom: 0; height: 3px; max-width: 100%; border-radius: 0 999px 999px 0; opacity: .8; transition: width .6s ease; pointer-events: none; }
.plan-row.is-now .plan-num { animation: planRowNow 2.2s ease-in-out infinite; }
.plan-row.is-now .plan-card { border-color: var(--cb, rgba(148,163,184,.4)); box-shadow: 0 0 0 1px var(--cb, rgba(148,163,184,.35)), 0 5px 16px rgba(31,38,135,.08); }
@keyframes planRowNow { 0%, 100% { box-shadow: 0 0 0 3px rgba(255,255,255,.92), 0 2px 7px rgba(31,38,135,.2); } 50% { box-shadow: 0 0 0 5px rgba(255,255,255,.7), 0 2px 10px rgba(31,38,135,.22); } }
[data-theme="dark"] .plan-row.is-now .plan-num { animation: none; box-shadow: 0 0 0 3px rgba(13,18,36,.9), 0 0 10px var(--rc, rgba(90,100,140,.6)); }
/* ===== v1.4.46 社区：去掉「共 N 条」，排序缩成右上角小胶囊 ===== */
.community-header .cat-row { display: flex; align-items: center; gap: 6px; }
.community-header .cat-row .cat-tabs { flex: 1 1 auto; min-width: 0; }
.community-header .seg-mini {
  flex: 0 0 auto; margin: 0; padding: 2px; border-radius: 999px;
  background: rgba(124,92,240,.07); border: 1px solid rgba(124,92,240,.13);
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
}
.community-header .seg-mini button {
  flex: 0 0 auto; padding: 3px 9px; font-size: 11px; font-weight: 600;
  border-radius: 999px; line-height: 1.45; letter-spacing: .2px;
  min-height: 0; min-width: 0;
}
.community-header .seg-mini button.on {
  background: #fff; color: #4a6cf7; box-shadow: 0 2px 8px rgba(74,108,247,.18);
}
[data-theme="dark"] .community-header .seg-mini { background: rgba(255,255,255,.07); border-color: rgba(255,255,255,.1); }
[data-theme="dark"] .community-header .seg-mini button.on { background: #2b2f52; color: #6b85ff; }
/* =====================================================================
   质感升级 v3 —— 珠光银 / 香槟烫金 / 曜黑镭射
   纯新增层：只在 .memt.is-v3 与 .ticket.st-pearl|st-champagne|st-onyx 下生效，
   不改动已封板的 6 款票面。要素：珠光/金属纸底 + 拉丝细纹 + 极淡噪点 +
   UV 斜向扫光 + 黑圆点打孔线 + 底缘扇贝齿 + 内嵌圆角海报 + 副券装饰二维码。
   ===================================================================== */

/* ---------- A. 纪念票大版：公共质感层 ---------- */
.memt.is-v3{
  --mt-dot:#2c313d; --mt-scallop:#c3cad7;
  --mt-ink:#171b26; --mt-ink2:#6f7789; --mt-label:#98a0b2; --mt-price:#1d2330;
  --mt-accent:#c99a3f; --mt-poster:#2a2f45; --mt-ring:rgba(126,138,164,.32);
}
.memt.is-v3 .memt-inner{ border-radius:20px 20px 0 0; padding-top:20px; }
/* 内嵌圆角海报：更圆的角 + 细边 + 浮起 */
.memt.is-v3 .mt-poster{
  margin:0 16px; border-radius:13px; background-color:var(--mt-poster);
  box-shadow:0 14px 26px -12px rgba(40,50,74,.5), 0 3px 9px -3px rgba(40,50,74,.26), 0 0 0 1px var(--mt-ring), 0 1px 0 rgba(255,255,255,.55);
}
.memt.is-v3 .mt-poster::before{
  background:
    radial-gradient(120% 64% at 88% -10%, rgba(255,255,255,.14), transparent 54%),
    linear-gradient(180deg, rgba(8,9,20,.10) 0%, rgba(8,9,20,0) 30%, rgba(6,7,15,.24) 66%, rgba(4,5,10,.82) 100%);
}
.memt.is-v3 .mt-fx{ color:rgba(64,74,96,.10); }
/* 票面文字取色 */
.memt.is-v3 .mt-event-name{ font-size:16.5px; color:var(--mt-ink); letter-spacing:.2px; }
.memt.is-v3 .mt-event-sub{ color:var(--mt-ink2); }
.memt.is-v3 .mt-cell > span{ color:var(--mt-label); }
.memt.is-v3 .mt-cell b{ color:var(--mt-ink); }
.memt.is-v3 .mt-cell-price b{ color:var(--mt-price); }
.memt.is-v3 .mt-msg{ color:var(--mt-ink2); }
.memt.is-v3 .mt-stub-note{ color:var(--mt-ink2); }
.memt.is-v3 .mt-serial span{ color:var(--mt-label); }
.memt.is-v3 .mt-lau{ color:var(--mt-accent); opacity:.95; }
.memt.is-v3 .mt-stub-brand{ color:var(--mt-ink); }
.memt.is-v3 .mt-stub-mark{ color:var(--mt-accent); background:rgba(255,255,255,.72); border-color:rgba(255,255,255,.9); box-shadow:0 0 0 2px rgba(226,202,151,.28), inset 0 0 0 1px rgba(255,255,255,.9); }
/* 打孔线：黑色圆点等距（对齐实体纪念票） */
.memt.is-v3 .mt-stub::before{
  left:0; right:0; top:-8px; height:16px; border-top:0;
  background-image:radial-gradient(circle at 6px 50%, var(--mt-dot) 0 2.1px, rgba(0,0,0,0) 2.6px);
  background-size:12px 16px; background-position:50% 50%; background-repeat:repeat-x;
}
/* 底缘扇贝齿（半圆） */
.memt.is-v3 .mt-stub::after{
  background-image:radial-gradient(circle at 13px .5px, var(--mt-scallop) 0 12px, rgba(0,0,0,0) 12.8px);
}
/* 副券色带：主券/副券分层 */
.memt.is-v3 .mt-stub{ background:linear-gradient(180deg, rgba(255,255,255,.46) 0%, rgba(255,255,255,.08) 56%, rgba(255,255,255,0) 100%); }

/* ---------- B. A · 珠光银（大麦同款质感） ---------- */
.st-pearl .memt-inner{
  background:
    repeating-linear-gradient(114deg, rgba(255,255,255,.5) 0 .5px, rgba(255,255,255,0) .5px 3.2px),
    radial-gradient(rgba(104,116,140,.06) .6px, rgba(255,255,255,0) .95px) 0 0/3px 3px,
    linear-gradient(158deg,#ffffff 0%,#f5f7fb 20%,#e8ecf3 48%,#d5dbe5 76%,#c3cad7 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.92);
}
.st-pearl .memt-inner::before{
  content:''; position:absolute; left:0; right:0; top:0; bottom:0; height:auto;
  border-radius:inherit; pointer-events:none; mix-blend-mode:overlay;
  background:
    radial-gradient(56% 32% at 14% 3%, rgba(255,255,255,.98), rgba(255,255,255,0) 64%),
    linear-gradient(112deg, rgba(255,170,216,.17) 0 13%, rgba(255,238,172,.19) 21%, rgba(170,255,218,.15) 33%, rgba(162,202,255,.19) 51%, rgba(206,170,255,.17) 67%, rgba(255,255,255,0) 83%),
    linear-gradient(102deg, rgba(255,255,255,0) 33%, rgba(255,255,255,.72) 45%, rgba(255,255,255,.16) 52%, rgba(255,255,255,0) 61%);
}
.st-pearl .mt-wm{ color:rgba(38,44,60,.055); }
.st-pearl .mt-serial b{ color:#394152; }

/* ---------- C. B · 香槟烫金 ---------- */
.st-champagne{
  --mt-dot:#5d4a22; --mt-scallop:#c9a86e;
  --mt-ink:#493615; --mt-ink2:#8a7448; --mt-label:#a58c5c; --mt-price:#7d4c12;
  --mt-accent:#b8862c; --mt-poster:#2b2415; --mt-ring:rgba(170,134,62,.46);
}
.st-champagne .memt-inner{
  background:
    repeating-linear-gradient(114deg, rgba(255,255,255,.34) 0 .5px, rgba(255,255,255,0) .5px 3px),
    radial-gradient(rgba(126,96,38,.07) .6px, rgba(255,255,255,0) .95px) 0 0/3px 3px,
    linear-gradient(158deg,#fef7e6 0%,#f8eccd 22%,#efdcb2 50%,#dfc594 78%,#c9a86e 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.85);
}
.st-champagne .memt-inner::before{
  content:''; position:absolute; left:0; right:0; top:0; bottom:0; height:auto;
  border-radius:inherit; pointer-events:none; mix-blend-mode:overlay;
  background:
    radial-gradient(54% 30% at 12% 2%, rgba(255,255,255,.95), rgba(255,255,255,0) 62%),
    linear-gradient(112deg, rgba(255,214,140,.30) 0 16%, rgba(255,246,214,.34) 26%, rgba(255,190,120,.24) 40%, rgba(186,255,226,.16) 56%, rgba(255,186,226,.18) 70%, rgba(255,255,255,0) 86%),
    linear-gradient(102deg, rgba(255,255,255,0) 30%, rgba(255,248,226,.82) 44%, rgba(255,255,255,.18) 52%, rgba(255,255,255,0) 62%);
}
.st-champagne .mt-stub{ background:linear-gradient(180deg, rgba(255,253,244,.58) 0%, rgba(255,253,244,.10) 56%, rgba(255,255,255,0) 100%); }
.st-champagne .mt-wm{ color:rgba(96,70,24,.07); }
.st-champagne .mt-cell-price b, .st-champagne .mt-serial b{
  background:linear-gradient(96deg,#5f3c07,#c99a35 38%,#7a4f0d 60%,#e2ba63 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}

/* ---------- D. C · 曜黑镭射 ---------- */
.st-onyx{
  --mt-dot:rgba(232,238,255,.55); --mt-scallop:#080a14;
  --mt-ink:#f1f4ff; --mt-ink2:#aab4d2; --mt-label:#8b96b8; --mt-price:#ffd88a;
  --mt-accent:#dcc178; --mt-poster:#0f1220; --mt-ring:rgba(206,220,255,.2);
}
.st-onyx .memt-inner{
  background:
    repeating-linear-gradient(114deg, rgba(255,255,255,.05) 0 .5px, rgba(255,255,255,0) .5px 3px),
    radial-gradient(rgba(190,205,255,.05) .6px, rgba(255,255,255,0) .95px) 0 0/3px 3px,
    radial-gradient(120% 74% at 8% -10%, rgba(88,116,255,.32), transparent 60%),
    radial-gradient(120% 80% at 100% 4%, rgba(186,96,255,.26), transparent 58%),
    linear-gradient(162deg,#1e2338 0%,#161b2d 30%,#0e1120 62%,#080a14 100%);
  box-shadow:inset 0 1px 0 rgba(184,204,255,.18), inset 0 0 0 1px rgba(150,175,255,.10);
}
.st-onyx .memt-inner::before{
  content:''; position:absolute; left:0; right:0; top:0; bottom:0; height:auto;
  border-radius:inherit; pointer-events:none; mix-blend-mode:screen; opacity:.92;
  background:
    linear-gradient(112deg, rgba(255,120,190,.26) 0 12%, rgba(255,214,120,.22) 22%, rgba(120,255,196,.20) 34%, rgba(130,190,255,.30) 52%, rgba(196,140,255,.28) 68%, rgba(255,255,255,0) 86%),
    linear-gradient(104deg, rgba(255,255,255,0) 30%, rgba(255,255,255,.26) 44%, rgba(255,255,255,.06) 52%, rgba(255,255,255,0) 60%);
}
.st-onyx .mt-stub{ background:linear-gradient(180deg, rgba(160,190,255,.12) 0%, rgba(160,190,255,.03) 46%, rgba(255,255,255,0) 100%); }
.st-onyx .mt-poster{ box-shadow:0 16px 30px -14px rgba(0,0,0,.85), 0 0 0 1px rgba(206,220,255,.22), 0 1px 0 rgba(255,255,255,.10); }
.st-onyx .mt-stub-mark{ background:rgba(16,20,34,.72); border-color:rgba(220,232,255,.22); box-shadow:0 0 0 2px rgba(120,150,255,.16), inset 0 0 0 1px rgba(255,255,255,.12); }
.st-onyx .mt-cell-price b, .st-onyx .mt-serial b{
  background:linear-gradient(96deg,#ff9ec4,#ffd88a 24%,#b6ffd0 45%,#9fd8ff 66%,#d3b0ff 86%,#ff9ec4 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}

/* ---------- E. 副券装饰二维码（仅 App 内渲染；分享图不含） ---------- */
.mt-qr{
  position:absolute; z-index:2; right:16px; bottom:16px;
  width:38px; height:38px; padding:3px; border-radius:7px; box-sizing:border-box;
  background:rgba(255,255,255,.82); color:#111;
  box-shadow:0 1px 3px rgba(40,40,60,.18), inset 0 0 0 1px rgba(255,255,255,.9);
  opacity:.62; 
}
.mt-qr svg{ display:block; width:100%; height:100%; }
.st-onyx .mt-qr{ background:rgba(255,255,255,.9); opacity:.74; color:#0a0c14; }

/* ---------- F. 票根墙小卡：三款新皮肤 ---------- */
.ticket.st-pearl{ background:linear-gradient(165deg,#ffffff 0%,#f2f5fa 55%,#e3e8f0 100%); border-color:#d5dbe5; box-shadow:0 10px 26px rgba(70,86,120,.16); }
.ticket.st-pearl .t-side{
  background:
    repeating-linear-gradient(114deg, rgba(255,255,255,.5) 0 .5px, rgba(255,255,255,0) .5px 3px),
    radial-gradient(circle at 85% 12%, rgba(255,255,255,.9), transparent 46%),
    linear-gradient(160deg,#eef1f7 0%,#dbe1ea 52%,#c3cad7 100%);
  color:#1a1f36;
}
.ticket.st-pearl .t-side-head, .ticket.st-pearl .t-side-date{ color:#1a1f36; }
.ticket.st-pearl .t-side-mark{ color:#6b7390; text-shadow:0 1px 8px rgba(255,255,255,.7); }
.ticket.st-pearl .t-name{ color:#1a1f36; }
.ticket.st-pearl .t-where, .ticket.st-pearl .t-msg{ color:#6b7390; }
.ticket.st-pearl .t-cell .k{ color:#6b7390; }
.ticket.st-pearl .t-cell b{ color:#1a1f36; }
.ticket.st-pearl .t-cell.price b{ color:#dc3545; }
.ticket.st-pearl .t-cols{ border-top-color:#dde2ea; }
.ticket.st-pearl .t-flag{ color:#1a1f36; background:#e6ebf3; }
.ticket.st-pearl .t-flag.done{ color:#8a5a00; background:#fde8dd; }
.ticket.st-pearl .t-act .btn-text{ color:#6b7390; }

.ticket.st-champagne{ background:linear-gradient(165deg,#fffaf0 0%,#f7e9c9 55%,#ecd7a7 100%); border-color:#e0c290; box-shadow:0 10px 26px rgba(150,110,40,.18); }
.ticket.st-champagne .t-side{
  background:
    repeating-linear-gradient(114deg, rgba(255,255,255,.34) 0 .5px, rgba(255,255,255,0) .5px 3px),
    radial-gradient(circle at 85% 12%, rgba(255,255,255,.85), transparent 46%),
    linear-gradient(160deg,#f7e7c4 0%,#e6cd9c 52%,#c9a86e 100%);
  color:#1a1f36;
}
.ticket.st-champagne .t-side::after{ opacity:.5; }
.ticket.st-champagne .t-side-head, .ticket.st-champagne .t-side-date{ color:#1a1f36; }
.ticket.st-champagne .t-side-mark{ color:#5a6178; text-shadow:0 1px 8px rgba(255,255,255,.6); }
.ticket.st-champagne .t-name{ color:#1a1f36; }
.ticket.st-champagne .t-where, .ticket.st-champagne .t-msg{ color:#5a6178; }
.ticket.st-champagne .t-cell .k{ color:#6b7390; }
.ticket.st-champagne .t-cell b{ color:#1a1f36; }
.ticket.st-champagne .t-cols{ border-top-color:#e6d4ad; }
.ticket.st-champagne .t-flag{ color:#1a1f36; background:#f0e0bb; }
.ticket.st-champagne .t-flag.done{ color:#8a5a00; background:#fbe4d3; }
.ticket.st-champagne .t-act .btn-text{ color:#8a5a00; }
.ticket.st-champagne .t-cell.price b{
  background:linear-gradient(96deg,#5f3c07,#c99a35 38%,#7a4f0d 60%,#e2ba63 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}

.ticket.st-onyx{ background:linear-gradient(165deg,#1e2338 0%,#121622 55%,#0a0d18 100%); border-color:rgba(170,190,255,.16); box-shadow:0 16px 34px rgba(8,10,24,.42); }
.ticket.st-onyx .t-side{
  background:
    radial-gradient(120% 80% at 20% 0%, rgba(96,120,255,.5), transparent 62%),
    radial-gradient(120% 70% at 90% 100%, rgba(196,110,255,.4), transparent 60%),
    linear-gradient(160deg,#252b46 0%,#161b2d 55%,#0b0e1a 100%);
  color:#ffffff;
}
.ticket.st-onyx .t-side-head, .ticket.st-onyx .t-side-date{ color:#ffffff; }
.ticket.st-onyx .t-side-mark{ color:#ffffff; text-shadow:0 0 14px rgba(150,180,255,.75); }
.ticket.st-onyx .t-name{ color:#ffffff; }
.ticket.st-onyx .t-where, .ticket.st-onyx .t-msg{ color:#6b7390; }
.ticket.st-onyx .t-cell .k{ color:#6b7390; }
.ticket.st-onyx .t-cell b{ color:#ffffff; }
.ticket.st-onyx .t-cell.price b{ color:#f5b94e; }
.ticket.st-onyx .t-cols{ border-top-color:rgba(200,214,255,.18); }
.ticket.st-onyx .t-flag{ color:#ffffff; background:rgba(150,180,255,.16); }
.ticket.st-onyx .t-flag.done{ color:#dc3545; background:rgba(255,140,120,.14); }
.ticket.st-onyx .t-act .btn-text{ color:#6b7390; }
.ticket.st-pearl .t-side::after{ opacity:.42; }

/* ===== v1.4.50 加载态文案（BUG-0917-03）=====
   以前等待期间只有三颗星在跳，用户分不清「网慢」和「App 坏了」。 */
.boot-loading{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:14px; }
.boot-loading .load-hint{
  font-size:12px; color:var(--text-2); opacity:0; transform:translateY(4px);
  transition:opacity .35s ease, transform .35s ease;
}
.boot-loading .load-hint.on{ opacity:.85; transform:none; }

/* ===== v1.5.5 危险操作按钮（管理后台的下架 / 封禁，以及 okDanger 的确认弹窗）=====
   此前 .btn-danger 只有类名、没有样式：删除类操作和普通按钮长得一模一样，容易误点。 */
.btn-danger{  border-color:transparent; color:#fff; }

/* ===== v1.5.21「花费明细」（v1.5.22 质感升级）=====
   版式：大金额卡 + 分组比例条 + 记账流水；折叠用原生 <details>。
   质感做三件事：① 大金额卡变成有分层光晕的「账单封面」；② 分组标题加色彩图标胶囊 + 行间分层；
   ③ 「按类别」卡与流水标签共用一套类别色（门票蓝 / 交通青 / 住宿紫 / 餐饮橙 / 周边粉 / 其他灰）。 */

/* 类别配色：一处定义，比例条与流水标签共用 */
[data-cat="ticket"]{ --cat:#4a6cf7; --cat2:#8095ff; --catbg:rgba(74,108,247,.10); --catbd:rgba(74,108,247,.22); }
[data-cat="transport"]{ --cat:#0fa8c2; --cat2:#5ed3e6; --catbg:rgba(15,168,194,.10); --catbd:rgba(15,168,194,.22); }
[data-cat="hotel"]{ --cat:#8b5cf6; --cat2:#b795ff; --catbg:rgba(139,92,246,.10); --catbd:rgba(139,92,246,.22); }
[data-cat="food"]{ --cat:#e8873a; --cat2:#f8b878; --catbg:rgba(232,135,58,.12); --catbd:rgba(232,135,58,.24); }
[data-cat="goods"]{ --cat:#e8589a; --cat2:#ff9ac6; --catbg:rgba(232,88,154,.10); --catbd:rgba(232,88,154,.22); }
[data-cat="other"]{ --cat:#8f9bb3; --cat2:#bcc6d8; --catbg:rgba(143,155,179,.12); --catbd:rgba(143,155,179,.24); }
[data-theme="dark"] [data-cat="ticket"]{ --catbg:rgba(74,108,247,.20); --catbd:rgba(74,108,247,.34); }
[data-theme="dark"] [data-cat="transport"]{ --catbg:rgba(15,168,194,.20); --catbd:rgba(15,168,194,.34); }
[data-theme="dark"] [data-cat="hotel"]{ --catbg:rgba(139,92,246,.20); --catbd:rgba(139,92,246,.34); }
[data-theme="dark"] [data-cat="food"]{ --catbg:rgba(232,135,58,.22); --catbd:rgba(232,135,58,.36); }
[data-theme="dark"] [data-cat="goods"]{ --catbg:rgba(232,88,154,.20); --catbd:rgba(232,88,154,.34); }
[data-theme="dark"] [data-cat="other"]{ --catbg:rgba(143,155,179,.22); --catbd:rgba(143,155,179,.36); }

/* ---- 总花费大卡：分层光晕 + 收敛的数字排版 ---- */
.cost-hero{ position:relative; overflow:hidden; display:flex; flex-direction:column; gap:3px;
  
   }

.cost-hero::after{  position:absolute; right:-38px; top:-46px; width:158px; height:158px; border-radius:50%;
  background:radial-gradient(circle, rgba(139,92,246,.20), rgba(139,92,246,0) 70%); pointer-events:none; }
.cost-hero > *{ position:relative; z-index:1; }
.cost-hero-label{ display:flex; align-items:center; gap:5px;  font-weight:700;  letter-spacing:.04em; }
.cost-hero-num{  font-weight:700; line-height:1.18; letter-spacing:-.01em; font-variant-numeric:tabular-nums;
   -webkit-background-clip:text; background-clip:text;  }

.cost-hero-grid{ display:grid;  gap:0; margin-top:14px; padding-top:13px;  }
.cost-hero-grid > div{ display:flex; flex-direction:column; gap:2px; }
.cost-hero-grid > div + div{ padding-left:14px;  }
.cost-hero-grid b{  font-weight:700; font-variant-numeric:tabular-nums; }


/* ---- 分组卡 ---- */
.cost-card{ padding:0; overflow:hidden; }
.cost-card details{ display:block; }
.cost-head{ display:flex; align-items:center; gap:9px; padding:13px 14px; cursor:pointer; list-style:none;
  -webkit-user-select:none; user-select:none; transition:background .18s; }
.cost-head:active{ background:rgba(120,120,140,.06); }
.cost-head::-webkit-details-marker{ display:none; }
.cost-head-ic{ display:flex; align-items:center; justify-content:center; flex-shrink:0; width:26px; height:26px; border-radius:9px;
  color:var(--primary); background:linear-gradient(135deg, rgba(74,108,247,.16), rgba(139,92,246,.16));
  border:1px solid rgba(74,108,247,.14); }
[data-theme="dark"] .cost-head-ic{ border-color:rgba(107,133,255,.24); }
.cost-head-title{  font-weight:700; }
.cost-head-meta{ margin-left:auto;  color:var(--text-3); font-variant-numeric:tabular-nums; }
.cost-caret{ display:flex; color:var(--text-3); transition:transform .22s ease; }
.cost-card details[open] .cost-caret{ transform:rotate(90deg); }
.cost-card details[open] .cost-head{ border-bottom:1px solid rgba(120,120,140,.12); }
.cost-list{ display:flex; flex-direction:column; gap:13px; padding:13px 14px 15px; animation:costIn .22s cubic-bezier(.4,0,.2,1); }
.cost-row-top{ display:flex; align-items:baseline; justify-content:space-between; gap:10px;  }
.cost-row-name{ font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cost-row-val{  white-space:nowrap; font-variant-numeric:tabular-nums; }
.cost-row-bar{  margin-top:7px; border-radius:999px;  }
.cost-row-bar i{ border-radius:999px; transition:width .45s cubic-bezier(.4,0,.2,1); }
/* 「按类别」卡：每行按类别上色（其余三张仍是品牌渐变） */
.cost-row[data-cat] .cost-row-bar{ background:var(--catbg); }
.cost-row[data-cat] .cost-row-bar i{ background:linear-gradient(90deg,var(--cat),var(--cat2)); box-shadow:0 0 10px var(--catbg); }

/* ---- 记账流水 ---- */
.cost-flow-list{ display:flex; flex-direction:column; padding:2px 14px 14px; animation:costIn .22s cubic-bezier(.4,0,.2,1); }
.cost-flow{ display:flex; align-items:center; gap:9px; padding:10px 0; border-top:1px solid rgba(120,120,140,.11); }
.cost-flow:first-child{ border-top:0; padding-top:4px; }
.cost-flow-main{ flex:1; min-width:0; }
.cost-flow-name{ font-size:14px; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cost-flow-sub{ margin-top:1px; font-size:11px; color:var(--text-3); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cost-flow-cat{ flex-shrink:0; padding:2px 8px; border-radius:999px; font-size:11px; font-weight:600;
  color:var(--text-2); background:rgba(124,92,240,.09); border:1px solid rgba(124,92,240,.14); }
.cost-flow-cat[data-cat]{ color:var(--cat); background:var(--catbg); border-color:var(--catbd); }
[data-theme="dark"] .cost-flow-cat{ background:rgba(124,92,240,.16); border-color:rgba(124,92,240,.22); }
[data-theme="dark"] .cost-flow-cat[data-cat]{ background:var(--catbg); border-color:var(--catbd); }
.cost-flow-amt{ flex-shrink:0; font-size:14px; font-weight:700; font-variant-numeric:tabular-nums; }
.cost-flow-more{ padding-top:11px; font-size:11px; color:var(--text-3); text-align:center; }

@keyframes costIn{ from{ opacity:0; transform:translateY(4px); } to{ opacity:1; transform:none; } }

/* 回忆页原地切页签：只让换进来的这一块淡入一下（顶部标题 / 页签 / 三格统计原地不动，所以不跳） */
#mem-body.mem-swap-on > *{ animation:costIn .22s cubic-bezier(.4,0,.2,1); }

/* =====================================================================
   v1.5.25 · 纪念票专项（第一批）
   ---------------------------------------------------------------------
   为什么这一版（三条，都是产品 2026-09-23 的原话）：
   ① 9 款票面里 6 款在纪念票大版上「只剩一个渐变色」——打孔线 / 扇贝齿 / 烫印
      只对 pearl / champagne / onyx 做过，同一个 key 在两种票面上还是两套设计。
      现在颜色与材质统一收在 JS 的 TICKET_TOKENS，以 --mt-* 变量下发，
      CSS 只写一套规则，9 款一视同仁（下面 :not(.is-v3) 是给已封板的三款让路）。
   ② 票册原来 2 列、把大票缩到 1/2 —— 字小到看不清。改成 3 列 + 专门的小卡版式。
   ③ 大图原来顶天立地，Pro Max 一屏都装不下。改成整票等比缩到一屏放得下。
   ===================================================================== */

/* ---------- A. 票纸 / 压线 / 打孔线 / 扇贝齿：全部改读 token（9 款统一） ---------- */
.memt-inner{
  background:
    radial-gradient(rgba(124,94,46,.05) .6px, rgba(255,255,255,0) .9px) 0 0/3px 3px,
    linear-gradient(180deg, var(--mtp-a) 0%, var(--mtp-b) 46%, var(--mtp-c) 100%);
}
.memt-inner::before{ background:linear-gradient(90deg, transparent, var(--mt-rule) 22%, var(--mt-rule) 78%, transparent); }
.memt .mt-poster{ background-color:var(--mtp-c); }
/* 主券与副券之间：黑圆点等距打孔线（原先只有三款才有，且是虚线） */
.memt .mt-stub::before{
    top:-8px; height:16px; border-top:0;
  background-image:radial-gradient(circle at 6px 50%, var(--mt-dot) 0 2.1px, rgba(0,0,0,0) 2.6px);
  background-size:12px 16px; background-position:50% 50%; background-repeat:repeat-x;
}
/* 底缘半圆扇贝齿（颜色 = 票纸底实色） */
.memt .mt-stub::after{
  background-image:radial-gradient(circle at 13px .5px, var(--mt-scallop) 0 12px, rgba(0,0,0,0) 12.8px);
}
/* 票面三级文字色 + 价格色走 token（暗票自动换成浅色，不必再为每款写一遍） */
.memt:not(.is-v3) .mt-event-name{ color:var(--mt-ink); }
.memt:not(.is-v3) .mt-event-sub{ color:var(--mt-label); }
.memt:not(.is-v3) .mt-cell > span{ color:var(--mt-label); }
.memt:not(.is-v3) .mt-cell b{ color:var(--mt-ink); }
.memt:not(.is-v3) .mt-cell-price b{ color:var(--mt-price); }
.memt:not(.is-v3) .mt-msg{ color:var(--mt-ink2); }
.memt:not(.is-v3) .mt-stub-note{ color:var(--mt-ink2); }
.memt:not(.is-v3) .mt-serial span{ color:var(--mt-label); }
.memt:not(.is-v3) .mt-serial b{ color:var(--mt-ink); }
.memt:not(.is-v3) .mt-lau{ color:var(--mt-accent); opacity:.95; }
.memt:not(.is-v3) .mt-stub-brand{ color:var(--mt-ink); }
.memt:not(.is-v3) .mt-stub-mark{
  color:var(--mt-mark); background:var(--mtp-a); border-color:var(--mt-rule);
  box-shadow:0 0 0 2px rgba(226,202,151,.28), inset 0 0 0 1px rgba(255,255,255,.75);
}
/* 暗票（黑金夜场 / 曜黑镭射）：水印与圆标在深色纸上要反过来 */
.memt.mt-dark .mt-wm{ color:rgba(255,255,255,.05); }
.memt.mt-dark .mt-stub-mark{ box-shadow:0 0 0 2px rgba(255,255,255,.08), inset 0 0 0 1px rgba(255,255,255,.12); }
[data-theme="dark"] .memt-inner{
  background:
    radial-gradient(rgba(124,94,46,.05) .6px, rgba(255,255,255,0) .9px) 0 0/3px 3px,
    linear-gradient(180deg, var(--mtp-a) 0%, var(--mtp-b) 46%, var(--mtp-c) 100%);
}

/* ---------- B. 专属编号的烫印材质（gold 烫金 / silver 银箔 / laser 镭射 / none 素色） ---------- */
.memt.mt-foil-gold .mt-serial b{
  background:linear-gradient(96deg,#5f3c07,#c99a35 38%,#7a4f0d 60%,#e2ba63 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}
.memt.mt-foil-silver .mt-serial b{
  background:linear-gradient(96deg,#69707e,#ccd6e3 40%,#8b95a4 62%,#f0f5fb 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}
.memt.mt-foil-laser .mt-serial b{
  background:linear-gradient(96deg,#ff9ec4,#ffd88a 24%,#b6ffd0 45%,#9fd8ff 66%,#d3b0ff 86%,#ff9ec4 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}

/* ---------- C. 大图：一屏放得下 + 一点点「展台」氛围 ---------- */
.mt-show{ position:relative; }
.mt-show::before{
  content:''; position:absolute; z-index:0; inset:0; pointer-events:none;
  background:radial-gradient(62% 42% at 50% 30%, rgba(124,92,240,.10), rgba(124,92,240,0) 72%);
}
/* 缩放容器：JS 按可用宽高等比缩（transform 是矢量缩，不会糊），
   缩完把外层高度改成缩放后的高度，避免底下留一大片空白 */
.mt-show-fit{ position:relative; z-index:1; display:flex; justify-content:center; overflow:hidden; }
.mt-show-fit > .memt{ width:100%; align-self:flex-start; will-change:transform; transform-origin:top center; }

/* ---------- D. 票册：3 列等高网格 + 小卡（与大票同一套 token，只做减法） ----------
   （详注见 git 历史 · W-023 样式表瘦身） */
.memt-masonry.mtm-3{
  display:grid; grid-template-columns:repeat(3,1fr); gap:9px; margin-top:10px; align-items:stretch;
}
.mtm-3 .mtm-cell{ height:100%; }
.mtm-3 .memt-card{ height:100%; }
.mtm-3 .memt-card .memt-inner{ height:100%; display:flex; flex-direction:column; }
.memt-card{ filter:drop-shadow(0 6px 13px rgba(52,38,12,.17)); }


/* 小卡不套用大票那套「3px 斜纹 + 斜向反光带」：缩到三分之一尺寸后它们不再是质感，
   是噪点（香槟烫金那张最明显，整片像纸脏了）。票纸颜色照旧跟着每张票自己的款式走
   （--mtp-a/b/c 来自 token），只是换成干净的两档渐变 —— 用户选的款式还在。 */
.memt-card .memt-inner{
  border-radius:12px;
  padding-top:0;
  overflow:hidden;
  background:
    radial-gradient(rgba(124,94,46,.05) .6px, rgba(255,255,255,0) .9px) 0 0/3px 3px,
    linear-gradient(164deg, var(--mtp-a) 0%, var(--mtp-b) 52%, var(--mtp-c) 100%);
}
.memt-card .memt-inner::before{
  left:9px;
  right:9px;
  top:0; bottom:auto; height:1px; mix-blend-mode:normal;
  background:linear-gradient(90deg, transparent, var(--mt-rule) 22%, var(--mt-rule) 78%, transparent);
}

/* 海报区：有封面就铺图；没封面时不摆「一片纯色」，居中放一颗大四角星（我们的 logo 元素）——
   跟旁边有图的卡放一起，它是「设计好的空位」，不再像图没加载出来。 */
.mtc-art{
  position:relative; flex:none; aspect-ratio:1/.9;
  display:flex; align-items:center; justify-content:center;
  background-size:cover; background-position:center 22%;
}
.mtc-art::after{
  content:''; position:absolute; inset:0; pointer-events:none;
  background:linear-gradient(180deg, rgba(8,9,20,.10) 0%, rgba(8,9,20,0) 42%, rgba(6,7,15,.30) 100%);
}
.mtc-art.noart::after{
  background:linear-gradient(180deg, rgba(8,9,20,.04) 0%, rgba(8,9,20,0) 48%, rgba(6,7,15,.16) 100%);
}
.mtc-fx{ position:relative; z-index:1; font-size:28px; line-height:1; color:#ffffff; }
.mtc-art:not(.noart) .mtc-fx{ display:none; }
.mtc-pill{
  position:absolute; z-index:2; left:5px; top:5px;
  font-size:11px; font-weight:700; letter-spacing:.2px; line-height:1;
  padding:4px 6px; border-radius:999px; color:#fff; white-space:nowrap;
  background:rgba(14,16,34,.42); border:1px solid rgba(255,255,255,.28);
  backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
}
.mtc-pill.ok{ color:#1a1f36; background:linear-gradient(135deg,#ffd98a,#efae3f); border-color:rgba(255,255,255,.62); }
.mtc-pill.miss{ color:#ffffff; background:rgba(14,16,34,.46); }
.mtc-body{ flex:1; padding:8px 9px 0; }
/* min-height 让名字永远占满两行的高度：一行名和两行名的卡片才会一样高（网格里才对得齐） */
.mtc-name{
  font-size:11px; font-weight:700; line-height:1.32; letter-spacing:.1px; color:var(--mt-ink);
  min-height:2.64em;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.mtc-nb{ white-space:nowrap; }
/* 日期原来用最浅那一档（--mt-label），比票价弱太多；可三张同名巡演的票只能靠日期区分。
   提到中间一档（--mt-ink2），票价仍然是最重的那个。 */
.mtc-meta{
  margin-top:4px; font-size:11px; font-weight:600; color:var(--mt-ink2);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; font-variant-numeric:tabular-nums;
}
.mtc-meta i{ font-style:normal; margin:0 3px; opacity:.6; }
.mtc-foot{
  display:flex; align-items:baseline; justify-content:space-between; gap:4px;
  margin-top:7px; padding:6px 9px 8px; border-top:1px dashed var(--mt-rule);
}
/* 票根编号是这张票的「身份证」，原来是 8px + 最浅那档色：金底那张（香槟烫金）几乎完全
   看不见，主次完全倒挂。加到 10px、换中间一档色 —— 仍然比票价轻，但看得清了。 */
.mtc-no{ font-size:11px; letter-spacing:.5px; color:var(--mt-ink2); font-family:Georgia,'Times New Roman',serif; }
.mtc-price{ font-size:11px; font-weight:700; color:var(--mt-price); white-space:nowrap; font-variant-numeric:tabular-nums; }
/* 小卡在暗色皮肤上：纸面本身已是深色，分隔线换成 token 的浅色压线即可（--mt-rule 已按款下发） */

@media (max-width:360px){
  .memt-masonry.mtm-3{ gap:7px; }
  .mtc-name{ font-size:11px; }
  .mtc-foot{ padding:5px 7px 7px; }
}

/* ============================================================================
   v1.5.26 · 编辑体验专项（第二批 · 2A）
   ----------------------------------------------------------------------------
   ① 编辑页右上角「保存」
      弹窗用 .modal-head/.modal-save，页面级表单用 .bb-save（塞进 backBar 早就留好的
      右侧插槽）。两者外观一致、位置固定，点它 = 点底部那颗 —— 同一个提交函数，
      不是第二套逻辑，所以这里只写「长什么样」。
      标题行仍然是一个普通 h3，只给它右侧留出按钮的位置（标题长了自己换行，不会压上去）。
   ② 票根编辑页「票面实时预览」
      宿主按 375px 设计宽渲染（和大图同一份 memtTicket），再整体等比缩进预览框；
      transform 是矢量缩，不会糊。点「放大」= 只按宽度缩，框内可上下滚。
   ============================================================================ */
/* v1.6.24：右上角「保存」原来垂直居中，30px 高的按钮比 23px 的标题行更高，
   底边正好压在下面第一张卡上（真机实测重叠 3.5px）。改成顶对齐 + 标题行补下边距。 */
.modal-head{ position:relative; padding-bottom:6px; margin-bottom:12px; }
.modal-head > h3{ padding-right:74px; }
.modal-save{ position:absolute; right:0; top:0; }
.modal-save:disabled{ opacity:.55; }

.bb-save{ flex:none; }
.bb-save:disabled{ opacity:.55; transform:none; }

.tk-prev{ margin-top:16px; padding-top:14px; border-top:1px dashed rgba(124,92,240,.22); }
.tk-prev-head{ display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom:8px; }
.tk-prev-head > span{ font-size:12px; font-weight:700; color:var(--text-2); }
.tk-prev-zoom{
  flex:none; padding:4px 12px; border-radius:999px; cursor:pointer;
  font-size:11px; font-weight:700; color:#6d5ce7;
  background:rgba(124,92,240,.1); 
}
.tk-prev-zoom:active{ transform:scale(.95); }
[data-theme="dark"] .tk-prev-zoom{ color:#c4b2ff; background:rgba(139,122,246,.16);  }
.tk-prev-box{
  position:relative; height:360px; overflow:auto; padding:10px;
  border-radius:16px; background:rgba(124,92,240,.05);
  border:1px solid rgba(124,92,240,.1);
  -webkit-overflow-scrolling:touch; overscroll-behavior:contain;
}
[data-theme="dark"] .tk-prev-box{ background:rgba(255,255,255,.04); border-color:rgba(255,255,255,.1); }
.tk-prev-fit{ margin:0 auto; }
.tk-prev-stage{ width:375px; transform-origin:top left; }
/* 预览里的票不接受点击：它只是张图，点它不该触发任何东西（和大票册小卡一个道理） */
.tk-prev-stage .memt{ pointer-events:none; }
.tk-prev-tip{ margin-top:7px; font-size:11px; line-height:1.55; color:var(--text-3); }

/* ============================================================
   v1.5.27 · 编辑体验第二批 2B
   ① 编辑页「更多信息」折叠区 —— 首屏只留必填，其余收进来；
      标题右侧挂一行已填摘要，不用展开也知道填过什么。
   ② 智能预填的来源灰字（.fx-hint）—— 值从历史里带出来就把出处写在下面，
      用户自己一动这一格就消失（来源标注必须跟着值走）。
   ============================================================ */
.more-box{ margin-top:14px; border-top:1px solid var(--border); }
.more-head{
  display:flex; align-items:center; gap:8px; width:100%;
  padding:12px 0 10px; background:none;  font:inherit; color:inherit;
  text-align:left; cursor:pointer; 
}
.more-head:active{ opacity:.7; }
.more-title{ flex:none; font-size:12px; font-weight:700; color:var(--text-2); }
.more-sum{
  flex:1 1 auto; min-width:0; font-size:11px; font-weight:600; color:var(--text-3);
  text-align:right; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.more-arrow{
  flex:none; width:7px; height:7px; margin-top:-3px;
  border-right:1.6px solid var(--text-3); border-bottom:1.6px solid var(--text-3);
   transition:transform .18s ease;
}
.more-box.is-open .more-arrow{ transform:rotate(225deg); margin-top:3px; }
.more-box.is-open .more-sum{ color:var(--text-2); }
.more-body{ padding-top:2px; }
.more-body[hidden]{ display:none; }

.fx-hint{ display:none; margin-top:5px; font-size:11px; line-height:1.5; color:var(--text-3); }
.fx-hint.on{ display:block; }
.fx-hint.on::before{ content:'↳ '; opacity:.65; }

/* ===== v1.6.0 封面专项：全站封面「区域」统一（大图 4:3 / 小图 1:1） =====
   为什么统一：同一张封面以前被四种盒子裁（首页 ~1.95 / 演唱会详情 2.93 / 纪念页 3.2 /
   行程列表缩略图 0.96），同一张图在四个页面像四张图。
   现在统一的是「显示区域」：有封面的大图卡一律 4:3 的盒子；小缩略图一律 1:1
   （行程卡 88×88、首页「大家都在聊」56×56 —— 小方块里裁是缩略图的天性）。
   ⚠️ v1.5.31 修正（产品真机反馈「图片上面被糊了一层淡色 / 一层渐变」）：
   上一版（v1.5.30）这里给封面卡加过一层「底部暗纱」，但它继承了 styles.css 里
   .hero-card::after 的 height:50%（我只写了 inset:0，挡得住 top/bottom，挡不住 height），
   于是暗纱没落在底部、而是把**海报上半张压暗** —— 真机上就是「图片上面被糊住」。
   现在的口径回到 v1.3.4 那条「主卡原图直出」：**封面卡上一律不叠任何一层** ——
   光晕 / 玻璃高光 / 暗纱 / 流光 四条全部关掉（见下面那条 content:none!important）。
   海报什么样就显示什么样；盒子仍然统一 4:3，但不再往图上盖任何东西。
   比例数字与 helpers.js 的 COVER_ASPECT（4:3）一致的是详情页/纪念页；首页主卡是
   唯一的例外（208px 扁卡，见下面那条 v1.5.34 规则）。冒烟测试钉着这两条。
   只对 .has-cover 生效：没封面的用户看到的还是原来那张星夜渐变卡，高度照旧跟着内容走。 */
.hero-card.detail-hero.has-cover,
.hero-card.mem-hero.has-cover {
  aspect-ratio: 4 / 3;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
/* 首页主卡不吃 4:3：高度仍由 styles-v130.css 的 min-height:208px 决定（430px 机身下
   406×208 ≈ 1.95:1 = v1.5.29 那张扁卡）。产品口径（v1.5.34）：「上一个版本的比较合理」。
   flex-end 保留，让倒计时沉底；无封面时这段本来也不生效（只挂 .has-cover）。 */
.hero-card.hero-home.has-cover {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
/* 封面卡上不许有任何一层盖在图上：光晕（.hero-card::before）· 玻璃高光（.hero-card::after）
   · 首页那层暗纱/流光（.hero-home::before / ::after）· 详情页旧的高光 —— 全部 content:none。
   这条必须留在最后且带 !important：这些层分散在 styles.css / styles-v130.css / styles-v200.css
   三处，任何一条漏掉，真机上都会变成「海报被糊了一层」。冒烟有断言钉着。 */
.hero-card.hero-home.has-cover::before,
.hero-card.detail-hero.has-cover::before,
.hero-card.mem-hero.has-cover::before,
.hero-card.hero-home.has-cover::after,
.hero-card.detail-hero.has-cover::after,
.hero-card.mem-hero.has-cover::after { content: none !important; }
.hero-card.hero-home.has-cover > *,
.hero-card.detail-hero.has-cover > *,
.hero-card.mem-hero.has-cover > * { position: relative; z-index: 1; }
.hero-card.hero-home.has-cover .stars-bg,
.hero-card.mem-hero.has-cover .stars-bg { display: none; }

/* ===== v1.5.32 封面卡「不叠层」补漏：纪念页 / 年度回忆册 =====
   上一版（v1.5.31）把 CSS 里的四层（光晕/高光/暗纱/流光）全关了，但**纪念页**那层渐变
   写在 JS 行内样式里（views2.js 的 mem-hero），CSS 的 content:none 管不到行内 ——
   真机上仍是「海报被一层渐变压住，上淡下深」。年度回忆册的 .recap-hero-tint 同理。
   现在：有封面就只出原图，白字的可读性一律交给 text-shadow（与详情页同一条口径）。 */
.hero-card.mem-hero.has-cover > div { text-shadow: 0 1px 8px rgba(3,6,24,.45); }
.recap-hero.has-img .recap-hero-tint { background: none; }
.recap-hero.has-img .recap-hero-kicker,
.recap-hero.has-img .recap-hero-year,
.recap-hero.has-img .recap-hero-slogan { text-shadow: 0 1px 10px rgba(3,6,24,.5); }

/* ---- 上传格子：一行备注 + 预览 + 删除 ---- */

.up-hint b { color: var(--text-2); }
.up-hint-link { background: none; border: none; padding: 0; font: inherit;    }
.up-box { margin-top: 8px; display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; }
.up-img { max-height: 120px; max-width: 100%; border-radius: 10px; display: block; object-fit: cover; }
.up-del { flex: none; }

/* ---- 上传须知弹窗 ---- */
.up-notice p { margin: 0 0 9px; font-size: 12px; line-height: 1.7; }
.up-notice ul { margin: 0 0 10px; padding-left: 18px; }
.up-notice li { font-size: 12px; line-height: 1.75; color: var(--text-2); margin-bottom: 6px; }
.up-notice li::marker { color: var(--primary); }
.up-notice-tip { font-size: 12px !important; color: var(--text-3); background: rgba(124,92,240,.08); border-radius: 10px; padding: 9px 11px; margin-bottom: 0 !important; }
/* ==========================================================================
   v1.5.37：居中方式换成「父级留白 + 输入框自己一行高」
   （详注见 git 历史 · W-023 样式表瘦身） */
/* ==========================================================================
   v1.5.36（1/2）输入框「一行高」外壳 —— 所有编辑页 + 所有抽屉共用一套
   产品反馈（UX-0924-11）：① 编辑时光标跳到框上方，不跟框里的字上下居中；
   ② 抽屉里的时间框比别的框矮一大截。
   真机 WebView 实测（1 像素 = 1/3pt）：框高 40px 完全正确，文字中心 = 框中心分毫不差，
   偏偏光标从「内边距盒顶部」往下量、高度只有一行 —— 只要 行高 < 框高，光标就必然比字高。
   v1.5.33 贴顶 → v1.5.34 被拉成顶满整框的长竖线 → v1.5.35 又贴顶，三版都没修干净都是这条。
   所以不再猜内核口径：外框 .fx-box（40px）负责边框/底色/圆角/上下居中，里面真正的输入框
   只保留一行高（20px = 行高）—— 光标与文字共用一个盒子，位置由浏览器自证。
   日期 / 时间 / 下拉是原生控件（没有光标），撑满外壳：高度不由内容决定，空值也不塌成一条。
   ========================================================================== */
/* v1.5.41：光标「偏上一格 + 往左一个字的距离」= 正好等于外壳给输入框留的那点白。
   说明 iOS 画光标是拿「外壳的原点」当基准、不吃外壳的 padding。
   所以：外壳 padding 归零、左右留白改到输入框自己身上（横向 padding 原生框是认的），
   这样「输入框的原点」和「外壳的原点」在同一处，光标无论按哪个口径量都落对。
   纵向靠外壳 flex 居中 + 输入框自己一行高（18px），不靠外壳的上下 padding。 */
/* v1.5.43：真正的元凶是「全局关掉了原生外观」——styles.css 里一句 input, textarea, select
   { -webkit-appearance: none } 把所有输入框的原生 textfield 外观一起关了。iOS 画光标是按这层
   原生内外边距算的，关掉之后光标就落到框的左上角：偏上一格 = 外壳 flex 居中那 11px，
   往左一个字 = 输入框自己的 12px 内边距；而且只在「第一次聚焦」时按这个错口径画一次，
   再点一下才按文字重新定位 —— 之前六版都在改尺寸，改的是「字在哪」，没改「光标按什么量」。
   所以两处一起动：① 原生外观只对没有光标的控件关（下拉 / 日期时间 / 勾选 / 文件 / 滑块 / 取色 / 多行）；
   ② 这一行不再写死 18px + 行高，交给内核自己量（height: 20px, line-height: normal），
      光标跟着原生那层走，永远和字同一条基准线。 */

/* 光标为什么要写死「一行高」：
   （详注见 git 历史 · W-023 样式表瘦身） */
.fx-box {
   display: flex; align-items: center; box-sizing: border-box;
   min-width: 0; height: 40px; 
  background: #fff; border: 1px solid rgba(109,92,231,.28); border-radius: 14px;
  box-shadow: 0 1px 2px rgba(31,38,135,.04);
  
}
/* v1.5.46：聚焦时不再给外壳加任何阴影 —— 产品反馈「光标选中后，光标所在的文本框有背景阴影，需要剔除」。
   原来这里在聚焦时加了「3px 紫色光环 + 10px 投影」，跟旁边没聚焦的框一比，就那一格像浮起来了。
   现在聚焦只剩一件事：边框变主题紫（跟静止时同一层装饰：边框 / 圆角 / 底色仍只在外壳上），
   投影与兄弟框分毫不差（都只留 .fx-box 上那层 4% 的静态小投影）。 */
.fx-box:focus-within { border-color: #6d5ce7; }
/* 双类名 .input.input：压过 form[data-form=…] .input / [data-theme] .modal form .input 那几段 */
.fx-box > .input.input {
  display: block; width: 100%; min-width: 0; margin: 0; 
  border: 0; border-radius: 0; background: transparent; box-shadow: none;
  font-size: 16px; color: var(--text);  outline: none;
}

/* v1.5.44：外壳里的输入框「自己不画任何东西」（静止 / 悬停 / 聚焦 / 暗色 全覆盖）。
   上面那几段 form[data-form=…] .input、.modal form .input、以及它们的 :focus 版本，
   优先级都比外壳规则高（多一个 form 元素或 :focus 伪类）—— 于是输入框会跟着自己画出来：
   14px 圆角 + 自己那层底（暗色下是 rgba(255,255,255,.1)）+ 聚焦时一圈紫色光环 + 一层小投影，
   在紫色外壳里面就多出一个矩形框（产品反馈「所有文本框里面还嵌套了一个矩形框」就是它）。
   要压过它们，选择器得比「两个类 + 一个 form 元素 / :focus」更强：
   这里用 .fx-box > .input.input:focus（4 个类级）与 [data-theme="dark"] 版（5 个类级）。
   装饰只留外壳那一层 —— 边框 / 圆角 / 底色 / 投影 / 聚焦光环全在 .fx-box 上。 */
.fx-box > .input.input,
.fx-box > .input.input:hover,
.fx-box > .input.input:focus,
.fx-box > .input.input:focus-visible,
.fx-box > .input.input:active,
[data-theme="dark"] .fx-box > .input.input,
[data-theme="dark"] .fx-box > .input.input:hover,
[data-theme="dark"] .fx-box > .input.input:focus,
[data-theme="dark"] .fx-box > .input.input:focus-visible,
[data-theme="dark"] .fx-box > .input.input:active {
  border: 0; border-radius: 0; background: transparent; box-shadow: none; outline: none;
}
.fx-box > input.input.input::placeholder { color: #6b7390; font-size: 16px; }
/* 下拉：跟文本框一样「一行高」（边框 / 留白 / 箭头都在外壳上）*/
.fx-box > select.input.input {    appearance: none; -webkit-appearance: none; background-image: none; }
/* 日期 / 时间 / 日期时间：原生控件没有光标，跟文本框一样「自己一行高」放在外壳里 */
.fx-box > input.input[type="date"],
.fx-box > input.input[type="time"],
.fx-box > input.input[type="datetime-local"] {
  /* v1.5.40：不再绝对定位铺满外壳 —— 原生框铺满时，它自己那块底会压到外壳的圆角上，
     四个角的边线就像被擦掉一截。改成跟文本框一样「自己一行高」，由外壳 flex 居中：
     既不会塌成一条（v1.5.36 的老问题），也碰不到圆角。 */
     
  margin: 0;  border: 0; background: transparent;
  /* 选完日期后原生文字上下 + 左右居中 */
  
}
.fx-box > input.input[type="date"]::-webkit-datetime-edit,
.fx-box > input.input[type="time"]::-webkit-datetime-edit,
.fx-box > input.input[type="datetime-local"]::-webkit-datetime-edit {
  display: flex; align-items: center; justify-content: center; height: 100%; line-height: normal;
}
.fx-box > input.input[type="date"]::-webkit-date-and-time-value,
.fx-box > input.input[type="time"]::-webkit-date-and-time-value,
.fx-box > input.input[type="datetime-local"]::-webkit-date-and-time-value {
  text-align: center; line-height: 18px;
}
/* 下拉的原生箭头去掉后，箭头画在外壳上（跟编辑页一致） */
.fx-box.is-select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%236d5ce7' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 12px center; background-size: 16px 16px;
}
[data-theme="dark"] .fx-box { background: rgba(255,255,255,.07); border-color: rgba(139,122,246,.4); }
[data-theme="dark"] .fx-box:focus-within { border-color: #8b7cf0; }
[data-theme="dark"] .fx-box > .input.input { color: #eef1ff; background: transparent; }
[data-theme="dark"] .fx-box > input.input.input::placeholder { color: #a8b0c8; }

/* ==========================================================================
   v1.5.36（2/2）计划一览：紧凑时间轴（产品反馈 UX-0924-12）
   （详注见 git 历史 · W-023 样式表瘦身） */
.plan-page .plan-head { margin: 2px 2px 0; }
.plan-page .plan-head h2 { font-size: 16px; line-height: 1.35; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.plan-page .plan-head p { margin-top: 4px; flex-direction: column; gap: 1px; }
.plan-page .plan-head p > span { max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.plan-page .plan-src { margin: 6px 4px 8px; }

/* 日期行 = 「日期 · 细节奏条 · N 个环节」一行；跨天才有日期与条数 */
.plan-page .plan-day { flex-wrap: wrap; gap: 9px;  }
.plan-page .plan-day-n { flex: none; font-size: 11px; color: #5a6178; }
.plan-page .plan-day .plan-tl { flex: 1 1 70px; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 5px; margin: 0; padding: 0; background: none; border: 0; box-shadow: none; }
.plan-page .plan-day .plan-tl-bar { flex: 1 1 60px; height: 9px; }
.plan-page .plan-day .plan-tl-now { top: -3px; bottom: -3px; }
.plan-page .plan-day .plan-tl-meta { display: none; }
/* 「进行中 / 下一项」那行只在当天真的正在进行时才出现，占第二行 */
.plan-page .plan-day .plan-tl.is-live .plan-tl-meta { display: flex; flex: 1 1 100%; margin: 0; font-size: 11px; }
.plan-page .plan-row { padding-left: 34px; margin-bottom: 7px; }
.plan-page .plan-rail { left: 0; top: 0; bottom: -7px; width: 26px; }
.plan-page .plan-rail::before { left: 12px; top: 19px; }
.plan-page .plan-num {   width: 21px; height: 21px; font-size: 11px;  }

.plan-page .plan-card { gap: 9px; align-items: flex-start;   }
.plan-page .plan-time { flex: none; width: 86px; padding-top: 1px; font-size: 11px; line-height: 1.45; letter-spacing: 0; white-space: nowrap; font-variant-numeric: tabular-nums; }
.plan-page .plan-time i { margin: 0 1px; }
.plan-page .plan-main { flex: 1 1 auto; min-width: 0; }
.plan-page .plan-trow { display: flex; align-items: center; gap: 6px; }
.plan-page .plan-trow .plan-t { flex: 1 1 auto; min-width: 0; margin: 0; font-size: 14px; line-height: 1.35; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.plan-page .plan-pill { flex: none; margin: 0; padding: 2px 8px; font-size: 11px; }
.plan-page .plan-d { margin-top: 1px; font-size: 11px; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; }
.plan-page .plan-card-pg { height: 2px; }
/* 亮点 / 注意事项：默认收起，只留一行标题（点标题展开） */
.plan-page .plan-hl, .plan-page .plan-notes { margin: 10px 2px 4px; padding: 0; overflow: hidden; }
.plan-page .plan-hl > summary, .plan-page .plan-notes > summary {
  display: flex; align-items: center; gap: 6px; padding: 10px 14px;
  font-size: 12px; font-weight: 700; cursor: pointer; list-style: none;
}
.plan-page .plan-hl > summary::-webkit-details-marker, .plan-page .plan-notes > summary::-webkit-details-marker { display: none; }
.plan-page .plan-hl > summary::after, .plan-page .plan-notes > summary::after { content: '▾'; margin-left: auto; font-size: 11px; opacity: .55; }
.plan-page .plan-hl[open] > summary::after, .plan-page .plan-notes[open] > summary::after { transform: rotate(180deg); }
.plan-page .plan-notes > summary::after { margin-left: 6px; }
.plan-page .plan-hl > summary b, .plan-page .plan-notes > summary b { flex: none; font-size: 11px; font-weight: 700; border-radius: 999px; padding: 1px 7px; }
.plan-page .plan-hl > summary { color: #5b4bd6; }
.plan-page .plan-hl > summary svg { color: #6d5ce7; }
.plan-page .plan-hl > summary b { color: #6d5ce7; background: rgba(139,92,246,.14); }
.plan-page .plan-notes > summary { color: #5a6178; }
.plan-page .plan-notes > summary svg { color: #f5b94e; }
.plan-page .plan-notes > summary b { color: #f5b94e; background: rgba(245,158,11,.18); }
.plan-page .plan-notes > summary .btn-text { margin-left: auto; font-size: 12px; font-weight: 700; color: #8a5a00; }
[data-theme="dark"] .plan-page .plan-hl > summary { color: #c4b2ff; }
[data-theme="dark"] .plan-page .plan-notes > summary { color: #f5b94e; }
[data-theme="dark"] .plan-page .plan-notes > summary .btn-text { color: #f5b94e; }
.plan-page .plan-hl ol, .plan-page .plan-notes ol { margin: 0; padding: 0 15px 12px; }
.plan-page .plan-notes .pn-empty { margin: 0; padding: 0 15px 12px; }

/* ==========================================================================
   v1.5.37：计划一览顶部「全程总进度」条（一条细条 + 百分比 + 已完成环节数）
   为什么加：上一版把节奏条压成日期行里的细条后，页面只剩「每天各自」的节奏，
   看不到「整趟行程走到哪儿了」—— 本场速办卡上有，点进来反而没有。
   口径与每行小进度条一致：过去的整天算完成、今天按每个环节的结束时间逐个算；
   跟节奏条一起 30 秒刷新（只改宽度与数字，不整页重渲染）。
   ========================================================================== */
/* v1.5.38：总进度条原来只有一条 7px 细线，太小气 —— 改成一张有分量的卡：大号百分比 + 粗进度条 + 两行小字 */
.plan-page .plan-overall { margin: 12px 0 2px; padding: 13px 15px 12px; border-radius: 18px;
  background: linear-gradient(135deg, rgba(109,92,231,.16), rgba(155,139,255,.07) 58%, rgba(148,163,184,.05));
  border: 1px solid rgba(109,92,231,.22); box-shadow: 0 6px 18px -10px rgba(109,92,231,.55); }
.plan-page .plan-overall.is-done { border-color: rgba(16,185,129,.30);
  background: linear-gradient(135deg, rgba(16,185,129,.18), rgba(52,211,153,.07)); box-shadow: 0 6px 18px -10px rgba(16,185,129,.55); }
.plan-page .plan-overall-hd { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.plan-page .plan-overall-t { font-size: 12px; font-weight: 700; letter-spacing: .04em; color: #1a1f36; }
.plan-page .plan-overall-p { font-size: 28px; font-weight: 700; line-height: 1; color: #6d5ce7; font-variant-numeric: tabular-nums; }
.plan-page .plan-overall-p i { font-size: 14px; font-weight: 700; font-style: normal; margin-left: 1px; }
.plan-page .plan-overall.is-done .plan-overall-p { color: #1f9d63; }
.plan-page .plan-overall-bar { margin-top: 10px; height: 11px; border-radius: 999px; background: rgba(148,163,184,.22); overflow: hidden; }
.plan-page .plan-overall-bar > i { display: block;  border-radius: 999px; background: linear-gradient(90deg, #6d5ce7, #9b8bff); box-shadow: 0 0 12px rgba(109,92,231,.55);  }
.plan-page .plan-overall.is-done .plan-overall-bar > i { background: linear-gradient(90deg, #0e9f6e, #34d399); box-shadow: 0 0 12px rgba(16,185,129,.55); }
.plan-page .plan-overall-ft { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 8px; font-size: 11px; color: #1a1f36; }
.plan-page .plan-overall-n { font-variant-numeric: tabular-nums; }
.plan-page .plan-overall-s { color: #5a6178; }
[data-theme="dark"] .plan-page .plan-overall { border-color: rgba(139,122,246,.32);
  background: linear-gradient(135deg, rgba(139,122,246,.20), rgba(148,163,184,.06)); }
[data-theme="dark"] .plan-page .plan-overall-t { color: #a8b0c8; }
[data-theme="dark"] .plan-page .plan-overall-p { color: #c4b2ff; }
[data-theme="dark"] .plan-page .plan-overall-bar { background: rgba(148,163,184,.16); }
[data-theme="dark"] .plan-page .plan-overall-s { color: #a8b0c8; }

/* ==========================================================================
   v1.5.42：计划一览
   ① 「本场计划」升级为页面视觉重心（一整块浅色面板 + 每行本色竖条 + 更立体的层）
   ② 总进度条加节点标记：每个环节一颗点，走到哪一颗一目了然
      走过 = 本紫 · 正在（第一个没走到的）= 橙色呼吸 · 没到 = 空心白
   ========================================================================== */
.plan-page .plan-list { margin-top: 10px; padding: 12px 12px 4px; border-radius: 20px;
  background: linear-gradient(180deg, #fbfcff 0%, #f3f6fd 100%);
  border: 1px solid rgba(109,92,231,.14);
  box-shadow: inset 0 1px 0 #fff, 0 10px 26px -20px rgba(31,38,135,.5); }
[data-theme="dark"] .plan-page .plan-list { background: linear-gradient(180deg, #121831 0%, #0f1428 100%);
  border-color: rgba(139,122,246,.20); box-shadow: inset 0 1px 0 rgba(255,255,255,.04); }
.plan-page .plan-list > .empty { margin: 8px 4px 12px; }
.plan-page .plan-day { margin: 6px 2px 8px; }
.plan-page .plan-day b { padding: 3px 10px 3px 8px; border-radius: 999px; background: rgba(109,92,231,.10); }
[data-theme="dark"] .plan-page .plan-day b { background: rgba(139,122,246,.16); }
.plan-page .plan-card { padding: 10px 12px 10px 15px; border-radius: 14px;
  border-color: var(--cb, rgba(226,229,240,.9));
  box-shadow: 0 5px 16px -12px rgba(31,38,135,.6); }
.plan-page .plan-card::after { content: ''; position: absolute; left: 6px; top: 11px; bottom: 11px; width: 3px;
  border-radius: 999px; background: var(--c, #3b82f6); opacity: .9; }
.plan-page .plan-num {
  top: 2px;
  left: 1px; box-shadow: 0 0 0 3px #fff, 0 3px 9px rgba(31,38,135,.22); }
[data-theme="dark"] .plan-page .plan-num { box-shadow: 0 0 0 3px #131a30, 0 3px 9px rgba(0,0,0,.45); }
.plan-page .plan-row.is-now .plan-card { box-shadow: 0 0 0 1px var(--c, #6d5ce7), 0 12px 26px -16px var(--c, #6d5ce7); }
.plan-page .plan-row.is-now .plan-card::after { top: 8px; bottom: 8px; opacity: 1; }

/* 总进度条：节点层（跟条子同一块区域，但不吃条子的 overflow:hidden）*/
.plan-page .plan-overall-track { position: relative; margin-top: 11px; }
.plan-page .plan-overall-track .plan-overall-bar { margin-top: 0; }
.plan-page .plan-overall-bar > i {
  height: 100%;
  transition: width .6s ease; position: relative; }
.plan-page .plan-overall-bar > i::after { content: ''; position: absolute; right: 0; top: -3px; bottom: -3px; width: 3px;
  border-radius: 2px; background: #fff; box-shadow: 0 0 8px rgba(255,255,255,.95); }
.plan-page .plan-overall-nds { position: absolute; left: 0; right: 0; top: 0; bottom: 0; pointer-events: none; }
.plan-page .plan-overall-nd { position: absolute; top: 50%; width: 8px; height: 8px; margin: -4px 0 0 -4px;
  border-radius: 50%; background: #fff; box-shadow: 0 0 0 2px rgba(148,163,184,.55); }
.plan-page .plan-overall-nd.is-done { background: #6d5ce7; box-shadow: 0 0 0 2px #fff, 0 1px 5px rgba(109,92,231,.55); }
.plan-page .plan-overall-nd.is-now { width: 12px; height: 12px; margin: -6px 0 0 -6px; background: #f59e0b;
  box-shadow: 0 0 0 2px #fff, 0 0 0 6px rgba(245,158,11,.20); animation: planNdNow 1.7s ease-in-out infinite; }
.plan-page .plan-overall.is-done .plan-overall-nd { background: #0e9f6e; box-shadow: 0 0 0 2px #fff, 0 1px 5px rgba(16,185,129,.5); }
.plan-page .plan-overall.is-done .plan-overall-nd.is-now { background: #0e9f6e; animation: none; width: 8px; height: 8px; margin: -4px 0 0 -4px; }
@keyframes planNdNow { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.25); } }
[data-theme="dark"] .plan-page .plan-overall-nd { background: #0f1428; box-shadow: 0 0 0 2px rgba(120,130,170,.6); }
[data-theme="dark"] .plan-page .plan-overall-nd.is-done { background: #9b8bff; box-shadow: 0 0 0 2px #0f1428, 0 1px 5px rgba(109,92,231,.6); }
[data-theme="dark"] .plan-page .plan-overall-nd.is-now { background: #fbbf24; box-shadow: 0 0 0 2px #0f1428, 0 0 0 6px rgba(251,191,36,.20); }
/* ========== v1.5.57 登录页改版：极简留白版（产品在 5 版大厂风格渲染图里选定 V1 加强版） ==========
   作用域严格限定在 .auth-wrap 内，其它页面/控件零影响。
   撤掉：「推荐」徽章 / 卡片标题「微信一键登录」/ 三条卖点 / 独立一行的协议链。
   保留：微信一键登录 + 先随便逛逛 + 主动勾选同意（两颗协议链接留在勾选行）+ 免责声明。
   版式：品牌区 → 弹性留白 → 主按钮 → 次按钮 → 勾选行 → 免责声明；一屏放满，不滚动。 */
.auth-wrap {
  min-height: 100%; justify-content: flex-start;
  padding: 112px 32px 42px; box-sizing: border-box;
}
.auth-wrap .auth-head { text-align: center; }
.auth-wrap .auth-logo-icon { width: 92px; height: 92px; margin: 0 auto; }
.auth-wrap .auth-logo {
  margin-top: 26px; font-size: 28px; font-weight: 700;
  letter-spacing: 4px; line-height: 1.2; text-align: center;
}
.auth-wrap .auth-sub {
  margin-top: 14px; font-size: 12px; font-weight: 400; letter-spacing: .3px;
  line-height: 1.4; color: #6b7390; text-align: center;
}
.auth-wrap .auth-spacer { flex: 1 1 auto; min-height: 24px; }

/* 主按钮：实心主题色胶囊（覆盖 1403 行的扁平小阴影版） */
.auth-wrap .btn-primary {
  height: 54px; border-radius: 999px;
  font-size: 16px; font-weight: 600; letter-spacing: .5px;
  background: #6d5ce7; background-image: none; border: none;
  box-shadow: 0 10px 24px rgba(109,92,231,.26);
}
.auth-wrap .btn-primary:hover { transform: none; filter: brightness(1.04); box-shadow: 0 12px 28px rgba(109,92,231,.32); }
.auth-wrap .btn-primary:active { transform: translateY(1px); box-shadow: 0 6px 16px rgba(109,92,231,.24); }

/* 次按钮：白胶囊 + 极轻描边（覆盖 1445 行的扁平版）
   UX-0926-03：高度 52px → 54px，与主按钮齐平（三处按钮统一口径：主 54 / 次 54 / 胶囊） */
.auth-wrap .btn-ghost {
  height: 54px; margin-top: 12px; border-radius: 999px;
  font-size: 16px; font-weight: 600; letter-spacing: .3px;
  background: #ffffff; color: #1a1f36;
  border: 1px solid rgba(124,92,240,.16); box-shadow: none;
  backdrop-filter: none; -webkit-backdrop-filter: none;
}
.auth-wrap .btn-ghost:hover { background: #ffffff; border-color: rgba(124,92,240,.28); transform: none; }

/* 勾选行：整组居中（合规项，字号不缩水） */
.auth-wrap .login-consent {
  justify-content: center; align-items: center; gap: 7px;
  margin: 26px 0 0; padding: 0 2px;
  font-size: 12px; line-height: 1.6; color: #5a6178; text-align: center;
}
.auth-wrap .login-consent span { flex: 0 1 auto; }
.auth-wrap .login-consent input[type="checkbox"] { margin-top: 0; width: 16px; height: 16px; min-width: 16px; }
.auth-wrap .login-consent a { color: #6d5ce7; }

/* 免责声明：去卡去底，只留两行淡字 */
.auth-wrap .disclaimer {
  margin-top: 16px; padding: 0; border: none; border-radius: 0;
  background: none; backdrop-filter: none; -webkit-backdrop-filter: none;
  font-size: 11px; line-height: 1.75; letter-spacing: .2px;
  color: #6b7390; text-align: center;
}

/* 暗夜配对 */
[data-theme="dark"] .auth-wrap .auth-sub { color: #a8b0c8; }
[data-theme="dark"] .auth-wrap .btn-primary { background: #6f62e6; box-shadow: 0 10px 24px rgba(0,0,0,.36); }
[data-theme="dark"] .auth-wrap .btn-primary:hover { box-shadow: 0 12px 28px rgba(0,0,0,.42); }
[data-theme="dark"] .auth-wrap .btn-ghost {
  background: rgba(255,255,255,.06); color: #eef1ff; border-color: rgba(255,255,255,.14);
}
[data-theme="dark"] .auth-wrap .btn-ghost:hover { background: rgba(255,255,255,.10); border-color: rgba(255,255,255,.22); }
[data-theme="dark"] .auth-wrap .login-consent { color: #a8b0c8; }
[data-theme="dark"] .auth-wrap .login-consent a { color: #c4b2ff; }
[data-theme="dark"] .auth-wrap .disclaimer { background: none; border: none; color: #a8b0c8; }
/* ============================================================================
   v1.5.58 · 回忆 → 时间轴：卡片间距收紧 + 两种状态星统一
   ----------------------------------------------------------------------------
   产品口径（2026-09-25，台账 docs/27 REQ-0925-06）：
     ① 「已错过」那三个字看着像在挨骂 —— 状态收成两种：过去的都叫「已赴星」，
        将来的都叫「待赴星」。已赴星 = 实心四角星，待赴星 = 空心四角星，
        两颗星共用同一条外轮廓（icons.js 的 starMark），逐点重合、同尺寸。
     ② 卡片内容一条不许减、卡片内部行高不许再压紧；要压的只是「卡与卡之间」。
   只动时间轴这一块 —— 页头 / 页签 / 三格统计（四个页签共用，故意放在交换区之外）一处没碰：
     · 年份从「独立一行 .tl-sec-head」并进每个节点的日期行 → 每场省整整一行；
     · .tl-node 下间距 12 → 6；日期行改 flex 对齐（行高 22.9 → 15）；
     · 顺手补齐以前压根没写过的样式：.tl-card-top / .tl-chip / .tl-tag / .tl-cal
       （旧版这几个 class 在 CSS 里查无此条，胶囊没圆角、票根签没底色，正是产品说的「丑」）。
    实测（430 宽 · Pro Max · 无头 Edge 真样式，改前 → 改后）：卡片 114.3 → 108.6px，节距 182.9 → 132.7px。
    为什么没做到「一屏 5 场」：页头（标题 + 年度册横幅 + 页签 + 说明行 + 三格统计）到第一张卡顶有 290px，
    而 5 张卡本身就要 4×132.7 + 108.6 = 639px，首屏（到底部悬浮导航上沿 869.9）只有 579px，差约 60px；
    要继续塞只能砍卡片内容或压页头，两条都跟上面的产品口径冲突，故不做（见 docs/27 待办）。
   ============================================================================ */
.tl-date{display:flex;align-items:center;gap:5px;font-size:11px;line-height:1.2;margin-bottom:3px}
.tl-cal{display:inline-flex;align-items:center;color:#6b7390}
.tl-cal svg{display:block}
.tl-year{
  font-size:12px;font-weight:700;letter-spacing:.4px;line-height:1.15;
  background:linear-gradient(120deg,#3a56d4,#7c5cf0 60%,#a855f7);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}
[data-theme="dark"] .tl-year{background:linear-gradient(120deg,#9fb6ff,#b79bff 60%,#e0a2ff);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.tl-md{font-size:11px;font-weight:600;letter-spacing:.2px;color:#6b7390}
.tl-sec-count{margin-left:auto;font-size:11px;font-weight:700;line-height:1.3;letter-spacing:.4px;padding:2px 8px;border-radius:999px;background:rgba(124,92,240,.12);color:#6d5ce7}
.tl-node{padding-bottom:6px}
.tl-card-top{display:flex;gap:8px;line-height:1.25}
.tl-artist{flex:1;min-width:0;font-size:14px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tl-chip{display:inline-flex;align-items:center;gap:4px;flex:none;color:#fff}
.tl-chip svg{display:block;flex:none}


.tl-meta{display:flex;align-items:center;gap:4px;font-size:11px;line-height:1.3;color:#6b7390;margin-top:3px}
.tl-meta svg{display:block;flex:none}
.tl-tags{display:flex;align-items:center;gap:6px;margin-top:5px;line-height:1.2}
.tl-tag{display:inline-flex;align-items:center;gap:3px;font-size:11px;font-weight:700;line-height:1.3;padding:3px 8px;border-radius:12px}
.tl-tag svg{display:block;flex:none}
.tl-tag.tk{background:rgba(124,92,240,.10);color:#6d5ce7}
.tl-tag.mem{color:#4a6cf7}
.tl-open{
  gap:5px;margin:6px 0 0;padding:5px 11px;font-size:11px;font-weight:700;color:#5b4bd6;
  
  
}
.tl-open svg{width:11px !important;height:11px !important}
.tl-open svg:last-child{width:12px !important;height:12px !important}
/* 导轨圆点：将来 = 空心环，过去 = 实心渐变 */
/* ⚠️ 原来这两条都漏了：全仓（含线上）从来没有一条 .tl-node::before 写过 content，
   也没有一条写过 position —— 而 CSS 规范里 content:none 的伪元素**根本不生成**，
   所以线上时间轴的状态圆点一直没显示过（只剩一根导轨线）；
   就算生成了，没有 position:absolute 白圈也不会落到导轨上。两条都补上（left/top/width/height/border-radius
   也一并写进来，不再依赖 styles-v130.css 里那两份互相覆盖的旧声明）。
   box-sizing 也得单独写：* 那条选择器管不到 ::before，13px 宽 + 2.5px 边框会变成 18px，圆点会明显偏大。 */
.tl-node::before{content:'';position:absolute;left:-23px;top:1px;width:13px;height:13px;border-radius:50%;z-index:1;box-sizing:border-box;background:#fff;border:2.5px solid #7c5cf0;box-shadow:0 0 0 2px rgba(124,92,240,.16),0 0 10px rgba(124,92,240,.35)}
.tl-node.done::before{background:linear-gradient(135deg,#7c5cf0,#a855f7);border-color:#fff;box-shadow:0 0 0 2.5px rgba(124,92,240,.18),0 2px 8px rgba(124,92,240,.35)}
[data-theme="dark"] .tl-cal{color:#a8b0c8}
[data-theme="dark"] .tl-md{color:#a8b0c8}
[data-theme="dark"] .tl-sec-count{background:rgba(139,122,246,.16);color:#c4b2ff}
[data-theme="dark"] .tl-tag.tk{background:rgba(139,122,246,.16);color:#c4b2ff}
[data-theme="dark"] .tl-tag.mem{background:rgba(107,133,255,.16);color:#6b85ff}
[data-theme="dark"] .tl-meta{color:#a8b0c8}
[data-theme="dark"] .tl-open{
  color:#c4b2ff;
  
}
[data-theme="dark"] .tl-node::before{background:#101226;border-color:#8c7bf5}
[data-theme="dark"] .tl-node.done::before{background:linear-gradient(135deg,#7c5cf0,#a855f7);border-color:#101226}
/* ============================================================================
   v1.5.59 · 回忆 → 时间轴：两个板块（待赴星在上 / 已赴星在下）+ 每场三行
   ----------------------------------------------------------------------------
   产品口径（2026-09-25，台账 docs/27 REQ-0925-07；渲染稿由产品在浏览器里逐版确认后才施工）：
     ① 状态签改「描边小签」——v1.5.58 那版白字渐变实心签产品说「太刺眼」；
        星星与文字同色（都走 currentColor），描边用主题紫的淡色。
     ② 新增「事实摘要」行：开演时间 / 座位 / 已花金额。有什么写什么，凑不出来整行不出现。
        原来打算放「备注」，但线上 199 场里只有 1 场写过备注，等于永远空着 —— 故放弃。
     ③ 「还有多少天 / 已过去多少天」挪到地址那一行右侧：原来它自己占一行、右下角空着半行
        （根因是状态签那一列把第一行撑到 37px，标题只占 17px），挪过来正好把空白填掉。
     ④ 分组：待赴星在上、已赴星在下，各带小标题与场次数；组内按日期倒序（最近的先）。
        分组后年份导轨从「一年一条」改成「一组一条」。
     ⑤ 没写日期的场次不进时间轴（原来那个「未排期」分组取消）。
   只动时间轴这一块 —— 页头 / 页签 / 三格统计 / 纪念票 / 花费明细 / 足迹地图一处没碰。
   实测（430 宽 · Pro Max · 无头 Edge 真样式）：卡片高 158.8px，首屏 3 场整 + 第 4 场露一半
   （与 v1.5.58 持平）。「一屏 5 场」没做到的原因见 v1.5.58 那段注释，同一条结论。
   ============================================================================ */
.tl-group{margin-bottom:14px}
.tl-group-h{display:flex;align-items:center;gap:7px;padding:0 2px 7px;border-bottom:1px solid rgba(124,92,240,.12);margin-bottom:10px}
.tl-group-t{font-size:12px;font-weight:700;letter-spacing:.4px;color:#5a6178}
.tl-group-n{font-size:11px;font-weight:700;line-height:1.3;padding:2px 8px;border-radius:999px;background:rgba(124,92,240,.10);color:#6d5ce7}
.tl-group-h.up{border-bottom-color:rgba(139,136,166,.18)}
.tl-group-h.up .tl-group-t{color:#6b7390}
.tl-group-h.up .tl-group-n{background:rgba(139,136,166,.12);color:#6b7390}
/* 状态签：描边小签（去渐变、去投影），星星跟着文字同色 */
.tl-chip{font-size:11px;font-weight:700;letter-spacing:.2px;line-height:1.25;padding:3px 9px 3px 7px;border-radius:999px}
.tl-chip.done{background:transparent;border:1px solid rgba(124,92,240,.45);color:#5b4bd6;box-shadow:none}
.tl-chip.up{background:transparent;border:1px solid rgba(139,136,166,.45);color:#6b7390;box-shadow:none}
/* 第一行只放「标题 + 状态签」，不再被右边的两行撑高 —— 下面那一行空白就是这么来的 */
.tl-card-top{align-items:center}
/* 第二行：地址在左、时间差在右，同一行，空白被填掉 */
.tl-sub{display:flex;align-items:center;gap:8px;margin-top:5px}
.tl-sub .tl-meta{flex:1;min-width:0;margin-top:0;font-size:11px;color:#6b7390}
.tl-metatxt{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tl-since{flex:none;font-size:11px;font-weight:600;letter-spacing:.2px;color:#6b7390}
.tl-since.up{color:#6b7390}
/* 第三行：事实摘要；金额用主题色渐变 + 加粗（跟「花费明细」页同一个用法） */
.tl-facts{margin-top:6px;font-size:11px;line-height:1.5;color:#6b7390;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tl-money{font-size:11px;font-weight:700;letter-spacing:0;font-variant-numeric:tabular-nums;
  background:linear-gradient(135deg,#4a6cf7,#8b5cf6);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
/* 待赴星那一组的导轨淡一点，跟灰色的状态签配对（已赴星那组仍是紫色主题导轨） */
.tl.up::before{width:2px;background:linear-gradient(to bottom,rgba(139,136,166,.45),rgba(139,136,166,.08));box-shadow:none}
[data-theme="dark"] .tl-group-h{border-bottom-color:rgba(139,122,246,.18)}
[data-theme="dark"] .tl-group-t{color:#c4b2ff}
[data-theme="dark"] .tl-group-n{background:rgba(139,122,246,.16);color:#c4b2ff}
[data-theme="dark"] .tl-group-h.up .tl-group-t{color:#a8b0c8}
[data-theme="dark"] .tl-group-h.up .tl-group-n{background:rgba(139,136,166,.16);color:#a8b0c8}
[data-theme="dark"] .tl-chip.done{background:transparent;border-color:rgba(160,140,255,.5);color:#c4b2ff}
[data-theme="dark"] .tl-chip.up{background:transparent;border-color:rgba(160,158,190,.42);color:#a8b0c8}
[data-theme="dark"] .tl-since{color:#a8b0c8}
[data-theme="dark"] .tl-since.up{color:#a8b0c8}
[data-theme="dark"] .tl-facts{color:#a8b0c8}
[data-theme="dark"] .tl-money{background:linear-gradient(135deg,#a6baff,#c4b2ff);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
[data-theme="dark"] .tl.up::before{background:linear-gradient(to bottom,rgba(139,136,166,.38),rgba(139,136,166,.06))}

/* ===== 卡片圆角统一（UX-0925-07 · 2026-09-25）=====
   背景：页面级卡片的圆角散落在 22/20/19/18/16/15/14/13/12 共 9 档，横跨 3 个样式表靠特异性互相覆盖。
   例：styles-v130.css 的 .xh-feed .xh-card{14px} 用「后代选择器」的特异性压掉了 v200 后面写的 .xh-card{18px}；
        .community-banner 则是 v130/v200 各写了一条 !important（12px / 13px）。同一屏里同时出现 13/14/15/16/18/22，
        就是反馈里「不像一套东西」的根源。
   做法：收敛成一个令牌，以后改 --card-radius 一个数即全站生效。新增页面级卡片请直接复用，不要再写死数值。
   刻意不动（这些是控件/列表行/卡内小格，不是页面级卡片，跟着改会显笨）：
     .tabbar 22（悬浮导航坞）· .chip 20（胶囊）· .seg 12（分段控件）· .plan-card 14（计划一览行，行高仅 58）
     .stat / .fi / .countdown .unit（卡内小格）· .memt-card 与 .memt-inner（票根造型）· .btn-sm 9（小按钮）
     .disclaimer 12（免责小字；注意登录页 .auth-wrap .disclaimer 是 0，一起改会误伤登录页）
   回滚：删掉本段即可，无副作用。 */

.hero-card,
.card,
.pr-links,
.pr-head,
.concert-card,
.xh-card,
.community-banner,
.recap-banner,
.recap-hero,
.tl-card,
.map-wrap,
.plan-list,
.plan-overall,
.plan-notes,
.search-box { border-radius: var(--card-radius) !important; }

/* ============================================================================
   v1.5.75 · 全站按钮统一层（F 版语言）
   ----------------------------------------------------------------------------
   口径：只改「外观」，不动任何逻辑 / 不改尺寸 / 不改字号字重 / 不动 DOM。
     ① 圆角只留三档：胶囊 999（所有可点控件）· 卡片 --card-radius 18 · 小图标底 12（本来就合规）
     ② 主按钮 = 品牌渐变 var(--grad-brand) + 白字 + 柔影（压掉玻璃高光的硬边）
     ③ 次按钮 = 淡紫底 + 紫字 + 无描边（原来是白底 + 灰描边 + 深字）
     ④ 危险   = 淡红底 + 红字（原来是白底描边，全程序只有抽屉一处是红的）
     ⑤ 页面右上「操作位」6 种长相 → 收敛成 1 种（淡紫胶囊）
     ⑥ 小签：未选淡紫底紫字 / 选中实心品牌渐变
     ⑦ 深色主题同步（同一套令牌换值）
   纪律：本段只出现 border-radius / background / border / color / box-shadow /
     字色相关属性，尺寸类（height/min-height/padding/font-size/font-weight）一律不写
     → 零布局位移。追加在文件最末尾，回滚 = 删掉本段。
   ============================================================================ */
:root{
  --grad-brand: linear-gradient(135deg,#4a6cf7 0%,#6d5ce7 52%,#8b5cf6 100%);
  --grad-ai-entry: linear-gradient(100deg,#5865F5 0%,#7C5CF0 52%,#8B5CF6 100%);
  --grad-brand-hi: linear-gradient(135deg,#4a6cf7 0%,#7c5cf0 45%,#a855f7 72%,#ec4899 100%);
  --grad-gold: linear-gradient(135deg,#f5b94e,#f0942e);
  --sheen: linear-gradient(115deg,transparent 30%,rgba(255,255,255,.6) 48%,transparent 62%);
  --card-radius: 18px;
  --fx-pill:999px;
  --fx-soft:rgba(109,92,231,.10);
  --fx-soft-2:rgba(109,92,231,.17);
  --fx-soft-fg:#6d5ce7;
  --fx-soft-fg-2:#5b4bd6;
  --fx-card-bg:#ffffff;
  --fx-hairline:rgba(109,92,231,.30);
  --fx-pill-shadow:0 4px 12px rgba(109,92,231,.22);
  --fx-card-shadow:0 5px 16px rgba(109,92,231,.08);
  --fx-danger-soft:rgba(220,53,69,.10);
  --fx-danger-soft-2:rgba(220,53,69,.18);
  --fx-danger-fg:#dc3545;
}
[data-theme="dark"]{
  --ink-hi:#eef1ff;
  --aurora-1: rgba(96,120,255,.42);
  --aurora-2: rgba(146,102,255,.34);
  --aurora-3: rgba(255,110,170,.2);
  --aurora-4: rgba(255,185,90,.14);
  --ring-hi: rgba(255,255,255,.12);
  --shell-border: rgba(255,255,255,.08);
  --fx-soft:rgba(139,122,246,.16);
  --fx-soft-2:rgba(139,122,246,.26);
  --fx-soft-fg:#c4b2ff;
  --fx-soft-fg-2:#d6c9ff;
  --fx-card-bg:rgba(255,255,255,.05);
  --fx-hairline:rgba(160,140,255,.34);
  --fx-pill-shadow:0 4px 12px rgba(0,0,0,.32);
  --fx-card-shadow:0 5px 16px rgba(0,0,0,.26);
  --fx-danger-soft:rgba(248,113,113,.16);
  --fx-danger-soft-2:rgba(248,113,113,.26);
  --fx-danger-fg:#ff9d9d;
}

/* ---- ① 圆角三档：可点控件一律胶囊 ---- */
.btn, .btn-sm, .btn-block, .edit-pill, .chip, .tkopt, .cat-tab, .cat-option, .recap-year,
.icon-btn, .link-more, .tk-prev-zoom, .search-clear, .bb-back, .back-bar .bb-back, .hc-lay,
.mt-edit, .mt-clean, .mt-show-back, .cbox, .cc-next, .tl-open, .tl-tag, .pi-tag,
.tl-chip, .plan-pill, .mt-pill, .pr-head .btn-sm, .pr-edit .btn, .comment-reply {
  border-radius:var(--fx-pill);
}
.qt, .ht, .qk-row, .more-head { border-radius:var(--card-radius); }

/* ---- ② 主按钮 ---- */
.btn-primary{ background:var(--grad-brand); border:none;
   }




/* ---- ③ 次按钮 ---- */
.btn-ghost{  border:1px solid transparent; color:var(--fx-soft-fg); box-shadow:none; }


[data-theme="dark"] .btn-ghost{  border-color:transparent; color:var(--fx-soft-fg); }


/* ---- ④ 危险 / 删除 ---- */
.btn-danger{ background:var(--fx-danger-soft); border:1px solid transparent;
  color:var(--fx-danger-fg); box-shadow:none; }
.btn-danger:hover{ background:var(--fx-danger-soft-2); }

/* ---- ⑤ 页面右上「操作位」：6 种长相 → 1 种 ---- */
/* v1.9.02 ③（老板：保存按钮扁平化、底色要和外层统一）：顶栏右上动作按钮统一「扁平款」——
   底透明（与顶栏同底）、品牌紫字 700、无渐变 / 无阴影，按压态 rgba(124,92,240,.12)。
   v1.9.03 ②（老板：加上胶囊轮廓）：同一族补 1px 胶囊描边（浅色 rgba(124,92,240,.38) /
   深色 rgba(160,141,255,.45)）+ 圆角 999 —— 尺寸 / 位置 / 字号一律不动（全局 border-box，加描边不位移）。
   作用范围 = .bb-save（保存）+ .edit-pill（编辑 / 年度海报 / 长图 / 导入）这一族顶栏动作钮；
   .tk-prev-zoom / .link-more / .notif-bell 不在顶栏，维持原软底口径不动。
   （复合 .btn 前缀是为了压过 .btn-primary 基底的同级声明。） */
.btn.bb-save, .edit-pill{ background:transparent; color:var(--primary); border:1px solid rgba(124,92,240,.38); border-radius:999px; box-shadow:none; font-weight:700; }
.btn.bb-save:hover, .edit-pill:hover{ background:rgba(124,92,240,.12); box-shadow:none; transform:none; }
.btn.bb-save:active, .edit-pill:active{ background:rgba(124,92,240,.12); box-shadow:none; transform:none; }
.tk-prev-zoom{ background:var(--fx-soft); color:var(--fx-soft-fg); border:none; }
.link-more{ background:var(--fx-soft); color:var(--fx-soft-fg); border:none; }
.notif-bell{ background:var(--fx-soft); color:var(--fx-soft-fg); border:none; }
[data-theme="dark"] .btn.bb-save, [data-theme="dark"] .edit-pill{ background:transparent; color:#c4b2ff; border-color:rgba(160,141,255,.45); box-shadow:none; }
/* v1.9.02 ③（补）：暗色下 .btn-primary 的深色投影要压掉 —— 本选择器 (0,3,0) 高于
   [data-theme="dark"] .btn-primary (0,2,0)，扁平款在暗色也是真扁平。 */
[data-theme="dark"] .btn.bb-save:hover, [data-theme="dark"] .btn.bb-save:active,
[data-theme="dark"] .edit-pill:hover, [data-theme="dark"] .edit-pill:active{ background:rgba(160,141,255,.14); box-shadow:none; }
[data-theme="dark"] .tk-prev-zoom{ background:var(--fx-soft); color:var(--fx-soft-fg); border-color:transparent; }
[data-theme="dark"] .link-more{ background:var(--fx-soft); color:var(--fx-soft-fg); border-color:transparent; }
[data-theme="dark"] .notif-bell{ background:var(--fx-soft); color:var(--fx-soft-fg); border-color:transparent; }

/* ---- ⑥ 返回 / 图标钮 / 搜索清空 ---- */
.bb-back, .back-bar .bb-back{ background:var(--fx-soft); color:var(--fx-soft-fg); border:none; box-shadow:none; }
.back-bar .bb-back:active{ background:var(--fx-soft-2); }
.icon-btn{ background:var(--fx-soft); color:var(--fx-soft-fg); border:none; }
.search-clear{ background:var(--fx-soft); color:var(--fx-soft-fg); }
[data-theme="dark"] .icon-btn{ background:var(--fx-soft); color:var(--fx-soft-fg); }
[data-theme="dark"] .bb-back{ background:var(--fx-soft); color:var(--fx-soft-fg); }

/* ---- ⑦ 筛选小签：未选淡紫底 / 选中实心 ---- */
.chip{ background:var(--fx-soft); border:none; color:var(--fx-soft-fg); }
.chip.active, .chip.active:hover{ background:var(--grad-brand); color:#fff; border-color:transparent; box-shadow:var(--fx-pill-shadow); }
.tkopt{ background:var(--fx-soft); border-color:transparent; color:var(--fx-soft-fg); }
.tkopt.active{ background:var(--grad-brand); color:#fff; border-color:transparent; }
.cat-tab{ background:var(--fx-soft); border:none; color:var(--fx-soft-fg); }
.cat-tab.on{
  transform:none !important; background:var(--grad-brand); color:#fff; border-color:transparent; box-shadow:var(--fx-pill-shadow); }
.cat-option{ background:var(--fx-soft); border:none; color:var(--fx-soft-fg); }
.cat-option.on{ background:var(--grad-brand); color:#fff; border-color:transparent; box-shadow:var(--fx-pill-shadow); }
.recap-year{ background:var(--fx-soft); border:none; color:var(--fx-soft-fg); }
.recap-year.on{ background:var(--grad-brand); color:#fff; border-color:transparent; box-shadow:var(--fx-pill-shadow); }
[data-theme="dark"] .chip{ background:var(--fx-soft); color:var(--fx-soft-fg); }
[data-theme="dark"] .tkopt{ background:var(--fx-soft); color:var(--fx-soft-fg); }
[data-theme="dark"] .cat-tab{ background:var(--fx-soft); color:var(--fx-soft-fg); }
[data-theme="dark"] .cat-option{ background:var(--fx-soft); color:var(--fx-soft-fg); }
[data-theme="dark"] .recap-year{ background:var(--fx-soft); color:var(--fx-soft-fg); }
[data-theme="dark"] .recap-year.on, [data-theme="dark"] .cat-tab.on,
[data-theme="dark"] .cat-option.on, [data-theme="dark"] .chip.active{ color:#fff; }

/* ---- ⑧ 分段切换：淡紫轨道 + 白胶囊 ---- */
.seg{ background:var(--fx-soft); border:1px solid transparent; box-shadow:none; }
.seg button{ color:var(--fx-soft-fg); }
.seg button.on{ background:#fff; color:var(--fx-soft-fg-2); box-shadow:var(--fx-pill-shadow); }



[data-theme="dark"] .seg{ background:var(--fx-soft); }
[data-theme="dark"] .seg button.on{ background:rgba(255,255,255,.16); color:#fff; }
[data-theme="dark"] .sort-row .seg button.on{ background:rgba(255,255,255,.16); color:#fff; }

/* ---- ⑨ 勾选 ---- */
.cbox{ background:var(--fx-card-bg); border:1.6px solid var(--fx-hairline); }
.cbox.on{ background:var(--grad-brand); border-color:transparent; box-shadow:none; }

/* ---- ⑩ 抽屉选项行 / 卡片式可点控件 ---- */
.qk-row{ background:var(--fx-soft); border:none; }
.qk-row.on{ background:var(--fx-soft-2); box-shadow:inset 0 0 0 1.5px var(--fx-soft-fg); }
.qk-row .qk-ic{ background:var(--fx-soft-2); color:var(--fx-soft-fg); }
.qk-row.on .qk-check{ background:var(--grad-brand); }
.qt{ background:var(--fx-card-bg); border:none; box-shadow:var(--fx-card-shadow); }
.ht{ background:var(--fx-card-bg); border:none; box-shadow:var(--fx-card-shadow); }

/* ---- ⑪ 状态标签 ---- */
.tl-tag{ background:var(--fx-soft); color:var(--fx-soft-fg); border:none; }
.tl-tag.tk{ background:var(--fx-soft); color:var(--fx-soft-fg); }
.tl-tag.mem{ background:var(--fx-soft); color:var(--fx-soft-fg); }
.pi-tag{ background:var(--fx-soft); color:var(--fx-soft-fg); }
[data-theme="dark"] .tl-tag.tk, [data-theme="dark"] .tl-tag.mem{ background:var(--fx-soft); color:var(--fx-soft-fg); }

/* ---- ⑫ 跳转 / 展开 ---- */
.cc-next{ background:var(--grad-brand); color:#fff; border:none; }

.tl-open{ border:1.5px solid transparent; box-shadow:none;
  background:linear-gradient(#fff,#fff) padding-box, var(--grad-brand) border-box; color:var(--fx-soft-fg-2); }
[data-theme="dark"] .tl-open{ background:linear-gradient(#1b1d33,#1b1d33) padding-box, var(--grad-brand) border-box; color:var(--fx-soft-fg); }
.more-head{
  -webkit-tap-highlight-color:transparent; background:var(--fx-soft); border:none; }

/* ---- ⑬ 工具钮 / 悬浮加号 / 文字钮 / 深色底上的按钮 ---- */
.map-ctl-btn{ background:rgba(255,255,255,.92); color:var(--fx-soft-fg); border:none; box-shadow:0 4px 12px rgba(31,38,135,.14); }
[data-theme="dark"] .map-ctl-btn{ background:rgba(38,42,70,.92); color:var(--fx-soft-fg); border-color:transparent; }
.fab-add{ background:var(--grad-brand); box-shadow:0 10px 24px rgba(109,92,231,.42); border:none; }
.pr-edit .btn{ background:rgba(255,255,255,.92); color:var(--fx-soft-fg-2); border:none; box-shadow:none; }
.mt-edit{ background:rgba(255,255,255,.88); color:var(--fx-soft-fg-2); border-color:transparent; }
.mt-share-cta{ background:var(--grad-brand); }
.btn-text{ color:var(--fx-soft-fg); }
.up-hint-link{
  text-decoration: underline;
  cursor: pointer; color:var(--fx-soft-fg); }
.detail-action-bar .comment-entry{  color:var(--fx-soft-fg); }
.comment-like:active, .comment-reply:active{ background:var(--fx-soft); }

/* ---- ⑭ 社区操作钮：形状统一，点赞红 / 收藏金 语义保留 ---- */
.action-icon-btn{ background:var(--fx-soft); color:var(--fx-soft-fg); }
.action-icon-btn.active{ background:var(--fx-danger-soft); color:#dc3545; }
.action-icon-btn.fav-active{ background:rgba(245,185,78,.14); color:#f5b94e; }
[data-theme="dark"] .action-icon-btn{ background:var(--fx-soft); color:var(--fx-soft-fg); }
/* ---- ⑮ 漏网补丁：与原规则同特异性 + 写更后 → 覆盖；仍只改外观 ---- */
/* 票种小签（纪念票编辑抽屉） */
form[data-form="ticket"] .chip.tkopt{ background:var(--fx-soft); border-color:transparent; color:var(--fx-soft-fg); }
form[data-form="ticket"] .chip.tkopt.active{ background:var(--grad-brand); color:#fff; border-color:transparent; }
[data-theme="dark"] form[data-form="ticket"] .chip.tkopt{ background:var(--fx-soft); border-color:transparent; color:var(--fx-soft-fg); }
[data-theme="dark"] form[data-form="ticket"] .chip.tkopt.active{ background:var(--grad-brand); color:#fff; border-color:transparent; }

/* 分类选项（编辑抽屉） */
.fx-form .cat-option{ background:var(--fx-soft); border-color:transparent; color:var(--fx-soft-fg); }
.fx-form .cat-option.on{ background:var(--grad-brand); color:#fff; border-color:transparent; }
[data-theme="dark"] .fx-form .cat-option{ background:var(--fx-soft); border-color:transparent; color:var(--fx-soft-fg); }
[data-theme="dark"] .fx-form .cat-option.on{ background:var(--grad-brand); color:#fff; border-color:transparent; }

/* 场次卡「查看详情」 */




/* 分段切换：轨道 14px / 滑块 11px / 10px 三套不齐 → 胶囊 */
.seg{ border-radius:var(--fx-pill); }
.seg button, .seg button.on{ border-radius:var(--fx-pill); }

/* 社区分类条：原尺寸规则用 !important 固化，圆角同步用 !important 才盖得住 */
.cat-tab{
  padding:4px 10px !important; border-radius:var(--fx-pill) !important; }
/* ---- ⑯ 圆角收口：这两处原规则特异性更高（13px / 17px），一并用同档覆盖 ---- */
form[data-form="ticket"] .chip.tkopt{
  padding:8px 14px;
  font-size:12px; border-radius:var(--fx-pill); }
form[data-form="ticket"] .chip.tkopt.active{ border-radius:var(--fx-pill); }
.concert-body .cc-next, .concert-card .cc-next{ border-radius:var(--fx-pill); }
/* ==== v1.5.75 · 全站按钮统一层 结束（以上那一段是「零布局位移」的纯外观层，冒烟有专门一条钉着）==== */

/* ============================================================================
   v1.5.76 · 微调（产品点名的 4 条 + 底部导航选中胶囊顶出导航坞）
   ----------------------------------------------------------------------------
   与上一段不同：这一轮产品明确要求「封面铺满」「主按钮拉宽」「空态两颗等宽」
   「删除改危险色」「导航胶囊不许顶出坞」，所以本段**允许出现尺寸类属性**
   （height / width / margin / padding）。改动仍只在外观与几何层：不改任何逻辑、
   不碰数据；DOM 只在 app.js 的空态容器上加了一个 class（empty-acts）。
   回滚 = 删掉本段（+ 版本号回落 1.5.75）。
   ============================================================================ */

/* ---- ① 行程卡封面：铺满左列（原来固定 88×88 正方形，下面空出一条卡片底色）---- */


/* ---- ② 主按钮扁平化：去掉顶部内高光，投影 8px → 4px ---- */
.btn-primary{ box-shadow:0 4px 12px rgba(109,92,231,.20); }
.btn-primary:hover{ box-shadow:0 6px 16px rgba(109,92,231,.24); }
.btn-primary:active{ box-shadow:0 2px 8px rgba(109,92,231,.18); }
[data-theme="dark"] .btn-primary{ box-shadow:0 4px 12px rgba(0,0,0,.34); }
[data-theme="dark"] .btn-primary:hover{ box-shadow:0 6px 16px rgba(0,0,0,.40); }

/* ---- ③ 主按钮拉宽：左右留白 12px → 6px（404 → 416）
        坑：.btn-block 是 width:100%，光加负边距只会把整条「左移 6px」（右边反而多留 12px），
        必须同时把宽度补 +12px，才是左右对称的拉宽。
        只落在 App 内的 .page 上；登录 / 启动 / 欢迎 / 授权四页在 .auth-wrap 里，不受影响 ---- */


/* ---- ④ 次按钮底色加深一档（0.10 → 0.14），空态那颗才看得出「有底」---- */
.btn-ghost{ background:rgba(109,92,231,.14); }
.btn-ghost:hover{ background:rgba(109,92,231,.20); }
.btn-ghost:active{ background:rgba(109,92,231,.20); }
[data-theme="dark"] .btn-ghost{ background:rgba(139,122,246,.20); }
[data-theme="dark"] .btn-ghost:hover{ background:rgba(139,122,246,.28); }

/* ---- ⑤ 空态两颗等宽居中（产品选 D）---- */
/* v1.9.02 ④（老板：按钮大小需要保持一致）：两枚统一 232×48 · box-sizing:border-box ——
   原来主按钮 48 高 / 次按钮 38 高，截图里一大一小；现在宽高完全一致（探针断言 rect 相等）。 */
.empty-acts .btn{ width:232px; height:48px; box-sizing:border-box; }

/* ---- ⑥ 场次详情「删除这场」：危险色 + 扁平 + 与主按钮同宽 ---- */
.page .btn.btn-ghost[data-act="del-concert"]{ background:var(--fx-danger-soft); color:var(--fx-danger-fg); border-color:transparent; box-shadow:none; margin-left:-6px; margin-right:-6px; }
.page .btn.btn-ghost[data-act="del-concert"]:hover{ background:var(--fx-danger-soft-2); }
[data-theme="dark"] .page .btn.btn-ghost[data-act="del-concert"]{ background:var(--fx-danger-soft); color:var(--fx-danger-fg); }
[data-theme="dark"] .page .btn.btn-ghost[data-act="del-concert"]:hover{ background:var(--fx-danger-soft-2); }

/* ---- ⑦ 行程卡上的「准备清单 / 出发交通 / 翻开回忆」按钮：白胶囊 + 紫字（产品选 C）
        （v1.5.75 把它统一成了品牌渐变，落在同样紫渐变的卡片上，紫压紫看不清）---- */
.concert-card .cc-next{ background:#fff; color:#6d5ce7; border:none; box-shadow:0 2px 8px rgba(28,20,90,.16); backdrop-filter:none; -webkit-backdrop-filter:none; text-shadow:none; }
.concert-card .cc-next svg{
  width:20px !important;
  height:20px !important; background:none; box-shadow:none; padding:0; stroke:#5b4bd6; }
[data-theme="dark"] .concert-card .cc-next{ background:rgba(255,255,255,.94); color:#8b7af6; }
[data-theme="dark"] .concert-card .cc-next svg{ background:none; box-shadow:none; stroke:#5b4bd6; }

/* ---- ⑦b 已赴星（past）卡上的同款按钮：跟 C 版一起变白胶囊
        （原来 v1.5.75 把它压成淡紫底紫字，落在灰紫卡上同样看不清）---- */
.concert-card.past .cc-next{ background:#fff; color:#6d5ce7; border:none; box-shadow:0 2px 8px rgba(28,20,90,.16); }
.concert-card.past .cc-next svg{ background:none; box-shadow:none; padding:0;  }
[data-theme="dark"] .concert-card.past .cc-next{ background:rgba(255,255,255,.94); color:#8b7af6; }

/* ---- ⑧ 底部导航：选中胶囊不再顶出导航坞的圆角
        （原来左右内边距只有 6px，胶囊又被 translateY(-3px) 抬起，左上 / 左下两个圆角
          正好压在导航坞的圆角上，紫色光晕还溢到坞外）---- */
.tabbar{ padding:7px 12px; border-radius:24px; }
.tab.on{ transform:none; }

/* ==== v1.5.76 · 微调 结束 ==== */

/* ============================================================================
   v1.5.77 · 三处点名收口（产品逐张拍板：1.确认 2.确认 3.选 E）
   ----------------------------------------------------------------------------
   ① 行程卡封面回 1:1 —— 撤销 v1.5.76 段里那条 align-self:stretch; height:auto。
      产品原话「这个还是要正方新样式」：封面被铺满左列后拉成 88×102，照片竖向多裁一截。
      回 1:1 后封面 88×88、整块按原基线摆放，左侧上下各留一小条卡片底色（改前已如实渲染给产品看过）。
   ② 首页主卡顶排「调色板」跟「小眼睛」完全同款 —— 原来调色板是白 16% 底 + 内高光，
      比小眼睛（深藏青 24% 底 + 白 45% 描边）明显更亮更「胖」。现在两颗逐项对齐。
      注意：票根那颗 .t-clean 跟 .hc-clean 本来就是同一条规则，本段不碰，所以没有连带影响。
   ③ 本场速办 6 格改用 E 方案「斜向柔光」—— 每格换成自己模块色的极淡斜向渐变底
      （产品说原来 6 格「太单一」）。只改背景 / 图标块尺寸，副文案、进度条、点击行为一律不动。
   ----------------------------------------------------------------------------
   本段只在外观层：不改任何逻辑、不碰 DOM、不碰数据、不动文字排印（字号 / 字重 / 行高）。
   回滚 = 删掉本段（+ 版本号回落 1.5.76）。
   ============================================================================ */

/* ---- ① 行程卡封面：回到 1:1 正方形（撤销 v1.5.76 的「铺满左列」）---- */
.concert-card .concert-cover{  height:88px; }

/* ---- ② 首页主卡顶排「调色板」＝「小眼睛」同款 ---- */
.hc-lay{ background:rgba(14,16,44,.24); border:1px solid rgba(255,255,255,.45); box-shadow:none; backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px); }
.hc-lay:hover{ background:#6d5ce7; border-color:transparent; }
[data-theme="dark"] .hc-lay{ background:rgba(255,255,255,.10); border-color:rgba(255,255,255,.30); }
[data-theme="dark"] .hc-lay:hover{ background:#6d5ce7; border-color:transparent; }

/* ---- ③ 本场速办 6 格 · E 方案「斜向柔光」
        每格用自己模块色的极淡斜向渐变底（左上 17% → 52% 处 5% → 右下白），无描边无投影；
        图标块统一缩到 32px / 圆角 10，实色块保留（第 6 格「更多」也走实色，不再单独淡底）。---- */
.qt-grid .qt .qt-ic{    box-shadow:none; }
.qt-grid .qt:nth-child(1){ background:linear-gradient(150deg, rgba(124,92,252,.17), rgba(124,92,252,.05) 52%, #ffffff 100%); border:none; box-shadow:none; }
.qt-grid .qt:nth-child(2){ background:linear-gradient(150deg, rgba(59,130,246,.17), rgba(59,130,246,.05) 52%, #ffffff 100%); border:none; box-shadow:none; }
.qt-grid .qt:nth-child(3){ background:linear-gradient(150deg, rgba(245,158,11,.17), rgba(245,158,11,.05) 52%, #ffffff 100%); border:none; box-shadow:none; }
.qt-grid .qt:nth-child(4){ background:linear-gradient(150deg, rgba(16,185,129,.17), rgba(16,185,129,.05) 52%, #ffffff 100%); border:none; box-shadow:none; }
.qt-grid .qt:nth-child(5){ background:linear-gradient(150deg, rgba(236,72,153,.17), rgba(236,72,153,.05) 52%, #ffffff 100%); border:none; box-shadow:none; }
.qt-grid .qt:nth-child(6){ background:linear-gradient(150deg, rgba(124,92,252,.17), rgba(124,92,252,.05) 52%, #ffffff 100%); border:none; box-shadow:none; }
.qt-grid .qt:nth-child(6) .qt-ic{ background:#7c5cfc; color:#fff; }

/* ---- ③b 深色主题逐条配对（夜览模式下同一套 E 方案）---- */
[data-theme="dark"] .qt-grid .qt:nth-child(1){ background:linear-gradient(150deg, rgba(124,92,252,.30), rgba(124,92,252,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .qt-grid .qt:nth-child(2){ background:linear-gradient(150deg, rgba(59,130,246,.30), rgba(59,130,246,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .qt-grid .qt:nth-child(3){ background:linear-gradient(150deg, rgba(245,158,11,.30), rgba(245,158,11,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .qt-grid .qt:nth-child(4){ background:linear-gradient(150deg, rgba(16,185,129,.30), rgba(16,185,129,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .qt-grid .qt:nth-child(5){ background:linear-gradient(150deg, rgba(236,72,153,.30), rgba(236,72,153,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .qt-grid .qt:nth-child(6){ background:linear-gradient(150deg, rgba(124,92,252,.30), rgba(124,92,252,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .qt-grid .qt:nth-child(6) .qt-ic{ background:#7c5cfc; color:#fff; }

/* ============================================================================
   v1.5.78 · 六条点名收口（产品逐条拍板：1跟 · 2改 · 3改 · 4改 · 5选B · 6选B）
   ----------------------------------------------------------------------------
   ① 首页四块「跟上」本场速办 6 格的语言 —— 四格统计 / 年度回忆册 / 大家都在聊：
      从「白底 + 实心色块 + 描边」换成 v1.5.77 那套「模块色极淡斜向渐变 + 无描边 +
      图标块 32px / 圆角 10」。「临近待办」本来就在同一套语言里，本段不碰。
      选择器带 .ht-grid / .card.link-card / .hot-mini 前缀（比原规则更具体、且写在最后），
      所以不需要 !important；只有 svg 尺寸要对着原处那条 !important 写。
   ② 行程卡封面在卡内垂直居中（原来贴着卡顶，下面空 43px）。
   ③ 三张行程卡等高：卡片锁 min-height:143px —— 有「巡演主题」副标题的那张不再被撑高
      （实测 143 / 126 / 126 → 全部 143）。副标题照旧显示，只是不再改卡片高度。
   ④ 底部导航整体下移 1/3 身位 = 25px（导航坞高 74px）。再往下就压到系统手势区。
      外面套一层 max(0px, …) 兜底：iPhone（安全区 34px）落在 16px —— 就是产品点头的那一档；
      没有安全区的机型（安卓 / 老 iPhone，env = 0）落在 0px，往下走满 7px 但绝不会被屏幕切掉下半截。
   ⑤ 演唱会详情封面卡 305 → 220px，跟首页那张倒计时卡等高（两页大卡一致）。
      原来 .has-cover 是 aspect-ratio:4/3，所以这里同时把 aspect-ratio 收回 auto。
   ⑥ 回忆「花费明细」改方案 B「主题钱包卡」：总花费那块变紫蓝渐变大卡 + 白字，
      分组卡换淡紫描边 + 极淡渐变底，正文字号按全站档位收一收（34 → 30px 等）。
   ----------------------------------------------------------------------------
   本段只在外观层：不改逻辑、不碰 DOM、不碰数据。回滚 = 删掉本段（+ 版本号回落 1.5.77）。
   ============================================================================ */

/* ---- ① 首页四块跟上速办 6 格 ---- */
.ht-grid .ht:nth-child(1){ background:linear-gradient(150deg, rgba(124,92,252,.17), rgba(124,92,252,.05) 52%, #ffffff 100%); border:none; box-shadow:0 8px 20px rgba(40,45,120,.06); }
.ht-grid .ht:nth-child(2){ background:linear-gradient(150deg, rgba(59,130,246,.17), rgba(59,130,246,.05) 52%, #ffffff 100%); border:none; box-shadow:0 8px 20px rgba(40,45,120,.06); }
.ht-grid .ht:nth-child(3){ background:linear-gradient(150deg, rgba(245,158,11,.17), rgba(245,158,11,.05) 52%, #ffffff 100%); border:none; box-shadow:0 8px 20px rgba(40,45,120,.06); }
.ht-grid .ht:nth-child(4){ background:linear-gradient(150deg, rgba(16,185,129,.17), rgba(16,185,129,.05) 52%, #ffffff 100%); border:none; box-shadow:0 8px 20px rgba(40,45,120,.06); }
[data-theme="dark"] .ht-grid .ht:nth-child(1){ background:linear-gradient(150deg, rgba(124,92,252,.30), rgba(124,92,252,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .ht-grid .ht:nth-child(2){ background:linear-gradient(150deg, rgba(59,130,246,.30), rgba(59,130,246,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .ht-grid .ht:nth-child(3){ background:linear-gradient(150deg, rgba(245,158,11,.30), rgba(245,158,11,.10) 52%, rgba(255,255,255,.03) 100%); }
[data-theme="dark"] .ht-grid .ht:nth-child(4){ background:linear-gradient(150deg, rgba(16,185,129,.30), rgba(16,185,129,.10) 52%, rgba(255,255,255,.03) 100%); }
.ht-grid .ht-ic{ width:32px; height:32px; border-radius:10px; border:none; box-shadow:none; }
.ht-grid .ht-ic svg{ width:17px !important; height:17px !important; }
.card.link-card{ background:linear-gradient(150deg, rgba(124,92,252,.17), rgba(124,92,252,.05) 52%, #ffffff 100%); border:none; box-shadow:0 8px 20px rgba(40,45,120,.06); }
[data-theme="dark"] .card.link-card{ background:linear-gradient(150deg, rgba(124,92,252,.30), rgba(124,92,252,.10) 52%, rgba(255,255,255,.03) 100%); }


.hot-mini{ background:linear-gradient(150deg, rgba(124,92,252,.10), rgba(124,92,252,.03) 52%, #ffffff 100%); border:none; box-shadow:none; }
[data-theme="dark"] .hot-mini{ background:linear-gradient(150deg, rgba(124,92,252,.18), rgba(124,92,252,.06) 52%, rgba(255,255,255,.03) 100%); }

/* ---- ② 行程卡封面在卡内垂直居中 ---- */
.concert-card .concert-cover{ align-self:center; }

/* ---- ③ 行程卡等高（有巡演副标题的那张不再被撑高） ---- */
.concert-card{ min-height:143px; }

/* ---- ④ 底部导航整体下移 1/3 身位 ---- */
.tabbar{ bottom:max(0px, calc(7px + env(safe-area-inset-bottom) - 25px)); }

/* ---- ⑤ 演唱会详情封面卡与首页倒计时卡等高 ---- */
.hero-card.detail-hero.has-cover{ height:220px; aspect-ratio:auto; }

/* ---- ⑥ 回忆「花费明细」→ 方案 B「主题钱包卡」 ---- */
.cost-hero{ background:linear-gradient(140deg,#5b4bd6 0%,#7c5cfc 48%,#a855f7 100%); box-shadow:0 14px 30px rgba(90,70,220,.28); }
/* 深色档必须再写一条同权重的：深色主题里 [data-theme="dark"] .card（0,2,0）比单独一个 .cost-hero（0,1,0）
   更具体，不补的话深色用户的「总花费」会被打回普通深色卡 —— 方案 B 就只对一半人生效。 */
[data-theme="dark"] .cost-hero{ background:linear-gradient(140deg,#5b4bd6 0%,#7c5cfc 48%,#a855f7 100%); box-shadow:0 14px 30px rgba(40,26,110,.5); }
.cost-hero::after{ content:none; }
.cost-hero-label{ color:#ffffff; font-size:11px; }
.cost-hero-num{ font-size:28px; background:none; -webkit-text-fill-color:#fff; color:#fff; }
.cost-hero-sub{ color:#ffffff; font-size:12px; }
.cost-hero-grid{
  grid-template-columns:repeat(3,1fr); border-top:1px solid rgba(255,255,255,.28); }
.cost-hero-grid > div + div{ border-left:1px solid rgba(255,255,255,.28); }
.cost-hero-grid b{ color:#fff; font-size:14px; }
.cost-hero-grid span{ color:#ffffff; font-size:11px; }
.cost-card{ background:linear-gradient(160deg, rgba(124,92,252,.06), rgba(255,255,255,.98) 60%); border:1px solid rgba(124,92,252,.16); box-shadow:none; }
[data-theme="dark"] .cost-card{ background:linear-gradient(160deg, rgba(124,92,252,.16), rgba(26,30,50,.98) 60%); border-color:rgba(124,92,252,.28); }
.cost-head-title{ font-size:12px; }
.cost-head-meta{ font-size:11px; }
.cost-row-top{ font-size:12px; }
.cost-row-val{ color:#6d5ce7; font-weight:700; }
[data-theme="dark"] .cost-row-val{ color:#c4b2ff; }
.cost-row-bar{ height:6px; background:rgba(120,110,220,.14); }
/* ============================================================================
   v1.5.79 · 首页三块「加白色底框」（产品选方案 B · 2026-09-27）
   ----------------------------------------------------------------------------
   背景：首页「本场速办 6 格 / 跟上四格 / 年度回忆册」原来都是「裸」的 ——
     速办卡在 v2.5 被刻意去掉外层白卡（见上方 3b 那条 `.hero-home + .card`），
     四格容器 `.ht-grid` 与年度回忆册各自铺色块；而「大家都在聊」一直有白卡。
     产品对比后点名：把这三块统一到「大家都在聊」那层白框上（方案 B）。
   口径（只加外层框，格子的配色/图标/字号/位置一律不动）：
     白 = 纯白 #ffffff + 极淡紫描边（.11）+ 柔影 + 圆角 18（与 .card 一致）。
     速办卡与四格容器原 padding 是 0，加框后给 11px 12px，不然格子会顶到框边。
   深色档逐条配对：直接复用 [data-theme="dark"] .card 那一套令牌值，
     夜间这三块与「大家都在聊」完全同款。
   回滚 = 删掉本段。
   ============================================================================ */
.hero-home + .card,
.ht-grid,
.card.link-card{
  background:#ffffff;
  border:1px solid rgba(124,92,252,.11);
  box-shadow:0 8px 20px rgba(31,38,135,.05);
  border-radius:18px;
}
.hero-home + .card,
.ht-grid{ padding:11px 12px; }

[data-theme="dark"] .hero-home + .card,
[data-theme="dark"] .ht-grid,
[data-theme="dark"] .card.link-card{
  background:linear-gradient(160deg, rgba(26,31,52,.92), rgba(24,27,48,.94) 55%, rgba(31,26,52,.92));
  border-color:rgba(255,255,255,.09);
  box-shadow:0 0 0 .5px rgba(255,255,255,.04), 0 14px 34px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.09);
}

/* ============================================================================
   v1.5.81 · 七条点名收口（产品 2026-09-27：1.选B / 「234是iPhone机型」/ 6按背景裁剪 / 直接开工）
   ----------------------------------------------------------------------------
   ① 行程卡「没封面」那块的占位色 —— 原来第 3/6/9 张卡漏出的是 styles-v130.css 那条
      3n+3 的青色装饰渐变（有封面的卡被 img 盖住看不见，没封面的一眼就是「一块青」）。
      统一成主题渐变（#7c5cfc → #d946b8）+ 居中实心四角星（白 .94），并把原来那枚话筒
      图标收掉 —— .cc-ico 只在「没有封面」时才存在，所以星星只落在没封面的卡上。
      已赴星（.past）卡不参与（它有自己那层白玻璃底）。
   ②④ iPhone 真机：外壳里那块「原生白底小圆角」是 iOS 给 textfield 外观画的装饰。
      文本类输入框回到「自己不画任何东西」（appearance:none）；同时把左右留白从输入框
      搬到外壳、输入框自己只有一行高 —— 于是「外壳内容盒 = 输入框盒 = 输入框内容盒 =
      文字行盒」四个原点重合，iOS 画光标用的那个原点就落在文字上（不再是外壳左上角）。
      v1.5.43 那条「空框首次聚焦重设一次选区」的保险保留不动。
   ③ 备注（多行）光标被画到框外：textarea 本来就该留着原生外观，从「关原生外观」的名单里摘出来。
   ⑤ 回忆页签：选中胶囊原来是「白底 + 投影」，点一下投影先闪出来（transition .25s）——
      去掉投影、去掉过渡，点哪颗哪颗立刻到位。
   ⑥ 纪念票底缘：原来是「用票纸色在票外画一排半圆」（深色票面落在浅色页面上就是一排黑半圆
      挂在票外面）。改成把票的下缘按同样半径「裁」出半圆缺口 —— 缺口处透出页面背景，
      颜色永远跟着背景走；顺带把打孔线两端各内缩 14px（原来两端各半颗点）、副券那枚二维码拿掉。
   ⑦ 「更多信息」右箭头内缩 5px（旋转 45° 后的外框比行右边界多出 1.4px，看着就是「出框」）。
   只动外观：不改逻辑 / 不改数据 / 不改文案。回滚 = 删掉本段。
   ============================================================================ */

/* ---- ① 行程卡：没封面时的占位（主题渐变 + 实心四角星） ---- */
.concert-card:not(.past) .concert-cover,
.concert-card:nth-of-type(3n+2):not(.past) .concert-cover,
.concert-card:nth-of-type(3n+3):not(.past) .concert-cover{
  background:linear-gradient(150deg,#7c5cfc,#d946b8);
  border:1px solid rgba(255,255,255,.30);
}
.concert-card:not(.past) .concert-cover .cc-ico{
  position:absolute; inset:0; width:auto; height:auto; margin:0;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-2.22 -2.22 204.44 204.44'%3E%3Cpath d='M100 8 C 104 60, 140 96, 192 100 C 140 104, 104 140, 100 192 C 96 140, 60 104, 8 100 C 60 96, 96 60, 100 8 Z' fill='rgba(255,255,255,.94)'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:center; background-size:30px 30px;
}
.concert-card:not(.past) .concert-cover .cc-ico svg{ display:none; }

/* ---- ②④ 输入框外壳：框里干净（只有外壳那圈紫边），光标与字同一个原点 ---- */
.fx-box{
  position: relative;
  width: 100%;
  transition: border-color .18s ease, box-shadow .18s ease, background .18s ease; padding:10px 12px; }
.fx-box > .input.input{
  caret-color: #6d5ce7;
  padding:0; height:18px; min-height:0; line-height:18px;
  -webkit-appearance:none; appearance:none;
}
.fx-box > input.input.input{ flex:1 1 auto; height:18px; min-height:0; line-height:18px; }
.fx-box > select.input.input{ height:18px; line-height:18px; padding:0 22px 0 0; }
.fx-box > input.input[type="date"],
.fx-box > input.input[type="time"],
.fx-box > input.input[type="datetime-local"]{
  flex: 1 1 auto;
  text-align: center; height:18px; min-height:18px; line-height:18px; padding:0; }

/* ---- ③ 多行框（备注等）：把原生外观放回来，光标才回到框内第一行 ---- */
textarea{ -webkit-appearance:auto; appearance:auto; }

/* ---- ⑤ 回忆页签：选中胶囊扁平化（去掉点按瞬间闪出来的投影与过渡） ---- */
.seg button{ transition:none; }
.seg button.on,
[data-theme="dark"] .seg button.on{ box-shadow:none; }

/* ---- ⑥ 纪念票：底缘按背景裁剪（半圆缺口）+ 打孔线两端内缩 + 去掉二维码 ---- */
.memt .mt-stub::after{ display:none; }
.memt .mt-stub::before{ left:14px; right:14px; }
.memt:not(.memt-card) .memt-inner{
  -webkit-mask-image:radial-gradient(circle at 13px 100%, rgba(0,0,0,0) 0 11.4px, #000 12px);
  -webkit-mask-size:26px 100%; -webkit-mask-repeat:repeat-x; -webkit-mask-position:0 0;
  mask-image:radial-gradient(circle at 13px 100%, rgba(0,0,0,0) 0 11.4px, #000 12px);
  mask-size:26px 100%; mask-repeat:repeat-x; mask-position:0 0;
}
.mt-qr{
  pointer-events:none; display:none; }

/* ---- ⑦ 「更多信息」右箭头内缩 5px ---- */
.more-arrow{
  transform:rotate(45deg); margin-right:5px; }

/* ============================================================================
   v1.5.82 ·「已赴星海」行程卡去灰（产品 2026-09-27 在渲染里选定「D · 纯白实心」）
   ----------------------------------------------------------------------------
   产品原话：「行程页面的《已赴星海》sheet，我建议不要灰色」。本地逐项实测后，
   发灰的只有三处，「已赴星海」的卡片底色与结构一个字没动
   （那是产品已定稿的「同语言、仅更沉稳」，本段不碰）：
     ① 没封面时的封面占位 —— 原来是 rgba(255,255,255,.15) 白玻璃底 + 一枚灰白话筒，
        落在紫卡上就是「一块灰紫」；现在与「即将奔赴」同一档：主题渐变 + 白色实心四角星。
     ② 真封面被压灰 —— 原来是 grayscale(.18) brightness(.92)。这条最坑：测试号没封面
        永远看不见，但真实用户每张卡都带封面，全被压暗压灰；现在不再压灰。
     ③ 右上角「已赴星海」小签 —— 原来是 rgba(255,255,255,.18)，在紫卡上是一层灰白；
        提亮到 .28 并把描边从 .34 加深到 .44。
   （顺带把「翻开回忆」那枚相机图标从 #5b4bd6 用到品牌紫 #6d5ce7。那颗胶囊本身就是
     纯白底 + 紫字、不灰，本次只动图标色 —— 深色档原本就是 #5b4bd6 紫，无需配对。）
   只动外观：不改逻辑 / 不改数据 / 不改文案。回滚 = 删掉本段。
   ============================================================================ */

/* ---- ① 封面占位（无封面时）：主题渐变 + 白色实心四角星，收掉原来那枚话筒 ---- */
.concert-card.past .concert-cover{
  background:linear-gradient(150deg,#7c5cfc,#d946b8);
  border:1px solid rgba(255,255,255,.30);
}
.concert-card.past .concert-cover .cc-ico{
  position:absolute; inset:0; width:auto; height:auto; margin:0;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-2.22 -2.22 204.44 204.44'%3E%3Cpath d='M100 8 C 104 60, 140 96, 192 100 C 140 104, 104 140, 100 192 C 96 140, 60 104, 8 100 C 60 96, 96 60, 100 8 Z' fill='rgba(255,255,255,.94)'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:center; background-size:30px 30px;
}
.concert-card.past .concert-cover .cc-ico svg{ display:none; }

/* ---- ② 真封面不再压灰（原来 grayscale(.18) brightness(.92) 把用户上传的图压暗压灰） ---- */
.concert-card.past .concert-cover img{ filter:none; }

/* ---- ③ 状态小签提亮（原来 .18 的白在紫卡上就是灰白） ---- */
.concert-card.past .tag{ background:rgba(255,255,255,.28); color:#fff; border-color:rgba(255,255,255,.44); }

/* ---- ④「翻开回忆」图标用到品牌紫（胶囊本身已是纯白底 + 紫字，不动底色） ---- */
.concert-card.past .cc-next svg{ stroke:#6d5ce7; }


/* ============================================================================
   v1.5.83 · 社区「热门」签加火（重新设计那对签）＋ 帖子详情改成「票根」版式
   ----------------------------------------------------------------------------
   产品 2026-09-27 在本地渲染里逐版挑选，选定的是：
     ① 列表 —— 「1 号」那对签（白玻璃分类签 + 橙实心热门签），并在热门签前加一枚火苗（F1）。
        摆位用产品选定的「热 3」：热门在图上左上、分类在图上左下、图数仍在右下。
     ② 详情 —— 「1 号」票根框架（P1 品牌紫）＋ C 版正文高度：正文限高 108px，超出的在框内
        滑动看完（底部渐隐，不做「硬切」），省下的高度全部让给评论区。
   只动外观：JS 逻辑 / 数据 / 文案一个字没动。回滚 = 删掉本段（并把 xh-hot 里的火苗换回 🔥）。
   ============================================================================ */

/* ---- A. 社区列表：那对签 ---- */
/* 两列瀑布的列内间距 12 → 8（卡片本身更小了，原间距显散） */
.xh-col { gap: 8px; }

/* 社区卡片比页面级大卡更小更密，圆角跟着收一档。
   注意：--card-radius（18px）那一段的 16 条规则都带 !important，所以这里也必须带。 */
.xh-card {
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden; border-radius: 12px !important; }

/* 热门签：图上左上 —— 橙实心 + 前置火苗（火苗由 icons.js 的 flameMark 内联渲染） */
.xh-hot {
  left: 8px; top: 8px; right: auto; bottom: auto;
  padding: 2px 7px; font-size: 11px; font-weight: 700; letter-spacing: .2px;
  background: linear-gradient(135deg, #ff7a45, #ff3b30); color: #fff;
  box-shadow: 0 2px 6px rgba(255, 59, 48, .35);
}
.xh-hot svg { margin-right: 3px; vertical-align: -1.5px; }

/* 分类签：图上左下 —— 白玻璃（原来在左上、深底） */
.xh-cat {
  left: 8px; bottom: 8px; top: auto; right: auto;
  padding: 2px 7px; font-size: 11px; font-weight: 700;
  background: rgba(255, 255, 255, .93); color: #1a1f36; border: none;
  box-shadow: 0 2px 6px rgba(15, 23, 42, .12);
}
/* 图数签：右下角位置沿用原样（padding / 底色不改），这里只钉住位置，免得被上面两条带跑 */
.xh-count { right: 8px; bottom: 8px; left: auto; top: auto; padding: 3px 8px; }

/* ---- B. 帖子详情：票根版式 ----
   卡片壳子收起（原来是白玻璃卡 + 18px 圆角 + 18px 内边距），改由页面自身承载：
   大图通栏在最上，下面依次是作者行 / 标题 / 分类签 + 票号 / 正文。
   评论卡那些选择器（.card / .comment-*）全站通用，所以一律用 :has(.post-detail) 收在本页内，
   免得改到首页、行程、回忆的卡片。 */
.post-detail {
  background: transparent; border: none; border-radius: 0;
  box-shadow: none; padding: 0;
  backdrop-filter: none; -webkit-backdrop-filter: none;
}

/* 大图：通栏（.page 左右各 12px 内边距，用负边距顶出去）、16:10、多图横滑吸附。
   原来详情页是「竖排图墙 + max-height:360px」，一屏放不下三张。 */
.xhd-hero {
  position: relative; margin: 0 -12px 12px; padding-bottom: 16px;
  
}
.post-imgs.detail {
  display: flex; flex-direction: row; gap: 0; margin: 0;
    
}
.post-imgs.detail::-webkit-scrollbar { display: none; }
.post-img.detail {
  flex: 0 0 100%;   
   border-radius: 0;  
}
/* 右下角 1/N：多图才渲染（单图由 JS 直接不出这枚签） */
.xhd-idx {
  position: absolute; left: auto; right: 14px; bottom: 24px;
  color: #fff; font-size: 11px; font-weight: 600; letter-spacing: .3px;
  padding: 2px 10px; border-radius: 999px; background: rgba(109, 92, 231, .9);
}

/* 票号（与分类签同一行的等宽小签，取发帖那天：NO. YYYY-MMDD） */
.xhd-no {
  font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 11px;
  letter-spacing: 1.6px; border-radius: 6px; padding: 2px 8px;
  color: #6d5ce7; border: 1px dashed rgba(109, 92, 231, .5);
}

.post-author-row { margin: 0 0 12px; gap: 9px; }
.post-author-row .avatar-sm { width: 34px; height: 34px; font-size: 12px; }
.post-author-name { font-size: 14px; font-weight: 700; color: #1a1f36; }
.post-time { font-size: 11px; color: #6b7390; }

.post-detail-title {
  font-size: 22px; font-weight: 700; line-height: 1.34; margin: 2px 0 12px;
  background: linear-gradient(120deg, #4a6cf7, #7c5cf0 52%, #d946b8);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.post-cat-row { margin: 0 0 14px; display: flex; align-items: center; gap: 8px; }
.post-cat-row .tag {
  font-family: ui-monospace, Menlo, Consolas, monospace; letter-spacing: 1.6px;
  font-size: 11px; border-radius: 12px; padding: 2px 8px;
  border: 1px dashed rgba(109, 92, 231, .5);
  background: rgba(109, 92, 231, .06); color: #6d5ce7;
}

/* 正文：C 版 —— 限高 108px（约 2 行半），超出的在框内滑动看完。
   底部渐隐是给「还能往下滑」一个视觉交代，避免看起来像被切断。 */
.post-content {
  max-height: 108px; overflow-y: auto; -webkit-overflow-scrolling: touch;
  padding-right: 4px; color: #1a1f36;
  -webkit-mask-image: linear-gradient(180deg, #000 0, #000 80%, rgba(0, 0, 0, .12) 100%);
  mask-image: linear-gradient(180deg, #000 0, #000 80%, rgba(0, 0, 0, .12) 100%);
}

/* 评论卡：贴到票根下面那一档（上间距 16 → 12，评论区整体上提） */

.page:has(.post-detail) .card h3 { font-size: 12px; color: #6d5ce7; }





/* 深色档逐条配对：本段把详情页的卡片壳子收掉了，文字不再压在浅色玻璃上，
   不配对就是「深底深字」。值取自现有的深色令牌，不新造颜色。 */
[data-theme="dark"] .xhd-hero { border-bottom-color: rgba(139, 122, 246, .34); }
[data-theme="dark"] .post-author-name { color: #eef1ff; }
[data-theme="dark"] .post-content { color: #c4b2ff; }
[data-theme="dark"] .post-cat-row .tag { background: rgba(139, 122, 246, .16); border-color: rgba(139, 122, 246, .5); color: #c4b2ff; }
[data-theme="dark"] .xhd-no { color: #c4b2ff; border-color: rgba(139, 122, 246, .5); }
[data-theme="dark"] .page:has(.post-detail) .card {
   border-color: rgba(255, 255, 255, .08); 
}
[data-theme="dark"] .page:has(.post-detail) .card h3 { color: #c4b2ff; }
[data-theme="dark"] .page:has(.post-detail) .comment-item { border-top-color: rgba(255, 255, 255, .08); }

/* 评论正文在 styles.css:1585 被写死成 #2a2f46，全站一直没配过夜间色 —— 本页原来是浅底白卡
   看不出来，收了白卡壳子后实测「深底深字」对比度只有 1.26（等于看不见）。这里补一刀。 */



/* ============================================================================
   v1.5.84 · 帖子详情：评论区对齐小红书（A · 裸列表＋楼中楼）＋ 图片全屏查看（FS2）
   ----------------------------------------------------------------------------
   产品 2026-09-27 在本地渲染里逐版挑选，选定的是：
     ① 评论区 —— 「A」：裸列表（没有卡片白底、没有虚线、没有投影、行与行之间也不加线），
        楼中楼只左缩 42px；
     ② 全屏看图 —— 「FS2」：黑底 + 左上 ✕ + 顶部居中 i / N + 底部圆点 + 双击放大；
   另外三条是产品在同一条需求里点名的：顶部那条白线全站拿掉、详情大图下面那处虚线拿掉、
   评论卡与底部互动栏的白底改回页面默认背景。
   结构上的改动只有评论区（楼中楼按 parentId 渲染）。数据 / 接口 / 文案一个字没动。
   回滚 = 删掉本段（并把 views2.js 的评论模板换回旧版）。
   ============================================================================ */

/* ---- 0. 顶部那条白线：全站拿掉 ----
   来源是 styles.css:1172 的 `border-bottom: 1px solid var(--border-soft)`，浅色档
   --border-soft = rgba(255,255,255,.4)，在浅色底上就是那道白线。产品原话「发现很多页面都有，
   检查一下一起拿掉」，所以按类统一处理 —— 全站 21 处 backBar() 一次覆盖。
   background 一个字不动：styles-v200.css:700 那条「上浅下透明」的渐变是标题压住内容时的
   可读性保障，全删会让标题和内容打架。 */
.back-bar { border-bottom-color: transparent; }
[data-theme="dark"] .back-bar { border-bottom-color: transparent; }

/* ---- 1. 详情页这三处白底 / 虚线一起拿掉 ---- */
/* ① 大图下面那条虚线（v1.5.83 刚加的装饰，产品否掉） */
.xhd-hero { border-bottom: none; }

/* ② 评论卡：白底 + 虚线描边 + 紫色投影一起拿掉 → 回到页面默认背景 */
.page:has(.post-detail) .card {
  background: transparent; border: none; box-shadow: none;
  border-radius: 0; padding: 0; margin-top: 14px;
  backdrop-filter: none; -webkit-backdrop-filter: none;
}
[data-theme="dark"] .page:has(.post-detail) .card {
  background: transparent; border: none; box-shadow: none;
}

/* ③ 底部互动栏：白底 + 顶线拿掉。输入框自己留一枚白色胶囊 —— 一起拿掉的话它就没边了 */
.detail-action-bar {
  background: transparent; border-top: none;
  backdrop-filter: none; -webkit-backdrop-filter: none;
}
.detail-action-bar .comment-entry {
   border: 1px solid rgba(74, 108, 247, .10);
  
}
[data-theme="dark"] .detail-action-bar .comment-entry {
   border-color: rgba(255, 255, 255, .10); color: #a8b0c8;
}

/* ---- 2. 评论区：A · 裸列表（表头下面就是一条条评论，行与行之间不加线） ---- */
.page:has(.post-detail) .card h3 { margin: 0 0 4px; }
.page:has(.post-detail) .comment-item {
  display: flex; gap: 10px; align-items: flex-start;
  padding: 12px 0; border-top: none; border-bottom: none;
}
.page:has(.post-detail) .comment-item .avatar-sm { width: 32px; height: 32px; font-size: 12px; flex: none; }
.page:has(.post-detail) .comment-body { flex: 1; min-width: 0; }
.page:has(.post-detail) .comment-author {
  font-size: 12px; font-weight: 600; color: #6b7390; line-height: 1.45;
}
.page:has(.post-detail) .comment-content {
  font-size: 14px; line-height: 1.55; color: #1a1f36; margin-top: 3px;
}
.page:has(.post-detail) .comment-meta { display: flex; align-items: center; gap: 12px; margin-top: 5px; }
.page:has(.post-detail) .comment-time { font-size: 11px; color: #6b7390; }
.page:has(.post-detail) .comment-reply {
  background: none; border: none; padding: 0; margin: 0;
  font-size: 11px; color: #6b7390; cursor: pointer; line-height: 1;
}
.page:has(.post-detail) .comment-reply:active { color: #6d5ce7; }
.page:has(.post-detail) .comment-like {
  flex: none; display: inline-flex; flex-direction: column; align-items: center; gap: 1px;
  background: none; border: none; padding: 2px 0; cursor: pointer;
  font-size: 11px; color: #6b7390; line-height: 1;
}
.page:has(.post-detail) .comment-like.liked { color: #dc3545; }
/* 楼中楼：整段左缩 42px（= 头像 32 + 间距 10），行距略收，不再套第二层卡片 */
.page:has(.post-detail) .comment-replies { margin-left: 42px; }
.page:has(.post-detail) .comment-item.is-reply { padding: 9px 0; }
.page:has(.post-detail) .comment-item.is-reply .avatar-sm { width: 28px; height: 28px; font-size: 11px; }
.page:has(.post-detail) .comment-item.is-reply .comment-content { font-size: 14px; }

/* 夜间档逐条配对（本段把评论卡的壳子收干净了，不配对就是深底深字） */
[data-theme="dark"] .page:has(.post-detail) .comment-author { color: #a8b0c8; }
[data-theme="dark"] .page:has(.post-detail) .comment-content { color: #c4b2ff; }
[data-theme="dark"] .page:has(.post-detail) .comment-time,
[data-theme="dark"] .page:has(.post-detail) .comment-reply,
[data-theme="dark"] .page:has(.post-detail) .comment-like { color: #a8b0c8; }
[data-theme="dark"] .page:has(.post-detail) .comment-like.liked { color: #ff9d9d; }

/* ---- 3. 图片全屏查看（FS2） ----
   body 级固定层，不走 modal：z-index 160 —— 在页面内容（返回栏 50 / 底部互动栏 120）之上、
   modal 与评论编辑器（200）、toast（300）之下，所以弹窗和提示仍然盖得住它。 */
body.fxv-open { overflow: hidden; }
body.fxv-open #app { overflow: hidden; }
.fxv {
  position: fixed; inset: 0; z-index: 160; background: #000;
  animation: fxvIn .18s ease;
}
@keyframes fxvIn { from { opacity: 0; } to { opacity: 1; } }
.fxv-top {
  position: absolute; top: 0; left: 0; right: 0; z-index: 3;
  display: flex; align-items: center;
  padding: calc(10px + env(safe-area-inset-top)) 14px 10px;
  pointer-events: none;
}
.fxv-close {
  pointer-events: auto; width: 34px; height: 34px; border-radius: 50%;
  border: none; background: rgba(255, 255, 255, .16); color: #fff;
  display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.fxv-close:active { background: rgba(255, 255, 255, .28); }
.fxv-pos {
  position: absolute; left: 50%; transform: translateX(-50%);
  color: #fff; font-size: 12px; font-weight: 600; letter-spacing: .6px;
}
.fxv-track {
  position: absolute; inset: 0; display: flex;
  overflow-x: auto; overflow-y: hidden;
  scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch;
}
.fxv-track::-webkit-scrollbar { display: none; }
.fxv-slide {
  flex: 0 0 100%; width: 100%; height: 100%;
  display: flex; align-items: center; justify-content: center;
  scroll-snap-align: center;
}
.fxv-slide img {
  max-width: 100%; max-height: 100%; object-fit: contain;
  transition: transform .22s ease; user-select: none; -webkit-user-drag: none;
}
.fxv-slide img.zoomed { transform: scale(2.2); }
.fxv-dots {
  position: absolute; left: 0; right: 0; z-index: 3;
  bottom: calc(18px + env(safe-area-inset-bottom));
  display: flex; justify-content: center; gap: 6px; pointer-events: none;
}
.fxv-dots i { width: 6px; height: 6px; border-radius: 999px; background: rgba(255, 255, 255, .45); transition: all .2s; }
.fxv-dots i.on { width: 16px; background: #fff; }

/* ============================================================
   v1.5.85 · 社区列表去「动态类型」签 + 帖子详情底栏去底色（产品 2026-09-27 真机截图）
   只动外观：views2.js 只少了一行 DOM（列表卡片那枚分类签），数据 / 接口 / 路由 / 文案一个字没动。
   回滚 = 删掉本段 + 把那行 <span class="xh-cat"> 加回 views2.js。
   ============================================================ */

/* ① 帖子详情底部那排「框框」一律不要底色 —— 产品原话「逐个框框不要背景色」。
      本段必须排在上面的 ⑭ 段与 v1.5.84 段之后，否则同特异性覆盖不过来。 */

/* 输入框：只去底色与投影，那圈 1px 描边留着 —— 产品说的是「不要背景色」，框还在。 */
.detail-action-bar .comment-entry { background: transparent; box-shadow: none; }
[data-theme="dark"] .detail-action-bar .comment-entry { background: transparent; }

/* 三个圆钮：空闲态透明。
      ⚠️ 必须带 :not(.active):not(.fav-active) —— 「.detail-action-bar .action-icon-btn」与
      「.action-icon-btn.active」同特异性（都是两个类），写成前者会把后者的语义底色一起顶掉，
      点了赞 / 收藏没有任何反馈。带上排除后特异性抬到 0,4,0，顺带不用再写深色档。 */
.detail-action-bar .action-icon-btn:not(.active):not(.fav-active) { background: transparent; }

/* ============================================================================
   v1.5.86 · 社区列表 5 条（产品 2026-09-27 指图确认后直接施工）
   ----------------------------------------------------------------------------
   产品原话：
     ① 该类型下的动态摆放位置同全部类型的
     ② 需要给一个淡淡的紫色背景的样式
     ③ 热门动态需要排最前面，按照最新得到热门标志依次排序
     ④ 这个点赞按钮最好放到最右边去
     ⑤ 单机动态页面进入详情，双击以上就是点赞
   只动社区列表的外观与手势：数据 / 接口 / 路由 / 文案一个字没动。
   回滚 = 删掉本段（并把 views2.js 的社区卡片模板与 after() 手势、app.js 的 like-card 撤掉）。
   ============================================================================ */

/* ② 热门卡：淡淡的紫色底（页面底本来偏淡紫、卡片是纯白，给热门卡一点自己的颜色）。
      只染卡片下半的正文区，封面图照常铺满；描边同时收半个色阶。 */
.xh-card.hot .xh-body { background: linear-gradient(180deg, #faf7ff, #f1ebff); }
[data-theme="dark"] .xh-card.hot .xh-body { background: linear-gradient(180deg, #23203c, #1e1b33); }
.xh-card.hot { border-color: rgba(124, 92, 240, .22); }
[data-theme="dark"] .xh-card.hot { border-color: rgba(139, 122, 246, .28); }

/* ④ 元信息行：改成一行 flex，头像 / 昵称靠左、点赞贴最右。
      v130 里 .xh-like{margin-left:auto} 从写下那天起就没生效过 —— .xh-meta 一直是块级。 */
.xh-meta { display: flex; align-items: center; }


/* ⑤ 点赞胶囊现在是个 <button>（双击卡片也是点它）：抹掉浏览器默认样式，并给出选中态与回弹。 */
.xh-like {
  margin-left: auto;
  border: none; font: inherit; font-size: 11px; line-height: 1; cursor: pointer;
  display: inline-flex; align-items: center; gap: 3px;
}
.xh-like svg { width: 12px; height: 12px; }
.xh-like.liked { color: #dc3545; background: rgba(229, 72, 77, .10); }
[data-theme="dark"] .xh-like.liked { color: #ff9d9d; background: rgba(229, 72, 77, .18); }
@keyframes xhLikePop { 0% { transform: scale(1); } 40% { transform: scale(1.22); } 100% { transform: scale(1); } }
.xh-like.pop { animation: xhLikePop .28s ease; }
/* ============================================================================
   v1.5.87 · 帖子详情 3 条（产品 2026-09-27 指图确认方案后直接施工）
   ----------------------------------------------------------------------------
   产品原话：
     ① 这个图片没展示完整，但是外面是长图…「布局不能改变，尽量适配，如不是适配，
        缩小图片确保图片完整」→ 选「方案 2 · 页面同色淡底」，框尺寸一个字不改；
     ② 需要依次排序，点赞/收藏/链接，但是链接为什么没有底色；
     ③ 点赞的爱心用实体填充（点了才是实心红，不点仍是空心）。
     补充原话：「1选2　2选：按你说的顺序（点赞 → 收藏 → 链接）：--确认　3确认　直接施工上线」
   只动外观与底栏顺序：数据 / 接口 / 路由 / 文案一个字没动。
   回滚 = 删掉本段 + 把 views2.js 底栏那三个按钮的顺序调回原样（版本号回落 1.5.86）。
   ============================================================================ */

/* ① 详情大图：整张完整显示，两侧用页面同色淡底补边。
      框没动 —— 仍是通栏 + 16:10（430 × 269），只把 object-fit:cover 换成 contain，
      所以海报（竖版 3:4 / 长图）不再被裁掉头与票面信息，代价是两侧各留一条补边。
      background-image:none 那一条必须 !important：v1.5.28 的「缩略图铺底（先糊后清）」写的是
      <img style="background-image:url(缩略图);background-size:cover"> 的**行内样式**，行内样式优先于本表任何规则。
      留着它有两条路，都错（本版实测过）：
        · 不动它（cover）→ 缩略图把整个框铺满，两侧补边色根本露不出来；
        · 改成 contain   → 缩略图按自己的宽高比缩放，只要比真图宽就露馅：实测那条 1×1 测试帖的
          缩略图被撑成 269×269，比 3:4 海报的 202 宽，左右各多出 33px 一条颜色不对的窄边。
      代价是慢网下这一块先是一块纯色 —— 换「两侧永远干净的同色底」。 */
.post-img.detail {
     
   background-color: #efeafc;
}
[data-theme="dark"] .post-img.detail { background-color: #23203c; }

/* ② 底栏三个圆钮：空闲态也要有底色。
      产品原话「链接为什么没有底色」—— v1.5.85 按「逐个框框不要背景色」把空闲态抹成了透明，
      这一版把三个钮（点赞 / 收藏 / 链接）都补回一枚淡底：空闲淡紫，点了各自语义色。
      ⚠️ 空闲态必须沿用 v1.5.85 那条**同一条选择器**（:not(.active):not(.fav-active)，特异性 0,4,0）——
         写成 `.detail-action-bar .action-icon-btn`（0,2,0）会被它盖掉，链接的底色就是这个原因没生效。 */
.detail-action-bar .action-icon-btn:not(.active):not(.fav-active) { background: rgba(109, 92, 231, .09); }
[data-theme="dark"] .detail-action-bar .action-icon-btn:not(.active):not(.fav-active) { background: rgba(139, 122, 246, .16); }
.detail-action-bar .action-icon-btn.active { background: rgba(231, 76, 60, .14); color: #dc3545; }
[data-theme="dark"] .detail-action-bar .action-icon-btn.active { background: rgba(229, 72, 77, .22); color: #ff9d9d; }
.detail-action-bar .action-icon-btn.fav-active { background: rgba(245, 185, 78, .20); color: #f5b94e; }
[data-theme="dark"] .detail-action-bar .action-icon-btn.fav-active { background: rgba(245, 185, 78, .24); color: #f5b94e; }

/* ③ 爱心：点了才是实心红，不点仍空心描边。
      fill 打在 <svg> 上（图标库画的是 fill="none" 的描边路径，路径自己没有 fill 属性 →
      继承 svg 的 fill），只命中断言 .active 的点赞钮；收藏那颗星不受影响，仍是描边。
      列表卡片那枚小胶囊（.xh-like.liked）同步实心。 */
.detail-action-bar .action-icon-btn.active svg { fill: currentColor; }
.xh-like.liked svg { fill: currentColor; }
/* ============================================================================
   v1.5.88 · 帖子详情「原图比例 + 沉浸式头图」（方案 B，产品 2026-09-27 拍板）
   背景：v1.5.87 把大图锁在 16:10 框里 contain、两侧补同色底。产品真机看过 4 版补边稿后否掉，
        原话「还是想完全适配上传的图片」，并松口「内容区域可以往让出 1/3 的空间往下移动」，
        在 A（原比例全宽）/ B（原比例 + 沉浸式）/ C（长图封顶）三版里选定 B。
   本版：① 大图彻底按原图比例全宽显示 —— 两侧零补边、图片零裁切；
        ② 沉浸式 —— 大图顶到页面最上（真机＝微信原生导航栏正下方），
           「‹ 帖子详情 / 删除|举报」变成浮在图上的一条浮层，白赚回那一行的 59px；
        ③ 多图帖容器高度跟着「当前这张」走（JS 在 views2.js）。
   回滚 = 删掉本段（含注释），并把 APP_VERSION / ?v= 跳回 1.5.87。
   ============================================================================ */

/* ① 原图比例全宽。
   ⚠️ !important 一个都不能去：上面 v1.5.87 那条同选择器还写着 aspect-ratio:16/10 + #efeafc；
      而且 v1.5.28 的「缩略图铺底」是写在 <img style> 里的**行内样式**，不用 !important 压不住。 */
/* v1.5.94：删掉这里原本的「background-color: transparent !important」与「background-image: none !important」。
     容器在 v1.5.88 已经是**原图比例**，而缩略图与原图同比例（实测 450x600 vs 1020x1360，都是 0.75）
     ⇒ 行内那条「缩略图铺底」现在正是**对的**占位（cover 即精确贴合，不裁不补边）。
     留着这两条 !important 会把占位压死 —— 大图到达前盒子是一整块**透明亮底**，真机上就是「闪白屏」。
     详见文件末尾 v1.5.94 段。 */


/* ② 沉浸式：大图拽到页面最上，返回栏改成浮在图上的一条。
   做法：.page 去掉 9px 上内边距 → .post-detail 用「返回栏实测高度」的负边距把大图顶上去盖住它。
   ⚠️ --fx-bb-h 由 views2.js 量出真实高度写进 <html>（不写死 59px，换机型 / 换字号都不会差一行）。
   ⚠️ .back-bar 必须给 z-index：DOM 里后渲染的 .post-detail 默认会把它盖住。
   ⚠️ 手机微信里页面之上还有一条小程序**原生**导航栏，H5 管不到它 —— 图片只能顶到它正下方；
      要真「钻到导航栏底下」得把小程序壳改成 navigationStyle:custom 重传一次，本版没做。 */
.page:has(.post-detail) { padding-top: 0 !important; }   /* ⚠️ !important 必须有：styles-v130.css:12 那条 `.page{padding:9px 12px 94px !important}` 带 !important */

.page:has(.post-detail) .back-bar { z-index: 5; }

/* ②-b 浮层态：返回栏压在图上时整条换成「上深下透」的暗角，文字转白 + 阴影。
   ⚠️ 这层暗角是给浅色海报兜底的 —— 遇到白底海报，白字没有它就读不出来。 */
.back-bar.bb-over-img { background: linear-gradient(180deg, rgba(10, 8, 22, .44), rgba(10, 8, 22, 0)); }
.back-bar.bb-over-img .bb-title { color: #fff; text-shadow: 0 1px 8px rgba(0, 0, 0, .55); }
.back-bar.bb-over-img .bb-back,
.back-bar.bb-over-img .btn-ghost {
  background: rgba(18, 14, 32, .42); color: #fff; border-color: rgba(255, 255, 255, .24);
  box-shadow: none; backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
}
.back-bar.bb-over-img .btn-ghost:active { background: rgba(18, 14, 32, .6); }

/* ③ 多图：每张图高度不再一样，容器高度由 JS 跟着「当前这张」写。
   ⚠️ align-items 必须显式改成 flex-start —— 默认的 stretch 会把矮图拉到高图那么高（图就变形 / 出边）；
   ⚠️ overflow-y:hidden 也必须有 —— 只写 overflow-x:auto 会让 overflow-y 自动变 auto，
      高图一旦超过容器高度就会在容器内部多出一根竖向滚动条。容器高度永远等于当前这张，所以切不到图。
   v1.6.9：这里的 transition: height .22s 拿掉了。JS 现在按滚动位置**连续插值**写高度（见 views2.js 的 syncIdx），
      高度每一帧都跟着手指走；再叠一层 0.22s 缓动反而变成「滑一下 → 整块慢慢地伸缩一次」，
      就是产品反馈的「滑动卡屏」。连续插值 + 无过渡 = 高度与画面完全同步，一次都不跳。
      回滚 = 把这行换回带 transition 的那版。 */
.post-imgs.detail {
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch; align-items: flex-start; overflow-y: hidden; }
/* ============================================================================
   v1.5.89 · 帖子详情「大图完整 + 上下两栏封死」（产品 2026-09-27 在 5 版渲染稿里选定 V5）
   ----------------------------------------------------------------------------
   背景：v1.5.88 的「沉浸式」用负边距把大图顶到返回栏底下 —— 返回栏是半透明渐隐时还看得见图，
        产品这一版把返回栏改成不透明之后，被盖住的那 59px 就彻底看不见了，真机上看起来
        就像「图片上下被裁了一刀」。
   实测（线上真帖 e8e52c3a…，430×932@2x）：原图 1020×1360 → 渲染 430×573，高度比 1.3333
        与原图完全一致 + object-fit:contain + max-height:none —— CSS 层零裁切，下面也没被切；
        被吃掉的只有顶部 59px（＝返回栏实高）。所以这不是「裁」，是「盖」。
   本版三条（只动展示：接口 / 路由 / data-act / 文案一个字没动）：
     ① 大图不再上拉 —— 去掉 v1.5.88 那条负边距，图完整落在返回栏正下方（评论区整体下移 59px）；
     ② 返回栏整条封死 —— 不透明页面同色 + 底部一道淡分隔线，不再「透着看」；
     ③ 底部互动栏封死 —— 不透明页面同色 + 顶部一道淡分隔线，内容下移 10px
        （内边距 10/10 → 0/20，栏总高一个字不变 → 不引起布局跳动），滚动时正文不再压在输入框上。
   回滚 = 删掉本段（版本号回落 1.5.88）。
   ============================================================================ */

/* ① 大图完整。
      ⚠️ !important 不能去：上面 v1.5.88 段那条**同选择器**写的是 calc(-1 * var(--fx-bb-h, 59px))。
      ⚠️ 也不用把 .page:has(.post-detail){padding-top:0} 改回来 —— 返回栏本身在文档流里，
         它自己就把那 59px 占住了，post-detail 从它下面开始（实测图片顶 = 59px = 返回栏底）。 */
.page:has(.post-detail) .post-detail { margin-top: 0 !important; }

/* ② 返回栏封死。页面同色取「返回栏那一条」的线上实测值 #f1dbe9（与底部同色，上下不会是两块）。
      ⚠️ 顺带把 v1.5.88 的压图态一并钉住：大图不再上拉后 .bb-over-img 实际上不会再触发
         （实测栏中线 29.5 < 图顶 59，判据恒为假），但将来版式再变也不会出现「白字压浅底」。
      ⚠️ 圆钮不写死颜色，仍走 --fx-soft / --fx-soft-fg —— 深浅两档本来就有配对，少改一处少一处风险。 */
.page:has(.post-detail) .back-bar,
.page:has(.post-detail) .back-bar.bb-over-img {
  background: #f1dbe9; 
}
.page:has(.post-detail) .back-bar.bb-over-img .bb-title { color: #1a1f36; text-shadow: none; }
.page:has(.post-detail) .back-bar.bb-over-img .bb-back,
.page:has(.post-detail) .back-bar.bb-over-img .btn-ghost {
  background: var(--fx-soft); color: var(--fx-soft-fg); border-color: transparent;
  backdrop-filter: none; -webkit-backdrop-filter: none;
}
[data-theme="dark"] .page:has(.post-detail) .back-bar,
[data-theme="dark"] .page:has(.post-detail) .back-bar.bb-over-img {
  background: rgba(12, 14, 26, .96); 
}
[data-theme="dark"] .page:has(.post-detail) .back-bar.bb-over-img .bb-title { color: #eef1ff; text-shadow: none; }

/* ③ 底部互动栏封死。内边距 10/10 → 0/20：内容整体下移 10px，栏总高不变。
   （详注见 git 历史 · W-023 样式表瘦身） */
.page:has(.post-detail) .detail-action-bar {
  background: #f1dbe9; border-top: none;
  
   
}
[data-theme="dark"] .page:has(.post-detail) .detail-action-bar {
  background: rgba(12, 14, 26, .96); box-shadow: 0 -1px 0 rgba(255, 255, 255, .07);
  backdrop-filter: blur(22px) saturate(1.2); -webkit-backdrop-filter: blur(22px) saturate(1.2);
}

/* ============================================================================
   v1.5.91 · 三处收口（产品 2026-09-27 在渲染稿里逐条拍板：① 选 B、② 选 A、③ 选 C）
   ----------------------------------------------------------------------------
   ① 帖子详情「返回栏」再薄一档 —— 59px → 45px（圆钮 40 → 32、内边距 9 → 6/6）。
      产品原话「上面还是还再往上去一个档次，显得还是有点宽了」。栏薄了，大图跟着上移 14px。
   ② 底部菜单栏去「白边 / 立体感」（产品原话「不要做这个立体感，标记的三个方向不要有白边，
      同最下面那种感觉」）—— 那道立体感是**两条**画的：一圈 1px 白描边 + 一道白色内高光
      （box-shadow 里的 inset 白线）。两条都去掉，只留外层投影：边没了，悬浮感还在，
      深色档也不会糊成一片。
      ⚠️ 栏总高仍是 74px（全局 box-sizing:border-box，描边不占额外高度）→ 不引起布局跳动。
   ③ 帖子详情底部评论栏整体下移一档（产品原话「整体下来一个档次（参考主页菜单栏预留的空间）」）
      ⛔ v1.5.92 修正（产品 2026-09-27 真机截图报障「底栏四个控件只剩上半截」）：
         初版底内边距写成 max(10px, calc(-16px + env(safe-area-inset-bottom))) —— iPhone 上 ＝ 18px，
         **比安全区（34px）还小**：40px 的圆钮、38px 的输入框，下半截正好落进安全区那一条被吃掉
         （可见 24px ＝ 产品截图量出来的 25px），圆钮上的数字「1 / 0」整颗不见。
         现在改成 calc(16px + env(safe-area-inset-bottom))：iPhone ＝ 50px，内容底边落在安全区上沿上方 16px。
      ⚠️ 这条 ③ 的硬约束（唯一）：**底内边距必须 ≥ env(safe-area-inset-bottom)**。
         小程序壳里 H5 的「布局视口」铺到屏幕最底，可见区却只到安全区上沿 —— 内容落进那 34px 就是看不见；
         本机 Playwright 的 env() ＝ 0，所以这个坑本地永远复现不出来（这正是上一版误判「通过」的原因）。
      ⚠️ 栏总高随之回到 90px（真机可见 90 − 34 ＝ 56px）；下方 .page 的 80px 底预留仍大于可见栏高 → 正文不会被压住。
   ⚠️ 三条都只动展示：接口 / 路由 / data-act / 文案一个字没动。
   ⚠️ 回滚 = 删掉本段（版本号回落 1.5.90）。
   ============================================================================ */

/* ① 返回栏再薄一档（59 → 45） */
.page:has(.post-detail) .back-bar { padding: 6px 12px; min-height: 0; }
.page:has(.post-detail) .back-bar .bb-back { width: 32px; height: 32px; min-width: 32px; min-height: 32px; }
.page:has(.post-detail) .back-bar .btn-ghost {
  height: 32px; min-height: 0; padding: 0 14px;
  display: inline-flex; align-items: center;
}

/* ② 菜单栏去白边 / 去立体感（去白描边 + 去白色内高光，保留外投影；夜间逐条配对） */
.tabbar {
  border: 1px solid transparent;
  box-shadow: 0 20px 46px rgba(31, 38, 135, .16), 0 4px 12px rgba(31, 38, 135, .08);
}
[data-theme="dark"] .tabbar {
  border-color: transparent;
  box-shadow: 0 20px 46px rgba(0, 0, 0, .45);
}

/* ③ 评论栏整体下移一档（与首页导航坞同一条线；v1.5.92 修正：底内边距必须 ≥ 安全区） */

/* v1.5.91 · 三处收口 结束 */

/* ============================================================================
   v1.5.93 · 详情底栏「控件贴顶 / 没居中」（产品 2026-09-28 真机反馈：「你这越改越拉跨了 ——
   整体下来一个档次半个身位；「说点啥」和 3 个按钮内容也没有居中」）
   ----------------------------------------------------------------------------
   根因：v1.5.89 段给了 padding-top: 0，v1.5.91 段 ③ 只补了底内边距（16px）。
        iPhone（安全区 34px）：栏高 = 0 + 内容 40 + 底内边距 50 = 90px，
        但真机「可见带」只有 90 - 34 = 56px ⇒ 控件上方 0px / 下方 16px，看着就是贴顶。
        本地代值复现：Codex封装/qa-0927/probe93.js（改前 0/16 · 改后 8/8）。

   修法：上下都留白，落在可见的 56px 里居中 —— 上 8 / 下 calc(8px + env())，
        iPhone 实得 42px；8 + 40 + 42 = 90px ⇒ 栏高一点没变（不会再跳一下）。
   ⛔ 硬上限：屏幕最底那 34px 是 iPhone 小白条的安全区，控件底一旦落进去就会被裁
      （v1.5.92 的教训）。42 ≥ 34，控件底离安全区上沿还留 8px。

   ② 点赞数：views2.js 用的 class 是 action-num，styles.css 只定义了 .num ——
      它是一颗没有样式的裸 span，被当成 flex 子项堆在图标的下面，把 18px 的心顶高了 7.5px，
      「心」就比旁边的「星 / 分享」高一截（产品说的「3 个按钮内容没居中」）。
      改成绝对定位贴圆底：图标回到圆的几何中心，三个钮就齐了。
      只动样式 —— views2.js / app.js 里的 class 名与取值逻辑一个字没动。

   回滚 = 删掉本段（版本号回落 1.5.92）。
   ============================================================================ */

.detail-action-bar .action-icon-btn { position: relative; }
.detail-action-bar .action-icon-btn .action-num {
  position: absolute; left: 50%; bottom: 2px; transform: translateX(-50%);
  font-size: 11px; line-height: 1; font-weight: 600;
}
/* v1.5.93 · 详情底栏可见带居中 结束 */

/* ============================================================================
   v1.5.94 · 换页「闪白屏」（产品 2026-09-28 原话：「闪屏严重问题：1.社区->帖子详情，
   闪白屏眼睛非常难受　2.贴子详情->社区，　3.其他很多页面也有闪的情况（比如赴星菜单页面
   ->演唱会详情页面等等此类切换）」→「确定问题直接修复上线」）

   病因两条，都发生在「新页面刚被画出来的那几帧」里：

   ① 整页入场动画带了透明度 —— styles.css:172 的 .page{animation: pageIn .35s}，
      而 @keyframes pageIn 的 from 是 opacity: 0（styles.css:176）。
      ⇒ 换页瞬间新页面是**全透明**的，透出来的是外壳那层浅色渐变（亮度约 222），
        而前后两个真实页面只有 134 ~ 206 ⇒ 屏幕先「亮一下」再暗回来，这就是白闪。
      CDP 逐帧实测（线上 v1.5.93 · 430x932 · 游客态 · 亮度取 0~255）：
        · 社区 -> 帖子详情：199.5 -> 220.0（峰值）-> 210.3；整页透明度为 0 的帧 2 帧
        · 帖子详情 -> 社区：134.7 -> 218.9 -> 199.6
        · 六段切换合计：透明度为 0 的帧 15 帧、半透明过渡帧 178 帧
      修法：**入场动画只留位移、不留透明度** —— 内容一亮相就是完全不透明的，
            外壳底色永远没有机会透出来。位移仍是 6px（比原来 8px 更轻），时长 .18s。
      ⚠️ keyframes 另起名字 pageInFlat，不去动 styles.css 里那条 pageIn ——
         本表在 styles.css 之后加载，同特异性 .page 后者胜；.soft-swap .page 特异性更高，
         同路由换参数的「软切换仍然不播动画」这条老行为一个字没变。
      实测（同六段，透明度为 0 的帧 / 半透明帧双双 **0**）：
        峰值不再高过前后两端 —— 赴星->演唱会详情 18.5 -> 8.6、演唱会详情->赴星 18 -> 0、
        回忆->赴星 30.5 -> 12。（剩余那点差值来自内容本身要下载，不是瞬时的白闪。）

   ② 帖子详情的大图在到达前是一整块**透明亮底**。
      v1.5.28 本来就写了「缩略图铺底」（<img style="background-image:url(缩略图)">），
      但 v1.5.87 / v1.5.88 两条 background-image:none !important + background-color:transparent !important
      把它压死了；v1.5.88 之后容器又是**原图比例**，图没到之前盒子是空的。
      ⇒ 进详情页先看到 430x573 的一块亮底，约 0.7s 后大图才出现
        （实测：亮度 209.9 的平台持续约 600ms）。这一块正是产品点名的第 1 条。
      修法：把那两条 !important 删掉（改动落在上面 v1.5.87 / v1.5.88 两段里，就地留了注释）。
      缩略图与原图同比例、容器也是同一比例 ⇒ cover 就是精确贴合，
      两侧不会露出 v1.5.87 当年担心的那种「颜色不对的窄边」。
      实测：社区 -> 详情 +113ms 就已是缩略图（104.5），终值 104.7 —— 那块亮底 600ms 直接归零。

   回滚 = 删掉本段 + 把 v1.5.87 / v1.5.88 两段里那两条 !important 加回去（版本号回落 1.5.93）。
   ============================================================================ */
.page { animation: pageInFlat .18s cubic-bezier(.4, 0, .2, 1); }
@keyframes pageInFlat { from { transform: translateY(6px); } to { transform: none; } }
/* v1.5.94 · 换页闪白屏 结束 */

/* ============================================================================
   v1.5.95 · 帖子详情大图「弱网亮屏」（产品 2026-09-28 同一条「闪屏」反馈的深水区）
   ----------------------------------------------------------------------------
   v1.5.94 修掉的是「整页入场动画带透明度」那条白闪（所有页面都中）。这条是它下面
   还压着的一层 —— 只发生在帖子详情，而且**网越慢越明显**：

   现象（CDP screencast 逐帧 + 只延迟图片请求，线上真实文件实测）：
     · 图片秒回：详情页亮底 4 帧（约 32ms）
     · 图片慢 600ms：亮底持续 645ms
     · 图片慢 1200ms：亮底持续 1249ms  ← 亮多久 = 图片慢多久

   根因：详情页那张大图在图片到达前**盒子高度是 0**。
     · v1.5.88 把大图改成「原图比例全宽」= aspect-ratio:auto + height:auto ——
       高度完全由 <img> 的固有尺寸决定；图没到，固有尺寸未知，高度就是 0。
     · v1.5.28 的「缩略图铺底」是写在 <img style> 里的 background-image ——
       它铺在一个 **0 高的盒子**里，等于没铺（浏览器不会给零高盒子画背景）。
     · 于是这期间那 430x573 的位置露出的是页面自身的浅色渐变（亮度约 218），
       而图片本身偏暗（约 135）⇒ 进详情先亮一大块、图到了再「啪」地暗下来。

   修法：给盒子一条**兜底比例** —— aspect-ratio: auto 3 / 4。
     · auto 关键字是关键：<img> 一旦有了固有比例（图到了），就改用它自己的比例，
       这条兜底只在「还没有固有比例」的那段时间生效，最终版式与 v1.5.88 完全一致；
     · 为什么是 3 / 4：线上帖子大图清一色 3:4（原图 1200x1600 / 1020x1360，
       缩略图 450x600，比例都是 0.750）—— 演唱会海报就是这个比例。
       将来遇到方形或横图，也只是「占位高度先用 3:4 起个头、图到了再回到真比例」，
       仍然严格优于「高度 0」。

   实测（同一台机器、同一张图、只延迟图片请求 1200ms）：
     修前：亮底 14ms → 1242ms（约 1228ms 一直亮）
     修后：亮底 8ms → 40ms（4 帧）之后就是缩略图（134.4）—— 1228ms → 32ms

   为什么不做成「按缩略图真比例占位」：那要在渲染后跑一段 JS 去读缩略图尺寸，
   多一处依赖、多一处能出错的地方；而 3:4 兜底已经把这条白闪消掉 97%，
   且**任何比例下都比现状好**。等真出现方形/横图帖子再按需升级。

   ⚠️ 选择器与 v1.5.88 段完全相同、特异性相同，靠「本表在后、后表胜」生效 ——
      所以本段必须留在文件末尾，v1.5.88 那段历史一行都不用动（便于回溯）。
   回滚 = 删掉本段（版本号回落 1.5.95）。
   ============================================================================ */
.post-img.detail {
  scroll-snap-align: start;
  width: 100% !important;
  height: auto !important;
  max-height: none !important;
  object-fit: contain !important; aspect-ratio: auto 3 / 4 !important; }
/* v1.5.95 · 大图占位比例 结束 */
/* ============================================================================
   v1.5.96 · 社区「现场视频」（2026-10-01）
   ----------------------------------------------------------------------------
   产品口径：加一个「现场视频」分类，上传区域改成「图片 / 视频」，
   并且**上传 / 预览 / 发帖最终效果三处都不分家** —— 视频和照片永远排在同一条里。
   本段只写外观：分类条挤一排、视频格多的那几枚角标、详情页横滑里的视频。
   后端（asset 库 / 上传接口 / Range 出流）与前端行为见 src/images.js、src/api.js、
   app/public/helpers.js 的 VIDEO_* 段。
   ============================================================================ */

/* ① 发布页分类条：5 个挤在一排，放不下就整排一起缩小（不换行、不横向溢出）
   flex:1 1 0 + min-width:0 让「现场视频」和「攻略」等宽，而不是按字数各占一边。
   原来 .cat-select 是 flex-wrap:wrap + padding:8px 20px，第 5 个必然掉到第二行。 */
.fx-form .cat-select { flex-wrap: nowrap; gap: 4px; }
.fx-form .cat-option {
  flex: 1 1 0; min-width: 0;
  padding: 9px 2px; font-size: 11px;
  display: inline-flex; align-items: center; justify-content: center; gap: 3px;
  white-space: nowrap;
}
.fx-form .cat-option .cico { display: inline-flex; flex: 0 0 auto; }
.fx-form .cat-option .cico svg { width: 11px; height: 11px; }

/* 上传区下面那行小字（规格说明） */
.up-hint { font-size: 11px; color: #6b7390; margin-top: 7px; line-height: 1.5; }

/* ② 视频格：和照片格同一个九宫格，只多三样 —— 播放键、时长、上传进度
   （没有封面时给一块渐变兜底，不至于是个白洞） */
.img-preview.img-video { background: linear-gradient(140deg, #2a2f55, #4a3168 55%, #7a4a86); }
.img-preview.img-video img { display: block; }
.vid-play {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 34px; height: 34px; border-radius: 50%;
  background: rgba(255, 255, 255, .94); color: #6d5ce7;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 14px rgba(20, 16, 48, .34); pointer-events: none;
}
.vid-play svg { margin-left: 1px; }
.vid-dur {
  position: absolute; left: 4px; bottom: 4px;
  padding: 1px 6px; border-radius: 7px;
  background: rgba(10, 12, 28, .58); color: #fff;
  font-size: 11px; letter-spacing: .3px; pointer-events: none;
}
.vid-mask {
  position: absolute; inset: 0; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 2px;
  background: rgba(16, 18, 40, .58); color: #fff; pointer-events: none;
}
.vid-mask b { font-size: 14px; font-weight: 700; letter-spacing: .5px; }
.vid-mask span { font-size: 11px; opacity: .78; }

/* ③ 社区列表：带视频的帖子在封面左下角挂一枚播放键（右下角是「N 图」，右上角是「热门」） */
.xh-play {
  position: absolute; left: 8px; bottom: 8px; z-index: 3;
  width: 22px; height: 22px; border-radius: 50%;
  background: rgba(10, 12, 28, .55); color: #fff;
  display: flex; align-items: center; justify-content: center;
  pointer-events: none;
}
.xh-play svg { margin-left: 1px; }

/* ④ 帖子详情：视频就是横滑里的第 1 张，和照片同一条轨道、同一种圆角与宽度。
   必须带 !important —— 文件末尾那条 v1.5.95 的 3/4 兜底比例是 !important，
   而本段在它之后、特异性更高（.post-imgs.detail .post-vid > .post-img.detail），所以本段胜。 */
.post-imgs.detail .post-vid {
  aspect-ratio: auto 16 / 10 !important;
  /* v1.6.12：这条必须带 !important —— 上面 v1.5.88 段 `.post-img.detail` 写的是
     `object-fit: contain !important`（给「长图不裁头」用的），它**同选择器树里也命中 <video>**
     （视频 class = post-img detail post-vid）。本段不带 !important 时就压不过它，
     视频按 contain 摆、上下留黑 —— 产品 2026-10-02 第 1 条那个「上下两道暗带」。
     本段特异性更高（.post-imgs.detail .post-vid = 0,2,1 > .post-img.detail = 0,2,0），
     两边都 !important 时本段胜。行内那句同名声明是双保险（见 views2.js postVidPlayerHTML）。 */
  object-fit: cover !important; display: block;
  /* v1.6.0：起播前那块底图也给一点品牌色，别是一个纯黑/纯灰的空洞 */
  background: linear-gradient(150deg, #241a3d, #3a2a5c 55%, #1a1330);
}
/* v1.5.96 · 现场视频 结束 */

/* ============================================================================
   v1.5.98 · 社区视频上传的真机修复（2026-10-01）
   ----------------------------------------------------------------------------
   真机反馈：① 点了上传视频没反应 ② 拍完视频后点 × 删不掉。
   行为侧的根因都在 app/public/views2.js（类型识别 + 上传进度不再重建 DOM），
   这里只补一件外观上确实说不通的事：删除按钮只有 22px、而且没有 z-index ——
   在视频格上既难点中，上传遮罩那几秒还容易被盖住。放大到 30px 并压到最上层
   （视觉上仍是一枚小圆钮，只是手指够得着了）。
   遮罩 .vid-mask / 播放键 .vid-play 一直是 pointer-events:none，不会挡手，
   这里再给按钮压一层 z-index 只是双保险。
   ============================================================================ */
.img-preview .img-remove {
  width: 30px; height: 30px; top: 2px; right: 2px;
  font-size: 16px; z-index: 6;
}
/* 视频格底色偏深，按钮再压深一点才看得清 */
.img-preview.img-video .img-remove { background: rgba(0, 0, 0, .62); }
/* v1.5.98 · 社区视频上传真机修复 结束 */

/* ============================================================================
   v1.6.0 · 社区视频：进度条 / 预览 / 选封面 / 发布后展示封面（2026-10-01）
   ----------------------------------------------------------------------------
   产品 4 条原话：① 上传的时候没有进度进度条显示 ② 上传页面需要可以预览
   ③ 上传需要可以选封面 ④ 发布到社区后需要展示封面。
   行为侧全在 app/public/views2.js 与 helpers.js，这里只补四种外观：
     ① .vid-bar     上传中那条会走的进度条（原来只有一个百分比数字）
     ② .vid-cover   视频格右下角的「封面」小签
     ③ .vid-ov*     点视频后的全屏预览 + 选封面面板
     ④ .xh-ph-vid   视频帖真没封面时的兜底底图（替掉那块看着像「加载失败」的灰块）
   ============================================================================ */

/* ① 上传进度条：白色、细、圆头。进度未知（浏览器不给总大小）时切 .indet 来回滑动，
   而不是死死停在 0% 假装卡住。 */
.vid-mask .vid-bar {
  width: 74%; height: 4px; border-radius: 99px; margin: 2px 0 1px;
  background: rgba(255, 255, 255, .28); overflow: hidden;
}
.vid-mask .vid-bar i {
  display: block; height: 100%; border-radius: 99px;
  background: #fff; box-shadow: 0 0 8px rgba(255, 255, 255, .85);
  transition: width .18s linear;
}
.vid-mask .vid-bar.indet i { width: 38%; animation: vidBarSlide 1.05s ease-in-out infinite; }
@keyframes vidBarSlide {
  0%   { margin-left: -40%; }
  100% { margin-left: 102%; }
}

/* ② 视频格右下角的「封面」小签（设过封面才出现；左下角是时长） */
.vid-cover {
  position: absolute; right: 4px; bottom: 4px; z-index: 5;
  padding: 1.5px 6px; border-radius: 99px;
  background: rgba(109, 92, 231, .94); color: #fff;
  font-size: 11px; font-weight: 600; letter-spacing: .3px;
  pointer-events: none;
}
/* 视频格本身可点（点开预览），给一个明确的手感 */
.img-preview.img-video { cursor: pointer; }

/* ③ 全屏预览 + 选封面面板。
   浮层要压过同意弹窗（z-index:9500），但仍在裁剪层（10000）之下；
   同时把 toast-root 提到浮层之上 —— 它默认 z-index:300，会被这块浮层整个盖住，
   于是「封面已更新」这种提示就没人看得见了。 */
.toast-root { z-index: 11000; }
.vid-ov {
  position: fixed; inset: 0; z-index: 9800;
  display: flex; flex-direction: column;
  background: #0b0e1c; color: #fff;
}
.vid-ov[hidden], .vid-ov-big[hidden], .vid-ov-fail[hidden], .vid-ov-scrub[hidden] { display: none !important; }
/* 预览开着时底下那一页不许跟着滚 */
body.vid-ov-lock { overflow: hidden; }
.vid-ov-top {
  flex: 0 0 auto; height: 52px; display: flex; align-items: center;
  justify-content: space-between; padding: 0 16px;
}
.vid-ov-x {
  width: 34px; height: 34px; padding: 0; border: none; background: transparent;
  color: #ffffff; font-size: 22px; line-height: 1; cursor: pointer;
}
.vid-ov-t { font-size: 16px; font-weight: 600; }
.vid-ov-gap { width: 34px; }
.vid-ov-stage {
  position: relative; flex: 0 0 auto; margin: auto 12px 0;
  border-radius: 18px; overflow: hidden; background: #16112c;
  aspect-ratio: 16 / 10;
}
.vid-ov-v { display: block; width: 100%; height: 100%; object-fit: contain; background: #16112c; }
.vid-ov-big {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 62px; height: 62px; padding: 0; border: none; border-radius: 50%;
  background: rgba(255, 255, 255, .96); color: #6d5ce7; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 8px 26px rgba(0, 0, 0, .4);
}
.vid-ov-big svg { margin-left: 4px; }
.vid-ov-fail {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 12px 14px; text-align: center; pointer-events: none;
  font-size: 11px; line-height: 1.65; color: #ffffff;
  background: linear-gradient(transparent, rgba(10, 12, 28, .88));
}
.vid-ov-scrub { flex: 0 0 auto; display: flex; align-items: center; gap: 10px; padding: 14px 20px 0; }
.vid-ov-tm { flex: 0 0 auto; font-size: 11px; color: #6b7390; letter-spacing: .4px; }
.vid-ov-rng {
  flex: 1; min-width: 0; height: 26px; background: transparent;
  -webkit-appearance: none; appearance: none;
}
.vid-ov-rng::-webkit-slider-runnable-track { height: 4px; border-radius: 99px; background: rgba(255, 255, 255, .22); }
.vid-ov-rng::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none; width: 15px; height: 15px; margin-top: -5.5px;
  border-radius: 50%; background: #fff; box-shadow: 0 2px 8px rgba(0, 0, 0, .5);
}
.vid-ov-sheet {
  margin-top: auto; background: #141830; border-top: 1px solid rgba(255, 255, 255, .08);
  border-radius: 22px 22px 0 0;
  padding: 16px 20px 26px;
  padding-bottom: calc(26px + env(safe-area-inset-bottom)); /* 别被 iPhone 底部那条横杠压住 */
}
.vid-ov-hd { font-size: 12px; font-weight: 600; margin-bottom: 4px; }
.vid-ov-dc { font-size: 11px; line-height: 1.6; color: #6b7390; margin-bottom: 13px; }
.vid-ov-cur {
  display: flex; align-items: center; gap: 11px; margin-bottom: 14px;
  padding: 9px 11px; border-radius: 14px; background: rgba(255, 255, 255, .06);
}
.vid-ov-th {
  flex: 0 0 auto; width: 52px; height: 52px; border-radius: 10px;
  background-color: rgba(255, 255, 255, .07);
  background-position: center; background-size: cover; background-repeat: no-repeat;
}
.vid-ov-curt { font-size: 12px; font-weight: 600; color: #fff; }
.vid-ov-ok {
  width: 100%; height: 46px; border: none; border-radius: 99px; cursor: pointer;
  background: linear-gradient(135deg, #6d5ce7, #8b7af6); color: #fff;
  font-size: 14px; font-weight: 600; box-shadow: 0 8px 22px rgba(109, 92, 231, .4);
}
.vid-ov-alt {
  width: 100%; height: 44px; margin-top: 10px; cursor: pointer;
  border: 1px solid rgba(255, 255, 255, .22); border-radius: 99px;
  background: transparent; color: #ffffff; font-size: 14px;
}

/* ④ 视频帖真没封面时的兜底底图 —— 用品牌深紫 + 一枚空心四角星，别退回那块看着像
   「加载失败」的灰块（那正是产品说的「社区列表里看不到封面」的观感）。 */
.xh-ph-vid {
  background:
    radial-gradient(120% 90% at 74% 4%, rgba(139, 122, 246, .34), transparent 62%),
    linear-gradient(150deg, #241a3d, #3a2a5c 55%, #1a1330);
}
.xh-ph-vid i { color: #6d5ce7; }
.xh-ph-vid span { color: #6d5ce7; font-weight: 600; letter-spacing: .5px; }
.xh-ph-vid em { color: #6b7390; font-style: normal; font-size: 11px; }
/* v1.6.0 · 视频预览与选封面 结束 */

/* ============================================================================
   v1.6.1 · 帖子详情视频：自绘播放器 + 上传页封面说明（2026-10-01）
   ----------------------------------------------------------------------------
   产品 3 条原话：① 发帖成功后观看体验：样式不好，只保留一个右上角的音量控制开关
                 ② 封面照片不够高清、太模糊
                 ③ 视频的地方需要明确说明「点击视频可设置帖子封面」（补充：写在上传页）
   行为侧全在 app/public/views2.js：① 去掉 <video controls>，控件自己画；
     ② 取帧上限 720 → 1280；③ 上传页视频格下方多一行说明。这里只补外观。
   为什么必须整个去掉 controls：微信 WebView 的原生控件（画中画 / ±10 秒 / 全屏 / 小窗）
   是一整套，既不接受定制、也关不掉单件 —— 想「只留一个声音开关」就只能不用它。
   ============================================================================ */

/* ① 视频格自己当横滑里的一页（视频在里面铺满；比例仍交给 .post-vid 那条 auto 16/10） */
.post-imgs.detail > .vd-wrap {
  flex: 0 0 100%; position: relative; overflow: hidden; scroll-snap-align: start;
  background: linear-gradient(150deg, #241a3d, #3a2a5c 55%, #1a1330);
}
/* ② 底部一点点压暗：白进度条压在高亮画面上才看得见（只有 64px，不糊画面） */
.post-imgs.detail .vd-scrim {
  position: absolute; left: 0; right: 0; bottom: 0; height: 64px; pointer-events: none;
  background: linear-gradient(to top, rgba(8, 6, 20, .5), rgba(8, 6, 20, 0));
}
/* ③ 右上角唯一的一颗按钮：声音开关。默认静音 → 右边是斜杠 */
.post-imgs.detail .vd-mute {
  position: absolute; right: 10px; top: 10px; z-index: 9;
  width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%;
  background: rgba(12, 10, 28, .52); color: #fff;
  display: flex; align-items: center; justify-content: center;
  -webkit-tap-highlight-color: transparent;
}
.post-imgs.detail .vd-mute .vd-mute-off { display: none; }
.post-imgs.detail .vd-mute.is-off .vd-mute-on { display: none; }
.post-imgs.detail .vd-mute.is-off .vd-mute-off { display: flex; }
/* ④ 暂停时才浮出来的播放键（播放中不出现；要能点穿，否则点不动画面） */
.post-imgs.detail .vd-center {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 8;
  width: 54px; height: 54px; border-radius: 50%;
  background: rgba(12, 10, 28, .46); color: #fff;
  display: none; align-items: center; justify-content: center; pointer-events: none;
}
.post-imgs.detail .vd-center.is-on { display: flex; }
.post-imgs.detail .vd-center svg { margin-left: 3px; }
/* ⑤ 底部细进度条：只告诉「走到哪了」，不显示时间 */


/* ⑥ 上传页：选了视频才出现的那行说明（产品要求写在上传页，不写在帖子浏览页） */
.up-hint-vid { color: #6d5ce7; font-weight: 600; }
.up-hint-vid[hidden] { display: none; }
/* v1.6.1 · 帖子详情视频自绘播放器 结束 */

/* ============================================================================
   v1.6.2 · 帖子编辑 + 封面裁剪 + 发布前预览（2026-10-01）
   ----------------------------------------------------------------------------
   产品 3 条原话：① 我作为帖子发布者，既然没有帖子编辑按钮
                 ② 视频在选择封面的时候，要能对封面放大缩小 / 裁剪 / 设置固定比例
                 ③ 发布帖子的页面要有一个按钮，能预览发布后的效果
   行为侧全在 app/public/views2.js（编辑页 / 预览浮层 / 取帧进裁剪）与 app/src/api.js
   （PATCH /api/community/posts/<id>，仅作者）。这里只补四样外观：多出来的「已编辑」小签、
   底部并排的两颗按钮、预览整屏浮层、预览里那一格视频的比例兜底。
   ============================================================================ */

/* ① 详情页「已编辑」小签：跟在「时间 · N 次浏览」后面，一眼看出这条被改过 */
.post-edited {
  display: inline-block; margin-left: 6px; padding: 1px 7px;
  font-size: 11px; font-weight: 600; letter-spacing: .2px; vertical-align: 1px;
  border-radius: 999px; color: #6d5ce7;
  background: rgba(109, 92, 231, .10); border: 1px solid rgba(109, 92, 231, .26);
}
[data-theme="dark"] .post-edited {
  color: #c4b2ff; background: rgba(139, 122, 246, .16); border-color: rgba(160, 140, 255, .34);
}

/* ② 发帖 / 编辑页底部：左「预览」右「发布·保存」等分并排 */
.post-submit-row { display: flex; align-items: center; gap: 10px; margin-top: 16px; }
.post-submit-row .btn { flex: 1 1 0; min-width: 0; }

/* ③ 发布前预览：整屏盖住（和视频浮层同一套手感），底就是正文那层底。
   层级 9900 —— 压过视频浮层（9800）、仍在裁剪面板（10000）之下、toast（11000）之下。
   里面套的是**帖子详情页那一套 DOM 与样式**，所以「预览看到的」=「发出去的」。 */
.pv-mask {
  position: fixed; inset: 0; z-index: 9900;
  overflow-y: auto; -webkit-overflow-scrolling: touch;
  background:
    radial-gradient(1100px 620px at 8% -8%, rgba(140,160,255,.34), transparent 60%),
    radial-gradient(900px 640px at 104% 6%, rgba(205,150,255,.30), transparent 55%),
    radial-gradient(1000px 760px at 60% 112%, rgba(255,164,206,.24), transparent 60%),
    linear-gradient(150deg,#e6e9fb 0%,#e9e6fa 42%,#efe7f8 100%);
}
[data-theme="dark"] .pv-mask {
  background:
    radial-gradient(1100px 640px at 6% -10%, rgba(74,96,204,.35), transparent 60%),
    radial-gradient(900px 660px at 104% 4%, rgba(140,80,216,.26), transparent 55%),
    radial-gradient(1000px 800px at 55% 114%, rgba(214,70,150,.14), transparent 60%),
    linear-gradient(150deg,#070a15 0%,#0a0d1e 48%,#0e1024 100%);
}
.pv-bar {
  position: sticky; top: 0; z-index: 2;
  display: flex; align-items: center; gap: 8px; padding: 11px 14px;
  border-bottom: 1px solid rgba(109, 92, 231, .16);
  background: rgba(255, 255, 255, .9); backdrop-filter: blur(10px);
}
[data-theme="dark"] .pv-bar {
  background: rgba(12, 14, 30, .9); border-bottom-color: rgba(139, 122, 246, .26);
}
.pv-bar b { font-size: 16px; font-weight: 700; color: #1a1f36; }
[data-theme="dark"] .pv-bar b { color: #eef1ff; }
.pv-bar span { font-size: 11px; color: #6b7390; }
.pv-x {
  margin-left: auto; flex: 0 0 auto; width: 30px; height: 30px;
  display: flex; align-items: center; justify-content: center;
  border: none; border-radius: 50%; cursor: pointer; font-size: 14px; line-height: 1;
  color: var(--fx-soft-fg); background: var(--fx-soft);
}
.pv-x:active { background: var(--fx-soft-2); }
/* 预览里那一格视频：静态渲染没有 JS 量高度，比例直接交给 CSS ——
   和详情页那条 auto 16/10 同口径，保证「预览」和「发出去」一样高。 */
.pv-body .post-imgs.detail .post-vid { aspect-ratio: auto 16 / 10 !important; }
/* v1.6.2 · 帖子编辑 + 封面裁剪 + 发布前预览 结束 */

/* ============================================================================
   v1.6.3 · 播放器进度条（默认隐藏 · 点画面才出来 · 能拖）（2026-10-01）
   产品原话：「进度条默认隐藏，只有点击在视频区域才显示，并且需要支持可以拖进度条来
   控制定位视频的播放所在时间」。只改这一块 —— 详情页与发帖页的「预览」共用同一套，
   两处一起生效。

   ① 视觉上还是 3px 那么细（不挡画面），但**触摸区做到 22px**：
      3px 的高度手指根本按不住，这是「拖不动」的头号原因。
   ② 藏着的时候 pointer-events:none —— 不然底部这 22px 会把「点画面暂停 / 继续」吃掉。
      注意 v1.6.1 那段里 `.vd-bar` 原本就是 3px / pointer-events:none / 自带白底，
      这里整组覆盖。
   ③ 拖动时视频先暂停，所以条上带一颗时间气泡（只在拖动时出现）。
       （v1.6.4：原来还有一颗「拖动用的圆点」，按产品要求撤掉了。）
   回滚：删掉本段 —— 自动退回 v1.6.1 的「常亮细条」。
   ========================================================================== */
.post-imgs.detail .vd-bar {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 8;
  height: 22px; background: transparent;
  opacity: 0; pointer-events: none; transition: opacity .18s; touch-action: none;
}
.post-imgs.detail .vd-bar.is-on { opacity: 1; pointer-events: auto; }
/* 那根 3px 的底线（原来靠 .vd-bar 自己的 background，现在挪到伪元素上） */
.post-imgs.detail .vd-bar::before {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 3px;
  background: rgba(255, 255, 255, .26);
}
.post-imgs.detail .vd-bar > i {
  display: block;
  position: absolute; left: 0; bottom: 0; height: 3px; width: 0;
  background: #fff; box-shadow: 0 0 8px rgba(255, 255, 255, .7);
}
/* v1.6.4（产品 2026-10-01 第 1 条「功能不变，这个白色进度条点点不要」）：
   这里原本是一颗跟着播放位置走的白色圆点 —— 整个撤掉。
   拖拽定位照旧（JS 里那两行引用也一并删了），只是不再画那颗点：
   条上的白色填充本身就能看出播到哪儿了。 */
/* 拖动时那颗时间气泡 —— 平时 display:none，拖才出现 */
.post-imgs.detail .vd-tm {
  position: absolute; bottom: 20px; left: 0; transform: translateX(-50%);
  display: none; padding: 2px 8px; border-radius: 10px;
  background: rgba(12, 10, 28, .72); color: #fff; font-size: 11px; line-height: 16px;
  font-style: normal; white-space: nowrap; pointer-events: none;
}
.post-imgs.detail .vd-bar.is-drag .vd-tm { display: block; }
/* v1.6.3 · 播放器进度条 结束 */

/* ============================================================================
   v1.6.4 · 详情底栏整体下移一档（产品 2026-10-01 第 2 条：「下方菜单栏可以整体
   来到 iPhone 的 home 上方一点点就行」）
   ----------------------------------------------------------------------------
   病因：底栏的底内边距是 calc(8px + env(safe-area-inset-bottom))，iPhone（安全区
        34px）实得 42px ⇒ 控件底离屏幕最底 42px；而底部那条导航坞（.tabbar）是
        bottom: max(0px, calc(7px + env() - 25px)) ⇒ 16px。
        两者差着约 26px：从社区切进帖子详情，评论栏会明显「悬得更高」。
   修法：套用导航坞同款写法，把两条落到同一条视觉线上 ——
        max(8px, calc(env(safe-area-inset-bottom) - 18px))：
          · iPhone（34px）得 16px，与导航坞外沿齐平；
          · 浏览器预览（env()=0）得 8px，与改前**一模一样**（没有安全区的环境零变化）。
   ⚠️ 只会往下走 8~26px，不会越过导航坞那条线，也不会比现在的 8px 更低。
   回滚 = 删掉本段（版本号回落 1.6.3）。
   ========================================================================== */



/* ============================================================================
   v1.6.5 · 详情底栏不再另起一块背景（产品 2026-10-01：「D毛玻璃」）
   ----------------------------------------------------------------------------
   病因：底栏原来压着一块纯色 #f1dbe9（见上方 v1.5.89/90 那段），而它底下的
        .phone-shell 是一整片斜向渐变（168deg，淡蓝 → 淡紫 → 淡粉，见文件开头那段）
        再叠 4 层光斑）。纯色盖在渐变上，上沿就成了一条横向色带；再叠一条 1px 描边，
        边界又被描了一遍 —— 这就是产品截图里红框那圈突兀的横向色带。
   修法：不写纯色，改成「透明 → 页面实测底色 rgba(244,217,230,·)」的四段渐变 + 14px 毛玻璃。
        · 上端全透明 ⇒ 与背景无缝，看不到分界；
        · 下端 .97 ⇒ 透过来的评论文字读不出来（v1.5.90 那条「文字重叠」的老毛病不复发）；
        · box-shadow:none 把那条 1px 描边撤掉；
        · 毛玻璃是项目既有能力（与顶栏同款，文件里 99 处），不是新依赖；
          老内核不支持 :has()/backdrop-filter 会整条丢弃，退回「无背景」，
          也就是 v1.5.89 之前的样子，不会画坏。
   ⚠️ 只改浅色档；夜间档仍走上方的深色档（rgba(12,14,26,.96)），本轮不动。
   回滚 = 删掉本段（版本号回落 1.6.4）。
   ========================================================================== */
.page:has(.post-detail) .detail-action-bar {
  background: linear-gradient(180deg, rgba(244, 217, 230, 0) 0%, rgba(244, 217, 230, .42) 34%, rgba(244, 217, 230, .88) 68%, rgba(244, 217, 230, .97) 100%);
  box-shadow: none;
  backdrop-filter: blur(14px) saturate(1.05);
  -webkit-backdrop-filter: blur(14px) saturate(1.05);
}

/* ============================================================================
   v1.6.6 · 详情底栏被安全区吃掉下半截（产品 2026-10-01 真机截图原话：
   「评论区底下菜单栏被裁剪了一半」—— 输入框和三个圆钮只剩上半截）
   ----------------------------------------------------------------------------
   真因：v1.6.4 为了「跟导航坞齐平」，把底内边距写成
        max(8px, calc(env(safe-area-inset-bottom) - 18px))，iPhone 实得 16px。
        16px < 安全区 34px —— 正好踩了 2026-09-27 v1.5.92 立下的那条铁律
        （见上方 v1.5.91 段③：「底内边距必须 ≥ env(safe-area-inset-bottom)」）。
   为什么门槛是 34：底栏是 position:fixed ⇒ 参照的是「布局视口」＝整屏（铺到屏幕最底）；
        可见区却只到安全区上沿 ＝ 离屏幕底 34px。落进那 34px 的东西＝看不见。
        真机截图逐像素实测：可见线恰在离底 34px 处，控件底边在 16px 处 ⇒ 下半截 18px 被吃掉，
        与「只剩上半截」完全吻合。
        导航坞 .tabbar 是 position:absolute ⇒ 参照 .phone-shell 的 100dvh，天然落在可见区里，
        所以它 16px 没事 —— fixed 的底栏不能照抄它的 16px。
   修法：底内边距回到 calc(16px + env(safe-area-inset-bottom))（iPhone = 50px）：
        控件底边落在可见线上方 16px；且 16 + 34 = 50 与导航坞外沿同一条视觉线
        （v1.6.4 想要的「齐平」，这样写才真的成立）。
   ⚠️ 浏览器预览 / 本机 Playwright 的 env() = 0，这个坑本地永远复现不出来 —— 只能靠公式守。
   ⚠️ 只动底内边距：背景（v1.6.5 的渐变 + 毛玻璃）、夜间档、位置一个字没动。
   回滚 = 删掉本段（版本号回落 1.6.5）。
   ========================================================================== */


/* ============================================================================
   v1.6.7 · 详情底栏：整条下移半个身位 + 背景延伸到屏幕外（产品 2026-10-01 23:37 真机）
   ----------------------------------------------------------------------------
   产品原话：「1.整体还需要往下来半个身位；
              2.下面还是感觉有横线，可以直接扩展到下方的屏幕外，横线不要再出现在手机里了」

   ① 整条下移半个身位
      底栏是 position: fixed + bottom: 0 ⇒ **控件落点只由 padding-bottom 决定**
      （padding-top 只决定栏的上沿，动不了控件）。v1.5.93 说的「半个身位」就是把 8px
      从底搬到顶，本轮再搬一次 8px：padding-top 8 → 16、padding-bottom 50 → 42。
      iPhone（安全区 34px）：控件落在 762~802，比改前（754~794）正好下移 8px；
      控件底边离可见线（离屏幕底 34px ⇒ y=810）仍留 8px —— v1.5.93 立的硬下限不破。
      栏高 16 + 40 + 76 = 132px 与「下探 34px + 原栏高 98px」严格等价，整体轮廓没变。

   ② 「下面还是感觉有横线」
      两个来源，都在**元素的下边缘**上：
        · 背景是一条渐变，末段（alpha .88 → .97）正好压在屏幕最底那一小条上；
        · backdrop-filter 在元素下边缘做模糊采样时会被视口边界截断（blur 核取到了屏幕外的空白），
          下边缘因此比它上面一行亮一点点，放大看就是一条横向亮带。
      产品给的方向是对的：**把它推到屏幕外**。做法 = 元素整个往下探 34px（bottom: -34px），
      让「元素下边缘」和「渐变末段」统统落到屏幕之外；控件落点靠底内边距同步 +34px 保持不变。
      再用 background-size 把渐变**只铺在可见的那一段**（100% calc(100% - 34px)，不重复、贴顶），
      所以屏幕里看到的渐变与 v1.6.5/1.6.6 **逐像素一致**，只是它下面多出来的那一截不再进画面。

      另外，旧的四段渐变在 68% 处有一次斜率突变（.0138 → .0029 alpha/px），
      那一下在手机上看就是一条很淡的横向折点（Mach 带），位置正好在屏幕最底那一段。
      本轮把末段拆成六段、斜率逐级递减（.0139 → .0136 → .0102 → .0057 → .0019），
      全程没有折点；各点的 alpha 与旧版相差不超过 .04，观感不变。

   ③ 屏幕外的 34px 也要填住
      第二层（下面那 34px）刷成与渐变末段**完全同一个颜色** rgba(244,217,230,.96)，
      于是渐变末段与它无缝相接，屏幕底那一刀不可能再露出任何分界；
      万一某台机器的安全区比 34px 还大（渐变会提前结束），这一层也把缝补上，
      不会出现「渐变止住、底下露毛玻璃」的新线。

   ⚠️ 夜间档不受影响：深色档走的是纯色 rgba(12,14,26,.96)，它没有渐变；
      它的选择器权重高于本段，background-image 仍是 none，深色块跟着一起下探，边缘同样在屏幕外。
   ⚠️ 只动「位置与背景铺法」：毛玻璃、配色、夜间档、控件尺寸一个字没动。
   ⚠️ 浏览器预览 env() = 0 时同样成立（底内边距 42px、控件照样下移 8px）。
   回滚 = 删掉本段（版本号回落 1.6.6）。
   ========================================================================== */


/* ============================================================================
   v1.6.8 · 帖子详情底栏：那根横线的真凶不是渐变，是 #app 把底栏裁掉了一刀
   （产品 2026-10-02 00:04 真机复验：「1.身位没下来　2.还是有一根隐约能看到的线」）
   ----------------------------------------------------------------------------
   真机截图像素级实测（430 宽 iPhone，cssY = 截图 y − 24）：
     · 评论胶囊在 cssY 852~890，控件底离屏幕底 42px —— 看着就是「没下来」；
     · cssY 899/900 处出现一个台阶（左 G 214→218、右 B 230→233，差 3~5 个色阶），
       那正是产品看到的那根「隐约的线」。两件事同一个根因。

   为什么恰好卡在 899/900：
     · .phone-shell = 100dvh ＋ padding-bottom: env(safe-area-inset-bottom)（iPhone 34px）
       ⇒ 内容盒下沿 = 932 − 34 = 898；#app（flex:1 ＋ overflow-y:auto）正好填满它；
     · .detail-action-bar 虽然是 position:fixed，却长在 #app 这棵**滚动子树**里 ——
       WebKit 会把滚动容器里的 fixed 后代**裁在滚动容器自己的边界上**
       （定位仍按视口算，所以控件位置一直是对的，只有「画」被切掉）。
       ⇒ 底栏铺到 898 就被切一刀：898 以上是底栏那条近乎不透明的粉
         （rgba(244,217,230,.94) ≈ #F4D9E6），898 以下是 .phone-shell 自己的底色
         （更浅更灰一点）—— 两个颜色差 3~5 个色阶，在手机上就是一根隐约的横线。

   为什么 v1.6.7 的「下移」没感觉：
     · 底栏是 fixed，「往下走」只能靠底内边距；而底内边距的下限被这条裁切线锁死 ——
       控件再往下就掉出 898、被切（v1.6.4「只剩上半截」就是这个原因）。
       v1.6.7 把 8px 从底搬到顶，控件只从 882 挪到 890，肉眼看不出来。

   反证（为什么可以断定是 #app 而不是系统安全区）：
     · 底部导航坞 .tabbar 是 #tabbar-root（.phone-shell 的直接子级，不在 #app 里），
       bottom: max(0px, calc(7px + env() − 25px)) = 16px ⇒ 它的下沿在 916，
       **已经落在 34px 安全区里**，而它天天被用、从来没被裁过。
       ⇒ 画到 898 以下是允许的，被切的只有 #app 这棵子树。

   ----------------------------------------------------------------------------
   修法：把这条裁切线**拿掉**，而不是绕着它挪位置。
     ① 详情页外壳不再留那 34px 底内边距 ⇒ #app 下沿落到屏幕最底，
        底栏整条都能画出来，898 那一刀自然消失。
        ⚠️ 只对帖子详情页生效（.phone-shell:has(.post-detail)），别的页面一个字不动。
        ⚠️ 外壳的 padding 只管「#app 到哪儿为止」，不画任何颜色，
           所以这样改不会让背景或导航坞动一下（导航坞是 absolute，参照 padding box）。
     ② 底栏回到 bottom:0（整条贴屏幕底），控件落点改由「离屏幕底多少」直接决定：
        34(顶) ＋ 40(控件) ＋ max(18px, env() − 10px) ⇒ iPhone 实得 24px
        ⇒ 控件落在 868~908，比改前（850~890）整整低 18px —— 这才是「半个身位」。
        控件底 908 仍在 iPhone 小白条（约 918~925）之上，不打架。
     ③ 详情页内容底内边距 80 → 114px，把 ① 让出去的 34px 补回来：
        滚到底时最后一行的位置与改前**逐像素一致**，不会钻到毛玻璃底下去。
     ④ 渐变改成 11 段等距、斜率逐级递减（.0204 → .0006 alpha/px，全程单调无折点），
        一整条盖满栏高（100% 100%），末段 alpha .96 与改前一致；
        因此不再需要 v1.6.7 那层「屏幕外 34px 补色层」。
   ⚠️ 夜间档不受影响：深色档是纯色 rgba(12,14,26,.96) ＋ 毛玻璃，选择器权重更高，
      跟着新位置一起贴到屏幕底。
   ⚠️ 只动「位置 / 内边距 / 背景铺法」：毛玻璃、配色、控件尺寸、夜间档一个字没动。
   回滚 = 删掉本段（版本号回落 1.6.7）。
   ========================================================================== */
.phone-shell:has(.post-detail) { padding-bottom: 0; }
.page:has(.post-detail) .detail-action-bar {
  bottom: 0;
  
  
  background-image: linear-gradient(180deg, rgba(244, 217, 230, 0) 0%, rgba(244, 217, 230, .20) 10%, rgba(244, 217, 230, .37) 20%, rgba(244, 217, 230, .525) 30%, rgba(244, 217, 230, .659) 40%, rgba(244, 217, 230, .751) 50%, rgba(244, 217, 230, .832) 60%, rgba(244, 217, 230, .893) 70%, rgba(244, 217, 230, .932) 80%, rgba(244, 217, 230, .954) 90%, rgba(244, 217, 230, .96) 100%);
  background-repeat: no-repeat;
  background-position: top;
  background-size: 100% 100%;
}


/* ========== v1.6.14 首页主卡「开演中」（方案 D · 两行小卡） ========== */
/* split 版式下 .countdown 是 110px / 2 列的 grid，只放 1 个子元素就只占 61px 宽，
   原来的单行长文本被压成「一个字一行」；这里把 is-live 收回成单列块，再把 .cd-live 做成两行小卡。 */
.lvb-dot{width:8px;height:8px;border-radius:50%;background:#ff5a72;box-shadow:0 0 0 0 rgba(255,90,114,.65);animation:lvbPulse 1.8s ease-out infinite;flex:none;}
@keyframes lvbPulse{0%{box-shadow:0 0 0 0 rgba(255,90,114,.6)}70%{box-shadow:0 0 0 9px rgba(255,90,114,0)}100%{box-shadow:0 0 0 0 rgba(255,90,114,0)}}
.hero-card.hero-home[data-lay="split"] > .countdown.is-live{position:absolute !important;right:12px !important;bottom:12px !important;width:110px !important;display:block !important;margin:0 !important;grid-template-columns:none !important;}
.hero-card.hero-home[data-lay="split"] > .countdown > .cd-live{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:auto;height:auto;padding:13px 6px;border-radius:16px;
  background:linear-gradient(180deg,rgba(255,255,255,.20),rgba(255,255,255,.07));border:1px solid rgba(255,255,255,.34);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.34),0 6px 16px rgba(6,8,26,.18);color:#fff;white-space:nowrap;}
.cd-live .lvb-l{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;opacity:.95;letter-spacing:.2px;}
.cd-live .lvb-r{font-size:18px;font-weight:700;letter-spacing:.2px;font-variant-numeric:tabular-nums;line-height:1.2;}

/* ========== v1.6.15 帖子详情底栏：顶边那条「切割线」下移到评论栏上方 ========== */
/* 产品 2026-10-02 真机截图：分类小签被一条横线切掉半截。
   真凶 = .detail-action-bar 是 position:fixed 且带 backdrop-filter: blur(14px)，
   毛玻璃只在元素自己的盒子内生效 ⇒ 元素顶边就是一刀硬边：
   上面清晰、下面糊掉。底栏原来 padding-top:34px ⇒ 顶边在 y=840，
   而评论胶囊在 y=875 —— 这条边正好横穿正文最后一行。
   修法：把顶内边距从 34 压到 8 ⇒ 底栏高 92→66、顶边 840→866（评论胶囊上方 9px），
   那一刀落进空白区，不再切任何内容；渐变/毛玻璃/配色/控件尺寸一个字没动。
   内容底留白收 26px（底栏矮了多少就收多少），滚到底时最后一行离底栏顶边仍有 16px。
   注意：那条 .page:has(.detail-action-bar){padding-bottom:114px} 其实一直被 styles-v130 的全局 .page{padding:...94px !important} 压着（等于没生效），所以这里必须带 !important 才真的收得动。
   回滚 = 删掉本段。 */
.page:has(.post-detail) .detail-action-bar{
  padding-top: 8px;
  padding-bottom: max(18px, calc(env(safe-area-inset-bottom) - 10px));
}
.page:has(.detail-action-bar){ padding-bottom: 82px !important; }

/* ========== v1.6.16 首页「空态主卡」整卡渐变（产品选定方案2 · 全卡可点） ========== */
/* 产品 2026-10-02：「这两个地方的设计，不太行，你先各渲染5个版本」→ 10 版里选定方案 2。
   两处空态（还没有即将到来的演唱会 / 所有奔赴都已收藏）原来是「渐变小方块图标 + 灰标题 + muted 一句话 + 大药丸按钮」，
   是全站最弱的一块，却占着首屏 C 位。方案2 = 把整张卡铺成品牌渐变（#4a6cf7→#6d5ce7→#8b5cf6）+ 两团柔光，
   标题/副标题纯白，按钮改白底实心（紫字），并给整卡挂 data-act=nav ⇒ 点哪都能进（原来只有按钮可点）。
   只动外观与可点范围：文案一字未改、跳转地址与原来按钮完全一致（#/trip/new 与 #/memories）。
   ⚠️ 特异性 3 段（.card.empty-start.hero-empty-grad）＞ .card / [data-theme="dark"] .card（2 段）⇒ 夜间档同样吃这套渐变，不用另写。
   回滚 = 删掉本段 + 还原 app.js 里那两处 empty-start 模板。 */
.card.empty-start.hero-empty-grad{
  position:relative; overflow:hidden;
  padding:19px 16px 17px; text-align:center;
  background:linear-gradient(135deg,#4a6cf7 0%,#6d5ce7 52%,#8b5cf6 100%);
  border:none;
  box-shadow:0 14px 34px rgba(93,79,222,.32), inset 0 1px 0 rgba(255,255,255,.30);
  cursor:pointer;
}
.card.empty-start.hero-empty-grad .heg-glow{
  position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(circle at 18% 10%,rgba(255,255,255,.42),transparent 44%),
             radial-gradient(circle at 88% 94%,rgba(244,170,255,.46),transparent 50%);
}
.card.empty-start.hero-empty-grad .heg-ic{
  position:relative; display:flex; align-items:center; justify-content:center;
  width:46px; height:46px; margin:0 auto 9px; border-radius:15px; color:#fff;
  background:rgba(255,255,255,.20); border:1px solid rgba(255,255,255,.42);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.40);
}
.card.empty-start.hero-empty-grad .heg-ic svg{ width:23px !important; height:23px !important; }
.card.empty-start.hero-empty-grad .heg-t{ position:relative; display:block; font-size:16px; font-weight:700; color:#fff; letter-spacing:.3px; }
.card.empty-start.hero-empty-grad .heg-s{ position:relative; display:block; margin-top:5px; font-size:12px; color:#ffffff; }
/* ========== v1.6.21 首页空态主卡 · 「添加演唱会」入口（产品选定方案1 · 主次分明） ========== */
/* 产品 2026-10-02：「对于已有过演唱会过往的用户，如果用户需要新增演唱会，还得特意跑到行程里去添加，
   太不友好，需要多加一个按钮」→ 渲染 5 版 + 4 版加强，选定「方案1」。
   病根：这一屏（有历史场次、没有即将到来的一场）整张卡只通向回忆馆，想再添一场必须切到「我的行程」。
   做法：把原来那颗 .heg-b 大白按钮拆成两颗 —— 主按钮「＋ 添加演唱会」（白底实心，跳 #/trip/new）、
   次按钮「打开回忆馆」（描边半透明）。一实一虚 ⇒ 一眼知道该点哪颗。
   顺带把「一场都没有」那张卡上那颗按钮也换成同一套 .heg-btn.solid：两处空态原来一个大药丸、
   一个白实底，本来就不统一，现在共用一套。
   只动外观与入口：文案一字未改；两颗按钮的跳转地址就是原来那两处（#/trip/new 与 #/memories）。
   ⚠️ 整卡仍挂 data-act=nav ⇒ 点卡片空白处照旧去回忆馆；点按钮走按钮自己的地址
      （app.js 的委托是 e.target.closest('[data-act]')，取的是最里层那颗）。
   回滚 = 删掉本段 + 还原 app.js 里那两处 empty-start 模板。 */
.card.empty-start.hero-empty-grad .heg-acts{
  position:relative; display:flex; gap:9px; justify-content:center; flex-wrap:wrap; margin-top:15px;
}
.card.empty-start.hero-empty-grad .heg-btn{
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  padding:11px 20px; border:none; border-radius:12px;
  font-family:inherit; font-size:12px; font-weight:700; line-height:1;
  -webkit-appearance:none; appearance:none; cursor:pointer;
  transition:transform .16s cubic-bezier(.4,0,.2,1);
}
.card.empty-start.hero-empty-grad .heg-btn svg{ width:15px !important; height:15px !important; vertical-align:0; }
.card.empty-start.hero-empty-grad .heg-btn.solid{
  background:#fff; color:#6d5ce7;
  box-shadow:0 6px 16px rgba(28,20,80,.24), inset 0 1px 0 #fff;
}
.card.empty-start.hero-empty-grad .heg-btn.ghost{
  background:rgba(255,255,255,.16); border:1px solid rgba(255,255,255,.52); color:#fff;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22);
}
.card.empty-start.hero-empty-grad .heg-btn:active{ transform:scale(.96); }
.card.empty-start.hero-empty-grad:active{ transform:scale(.995); }

/* ============================================================================
   v1.6.19 · 帖子详情图片区「定框」（方案A · 产品 2026-10-02 拍板）
   ----------------------------------------------------------------------------
   背景：v1.5.88 起详情页大图「按原图比例全宽」，长图（1:3 截图 / 长海报）在 430×932 上
         摆出来 1290px = 1.4 屏，作者行 / 标题 / 正文 / 「全部评论」全被顶出屏幕
         （产品真机截图：一屏只剩图）。当年 A（原比例）/ B（沉浸式）/ C（长图封顶）三版里
         选的是 B，**C 一直没做** —— 本版做的就是这个 C。
   本版：详情页图片区改成「一个框」——
     ① 框高 = 帖内最高那张图的比例高度（JS 算，写进行内 --fx-imgbox），封顶 62vh；
        同一个帖子框高固定不变 ⇒ 左右滑不再一边滑一边伸缩（v1.6.9 的连续插值降为兜底）；
     ② 图比框矮 ⇒ contain 居中；图比框高（长图）⇒ cover 裁进框；
     ③ 长图带底部渐隐 + 「长图 · 点开看全图」角签；点开全屏仍是原图零裁切（v1.5.88 没动）；
     ④ 视频不受影响（按自己的比例走，v1.6.12「填充到位」原样保留）——「视频 + 照片」同时在时
        框高取 max(视频高, min(最高照片, 62vh))，视频永远不裁。
   占位：**一个字没碰缩略图铺底**（v1.5.94 的教训 —— 见那条「不许 background-size:contain」）。
     框比图高时露出来的那圈，靠的是缩略图自己那张（背景图 cover 铺满整框）与 hero 的模糊底，
     两者都是「同一张图的放大」，所以图到达时不会跳、也不会闪白。
   ⚠️ 全部选择器都挂在 .is-locked 上（JS 算得出框高才加这个 class）：算不出框高
      （老帖没存尺寸、图还没下载完）就一个字都不改，行内高度那条老路照旧兜底。
   回滚 = 删掉本段 + 删掉 views2.js postDetailView after() 里那三段
         （框高计算 recalcBox / 角签同步 syncHeroFx / 渐隐与角签两个元素），版本号回落 1.6.18。
   ============================================================================ */

/* ① 框：高度只认行内 --fx-imgbox。position/z-index 是给下面 hero::before 那层模糊底让位的。 */
.post-imgs.detail.is-locked {
  position: relative; z-index: 1;
  height: var(--fx-imgbox, auto) !important;
  max-height: none !important;
  align-items: stretch !important;
}
/* ② 照片：框多高就多高、按 contain 居中。
      ⚠️ 必须排除 .post-vid：视频那条**行内** aspect-ratio + object-fit:cover 一个字不能碰。
      ⚠️ 背景色改透明是为了让没铺到底的那圈露出 hero 的模糊底（缩略图铺底是背景图，
         照样压在透明色上面，占了位就还是它 —— v1.5.94 那条占位逻辑没有被破坏）。 */
.page:has(.post-detail) .post-imgs.detail.is-locked .post-img.detail:not(.post-vid) {
  height: 100% !important;
  width: 100% !important;
  object-fit: contain !important;
  background-color: transparent !important;
}
/* 长图：裁进框（缩略图占位也一并改成铺满，跟真图一个样） */
.page:has(.post-detail) .post-imgs.detail.is-locked .post-img.detail.is-crop {
  object-fit: cover !important;
}
/* 视频：框比它高时居中，别贴在框顶 */
.page:has(.post-detail) .post-imgs.detail.is-locked .post-vid { align-self: center !important; }

/* ③ 放映底 + 模糊底：只在这页、只在锁框时生效 */
.xhd-hero:has(.post-imgs.detail.is-locked) {
  position: relative; z-index: 0; overflow: hidden;
  background: #100e1e; padding-bottom: 0;
}
.xhd-hero:has(.post-imgs.detail.is-locked)::before {
  content: ""; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 0;
  background-image: var(--fx-hero-bg, none); background-size: cover; background-position: center;
  filter: blur(26px) saturate(1.06) brightness(.94); transform: scale(1.16);
}
/* ⚠️ overflow:hidden 是给上面 scale(1.16) 溢出的那圈（不裁就会糊到下面作者行上）；
   ⚠️ z-index:0 让 hero 自成一层，模糊底不许盖过图。 */

/* ④ 长图那两件：底部渐隐 + 「点开看全图」角签（JS 只在「当前这张被裁了」时显示） */
.xhd-hero .xhd-fade {
  position: absolute; left: 0; right: 0; bottom: 0; height: 64px; z-index: 2; pointer-events: none;
  background: linear-gradient(180deg, rgba(16, 14, 30, 0), rgba(16, 14, 30, .86));
}
.xhd-hero .xhd-tip {
  position: absolute; left: 14px; bottom: 12px; z-index: 3;
  color: #fff; font-size: 11px; font-weight: 600; letter-spacing: .3px;
  padding: 2px 10px; border-radius: 999px; background: rgba(16, 14, 30, .86);
}
.xhd-hero.is-solo .xhd-tip { left: auto; right: 14px; }
/* 1/N 那枚签要压过渐隐层（它就落在渐隐那 64px 里） */
.xhd-hero:has(.post-imgs.detail.is-locked) .xhd-idx { z-index: 3; }

/* ============================================================
   v1.6.21 · 「我的」个人资料卡 · 赴星等级成长
   （产品 2026-10-02 选定「上一版本的C」＝等级成长版，对位 render/mock/out/prof-C.png）
   头像右下角挂 LV 徽章；卡内底部一条成长条：左「赴星 LV.n · 称号」右「再赴 N 场升 LV.n+1」。
   等级口径只在 views2.js 的 concertLevel() 一处：只看奔赴场次 stats.concertCount，每 2 场一级。
   底色/描边沿用 .pr-head 里那套白 11% / 16% 的玻璃层，和 .pr-trend 的格子同族，暗色主题自动跟随。
   .pr-level 要 position:relative —— .pr-head::before/::after 是绝对定位的光斑，不抬层会被盖住。
   ============================================================ */
.pr-ava-wrap { position: relative; flex: none; }
.pr-lv {
  position: absolute;   padding: 1px 6px; border-radius: 9px;
  font-size: 11px; font-weight: 700; line-height: 1.5; color: #6d5ce7;
  background: linear-gradient(135deg, #ffe08a, #f5b94e); border: 1.5px solid rgba(255,255,255,.85);
}
.pr-level {
  position: relative; margin-top: 10px; padding: 9px 11px; border-radius: 12px;
  background: rgba(255,255,255,.11); border: 1px solid rgba(255,255,255,.16);
}
.pr-level .pl-t { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 11px; font-weight: 700; }
.pr-level .pl-t em { font-style: normal; font-size: 11px; font-weight: 600; opacity: .8; white-space: nowrap; }
.pr-level .pl-bar { height: 5px; border-radius: 5px; background: rgba(255,255,255,.2); margin-top: 7px; overflow: hidden; }
.pr-level .pl-bar i { display: block; height: 100%; border-radius: 5px; background: linear-gradient(90deg, #8ab4ff, #c084fc, #ffd782); }

/* ============================================================
   v1.6.22 · 「我的」资料卡四项升级 + 首页年度回忆册重做
   （产品 2026-10-02 真机反馈四条，拍板后直接施工）
   ① 首页「年度回忆册」卡：只露 场次 / 城市 / 票根 + 今年进度，不露金额
   ② 点成长条 → #/level 等级明细（升级脚印 / 头像框 / 称号阶梯）
   ③ 点头像 → 换头像 + 选头像框（LV.3 星轨 / LV.5 流光 / LV.7 鎏金 / LV.10 星海）
   ④ 去掉「编辑」按钮，整张资料卡可点进编辑页
   本段只做外观，回滚 = 删掉本段。
   ============================================================ */

/* ---------- ① 首页「年度回忆册」---------- */
.card.link-card.recap-card { display: block; padding: 13px 14px 12px; }
.rc-top { display: flex; align-items: center; gap: 10px; }
.rc-ico {
  flex: none; width: 32px; height: 32px; border-radius: 10px;
  display: flex; align-items: center; justify-content: center; color: #fff;
  background: #7c5cfc; box-shadow: 0 6px 14px rgba(124,92,252,.3);
}
.rc-ico svg { width: 17px !important; height: 17px !important; }
.rc-top .grow { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rc-top b { font-size: 14px; }
.rc-top .grow span { font-size: 11px; color: #6b7390; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
[data-theme="dark"] .rc-top .grow span { color: #a8b0c8; }
.rc-year {
  flex: none; display: inline-flex; align-items: center; gap: 1px;
  font-size: 12px; font-weight: 700; color: #6d5ce7;
  background: rgba(124,92,252,.12); border-radius: 999px; padding: 3px 8px;
}
[data-theme="dark"] .rc-year { color: #c4b2ff; background: rgba(139,122,246,.2); }
.rc-year svg { width: 12px !important; height: 12px !important; opacity: .7; }
.rc-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 11px; }
.rc-cell { text-align: center; padding: 8px 2px 7px; border-radius: 12px; background: linear-gradient(160deg, rgba(124,92,252,.10), rgba(124,92,252,.03)); }
[data-theme="dark"] .rc-cell { background: linear-gradient(160deg, rgba(124,92,252,.22), rgba(124,92,252,.07)); }
.rc-cell b { display: block; font-size: 18px; font-weight: 700; line-height: 1.15; font-variant-numeric: tabular-nums; color: #5b4bd6; }
[data-theme="dark"] .rc-cell b { color: #c4b2ff; }
.rc-cell span { display: block; font-size: 11px; color: #5a6178; margin-top: 2px; }
[data-theme="dark"] .rc-cell span { color: #a8b0c8; }
.rc-prog { margin-top: 10px; }
.rc-prog-t { display: flex; align-items: center; justify-content: space-between; font-size: 11px; color: #5a6178; }
.rc-prog-t em { font-style: normal; }
.rc-prog-bar { height: 5px; border-radius: 5px; background: rgba(124,92,252,.14); margin-top: 6px; overflow: hidden; }
.rc-prog-bar i { display: block; height: 100%; border-radius: 5px; background: linear-gradient(90deg, #4a6cf7, #8b5cf6, #ec4899); }
.rc-empty { margin-top: 10px; display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 11px; color: #5a6178; }
.rc-empty span { flex: none; font-weight: 700; color: #6d5ce7; }
[data-theme="dark"] .rc-empty span { color: #c4b2ff; }

/* ---------- ④ 「我的」资料卡：整卡可点 + 箭头暗示（v1.6.23 拿掉头像上的相机角标）---------- */
.pr-head[data-act] { cursor: pointer; }
.pr-go { flex: none; display: flex; align-items: center; color: #ffffff; }
.pr-go svg { width: 17px !important; height: 17px !important; }
.pr-ava-wrap[data-act] { cursor: pointer; }

.pr-lv {
  left: -4px;
  bottom: -4px; z-index: 2; }
.pr-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 5px; }
.pr-tags span {
  display: inline-flex; align-items: center; gap: 3px;
  font-size: 11px; font-weight: 700; color: #f5b94e;
  background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.2);
  border-radius: 999px; padding: 1px 7px;
}
.pr-tags svg { width: 10px !important; height: 10px !important; }
.pr-level[data-act] { cursor: pointer; }
.pr-level .pl-go { display: inline-flex; align-items: center; color: #ffffff; }
.pr-level .pl-go svg { width: 13px !important; height: 13px !important; }

/* ---------- ③ 头像框：四档 ----------
   画法：::after 是一整块 conic-gradient 圆盘，头像自己（z-index 2）盖住中间，
   只露出外沿 2px（v1.6.25：轮廓统一收细） —— 故意不用 mask：老 WebView 上 mask 万一不认，整块渐变会盖死头像。
   data-frame 与 .f-* 两套选择器共用一个声明（前者给真实使用处，后者给纯样式预览）。 */
.pr-ava-wrap, .av-pv { position: relative; }
.pr-ava-wrap .pr-avatar, .av-pv .pr-avatar { position: relative; z-index: 2; }
[data-frame]::after,
.f-orbit::after, .f-aurora::after, .f-gilt::after, .f-sea::after,
.f-ray::after, .f-galaxy::after, .f-cosmos::after {
     border-radius: 50%;
   
}
.pr-ava-wrap[data-frame] .pr-avatar { background: linear-gradient(150deg, #2f3475, #4a2a68); }
[data-frame="orbit"]::after, .f-orbit::after { background: conic-gradient(from 200deg, #7db2ff, #8b7bf7, #c8a6ff, #7db2ff); }
[data-frame="aurora"]::after, .f-aurora::after { background: conic-gradient(from 150deg, #4a6cf7, #a855f7, #ec4899, #ffb86b, #4a6cf7); }
[data-frame="gilt"]::after, .f-gilt::after { background: conic-gradient(from 210deg, #ffe9b0, #f5b94e, #fff6d8, #d99a2b, #ffe9b0); }
[data-frame="sea"]::after, .f-sea::after { background: conic-gradient(from 0deg, #6d5ce7, #2f6bff, #22d3ee, #a855f7, #f472b6, #6d5ce7); animation: fx-frame-spin 7s linear infinite; }
/* v1.6.24：20 级新增三档 —— 星芒 / 银河 / 星域 */
[data-frame="ray"]::after, .f-ray::after { background: conic-gradient(from 120deg, #fff3c4, #ffcf5c, #ff9ec4, #c8a6ff, #fff3c4); }
[data-frame="galaxy"]::after, .f-galaxy::after { background: conic-gradient(from 70deg, #1b2a6b, #6d5ce7, #22d3ee, #a855f7, #1b2a6b); }
[data-frame="cosmos"]::after, .f-cosmos::after { background: conic-gradient(from 0deg, #12c2e9, #c471ed, #f64f59, #f9d423, #12c2e9); animation: fx-frame-spin 5.5s linear infinite; }
@keyframes fx-frame-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }

/* ---------- ③ 头像 / 头像框弹窗 ---------- */
.av-pv { display: inline-flex; }
.av-pv .pr-avatar { width: 38px; height: 38px; font-size: 16px; background: linear-gradient(150deg,#ecebff,#d8d0ff); color: #6d5ce7; border-color: #fff; }
.av-pv .pr-avatar img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; display: block; }
.av-ini { line-height: 1; }
.av-pv.is-big .pr-avatar { width: 56px; height: 56px; font-size: 22px; }
.av-pv.is-mid .pr-avatar { width: 40px; height: 40px; font-size: 16px; }
.av-top { display: flex; align-items: center; gap: 12px; }
.av-t { font-size: 12px; font-weight: 700; }
.av-s { font-size: 11px; color: #6b7390; line-height: 1.5; margin-top: 3px; }
.av-up { display: inline-flex; align-items: center; gap: 4px; margin-top: 9px; }
/* v1.6.44：头像弹窗两颗按钮并排（选择图片 + 同步微信头像/昵称）—— 间距 8px、窄屏换行、不裁字；
   容器统一承担上边距，里面的 .av-up 归零避免双份间距（.av-up 本身样式一字未动） */
.av-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 9px; }
.av-actions .av-up { margin-top: 0; }
.av-label { font-size: 11px; font-weight: 700; color: #5a6178; margin: 15px 2px 7px; }
.av-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
.av-opt { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 8px 2px 7px; border: 1px solid rgba(124,92,252,.14); border-radius: 13px; background: #fff; }
.av-opt b { font-size: 11px; }
.av-opt > span:last-child { font-size: 11px; color: #5a6178; }
.av-opt.on { border-color: #7c5cfc; background: rgba(124,92,252,.10); box-shadow: 0 6px 16px rgba(124,92,252,.18); }
.av-opt.on > span:last-child { color: #6d5ce7; font-weight: 700; }
.av-opt.locked { opacity: .6; }
.av-opt.locked .pr-avatar { filter: grayscale(1); }
[data-theme="dark"] .av-opt { background: rgba(255,255,255,.05); border-color: rgba(255,255,255,.1); }
[data-theme="dark"] .av-t { color: #eef1ff; }

/* ---------- ④ 编辑资料弹窗：加内容 ---------- */
.pf-hero {
  display: flex; align-items: center; gap: 10px; color: #fff;
  padding: 10px 12px; border-radius: 14px; margin-bottom: 12px;
  background: linear-gradient(140deg, #5b4bd6 0%, #7c5cfc 55%, #a855f7 100%);
  box-shadow: 0 10px 22px rgba(90,70,220,.24);
}
.pf-hero-ava { flex: none; }
.pf-hero .grow { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pf-hero b { font-size: 14px; font-weight: 700; }
.pf-hero .grow span { font-size: 11px; opacity: .88; }
.pf-jump {
  display: flex; align-items: center; gap: 10px; cursor: pointer;
  padding: 10px 12px; border-radius: 14px; margin-bottom: 14px;
  background: rgba(124,92,252,.07); border: 1px solid rgba(124,92,252,.14);
}
.pf-jump .grow { display: flex; flex-direction: column; gap: 2px; }
.pf-jump b { font-size: 12px; }
.pf-jump .grow span { font-size: 11px; color: #5a6178; }
.pf-presets { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.pf-presets .chip { font-size: 11px; }

/* ---------- ② 等级明细页 #/level ---------- */
.lv-hero {
  position: relative; overflow: hidden; border-radius: 18px; padding: 15px 15px 13px; margin-bottom: 12px; color: #fff;
  background:
    radial-gradient(130% 130% at 88% -18%, rgba(255,255,255,.26), transparent 52%),
    radial-gradient(120% 130% at -10% 20%, rgba(120,146,255,.5), transparent 60%),
    linear-gradient(150deg, #191d4a 0%, #2a2760 48%, #5a2a68 100%);
  box-shadow: 0 14px 34px rgba(30,24,80,.28), inset 0 1px 0 rgba(255,255,255,.22);
}
.lv-hero-top { display: flex; align-items: center; gap: 12px; }
.lv-badge {
  flex: none; display: flex; flex-direction: column; align-items: center; gap: 1px;
  padding: 8px 14px; border-radius: 14px;
  background: rgba(255,255,255,.13); border: 1px solid rgba(255,255,255,.2);
}
.lv-badge b { font-size: 22px; font-weight: 700; letter-spacing: .3px; color: #f5b94e; }
.lv-badge span { font-size: 11px; opacity: .86; }
.lv-hero-r { min-width: 0; }
.lv-hero-n { font-size: 12px; font-weight: 700; }
.lv-hero-n b { font-size: 18px; font-weight: 700; }
.lv-hero-s { font-size: 11px; opacity: .82; margin-top: 3px; }
.lv-bar { height: 7px; border-radius: 7px; background: rgba(255,255,255,.2); margin-top: 13px; overflow: hidden; }
.lv-bar i { display: block; height: 100%; border-radius: 7px; background: linear-gradient(90deg, #8ab4ff, #c084fc, #ffd782); }
.lv-scale { display: flex; justify-content: space-between; font-size: 11px; opacity: .72; margin-top: 6px; }
.lv-steps { padding: 6px 14px; }
.lv-step { display: flex; gap: 10px; padding: 10px 0; }
.lv-step + .lv-step { border-top: 1px solid rgba(124,92,252,.12); }
[data-theme="dark"] .lv-step + .lv-step { border-top-color: rgba(255,255,255,.09); }
.lv-step-rail { flex: none; width: 24px; display: flex; justify-content: center; padding-top: 1px; }
.lv-step-rail i {
  width: 22px; height: 22px; border-radius: 50%; font-style: normal;
  display: flex; align-items: center; justify-content: center;
  font-size: 11px; font-weight: 700; color: #fff;
  background: linear-gradient(135deg, #6d5ce7, #a855f7);
  box-shadow: 0 4px 10px rgba(109,92,231,.32);
}
.lv-step-body { min-width: 0; }
.lv-step-t { font-size: 12px; font-weight: 700; }
.lv-step-d { font-size: 11px; color: #5a6178; margin-top: 2px; }
[data-theme="dark"] .lv-step-d { color: #a8b0c8; }
.lv-empty { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 22px 10px; text-align: center; color: #5a6178; }
.lv-empty svg { opacity: .5; }
.lv-empty b { font-size: 12px; font-weight: 700; color: inherit; }
.lv-empty span { font-size: 11px; line-height: 1.6; }
.lv-frames { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
/* v1.6.23：头像框改成 <button> —— 已解锁的点一下就戴上（产品「这两个好像不能选」） */
.lv-frame { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 8px 2px 7px; border-radius: 12px; background: rgba(124,92,252,.06); border: 0; font: inherit; color: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; transition: transform .12s ease, background .12s ease; }
.lv-frame:active { transform: scale(.94); }
.lv-frame.locked { cursor: default; }
.lv-frame b { font-size: 11px; }
.lv-frame > span:last-child { font-size: 11px; color: #5a6178; }
.lv-frame .av-pv .pr-avatar { width: 34px; height: 34px; font-size: 12px; }
.lv-frame.on { background: rgba(124,92,252,.16); box-shadow: inset 0 0 0 1px rgba(124,92,252,.32); }
.lv-frame.on > span:last-child { color: #6d5ce7; font-weight: 700; }
.lv-frame.locked .av-pv { filter: grayscale(1); opacity: .5; }
[data-theme="dark"] .lv-frame.on > span:last-child { color: #c4b2ff; }
[data-theme="dark"] .lv-frame { background: rgba(255,255,255,.05); }
.lv-note { font-size: 11px; line-height: 1.6; color: #5a6178; margin-top: 9px; }
.lv-ladder-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; }
.lv-ladder-row + .lv-ladder-row { border-top: 1px solid rgba(124,92,252,.10); }
[data-theme="dark"] .lv-ladder-row + .lv-ladder-row { border-top-color: rgba(255,255,255,.08); }
.lv-ladder-row > span { flex: none; width: 64px; font-size: 11px; font-weight: 700; color: #5a6178; }
.lv-ladder-row > b { flex: 1; font-size: 12px; }
.lv-ladder-row > em { font-style: normal; font-size: 11px; color: #5a6178; }
.lv-ladder-row.on > span, .lv-ladder-row.on > b { color: #6d5ce7; }
[data-theme="dark"] .lv-ladder-row.on > span, [data-theme="dark"] .lv-ladder-row.on > b { color: #c4b2ff; }

/* ================= v1.6.25 · 昵称样式 8 档 + 资料标签库 + 两处收口 =================
   （详注见 git 历史 · W-023 样式表瘦身） */

/* ① 头像轮廓：所有档统一收到 2px */
[data-frame]::after,
.f-orbit::after, .f-aurora::after, .f-gilt::after, .f-sea::after,
.f-ray::after, .f-galaxy::after, .f-cosmos::after {
  content: '';
  position: absolute;
  pointer-events: none;
  z-index: 1;
  inset: -2px;
}

/* ③ 赴星页问候头像：没照片时也给一层底 */
.greet-ava[data-frame] .greet-ava-in { background: linear-gradient(150deg, #2f3475, #4a2a68); }

/* ② 本场速办：只降上下高度（aspect-ratio 是唯一不会被 grid 行高规则吃掉的写法） */
.qt-grid .qt {  padding: 8px 6px; gap: 5px; }
.qt-grid .qt .qt-ic { width: 30px; height: 30px; border-radius: 9px; }
.qt-grid .qt .qt-ic svg { width: 18px !important; height: 18px !important; }
.qt-grid .qt .qt-bd { gap: 3px; }
.qt-grid .qt .qt-bar { margin-top: 2px; }

/* ④ 昵称样式 8 档 */
.nst[data-ns] {
  background-image: var(--ns-l);
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent;
}
.nst[data-ns=""]       { --ns-l: linear-gradient(#4a6cf7, #4a6cf7); --ns-d: linear-gradient(#ffffff, #ffffff); }
.nst[data-ns="orbit"]  { --ns-l: linear-gradient(120deg, #2f4bd0, #6d5ce7, #8b5cf6); --ns-d: linear-gradient(120deg, #cfe0ff, #8b7bf7, #c8a6ff); }
.nst[data-ns="aurora"]  { --ns-l: linear-gradient(90deg, #3a56d4, #7c5cf0 30%, #d946b8 60%, #3a56d4); --ns-d: linear-gradient(90deg, #8fd0ff, #a855f7 33%, #ff9ec4 66%, #ffb86b 84%, #8fd0ff); }
.nst[data-ns="aurora2"] { --ns-l: linear-gradient(120deg, #3a56d4, #7c5cf0 60%, #d946b8); --ns-d: linear-gradient(120deg, #8fd0ff, #a855f7, #ff9ec4, #ffb86b); }
.nst[data-ns="gilt"]   { --ns-l: linear-gradient(120deg, #b45309, #f59e0b, #fde68a); --ns-d: linear-gradient(120deg, #ffe9b0, #f5b94e, #fff6d8, #d99a2b); }
.nst[data-ns="sea"]    { --ns-l: linear-gradient(120deg, #1e3a8a, #2f6bff, #22d3ee); --ns-d: linear-gradient(120deg, #9fe3ff, #5b8cff, #22d3ee); }
.nst[data-ns="ray"]    { --ns-l: linear-gradient(90deg, #f59e0b, #ffcf5c, #ff9ec4, #c8a6ff, #f59e0b); --ns-d: linear-gradient(90deg, #fff3c4, #ffcf5c, #ff9ec4, #c8a6ff, #fff3c4); }
.nst[data-ns="galaxy"] { --ns-l: linear-gradient(90deg, #6d5ce7, #22d3ee, #a855f7, #6d5ce7); --ns-d: linear-gradient(90deg, #9fb4ff, #6d5ce7, #22d3ee, #a855f7, #9fb4ff); }
.nst[data-ns="cosmos"] { --ns-l: linear-gradient(90deg, #0b7285, #7c3aed, #db2777, #0b7285); --ns-d: linear-gradient(90deg, #4fd1e8, #c471ed, #ff6b8b, #f9d423, #4fd1e8); }

/* 深底（夜间主题 / 我的页紫卡面）换成深底配色 —— 同一串渐变在白底好看、到紫卡上会糊成一片 */
[data-theme="dark"] .nst[data-ns] { background-image: var(--ns-d); }
.pr-name .nst[data-ns] { background-image: var(--ns-d); }

/* v1.6.30 · 「素白」改叫「默认」，配色按场景分开（产品「素白->默认：在赴星页面时用蓝色，没有任何特效；
   在我的页面中的资料卡中就用白色」）
   浅底页（赴星页问候那一行 / 面板预览底）用主题蓝 #4a6cf7 纯色平涂 —— 不渐变、不流动、无投影；
   深底（我的页紫卡面 / 夜间主题）仍是纯白，走下面的 --ns-d，一个字没动。
   回滚 = 把上面 --ns-l 还原成 linear-gradient(120deg, #8f9bc0, #e8edfa 38%, #ffffff 55%, #a9b3d2)。 */

/* ⑤ LV.12 及以上：流动动态昵称（背景平移；首尾同色 ⇒ 200% 正好走满一个周期，无缝） */
.nst[data-ns="aurora"],
.nst[data-ns="ray"], .nst[data-ns="galaxy"], .nst[data-ns="cosmos"] {
  background-size: 200% 100%;
  animation: fx-nick-flow 6s linear infinite;
}
@keyframes fx-nick-flow { from { background-position: 0% 50%; } to { background-position: -200% 50%; } }

/* ⑥ 等级页那扇「昵称样式」门：pf-jump 原本是 div，这里当按钮用，补回继承样式 */
button.pf-jump { width: 100%; font: inherit; color: inherit; text-align: left; -webkit-tap-highlight-color: transparent; }
button.pf-jump:active { background: rgba(124,92,252,.13); }

/* ⑥ 标签库面板 */
.tg-note { font-size: 11px; line-height: 1.6; color: #5a6178; margin: 0 0 10px; }
.tg-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.tg-opt {
  display: flex; align-items: center; gap: 9px; padding: 10px 11px; border-radius: 14px;
  background: rgba(124,92,252,.06); border: 1.5px solid transparent;
  font: inherit; color: inherit; text-align: left; cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.tg-opt.on { background: #f6f4ff; border-color: #7c5cfc; }
.tg-opt.locked { opacity: .55; cursor: default; }
.tg-opt b { font-size: 12px; }
.tg-opt em { font-style: normal; display: block; font-size: 11px; color: #5a6178; margin-top: 1px; }
.tg-tick { margin-left: auto; flex: none; width: 18px; height: 18px; border-radius: 50%; border: 1.5px solid rgba(124,92,252,.4); }
.tg-opt.on .tg-tick { background: linear-gradient(135deg, #6d5ce7, #a855f7); border-color: transparent; }
[data-theme="dark"] .tg-opt { background: rgba(255,255,255,.05); }
[data-theme="dark"] .tg-opt.on { background: rgba(124,92,252,.18); }

/* ④ 昵称样式面板 */
.ns-note {
  display: flex; gap: 9px; align-items: flex-start;
  background: linear-gradient(135deg, #fff8e6, #fdf1d6); border: 1px solid rgba(245,185,78,.5);
  border-radius: 14px; padding: 10px 11px; margin-bottom: 11px;
}
.ns-note svg { width: 16px !important; height: 16px !important; color: #f5b94e; flex: none; margin-top: 1px; }
.ns-note b { display: block; font-size: 12px; color: #1a1f36; }
.ns-note span { display: block; font-size: 11px; line-height: 1.55; color: #8a5a00; margin-top: 2px; }
.ns-list { display: flex; flex-direction: column; gap: 8px; }
.ns-row {
  display: flex; align-items: center; gap: 9px; padding: 9px 10px; border-radius: 14px;
  background: #fff; border: 1.5px solid rgba(70,48,184,.07); box-shadow: 0 3px 10px rgba(40,45,120,.06);
  font: inherit; color: inherit; text-align: left; cursor: pointer; -webkit-tap-highlight-color: transparent;
}
.ns-row.on { background: #f6f4ff; border-color: #7c5cfc; }
.ns-row.early { background: #fffaf0; border-color: #f5b94e; }
.ns-row.legacy { background: #fffdf6; border-color: #e8d7a8; }
/* v1.6.26：未解锁的行不再整行压暗 —— 预览要能看清真实效果（尤其流动款）。
   靠虚线边 + 「再赴 N 场解锁」表达未解锁，不再牺牲预览。 */
.ns-row.locked { border-style: dashed; cursor: default; }
.ns-name { width: 62px; flex: none; }
.ns-name b { display: block; font-size: 12px; line-height: 1.2; }
.ns-name span { display: block; font-size: 11px; color: #5a6178; margin-top: 1px; }
.ns-pv { flex: 1; min-width: 0; border-radius: 11px; padding: 7px 10px; background: #f4f2ff; }
.ns-pv b { font-size: 18px; font-weight: 700; }
.ns-tag { flex: none; font-size: 11px; font-weight: 700; color: #6b7390; white-space: nowrap; }
.ns-tag.on { color: #6d5ce7; }
.ns-tag.gold {
  color: #1a1f36; background: linear-gradient(135deg, #ffe9b0, #f5b94e);
  border-radius: 999px; padding: 3px 7px; font-size: 11px;
}
[data-theme="dark"] .ns-row { background: rgba(255,255,255,.05); border-color: rgba(255,255,255,.09); box-shadow: none; }
[data-theme="dark"] .ns-row.on { background: rgba(124,92,252,.18); border-color: #7c5cfc; }
[data-theme="dark"] .ns-row.early { background: rgba(245,185,78,.14); border-color: #f5b94e; }
[data-theme="dark"] .ns-pv { background: rgba(255,255,255,.07); }
[data-theme="dark"] .ns-name span, [data-theme="dark"] .ns-tag { color: #a8b0c8; }

/* ===== 2026-10-03 · 现场记录：入口邀请卡 / 照片缩略图可删 / 演后提示 =====
   产品走查结论：这功能"找不到、也不知道写什么"。三处小改：空态给按钮+例子、选照片立刻出缩略图、看完演出给入口。 */
.mem-invite { padding: 2px 0; }
.mem-invite .mi-t { font-weight: 600; }
.mem-invite .mi-s { color: var(--text-3); font-size: 12px; line-height: 1.6; margin: 4px 0 10px; }
.mem-photo { position: relative; display: inline-block; }
.mem-photo-x {
  position: absolute; top: -6px; right: -6px; width: 20px; height: 20px; border: 0; border-radius: 50%;
  background: rgba(20, 22, 40, .78); color: #fff; font-size: 12px; line-height: 1; padding: 0;
  display: flex; align-items: center; justify-content: center; cursor: pointer;
}
button.card.mem-nudge { display: block; width: 100%; text-align: left; border: 0; cursor: pointer; }
.mem-nudge .mn-t { font-weight: 600; }
.mem-nudge .mn-s { color: var(--text-3); font-size: 12px; margin-top: 3px; }

/* ===== 2026-10-04 · 「翻开回忆」那枚相机不再被裁 =====
   实测：徽章 20×20，内边距 0 → 墨水（相机路径 23.8 单元）按 24 单元画布铺满 19.8px，左右正好压在徽章边上被切。
   icons.js 已把这类贴边图标的画布放宽到 27.2 单元（并加了 data-icon 标记）；这里把徽章同步放大到 22px，
   于是墨水 ≈19.3px（与原来的 19.8px 基本一致）、四周留出约 1.4px 余量。回滚 = 删掉本段。 */
.concert-card .cc-next svg[data-icon="camera"] { width: 22px !important; height: 22px !important; }

/* ===== 2026-10-04 · 本场速办再压低（产品选定「方案一 · 只收上下留白」）=====
   实测（真机 428 宽）：每格 120×106 → 120×98、整块两行 220 → 206（省 14px）；
   宽度、图标 30、标题 12.5 / 副文案 10、间距 5 全部未动，只把上下留白收掉。
   为什么只走这一档：再往下压而不缩小图标，会把图标压扁（实测 1/0.70 时图标高度 30→22、横向仍 30）。
   回滚 = 删掉本段（上一版 1/0.88 仍在 v1.6.25 那一段里）。 */


/* ===== 2026-10-04 · 顶部那条白线：全站一次改掉（产品第 2 条 + 第 4 条标记 1）=====
   根因（真机 428 宽逐像素实测，不是猜）：这些卡片/顶栏都是「半透明渐变底 + 1px 描边」，
   而 background 默认 repeat，渐变那张图是按 padding-box 大小铺的 —— 于是 1px 的描边条里
   被重复铺了一行渐变「顶行」，正好是那条又白又亮的横线：
     · .back-bar  底部 1px：页面底色 rgb(206,213,252) → 亮线 rgb(233,236,252)（+27 亮度）
     · .card      顶部 1px：页面底色 → rgb(255,254,255)（+49 亮度）
   v1.5.84 只把 .back-bar 的 border-bottom-color 改成 transparent，宽度还是 1px，所以线还在。
   两处一起改才干净：① background-repeat:no-repeat（描边条不再被渐变重复填充）
                     ② 卡片的描边从纯白改成极淡紫（页面本来就有 .5px 的淡紫描边 + 投影接住）
   回滚 = 删掉本段。 */
.back-bar { background-repeat: no-repeat; }
.card, .ht, .qt, .hot-mini, .xh-card, .pr-links, .lv-steps, .more-box, .tabbar { background-repeat: no-repeat; }
html:not([data-theme="dark"]) .card,
html:not([data-theme="dark"]) .ht,
html:not([data-theme="dark"]) .qt,
html:not([data-theme="dark"]) .hot-mini,
html:not([data-theme="dark"]) .xh-card,
html:not([data-theme="dark"]) .pr-links,
html:not([data-theme="dark"]) .lv-steps,
html:not([data-theme="dark"]) .tabbar { border-color: rgba(124,92,240,.10); }
html:not([data-theme="dark"]) .card {
  /* 描边不再是白的之后，顶部那 1px 白色内高光（inset）也跟着压淡，否则还是一道白线 */
  box-shadow:
    0 0 0 .5px rgba(99,112,255,.10),
    0 10px 26px rgba(31,38,135,.07),
    0 2px 6px rgba(31,38,135,.05),
    inset 0 1px 0 rgba(255,255,255,.45);
}

/* ===== 2026-10-04 · 详情页主卡：整张卡可点 = 右上「编辑」（产品第 1 条）=====
   卡里还有「标记已观演」按钮，所以用 div + data-act（不能嵌套 button）；
   事件委托取的是 closest('[data-act]')，点内层按钮时命中的是按钮本身，不受影响。 */
.detail-hero[data-act] { cursor: pointer; }
.detail-hero[data-act]:active { transform: scale(.995); }

/* ===== 2026-10-04 · 主按钮不再比卡片宽（产品第 4 条标记 2，已确认）=====
   v1.5.x 把 .page 里的 .btn-block 拉宽到 calc(100% + 12px)、左右各负 6px 边距（404 → 416），
   在编辑页上就是「保存按钮左右各比卡片多出 6px」，看着像内容溢出了卡片的框。
   改回与卡片同宽（左右各留 12px）。回滚 = 恢复成 width:calc(100% + 12px); margin:-6px。 */
.page .btn-block { width: 100%; margin-left: 0; margin-right: 0; }

/* ===== v1.6.38 · 回忆册详情页改版：粉紫星轨 =====
   产品在五套样张里选了「粉紫星轨」：浅色极光主卡 + 星轨圆环 + 渐变年份字，
   底色与「我的 / 行程」等页同一套语言（浅底 + 品牌紫粉），不再用 styles.css 里那块灰紫深卡。
   旧规则仍在 styles.css，这里按加载顺序覆盖；有封面的年份（has-img）保持原图 + 白字。 */
.recap-hero {
  background:
    radial-gradient(220px 170px at 84% -10%, rgba(255,255,255,.75), transparent 62%),
    radial-gradient(240px 190px at 4% 112%, rgba(255,180,214,.42), transparent 60%),
    linear-gradient(135deg, #efeaff 0%, #fbe9f6 52%, #e8ecff 100%);
  color: #5a6178;
  box-shadow: 0 14px 32px rgba(124,92,231,.18);
}
.recap-hero::before { background: radial-gradient(circle, rgba(255,255,255,.6), transparent 70%); }
/* 没有封面时不要那层深色磨砂：原来压在深紫卡上看不出来，换成浅色底后会把整张卡压灰。
   有封面（has-img）时仍保留，白字的可读性靠它（口径同 v1.5.32）。 */
.recap-hero:not(.has-img) .recap-hero-tint { display: none; }
.recap-hero-ring {
  position: absolute; width: 320px; height: 320px; border-radius: 999px;
  top: -74px; right: -86px; pointer-events: none;
  border: 1.5px solid rgba(124,92,231,.20);
  box-shadow: 0 0 0 22px rgba(124,92,231,.06);
}
.recap-hero-ring::after {
  content: ''; position: absolute; inset: 26px; border-radius: 999px;
  border: 1px solid rgba(236,72,153,.16);
}
.recap-hero-kicker { color: #6d5ce7; }
.recap-hero-year {
  background: linear-gradient(120deg, #6d5ce7 0%, #b45ce0 52%, #ec4899 100%);
  -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
}
.recap-hero-slogan { color: #5a6178; }
/* 有封面：回到「只出原图 + 白字阴影」，圆环与渐变字都让位（口径同 v1.5.32「不叠层」） */
.recap-hero.has-img .recap-hero-ring { display: none; }
.recap-hero.has-img .recap-hero-year {
  background: none; -webkit-background-clip: border-box; background-clip: border-box;
  color: #fff; -webkit-text-fill-color: #fff;
}
.recap-hero.has-img .recap-hero-kicker,
.recap-hero.has-img .recap-hero-slogan { color: #fff; }
[data-theme="dark"] .recap-hero {
  background:
    radial-gradient(220px 170px at 84% -10%, rgba(167,120,255,.30), transparent 62%),
    radial-gradient(240px 190px at 4% 112%, rgba(236,72,153,.22), transparent 60%),
    linear-gradient(135deg, #221c40 0%, #2a1d46 52%, #1c1e42 100%);
  color: #eef1ff;
  box-shadow: 0 14px 32px rgba(0,0,0,.42);
}
[data-theme="dark"] .recap-hero-kicker { color: #c4b2ff; }
[data-theme="dark"] .recap-hero-slogan { color: #c4b2ff; }

/* 年份与海报风格胶囊：选中态从「实心紫块」改成「淡紫粉渐变」（粉紫星轨的轻量选中态） */
.recap-year.on,
.recap-poster-opts .chip.active {
  background: linear-gradient(135deg, #ede8ff, #ffe6f4);
  color: #6d4fd0; border-color: rgba(124,92,231,.35);
  box-shadow: 0 6px 14px rgba(124,92,231,.18);
}
[data-theme="dark"] .recap-year.on,
[data-theme="dark"] .recap-poster-opts .chip.active {
  background: linear-gradient(135deg, rgba(124,92,231,.34), rgba(236,72,153,.26));
  color: #f2ecff; border-color: rgba(180,150,255,.42);
}

/* 四格统计：一块一色（紫 / 蓝 / 粉 / 金）；数字沿用全站「渐变字」写法，只换每块的渐变 */
.recap-stats .stat {
  background: rgba(255,255,255,.62);
  border: 1px solid rgba(255,255,255,.82);
  box-shadow: 0 6px 16px rgba(31,38,135,.07);
}
.recap-stats .stat.t1 { background: rgba(124,92,231,.12); }
.recap-stats .stat.t2 { background: rgba(74,108,247,.12); }
.recap-stats .stat.t3 { background: rgba(236,72,153,.12); }
.recap-stats .stat.t4 { background: rgba(245,185,78,.18); }
.recap-stats .stat.t1 .n { background: linear-gradient(120deg, #6d5ce7, #b45ce0); -webkit-background-clip: text; background-clip: text; }
.recap-stats .stat.t2 .n { background: linear-gradient(120deg, #3a56d4, #5fa8ff); -webkit-background-clip: text; background-clip: text; }
.recap-stats .stat.t3 .n { background: linear-gradient(120deg, #c4407f, #ec4899); -webkit-background-clip: text; background-clip: text; }
.recap-stats .stat.t4 .n { background: linear-gradient(120deg, #e0942e, #f5b94e); -webkit-background-clip: text; background-clip: text; }
[data-theme="dark"] .recap-stats .stat { background: rgba(255,255,255,.06); border-color: rgba(255,255,255,.10); }
[data-theme="dark"] .recap-stats .stat.t1 { background: rgba(124,92,231,.24); }
[data-theme="dark"] .recap-stats .stat.t2 { background: rgba(74,108,247,.24); }
[data-theme="dark"] .recap-stats .stat.t3 { background: rgba(236,72,153,.22); }
[data-theme="dark"] .recap-stats .stat.t4 { background: rgba(245,185,78,.20); }

/* 年度最常奔赴：名次从 emoji 奖牌换成渐变序号（1/2/3 = 金 / 银 / 铜） */
.recap-rank {
  flex: none; width: 24px; height: 24px; border-radius: 999px;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 700; color: #fff;
  box-shadow: 0 4px 10px rgba(31,38,135,.18);
}
.recap-rank.r1 { background: linear-gradient(135deg, #f6c65e, #e0942e); }
.recap-rank.r2 { background: linear-gradient(135deg, #b9c2d8, #8e99b5); }
.recap-rank.r3 { background: linear-gradient(135deg, #e2a878, #bd7b45); }
.recap-artist .tag-gold { background: rgba(236,72,153,.14); color: #d6457f; border-color: rgba(236,72,153,.22); }
/* v1.6.43：无排名变体（全是 1 场 / 前几位完全并列）—— 不出序号徽章，名字更舒展；末尾一句总结 */
.recap-artist.no-rank { padding: 10px 0; }
.recap-artist-sum { padding-top: 6px; font-size: 11px; color: var(--text-3); }

/* 年度海报：微信里长按保存要放开内核的长按菜单（与 .sheet-img / .share-ticket-img 同一口径） */
.recap-poster-img { -webkit-touch-callout: default !important; user-select: auto !important; -webkit-user-select: auto !important; }

/* ===== v1.6.39 · 年度海报样式面板（昵称样式同款矩阵）=====
   4 列矩阵：3:4 缩略图（v1.9.02 ⑤ 起直接用 poster-themes/<key>/thumb.jpg 真缩略图，
   360×480 · 中心裁切 · 8–44KB，不再拿 1440×2880 的 bg.webp 原图当缩略图）+ 名称 + 状态；
   锁定 = 降饱和 + 半透明遮罩 + LV 角标；佩戴中 = 右下角勾选角标。 */
.ps-panel { padding: 14px 14px 12px; }
/* v1.6.43：面板头改两行 —— 上行「海报样式 + 规则」，下行「海报档位 + 佩戴中」（产品要求严格一排 4 张，佩戴款不再占坑） */
.ps-head { margin-bottom: 10px; }
.ps-head-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.ps-head-top b { font-size: 16px; }
.ps-head-sub { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-top: 4px; }
.ps-head-sub span { font-size: 11px; color: var(--text-3); }
.ps-head-sub .ps-cur { color: var(--text-2); font-weight: 700; }
.ps-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.ps-tile {
  display: flex; flex-direction: column; gap: 5px; padding: 6px 6px 8px; border: 0; border-radius: 14px;
  background: rgba(124,92,252,.06); font: inherit; color: inherit; text-align: center; cursor: pointer;
  -webkit-tap-highlight-color: transparent; transition: transform .12s ease, background .12s ease;
}
.ps-tile:active { transform: scale(.95); }
.ps-pv { position: relative; display: block; width: 100%; aspect-ratio: 3 / 4; border-radius: 10px; overflow: hidden; background: linear-gradient(160deg, #e8eaf6, #d6dbef); }
/* v1.9.02 ⑤：缩略图卡 1px 浅描边 —— 「素白」这类浅色主题不再像一张空白图 */
.ps-pv { box-shadow: inset 0 0 0 1px rgba(150,150,230,.28); }
[data-theme="dark"] .ps-pv { box-shadow: inset 0 0 0 1px rgba(150,150,230,.22); }
.ps-pv img { width: 100%; height: 100%;   display: block; }
.ps-tile.locked .ps-pv img { filter: grayscale(1) brightness(.94); --ps-img-o: .5; }   /* v1.6.41：透明度改走变量，配合就绪淡入 */
.ps-tile.locked .ps-pv::after { content: ''; position: absolute; inset: 0; background: rgba(18,20,36,.3); }
.ps-lv { position: absolute; left: 4px; bottom: 4px; z-index: 2; padding: 1px 6px; border-radius: 999px; background: rgba(10,12,26,.6); color: #fff; font-size: 11px; font-style: normal; font-weight: 700; letter-spacing: .3px; }
.ps-ok { position: absolute; right: 4px; bottom: 4px; z-index: 2; width: 19px; height: 19px; border-radius: 999px; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #4a6cf7, #8b5cf6); color: #fff; font-size: 12px; font-style: normal; font-weight: 700; box-shadow: 0 3px 8px rgba(74,108,247,.45); }
.ps-tile b { font-size: 11px; }
.ps-tile .ps-tag { font-size: 11px; color: var(--text-3); }
.ps-tile.on { background: rgba(124,92,252,.16); box-shadow: inset 0 0 0 1px rgba(124,92,252,.34); }
.ps-tile.on .ps-tag { color: #6d5ce7; font-weight: 700; }
.ps-note { margin-top: 10px; font-size: 11px; line-height: 1.6; color: var(--text-3); }
/* v1.6.40：绝版分区（对齐昵称面板的「初代流光」） */
.ps-sec { display: flex; align-items: baseline; gap: 6px; margin: 12px 0 8px; }
.ps-sec b { font-size: 11px; font-weight: 700; color: #f5b94e; }
.ps-sec span { font-size: 11px; color: var(--text-3); }
.ps-lv-gold { background: linear-gradient(135deg, #f5b94e, #e0942e); color: #1a1f36; }
.ps-tile.ps-legacy:not(.locked) { background: rgba(245,185,78,.10); }
.ps-tile.ps-legacy.on { background: rgba(245,185,78,.20); box-shadow: inset 0 0 0 1px rgba(224,148,46,.45); }
.ps-tile.ps-legacy.on .ps-tag { color: #f5b94e; }
.ps-tile[disabled] { cursor: default; }
[data-theme="dark"] .ps-tile { background: rgba(255,255,255,.05); }
[data-theme="dark"] .ps-tile.on { background: rgba(255,255,255,.10); }
[data-theme="dark"] .ps-tile.on .ps-tag { color: #c4b2ff; }
[data-theme="dark"] .ps-tile.ps-legacy:not(.locked) { background: rgba(245,185,78,.10); }
[data-theme="dark"] .ps-tile.ps-legacy.on { background: rgba(245,185,78,.18); }

/* ===== v1.6.41 · 海报面板体验修正（折叠 · 并发加载淡入 · 预览层 · 规则入口）=====
   产品真机 4 条：①一张一张跳出来 → 去掉逐张定时器、可见款并发加载 + 就绪淡入；
   ②未获得不能预览 → 锁定款点开大图预览层（只读）；③一次展示太多 → 前 4 张 +「更多」折叠；
   ④没有规则入口 → 标题右侧「规则 ›」弹层。 */
/* v1.6.43：规则入口对比度加大（产品：最弱灰太隐蔽没看到）—— 弱灰文字 → 主题紫药丸，两处入口（海报面板 / 等级页）共用同一套样式 */
.ps-rule, .rule-link { display: inline-flex; align-items: center; gap: 3px; border: 0; border-radius: 999px; padding: 4px 10px; background: rgba(124,92,252,.10); font: inherit; font-size: 11px; font-weight: 700; color: var(--primary); cursor: pointer; -webkit-tap-highlight-color: transparent; }
.ps-rule:active, .rule-link:active { opacity: .65; }
[data-theme="dark"] .ps-rule, [data-theme="dark"] .rule-link { background: rgba(164,140,255,.16); color: #c4b2ff; }
.ps-more { display: block; width: 100%; margin-top: 8px; padding: 8px 0; border: 0; border-radius: 12px; background: rgba(124,92,252,.06); color: var(--text-3); font: inherit; font-size: 11px; font-weight: 700; cursor: pointer; -webkit-tap-highlight-color: transparent; }
.ps-more:active { transform: scale(.98); }
/* 折叠：默认藏起 .ps-fold；面板加上 .ps-expanded 后全部显示（绝版区不受影响，永不折叠） */
.ps-panel:not(.ps-expanded) .ps-tile.ps-fold { display: none; }
/* 图片淡入：骨架 = .ps-pv 自带渐变底；加载就绪后 200ms 淡入（锁定档淡入到 50% 透明度） */
.ps-pv img {
  object-fit: cover;
  object-position: center 32%; opacity: 0; transition: opacity .2s ease; }
.ps-pv img.ready { opacity: var(--ps-img-o, 1); }
/* 大图预览层（复用 .modal 弹层；竖版图等高缩放，居中显示） */
.ps-preview-box { display: flex; justify-content: center; }
.ps-preview-box img { height: min(52vh, 560px); width: auto; max-width: 100%; border-radius: 14px; box-shadow: 0 12px 30px rgba(20,16,60,.3); }
.ps-preview-meta { margin-top: 12px; text-align: center; font-size: 12px; line-height: 1.7; color: var(--text-3); }
/* 规则说明层 */
.ps-rule-list { margin: 0; padding-left: 18px; font-size: 12px; line-height: 1.9; }
.ps-rule-prog { margin-top: 12px; padding: 10px 12px; border-radius: 12px; background: rgba(124,92,252,.08); font-size: 12px; font-weight: 700; color: var(--text-2); }
[data-theme="dark"] .ps-more { background: rgba(255,255,255,.06); }

/* ===== v1.6.45 · 管理员入口（登录页 logo 连点 5 次的隐藏手势 + 登录弹层 + 资料卡徽章）=====
   弹层复用 consent-mask / consent-sheet 的遮罩与卡片样式，这里只补 admin- 专属排版；
   新规则一律 .admin- 前缀 —— 唯一例外是 logo 触发区加一条 touch-action:manipulation
   （只为防 iOS 双击缩放干扰连点，不改变任何外观属性；.auth-wrap/.auth-logo 等原有规则一字未动）。 */
.auth-wrap .auth-logo-icon, .auth-wrap .auth-logo { touch-action: manipulation; }
.admin-mask { z-index: 9600; }
.admin-sheet { padding-bottom: calc(18px + env(safe-area-inset-bottom, 0px)); }
.admin-title { margin: 6px 2px 12px; font-size: 16px; font-weight: 700; color: var(--text-1); }
.admin-input { display: block; width: 100%; margin-bottom: 9px; }
.admin-actions { display: flex; gap: 10px; margin-top: 3px; }
.admin-badge { display: inline-flex; align-items: center; gap: 3px; padding: 2px 8px; border-radius: 14px; font-size: 11px; font-weight: 700; color: #1a1f36; background: linear-gradient(135deg, #ffd97a, #f0a93b); box-shadow: inset 0 0 0 1px rgba(255,255,255,.4); }
[data-theme="dark"] .admin-badge { color: #a8b0c8; }

/* ===== v1.6.48 · AI 票根识别卡（ai-import.js 专用；新规则一律 .ai- 前缀，不动既有视觉）=====
   三态：高（绿）/ 中（琥珀）/ 低（红，两列对照）；375 与 414 宽都不许挤压或错位。 */
.ai-import-host { margin-bottom: 12px; }
.ai-card { border: 1px solid var(--border-soft); border-radius: 14px; background: var(--card-solid); padding: 13px 14px; font-size: 12px; box-shadow: 0 6px 18px rgba(31,38,135,.05); }
[data-theme="dark"] .ai-card { box-shadow: 0 8px 22px rgba(0,0,0,.3); }






.ai-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ai-badge { padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 700; }


.ai-low, .ai-error { background: rgba(207,60,60,.14); color: #dc3545; }
.ai-tip { color: var(--text-2); font-size: 11px; line-height: 1.5; }
.ai-rows { margin-top: 10px; }
.ai-row { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0; border-bottom: 1px dashed var(--border-soft); }
.ai-row:last-child { border-bottom: none; }
.ai-k { color: var(--text-3); flex: 0 0 auto; }
.ai-v { color: var(--text-1); font-weight: 600; text-align: right; word-break: break-all; }
.ai-none { color: var(--text-3); font-weight: 400; }


.ai-acts { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 11px; }
.ai-foot { margin-top: 8px; font-size: 11px; color: var(--text-3); }
.ai-loading { display: flex; align-items: center; gap: 9px; color: var(--text-2); }

@keyframes ai-spin { to { transform: rotate(360deg); } }
.ai-err-extra { margin-top: 8px; color: var(--text-2); font-size: 11px; }
.ai-manual { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; color: var(--text-3); font-size: 11px; }
@media (max-width: 380px) {
  
}

/* ===== v1.6.51 → v1.6.57 · 《添加演唱会》整页视觉（流光全息 · 收敛版 · 全站同源）=====
   设计令牌（全部取自首页 / 行程页 / 底部 Tab，不新造一套）：
     主色 #4a6cf7 · 品牌紫 #7c5cfc · 流光三色 #7ee0ff / #b58cff / #ff9ad5
     圆角 --radius 22 / --radius-sm 14 · 卡片 = 微光纸 + 发丝描边 + 单层柔影
     间距栅格 4 / 8 / 12 / 14 · 字号阶梯 10.5 / 11.5 / 12.5 / 13.5 / 15 / 20
     图标 = 内联线性 SVG（1.5–1.7px 描边），与首页图标同族
   科技感只来自四样：低饱和流光层次、极细高光描边、克制的微光晕、精确间距。
   v1.6.52 按产品拍板换成「3 号流光全息」；v1.6.57 按 polish2 渲染稿收敛：主按钮浅底主色字、光效放慢放弱、
   识别中改六段真实时间轴（含真实耗时/库量）、结果卡不再展示可信度、右上角保存回站点通用主按钮；
   动效只用 transform / opacity（光带扫过用 transform 位移，流光底用缓慢旋转），并提供 prefers-reduced-motion 降级。
   所有规则都带 .pe-page / .ai-import-host / .ai-tag 前缀 —— 只作用于这一页与入口标贴，其它页面一字不动。 */

/* ---- 1. 顶部：只有 backBar（返回 + 标题 + 右上角保存）—— v1.6.52 按产品要求删掉那张「记录一场奔赴」卡片，
   首屏 backBar 下面直接就是 AI 卡；间距由下面的 :first-child 收口，不留空洞。---- */
.pe-page .body > .pe-sec:first-child, .pe-page form > .pe-sec:first-child { margin-top: 0; }

/* ---- 2. 分组卡片：一摞白盒子 → 三块（演出信息 / 封面 / 更多信息），块头一行小标题 ---- */
.pe-page .pe-sec { padding: 15px 15px 5px; margin-bottom: 12px; border-color: rgba(196,200,240,.55); }
.pe-page .pe-sec-h { display: flex; align-items: baseline; gap: 8px; margin-bottom: 12px; }
.pe-page .pe-sec-t { position: relative; padding-left: 10px; font-size: 12px; font-weight: 700; letter-spacing: .2px; color: var(--text-1); }
.pe-page .pe-sec-t::before { content: ''; position: absolute; left: 0; top: 50%; width: 3px; height: 12px; margin-top: -6px; border-radius: 2px; background: linear-gradient(180deg, #7ee0ff, #b58cff 55%, #ff9ad5); }
.pe-page .pe-sec-s { font-size: 11px; color: var(--text-3); }
.pe-page .pe-field { margin-bottom: 13px; }
.pe-page .pe-field label { display: flex; align-items: center; gap: 6px; margin-bottom: 7px; }
.pe-page .pe-field label svg { flex: none; color: #4a6cf7; opacity: .9; }
[data-theme="dark"] .pe-page .pe-field label svg { color: #c4b2ff; }
.pe-page .pe-req { color: #dc3545; font-weight: 700; }
.pe-page .pe-opt { margin-left: 2px; padding: 1px 7px; border-radius: 999px; background: rgba(124,92,252,.09); font-size: 11px; font-weight: 700; color: var(--text-3); }

/* 聚焦 = 主色细描边 + 轻微光晕（不再是「整圈透明 + 大光斑」）*/
.pe-page .input:focus, .pe-page .textarea:focus {
  border-color: rgba(160,160,240,.62); background: linear-gradient(160deg,#fff,#fbfaff);
  box-shadow: 0 0 0 3px rgba(140,140,240,.14), 0 2px 10px rgba(126,120,230,.12);
}
[data-theme="dark"] .pe-page .input:focus, [data-theme="dark"] .pe-page .textarea:focus { background: rgba(255,255,255,.08); border-color: rgba(160,141,255,.6); box-shadow: 0 0 0 3px rgba(124,92,252,.2); }
/* 错误态：统一红点 + 细红线（:user-invalid 只在用户真的动过之后才亮，不支持的浏览器直接忽略）*/
.pe-page .input:user-invalid, .pe-page .textarea:user-invalid { border-color: rgba(226,87,76,.6); box-shadow: 0 0 0 3px rgba(226,87,76,.10); }
.pe-page .pe-field:has(.input:user-invalid) label { color: #dc3545; }

/* ---- 3. 封面：虚线投放区 → 选中后真图 + 「更换 / 移除」----
   原图不裁、只自己可见、选完先存 pendingImg —— 规则全部照旧；这里只换外观。
   整块被透明 file input 覆盖：点图 = 换图，和手机端「点一下调起相册/相机」一个动作。 */
.pe-page .pe-cover {
  position: relative; display: flex; align-items: center; justify-content: center; min-height: 132px; padding: 12px;
  border: 1.5px dashed rgba(124,92,252,.38); border-radius: 16px;
  background: linear-gradient(160deg, rgba(124,92,252,.05), rgba(255,255,255,.5));
  overflow: hidden; transition: border-color .18s ease, background .18s ease;
}
.pe-page .pe-cover:active { border-color: rgba(124,92,252,.62); }
[data-theme="dark"] .pe-page .pe-cover { border-color: rgba(160,141,255,.34); background: linear-gradient(160deg, rgba(124,92,252,.1), rgba(255,255,255,.02)); }
.pe-page .pe-cover:has(.pe-cover-img[src]) { border-style: solid; border-color: rgba(124,92,252,.16); background: rgba(255,255,255,.5); }
[data-theme="dark"] .pe-page .pe-cover:has(.pe-cover-img[src]) { background: rgba(255,255,255,.04); }
.pe-page .pe-cover-file { position: absolute; inset: 0; z-index: 3; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
.pe-page .pe-cover-ph { display: flex; flex-direction: column; align-items: center; gap: 3px; font-size: 11px; line-height: 1.45; color: var(--text-3); text-align: center; }
.pe-page .pe-cover-ph svg { margin-bottom: 2px; color: #6d5ce7; opacity: .8; }
.pe-page .pe-cover-ph b { font-size: 12px; font-weight: 700; color: var(--text-2); }
.pe-page .pe-cover-img { position: relative; z-index: 1; max-width: 100%; max-height: 158px; border-radius: 12px; box-shadow: 0 8px 20px rgba(31,38,135,.16); }
.pe-page .pe-cover-img[src] ~ .pe-cover-ph { display: none; }
.pe-page .pe-cover-tag {
  position: absolute; right: 8px; top: 8px; z-index: 2; display: none; align-items: center;
  padding: 3px 10px; border-radius: 999px; background: rgba(18,14,48,.55); color: #fff;
  font-size: 11px; font-weight: 700; letter-spacing: .2px; backdrop-filter: blur(6px); pointer-events: none;
}
.pe-page .pe-cover-img[src] ~ .pe-cover-tag { display: inline-flex; }
.pe-page .up-hint { margin-top: 9px; }

/* ---- 4. 「更多信息」折叠区并入同一套卡片语言 ---- */
.pe-page .more-box {
  margin: 0 0 12px; border: 1px solid rgba(255,255,255,.9); border-radius: var(--radius);
  background: linear-gradient(160deg, rgba(255,255,255,.94), rgba(246,246,255,.96) 55%, rgba(252,243,255,.94));
  box-shadow: 0 0 0 .5px rgba(99,112,255,.10), 0 10px 26px rgba(31,38,135,.07), inset 0 1px 0 rgba(255,255,255,.95);
}
[data-theme="dark"] .pe-page .more-box { background: linear-gradient(160deg, rgba(26,31,52,.92), rgba(24,27,48,.94) 55%, rgba(31,26,52,.92)); border-color: rgba(255,255,255,.09); box-shadow: 0 0 0 .5px rgba(255,255,255,.04), 0 14px 34px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.09); }
.pe-page .more-head { padding: 14px 15px; background: transparent; border: none; }
.pe-page .more-body { padding: 0 15px 1px; }
.pe-page .more-body .grid2 { margin-bottom: 0; }

/* ---- 5. AI 智能填写：流光全息 · 收敛版（v1.6.57，按 polish2 渲染稿逐像素落地）----
   浅色流光底 + 极细高光描边 + 渐变方块图标；AI 卡主按钮 = 浅底 + 主色文字（#343a9e on ≈#e9edff ≈ 7.4:1），
   不再是深色实心块；光效放慢放弱（底 9s 一圈、光带 7.2s 一次、峰值更低）。动效只用 transform / opacity。*/
@keyframes peRise { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@keyframes holoFlow { to { transform: rotate(360deg); } }
@keyframes holoSweep { 0%, 100% { transform: translateX(-32%); opacity: .16; } 50% { transform: translateX(32%); opacity: .3; } }
@keyframes holoRing { to { transform: rotate(360deg); } }
@keyframes aiTagPulse { 0%, 100% { transform: scale(1); opacity: .9; } 50% { transform: scale(1.07); opacity: 1; } }
@keyframes aiScanOnce { from { transform: translateY(-120%); } to { transform: translateY(320%); } }
@keyframes aiDrift { from { transform: translate3d(0,0,0); opacity: .35; } to { transform: translate3d(3px,-6px,0); opacity: .9; } }
@keyframes aiBarGlow { from { transform: translateX(-100%); } to { transform: translateX(260%); } }
@keyframes aiCheckPop { from { transform: scale(.4); opacity: 0; } to { transform: scale(1); opacity: 1; } }
@keyframes aiBurst { from { transform: translateX(-120%); } to { transform: translateX(240%); } }
.ai-import-host .ai-card { border-radius: 18px; border: 1px solid var(--border-soft); background: var(--card-solid); padding: 14px; font-size: 12px; box-shadow: 0 8px 22px rgba(31,38,135,.07); animation: peRise .2s ease-out both; }
.ai-import-host .ai-hero {
  position: relative; overflow: hidden; padding: 15px 15px 12px;
  border: 1px solid rgba(196,200,240,.62);
  background: linear-gradient(150deg, rgba(126,224,255,.26) 0%, rgba(255,255,255,.95) 42%, rgba(181,140,255,.2) 72%, rgba(255,154,213,.18) 100%);
  box-shadow: 0 12px 28px rgba(126,120,230,.13), inset 0 1px 0 rgba(255,255,255,.9);
}
/* 流光层：大一圈的 conic 渐变 9s 一圈（v1.6.52 是 6s），峰值也更低（只动 transform，不重绘文字） */
.ai-import-host .ai-hero::before {
  content: ''; position: absolute; left: -30%; top: -60%; width: 160%; height: 220%; z-index: 0; pointer-events: none;
  background: conic-gradient(from 0deg, rgba(126,224,255,.5), rgba(181,140,255,.4), rgba(255,154,213,.36), rgba(126,224,255,.5));
  filter: blur(28px); opacity: .2; will-change: transform; animation: holoFlow 9s linear infinite;
}
/* 光带横扫：7.2s 一次（v1.6.52 是 2.6s），峰值 0.3（原来 0.6）——更慢更弱，不盖字 */
.ai-import-host .ai-hero::after {
  content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background: linear-gradient(105deg, transparent 38%, rgba(255,255,255,.42) 50%, transparent 62%);
  animation: holoSweep 7.2s ease-in-out infinite;
}
.ai-import-host .ai-hero > * { position: relative; z-index: 1; }
.ai-import-host .ai-hero-head { display: flex; align-items: center; gap: 10px; }
.ai-import-host .ai-hero-ic {
  flex: none; width: 38px; height: 38px; border-radius: 12px; display: flex; align-items: center; justify-content: center; color: #1a1f36;
  background: linear-gradient(135deg, #c9f2ff 0%, #e6dcff 55%, #ffe0f2 100%);
  box-shadow: 0 6px 16px rgba(126,120,230,.22), inset 0 1px 0 rgba(255,255,255,.9);
}
.ai-import-host .ai-hero-t { font-size: 16px; font-weight: 700; letter-spacing: .3px; color: #1a1f36; }
.ai-import-host .ai-hero-btn {
  display: flex; align-items: center; gap: 9px; margin-top: 13px; padding: 13px 15px; border-radius: 12px;
  background: linear-gradient(115deg, rgba(226,233,255,.97) 0%, rgba(240,231,255,.97) 52%, rgba(226,244,252,.97) 100%);
  border: 1px solid rgba(122,126,224,.4); color: #4a6cf7; font-size: 14px; font-weight: 700; letter-spacing: .2px;
  cursor: pointer; -webkit-tap-highlight-color: transparent;
  box-shadow: 0 4px 14px rgba(122,126,224,.14), inset 0 1px 0 rgba(255,255,255,.9);
  transition: transform .16s ease, box-shadow .16s ease;
}
.ai-import-host .ai-hero-btn:active { transform: scale(.985); box-shadow: 0 2px 8px rgba(122,126,224,.18); }
.ai-import-host .ai-hero-btn-ic, .ai-import-host .ai-hero-btn-go { flex: none; display: flex; color: #4a6cf7; }
.ai-import-host .ai-hero-btn-t { flex: 1; min-width: 0; }
/* 这张表单里有一条老规则给 input[type=file] 强上 display:flex（虚线上传区），会盖掉 hidden 属性 ——
   把 AI 的选图 input 收成 1px 隐形件（仍可被 label 点开，iOS/微信 web-view 都认这条路）。 */
.ai-import-host input[data-ai-file] {
  position: absolute !important; width: 1px !important; height: 1px !important; min-height: 0 !important;
  margin: 0 !important; padding: 0 !important; border: 0 !important; opacity: 0; pointer-events: none; overflow: hidden;
}
.ai-import-host .ai-hero-alt {
  display: block; width: 100%; margin-top: 10px; padding: 6px 0; border: 0; background: none;
  color: #6d5ce7; font: inherit; font-size: 12px; font-weight: 700;
  cursor: pointer; -webkit-tap-highlight-color: transparent;
}
.ai-import-host .ai-hero-alt:active { opacity: .65; }
.ai-import-host .ai-hero-foot { margin-top: 8px; font-size: 11px; line-height: 1.5; color: #6b7390; }

/* ---- 6. 识别中（流光全息 · v1.6.57 六段）：环形流光 + 光带扫过 + 微光粒子 + 缩略图单次扫描 + 流光进度条 ----
   六段靠 data-stage 驱动（读取图片 / 增强图像 / 识别文字 / 理解内容 / 核对赴星库 / 生成结果），
   每段配一句「正在做什么」；百分比由 AI_STAGE_PCT 统一给，只在真实时间到点/服务端真返回才推进。*/
.ai-import-host .ai-loading { display: block; position: relative; overflow: hidden; }
.ai-import-host .ai-load-main { display: flex; align-items: center; gap: 12px; }
.ai-import-host .ai-load-vis {
  position: relative; flex: none; width: 74px; height: 74px; border-radius: 14px; overflow: hidden;
  background: linear-gradient(140deg, #e7ecff, #f3ecff); box-shadow: inset 0 0 0 1px rgba(150,155,235,.35);
}
.ai-import-host .ai-load-thumb {
  position: absolute; inset: 0; border-radius: 14px; overflow: hidden; z-index: 1;
  display: flex; align-items: center; justify-content: center; color: #4a6cf7;
}
.ai-import-host .ai-load-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* 环形光：9s 一圈（只动 transform） */
.ai-import-host .ai-load-ring {
  position: absolute; inset: -1px; border-radius: 15px; z-index: 2; pointer-events: none;
  background: conic-gradient(from 0deg, rgba(126,224,255,0), rgba(126,224,255,.9), rgba(181,140,255,.85), rgba(255,154,213,.8), rgba(126,224,255,0));
  -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 2px));
  mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 2px));
  animation: holoRing 9s linear infinite;
}
/* 缩略图扫描：2s 只扫一次（不是循环闪烁） */
.ai-import-host .ai-load-scan {
  position: absolute; left: 0; right: 0; top: 0; height: 34%; z-index: 2; pointer-events: none;
  background: linear-gradient(180deg, rgba(255,255,255,0), rgba(255,255,255,.75) 55%, rgba(255,255,255,0));
  animation: aiScanOnce 2s cubic-bezier(.35,0,.25,1) 1 forwards;
}
.ai-import-host .ai-load-p1, .ai-import-host .ai-load-p2, .ai-import-host .ai-load-p3 {
  position: absolute; width: 4px; height: 4px; border-radius: 50%; z-index: 2; pointer-events: none;
  background: #a9b6ff; box-shadow: 0 0 6px rgba(150,160,255,.9);
}
.ai-import-host .ai-load-p1 { left: 8px; top: 56px; animation: aiDrift 3.6s ease-in-out infinite alternate; }
.ai-import-host .ai-load-p2 { left: 56px; top: 12px; background: #d5b6ff; animation: aiDrift 4.2s ease-in-out infinite alternate-reverse; }
.ai-import-host .ai-load-p3 { left: 62px; top: 58px; background: #9fe6ff; animation: aiDrift 4.8s ease-in-out infinite alternate; }
.ai-import-host .ai-load-tx { flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 8px; }
.ai-import-host .ai-load-head { flex: 1; min-width: 0; font-size: 14px; font-weight: 700; color: #1a1f36; }
.ai-import-host .ai-load-pct { margin-left: auto; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 14px; font-weight: 700; color: #4a6cf7; font-variant-numeric: tabular-nums; }
.ai-import-host .ai-load-bar { flex-basis: 100%; margin-top: 8px; height: 6px; border-radius: 999px; background: rgba(150,155,235,.2); overflow: hidden; position: relative; }
.ai-import-host .ai-load-bar i { display: block; height: 100%; width: 14%; border-radius: 999px; background: linear-gradient(90deg, #7ee0ff, #b58cff 55%, #ff9ad5); transition: width .5s cubic-bezier(.3,.8,.3,1); }
.ai-import-host .ai-load-bar::after { content: ''; position: absolute; inset: 0; width: 40%; background: linear-gradient(90deg, transparent, rgba(255,255,255,.55), transparent); animation: aiBarGlow 2.8s linear infinite; }
.ai-import-host .ai-load-sub { flex-basis: 100%; margin-top: 8px; font-size: 12px; color: #4a6cf7; }
.ai-import-host .ai-load-meta { flex-basis: 100%; margin-top: 6px; font-size: 11px; color: #6b7390; }
.ai-import-host .ai-load-meta em { font-style: normal; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-variant-numeric: tabular-nums; font-weight: 700; color: #4a6cf7; }
.ai-import-host .ai-load-steps { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px; font-size: 11px; }
.ai-import-host .ai-load-steps span { padding: 3px 8px; border-radius: 999px; font-weight: 700; color: #6b7390; background: rgba(255,255,255,.72); box-shadow: inset 0 0 0 1px rgba(160,164,225,.3); transition: color .16s ease, background .16s ease, box-shadow .16s ease; }
.ai-import-host .ai-load-steps span.done { color: #4a6cf7; background: rgba(233,237,255,.9); }
.ai-import-host .ai-load-steps span.on { color: #4a6cf7; background: linear-gradient(115deg, #e7edff, #f2e9ff); box-shadow: inset 0 0 0 1px rgba(122,126,224,.5); }
.ai-import-host .ai-load-wait { margin-top: 8px; font-size: 11px; color: #f5b94e; opacity: 0; transition: opacity .2s ease; }
.ai-import-host .ai-load-wait.on { opacity: 1; }
/* 完成收尾：勾选 + 光带一次（结果卡接管前约 0.2s，不弹窗、不硬切） */
.ai-import-host .ai-load-done { position: absolute; inset: 0; z-index: 3; display: none; align-items: center; justify-content: center; border-radius: 18px; background: rgba(255,255,255,.6); }
.ai-import-host .ai-loading.is-done .ai-load-done { display: flex; }
.ai-import-host .ai-load-check { width: 34px; height: 34px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: #fff; background: linear-gradient(135deg, #6b7ae0, #9370e0); box-shadow: 0 8px 18px rgba(122,126,224,.4); animation: aiCheckPop .32s cubic-bezier(.2,.9,.3,1.4) 1 both; }
.ai-import-host .ai-load-burst { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
.ai-import-host .ai-load-burst::before { content: ''; position: absolute; top: 0; bottom: 0; width: 46%; background: linear-gradient(105deg, transparent, rgba(255,255,255,.8), transparent); animation: aiBurst .7s ease-out 1 both; }

/* ---- 7. 结果卡（v1.6.57：不再出现「高/中/低可信」字样；中性标题 + 未识别 + 中性提示）----
   库内冲突仍是「不预填 + 并列两种说法」（375 上下排、414 并排）；全未识别只留「手动填写」。*/
.ai-import-host .ai-result.ai-v-high { border-color: rgba(160,160,240,.5); box-shadow: 0 8px 22px rgba(109,92,231,.12); }
.ai-import-host .ai-result.ai-v-medium, .ai-import-host .ai-result.ai-v-none { border-color: rgba(196,200,240,.55); }
.ai-import-host .ai-result.ai-v-low { border-color: rgba(196,200,240,.6); box-shadow: 0 8px 22px rgba(109,92,231,.1); }
.ai-import-host .ai-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 10px; }
.ai-import-host .ai-title { font-size: 14px; font-weight: 700; line-height: 1.4; color: #1a1f36; }
.ai-import-host .ai-tip { font-size: 11px; color: var(--text-3); }
.ai-import-host .ai-rows { margin-top: 0; border: 1px solid rgba(196,200,240,.45); border-radius: 14px; overflow: hidden; }
/* v1.6.57：开场时间的来源小标签（图片识别 / 文字识别 / 演出库补齐）—— 浅底细边，不抢字段值 */
.ai-import-host .ai-src {
  display: inline-flex; align-items: center; margin-left: 6px; padding: 1px 6px; border-radius: 999px;
  font-size: 11px; font-weight: 700; font-style: normal; vertical-align: 1px;
  color: #6b7390; background: rgba(240,242,255,.92); border: 1px solid rgba(122,126,224,.28);
}
[data-theme="dark"] .ai-import-host .ai-src { color: #eef1ff; background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.18); }
.ai-import-host .ai-row { display: flex; justify-content: space-between; gap: 12px; padding: 9px 12px; border-bottom: none; font-size: 12px; background: rgba(255,255,255,.72); }
.ai-import-host .ai-row + .ai-row { border-top: 1px solid rgba(196,200,240,.35); }
.ai-import-host .ai-v.ai-none { color: #6b7390; font-weight: 600; }
.ai-import-host .ai-note { margin-top: 9px; font-size: 12px; line-height: 1.5; color: #4a6cf7; }
.ai-import-host .ai-acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.ai-import-host .ai-acts .ai-cta { flex: 1; }
.ai-import-host .ai-acts .ai-cta.full { flex: 1 0 100%; }
/* AI 卡里的主操作（浅底 + 主色文字）：与入口卡主按钮同一套，收敛不刺眼 */
.ai-import-host .btn.ai-cta {
  background: linear-gradient(115deg, rgba(226,233,255,.97), rgba(240,231,255,.97) 52%, rgba(226,244,252,.97));
  border: 1px solid rgba(122,126,224,.4); color: #4a6cf7;
  box-shadow: 0 4px 14px rgba(122,126,224,.14), inset 0 1px 0 rgba(255,255,255,.9);
}
.ai-import-host .ai-cta-ic { display: inline-flex; margin-right: 4px; }
.ai-import-host .ai-foot { margin-top: 9px; text-align: center; font-size: 11px; color: #6b7390; }
/* v1.9.02 ③：这里的「渐变紫胶囊」覆盖已删（老板：保存按钮要扁平、底色和外层统一）——
   添加 / 编辑演唱会页右上「保存」现在吃全站统一的顶栏扁平款（见「⑤ 页面右上操作位」那一节）。
   底部那颗 .btn-primary.btn-block 主按钮不变（它就是这一页唯一的主操作）。 */
/* 暗色主题：同一套流光，只把底压深保证对比度 */
[data-theme="dark"] .ai-import-host .ai-hero { background: linear-gradient(150deg, rgba(126,224,255,.14) 0%, rgba(30,28,60,.94) 46%, rgba(181,140,255,.18) 100%); border-color: rgba(160,141,255,.32); }
[data-theme="dark"] .ai-import-host .ai-hero-t, [data-theme="dark"] .ai-import-host .ai-load-head, [data-theme="dark"] .ai-import-host .ai-title { color: #eef1ff; }
[data-theme="dark"] .ai-import-host .ai-hero-foot, [data-theme="dark"] .ai-import-host .ai-foot, [data-theme="dark"] .ai-import-host .ai-load-meta { color: #a8b0c8; }
[data-theme="dark"] .ai-import-host .ai-hero-alt { color: #c4b2ff; }
[data-theme="dark"] .ai-import-host .ai-hero-btn { background: linear-gradient(115deg, rgba(90,96,180,.35), rgba(110,88,180,.3)); border-color: rgba(160,141,255,.4); color: #eef1ff; }
[data-theme="dark"] .ai-import-host .ai-hero-btn-ic, [data-theme="dark"] .ai-import-host .ai-hero-btn-go { color: #c4b2ff; }
[data-theme="dark"] .ai-import-host .ai-load-vis { background: linear-gradient(140deg, #2a2550, #241f45); }
[data-theme="dark"] .ai-import-host .ai-load-thumb { color: #c4b2ff; }
[data-theme="dark"] .ai-import-host .ai-load-sub { color: #c4b2ff; }
[data-theme="dark"] .ai-import-host .ai-load-steps span { background: rgba(255,255,255,.06); color: #a8b0c8; box-shadow: inset 0 0 0 1px rgba(160,160,230,.24); }
[data-theme="dark"] .ai-import-host .ai-load-steps span.on { background: rgba(124,92,252,.24); color: #eef1ff; }
[data-theme="dark"] .ai-import-host .ai-rows { background: rgba(255,255,255,.05); border-color: rgba(255,255,255,.1); }
[data-theme="dark"] .ai-import-host .ai-row { background: rgba(255,255,255,.05); }
[data-theme="dark"] .ai-import-host .ai-row + .ai-row { border-top-color: rgba(255,255,255,.09); }
[data-theme="dark"] .ai-import-host .ai-note { color: #c4b2ff; }
[data-theme="dark"] .ai-import-host .btn.ai-cta { background: linear-gradient(115deg, rgba(90,96,180,.35), rgba(110,88,180,.3)); border-color: rgba(160,141,255,.4); color: #eef1ff; }
/* 375 这类窄屏：两种说法自动上下排（414 及更宽保持左右对照）*/
/* v1.8.05（老板 图 1）：两栏对比（.ai-cmp / .ai-cmp-col / .ai-cmp-t / .ai-empty）整组删除 ——
   命中 / 冲突 / 未命中都只走一张「唯一结果卡」，对比信息全部回到接口与台账，前端一处不留。 */

/* ---- 8. v1.6.52 · 站内「添加演唱会」入口右上角的小 AI 标贴 ----
   一个可复用元素 + 一个类；绝对定位、pointer-events:none —— 不改按钮尺寸，也不吃点击区域。
   （类名没用 .ai-badge：那个已经在结果卡里表示「高/中/低可信」，改它会把三态卡一起带偏。）*/
.ai-tag {
  /* v1.8.03 ①：全站统一成**行内小胶囊**（position:static，不再用负偏移）——
     v1.6.52 那套「绝对定位 + top/right:-7px」放到会被 overflow:hidden 裁的卡里就是一道白斜线 / 白胶囊。
     配色定版 = 金底深字（与 P01 主卡 v1.8.01 ⑦ 同款）：四处（P01 主卡 / 导入成行 / 生成中 / 首页 AI 格子）完全一致。 */
  position: static; display: inline-flex; align-items: center; vertical-align: 1px;
  margin-left: 6px; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 700; letter-spacing: .3px; line-height: 1.5;
  /* v1.8.04 ②：底色回到「之前那款紫」（品牌紫 → 蓝绿），字白；`-webkit-text-fill-color` 必须显式给，
     否则落进带渐变文字的 <b>（首页格子 / 主卡标题）会继承 transparent ⇒ 胶囊里看不到「AI」。 */
  color: #fff; background: linear-gradient(120deg, #556fe8, #8a4fe0 48%, #2c96bd);
  -webkit-text-fill-color: currentColor;
  border: 1px solid rgba(109,92,231,.5); pointer-events: none;
  box-shadow: 0 2px 7px rgba(109,92,231,.36), inset 0 1px 0 rgba(255,255,255,.3);
  animation: aiTagPulse 2.6s ease-in-out infinite;
}
/* .btn 自带 overflow:hidden（顶部高光层靠它裁），不放开就会把角标裁掉 */
.btn:has(.ai-tag), .heg-btn:has(.ai-tag) { position: relative; overflow: visible; }
.fab-add:has(.ai-tag) { overflow: visible; }
/* 回忆页那颗圆形「+」：标贴改成图标下方一小行（仍是行内胶囊，不用负偏移） */
.fab-add .ai-tag { position: static; display: block; margin: 1px auto 0; font-size: 11px; padding: 0 5px; letter-spacing: .2px; }

/* 系统开了「减弱动态效果」→ 全部动画停掉，只留静态样式（不留半途旋转）*/
@media (prefers-reduced-motion: reduce) {
  .ai-import-host .ai-hero::before, .ai-import-host .ai-hero::after,
  .ai-import-host .ai-load-ring, .ai-import-host .ai-load-scan,
  .ai-import-host .ai-load-p1, .ai-import-host .ai-load-p2, .ai-import-host .ai-load-p3,
  .ai-import-host .ai-load-bar::after, .ai-import-host .ai-load-check,
  .ai-import-host .ai-load-burst::before, .ai-tag { animation: none !important; }
  .ai-import-host .ai-card, .ai-import-host .ai-load-bar i { animation: none !important; transition: none !important; }
}

/* =====================================================================
   v1.6.57 · AI 卡定稿：极光深空（浅 / 中 / 深）+ 虹彩流光 + 三种输入平级
   + 识别确认闸门 + 10 点配额可视化 + 结果卡内联二次确认 + 手动区合并成一张卡
   规矩：科技感只来自「渐变层次 + 极细高光描边 + 克制的微光」，动效只用 transform / opacity。
   深浅三档都是深底白字（浅档最亮 #4a4190 上白字 7.5:1，正文全部 ≥ 4.5:1）。
   ===================================================================== */

/* ---- A. 卡面：两套主题 × 三档深浅（类名由 ai-import.js 按配置输出）---- */
.ai-import-host .ai-hero.ai-t-aurora { color: #fff; border-color: rgba(255,255,255,.18); }
.ai-import-host .ai-hero.ai-t-aurora.ai-d-deep { background: linear-gradient(152deg, #150f36 0%, #241a63 58%, #131038 100%); }
.ai-import-host .ai-hero.ai-t-aurora.ai-d-mid { background: linear-gradient(152deg, #241b56 0%, #332a7d 58%, #221c52 100%); }
.ai-import-host .ai-hero.ai-t-aurora.ai-d-light { background: linear-gradient(152deg, #3b3274 0%, #4a4190 58%, #352f6c 100%); }
.ai-import-host .ai-hero.ai-t-iris {
  color: #1a1f36;
  background: linear-gradient(125deg, #f3eaff 0%, #e8f1ff 30%, #fdf0ff 58%, #e9fbfd 100%);
  border-color: rgba(150,140,230,.38);
}
/* 极光光斑 + 细网格 + 噪点：全部 CSS 渐变（零图片），16s 缓慢漂移 */
.ai-import-host .ai-hero-bg {
  position: absolute; left: -22%; top: -46%; width: 146%; height: 190%; z-index: 0; pointer-events: none;
  background:
    radial-gradient(340px 210px at 22% 32%, rgba(126,224,255,.55), transparent 62%),
    radial-gradient(360px 240px at 82% 22%, rgba(181,140,255,.55), transparent 64%),
    radial-gradient(420px 260px at 62% 92%, rgba(255,154,213,.34), transparent 66%);
  filter: blur(26px); opacity: .62;
  animation: auroraDrift 16s ease-in-out infinite alternate;
}
.ai-import-host .ai-hero-bg::after {
  content: ''; position: absolute; inset: 0; opacity: .5;
  background-image:
    repeating-linear-gradient(0deg, rgba(255,255,255,.05) 0 1px, transparent 1px 26px),
    repeating-linear-gradient(90deg, rgba(255,255,255,.05) 0 1px, transparent 1px 26px),
    repeating-conic-gradient(rgba(255,255,255,.045) 0% 25%, transparent 0% 50%);
  background-size: auto, auto, 3px 3px;
  -webkit-mask: linear-gradient(180deg, #000 8%, rgba(0,0,0,.35) 70%, transparent);
          mask: linear-gradient(180deg, #000 8%, rgba(0,0,0,.35) 70%, transparent);
}
@keyframes auroraDrift {
  from { transform: translate3d(-3%, -2%, 0) rotate(-2deg); }
  to { transform: translate3d(3%, 2%, 0) rotate(2deg); }
}
/* 边缘高光描边：一道内圈 1px 高光 + 外侧一层极淡的紫晕 */
.ai-import-host .ai-hero-edge {
  position: absolute; inset: 0; z-index: 2; pointer-events: none; border-radius: inherit;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.36), inset 0 0 0 1px rgba(180,170,255,.16);
}
.ai-import-host .ai-hero.ai-t-iris .ai-hero-edge { box-shadow: inset 0 1px 0 rgba(255,255,255,.95), inset 0 0 0 1px rgba(255,255,255,.5); }
.ai-import-host .ai-hero.ai-t-iris .ai-hero-bg { opacity: .55; filter: blur(22px); }
.ai-import-host .ai-hero.ai-t-iris .ai-hero-bg::after { opacity: .35; }

/* ---- B. 卡头：图标 + 标题 + 右上角驱动标识（纯文字，不用任何 logo）---- */
.ai-import-host .ai-hero.ai-t-aurora .ai-hero-t { color: #fff; }
.ai-import-host .ai-drv { flex: none; display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 600; letter-spacing: .2px; white-space: nowrap; color: #ffffff; }
.ai-import-host .ai-t-iris .ai-drv { color: #6b7390; }
/* v1.6.57：驱动状态点 = 绿点 + 轻微呼吸（1.9s 一个来回，只动 opacity/scale，不抢视线）
   —— 浅色卡（虹彩）用深一点的绿保证对比度；深色主题换亮绿 + 同色极轻发光；总开关关闭时变灰不闪 */
.ai-import-host .ai-drv i { width: 5px; height: 5px; border-radius: 50%; flex: none; background: #22c55e; animation: drvBreath 1.9s ease-in-out infinite; }
.ai-import-host .ai-t-iris .ai-drv i { background: #16a34a; }
[data-theme="dark"] .ai-import-host .ai-drv i { background: #34d399; box-shadow: 0 0 6px rgba(52,211,153,.3); }
.ai-import-host .ai-drv.is-off i { background: #9aa0b5; animation: none; box-shadow: none; }
[data-theme="dark"] .ai-import-host .ai-drv.is-off i { background: #6b7280; }
@keyframes drvBreath { 0%,100% { opacity: .55; transform: scale(1); } 50% { opacity: 1; transform: scale(1.15); } }

/* ---- C. 三种输入平级（图片 / 文字 / 语音：同一行等分，图标 + 短标签）---- */
.ai-import-host .ai-in3 { display: flex; gap: 8px; margin-top: 13px; }
.ai-import-host .ai-in3-t {
  flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 7px;
  padding: 12px 6px 11px; border-radius: 16px; font-family: inherit; font-size: 12px; font-weight: 700; cursor: pointer;
  color: #fff; background: linear-gradient(165deg, rgba(255,255,255,.15), rgba(255,255,255,.06));
  border: 1px solid rgba(255,255,255,.26);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.28), 0 6px 16px rgba(12,8,44,.22);
  transition: transform .16s ease, box-shadow .16s ease;
}
.ai-import-host .ai-in3-t:active { transform: scale(.975); }
.ai-import-host .ai-in3-ic { width: 30px; height: 30px; border-radius: 10px; display: flex; align-items: center; justify-content: center; color: #1a1f36; background: linear-gradient(140deg, #9ff0ff, #cdb8ff); }
.ai-import-host .ai-in3-lb { line-height: 1.25; text-align: center; }
.ai-import-host .ai-t-iris .ai-in3-t { color: #1a1f36; background: linear-gradient(165deg, rgba(255,255,255,.94), rgba(248,246,255,.84)); border-color: rgba(150,140,230,.34); box-shadow: 0 6px 16px rgba(126,120,230,.14), inset 0 1px 0 rgba(255,255,255,.95); }
.ai-import-host .ai-t-iris .ai-in3-ic { color: #5b4bd6; background: linear-gradient(140deg, #d9f4ff, #e9e0ff 55%, #ffe3f3); }

/* ---- D. 示例行 / 合规短句 / 配额小字 ---- */
.ai-import-host .ai-hint { margin-top: 9px; font-size: 11px; line-height: 1.45; text-align: center; color: #ffffff; }
.ai-import-host .ai-t-iris .ai-hint { color: #6b7390; }
.ai-import-host .ai-foot-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 9px; }
.ai-import-host .ai-hero.ai-t-aurora .ai-foot { color: #ffffff; }
.ai-import-host .ai-foot-row .ai-foot { margin-top: 0; }
.ai-import-host .ai-quota-mini { font-size: 11px; color: #ffffff; font-variant-numeric: tabular-nums; }
.ai-import-host .ai-t-iris .ai-quota-mini { color: #6b7390; }

/* ---- E. 配额圆点（10 个；剩余 ≤3 转琥珀）---- */
.ai-import-host .ai-dots { display: inline-flex; gap: 4px; align-items: center; }
.ai-import-host .ai-dots i { width: 7px; height: 7px; border-radius: 50%; background: rgba(255,255,255,.26); }
.ai-import-host .ai-dots i.on { background: linear-gradient(135deg, #8ff0ff, #c9b6ff); box-shadow: 0 0 6px rgba(160,190,255,.7); }
.ai-import-host .ai-dots.low i.on { background: linear-gradient(135deg, #ffd27a, #ffb547); box-shadow: 0 0 7px rgba(255,190,90,.8); }
.ai-import-host .ai-t-iris .ai-dots i { background: rgba(90,90,150,.18); }
.ai-import-host .ai-t-iris .ai-dots i.on { background: linear-gradient(135deg, #6f8ef5, #a78bfa); }
.ai-import-host .ai-t-iris .ai-dots.low i.on { background: linear-gradient(135deg, #ffb547, #f59f2b); }

/* ---- F. 识别确认闸门 ---- */
.ai-import-host .ai-gate-head { display: flex; align-items: center; gap: 8px; }
.ai-import-host .ai-gate-head b { font-size: 14px; font-weight: 700; }
.ai-import-host .ai-gate-kind { font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 999px; background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.22); }
.ai-import-host .ai-t-iris .ai-gate-kind { color: #4a6cf7; background: rgba(255,255,255,.8); border-color: rgba(150,140,230,.3); }
.ai-import-host .ai-gate-sum { display: flex; align-items: center; gap: 10px; margin-top: 11px; padding: 9px; border-radius: 14px; background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.16); }
.ai-import-host .ai-t-iris .ai-gate-sum { background: rgba(255,255,255,.7); border-color: rgba(150,140,230,.26); }
.ai-import-host .ai-gate-thumb { flex: none; width: 52px; height: 52px; border-radius: 12px; overflow: hidden; }
.ai-import-host .ai-gate-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ai-import-host .ai-gate-tx { font-size: 12px; line-height: 1.5; word-break: break-word; }
.ai-import-host .ai-gate-left { margin-top: 11px; font-size: 12px; font-weight: 700; }
.ai-import-host .ai-gate-left.low { color: #f5b94e; }
.ai-import-host .ai-dots-row { margin-top: 8px; }
/* 主按钮「开始识别」：一次轻高光扫过 + 按钮内小字；点下后 0.4s 启动动效（光环点亮） */
.ai-import-host .ai-start {
  position: relative; overflow: hidden; width: 100%; margin-top: 12px; padding: 12px;
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  border: none; border-radius: 15px; font-family: inherit; cursor: pointer; color: #1a1f36;
  background: linear-gradient(115deg, #bff0ff, #d9c9ff 52%, #ffd3ef);
  box-shadow: 0 10px 24px rgba(120,110,230,.32), inset 0 1px 0 rgba(255,255,255,.85);
}
.ai-import-host .ai-start[disabled] { opacity: .5; cursor: default; box-shadow: none; }
.ai-import-host .ai-start-t { font-size: 16px; font-weight: 700; letter-spacing: .3px; }
.ai-import-host .ai-start-sub { font-size: 11px; font-weight: 700; opacity: .78; }
.ai-import-host .ai-start-ir { position: absolute; top: 0; bottom: 0; width: 40%; background: linear-gradient(100deg, transparent, rgba(255,255,255,.85), transparent); animation: startIr 3.4s ease-in-out infinite; }
@keyframes startIr { 0% { transform: translateX(-120%); } 55%,100% { transform: translateX(260%); } }
.ai-import-host .ai-start.is-go { animation: startGo .4s ease-out both; }
.ai-import-host .ai-start.is-go .ai-start-ir { animation: none; opacity: 0; }
.ai-import-host .ai-start.is-go::after { content: ''; position: absolute; inset: -2px; border-radius: 17px; box-shadow: 0 0 0 2px rgba(190,210,255,.9), 0 0 22px rgba(150,170,255,.85); animation: startRing .4s ease-out both; }
@keyframes startGo { 0% { transform: scale(1); } 40% { transform: scale(.972); } 100% { transform: scale(1.015); } }
@keyframes startRing { from { opacity: 0; } 60% { opacity: 1; } to { opacity: .92; } }

/* ---- G. 文字描述（卡内就地编辑）与语音收音 ---- */
.ai-import-host .ai-ta {
  width: 100%; margin-top: 10px; min-height: 76px; padding: 10px 12px; border-radius: 14px;
  font-family: inherit; font-size: 14px; line-height: 1.5; resize: none;
  color: #fff; background: rgba(255,255,255,.10); border: 1px solid rgba(255,255,255,.24);
}
.ai-import-host .ai-ta::placeholder { color: #ffffff; }
.ai-import-host .ai-ta:focus { outline: none; border-color: rgba(190,210,255,.75); box-shadow: 0 0 0 3px rgba(150,170,255,.18); }
.ai-import-host .ai-t-iris .ai-ta { color: #1a1f36; background: rgba(255,255,255,.9); border-color: rgba(150,140,230,.3); }
.ai-import-host .ai-t-iris .ai-ta::placeholder { color: #6b7390; }
.ai-import-host .ai-voice-wave { display: flex; align-items: flex-end; gap: 4px; height: 26px; margin-top: 12px; }
.ai-import-host .ai-voice-wave i { flex: 1; border-radius: 3px; background: linear-gradient(180deg, #9ff0ff, #c9b6ff); animation: voiceBar 1.1s ease-in-out infinite; }
.ai-import-host .ai-voice-wave i:nth-child(1) { height: 40%; animation-delay: 0s; }
.ai-import-host .ai-voice-wave i:nth-child(2) { height: 70%; animation-delay: .12s; }
.ai-import-host .ai-voice-wave i:nth-child(3) { height: 100%; animation-delay: .24s; }
.ai-import-host .ai-voice-wave i:nth-child(4) { height: 62%; animation-delay: .36s; }
.ai-import-host .ai-voice-wave i:nth-child(5) { height: 34%; animation-delay: .48s; }
@keyframes voiceBar { 0%,100% { transform: scaleY(.45); } 50% { transform: scaleY(1); } }

/* ---- H. 识别中：沿用同一套深空底 + 更大的百分比（白色字对比度 ≥ 12:1）---- */
.ai-import-host .ai-loading.ai-t-aurora .ai-load-head { color: #fff; }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-pct { font-size: 28px; line-height: 1; color: #fff; text-shadow: 0 0 18px rgba(150,170,255,.6); }
.ai-import-host .ai-loading.ai-t-iris .ai-load-pct { font-size: 28px; line-height: 1; }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-sub { color: #ffffff; }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-meta { color: #ffffff; }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-meta em { color: #1f9d63; }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-bar { background: rgba(255,255,255,.18); }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-steps span { color: #ffffff; background: rgba(255,255,255,.08); box-shadow: inset 0 0 0 1px rgba(255,255,255,.18); }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-steps span.done { color: #ffffff; background: rgba(126,150,255,.18); box-shadow: inset 0 0 0 1px rgba(126,224,255,.4); }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-steps span.on { color: #fff; background: linear-gradient(120deg, #5a63d8, #8a5fe0 55%, #2c96bd); box-shadow: none; }
.ai-import-host .ai-loading.ai-t-aurora .ai-load-done { background: rgba(20,16,52,.62); }
.ai-import-host .ai-load-halo { position: absolute; inset: -9px; z-index: 0; border-radius: 22px; pointer-events: none; background: radial-gradient(closest-side, rgba(150,160,255,.5), transparent 72%); opacity: .4; animation: haloPulse 3.2s ease-in-out infinite; }
@keyframes haloPulse { 0%,100% { transform: scale(.94); opacity: .3; } 50% { transform: scale(1.04); opacity: .58; } }

/* ---- I. 结果卡：内联二次确认（不弹窗）+ 红色「不用 AI 结果」 ---- */
.ai-import-host .ai-inline-cf {
  display: flex; align-items: center; gap: 8px; margin-top: 10px; padding: 9px 11px; border-radius: 13px;
  font-size: 12px; font-weight: 700; color: #4a6cf7;
  background: linear-gradient(115deg, rgba(232,238,255,.96), rgba(243,235,255,.96));
  border: 1px solid rgba(122,126,224,.42);
  animation: cfIn .2s ease both;
}
.ai-import-host .ai-inline-cf[hidden] { display: none; }
.ai-import-host .ai-inline-cf span { flex: 1; min-width: 0; }
.ai-import-host .ai-inline-cf.danger { color: #dc3545; background: linear-gradient(115deg, rgba(255,244,244,.96), rgba(255,237,237,.96)); border-color: rgba(226,87,76,.42); }
@keyframes cfIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
.ai-import-host .ai-cf-yes { border: none; font-family: inherit; font-weight: 700; padding: 6px 12px; border-radius: 999px; color: #fff; background: var(--grad-brand); cursor: pointer; }
.ai-import-host .ai-inline-cf.danger .ai-cf-yes { background: linear-gradient(135deg, #e2574c, #c33a31); }
.ai-import-host .ai-cf-no { font-family: inherit; font-weight: 700; padding: 6px 12px; border-radius: 999px; color: #6b7390; background: rgba(255,255,255,.92); border: 1px solid rgba(124,92,240,.2); cursor: pointer; }
.ai-import-host .ai-danger {
  flex: 1; display: flex; align-items: center; justify-content: center; cursor: pointer;
  font-family: inherit; font-weight: 700; color: #dc3545;
  background: linear-gradient(160deg, rgba(255,246,246,.96), rgba(255,238,238,.92));
  border: 1px solid rgba(226,87,76,.42);
}
.ai-import-host .ai-cta.is-ok { color: #5a6178; background: linear-gradient(115deg, #e3f6ea, #eafaf1); border-color: rgba(60,180,120,.45); }
/* v1.6.57 热修：收起 / 展开（240ms）——只动 max-height + opacity + transform，
   并同步把内边距 / 描边压到 0，避免收起后留一条空白洞；结束由 JS 置 hidden 换成一行极简条 */
.ai-import-host .ai-card.is-anim { overflow: hidden; transition: max-height .24s cubic-bezier(.22,.8,.3,1), opacity .24s ease, transform .24s ease, padding .24s ease, border-width .24s ease; }
.ai-import-host .ai-card.is-collapse { opacity: 0; transform: translateY(-6px); padding-top: 0; padding-bottom: 0; border-width: 0; }

/* 收起后的一行极简条：✓ 已填入表单 · 点底部「保存」 + 查看 / 清空 */
.ai-import-host .ai-filled-row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding: 9px 12px; border-radius: 14px; border: 1px solid rgba(122,126,224,.34);
  background: linear-gradient(115deg, rgba(238,242,255,.96), rgba(246,240,255,.96));
  animation: cfIn .2s ease both;
}
/* ⚠️ 展开态要把这一行藏掉：类选择器里的 display:flex 会盖掉 [hidden] 的 UA 规则，必须显式写一条 */
.ai-import-host .ai-filled-row[hidden] { display: none; }
.ai-import-host .ai-filled-chip {
  flex: 1 1 auto; min-width: 0; display: inline-flex; align-items: center; text-align: left;
  padding: 0; border: none; background: none; cursor: pointer;
  font-family: inherit; font-size: 12px; font-weight: 700; color: #1f9d63; line-height: 1.45;
}
.ai-import-host .ai-filled-acts { flex: 0 0 auto; display: inline-flex; gap: 6px; margin-left: auto; }
.ai-import-host .ai-mini {
  flex: 0 0 auto; display: inline-flex; align-items: center; cursor: pointer;
  font-family: inherit; font-size: 11px; font-weight: 700; padding: 6px 11px; border-radius: 999px;
  color: #5a6178; background: rgba(255,255,255,.94); border: 1px solid rgba(124,92,240,.26);
}
.ai-import-host .ai-mini.danger { color: #dc3545; background: rgba(255,246,246,.96); border-color: rgba(226,87,76,.42); }
.ai-import-host .ai-filled-row .ai-inline-cf { flex: 1 0 100%; }
.ai-import-host .ai-acts.center { justify-content: center; }
.ai-import-host .ai-danger-text {
  flex: 0 0 auto; display: inline-flex; align-items: center; cursor: pointer;
  font-family: inherit; font-size: 12px; font-weight: 700; padding: 6px 10px; border-radius: 999px;
  color: #dc3545; background: none; border: none;
}
.ai-import-host .ai-filled .ai-head .ai-tip { flex: 1 1 auto; min-width: 0; }
.ai-import-host .ai-filled .ai-head .ai-mini { margin-left: auto; }
@media (prefers-reduced-motion: reduce) {
  .ai-import-host .ai-card.is-anim { transition: none !important; }
  .ai-import-host .ai-filled-row { animation: none !important; }
}

/* ---- J. 手动填写区合并成一张卡（演出信息 + 封面 + 更多信息，去两张卡之间的灰缝）+ 页底历史场次入口 ---- */
.pe-page .pe-merged { padding-bottom: 10px; }
.pe-page .pe-divider { height: 1px; margin: 14px -15px; background: linear-gradient(90deg, rgba(196,200,240,0), rgba(196,200,240,.75), rgba(196,200,240,0)); }
.pe-page .pe-hist {
  width: 100%; display: flex; align-items: center; justify-content: center; gap: 7px; margin: 2px 0 10px;
  padding: 11px 12px; border-radius: 14px; font-family: inherit; font-size: 12px; font-weight: 700; cursor: pointer;
  color: #6b7390; background: linear-gradient(160deg, rgba(255,255,255,.9), rgba(248,246,255,.84));
  border: 1px dashed rgba(124,92,240,.34);
}
.pe-page .pe-hist:active { transform: scale(.99); }

/* 动效降级：本批新增的全部动画在「减弱动态效果」下停掉，只留静态样式 */
@media (prefers-reduced-motion: reduce) {
  .ai-import-host .ai-hero-bg, .ai-import-host .ai-drv i, .ai-import-host .ai-start-ir,
  .ai-import-host .ai-start.is-go, .ai-import-host .ai-start.is-go::after,
  .ai-import-host .ai-load-halo, .ai-import-host .ai-voice-wave i,
  .ai-import-host .ai-inline-cf { animation: none !important; }
  .ai-import-host .ai-card.is-collapse { transition: none !important; }
}

/* ==========================================================================
   v1.6.58 · AI 计划（只作用于《计划页》里那块 AI 计划，不动其它页面）
   视觉沿用「极光深空 + 浅底卡片」这套：深紫渐变头 + 白底条目 + 浅底小标签。
   ========================================================================== */
.plan-ai { margin: 0 0 12px; padding: 13px 14px; border-radius: 16px; }
.plan-ai-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.plan-ai-head b { font-size: 14px; font-weight: 700; letter-spacing: .2px; }
.plan-ai-head .muted { font-size: 12px; line-height: 1.5; min-width: 0; }
.plan-ai-head .ai-src { margin-left: auto; }
.plan-ai-pct { margin-left: auto; font-size: 22px; font-weight: 700; color: #5b4bd6; }
.plan-ai-in3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-top: 11px; }
.plan-ai-t {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 7px;
  padding: 13px 6px; border-radius: 13px; font-family: inherit; font-size: 12px; font-weight: 700;
  color: #5b4bd6; cursor: pointer; text-align: center;
  background: linear-gradient(160deg, rgba(247,245,255,.96), rgba(238,240,255,.9));
  border: 1px solid rgba(124,92,240,.22);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.8);
}
.plan-ai-t:active { transform: scale(.985); }
.plan-ai-t.is-off { opacity: .5; }
.plan-ai-ic {
  width: 30px; height: 30px; border-radius: 10px; display: grid; place-items: center; color: #fff;
  background: linear-gradient(140deg, #7c5cf0, #4a6cf7); box-shadow: 0 3px 10px rgba(90,80,220,.28);
}
.plan-ai-lb { line-height: 1.3; }
.plan-ai-note { margin-top: 9px; font-size: 12px; line-height: 1.55; color: #1a1f36; }
.plan-ai-sub { margin-left: auto;  }
.plan-ai-acts { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; margin-top: 11px; }
.plan-ai-ta, .plan-ai .ai-ta { width: 100%; margin-top: 10px; min-height: 74px; border-radius: 12px; padding: 10px 11px; font-family: inherit; font-size: 14px; line-height: 1.6; color: #1a1f36; background: #fff; border: 1px solid rgba(124,92,240,.22); }
.plan-ai-bar { height: 8px; border-radius: 999px; margin-top: 10px; overflow: hidden; background: rgba(124,92,240,.14); }
.plan-ai-bar i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, #7c5cf0, #4a6cfc); transition: width .28s ease; }
.plan-ai-stage { display: flex; align-items: center; gap: 7px; margin-top: 9px; font-size: 12px; font-weight: 700; color: #5a6178; }
.plan-ai-dot { width: 7px; height: 7px; border-radius: 50%; background: #22c55e; box-shadow: 0 0 0 3px rgba(34,197,94,.18); animation: planAiDot 1.9s ease-in-out infinite; }
.plan-ai-elapsed { margin-top: 5px; font-size: 11px; color: #1a1f36; }
.plan-ai-wait { margin-top: 4px; font-size: 12px; color: #f5b94e; }
.plan-ai-steps { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.plan-ai-steps span { font-size: 11px; padding: 3px 9px; border-radius: 999px; color: #1a1f36; background: rgba(124,92,240,.09); }
.plan-ai-steps span.on { color: #fff; background: linear-gradient(120deg, #7c5cf0, #4a6cfc); }
.plan-ai-steps span.done { color: #6d5ce7; background: rgba(124,92,240,.18); }
.plan-ai-days { margin-top: 10px; }
.plan-ai-day { margin-top: 9px; }
.plan-ai-day:first-child { margin-top: 4px; }
.plan-ai-day-h { display: flex; align-items: baseline; gap: 8px; margin-bottom: 5px; }
.plan-ai-day-h b { font-size: 12px; font-weight: 700; color: #5b4bd6; }
.plan-ai-day-h .muted { font-size: 11px; }
.plan-ai-item { display: flex; align-items: flex-start; gap: 9px; padding: 8px 10px; margin-top: 6px; border-radius: 12px; background: rgba(255,255,255,.86); border: 1px solid rgba(124,92,240,.14); }
.plan-ai-time { flex: none; min-width: 48px; font-size: 12px; font-weight: 700; color: #5b4bd6; }
.plan-ai-body { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.plan-ai-title { font-size: 14px; font-weight: 700; color: #1a1f36; }
.plan-ai-detail { font-size: 12px; line-height: 1.5; color: #1a1f36; word-break: break-word; }
.plan-ai-advice { align-self: flex-start; font-style: normal; font-size: 11px; font-weight: 700; padding: 1px 6px; border-radius: 999px; color: #8a5a00; background: rgba(245,158,11,.16); }
.plan-ai-type { flex: none; font-style: normal; font-size: 11px; padding: 2px 7px; border-radius: 999px; color: #1a1f36; background: rgba(124,92,240,.1); }
.plan-ai-item.is-edit { align-items: center; }
.plan-ai-item.is-edit .input { height: 34px; font-size: 12px; }
.plan-ai-it-time { flex: none; width: 74px; text-align: center; }
.plan-ai-it-title { flex: 1 1 auto; min-width: 0; }
.plan-ai-gaps { margin-top: 10px; padding: 9px 11px; border-radius: 12px; background: rgba(245,158,11,.1); border: 1px solid rgba(245,158,11,.24); }
.plan-ai-gaps b { display: block; font-size: 12px; color: #8a5a00; margin-bottom: 4px; }
.plan-ai-gaps span { display: block; font-size: 12px; line-height: 1.6; color: #1a1f36; }
.plan-ai-empty { font-size: 12px; color: #1a1f36; padding: 6px 2px; }
.plan-ai-foot { margin-top: 10px; font-size: 11px; color: #1a1f36; text-align: center; }
.plan-ai-err .plan-ai-head b { color: #f5b94e; }
.plan-ai-row { display: flex; align-items: center; gap: 4px; margin: 0 0 12px; padding: 9px 12px; border-radius: 14px; background: linear-gradient(160deg, rgba(255,255,255,.94), rgba(244,242,255,.9)); border: 1px solid rgba(124,92,240,.2); }
.plan-ai-chip { font-size: 12px; font-weight: 700; color: #5b4bd6; }
.plan-ai-row .btn-text { margin-left: 6px; }
.plan-ai-row .btn-text.danger { margin-left: 0; color: #dc3545; }
.plan-ai .ai-inline-cf { display: flex; align-items: center; gap: 8px; margin-top: 9px; padding: 9px 11px; border-radius: 12px; font-size: 12px; background: rgba(124,92,240,.1); }
.plan-ai .ai-inline-cf[hidden] { display: none; }
@media (prefers-reduced-motion: reduce) { .plan-ai-dot { animation: none !important; } }
[data-theme="dark"] .plan-ai-t { color: #eef1ff; background: linear-gradient(160deg, rgba(38,42,70,.9), rgba(28,32,56,.9)); border-color: rgba(124,92,240,.3); }
[data-theme="dark"] .plan-ai-pct { color: #c4b2ff; }
[data-theme="dark"] .plan-ai .ai-ta { color: #eef1ff; background: rgba(20,24,42,.9); border-color: rgba(124,92,240,.3); }
[data-theme="dark"] .plan-ai-stage { color: #6b85ff; }
[data-theme="dark"] .plan-ai-item { background: rgba(24,28,46,.86); border-color: rgba(124,92,240,.22); }
[data-theme="dark"] .plan-ai-title { color: #eef1ff; }
[data-theme="dark"] .plan-ai-time { color: #c4b2ff; }
[data-theme="dark"] .plan-ai-row { background: linear-gradient(160deg, rgba(30,34,56,.94), rgba(24,28,46,.9)); border-color: rgba(124,92,240,.28); }
[data-theme="dark"] .plan-ai-chip { color: #eef1ff; }

/* v1.6.58 · AI 计划（续）：卡内主按钮 / 内联二次确认 / 240ms 收起，全部与识别卡同一套手感。
   为什么再写一遍而不是复用 .ai-import-host 那几行：那几条是按 id 收口的，AI 计划卡在另一个 host 下，
   直接放宽选择器会波及已验收的识别卡；这里只补自己缺的那几行。 */
#plan-ai-host .btn.ai-cta {
  background: linear-gradient(115deg, rgba(226,233,255,.97), rgba(240,231,255,.97) 52%, rgba(226,244,252,.97));
  border: 1px solid rgba(122,126,224,.4); color: #4a6cf7;
  box-shadow: 0 4px 14px rgba(122,126,224,.14), inset 0 1px 0 rgba(255,255,255,.9);
}
#plan-ai-host .ai-cta-ic { display: inline-flex; margin-right: 4px; }
#plan-ai-host .ai-cta.is-ok { color: #5a6178; background: linear-gradient(115deg, #e3f6ea, #eafaf1); border-color: rgba(60,180,120,.45); }
[data-theme="dark"] #plan-ai-host .btn.ai-cta { background: linear-gradient(115deg, rgba(90,96,180,.35), rgba(110,88,180,.3)); border-color: rgba(160,141,255,.4); color: #eef1ff; }
#plan-ai-host .ai-inline-cf .ai-cf-yes { border: none; font-family: inherit; font-weight: 700; padding: 6px 12px; border-radius: 999px; color: #fff; background: var(--grad-brand); cursor: pointer; }
#plan-ai-host .ai-inline-cf .ai-cf-no { font-family: inherit; font-weight: 700; padding: 6px 12px; border-radius: 999px; color: #6b7390; background: rgba(255,255,255,.92); border: 1px solid rgba(124,92,240,.2); cursor: pointer; }
[data-theme="dark"] #plan-ai-host .ai-inline-cf .ai-cf-no { color: #eef1ff; background: rgba(24,28,46,.9); }
/* 收起 / 展开（240ms）：只动 max-height + opacity + transform + padding，结束由 JS 置 hidden */
#plan-ai-host .plan-ai.is-anim { overflow: hidden; transition: max-height .24s cubic-bezier(.22,.8,.3,1), opacity .24s ease, transform .24s ease, padding .24s ease, border-width .24s ease; }
#plan-ai-host .plan-ai.is-collapse { opacity: 0; transform: translateY(-6px); padding-top: 0; padding-bottom: 0; border-width: 0; }
#plan-ai-host [data-plan-applied][hidden] { display: none; }
@media (prefers-reduced-motion: reduce) {
  #plan-ai-host .plan-ai.is-anim, #plan-ai-host .plan-ai.is-collapse { transition: none !important; }
}

/* v1.6.58 · 筹备中心改 5 格（AI 计划 / 我的票 / 准备清单 / 预算记账 / 现场记录）。
   为什么单独一个类：4 列会剩一个孤格（4+1），3 列正好 3+2；.func-grid 是全站共用的，
   所以只给这一处加 .func-5，别处的排版一律不动。 */
.func-grid.func-5 { grid-template-columns: repeat(3, 1fr); }
/* v1.6.73 ⑦ 筹备中心五格：图标加类型色底、卡片更精致，与首页速办同一套语言；
   AI 计划那颗保留 ai-tag，其余各按自己类型给一块浅色图标底。 */
.func-grid.func-5 .f{ border-radius: 16px; background: rgba(255,255,255,.55); box-shadow: inset 0 0 0 1px rgba(150,150,230,.08); }

.func-grid.func-5 .f.is-ticket .fi{ background: linear-gradient(135deg, rgba(219,39,119,.12), rgba(244,114,182,.10)); color: #d6457f; }
.func-grid.func-5 .f.is-pack .fi{ background: linear-gradient(135deg, rgba(13,148,136,.13), rgba(20,184,166,.10)); color: #1a1f36; }
.func-grid.func-5 .f.is-wallet .fi{ background: linear-gradient(135deg, rgba(234,88,12,.13), rgba(249,115,22,.10)); color: #8a5a00; }
.func-grid.func-5 .f.is-memory .fi{ background: linear-gradient(135deg, rgba(37,99,235,.13), rgba(56,189,248,.10)); color: #4a6cf7; }
[data-theme="dark"] .func-grid.func-5 .f{ background: rgba(28,32,52,.4); box-shadow: inset 0 0 0 1px rgba(150,150,230,.14); }
[data-theme="dark"] .func-grid.func-5 .f.is-ai .fi{ color: #c4b2ff; }
[data-theme="dark"] .func-grid.func-5 .f.is-ticket .fi{ color: #ff8cc0; }
[data-theme="dark"] .func-grid.func-5 .f.is-pack .fi{ color: #5fd39b; }
[data-theme="dark"] .func-grid.func-5 .f.is-wallet .fi{ color: #f5b94e; }
[data-theme="dark"] .func-grid.func-5 .f.is-memory .fi{ color: #6b85ff; }

/* ============================================================================
   v1.6.59 · AI 计划 V2「对话式编排（以场次为中心）」
   只作用于这一页（.plan2-page / #plan-ai-host / .p2-* 前缀），不碰其它页面。
   为什么重写这一段：产品否掉了「新版 AI 卡拼在旧计划一览页」那版 —— 首屏只留三块
   （场次条 + 对话流 + 底部输入条），旧能力（注意事项 / 四模块 / 添加环节 / 长图 / 导入）
   一个没删，全部收进「自己编辑」。
   ============================================================================ */

/* ---------- 1. 场次条（首屏唯一焦点；点它回场次详情） ---------- */

.p2-gig {
  position: relative; display: flex; align-items: flex-start; gap: 11px;
  padding: 13px 13px 12px; margin: 0 0 12px; border-radius: 20px; overflow: hidden;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(246,246,255,.97) 55%, rgba(252,243,255,.95));
  border: 1px solid rgba(196,200,240,.55);
  box-shadow: 0 10px 24px rgba(31,38,135,.07), inset 0 1px 0 rgba(255,255,255,.95);
  cursor: pointer;
}
.p2-gig::after {
  content: ''; position: absolute; left: 0; top: 14px; bottom: 14px; width: 3px; border-radius: 3px;
  background: linear-gradient(120deg, #7ee0ff 0%, #b58cff 48%, #ff9ad5 100%); opacity: .9;
}
.p2-gig:active { transform: scale(.995); }
/* 日期徽标：浅底 + 主色文字 + 等宽数字（产品明确否掉「白字压渐变 + 重投影」那版） */
.p2-date {
  flex: none; width: 54px; padding: 7px 0 6px; border-radius: 13px; text-align: center;
  background: rgba(124,92,240,.10); border: 1px solid rgba(124,92,240,.14);
}
.p2-date b { display: block; font-size: 18px; font-weight: 700; line-height: 1.12; color: #5b4bd6; font-variant-numeric: tabular-nums; letter-spacing: .2px; }
.p2-date i { display: block; font-style: normal; font-size: 11px; line-height: 1.3; color: #1a1f36; margin-top: 1px; }
.p2-gm { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.p2-gl1 { display: flex; align-items: center; gap: 7px; min-width: 0; }
.p2-gl1 b { font-size: 14px; font-weight: 700; letter-spacing: .2px; color: var(--text-1); }
.p2-gl1 span { font-size: 11px; color: #1a1f36; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p2-gl2 { margin-top: 5px; font-size: 12px; line-height: 1.5; color: #5a6178; }
.p2-gl2 em { font-style: normal; font-weight: 700; color: #5b4bd6; }
.p2-gl3 { margin-top: 6px; display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.p2-pill { font-style: normal; font-size: 11px; font-weight: 700; padding: 2px 7px; border-radius: 999px; color: #1a1f36; background: rgba(124,92,240,.09); }
.p2-pill.ok { color: #5a6178; background: rgba(34,197,94,.14); }
.p2-pill.warn { color: #8a5a00; background: rgba(245,158,11,.16); }
.p2-go { flex: none; align-self: center; color: #1a1f36; display: inline-flex; }

/* ---------- 2. 对话流 ---------- */
.p2-flow { display: flex; flex-direction: column; gap: 11px; padding: 2px 0 8px; }
.p2-msg { display: flex; gap: 9px; align-items: flex-start; animation: p2In .24s cubic-bezier(.22,.8,.3,1) both; }
@keyframes p2In { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: none; } }
.p2-msg .p2-av {
  flex: none; width: 30px; height: 30px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center;
  color: #fff; background: linear-gradient(140deg, #7c5cf0, #4a6cf7); box-shadow: 0 6px 14px rgba(96,86,220,.28);
}
.p2-bub {
  position: relative; overflow: hidden; max-width: 262px; padding: 10px 12px; border-radius: 16px;
  font-size: 14px; line-height: 1.6; color: #1a1f36;
}
.p2-msg.ai .p2-bub {
  background: linear-gradient(150deg, rgba(243,245,255,.98), rgba(246,240,255,.98) 52%, rgba(240,250,255,.98));
  border: 1px solid rgba(150,150,230,.34);
  box-shadow: 0 8px 20px rgba(96,86,220,.10), inset 0 1px 0 rgba(255,255,255,.95);
}
/* 极轻的流光扫过：周期 7.4s、峰值透明度很低（产品要求「慢一点、弱一点」） */
.p2-msg.ai .p2-bub::before {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(102deg, transparent 38%, rgba(255,255,255,.75) 50%, transparent 62%);
  animation: p2Sweep 7.4s ease-in-out infinite;
}
@keyframes p2Sweep { 0%, 100% { transform: translateX(-42%); opacity: .10; } 50% { transform: translateX(36%); opacity: .24; } }
.p2-msg.ai .p2-bub > * { position: relative; z-index: 1; }
.p2-msg.me { flex-direction: row-reverse; }
.p2-msg.me .p2-bub { background: linear-gradient(150deg, rgba(124,92,240,.14), rgba(74,108,247,.12)); border: 1px solid rgba(124,92,240,.18); color: #1a1f36; }

/* ---------- 3. 选项 chip（产品红框那两处之一）----------
   规格：视觉高 36px / 圆角 18px / 左右内边距 14px / 字号 13px / 间距 9px；
   点击热区靠 ::after 外扩到 ≥40px；选中态 = 主色浅底 + 主色文字（不是实心高饱和）；
   「让 AI 决定」是次要动作 → 虚线描边；动效只动 transform / opacity 且 ≤160ms。 */
.p2-chips { display: flex; flex-direction: column; gap: 9px; margin-top: 10px; }
.p2-chiprow { display: flex; flex-wrap: wrap; gap: 9px; }
.p2-chip {
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  height: 36px; padding: 0 14px; border-radius: 12px; font-family: inherit; font-size: 12px; font-weight: 700;
  color: #5a6178; background: #fff; border: 1px solid rgba(124,92,240,.16); cursor: pointer;
  transition: transform .16s cubic-bezier(.22,.8,.3,1), opacity .16s ease;
}
.p2-chip::after { content: ''; position: absolute; inset: -2px; border-radius: 12px; }   /* 热区 ≥40px */
.p2-chip:active { transform: scale(.97); }
.p2-chip.is-on { color: #5b4bd6; background: rgba(124,92,240,.12); border-color: rgba(124,92,240,.55); }
.p2-chip.is-ai { color: #6d5ce7; background: transparent; border-style: dashed; border-color: rgba(124,92,240,.38); }
.p2-chip[disabled] { cursor: default; opacity: .55; }
.p2-chip.is-on[disabled] { opacity: 1; }

/* ---------- 4. 进度（已收集 N/6） ---------- */
.p2-prog { display: flex; align-items: center; gap: 9px; padding: 2px 2px 0; }
.p2-prog .mono { flex: none; font-size: 11px; font-weight: 700; color: #1a1f36; font-variant-numeric: tabular-nums; }
.p2-prog i { flex: 1 1 auto; height: 5px; border-radius: 999px; background: rgba(124,92,240,.12); overflow: hidden; }
.p2-prog i b { display: block; height: 100%; border-radius: 999px; background: linear-gradient(120deg, #7ee0ff, #b58cff 48%, #ff9ad5); transition: width .24s ease; }
.p2-selfentry { align-self: flex-start; margin: 2px 0 0; padding: 2px 0; border: none; background: none; cursor: pointer; font-family: inherit; font-size: 12px; color: #1a1f36; text-decoration: underline; text-underline-offset: 3px; }
.p2-hint { padding: 2px 2px 0; font-size: 12px; color: #1a1f36; }

/* ---------- 5. 底部输入条（文字 + 语音 + 图片），吸在 Tab 栏上方 ---------- */
.p2-composer {
  position: sticky; bottom: calc(80px + env(safe-area-inset-bottom)); z-index: 20;
  margin-top: 10px; padding: 8px 12px 10px;
  background: linear-gradient(180deg, rgba(238,240,252,0), rgba(236,238,252,.92) 42%, rgba(236,238,252,.99));
}
.p2-cbox {
  display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: 999px;
  background: rgba(255,255,255,.97); border: 1px solid rgba(150,150,230,.34);
  box-shadow: 0 10px 24px rgba(31,38,135,.10), inset 0 1px 0 rgba(255,255,255,.95);
}
.p2-cbox.is-off { opacity: .72; }
.p2-cic {
  flex: none; width: 32px; height: 32px; border-radius: 50%; border: 1px solid rgba(124,92,240,.18);
  display: inline-flex; align-items: center; justify-content: center; cursor: pointer;
  color: #5b4bd6; background: linear-gradient(160deg, rgba(238,240,255,.98), rgba(246,240,255,.96));
}
.p2-cic[disabled] { cursor: default; }
.p2-cin {
  flex: 1 1 auto; min-width: 0; height: 34px; border: none; outline: none; background: transparent;
  font-family: inherit; font-size: 12px; color: #1a1f36;
}
.p2-cin::placeholder { color: #5a6178; }
.p2-csend {
  flex: none; width: 34px; height: 34px; border-radius: 50%; border: none; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; color: #fff;
  background: linear-gradient(135deg, #4a6cf7 0%, #6d5ce7 52%, #8b5cf6 100%);
  box-shadow: 0 8px 18px rgba(109,92,231,.3);
}
.p2-csend:active { transform: scale(.95); }
.p2-cquota { margin: 6px 2px 0; text-align: right; font-size: 11px; color: #1a1f36; font-variant-numeric: tabular-nums; }

/* ---------- 6. 自己编辑（旧能力全在这儿：四模块 / 添加环节 / 长图 / 导入 / 注意事项） ---------- */
.p2-manualbar { display: flex; align-items: center; gap: 9px; margin: 0 0 12px; }
.p2-mback {
  flex: none; width: 32px; height: 32px; border-radius: 11px; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,.8); border: 1px solid rgba(124,92,240,.18); color: #5b4bd6;
}
.p2-mtxt { display: flex; flex-direction: column; gap: 2px; }
.p2-mtxt b { font-size: 16px; font-weight: 700; color: var(--text-1); }
.p2-mtxt span { font-size: 11px; color: #1a1f36; }

/* ---------- 7. 生成中：每段的「正在做什么」小字 + 真实读数一行 ---------- */
.plan-ai-sub { margin-top: 5px; font-size: 12px; line-height: 1.5; color: #1a1f36; }
.plan-ai-meta { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 4px; }
.plan-ai-meta .plan-ai-elapsed { margin-top: 0; }
.plan-ai-chg { display: inline-block; margin-left: 6px; font-style: normal; font-size: 11px; font-weight: 700; padding: 1px 6px; border-radius: 999px; color: #5b4bd6; background: rgba(124,92,240,.14); }
.plan-ai-tools { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 11px; }
.plan-ai-tool {
  display: inline-flex; align-items: center; gap: 5px; padding: 7px 11px; border-radius: 999px; cursor: pointer;
  font-family: inherit; font-size: 11px; font-weight: 700; color: #5b4bd6;
  background: rgba(255,255,255,.9); border: 1px solid rgba(124,92,240,.2);
}
.plan-ai-tico { display: inline-flex; color: #6d5ce7; }

/* ---------- 8. 深色主题（同一套语义，不新增暗色模式开关） ---------- */
[data-theme="dark"] .p2-gig { background: linear-gradient(160deg, rgba(30,34,56,.94), rgba(24,28,46,.9)); border-color: rgba(124,92,240,.28); }
[data-theme="dark"] .p2-date { background: rgba(124,92,240,.18); border-color: rgba(124,92,240,.3); }
[data-theme="dark"] .p2-date b { color: #c4b2ff; }
[data-theme="dark"] .p2-date i, [data-theme="dark"] .p2-gl1 span, [data-theme="dark"] .p2-prog .mono, [data-theme="dark"] .p2-hint, [data-theme="dark"] .plan-ai-sub, [data-theme="dark"] .p2-mtxt span, [data-theme="dark"] .p2-cquota { color: #a8b0c8; }
[data-theme="dark"] .p2-gl2 { color: #eef1ff; }
[data-theme="dark"] .p2-msg .p2-bub { color: #eef1ff; }
[data-theme="dark"] .p2-msg.ai .p2-bub { background: linear-gradient(150deg, rgba(38,42,68,.96), rgba(34,30,58,.94)); border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p2-msg.me .p2-bub { background: linear-gradient(150deg, rgba(96,80,190,.34), rgba(60,80,180,.3)); border-color: rgba(140,140,230,.28); color: #eef1ff; }
[data-theme="dark"] .p2-chip { background: rgba(30,34,56,.9); color: #eef1ff; border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p2-chip.is-on { color: #c4b2ff; background: rgba(124,92,240,.24); border-color: rgba(160,141,255,.6); }
[data-theme="dark"] .p2-composer { background: linear-gradient(180deg, rgba(18,22,40,0), rgba(18,22,40,.9) 42%, rgba(18,22,40,.98)); }
[data-theme="dark"] .p2-cbox { background: rgba(26,30,48,.96); border-color: rgba(150,150,230,.26); }
[data-theme="dark"] .p2-cic { color: #c4b2ff; background: rgba(40,44,70,.9); border-color: rgba(150,150,230,.26); }
[data-theme="dark"] .p2-cin { color: #eef1ff; }
[data-theme="dark"] .plan-ai-tool { background: rgba(30,34,56,.9); border-color: rgba(124,92,240,.3); color: #eef1ff; }

/* ---------- 9. 降级：系统开了「减少动态效果」就全部静止 ---------- */
@media (prefers-reduced-motion: reduce) {
  .p2-msg { animation: none; }
  .p2-msg.ai .p2-bub::before { animation: none; opacity: .12; }
  .p2-chip, .p2-prog i b { transition: none; }
}

/* 「自己编辑」= 老计划一览整页：底部给 tab 栏留够高度，最后那排模块入口不被压住（v1.6.59） */


/* ============================================================================
   v1.6.60 · AI 计划 V3.1「场次卡联动 + 三入口 + 直出行程手册」
   只作用于这一页（.plan31-page / #plan-ai-host / #plan-sheet-host / .p31-*），不碰其它页面。
   结构 = 渲染稿那三块：① 场次卡（不滚）② 内容区（全页唯一滚动区）③ 底部输入条（不滚）
   + 选择场次 / 自由计划的底部面板。键盘弹出只 transform 输入条自己，其它元素位移 = 0。
   视觉令牌与全站一致：浅紫底 · 白卡 · 极细描边 · 极光渐变 · 等宽数字 · 内联线性 SVG（零图片零库）。
   ============================================================================ */
.plan31-page{
  --grad-cta: linear-gradient(118deg,#4f46c8 0%,#6b52d9 46%,#2b7fae 100%);
  --grad-iris: linear-gradient(120deg,#7ee0ff 0%,#b58cff 48%,#ff9ad5 100%);
  /* v1.6.62 修 P0（真机「划不动」）：不再依赖「#app(flex 子项) → height:100%」这条高度链，
     改成相对 .phone-shell 的绝对定位铺满（inset:0），任何 WebView 里高度都是确定的视口高度。
     代价：上/下安全区要自己补（原来由 .phone-shell 的 padding 让出来），所以 padding 里加上
     env(safe-area-inset-top)；底部仍是「导航坞 84px + 安全区」，与 v1.6.61 的可见几何一致。 */
  position: absolute; inset: 0; height: auto; display: flex; flex-direction: column; overflow: hidden;
  /* v1.6.69（老板图 1 / 图 2）：顶部不再留白缝 —— 安全区交给标题栏自己（页面从标题栏直接开始）；
     底部把按钮条与导航坞之间的空档收掉 —— 84px 是「导航坞 + 一条空档」，改成正好 74px 贴齐。 */
  
}
/* 标题栏顶到页面最上沿，安全区由它自己补；背景与页面同色渐变，干掉那条白缝 */
.plan31-page > .back-bar{
  padding-top: calc(10px + env(safe-area-inset-top));
  background: linear-gradient(180deg, rgba(244,246,250,.99) 0%, rgba(242,244,250,.72) 62%, rgba(240,242,250,0) 100%);
  -webkit-backdrop-filter: none; backdrop-filter: none;
}
[data-theme="dark"] .plan31-page > .back-bar{
  background: linear-gradient(180deg, rgba(13,18,36,.99) 0%, rgba(13,18,36,.72) 62%, rgba(13,18,36,0) 100%);
}
.plan31-page .p31-body{
  flex: 1 1 auto; min-height: 0; overflow-y: auto; 
    padding-bottom: 12px;
}
.plan31-page .p31-body::-webkit-scrollbar{ width: 0; }


/* ---------- 1. 场次卡（首屏焦点；比 V3 加高约 30%，整卡可点切换） ---------- */
.p31-gig{
  position: relative; display: flex; align-items: flex-start; gap: 12px; width: 100%;
  padding: 13px 13px 14px; margin: 0 0 12px; border-radius: 20px; overflow: hidden; text-align: left;
  font-family: inherit; cursor: pointer;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(246,246,255,.97) 55%, rgba(252,243,255,.95));
  border: 1px solid rgba(196,200,240,.55);
  box-shadow: 0 10px 24px rgba(31,38,135,.07), inset 0 1px 0 rgba(255,255,255,.95);
  transition: transform .16s cubic-bezier(.22,.8,.3,1);
}
.p31-gig::after{
  content: ''; position: absolute; left: 0; top: 14px; bottom: 14px; width: 3px; border-radius: 3px;
  background: var(--grad-iris); opacity: .9;
}
.p31-gig:active{ transform: scale(.995); }
.p31-date{
  flex: none; width: 58px; padding: 8px 0 7px; border-radius: 14px; text-align: center;
  background: rgba(124,92,240,.10); border: 1px solid rgba(124,92,240,.14);
}
.p31-date b{ display: block; font-size: 18px; font-weight: 700; line-height: 1.15; color: #5b4bd6; font-variant-numeric: tabular-nums; letter-spacing: .3px; }
.p31-date i{ display: block; font-style: normal; font-size: 11px; line-height: 1.3; color: #1a1f36; margin-top: 2px; }
.p31-gm{ flex: 1 1 auto; min-width: 0; }
.p31-gt{
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  font-size: 16px; font-weight: 700; line-height: 1.34; color: #1a1f36; letter-spacing: .1px;
}
.p31-gl{
  /* v1.6.63：最多两行 —— 开演时间这类关键信息不许被右侧「距开演还有 N 天」挤到省略号里 */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  margin-top: 5px; min-width: 0; font-size: 12px; line-height: 1.45; color: #5a6178; overflow: hidden;
}
.p31-gl em{ font-style: normal; font-weight: 700; color: #5b4bd6; }
.p31-right{ flex: none; display: flex; align-items: center; gap: 7px; margin-top: 1px; }
.p31-left{
  display: flex; flex-direction: column; align-items: flex-end; gap: 1px; padding: 6px 8px; border-radius: 12px;
  background: rgba(124,92,240,.09); border: 1px solid rgba(124,92,240,.16);
}
.p31-left i{ font-style: normal; font-size: 11px; color: #1a1f36; white-space: nowrap; }
.p31-left b{ font-size: 12px; font-weight: 700; color: #5b4bd6; white-space: nowrap; }
.p31-go{ display: inline-flex; color: #1a1f36; }

/* 手册 / 一屏一题页顶部的场次提要（同一套信息，两行说完，不再占首屏高度） */
.p31-ctx{
  flex: none; margin: 0 0 10px; padding: 9px 12px 10px; border-radius: 16px;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(248,247,255,.97));
  border: 1px solid rgba(196,200,240,.55); box-shadow: 0 8px 20px rgba(31,38,135,.06);
}
.p31-ctx1{ display: block; font-size: 12px; font-weight: 700; line-height: 1.35; color: #1a1f36; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p31-ctx2{ display: block; margin-top: 3px; font-size: 11px; line-height: 1.45; color: #5a6178; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p31-ctx2 em{ font-style: normal; font-weight: 700; color: #5b4bd6; }

/* ---------- 2. 首屏三块：关联场次 / AI 推荐（唯一主按钮）/ 自由计划 + 配额 ---------- */
.p31-home{    padding: 2px 0 0; }
.p31-srow{    margin: 1px 2px -4px; }
.p31-srow b{ font-size: 11px; font-weight: 700; color: #1a1f36; letter-spacing: .6px; }
.p31-srow span{ margin-left: auto; font-size: 11px; color: #1a1f36; }
.p31-cta{
  position: relative; overflow: hidden; display: flex; align-items: center; gap: 11px; width: 100%;
  border: 0; border-radius: 12px; padding: 17px 16px; text-align: left; font-family: inherit; color: #fff;
  background: var(--grad-cta); cursor: pointer;
  box-shadow: 0 14px 30px rgba(58,52,170,.28), inset 0 1px 0 rgba(255,255,255,.34);
}
.p31-cta::after{
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(102deg, transparent 42%, rgba(255,255,255,.26) 50%, transparent 58%);
  transform: translateX(-62%); animation: p31Sweep 6.4s ease-in-out infinite;
}
@keyframes p31Sweep{ 0%,100%{ transform: translateX(-62%); opacity: .45 } 50%{ transform: translateX(46%); opacity: .8 } }
.p31-cta.is-off{ opacity: .5; cursor: default; }
.p31-cta .p31-ic{
  width: 38px; height: 38px; border-radius: 12px; flex: none; display: inline-flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,.2); border: 1px solid rgba(255,255,255,.34);
}
.p31-cta-t{ flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.p31-cta-t b{ font-size: 18px; font-weight: 700; letter-spacing: .3px; }
.p31-cta-t span{ margin-top: 3px; font-size: 12px; line-height: 1.45; color: #ffffff; }
.p31-arr{ flex: none; opacity: .92; }
.p31-b2{
  position: relative; display: flex; align-items: center; gap: 11px; width: 100%; text-align: left;
  padding: 14px 15px; border-radius: 18px; font-family: inherit; cursor: pointer; color: #1a1f36;
  background: rgba(255,255,255,.94); border: 1px solid rgba(150,150,230,.34);
  box-shadow: 0 8px 20px rgba(96,86,220,.08), inset 0 1px 0 rgba(255,255,255,.9);
  transition: transform .16s cubic-bezier(.22,.8,.3,1);
}
.p31-b2:active{ transform: scale(.995); }
.p31-ic2{
  width: 34px; height: 34px; border-radius: 11px; flex: none; display: inline-flex; align-items: center; justify-content: center;
  color: #5b4bd6; background: rgba(124,92,240,.12); border: 1px solid rgba(124,92,240,.18);
}
.p31-b2 .p31-cta-t b{ font-size: 14px; font-weight: 700; color: #1a1f36; }
.p31-b2 .p31-cta-t span{ color: #1a1f36; font-size: 11px; }
.p31-chev{ display: inline-flex; color: #1a1f36; }
.p31-quota{ margin: 2px 4px 0; text-align: center; font-size: 12px; color: #1a1f36; font-variant-numeric: tabular-nums; }

/* ---------- 3. 选择场次 / 自由计划：底部面板（卡片式，不是下拉列表） ---------- */
.p31-sheet{
  position: absolute; inset: 0; z-index: 9; display: flex; flex-direction: column; justify-content: flex-end;
  background: rgba(24,26,52,.42); animation: p31Fade .18s ease both;
}
@keyframes p31Fade{ from{ opacity: 0 } to{ opacity: 1 } }
.p31-panel{
  max-height: 88%; display: flex; flex-direction: column; border-radius: 22px 22px 0 0; overflow: hidden;
  background: linear-gradient(180deg,#f7f8ff,#fdf7ff);
  box-shadow: 0 -18px 40px rgba(20,22,60,.22); animation: p31Up .22s cubic-bezier(.22,.8,.3,1) both;
}
@keyframes p31Up{ from{ transform: translateY(14px) } to{ transform: none } }
.p31-sbar{ flex: none; display: flex; align-items: center; gap: 8px; padding: 13px 14px 8px; }
.p31-sbar b{ flex: 1 1 auto; font-size: 16px; font-weight: 700; color: #1a1f36; }
.p31-sbar button{
  border: 0; font-family: inherit; font-weight: 700; font-size: 12px; border-radius: 999px; padding: 7px 12px;
  color: #6d5ce7; background: rgba(124,92,240,.1); cursor: pointer;
}
.p31-shint{ flex: none; padding: 0 15px 8px; font-size: 11px; line-height: 1.5; color: #1a1f36; }
.p31-slist{ overflow-y: auto; padding: 2px 12px 12px; display: flex; flex-direction: column; gap: 9px; }
.p31-scard{
  display: flex; align-items: flex-start; gap: 12px; width: 100%; text-align: left; font-family: inherit;
  padding: 12px 12px 13px; border-radius: 18px; cursor: pointer;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(246,246,255,.97) 55%, rgba(252,243,255,.95));
  border: 1px solid rgba(196,200,240,.55); box-shadow: 0 8px 20px rgba(31,38,135,.06);
}
.p31-scard.is-cur{ border-color: rgba(124,92,240,.55); box-shadow: 0 10px 24px rgba(96,86,220,.16); }
.p31-scard .p31-date{ width: 54px; padding: 7px 0 6px; border-radius: 13px; }
.p31-scard .p31-date b{ font-size: 16px; }
.p31-chk{
  flex: none; width: 22px; height: 22px; margin-top: 6px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
  border: 1.5px solid rgba(124,92,240,.32); color: #fff; background: #fff;
}
.p31-chk.on{ background: var(--grad-cta); border-color: transparent; box-shadow: 0 6px 14px rgba(58,52,170,.3); }
.p31-sfoot{
  flex: none; display: flex; align-items: center; justify-content: center; gap: 6px; width: 100%;
  padding: 11px 12px 14px; border: 0; border-top: 1px solid rgba(150,150,230,.18); cursor: pointer;
  background: #fff; color: #6d5ce7; font-family: inherit; font-size: 12px; font-weight: 700;
}
.p31-pick3{ display: flex; flex-direction: column; gap: 9px; padding: 4px 12px 14px; }

/* ---------- 4. 编号行程手册（AI 说明 + 总览 + 按天分段 + 亮点 + 底部动作） ---------- */
.p31-book{ padding: 0 0 4px; }
.p31-note{
  margin: 0 0 10px; padding: 12px 13px; border-radius: 18px;
  background: linear-gradient(150deg, rgba(243,245,255,.98), rgba(246,240,255,.98) 52%, rgba(240,250,255,.98));
  border: 1px solid rgba(150,150,230,.34);
  box-shadow: 0 8px 20px rgba(96,86,220,.10), inset 0 1px 0 rgba(255,255,255,.95);
}
.p31-note .hd{ display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 700; color: #6d5ce7; }
.p31-note p{ margin-top: 7px; font-size: 12px; line-height: 1.62; color: #1a1f36; }
.p31-note .row{ display: flex; align-items: center; gap: 8px; margin-top: 11px; flex-wrap: wrap; }
.p31-todochip{ font-size: 11px; font-weight: 700; color: #8a5a00; background: rgba(245,158,11,.18); border-radius: 999px; padding: 5px 9px; }
.p31-okchip{ display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 700; color: #5a6178; background: rgba(60,190,140,.16); border-radius: 999px; padding: 5px 9px; }
.p31-mini{
  border: 0; font-family: inherit; font-size: 12px; font-weight: 700; border-radius: 999px; padding: 9px 13px; cursor: pointer;
  color: #fff; background: var(--grad-cta); box-shadow: 0 8px 18px rgba(58,52,170,.24);
}
.p31-mini.ghost{ color: #6d5ce7; background: rgba(124,92,240,.10); box-shadow: none; }
.p31-sum{ display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 10px; }
.p31-sum i{ font-style: normal; font-size: 11px; font-weight: 700; color: #5a6178; background: rgba(124,92,240,.09); border-radius: 999px; padding: 4px 9px; }
.p31-day{  font-size: 12px; font-weight: 700; color: #6d5ce7; letter-spacing: .3px; }


.p31-hb .no{ grid-row: 1 / span 3;      }

.p31-hb .tm{ font-size: 12px; font-weight: 700; color: #5b4bd6; font-variant-numeric: tabular-nums; }
.p31-hb .dur{ font-size: 11px; font-weight: 700; color: #1a1f36; background: rgba(124,92,240,.08); border-radius: 999px; padding: 2px 7px; }
.p31-hb .tag{ font-size: 11px; font-weight: 700; color: #6d5ce7; background: rgba(124,92,240,.14); border-radius: 999px; padding: 2px 7px; }

.p31-hb .todo{ font-size: 11px; font-weight: 700; color: #8a5a00; background: rgba(245,158,11,.2); border-radius: 999px;  }




@keyframes p31Just{ 0%{ background: rgba(60,190,140,.16) } 100%{ background: rgba(255,255,255,.95) } }
.p31-empty{ padding: 16px 4px; font-size: 12px; color: #1a1f36; }
.p31-hl{ margin-top: 12px; padding: 12px 13px; border-radius: 18px; background: rgba(255,255,255,.9); border: 1px solid rgba(196,200,240,.5); }
.p31-hl h4{ display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 700; color: #6d5ce7; }
.p31-hl ul{ margin: 8px 0 0; padding-left: 17px; }
.p31-hl li{ font-size: 12px; line-height: 1.65; color: #5a6178; }
.p31-acts{ display: flex; gap: 9px; margin-top: 14px; }
.p31-save{
  flex: 1 1 auto; display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  border: 0; border-radius: 16px; padding: 14px 16px; cursor: pointer; font-family: inherit;
  font-size: 16px; font-weight: 700; color: #fff; background: var(--grad-cta);
  box-shadow: 0 12px 26px rgba(58,52,170,.26), inset 0 1px 0 rgba(255,255,255,.3);
}
.p31-save[disabled]{ opacity: .8; cursor: default; }
.p31-ghost{
  flex: none; display: inline-flex; align-items: center; gap: 6px; border-radius: 16px; padding: 14px 14px;
  cursor: pointer; font-family: inherit; font-size: 12px; font-weight: 700; color: #6d5ce7;
  background: rgba(255,255,255,.94); border: 1px solid rgba(150,150,230,.34);
}
.p31-cf{
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 10px; padding: 10px 12px;
  border-radius: 14px; background: rgba(255,255,255,.96); border: 1px solid rgba(124,92,240,.28);
}
.p31-cf span{ flex: 1 1 auto; font-size: 12px; color: #1a1f36; }
.p31-cf-no{
  border: 0; border-radius: 999px; padding: 7px 12px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #6d5ce7; background: rgba(124,92,240,.1);
}
.p31-cf-yes{
  border: 0; border-radius: 999px; padding: 7px 13px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #fff; background: var(--grad-cta);
}
.p31-foot{ margin-top: 10px; text-align: center; font-size: 11px; color: #1a1f36; }

/* ---------- 5. 一屏一题（卡片式，不是聊天）：大选项 + 答完就地更新 ---------- */
.p31-ask{ padding: 14px 13px; border-radius: 20px; background: rgba(255,255,255,.96); border: 1px solid rgba(196,200,240,.55); box-shadow: 0 12px 28px rgba(31,38,135,.08); }
.p31-step{ display: flex; align-items: center; gap: 7px; font-size: 11px; font-weight: 700; color: #1a1f36; }
.p31-dots{ display: flex; gap: 4px; margin-left: auto; }
.p31-dots i{ width: 16px; height: 4px; border-radius: 999px; background: rgba(124,92,240,.16); }
.p31-dots i.on{ background: var(--grad-iris); }
.p31-q{ margin-top: 9px; font-size: 18px; font-weight: 700; letter-spacing: .2px; color: #1a1f36; }
.p31-qs{ margin-top: 5px; font-size: 12px; line-height: 1.5; color: #1a1f36; }
.p31-opt{ display: flex; flex-direction: column; gap: 9px; margin-top: 13px; }
.p31-opt button{
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; padding: 14px;
  border-radius: 12px; font-family: inherit; font-size: 16px; font-weight: 700; color: #1a1f36;
  background: #fff; border: 1px solid rgba(124,92,240,.18); cursor: pointer;
  transition: transform .16s cubic-bezier(.22,.8,.3,1);
}
.p31-opt button:active{ transform: scale(.99); }
.p31-opt button[disabled]{ opacity: .6; cursor: default; }
.p31-askfoot{ display: flex; align-items: center; gap: 10px; margin-top: 11px; }
.p31-askfoot button{ border: 0; background: none; padding: 2px 0; cursor: pointer; font-family: inherit; font-size: 12px; color: #1a1f36; text-decoration: underline; text-underline-offset: 3px; }
.p31-askfoot .muted{ margin-left: auto; font-size: 11px; }
.p31-upd{ margin-top: 12px; padding: 10px 12px; border-radius: 14px; font-size: 12px; line-height: 1.5; color: #5a6178; background: rgba(60,190,140,.12); border: 1px solid rgba(60,190,140,.3); }
.p31-upd.is-busy{ color: #6d5ce7; background: rgba(124,92,240,.10); border-color: rgba(124,92,240,.28); }

/* ---------- 6. 底部输入条：默认收起成一枚胶囊（可选，不打扰） ---------- */
.p31-composer{
  flex: none; position: relative; z-index: 5; padding: 8px 0 0; margin-top: 6px;
  background: linear-gradient(180deg, rgba(238,240,252,0), rgba(236,238,252,.92) 46%, rgba(236,238,252,.99));
  transform: translateY(calc(-1 * var(--p31-kb, 0px)));
  transition: transform .18s ease-out;
}
.p31-composer[hidden]{ display: none; }
.p31-pill{
  display: flex; align-items: center; justify-content: center; gap: 7px; margin: 0 auto; padding: 10px 15px;
  border-radius: 999px; cursor: pointer; font-family: inherit; font-size: 12px; font-weight: 700; color: #6d5ce7;
  background: rgba(255,255,255,.96); border: 1px solid rgba(150,150,230,.34);
  box-shadow: 0 8px 20px rgba(31,38,135,.08);
}
.p31-cbox{
  display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: 999px;
  background: rgba(255,255,255,.97); border: 1px solid rgba(150,150,230,.34);
  box-shadow: 0 10px 24px rgba(31,38,135,.10), inset 0 1px 0 rgba(255,255,255,.95);
}
.p31-cin{
  flex: 1 1 auto; min-width: 0; height: 34px; border: none; outline: none; background: transparent;
  font-family: inherit; font-size: 12px; color: #1a1f36;
}
.p31-cin::placeholder{ color: #5a6178; }
.p31-cic{
  flex: none; width: 32px; height: 32px; border-radius: 50%; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; color: #5b4bd6;
  background: linear-gradient(160deg, rgba(238,240,255,.98), rgba(246,240,255,.96));
  border: 1px solid rgba(124,92,240,.18);
}
.p31-csend{
  flex: none; width: 34px; height: 34px; border-radius: 50%; border: none; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; color: #fff;
  background: var(--grad-cta); box-shadow: 0 8px 18px rgba(109,92,231,.3);
}
.p31-csend:active{ transform: scale(.95); }
.p31-cquota{ margin: 6px 2px 0; text-align: right; font-size: 11px; color: #1a1f36; font-variant-numeric: tabular-nums; }

/* ---------- 7. 深色主题（沿用全站那一套，不新增暗色开关） ---------- */
[data-theme="dark"] .plan31-page{ background: none; }
[data-theme="dark"] .p31-gig, [data-theme="dark"] .p31-scard{
  background: linear-gradient(160deg, rgba(30,34,56,.94), rgba(24,28,46,.9)); border-color: rgba(124,92,240,.28);
}
[data-theme="dark"] .p31-ctx{ background: linear-gradient(160deg, rgba(28,32,52,.94), rgba(26,28,48,.92)); border-color: rgba(124,92,240,.24); }
[data-theme="dark"] .p31-date{ background: rgba(124,92,240,.18); border-color: rgba(124,92,240,.3); }
[data-theme="dark"] .p31-date b, [data-theme="dark"] .p31-gl em, [data-theme="dark"] .p31-ctx2 em, [data-theme="dark"] .p31-left b, [data-theme="dark"] .p31-hb .tm{ color: #c4b2ff; }
[data-theme="dark"] .p31-gt, [data-theme="dark"] .p31-ctx1, [data-theme="dark"] .p31-sbar b, [data-theme="dark"] .p31-q, [data-theme="dark"] .p31-hb .t{ color: #eef1ff; }
[data-theme="dark"] .p31-gl, [data-theme="dark"] .p31-ctx2, [data-theme="dark"] .p31-hb .d{ color: #eef1ff; }
[data-theme="dark"] .p31-sheet .p31-panel{ background: linear-gradient(180deg,#1a1e34,#20203a); }
[data-theme="dark"] .p31-sfoot{ background: #1a1e34; border-top-color: rgba(150,150,230,.16); }
[data-theme="dark"] .p31-b2{ background: rgba(28,32,52,.94); border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p31-b2 .p31-cta-t b{ color: #eef1ff; }
[data-theme="dark"] .p31-book .p31-hb, [data-theme="dark"] .p31-ask, [data-theme="dark"] .p31-hl{ background: linear-gradient(160deg, rgba(28,32,52,.94), rgba(24,26,44,.92)); border-color: rgba(124,92,240,.24); }
[data-theme="dark"] .p31-note{ background: linear-gradient(150deg, rgba(36,40,66,.96), rgba(32,28,56,.94)); border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p31-note p{ color: #eef1ff; }
[data-theme="dark"] .p31-opt button{ background: rgba(28,32,52,.94); color: #eef1ff; border-color: rgba(124,92,240,.28); }
[data-theme="dark"] .p31-cbox{ background: rgba(26,30,48,.96); border-color: rgba(150,150,230,.26); }
[data-theme="dark"] .p31-cin{ color: #eef1ff; }
[data-theme="dark"] .p31-cic{ color: #c4b2ff; background: rgba(40,44,70,.9); border-color: rgba(150,150,230,.26); }
[data-theme="dark"] .p31-pill{ background: rgba(30,34,56,.94); color: #c4b2ff; border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p31-composer{ background: linear-gradient(180deg, rgba(18,22,40,0), rgba(18,22,40,.9) 46%, rgba(18,22,40,.98)); }

/* ---------- 8. 降级：系统开了「减少动态效果」→ 只留静态 ---------- */
@media (prefers-reduced-motion: reduce){
  .p31-cta::after{ animation: none; opacity: .3; }
  .p31-sheet, .p31-panel, .p31-hb.is-just{ animation: none; }
  .p31-gig, .p31-b2, .p31-opt button, .p31-composer{ transition: none; }
}

/* ---------- 9. V3.1 收口细节：内联确认默认不占位 + 已写入一行更耐挤 ---------- */
.plan31-page .p31-cf[hidden]{ display: none; }
.plan31-page .plan-ai-row{ flex-wrap: wrap; row-gap: 4px; }
.plan31-page .plan-ai-row .plan-ai-chip{ flex: 1 1 auto; min-width: 0; }
.plan31-page .p31-ctx + .p31-home{ padding-top: 2px; }
.plan31-page .plan-ai-row .btn-text:first-of-type{ margin-left: auto; }

/* ============================================================================
   v1.6.61 · AI 计划 V3.2「极简三步入线」
   只作用于这一页（.plan31-page / #plan-ai-host / #plan-sheet-host / .p31-*）：
   右上角小入口 + 场次卡 + 唯一主按钮 + 一行配额；生成即手册；底部固定操作条
   「调一句」胶囊 +「保存到我的行程」；待定条点开一屏内小浮层；调整预览就地决定。
   ============================================================================ */
.plan31-page .p31-topline{ display: flex; justify-content: flex-end; margin: 0 2px -3px; }
.p31-corner{
  display: inline-flex; align-items: center; gap: 5px; border: 0; cursor: pointer;
  padding: 5px 9px; border-radius: 999px; font-family: inherit; font-size: 11px; font-weight: 700;
  color: #6d5ce7; background: rgba(124,92,240,.09); border: 1px solid rgba(124,92,240,.16);
}
.p31-corner:active{ transform: scale(.98); }
.plan31-page .p31-home .p31-gig{ margin-top: 4px; }

/* 底部固定操作条：小胶囊在左、主按钮占满剩余宽度 */
.p31-bar{ display: flex; align-items: center;  }
.p31-bar .p31-pill{ margin: 0;  }

.p31-composer .p31-cf{ margin: 0 0 9px; }
.p31-composer .p31-save[disabled]{ opacity: .55; }

/* 待定条：整条可点（一屏内小浮层补这一条）；「待定」小标签本身也是按钮，样式不变 */
.p31-hb.is-todo{ cursor: pointer; }
.p31-hb.is-todo:active{ transform: scale(.996); }
.p31-hb .todo{
  padding: 2px 7px; border: 0; cursor: pointer; font-family: inherit; }
.p31-book[data-saved="1"] .p31-hb.is-todo .todo{ cursor: pointer; }

/* 已保存 + 调整预览 */
.p31-saved{
  display: inline-flex; align-items: center; gap: 6px; margin: 0 0 9px; padding: 6px 11px;
  border-radius: 999px; font-size: 11px; font-weight: 700; color: #5a6178;
  background: rgba(60,190,140,.14); border: 1px solid rgba(60,190,140,.3);
}
.p31-adapt{
       
   background: linear-gradient(150deg, rgba(244,242,255,.98), rgba(255,255,255,.96));
  border: 1px solid rgba(124,92,240,.3); box-shadow: 0 10px 24px rgba(31,38,135,.07);
}
.p31-adapt-t{     font-size: 12px; color: #6d5ce7; }

.p31-adapt-t i{   color: #1a1f36; }
.p31-adapt-use{
  flex: 1 1 auto; border: 0; border-radius: 999px; padding: 9px 14px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #fff; background: var(--grad-cta); box-shadow: 0 8px 18px rgba(58,52,170,.22);
}
.p31-adapt-keep{
  flex: none; border: 1px solid rgba(150,150,230,.34); border-radius: 999px; padding: 9px 14px; cursor: pointer;
  font-family: inherit; font-size: 12px; font-weight: 700; color: #6d5ce7; background: rgba(255,255,255,.96);
}
.p31-adapt-use:active, .p31-adapt-keep:active{ transform: scale(.98); }

/* 手册收尾的两个次级动作（重新生成 / 分享长图） */
.p31-tail{ display: flex; gap: 9px; margin-top: 12px; }
.p31-tail .p31-ghost{ flex: 1 1 auto; justify-content: center; padding: 12px 10px; font-size: 12px; }

/* 待定补充：一屏内小浮层（挂在底部面板上，同一套 sheet 皮肤） */
.p31-sheet .p31-opt{ padding: 2px 12px 10px; }
.p31-sheet .p31-opt-chips{ display: flex; flex-wrap: wrap; gap: 8px; padding-bottom: 16px; }
.p31-sheet .p31-opt-chips .p31-echip{ margin-bottom: 0; }
.p31-sheet .p31-opt-chips .p31-echip.on{
  color: #5b4bd6; background: rgba(124,92,240,.12); border-color: rgba(124,92,240,.55);
  box-shadow: inset 0 0 0 1px rgba(124,92,240,.12);
}
.p31-tinrow{ display: flex; align-items: center; gap: 8px; padding: 0 12px 14px; }
.p31-tin{
  flex: 1 1 auto; min-width: 0; height: 40px; padding: 0 13px; border-radius: 999px; font-family: inherit;
  font-size: 12px; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34); outline: none;
}
.p31-tin:focus{ border-color: rgba(124,92,240,.6); box-shadow: 0 0 0 3px rgba(124,92,240,.12); }
.p31-tinok{
  flex: none; height: 40px; padding: 0 15px; border: 0; border-radius: 999px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #fff; background: var(--grad-cta);
}

/* 深色主题 */
[data-theme="dark"] .p31-corner{ color: #c4b2ff; background: rgba(124,92,240,.16); border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p31-adapt{ background: linear-gradient(150deg, rgba(36,40,66,.96), rgba(30,28,54,.94)); border-color: rgba(150,150,230,.3); }
[data-theme="dark"] .p31-adapt-t{ color: #c4b2ff; }
[data-theme="dark"] .p31-adapt-t i{ color: #eef1ff; }
[data-theme="dark"] .p31-adapt-keep{ color: #c4b2ff; background: rgba(30,34,56,.94); border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p31-saved{ color: #5fd39b; background: rgba(60,190,140,.16); border-color: rgba(60,190,140,.32); }
[data-theme="dark"] .p31-tin{ background: rgba(28,32,52,.94); color: #eef1ff; border-color: rgba(150,150,230,.28); }

/* 降级：系统开了「减少动态效果」→ 只留静态 */
@media (prefers-reduced-motion: reduce){
  .p31-corner, .p31-hb.is-todo, .p31-adapt-use, .p31-adapt-keep{ transition: none; }
}

/* 就地更新中的一行轻提示（手册不整页换；只在顶上说明正在更新） */
.p31-busy{
  display: flex; align-items: center; gap: 8px; margin: 0 0 9px; padding: 9px 12px;
  border-radius: 14px; font-size: 12px; font-weight: 700; color: #6d5ce7;
  background: rgba(124,92,240,.10); border: 1px solid rgba(124,92,240,.26);
}
.p31-busy-dot{ width: 7px; height: 7px; border-radius: 50%; background: var(--grad-iris); animation: p31BusyPulse 1.2s ease-in-out infinite; }
@keyframes p31BusyPulse{ 0%,100%{ opacity: .4; transform: scale(.85) } 50%{ opacity: 1; transform: scale(1.15) } }
@media (prefers-reduced-motion: reduce){ .p31-busy-dot{ animation: none; opacity: .85; } }

/* ============================================================================
   v1.6.62 · AI 计划 V3.3「可编辑行程单 + P0 导航」
   只作用于这一页（.plan31-page / #plan-ai-host / .p31-*）：
   ① 顶栏层级 = 返回 · AI 计划 ·（右侧一个次级操作 .p31-hbtn）；
   ② 手册顶部一行「依据」+（信息不全时）补全提示；
   ③ 正文 = 按天分段 + 左侧细时间轴，条目 = 时间段 / 时长 / 标签 / 标题 / 做法；
   ④ 点条目就地展开编辑（时间 / 标题 / 做法），「待定」在同一张表单里补；
   ⑤ 调整预览收成一条（不再占一块大卡）。
   动效只用 transform / opacity，prefers-reduced-motion 下降级。
   ============================================================================ */
/* ---------- ① 顶栏右侧那一个次级操作 ---------- */
.plan31-page .p31-hbtn{
  display: inline-flex; align-items: center; gap: 4px; border: 0; cursor: pointer; font-family: inherit;
  padding: 6px 11px; border-radius: 999px; font-size: 12px; font-weight: 700;
  color: #6d5ce7; background: rgba(124,92,240,.10); border: 1px solid rgba(124,92,240,.18);
}
.plan31-page .p31-hbtn:active{ transform: scale(.98); }
[data-theme="dark"] .plan31-page .p31-hbtn{ color: #c4b2ff; background: rgba(124,92,240,.18); border-color: rgba(150,150,230,.28); }

/* ---------- ② 依据一行（随手册一起滚，摊开写清楚） ---------- */
.p31-basis{
  /* 「依据」跟着手册滚，但常驻在内容区顶部（sticky 相对 .p31-body 这个唯一滚动区） */
  position: sticky; top: 0; z-index: 4;
  display: flex; align-items: center; gap: 7px; margin: 0 0 9px; padding: 8px 10px;
  border-radius: 14px; font-size: 11px; line-height: 1.4; color: #1a1f36;
  background: linear-gradient(150deg, #f4f6ff, #f6f1ff);
  border: 1px solid rgba(150,150,230,.3);
  box-shadow: 0 6px 14px -8px rgba(31,38,135,.22);
}
.p31-basis svg{ flex: none; color: #6d5ce7; }
.p31-basis-x{ flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p31-basis-x b{ margin-right: 4px; font-weight: 700; color: #6d5ce7; }
.p31-basis-a{
  flex: none; border: 0; cursor: pointer; font-family: inherit; font-size: 11px; font-weight: 700;
  border-radius: 999px; padding: 5px 10px; color: #6d5ce7; background: rgba(255,255,255,.9);
  border: 1px solid rgba(150,150,230,.36);
}
.p31-warn{
  display: flex; align-items: center; gap: 7px; margin: -3px 0 9px; padding: 8px 10px;
  border-radius: 14px; font-size: 11px; font-weight: 700; color: #8a5a00;
  background: rgba(245,158,11,.12); border: 1px solid rgba(245,158,11,.3);
}
.p31-warn svg{ flex: none; }
.p31-warn span{ flex: 1 1 auto; min-width: 0; }
.p31-warn-a{
  flex: none; border: 0; cursor: pointer; font-family: inherit; font-size: 11px; font-weight: 700;
  border-radius: 999px; padding: 5px 10px; color: #8a5a00; background: rgba(255,255,255,.9);
  border: 1px solid rgba(245,158,11,.36);
}
[data-theme="dark"] .p31-basis{ background: linear-gradient(150deg, #232840, #211f38); border-color: rgba(150,150,230,.26); color: #eef1ff; }
[data-theme="dark"] .p31-basis-x b{ color: #c4b2ff; }
[data-theme="dark"] .p31-basis-a{ background: rgba(40,44,70,.9); color: #c4b2ff; border-color: rgba(150,150,230,.3); }

/* ---------- ③ 竖向时间线：一天一段 + 左侧细轴 ---------- */
.p31-day{ display: flex; align-items: baseline; gap: 7px; margin: 15px 2px 8px; }
.p31-day b{ font-size: 12px; font-weight: 700;  letter-spacing: .3px; }
.p31-day span{ font-size: 11px;  }
.p31-hbs{ position: relative; display: flex; flex-direction: column;  padding-left: 15px; }
.p31-hbs::before{
  content: ''; position: absolute; left: 4.5px; top: 10px; bottom: 10px; width: 1.5px; border-radius: 2px;
  background: linear-gradient(180deg, rgba(124,92,240,.34), rgba(124,92,240,.10) 72%, rgba(124,92,240,.04));
}
.p31-hb{
  position: relative; display: grid; grid-template-columns: 22px 1fr; gap: 0 8px;
    cursor: default;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(249,249,255,.96));
  border: 1px solid rgba(196,200,240,.5); 
}
.p31-hb::before{
  content: ''; position: absolute; left: -16px; top: 17px; width: 8px; height: 8px; border-radius: 50%;
  background: #fff; border: 1.5px solid rgba(124,92,240,.5); box-shadow: 0 0 0 3px rgba(124,92,240,.07);
}
.p31-hb.is-todo::before{ border-color: rgba(245,158,11,.72); box-shadow: 0 0 0 3px rgba(245,158,11,.10); }
.p31-hb.is-open{ border-color: rgba(124,92,240,.5); box-shadow: 0 12px 26px rgba(96,86,220,.14); }
.p31-hb .no{   font-weight: 700;  font-variant-numeric: tabular-nums; }
.p31-hbmain{   cursor: pointer; }
.p31-hbmain[data-open="1"]{ cursor: default; }
.p31-hbtip{ display: inline-flex; margin-left: auto; color: #1a1f36; }
.p31-hb .r1{ display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.p31-hb .t{ margin-top: 6px; font-size: 14px; font-weight: 700; line-height: 1.4; color: #1a1f36; }
.p31-hb .d{ margin-top: 3px; font-size: 12px; line-height: 1.6; color: #1a1f36; }
.p31-hb.is-todo{ border-color: rgba(245,158,11,.45); background: linear-gradient(160deg, rgba(255,250,240,.98), rgba(255,255,255,.96)); }
.p31-hb.is-just{ animation: p31Just .9s ease both; }
@keyframes p31Just{ 0%{ background: rgba(60,190,140,.16) } 100%{ background: rgba(255,255,255,.95) } }

/* ---------- ④ 就地编辑表单（点条目展开的那一块） ---------- */
.p31-edit{ grid-column: 1 / -1; margin-top: 7px; padding-top: 7px; border-top: 1px solid rgba(150,150,230,.22); }
.p31-ehd{ display: flex; align-items: center; gap: 6px; margin-bottom: 8px; font-size: 11px; font-weight: 700; color: #8a5a00; }
.p31-ehd svg{ flex: none; }
.p31-echips{ display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; }
.p31-echip{
  height: 32px; padding: 0 12px; border-radius: 12px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #5a6178; background: #fff; border: 1px solid rgba(124,92,240,.18);
  transition: transform .16s cubic-bezier(.22,.8,.3,1);
}
.p31-echip:active{ transform: scale(.97); }
.p31-echip[disabled]{ opacity: .55; cursor: default; }
.p31-ecin{ display: flex; align-items: center; gap: 8px; }
.p31-esep{ height: 1px; margin: 11px 0; background: rgba(150,150,230,.18); }
.p31-elab{ display: block; margin: 4px 0 3px; font-size: 11px; font-weight: 700; color: #1a1f36; letter-spacing: .3px; }
.p31-etimes{ display: flex; align-items: center; gap: 8px; }
.p31-eto{ color: #1a1f36; }
.p31-ein{
  flex: 1 1 auto; min-width: 0; height: 38px; padding: 0 12px; border-radius: 12px; font-family: inherit;
  font-size: 12px; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34); outline: none;
}
.p31-eta{
  display: block; width: 100%; min-height: 66px; padding: 9px 12px; border-radius: 12px; font-family: inherit;
  font-size: 12px; line-height: 1.55; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34);
  outline: none; resize: none;
}
.p31-ein:focus, .p31-eta:focus{ border-color: rgba(124,92,240,.6); box-shadow: 0 0 0 3px rgba(124,92,240,.12); }
.p31-eacts{ display: flex; align-items: center; gap: 9px; margin-top: 8px; }
.p31-ebtn{
  flex: 1 1 auto; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  border: 0; border-radius: 12px; padding: 11px 14px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #fff; background: var(--grad-cta);
  box-shadow: 0 10px 22px rgba(58,52,170,.22);
}
.p31-ebtn.ghost{ flex: none; color: #6d5ce7; background: rgba(124,92,240,.10); box-shadow: none; }
.p31-ebtn.sm{ flex: none; height: 38px; padding: 0 14px; font-size: 12px; border-radius: 12px; box-shadow: none; }
.p31-ebtn:active{ transform: scale(.98); }
.p31-ebtn[disabled]{ opacity: .55; cursor: default; }
[data-theme="dark"] .p31-hb{ background: linear-gradient(160deg, rgba(28,32,52,.94), rgba(24,26,44,.92));  }
[data-theme="dark"] .p31-hb::before{ background: #1c2036; }
[data-theme="dark"] .p31-hb.is-todo{ background: linear-gradient(160deg, rgba(42,36,26,.94), rgba(28,26,44,.92)); border-color: rgba(245,158,11,.4); }
[data-theme="dark"] .p31-hb .t{ color: #eef1ff; }
[data-theme="dark"] .p31-hb .d{ color: #eef1ff; }
[data-theme="dark"] .p31-hb .no{ color: #a8b0c8; }
[data-theme="dark"] .p31-day b{ color: #c4b2ff; }
[data-theme="dark"] .p31-day span{ color: #eef1ff; }
[data-theme="dark"] .p31-ein, [data-theme="dark"] .p31-eta{ background: rgba(28,32,52,.96); color: #eef1ff; border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p31-echip{ background: rgba(30,34,56,.96); color: #eef1ff; border-color: rgba(124,92,240,.28); }
[data-theme="dark"] .p31-ebtn.ghost{ color: #c4b2ff; background: rgba(124,92,240,.18); }
[data-theme="dark"] .p31-edit{ border-top-color: rgba(150,150,230,.2); }
[data-theme="dark"] .p31-elab{ color: #a8b0c8; }

/* ---------- ⑤ 调整预览：一条，不占大卡 ---------- */
.p31-adapt{ display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; margin: 0 0 9px; padding: 8px 10px; border-radius: 14px; }
.p31-adapt-t{ flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 6px; overflow: hidden; white-space: nowrap; }
.p31-adapt-t b{ font-size: 12px; font-weight: 700; }
.p31-adapt-t i{ font-style: normal; font-size: 11px; }
.p31-adapt-use, .p31-adapt-keep{ flex: none; padding: 7px 11px; font-size: 12px; }

/* ---------- 降级：系统开了「减少动态效果」 ---------- */
@media (prefers-reduced-motion: reduce){
  .p31-hbtn, .p31-echip, .p31-ebtn, .p31-hb.is-just{ animation: none; transition: none; }
}

/* ============================================================================
   v1.6.63 · AI 计划 V4「参数化精准行程 + 分档环节 + 确认锁定 + 地图数据位」
   只作用于这一页（.plan31-page / #plan-ai-host / .p31-*），其它页面一字不动：
   ① 首屏三入口的层级（主 = 流光渐变大卡 / 次主 = 白卡 / 次 = 最轻一档），把一屏撑满；
   ② 门槛补录卡 + 参数卡（原生选择器 + 芯片，界面不跳）；
   ③ 结果页四段：进度条 / 温馨提示 / 明细（已核对）/ 底部固定条（确认计划 + 重新生成）；
   ④ 地图数据位（示意）：模式徽标 + 步骤 + 区间数值 + 「示意」角标 + 在高德打开；
   ⑤ 锁定页（只读）与删除二次确认。
   动效只用 transform / opacity，prefers-reduced-motion 下降级。
   ============================================================================ */
/* ---------- ① 首屏四入口（v1.6.87 起）：一套骨架把一屏撑满，小屏也不溢出 ---------- */
/* 撑满一屏：宿主先拿到确定高度（.p31-body 是唯一滚动区，高度确定；:has 只在首屏成立），
   四张卡 flex:1 平分剩余空间 —— 不留大片空白，也不会把内容撑出屏幕。
   ⚠️ 旧的「三档比例 1.5 / 1.15 / 0.9 + is-mid / is-mini 三种形态」在 v1.6.87 全部收掉，
      统一规则见文件末尾的 v1.6.87 区块（.p31-cta.is-sub）。 */
#plan-ai-host:has(> .p31-home){ display: flex; flex-direction: column; height: 100%; }
.p31-home{ display: flex; flex-direction: column;  min-height: calc(100% - 8px); }

.p31-cta.is-main{ flex: 1 1 0; min-height: 84px; }


/* ---------- ② 门槛补录卡 ---------- */
.p31-gate{ padding: 14px 13px; border-radius: 18px; background: linear-gradient(160deg,#fff,#f7f5ff);
  border: 1px solid rgba(150,150,230,.30); box-shadow: 0 10px 24px -18px rgba(31,38,135,.35); }
.p31-ghd{ display: flex; align-items: center; gap: 7px; font-size: 14px; font-weight: 700; color: #5a6178; }
.p31-ghd svg{ flex: none; color: #8a5a00; }
.p31-gsub{ margin: 6px 0 10px; font-size: 12px; line-height: 1.5; color: #1a1f36; }
.p31-gacts{ display: flex; gap: 8px; justify-content: flex-end; margin-top: 12px; }

/* ---------- ③ 参数卡（原生选择器 + 芯片；界面不跳） ---------- */
.p31-params{  border-radius: 18px; background: linear-gradient(160deg,#fff,#f6f4ff);
  border: 1px solid rgba(150,150,230,.30); box-shadow: 0 10px 24px -18px rgba(31,38,135,.35); }
.p31-phd{ display: flex; align-items: center; gap: 7px; font-size: 14px; font-weight: 700; color: #5a6178; margin-bottom: 10px; }
.p31-phd svg{ flex: none; color: #6d5ce7; }
.p31-pf{ display: block; margin: 0 0 10px; }
.p31-pf > span{ display: block; margin-bottom: 5px; font-size: 11px; font-weight: 700; color: #1a1f36; }
.p31-pin{ width: 100%; box-sizing: border-box; padding: 9px 11px; border-radius: 12px; font-family: inherit; font-size: 12px;
  color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34); }
.p31-pin:focus{ outline: none; border-color: rgba(107,91,214,.6); box-shadow: 0 0 0 3px rgba(107,91,214,.12); }
.p31-pchips{ display: flex; flex-wrap: wrap; gap: 7px; }
.p31-pchip{ position: relative; cursor: pointer; font-family: inherit; font-size: 12px; font-weight: 700;
  padding: 8px 11px; border-radius: 999px; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34); }
.p31-pchip.on{ color: #6d5ce7; background: rgba(124,92,240,.12); border-color: rgba(124,92,240,.45); }
.p31-pchip:active{ transform: scale(.97); }
.p31-perr{ display: flex; align-items: center; gap: 6px; margin: 4px 0 8px; padding: 8px 10px; border-radius: 12px;
  font-size: 11px; font-weight: 700; color: #dc3545; background: rgba(249,115,22,.12); border: 1px solid rgba(249,115,22,.28); }
.p31-phint{ margin: 2px 0 8px; font-size: 11px; color: #8a5a00; }
/* v1.6.98（老板图 2）：「开始推算」+ 它下面那行「20/20 本次 1 次」整体下移 2px。
   基线口径 = 上外边距 4px → 6px（其它页面 / 状态按这条走）；
   参数页这条另有 `.plan31-page[data-p="params"] .p31-pgo{margin-top:auto}`（计算值 0px）——auto 会吃掉全部剩余高度，
   单改上外边距在那儿不产生位移，所以参数页改用「底部让出 2px」实现同一个视觉结果（见文件末尾 v1.6.98 段）。 */
.p31-pgo{ width: 100%; margin-top: 6px; padding: 11px 14px; border: 0; cursor: pointer; font-family: inherit;
  border-radius: 15px; font-size: 14px; font-weight: 700; color: #fff; display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  background: linear-gradient(96deg,#556fe8,#7c5cf0 52%,#2c96bd); box-shadow: 0 12px 22px -14px rgba(60,60,180,.7); }
.p31-pgo:disabled{ opacity: .55; box-shadow: none; }
.p31-pgo:active{ transform: translateY(1px); }
.p31-pquota{ margin-top: 6px; text-align: center; font-size: 11px; color: #1a1f36; }

/* ---------- ④ 结果页四段：进度条 / 温馨提示 / 明细 / 底部条 ---------- */
.p31-prog{ padding: 12px 12px 10px; border-radius: 16px; background: #fff; border: 1px solid rgba(150,150,230,.26);
  box-shadow: 0 8px 20px -18px rgba(31,38,135,.4); margin-bottom: 9px; }
.p31-prhd{ display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12px; font-weight: 700; color: #1a1f36; }
.p31-prchk{ flex: none; white-space: nowrap; font-size: 11px; font-weight: 700;  background: rgba(124,92,240,.10);
  border: 1px solid rgba(124,92,240,.22); border-radius: 999px; padding: 3px 9px; }
.p31-prbar{ height: 6px; margin: 10px 0 8px; border-radius: 999px; background: rgba(124,92,240,.13); overflow: hidden; }
.p31-prbar i{ display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg,#556fe8,#7c5cf0,#2c96bd); transition: width .3s ease; }
.p31-prnodes{  justify-content: space-between;  }
.p31-prn{ display: flex; flex-direction: column; align-items: center;      }
.p31-prn i{ width: 7px; height: 7px; border-radius: 50%; background: rgba(124,92,240,.22); }
.p31-prn.on{ color: #6d5ce7; font-weight: 700; }
.p31-prn.on i{ background: linear-gradient(120deg,#556fe8,#7c5cf0); }

.p31-tips{ padding: 12px; border-radius: 16px; margin-bottom: 9px;
  background: linear-gradient(150deg,#f7f5ff,#f2f8ff); border: 1px solid rgba(150,150,230,.26); }
.p31-thd{ display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; color: #5a6178; }
.p31-thd span{ margin-left: auto; font-size: 11px; font-weight: 700; color: #6d5ce7; }
.p31-tips ul{ margin: 8px 0 0; padding-left: 18px; }
.p31-tips li{ font-size: 12px; line-height: 1.55; color: #1a1f36; }
.p31-pdet{ margin: 9px 0; border-radius: 14px; background: #fff; border: 1px solid rgba(150,150,230,.26); }
.p31-pdet summary{ padding: 10px 12px; font-size: 12px; font-weight: 700; color: #1a1f36; cursor: pointer; }
.p31-pdet ul{ margin: 0; padding: 0 12px 12px 28px; }
.p31-pdet li{ font-size: 12px; line-height: 1.6; color: #1a1f36; }
.p31-hbchk{   gap: 3px; font-size: 11px; font-weight: 700; 
      }
.p31-composer .p31-pill.danger{ color: #dc3545; background: rgba(239,68,68,.10); border-color: rgba(239,68,68,.28); }
.p31-ebtn.danger{ color: #fff; background: linear-gradient(96deg,#dc2626,#b91c1c); }

/* ---------- ⑤ 地图数据位（示意） ---------- */



.p31-route.is-loading{ display: flex; align-items: center; gap: 8px; font-size: 12px; color: #1a1f36; }
.p31-sk{ width: 46px; height: 8px; border-radius: 999px; background: linear-gradient(90deg,rgba(124,92,240,.10),rgba(124,92,240,.26),rgba(124,92,240,.10)); background-size: 200% 100%; animation: p31sk 1.2s linear infinite; }
@keyframes p31sk{ from{ background-position: 100% 0; } to{ background-position: -100% 0; } }
.p31-rhd{ display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 700; color: #1a1f36; flex-wrap: wrap; }
.p31-rmode{ display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: 999px;
  color: #6d5ce7; background: rgba(124,92,240,.10); border: 1px solid rgba(124,92,240,.24); }
.p31-rmode svg{ width: 13px; height: 13px; }

.p31-rmock{ font-size: 11px; font-weight: 700; color: #8a5a00; background: rgba(245,158,11,.14);
  border: 1px solid rgba(245,158,11,.3); border-radius: 999px; padding: 1px 6px;  }
.p31-rsteps{ margin: 8px 0 0; padding-left: 18px; }
.p31-rsteps li{  line-height: 1.6;  }

.p31-rfoot{ display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 9px;
  padding-top: 8px; border-top: 1px dashed rgba(150,150,230,.35); }
.p31-rfoot > span{ font-size: 11px; line-height: 1.4; color: #1a1f36; flex: 1 1 auto; }
.p31-rbtn{ flex: none; cursor: pointer; font-family: inherit; font-size: 11px; font-weight: 700; padding: 6px 11px;
  border-radius: 999px; color: #6d5ce7; background: #fff; border: 1px solid rgba(124,92,240,.34); }
.p31-rbtn:active{ transform: scale(.98); }

/* ---------- ⑥ 锁定页 / 删除二次确认 ---------- */
.p31-lkbd{  align-items: center; gap: 7px; flex-wrap: wrap; margin-bottom: 9px; padding: 10px 12px;
  border-radius: 14px; font-size: 12px; font-weight: 700; color: #1a1f36;
   border: 1px solid rgba(16,185,129,.28); }
.p31-lkbd span{ font-size: 11px; font-weight: 700; color: #1a1f36; }
.p31-lkre{ margin-left: auto; cursor: pointer; font-family: inherit; font-size: 11px; font-weight: 700;
  padding: 5px 10px; border-radius: 999px; color: #6d5ce7; background: #fff; border: 1px solid rgba(124,92,240,.3); }
.p31-delcf{ margin: 10px 0; padding: 12px; border-radius: 14px; background: rgba(239,68,68,.06); border: 1px solid rgba(239,68,68,.24); }
.p31-delcf p{ margin: 0 0 8px; font-size: 12px; line-height: 1.55; color: #5a6178; }

/* ---------- ⑦ 自行计划（manual 态）的分节卡片 ---------- */
.p31-mans{ margin: 10px 0 4px; padding: 12px; border-radius: 16px; background: #fff; border: 1px solid rgba(150,150,230,.26); }
.p31-mans-hd{ display: flex; align-items: center; gap: 7px; margin-bottom: 8px; font-size: 12px; font-weight: 700; color: #5a6178; }
.p31-mans-hd span{ font-size: 11px; font-weight: 600; color: #1a1f36; }
.p31-ms{ display: flex; align-items: center; gap: 9px; padding: 9px 0; border-top: 1px solid rgba(150,150,230,.18); }
.p31-msi{ flex: none; width: 30px; height: 30px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center;
  color: #6d5ce7; background: rgba(124,92,240,.10); }
.p31-mst{ flex: 1 1 auto; min-width: 0; }
.p31-mst b{ display: block; font-size: 12px; color: #1a1f36; }
.p31-mst span{ display: block; font-size: 11px; color: #1a1f36; }
.p31-msadd{ flex: none; cursor: pointer; font-family: inherit; font-size: 11px; font-weight: 700; padding: 6px 11px;
  border-radius: 999px; color: #6d5ce7; background: rgba(124,92,240,.08); border: 1px solid rgba(124,92,240,.26); }
.p31-msrow{ display: flex; flex-wrap: wrap; gap: 7px; margin-top: 10px; }
.p31-mbtn{ cursor: pointer; font-family: inherit; font-size: 12px; font-weight: 700; padding: 9px 12px; border-radius: 12px;
  color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.32); display: inline-flex; align-items: center; gap: 5px; }
.p2-manual .p31-manbar{  gap: 8px;  }
.p2-manual .p31-manbar .p31-mbtn{ flex: 1 1 0; justify-content: center; }

@media (prefers-reduced-motion: reduce){
  .p31-sk{ animation: none; }
  .p31-prbar i{ transition: none; }
}

/* ============================================================================
   v1.6.64 · AI 计划「UI 减负版」（取代此前所有界面文案与控件要求，冲突以本段为准）
   硬指标：卡片主标题 ≤6 字 / 副文案 ≤14 字一行 / 按钮 ≤4 字（动词）；参数一屏放完（两列）；
   除「出发地区」最后一层的搜索框外全流程零键盘；环节条 = 图标 + 时间 + 标题（≤10 字）+ 状态点，
   点开才展开详情与「确认」；动效只用 transform / opacity，prefers-reduced-motion 下降级。
   ============================================================================ */
/* ---------- 首屏的两个 AI 标贴（v1.6.64）----------
   .ai-tag（v1.6.52）是给「筹备中心格子」用的角标：绝对定位 + 渐变底 + 白字。
   搬进首屏卡片里它会被 .p31-cta-t b span 的灰字盖掉，还错位贴在标题旁边 —— 看着就是一块看不清字的紫块。
   这里只在首屏卡片内改成行内小标：白字压渐变，位置跟着标题走。 */
.p31-cta .p31-cta-t b .ai-tag{ position: static; top: auto; right: auto; display: inline-block; margin-left: 6px;
  vertical-align: 1px; padding: 1px 6px; font-size: 11px; letter-spacing: .3px; color: #fff;
  background: linear-gradient(120deg,#556fe8,#8a4fe0 48%,#2c96bd); }

/* ---------- 参数卡：两列网格，五个条件一屏放完 ----------
   v1.6.64 实测（375×812，可用高 541px）：初版排下来 743px —— 必须滚动才点得到「开始推算」，
   不合「参数一屏放完 / 单手拇指点完」。这里逐块把内边距与胶囊高度收紧到 497px 上下，仍是两列。 */

.p32-grid{ display: grid; grid-template-columns: 1fr 1fr; gap: 4px; }
.p32-box{ position: relative; display: block;   background: #fff;
   box-sizing: border-box; }
button.p32-box{ cursor: pointer; font-family: inherit; text-align: left; color: inherit; }
.p32-box.p32-span2{ grid-column: 1 / -1; }
.p32-lb{ display: block; margin-bottom: 3px; font-size: 11px; font-weight: 700; color: #1a1f36; }
.p32-region{ grid-column: 1 / -1; display: flex; align-items: center; gap: 8px; }
.p32-region .p32-lb{ margin: 0; flex: none; }
.p32-val{ flex: 1 1 auto; min-width: 0; font-size: 14px; font-weight: 700; color: #1a1f36;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p32-chev{ flex: none; display: inline-flex; color: #1a1f36; }

.p32-date{ width: 100%; box-sizing: border-box; padding: 4px 6px; border-radius: 9px; border: 1px solid rgba(150,150,230,.34);
  background: #fff; font-family: inherit; font-size: 12px; color: #1a1f36; font-variant-numeric: tabular-nums; }
.p32-hrs{  flex-wrap: wrap;   }
/* 胶囊必须 border-box：默认 content-box 时 min-width 只管内容盒，加上左右内边距与描边会宽出 10px，
   一行只塞得下 4 枚 → 9 枚变 3 行（v1.6.64 实测 149px 高）。改 border-box 后 5 枚/行、2 行装完。 */
.p32-hr{      cursor: pointer; font-family: inherit;
   font-weight: 700; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34);
  font-variant-numeric: tabular-nums; }
.p32-hr.on{ color: #5b4bd6; font-weight: 700; background: rgba(124,92,240,.12); border-color: rgba(124,92,240,.55); }


.p32-mode{ position: relative; display: flex; flex-direction: column; align-items: center;  
  border-radius: 12px; cursor: pointer; font-family: inherit; color: #1a1f36; background: #fff;
  border: 1px solid rgba(150,150,230,.28); }

.p32-mode b{   line-height: 1.2; }
.p32-mode.on{ color: #5b4bd6; background: rgba(124,92,240,.08); border-color: rgba(124,92,240,.6);
  box-shadow: inset 0 0 0 1px rgba(124,92,240,.32); }
.p32-mode em{ position: absolute; top: 4px; right: 4px; display: inline-flex; color: #6d5ce7; }
/* 人数与档位并到一行（两列）—— 省下的一整行正是「一屏放完」缺的那 80px */
.p32-nums{ display: flex; flex-wrap: wrap;  }
.p32-num{   border-radius: 11px; cursor: pointer; font-family: inherit; font-size: 12px;
  font-weight: 700; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.28);
  font-variant-numeric: tabular-nums; }
.p32-num.on{ color: #5b4bd6; background: rgba(124,92,240,.12); border-color: rgba(124,92,240,.6); }
.p32-tiers{ display: grid; grid-template-columns: repeat(3, 1fr);  }
.p32-tier{ position: relative; display: flex; flex-direction: column;  gap: 1px; 
  border-radius: 12px; cursor: pointer; font-family: inherit; color: #1a1f36; background: #fff;
  border: 1px solid rgba(150,150,230,.28); }

.p32-tier b{ display: inline-flex; align-items: center; gap: 1px;  }
.p32-tier span{  color: #1a1f36; }
.p32-tier.on{ color: #5b4bd6; background: rgba(124,92,240,.08); border-color: rgba(124,92,240,.6); }
.p32-tier.on span{ color: #6d5ce7; }
/* 选中态的勾（v1.6.64）：勾改到标题后面行内显示 —— 卡只有 50px 宽，绝对定位的角标会压在字上。
   人数胶囊同理（1–6+ 也是「点中就选中」的一组）。 */
.p32-ok{ display: inline-flex; align-items: center; margin-left: 2px; vertical-align: -2px; color: #6d5ce7; }
.p32-ok svg{ width: 12px; height: 12px; }
.p32-tier.on em{ position: static; }

/* ---------- 生成中：图标 + ≤4 字标签 + 细进度条 ---------- */
.p32-steps{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; margin-top: 10px; }
.p32-st{ display: flex; align-items: center; gap: 5px; padding: 7px 8px; border-radius: 11px;
  background: rgba(255,255,255,.72); border: 1px solid rgba(150,150,230,.24); color: #1a1f36;
  font-size: 11px; font-weight: 700; }
.p32-st i{ display: inline-flex; }
.p32-st b{ font-weight: inherit; }
.p32-st.on{ color: #5b4bd6; background: rgba(124,92,240,.10); border-color: rgba(124,92,240,.55); }
.p32-st.done{ color: #1f9d63; background: rgba(34,197,94,.08); border-color: rgba(34,197,94,.35); }

/* ---------- 地区选择面板（常用 / 省·市 / 区县 + 最后一层搜索） ---------- */
.p32-regh{ margin: 10px 2px 7px; font-size: 11px; font-weight: 700; color: #1a1f36; }
.p32-rgrid{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; }
.p32-rcell{ min-height: 40px; padding: 6px 4px; border-radius: 12px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.3); }
.p32-rcell.is-other{ display: inline-flex; align-items: center; justify-content: center; gap: 4px;
  color: #6d5ce7; border-style: dashed; }
.p32-regbar{ display: flex; align-items: center; gap: 8px; margin: 8px 0; }
.p32-back{ height: 28px; padding: 0 10px; border-radius: 999px; cursor: pointer; font-family: inherit;
  font-size: 11px; font-weight: 700; color: #6d5ce7; background: rgba(124,92,240,.08); border: 1px solid rgba(124,92,240,.3); }
.p32-regprov{ font-size: 12px; color: #1a1f36; }
.p32-regsearch{ display: flex; gap: 7px; margin-top: 9px; }
.p32-regsearch .p31-pin{ flex: 1 1 auto; }
/* v1.6.64 实测：34 个省级按钮把面板撑到 88% 上限，最后一行（新疆 / 港澳台）被裁在屏幕外，
   而且面板不能滚 —— 等于点不到。这里让列表自己滚，并把面板底部让开悬浮导航坞（84px）。 */
.p31-sheet[data-sheet="region"] .p31-panel{ padding-bottom: calc(84px + env(safe-area-inset-bottom)); }
.p31-sheet[data-sheet="region"] .p32-rgrid{
  flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch; touch-action: pan-y; padding: 1px 1px 2px;
}
.p31-sheet[data-sheet="region"] .p32-regsearch{ flex: none; }

/* ---------- 结果页：三节点进度 / 三行提示 / 收起态环节条 ---------- */
.p31-prchk{ margin-top: 8px; text-align: right; }
.p31-tips p{ margin: 0; }
.p32-t1{ font-size: 14px; font-weight: 700; color: #1a1f36; }
.p32-t2{ margin-top: 2px !important; font-size: 12px; color: #6d5ce7; }
.p32-t3{  font-size: 12px;  }
.p31-hbmain{    min-width: 0; }
.p32-hbi{ flex: none;    display: inline-flex; align-items: center;
  justify-content: center; color: #6d5ce7; background: rgba(124,92,240,.10); }
.p31-hbmain .tm{ flex: none;  font-weight: 700;  }
.p31-hbmain .t{ flex: 1 1 auto; min-width: 0; margin: 0;   
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }




/* 展开后的详情里，先把「环节标签 + 时长」这两枚摊出来（收起态不占位） */
.p31-emeta{ display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 7px; }
.p32-det{ margin-top: 5px; }
.p32-det.is-ro b{ font-size: 14px; color: #1a1f36; }
.p32-det.is-ro p{ margin: 2px 0 0; font-size: 12px; line-height: 1.6;  }
.p32-durl{ display: inline-block; margin-top: 5px; font-size: 11px; color: #1a1f36; }

/* ---------- 依据 / 提示都收进点开的详情里（首屏最多一处说明） ---------- */
.p31-basis2{ margin: 8px 0; padding: 8px 10px; border-radius: 12px; background: rgba(255,255,255,.72);
  border: 1px solid rgba(150,150,230,.26); }
.p31-basis2 summary{ display: flex; align-items: center; gap: 5px; cursor: pointer; list-style: none;
  font-size: 12px; font-weight: 700;  }
.p31-basis2 summary::-webkit-details-marker{ display: none; }
.p31-basis2 p{ margin: 7px 0 0; font-size: 12px; line-height: 1.55;  }
.p31-hl summary{ display: flex; align-items: center; gap: 6px; cursor: pointer; list-style: none;
  font-size: 12px; font-weight: 700; color: #6d5ce7; }
.p31-hl summary::-webkit-details-marker{ display: none; }
/* ---------- 暗色（深色卡上白字对比度 ≥4.5:1） ---------- */
[data-theme="dark"] .p32-box,
[data-theme="dark"] .p32-mode,
[data-theme="dark"] .p32-num,
[data-theme="dark"] .p32-tier,
[data-theme="dark"] .p32-hr,
[data-theme="dark"] .p32-rcell,
[data-theme="dark"] .p32-date{ background: rgba(28,32,52,.92); border-color: rgba(150,150,230,.3); color: #eef1ff; }
[data-theme="dark"] .p32-lb,
[data-theme="dark"] .p32-tier span{ color: #a8b0c8; }
[data-theme="dark"] .p32-val,
[data-theme="dark"] .p32-regprov{ color: #eef1ff; }
[data-theme="dark"] .p32-mode.on,
[data-theme="dark"] .p32-num.on,
[data-theme="dark"] .p32-tier.on,
[data-theme="dark"] .p32-hr.on{ color: #c4b2ff; background: rgba(124,92,240,.18); border-color: rgba(160,140,255,.6); }
[data-theme="dark"] .p32-st{ background: rgba(28,32,52,.8); border-color: rgba(150,150,230,.26); color: #a8b0c8; }
[data-theme="dark"] .p32-st.on{ color: #c4b2ff; background: rgba(124,92,240,.2); }
[data-theme="dark"] .p32-st.done{ color: #5fd39b; background: rgba(34,197,94,.14); }
[data-theme="dark"] .p31-basis2{ background: rgba(28,32,52,.82); border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p31-basis2 summary,
[data-theme="dark"] .p31-basis2 p{ color: #eef1ff; }
[data-theme="dark"] .p31-hbmain .t,
[data-theme="dark"] .p31-hbmain .tm{ color: #eef1ff; }
[data-theme="dark"] .p32-t1{ color: #eef1ff; }
[data-theme="dark"] .p32-t3{ color: #a8b0c8; }

@media (prefers-reduced-motion: reduce){
  .p32-hr, .p32-num, .p32-mode, .p32-tier, .p32-rcell{ transition: none; }
}

/* 小屏（iPhone SE 375×667 一类）再收紧一档：可用高度只有 437px，仍要一屏放完 */
@media (max-height: 700px){
  .p31-params{ padding: 4px 8px 6px; }
  .p32-grid{ gap: 3px; }
  
  
  
  
  
}

/* ============================================================================
   v1.6.65 · 时间放开 00–23 + 跨天「次日」+ 锁定页长图成品版式 + 交通卡竖排热修
   ============================================================================ */

/* ① 交通卡竖排热修（P0）：.p31-hb 是「22px 轨 + 内容列」两列网格，交通条的「地图数据位」
   是网格里最后一个子元素，会被自动排进那条 22px 窄列 → 文字逐字竖排。
   与 .p31-edit 同一做法：明确占满整行，再加 min-width:0 防溢出。 */
.p31-route-slot{ grid-column: 1 / -1; min-width: 0; }

/* ② 起止时间两行各占整行：小时全量 24 枚（12 列 × 2 行），结束那行多一排「次日 00–04」快捷 */

.p32-tbox{ padding: 6px; }
.p32-trow{ display: flex; align-items: center; gap: 7px; }
.p32-trow .p32-lb{ margin: 0; flex: none; }
.p32-trow .p32-date{ flex: 1 1 auto; width: auto; min-width: 0; }
.p32-ndtag{ flex: none; font-style: normal; font-size: 11px; font-weight: 700; color: #8a5a00;
  background: rgba(245,158,11,.18); border-radius: 999px; padding: 1px 6px; }
.p32-hrs{ display: grid; grid-template-columns: repeat(12, 1fr); gap: 2px;  }
.p32-hr{ min-width: 0;  padding: 0; border-radius: 8px; font-size: 11px; }
.p32-ndrow{  grid-template-columns: repeat(5, 1fr);   }
.p32-nd{  border-style: dashed;   }
.p32-nd.on{ border-style: solid; }

/* ③ 锁定页 = 长图成品版式：页面里直接放那张长图（canvas 按屏宽缩放，可上下滑） */
.p31-poster{ margin: 6px 0 2px; }
.p31-poster-ph{ display: flex; align-items: center; gap: 8px; padding: 18px 12px; border-radius: 14px;
  font-size: 12px; color: #2b2f4a; background: #fff; border: 1px solid rgba(150,150,230,.26); }
/* v1.6.90（老板图 1）：`.p31-poster-cv` 那条「页面里铺大画布」的样式随画布上屏一起下线 —— 
   成品页现在只有 DOM 版长图（见 app.js · planAiPosterPaint 的根因说明），画布只喂保存 / 分享。 */
.p31-bar .p31-pill{ padding-left: 11px; padding-right: 11px; font-size: 12px; gap: 5px; }

/* ⑤ 参数卡页脚收成一行：错误 / 建议 / 配额并排 —— 出错时也不多占一行高（一屏放完是硬指标） */
.p31-pfoot{ display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 6px 10px;  }
.p31-pfoot .p31-perr{ display: inline-flex; align-items: center; gap: 5px; margin: 0; padding: 3px 9px; border-radius: 999px; font-size: 11px; }
.p31-pfoot .p31-perr svg{ width: 13px; height: 13px; }
.p31-pfoot .p31-phint, .p31-pfoot .p31-pquota{ margin: 0; }

/* ④ canvas 画不出的老环境 → 同版式 DOM 海报降级（绝不退回手册卡片样式） */
.p35-poster{ padding: 16px 14px 18px; border-radius: 14px;
  background: linear-gradient(180deg, #f7f6ff, #f1f2fb); border: 1px solid rgba(150,150,230,.3); }
.p35-brand{ text-align: center; font-size: 11px; font-weight: 700;  }
.p35-poster h4{ margin: 10px 0 6px; text-align: center; font-size: 17px; font-weight: 800; color: #232849; }
.p35-sub{ margin: 0 0 4px; text-align: center; font-size: 12px; line-height: 1.5; color: #1a1f36; }
.p35-hint{ margin: 0 0 10px; text-align: center; font-size: 12px;  }
.p35-day{ display: flex; justify-content: space-between;  font-size: 12px; font-weight: 700; color: #1a1f36; }
.p35-day span{ font-weight: 700; color: #1a1f36; }
.p35-it{ display: grid; grid-template-columns: 24px 1fr; gap: 8px;  
     }
.p35-it > b{ width: 24px; height: 24px; border-radius: 50%; color: #fff; font-size: 11px; font-weight: 700;
  display: flex; align-items: center; justify-content: center; }
.p35-bd{ min-width: 0; }
.p35-r1{ display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.p35-r1 i{ font-style: normal; font-size: 12px; font-weight: 700; color: #5b4bd6; }
.p35-r1 em{ font-style: normal; font-size: 11px; font-weight: 700; color: #6d5ce7;
  background: rgba(124,92,240,.14); border-radius: 999px; padding: 1px 7px; }
.p35-bd strong{ display: block;   color: #1a1f36; }
.p35-bd u{ display: block;      }
.p35-foot{ margin-top: 12px;  font-size: 11px;  }

[data-theme="dark"] .p31-poster-ph{ background: rgba(28,32,52,.92); border-color: rgba(150,150,230,.3); color: #a8aecd; }
[data-theme="dark"] .p35-poster{ background: linear-gradient(180deg, #232840, #1c2036); border-color: rgba(150,150,230,.3); }
[data-theme="dark"] .p35-poster h4, [data-theme="dark"] .p35-bd strong, [data-theme="dark"] .p35-day{ color: #e8eaff; }
[data-theme="dark"] .p35-sub, [data-theme="dark"] .p35-bd u, [data-theme="dark"] .p35-r1 i{ color: #eef1ff; }

[data-theme="dark"] .p32-ndtag{ color: #f5b94e; }

/* 小屏（iPhone SE 一类）再收一档：小时全量 24 枚 + 次日排会顶出一屏，这里逐项压紧
   （3 列 × 2 行的交通卡保持老板拍板的版式，只收图标与内边距） */
@media (max-height: 700px){
  .p32-box{ padding: 5px; }
  .p32-hr{ height: 18px; font-size: 11px; border-radius: 6px; }
  .p32-hrs{ gap: 2px; margin-top: 3px; }
  .p32-nd{ height: 18px; font-size: 11px; }
  .p32-ndrow{ margin-top: 2px; }
  .p32-trow{ gap: 5px; }
  .p32-trow .p32-date{ padding: 2px 5px; font-size: 11px; }
  /* 小屏把 6 张交通卡收成一排：仍然是「图标 + 2–3 字」的卡，只把两行并作一行 */
  .p32-modes{  gap: 4px; }
  .p32-mode{ padding: 1px; }
  .p32-mode i svg{ width: 13px; height: 13px; }
  .p32-mode b{ font-size: 11px; }
  .p32-num{ height: 22px; font-size: 12px; }
  .p32-tier{ padding: 2px 1px; }
  .p32-tier span{ font-size: 11px; }
  .p31-pgo{ padding: 6px 14px; }
  .p31-pfoot{ margin-top: 4px; gap: 4px 8px; }
  .p31-pquota{ margin-top: 4px; font-size: 11px; }
}

/* ============================================================================
   v1.6.66 · AI 计划增强版「场次卡统一升级 + 时间左右分栏 + 交通三栏 + 拟真路线 +
   结果页减密 + 全局配色」
   冲突以本段为准（放在文件最后，同特异性后来者覆盖）。
   硬规矩：375 / 414 不错位；正文 ≥ 13px；深色卡上的白字对比度 ≥ 4.5:1；
   动效只用 transform / opacity，prefers-reduced-motion 下降级。
   ============================================================================ */

/* ---------- 一、hero 场次卡（四个位置同一张：首屏 / 参数页 / 结果页 / 锁定页）----------
   深紫流光渐变底 + 白字 + 外层光晕；日期徽标放大；开演时间是高亮胶囊；
   整卡比 v1.6.65 那版高约 1.25 倍（min-height 兜底），点它切换场次（只读态不带箭头）。 */
.p31-gig.p31-hero{
   display: block; width: 100%; min-height: 132px; 
  padding: 15px 15px 14px; margin: 2px 0 12px; border-radius: 22px; overflow: hidden; text-align: left;
  font-family: inherit;  color: #fff;
  background:
    radial-gradient(120% 150% at 6% -20%, rgba(148,138,255,.30), transparent 58%),
    radial-gradient(95% 120% at 102% 4%, rgba(96,200,255,.18), transparent 56%),
    linear-gradient(118deg, #5a52dc 0%, #7056e2 46%, #2a7ca8 100%);
  border: 1px solid rgba(165,152,255,.36);
  
}
/* 细网格 + 边缘高光：AI 科技感靠背景层次，不靠加文字 */
.p31-gig.p31-hero::before{
  content: ''; position: absolute; inset: 0; pointer-events: none; opacity: .5;
  background-image:
    linear-gradient(rgba(255,255,255,.06) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.06) 1px, transparent 1px);
  background-size: 26px 26px, 26px 26px;
  mask-image: radial-gradient(120% 120% at 12% 0%, #000 30%, transparent 78%);
  -webkit-mask-image: radial-gradient(120% 120% at 12% 0%, #000 30%, transparent 78%);
}
.p31-gig.p31-hero::after{
  content: ''; position: absolute; left: 0; right: 0; top: 0; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.55), transparent);
}
.p31-gig.p31-hero:active{ transform: scale(.995); }
.p31-gig.p31-hero.is-ro{ cursor: default; }
.p31-hero .p31-hdate{
  flex: none; width: 60px; padding: 9px 0 8px; border-radius: 16px; 
  
  border: 1px solid rgba(255,255,255,.26); 
}
.p31-hero .p31-hdate b{ display: block; font-size: 18px; font-weight: 700; line-height: 1.12; color: #fff; letter-spacing: .4px; }
.p31-hero .p31-hdate i{ display: block; margin-top: 2px; font-style: normal; font-size: 11px; font-weight: 700;  }
.p31-hero .p31-hrow{ display: grid; grid-template-columns: 60px minmax(0, 1fr) auto; gap: 12px; align-items: center; }
.p31-hero .p31-hmain{ min-width: 0; }
.p31-hero .p31-hname{
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  font-size: 16px; font-weight: 700; line-height: 1.34; color: #fff; letter-spacing: .2px;
}
.p31-hero .p31-hline{ display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-top: 6px; font-size: 12px; line-height: 1.3; color: #ffffff; }
.p31-hero .p31-hday{ font-weight: 700; }
.p31-hero .p31-htime{
  font-style: normal; font-weight: 700; padding: 2px 9px; border-radius: 999px; 
  
   
}
.p31-hero .p31-htime.is-todo{   border-color: rgba(255,255,255,.42); }
.p31-hero .p31-hfoot{ display: flex; align-items: center; justify-content: space-between; gap: 8px;
  margin-top: 9px; padding-top: 8px; border-top: 1px dashed rgba(255,255,255,.20); }
.p31-hero .p31-hvenue{ display: block; margin-top: 5px; min-width: 0; font-size: 12px; line-height: 1.35;
     white-space: nowrap; }

.p31-hero .p31-hleft{
  display: flex; flex-direction: row; align-items: baseline; gap: 4px; padding: 5px 9px; border-radius: 999px;
   border: 1px solid rgba(255,255,255,.26);
}
.p31-hero .p31-hleft i{ font-style: normal; font-size: 11px; line-height: 1.2; color: #ffffff; white-space: nowrap; }
.p31-hero .p31-hleft b{ font-size: 12px; line-height: 1.2; font-weight: 700; color: #fff; white-space: nowrap; }
.p31-hero .p31-hgo{ display: inline-flex; color: #ffffff; }


/* ---------- 二、时间左右分栏（左「开始」右「结束」，两栏等高）----------
   每栏 = 原生日历 + 常用小时（00/06/08/10/12/14/16/18/20/22/23）+「更多」；
   点「更多」只把这一栏展开成全量 00–23；结束栏常驻一排「次日 00–04」。
   默认态整块高度 ≈ 原来的一半（原来两排 24 枚各占整行）。 */
.p32-tcol{ padding: 9px 8px 10px; }
.p32-tcol .p32-trow{ display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
.p32-tcol .p32-date{ width: 100%; }
.p32-tcol .p32-hrs{ display: flex; flex-wrap: wrap; gap: 4px; margin-top: 5px; }
.p32-tcol .p32-hr{ min-width: 26px; height: 23px; padding: 0 2px; font-size: 11px; }
.p32-hr.p32-more{ min-width: 36px; color: #6d5ce7; border-style: dashed; font-weight: 700; }
.p32-hr.p32-more.is-open{ color: #fff; background: linear-gradient(118deg, #556fe8, #7c5cf0); border-style: solid; border-color: transparent; }
.p32-ndrow{ display: grid; grid-template-columns: auto repeat(5, minmax(0, 1fr)); align-items: center; gap: 3px;
   padding-top: 5px; border-top: 1px dashed rgba(150,150,230,.32); }
.p32-ndlb{ flex: none; font-size: 11px; font-weight: 700; color: #1a1f36; }
.p32-nd{ min-width: 0; width: 100%; height: 22px; padding: 0; font-size: 11px; color: #1a1f36; background: rgba(8,145,178,.08); border-color: rgba(8,145,178,.30); }
.p32-nd.on{ color: #fff; background: linear-gradient(118deg, #0e7490, #0891b2); border-color: transparent; }
[data-theme="dark"] .p32-tcol{ background: linear-gradient(160deg, rgba(28,32,52,.94), rgba(24,26,44,.92)); border-color: rgba(150,150,230,.26); }
[data-theme="dark"] .p32-tcol .p32-date{ background: rgba(24,26,44,.96); color: #eef1ff; border-color: rgba(150,150,230,.3); }
[data-theme="dark"] .p32-hr{ color: #eef1ff; background: rgba(28,32,52,.9); border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p32-hr.on{ color: #c4b2ff; background: rgba(124,92,240,.22); border-color: rgba(150,140,255,.6); }
[data-theme="dark"] .p32-ndrow{ border-top-color: rgba(150,150,230,.24); }
[data-theme="dark"] .p32-ndlb{ color: #5fd39b; }
[data-theme="dark"] .p32-nd{ color: #5fd39b; background: rgba(8,145,178,.16); border-color: rgba(103,232,249,.3); }
[data-theme="dark"] .p32-nd.on{ color: #a8b0c8; background: linear-gradient(118deg, #67e8f9, #22d3ee); }

/* ---------- 三、交通方式一行三张（公共交通 / 自驾 / 还没定；图标 + 3–4 字，无副文案）---------- */
.p32-modes{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.p32-mode{ padding: 6px 4px 7px; gap: 3px; }
.p32-mode i svg{ width: 19px; height: 19px; }
.p32-mode b{ font-size: 12px; font-weight: 700; white-space: nowrap; }

/* ---------- 四、结果页减密：编号 + 时间 + 标题 + 一枚类型标 + 核对点（做法默认收起）----------
   卡片间距 / 行高加大，标题加粗放大；类型标 / 图标底 / 卡片描边按第七节的固定色系复用。 */

.p31-hb{  border-left: 3px solid var(--tp, rgba(150,150,230,.4)); }
.p31-hbmain{ display: flex; align-items: center; gap: 8px; padding: 1px 0; }
.p31-hb .no{ padding-top: 0; font-size: 12px; }
.p32-hbi{ width: 30px; height: 30px; border-radius: 10px; color: var(--tpi, #5b53c8); background: var(--tpb, rgba(124,92,240,.10)); }
.p32-hbi svg{ width: 17px; height: 17px; }
.p31-hbmain .tm{ font-size: 12px; }
.p31-hbmain .t{  font-weight: 700;  }
.p31-htag{
  flex: none; padding: 1px 7px; border-radius: 999px; font-style: normal; font-size: 11px; font-weight: 700;
  color: var(--tpi, #5b53c8); background: var(--tpb, rgba(124,92,240,.10)); border: 1px solid var(--tp, rgba(124,92,240,.35));
}

[data-theme="dark"] .p31-hb{ border-left-color: var(--tp, rgba(150,150,230,.4)); }
[data-theme="dark"] .p31-htag{ color: var(--tpd, #cfc6ff); background: rgba(255,255,255,.06); }
[data-theme="dark"] .p32-hbi{ color: var(--tpd, #cfc6ff); background: rgba(255,255,255,.08); }

/* ---------- 五、地图数据位（拟真示意）：方向标 + 出发→到达 + 步骤 + 区间 + 来源标 + 打开高德 ---------- */

.p31-rdir{
  flex: none; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 700;
  color: #1a1f36; background: rgba(13,148,136,.14); border: 1px solid rgba(13,148,136,.34);
}
.p31-rpath{ display: block; margin-top: 6px; font-size: 12px; font-weight: 700; color: #1a1f36; }
.p31-rnums{ margin-top: 8px; font-size: 12px; font-weight: 700; color: #1a1f36; }
.p31-route.is-same{     background: rgba(13,148,136,.06); }
.p31-rsame{ flex: 1 1 auto; min-width: 0; font-size: 12px; font-weight: 700; color: #1a1f36; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p31-rsteps li{ font-size: 12px; color: #1a1f36; }
[data-theme="dark"] .p31-route{ background: rgba(13,148,136,.10); border-color: rgba(94,234,212,.26); }
[data-theme="dark"] .p31-rpath, [data-theme="dark"] .p31-rnums, [data-theme="dark"] .p31-rsteps li{ color: #eef1ff; }
[data-theme="dark"] .p31-rdir{ color: #5fd39b; background: rgba(13,148,136,.22); border-color: rgba(94,234,212,.34); }
[data-theme="dark"] .p31-rowsame, [data-theme="dark"] .p31-rsame{ color: #eef1ff; }

/* ---------- 六、锁定页长图（DOM 降级版）：文字全深色高对比，取消灰字 ---------- */
.p35-brand{ color: #5b4bd6; }
.p35-sub, .p35-day span{ color: #1a1f36; }
.p35-hint{ color: #5b4bd6; }
.p35-bd u{ color: #1a1f36; }
.p35-foot{
  text-align: center; color: #1a1f36; }
.p31-lkbd{ background: rgba(16,185,129,.10); }

/* ---------- 七、小屏（iPhone SE 一类）：三栏交通卡不许被压成六格 ---------- */
@media (max-height: 700px){
  .p32-modes{ grid-template-columns: repeat(3, 1fr); }
  .p32-tcol{ padding: 7px 6px 8px; }
  .p32-tcol .p32-hr{ min-width: 27px; height: 22px; font-size: 11px; }
  .p32-hr.p32-more{ min-width: 36px; }
  .p31-gig.p31-hero{ min-height: 112px; padding: 14px 13px 15px; }
}
@media (prefers-reduced-motion: reduce){
  .p32-hr, .p32-more, .p31-gig.p31-hero{ transition: none; }
}

/* ============================================================================
   v1.6.67 · AI 计划体验优化（① 场次卡配色回调 ③ 入口卡加大 ④ 结果页减密 + 勾选
   ⑤ 路线卡去底栏 ⑦ 档位/人数不裁切）。只覆盖这一页相关的类，不动别的页面。
   ============================================================================ */

/* ---------- ① hero 场次卡：与「开始推算 / 确认计划」同一族的紫蓝渐变（亮一档，不是近黑深紫） ----------
   白字对比度按 WCAG 复算：渐变最亮处（#7056e2 + 极光斑）白字仍 ≥4.5:1；
   日期徽标 / 距开演胶囊改「深色玻璃底」，白色文字在更亮的卡面上依旧清晰。 */
.p31-gig.p31-hero{
  position: relative;
  box-sizing: border-box;
  cursor: pointer;
  border-color: rgba(186,178,255,.42);
  box-shadow: 0 18px 40px rgba(46,34,120,.30), 0 0 0 1px rgba(255,255,255,.05) inset,
    inset 0 1px 0 rgba(255,255,255,.22);
}

.p31-hero .p31-hleft{ background: rgba(20,16,60,.30); border-color: rgba(255,255,255,.32); }
.p31-hero .p31-hvenue{
  overflow: hidden;
  text-overflow: ellipsis; color: #ffffff; }
.p31-hero .p31-hdate i{ color: #ffffff; }
[data-theme="dark"] .p31-gig.p31-hero{
  border-color: rgba(196,188,255,.44);
  box-shadow: 0 18px 40px rgba(0,0,0,.42), inset 0 1px 0 rgba(255,255,255,.20);
}

/* ---------- ③ 四个 AI 入口卡（v1.6.87 起统一为「四张一套」；旧的 is-mid / is-mini 三种形态已删，
   统一规则在文件末尾的 v1.6.87 区块里，见 .p31-cta.is-sub）---------- */

/* ---------- ④ 结果页减密：取消灰字（正文用深色墨水色，层级靠字号 / 字重）；间距与标题加大 ---------- */
.p31-prchk{ color: #1a1f36; }


.p32-t3{
  margin-top: 4px !important; color: #1a1f36; }
.p31-day b{ color: #1a1f36; }
.p31-day span{ color: #1a1f36; }
.p31-basis2 summary{ color: #1a1f36; }
.p31-basis2 p{ color: #1a1f36; }

.p31-hb{ padding: 15px 14px 16px 12px; }
.p31-hb .no{
  align-self: start; color: #1a1f36; }
.p31-hbmain .tm{ color: #1a1f36; }
.p31-hbmain .t{
  line-height: 1.35; font-size: 16px; letter-spacing: .1px; color: #1a1f36; }
.p32-det.is-ro p{ color: #1a1f36; }

/* 勾选圆钮（每条右上角）：点一下 = 绿实心勾，再点 = 取消；热区靠伪元素补到 ~40px */
.p31-hbchk{
  position: relative; flex: none; width: 22px; height: 22px; padding: 0; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center; color: #fff; cursor: pointer;
  background: #fff; border: 1.5px solid rgba(124,92,240,.34);
  transition: transform .14s cubic-bezier(.22,.8,.3,1), background .14s, border-color .14s;
}
.p31-hbchk::after{ content: ''; position: absolute; inset: -9px; border-radius: 50%; }
.p31-hbchk:active{ transform: scale(.92); }
.p31-hbchk.on{ background: #22c55e; border-color: #16a34a; box-shadow: 0 3px 9px rgba(34,197,94,.30); }
.p31-hbchk.is-todo{ border-color: rgba(245,158,11,.62); }
.p31-hbchk svg{ display: block; }
[data-theme="dark"] .p31-hbchk{ background: rgba(28,32,52,.9); border-color: rgba(150,140,255,.42); }
[data-theme="dark"] .p31-hbchk.on{ background: #22c55e; border-color: #4ade80; }

/* 列表上方一行：已核对 x / y + 全部核对 */
.p31-bookbar{ display: flex; align-items: center; gap: 8px; margin: 8px 2px 2px; }
.p31-bookbar span{ flex: 1 1 auto; font-size: 11px; font-weight: 700; color: #1a1f36; }
.p31-checkall{
  flex: none; display: inline-flex; align-items: center; gap: 5px; height: 30px; padding: 0 12px;
  border-radius: 999px; cursor: pointer; font-family: inherit; font-size: 12px; font-weight: 700;
  color: #1a1f36; background: rgba(34,197,94,.12); border: 1px solid rgba(34,197,94,.34);
}
.p31-checkall:active{ transform: scale(.97); }
.p31-checkall svg{ width: 13px; height: 13px; }
[data-theme="dark"] .p31-bookbar span{ color: #eef1ff; }
[data-theme="dark"] .p31-checkall{ color: #5fd39b; background: rgba(34,197,94,.16); border-color: rgba(74,222,128,.36); }

/* ---------- ⑤ 路线卡：去掉专属底栏（脚注 + 打开高德），按普通环节同一形态；「示意」留在右上 ---------- */

.p31-rmock{ margin-left: auto; }

/* ---------- ⑤ 删除确认条（长在固定操作条里，永远可见） ---------- */
.p31-composer .p31-cf.is-del{ border-color: rgba(239,68,68,.34); background: rgba(255,246,246,.98); }
.p31-composer .p31-cf.is-del span{ color: #5a6178; font-weight: 700; }
.p31-cf-yes.is-danger{ background: linear-gradient(96deg,#dc2626,#b91c1c); }
[data-theme="dark"] .p31-composer .p31-cf.is-del{ background: rgba(60,20,26,.94); border-color: rgba(248,113,113,.4); }
[data-theme="dark"] .p31-composer .p31-cf.is-del span{ color: #ff9d9d; }

/* ---------- ⑦ 档位三张卡等宽填满、文字不裁不溢；人数六宫格同口径 ---------- */
.p31-params{ padding: 6px 10px 4px; }   /* 底栏收掉后仍守住「参数一屏放完」 */
.p31-pfoot{ margin-top: 4px; }

.p32-tier{  min-width: 0; }
.p32-tier b{ font-size: 12px; white-space: nowrap; }
.p32-tier b em{ display: inline-flex; }
.p32-tier b em svg{ width: 11px; height: 11px; }
.p32-tier span{ font-size: 11px; white-space: nowrap; }


.p32-num .p32-ok svg{ width: 11px; height: 11px; }

@media (prefers-reduced-motion: reduce){
  .p31-hbchk, .p31-checkall{ transition: none; }
}

/* 长图老环境 DOM 降级版：与 canvas 同口径 —— 标题放大一级、正文收小一级、更疏朗 */

.p35-bd strong{ font-size: 16px; }
.p35-bd u{ font-size: 12px;  }
.p35-day{ margin: 12px 2px 7px; }

/* ============================================================================
   v1.6.68 · AI 计划精修（按老板 12 条 · 图序对齐）。只覆盖这一页相关的类，不动别的页面。
   ============================================================================ */

/* ---------- 1 / 4 / 5 · 头部封面区：标题两行不孤字、日期徽标玻璃拟态、AI 标贴浅色霓虹 ---------- */
.p31-hname{ display: block; }
.p31-hname i{ display: block; font-style: normal; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.p31-hero .p31-hdate{
  text-align: center;
  background: linear-gradient(160deg, rgba(255,255,255,.36), rgba(255,255,255,.10));
  border-color: rgba(255,255,255,.58);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.72), 0 7px 18px rgba(18,12,52,.30);
  -webkit-backdrop-filter: blur(7px); backdrop-filter: blur(7px);
}
/* 开演时间胶囊：浅底 + 描边 + 淡渐变 + 缓慢流光（低强度；reduced-motion 下停） */
.p31-hero .p31-htime{
  position: relative; overflow: hidden; color: #5b4bd6;
  background: linear-gradient(118deg, rgba(255,255,255,.96), rgba(240,240,255,.96) 46%, rgba(228,246,255,.96));
  border: 1px solid rgba(255,255,255,.92);
  box-shadow: 0 3px 12px rgba(24,18,66,.22), inset 0 1px 0 rgba(255,255,255,.9);
}
.p31-hero .p31-htime::after{
  content: ''; position: absolute; top: 0; bottom: 0; left: -42%; width: 38%;
  background: linear-gradient(100deg, transparent, rgba(255,255,255,.85), transparent);
  opacity: 0; animation: p31HtimeShine 4.2s ease-in-out infinite;
}
.p31-hero .p31-htime.is-todo{ color: #fff; border-style: dashed; background: rgba(255,255,255,.16); box-shadow: none; }
.p31-hero .p31-htime.is-todo::after{ display: none; }
@keyframes p31HtimeShine{
  0%, 58%{ transform: translateX(0); opacity: 0; }
  70%{ opacity: .85; }
  100%{ transform: translateX(360%); opacity: 0; }
}
/* AI 标贴（推荐 / 导入两处完全一致）：浅色霓虹渐变小胶囊 + 微光，渐变卡与白卡上都清晰 */
.p31-cta .ai-tag{
  vertical-align: 1px;
  position: static; margin-left: 6px; padding: 2px 8px; border-radius: 999px;
  font-size: 11px; font-weight: 700; letter-spacing: .4px; line-height: 1.5;
  color: #5b4bd6; background: linear-gradient(120deg, rgba(255,255,255,.95), rgba(240,236,255,.96) 46%, rgba(226,246,255,.96));
  border: 1px solid rgba(124,92,240,.38);
  box-shadow: 0 0 10px rgba(124,92,240,.30), inset 0 1px 0 rgba(255,255,255,.95);
  animation: none;
}

/* ---------- 1 / 9 · 结果页 / 锁定页：头部下方内嵌六节点进度条 ---------- */
.plan31-page .p31-cover .p31-prog{
  margin: -8px 2px 12px; border-radius: 18px; padding: 13px 12px 11px;
  border-color: rgba(124,92,240,.22); box-shadow: 0 12px 28px rgba(46,34,120,.12);
}
.p31-prnodes{  gap: 0; }
.p31-prn{ gap: 3px; font-size: 11px; color: #1a1f36; }
.p31-prn .p31-prd{
  display: inline-flex; align-items: center; justify-content: center;  
  border-radius: 50%;   
}

.p31-prn .p31-prl{ font-weight: 700; }
.p31-prn em{  font-style: normal;  color: #1a1f36; }

.p31-prn.is-done .p31-prl{ color: #5b4bd6; }

.p31-prn.is-cur .p31-prl{ color: #5b4bd6; font-weight: 700; }
.p31-prn.is-todo{ opacity: .92; }
@keyframes p31NodePulse{
  0%, 100%{ transform: scale(1); }
  50%{ transform: scale(1.10); }
}

/* ---------- 1.4 / 10 · 列表卡片与路线段落：不再灰扑扑，交通细节只在展开时按普通文字出现 ---------- */
.p31-hbs{ gap: 16px; }
.p31-hb{
  border-radius: 18px; border-color: rgba(196,200,240,.42);
  box-shadow: 0 9px 22px rgba(31,38,135,.075);
}
.p31-bookbar .p31-checkall{ border-radius: 12px; }
.p31-route-slot{ margin: 8px 0 2px; }
.p31-route{
  padding: 6px 0 2px; border: 0; border-radius: 0; background: transparent;
}
.p31-route .p31-rline{ display: flex; align-items: center; gap: 7px; margin: 0 0 3px; font-size: 12px; color: #1a1f36; }
.p31-route .p31-rline b{ font-weight: 700; color: #1a1f36; }
.p31-route .p31-rmock{
  margin-left: auto; padding: 1px 8px; border-radius: 999px; font-size: 11px; font-weight: 700;
  color: #8a5a00; background: rgba(245,158,11,.16); border: 1px solid rgba(245,158,11,.3);
}
.p31-route .p31-rpath{ margin: 0 0 4px; font-size: 12px; font-weight: 700; color: #5b4bd6; }
.p31-route .p31-rstep{ display: flex; gap: 7px; margin: 2px 0; font-size: 12px; line-height: 1.65; color: #1a1f36; }
.p31-route .p31-rstep i{ flex: none; font-style: normal; color: #1a1f36; }
.p31-route .p31-rnums{ margin: 5px 0 0; font-size: 12px; color: #5b4bd6; }
.p31-route.is-same{ display: flex; align-items: center; gap: 7px; padding: 4px 0 2px; font-size: 12px; color: #1a1f36; }
.p31-route.is-same .p31-rmock{ margin-left: auto; }
.p31-route.is-off{ display: flex; align-items: flex-start; gap: 7px; padding: 4px 0 2px; background: transparent; border: 0; font-size: 12px; line-height: 1.6; color: #1a1f36; }
.p31-route.is-loading{ padding: 4px 0 2px; }

/* ---------- 6 / 7 / 8 · 参数卡：板块加高 + 轻量色底；档位三张居中并与人数宫格对齐 ---------- */
.p32-box{
  padding: 10px 9px 11px; border-radius: 16px;
  background: linear-gradient(160deg, #ffffff 0%, #f7f8ff 58%, #f1f7fd 100%);
  border: 1px solid rgba(150,150,230,.24);
  box-shadow: 0 5px 16px rgba(31,38,135,.055);
}
.p32-box .p32-lb{ font-size: 12px; }
.p32-date{ margin-top: 7px; height: 34px; }
.p32-hrs{ margin-top: 7px; }
.p32-hr{
  box-sizing: border-box; height: 28px; }
.p32-ndrow{ margin-top: 6px; }
.p32-nums{ gap: 6px; }
.p32-num{ height: 32px; flex: 1 1 calc(16.666% - 5px); min-width: 40px; text-align: center; }
.p32-tiers{ grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px;  }
.p32-tier{ width: 100%; align-items: center; text-align: center; padding: 9px 2px 8px; }
.p32-tier b, .p32-tier span{ text-align: center; }

/* ---------- 11 / 12 · 底栏按钮统一 + 确认闸门 / 历史记录 ---------- */

.p31-bar .p31-pill, .p31-bar .p31-save{
    display: inline-flex; align-items: center; justify-content: center;
  gap: 5px;  line-height: 1;
}
.p31-bar .p31-pill{ padding: 0 12px; }
.p31-bar .p31-save{ padding: 0 16px; }
.p31-bar .p31-pill svg, .p31-bar .p31-save svg{ width: 15px; height: 15px; flex: none; }
.p31-bar .p31-pill:active, .p31-bar .p31-save:active{ transform: scale(.97); }
.p31-bar .p31-pill[disabled], .p31-bar .p31-save[disabled]{ opacity: .5; }
.p31-composer .p31-cf.is-gate{ background: rgba(245,158,11,.12); border: 1px solid rgba(245,158,11,.3); }
.p31-composer .p31-cf.is-gate span{ color: #8a5a00; }
.p31-composer .p31-cf.is-gate .p31-cf-no{ color: #5b4bd6; }













/* ---------- 1 · DOM 降级海报：封面头 + 六节点进度（与 canvas 长图同版式） ---------- */
.p35-cover{
  position: relative; padding: 18px 16px 16px; border-radius: 18px; color: #fff;
  background: linear-gradient(118deg, #5a52dc 0%, #7056e2 46%, #2a7ca8 100%);
  box-shadow: 0 12px 26px rgba(46,34,120,.24);
}
.p35-cover h4{ margin: 0; text-align: left;  font-weight: 700; color: #fff; }
.p35-cover h4 i{ display: block; font-style: normal; }
.p35-cover .p35-sub{ margin: 6px 0 0; text-align: left;   color: #ffffff; }
.p35-badge{
  position: absolute; top: 12px; right: 12px; padding: 2px 10px; border-radius: 999px;
   font-weight: 700; color: #fff; background: rgba(255,255,255,.24);
}
/* v1.6.68 热修：有「已确认」标时给封面上方留出一行高度，标题不再被角标压住 */

/* v1.6.85②：兜底海报里的进度条 / 进度节点随那条时间线一起整条删除（规则一并下线，不留死代码） */

/* ---------- 深色模式同步 ---------- */
[data-theme="dark"] .p31-hero .p31-htime{
  color: #eef1ff; background: linear-gradient(118deg, rgba(46,44,86,.96), rgba(38,36,74,.96) 46%, rgba(24,58,78,.96));
  border-color: rgba(196,188,255,.5);
}
/* v1.8.03 ①：深色主题也统一成金底深字（票纸 / 金标在暗色下一样看得清） */
[data-theme="dark"] .p31-cta .ai-tag{
  color: #fff; background: linear-gradient(120deg, #556fe8, #8a4fe0 48%, #2c96bd);
  -webkit-text-fill-color: currentColor;
  border-color: rgba(160,148,255,.5); box-shadow: 0 2px 7px rgba(109,92,231,.34), inset 0 1px 0 rgba(255,255,255,.3);
}

[data-theme="dark"] .p31-prn .p31-prl{ color: #eef1ff; }
[data-theme="dark"] .p31-prn em{ color: #a8b0c8; }
[data-theme="dark"] .p31-prn.is-done .p31-prl, [data-theme="dark"] .p31-prn.is-cur .p31-prl{ color: #c4b2ff; }
[data-theme="dark"] .p31-hb{ border-color: rgba(124,92,240,.24); box-shadow: 0 9px 22px rgba(0,0,0,.30); }
[data-theme="dark"] .p31-route .p31-rline{ color: #eef1ff; }
[data-theme="dark"] .p31-route .p31-rline b{ color: #eef1ff; }
[data-theme="dark"] .p31-route .p31-rpath{ color: #c4b2ff; }
[data-theme="dark"] .p31-route .p31-rstep{ color: #eef1ff; }
[data-theme="dark"] .p31-route .p31-rnums{ color: #c4b2ff; }
[data-theme="dark"] .p32-box{ background: linear-gradient(160deg, rgba(30,34,56,.96), rgba(26,30,50,.96)); border-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p32-tier b, [data-theme="dark"] .p32-tier span{ color: #eef1ff; }



[data-theme="dark"] .p35-cover{ box-shadow: 0 12px 26px rgba(0,0,0,.4); }
/* v1.6.85②：兜底海报的进度节点已删（深色模式那几条一并下线） */

/* v1.6.68 热修：历史记录面板底部要让开底部导航坞（否则第三行「已删除」被 tabbar 压住点不到）。
   与 region 面板同一做法：面板内留出导航坞高度，内容整体上移。 */


/* ============================================================================
   v1.6.69 · AI 计划收尾修复（老板 7 条 · 图序对齐）
   ----------------------------------------------------------------------------
   ① 顶部白缝：安全区交给标题栏自己，页面从标题栏直接开始（见 .plan31-page 顶部注释）
   ② 底栏贴底：页面底垫 84 → 74px，按钮条与导航坞一条线；底部那条重复的「还差 N 条未核对」
      已经并掉（计数只留列表上方一行）—— 列表可视区多出一整条的高度
   ③ 时间胶囊：时间从标题左边挪到标题行右侧、与类型标同一行（标题不再被挤）
   ④ 灰字清零：这一整段作用域内的正文 / 日期 / 辅助行统一深色墨水色（下方批量替换）
   ⑤ 历史记录：面板收在主菜单之上、列表自己滚、按钮统一尺寸右对齐
   ============================================================================ */

/* ---- ② 进度卡里那条「已核对 x / 共 y 条」空横条已删：卡片只留六节点进度本身 ---- */
.plan31-page .p31-prog{ padding-bottom: 10px; }

/* ---- ③ 时间 = 小胶囊，放标题行右侧（与类型标同一行）；标题拿满宽度、不换行 ---- */


.plan31-page .p31-hbmain .tm{
  flex: none; padding: 2px 8px; border-radius: 999px; white-space: nowrap;
  font-size: 11px; font-weight: 700; color: #1a1f36;
  background: rgba(124,92,240,.07); border: 1px solid rgba(150,150,230,.26);
}
[data-theme="dark"] .plan31-page .p31-hbmain .tm{ color: #eef1ff; background: rgba(124,92,240,.16); border-color: rgba(160,150,255,.34); }
.plan31-page .p31-hbmain .p31-htag{ flex: none; }


/* ---- ⑤ 历史记录面板：整块收在导航坞之上（面板下沿贴齐主菜单上沿，45 度不压线），列表自己在面板里滚 ---- */







/* ---- 老「计划一览」列表同一口径：时间胶囊进标题行右侧（不再单独占左列 86px） ---- */
.plan-page.p2-manual .plan-time{
  width: auto; flex: none; padding: 1px 8px; border-radius: 999px; white-space: nowrap;
  font-size: 11px; background: rgba(124,92,240,.08); border: 1px solid rgba(150,150,230,.24);
}
.plan-page.p2-manual .plan-time-empty{ color: #1a1f36; background: rgba(124,92,240,.06); }

@media (prefers-reduced-motion: reduce){
  .p31-hero .p31-htime::after, .p31-prn.is-cur .p31-prd{ animation: none; }
}

/* ============================================================================
   v1.6.70 · AI 计划去重版（按老板 7 条 + 末尾补充 · 图序对齐）。同样只覆盖这一页相关的类。
   ----------------------------------------------------------------------------
   ① 历史面板：面板打开时页面级按钮隐藏（见 app.js），关闭按钮与标题同一行、右对齐
   ② 参数页只留「场次卡 → 参数卡」，六节点只在结果页与锁定页长图里
   ③ 结果页去掉顶部 hero 场次卡（页面直接从进度条开始）
   ④ 锁定页只留长图里那张场次卡；⑤ 绿色确认条删除（时间并进长图头部小字）
   ⑥ 长图不再嵌套：条目直接铺在长图底上，只有分隔线；⑦ 时间右对齐（与类型标同侧）
   ⑧ 首页「AI 计划」格与其它 5 格完全同尺寸，AI 标贴固定在格子右上角
   ============================================================================ */

/* ---- ⑤ 绿色确认条（.p31-lkbd）已删：锁定页顶栏不再重复「已确认 · 锁定版 + 时间」，
       长图头部保留「已确认」标 + 一行小字锁定时间（见 share.js 封面 / .p35-lock） ---- */
.p31-lkbd{ display: none !important; }

/* ---- ① 历史面板：标题与「关闭」同一行，关闭贴右 ---- */



/* ---- ⑦ 结果页：标题独占左侧，时间胶囊 + 类型标 + 勾选贴右（时间在小胶囊里，右对齐） ---- */
.plan31-page .p31-hbmain .tm{ margin-left: auto; }

/* ---- ⑧ 首页速办：六格同尺寸；AI 标贴 v1.8.06 起改「贴图标右上角的小胶囊」（见文件末尾新段） ---- */
.qt-grid .qt{
  aspect-ratio: 1 / 0.82; position: relative; }

/* ---- ⑥ 长图（老环境 DOM 降级版）不再嵌套白卡：条目直接铺在长图底上，一条发丝分隔线 ---- */
.p35-it{
  background: transparent; border: 0; border-radius: 0;
  padding: 11px 2px 12px; margin-bottom: 0;
  border-bottom: 1px solid rgba(205,210,225,.75);
}
.p35-list .p35-it:last-child{ border-bottom: 0; }
.p35-it > b{ box-shadow: none; }
/* ⑦ 时间 + 类型标贴右，标题独占左侧一行 */
.p35-trow{ display: flex;  gap: 8px; min-width: 0; }
.p35-trow strong{ flex: 1 1 auto; min-width: 0; font-size: 16px; font-weight: 700; color: #1a1f36; }
.p35-trow i{
  flex: none; font-style: normal; font-size: 11px; font-weight: 700; color: #1a1f36;
  padding: 1px 7px; border-radius: 999px; white-space: nowrap;
  background: rgba(124,92,240,.08); border: 1px solid rgba(150,150,230,.26);
}
.p35-trow em{
  flex: none; font-style: normal; font-size: 11px; font-weight: 700; color: #6d5ce7;
  background: rgba(124,92,240,.14); border-radius: 999px; padding: 1px 6px; white-space: nowrap;
}
.p35-bd strong{ margin-top: 0; }
.p35-bd u{
  text-decoration: none;
  line-height: 1.65; margin-top: 5px; }
/* ⑤ 长图头部那行小字（锁定时间） */
.p35-lock{ margin: 5px 0 0; text-align: left; font-size: 11px; font-weight: 700; color: #ffffff; }

[data-theme="dark"] .p35-it{ background: transparent; border-color: rgba(150,150,230,.22); border-bottom-color: rgba(150,150,230,.28); }
[data-theme="dark"] .p35-trow i{ color: #eef1ff; background: rgba(124,92,240,.2); border-color: rgba(160,150,255,.34); }

/* ==========================================================================
   v1.6.71 · AI 计划终修版（按老板 9 条 · 图序对齐）
   只覆盖 AI 计划相关类 + 新增的长图看图器；不动其它页面。
   ========================================================================== */

/* ---------- ① 首页「AI 计划」格：真 AI 入口（渐变图标 + 标贴 + 轻流光 + 渐变描边字） ---------- */
.qt-grid .qt.is-ai{ position: relative; overflow: hidden; }
/* v1.9.02 ⑥（老板：「滑动光影取消」）：上面这两层动效整块删除 ——
   ① 扫光层（.qt.is-ai 的 ::after + 配套 4.2s 循环键帧）；
   ② 标贴呼吸（.qt.is-ai .ai-tag 的 animation + 配套键帧；v1.8.06 起已被 .qt-ic .ai-tag 的
      animation:none 覆盖为静态，这次把死代码也一并清掉）。
   键帧名按零残留口径不在这里复述（冒烟护栏盯着）；格子的浅紫底 / 渐变图标 / 标贴小胶囊一个都不动。 */
[data-theme="dark"] .qt-grid .qt.is-ai .qt-bd b{
  
   background-clip: text; 
}

/* ---------- ⑨ 进度节点换风格：轨道 + 质感节点 + 流动高光 + 「开演」特别环节 ---------- */

.p31-prnodes{ position: relative; display: flex; align-items: flex-start; }
.p31-prail{
  position: absolute; left: 9%; right: 9%; top: 5px; height: 4px; border-radius: 999px;
  background: linear-gradient(90deg, rgba(124,92,240,.16), rgba(44,150,189,.16));
  box-shadow: inset 0 1px 2px rgba(31,38,135,.12); overflow: hidden; z-index: 0;
}
.p31-prail-fill{ position: absolute; left: 0; top: 0; bottom: 0; border-radius: 999px;
  background: linear-gradient(90deg, #556fe8, #7c5cf0 55%, #2c96bd); }
.p31-prail-flow{
  position: absolute; top: 0; bottom: 0; left: -34%; width: 34%; border-radius: 999px;
  background: linear-gradient(90deg, rgba(255,255,255,0), rgba(255,255,255,.92), rgba(255,255,255,0));
  animation: p31RailFlow 3s linear infinite;
}
@keyframes p31RailFlow{ 0%{ transform: translateX(0); } 100%{ transform: translateX(420%); } }

.p31-prn .p31-prd{
  width: 15px; height: 15px; background: #fff; border: 2px solid rgba(124,92,240,.28); color: #6b7390;
  box-shadow: 0 2px 5px rgba(31,38,135,.10);
}
.p31-prn .p31-prd svg{ width: 9px; height: 9px; }
.p31-prn.is-done .p31-prd{ background: linear-gradient(135deg,#556fe8,#7c5cf0); border-color: #fff; color: #fff;
  box-shadow: 0 0 0 2px rgba(124,92,240,.22), 0 4px 10px rgba(96,86,220,.28); }
.p31-prn.is-cur .p31-prd{ background: linear-gradient(135deg,#6d5cf0,#8a4fe0); border-color: #fff; color: #fff;
  box-shadow: 0 0 0 3px rgba(124,92,240,.18), 0 0 12px rgba(124,92,240,.5); animation: p31NodePulse 2.2s ease-in-out infinite; }
/* 「开演」= 特别环节：节点做大做强 + 发光 + 演出图标（品红同族） */
.p31-prn.is-show .p31-prd{
  width: 23px; height: 23px; margin-top: -4px; color: #fff; border: 2px solid #fff;
  background: linear-gradient(135deg,#db2777,#f472b6);
  box-shadow: 0 0 0 3px rgba(219,39,119,.14), 0 0 14px rgba(219,39,119,.45);
  animation: p31ShowGlow 2.6s ease-in-out infinite;
}
.p31-prn.is-show .p31-prd svg{ width: 12px; height: 12px; }
.p31-prn.is-show .p31-prl{ color: #d6457f; font-weight: 700; }
.p31-prn.is-show em{ color: #d6457f; font-weight: 700; }
.p31-prn{
  position: relative;
  z-index: 1; flex: 1 1 0; min-width: 0; text-align: center; }
.p31-prn .p31-prl{ font-size: 11px; }
.p31-prn em{
  opacity: .85; min-height: 12px; font-size: 11px; }
@keyframes p31ShowGlow{ 0%,100%{ box-shadow: 0 0 0 5px rgba(219,39,119,.12), 0 0 14px rgba(219,39,119,.36); } 50%{ box-shadow: 0 0 0 7px rgba(219,39,119,.18), 0 0 22px rgba(219,39,119,.55); } }
[data-theme="dark"] .p31-prn .p31-prd{ background: rgba(28,32,52,.98); border-color: rgba(150,150,230,.4); color: #eef1ff; }
[data-theme="dark"] .p31-prn.is-show .p31-prl, [data-theme="dark"] .p31-prn.is-show em{ color: #ff8cc0; }

/* ---------- ⑧ 环节行：标题独占左侧，右侧一列（类型标 / 时间） ---------- */
.plan31-page .p31-hbmain{ display: flex;  gap: 8px; flex-wrap: nowrap; }
.plan31-page .p31-hbmain .p32-hbi{ flex: none; }
.plan31-page .p31-hbmain .t{ flex: 1 1 auto; min-width: 0; margin-top: 0;   }
.p31-hcol{ flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 3px; margin-left: auto; }
.p31-hcol .p31-htag{ font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 999px; white-space: nowrap; }
.p31-hcol .tm{ font-style: normal; font-size: 12px; font-weight: 700; color: #1a1f36; white-space: nowrap; font-variant-numeric: tabular-nums; }
.plan31-page .p31-hbmain .p31-hbchk{ flex: none; }
[data-theme="dark"] .p31-hcol .tm{ color: #eef1ff; }
/* 演出条目：专属底色 / 描边 / 图标（一眼与众不同） */
.p31-hb.is-show{
  background: linear-gradient(155deg, rgba(253,242,248,.98), rgba(255,255,255,.96) 70%);
  border-color: rgba(219,39,119,.34); box-shadow: 0 10px 24px rgba(219,39,119,.13);
}
.p31-hb.is-show::before{ border-color: rgba(219,39,119,.72); box-shadow: 0 0 0 3px rgba(219,39,119,.12); }
.p31-hb.is-show .p32-hbi{ background: linear-gradient(135deg,#db2777,#f472b6); color: #fff; box-shadow: 0 4px 10px rgba(219,39,119,.32); }
.p31-hb.is-show .p31-hcol .tm{ color: #d6457f; }
[data-theme="dark"] .p31-hb.is-show{ background: linear-gradient(160deg, rgba(46,24,38,.94), rgba(28,26,44,.92)); border-color: rgba(219,39,119,.4); }
[data-theme="dark"] .p31-hb.is-show .p31-hcol .tm{ color: #ff8cc0; }

/* ---------- ③ 温馨提示（默认展开 · 可增删改 · 超 5 条自己滚） ---------- */
.p31-tipsbox{
  margin-top: 14px; padding: 12px 12px 11px; border-radius: 18px;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(250,249,255,.96));
  border: 1px solid rgba(196,200,240,.5); box-shadow: 0 9px 22px rgba(31,38,135,.06);
}
.p31-tbhd{ display: flex; align-items: center; gap: 8px; }
.p31-tbhd b{ font-size: 14px; font-weight: 700; color: #1a1f36; }
.p31-tbhd i{ font-style: normal; font-size: 11px; color: #1a1f36; }
.p31-tblist{ margin-top: 8px; display: flex; flex-direction: column; gap: 6px; }
.p31-tblist[data-scroll="1"]{ max-height: 206px; overflow-y: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; touch-action: pan-y; }
.p31-tbrow{ display: flex; align-items: center; gap: 8px; padding: 7px 9px; border-radius: 12px; background: rgba(124,92,240,.06); }
.p31-tbt{ flex: 1 1 auto; min-width: 0; font-size: 12px; line-height: 1.55; color: #1a1f36; }
.p31-tbb{ flex: none; display: flex; gap: 6px; }
.p31-tbbtn{
  height: 26px; padding: 0 10px; border-radius: 12px; font-family: inherit; font-size: 11px; font-weight: 700;
  color: #5b4bd6; background: #fff; border: 1px solid rgba(124,92,240,.24); cursor: pointer;
}
.p31-tbbtn.is-del{ color: #dc3545; border-color: rgba(179,38,30,.26); }
.p31-tbbtn.is-ok{ color: #fff; background: var(--grad-cta); border-color: transparent; }
.p31-tbbtn:active{ transform: scale(.97); }
.p31-tbrow.is-edit{ padding: 6px; background: #fff; border: 1px solid rgba(124,92,240,.3); }
.p31-tbin{
  flex: 1 1 auto; min-width: 0; height: 34px; padding: 0 10px; border-radius: 10px; font-family: inherit;
  font-size: 12px; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34); outline: none;
}
.p31-tbin:focus{ border-color: rgba(124,92,240,.6); box-shadow: 0 0 0 3px rgba(124,92,240,.12); }
.p31-tbadd{
  display: block; width: 100%; height: 36px; margin-top: 8px; border-radius: 12px; cursor: pointer;
  font-family: inherit; font-size: 12px; font-weight: 700; color: #5b4bd6;
  background: rgba(124,92,240,.05); border: 1px dashed rgba(124,92,240,.42);
}
.p31-tbempty{ padding: 4px 2px; font-size: 12px; color: #1a1f36; }
[data-theme="dark"] .p31-tipsbox{ background: linear-gradient(160deg, rgba(28,32,52,.94), rgba(24,26,44,.92)); border-color: rgba(124,92,240,.26); }
[data-theme="dark"] .p31-tbhd b, [data-theme="dark"] .p31-tbt{ color: #eef1ff; }
[data-theme="dark"] .p31-tbrow{ background: rgba(124,92,240,.14); }
[data-theme="dark"] .p31-tbin{ background: rgba(18,20,36,.9); color: #eef1ff; border-color: rgba(150,150,230,.36); }

/* ---------- ④ 底部操作条：三枚按钮等宽（重排 / 分享长图 / 确认计划；锁定页 三枚） ---------- */
.plan31-page .p31-bar{ display: flex; align-items: center;  }
.plan31-page .p31-bar .p31-pill, .plan31-page .p31-bar .p31-save{ flex: 1 1 0; justify-content: center; min-width: 0; }

/* ---------- ⑦ 锁定页：长图满宽铺满（不再套白卡、不留四周留白） ---------- */
.plan31-page .p31-locked{ margin: 0 -12px; }
.plan31-page .p31-locked .p31-poster{
  padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none;
}
.plan31-page .p31-locked [data-poster-host] > .p35-poster{ margin: 0; }
.plan31-page .p31-locked .p31-poster-ph{ border-radius: 0; padding: 0; }

/* ---------- ⑤ 长图看图器（AI 计划 · 长图）：满宽 + 可放大 + 可保存 ---------- */
html.sheetv-open, html.sheetv-open body{ overflow: hidden; }
.sheetv{
  position: fixed; inset: 0; z-index: 300; display: flex; flex-direction: column;
  background: #0f1226;
}
.sheetv-hd{
  flex: none; display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: calc(10px + env(safe-area-inset-top)) 14px 10px;
  background: rgba(16,18,38,.96); border-bottom: 1px solid rgba(150,150,230,.22);
}
.sheetv-hd b{ font-size: 16px; font-weight: 700; color: #ffffff; }
.sheetv-x{
  flex: none; width: 32px; height: 32px; border-radius: 50%; cursor: pointer;
  color: #ffffff; background: rgba(255,255,255,.10); border: 1px solid rgba(180,180,240,.26);
  font-size: 14px; line-height: 1;
}
.sheetv-bd{
  flex: 1 1 auto; min-height: 0; overflow: auto; 
  overscroll-behavior: contain; background: #0f1226; padding: 10px 0;
}
.sheetv-img{ display: block; width: 100%;  height: auto; margin: 0 auto; }
.sheetv-ft{
  flex: none; display: flex; align-items: center; gap: 10px;
  padding: 10px 14px calc(10px + env(safe-area-inset-bottom));
  background: rgba(16,18,38,.96); border-top: 1px solid rgba(150,150,230,.22);
}
.sheetv-zoom{ display: flex; align-items: center; gap: 6px; }
.sheetv-zoom button{
  width: 34px; height: 34px; border-radius: 12px; cursor: pointer; font-family: inherit; font-size: 16px; font-weight: 700;
  color: #ffffff; background: rgba(255,255,255,.10); border: 1px solid rgba(180,180,240,.24);
}
.sheetv-zoom b{ min-width: 46px; text-align: center; font-size: 12px; color: #ffffff; }
.sheetv-zoom .sheetv-fit{ width: auto; padding: 0 10px; font-size: 12px; font-weight: 700; }
.sheetv-save{ flex: 1 1 auto; margin: 0; }
.sheetv-hint{ flex: none; margin: 0; padding: 0 14px calc(8px + env(safe-area-inset-bottom)); font-size: 11px; color: #6b7390; text-align: center; background: rgba(16,18,38,.96); }

/* ---------- DOM 降级海报：与长图同版式（标题左 + 右列类型/时间；温馨提示） ---------- */
.p35-trow{ align-items: flex-start; }
.p35-hcol{ flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 2px; margin-left: auto; }
.p35-hcol i{ font-style: normal; font-size: 11px; font-weight: 700; color: #1a1f36; font-variant-numeric: tabular-nums; }
.p35-hcol em{ font-style: normal; font-size: 11px; font-weight: 700; color: #6d5ce7; background: rgba(124,92,240,.14); border-radius: 999px; padding: 1px 7px; white-space: nowrap; }
.p35-tips{ margin-top: 12px; padding: 10px 12px; border-radius: 12px; background: rgba(124,92,240,.06); }
.p35-tips b{ display: block; margin-bottom: 6px; font-size: 12px; font-weight: 700; color: #1a1f36; }
.p35-tips ul{ margin: 0; padding-left: 16px; }
.p35-tips li{ font-size: 11px; line-height: 1.6; color: #1a1f36; }

/* ---------- 省电：系统「减少动态」→ 所有新动效停 ---------- */
@media (prefers-reduced-motion: reduce){
  /* v1.9.02 ⑥：.qt.is-ai 的扫光与标贴呼吸已整块下线，这里不再需要引用它们 */
  .p31-prail-flow, .p31-prn.is-cur .p31-prd, .p31-prn.is-show .p31-prd{ animation: none !important; }
}

/* ============================================================================
   v1.6.73 · AI 计划补完版（按老板 7 条 · 图序对齐）
   ① 页面禁止横向滚动 ② 参数页白线 ③ 档位上下居中 ④ 出发地区大框 + 两级地址
   ⑤ 未填项就近提示 ⑥ 配额可视化 ⑦ 预览 → 修改两步 ⑧ 温馨提示「换一换」
   ⑨ 待定一行 + 去规划。只作用于这一页相关的类，不动其它页面。
   ============================================================================ */

/* ① 固定页面：任何页面只能上下滑，长图按屏宽等比缩放，不许比屏幕宽 */
.plan31-page{ overflow-x: hidden; }
.plan31-page .p31-body{ overflow-x: hidden; }
.plan31-page .p31-locked .p31-poster,
.plan31-page .p31-locked [data-poster-host]{ max-width: 100%; }
.sheetv-bd{ overflow-x: hidden; }
.sheetv-img{ max-width: 100%; }

/* ② 参数页顶部白线 / 选择场次面板白缝：场次卡顶部那条高光细线去掉 + 内容区顶缝归零 */
.plan31-page .p31-gig.p31-hero::after{ display: none; }

.plan31-page #plan-gig-host .p31-gig.p31-hero{ margin-top: 0; }

/* ③ 档位三按钮在档位框内垂直居中（不再顶在上面留一片空） */
.p32-box:has(.p32-tiers){ display: flex; flex-direction: column; }
.p32-box:has(.p32-tiers) > .p32-lb{ flex: none; }
.p32-tiers{
  justify-items: stretch; flex: 1 1 auto; align-content: center; }

/* ④ 出发地区大框 + 两级地址（区县级必填 + 具体位置选填） */
.p32-region.p32-region-big{ display: block; padding: 11px 10px 12px; }
.p32-region-big .p32-trow{ display: flex; align-items: center; gap: 6px; margin-bottom: 6px; }
.p32-region-big .p32-trow .p32-lb{ margin: 0; }
.p32-region-pick{
  display: flex; align-items: center; gap: 8px; width: 100%; box-sizing: border-box;
  padding: 10px 12px; border-radius: 13px; cursor: pointer; font-family: inherit; text-align: left;
  color: #1a1f36; background: #fff; border: 1px solid rgba(124,92,240,.32);
}
.p32-region-pick .p32-val{ flex: 1 1 auto; }
.p32-region-pick .p32-val .p32-ph{ color: #6b7390; }
.p32-exact{
  display: block; width: 100%; box-sizing: border-box; margin-top: 8px; padding: 10px 12px; border-radius: 13px;
  font-family: inherit; font-size: 12px; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34); outline: none;
}
.p32-exact:focus{ border-color: rgba(124,92,240,.6); box-shadow: 0 0 0 3px rgba(124,92,240,.12); }
[data-theme="dark"] .p32-region-pick,
[data-theme="dark"] .p32-exact{ background: rgba(18,20,36,.9); color: #eef1ff; border-color: rgba(150,150,230,.3); }

/* ⑤ 未填项就近提示：栏位旁的小「未填写」气泡 + 出错栏位描边 */
.p32-err{
  flex: none; display: inline-flex; align-items: center; gap: 3px; padding: 2px 7px; border-radius: 999px;
  font-style: normal; font-size: 11px; font-weight: 700; color: #dc3545;
  background: rgba(249,115,22,.14); border: 1px solid rgba(249,115,22,.32);
}
.p32-err svg{ width: 11px; height: 11px; }
.p32-box.is-err{ border-color: rgba(249,115,22,.55); }
[data-theme="dark"] .p32-err{ color: #f5b94e; background: rgba(249,115,22,.18); border-color: rgba(249,115,22,.4); }

/* ⑥ 配额可视化：环形剩余刻度 + 小字数字；用完整排变灰 + 提示明天恢复 */
.p31-pquota{ display: inline-flex; align-items: center; justify-content: center; gap: 6px; }
.p32-qring{
  flex: none; width: 15px; height: 15px; border-radius: 50%;
  background: rgba(124,92,240,.18);
  background: conic-gradient(#6b5bd6 calc(var(--q, 100) * 1%), rgba(124,92,240,.16) 0);
  -webkit-mask: radial-gradient(circle, transparent 52%, #000 54%);
  mask: radial-gradient(circle, transparent 52%, #000 54%);
}
.p31-pquota em{ font-style: normal; font-weight: 700; font-variant-numeric: tabular-nums; }
.p31-pquota b{ font-weight: 700; color: #1a1f36; }
.p31-pquota.is-out{
  color: #dc3545; background: rgba(249,115,22,.08); border: 1px solid rgba(249,115,22,.28);
  padding: 2px 9px; border-radius: 999px;
}
.p31-pquota.is-out b{ color: #dc3545; }
[data-theme="dark"] .p31-pquota b{ color: #a8b0c8; }
[data-theme="dark"] .p31-pquota.is-out{ color: #f5b94e; background: rgba(249,115,22,.16); border-color: rgba(249,115,22,.4); }

/* ⑦ 预览 → 修改两步：只读预览里的字段值给一块浅底，点「修改」才进编辑表单 */
.p31-ero{
  padding: 6px 10px; border-radius: 11px; background: rgba(124,92,240,.05);
  border: 1px solid rgba(150,150,230,.2); font-size: 12px; line-height: 1.55; color: #1a1f36;
}
.p31-ero.mono{ font-variant-numeric: tabular-nums; }
.p31-edit.is-pv .p31-eacts{ margin-top: 8px; }
[data-theme="dark"] .p31-ero{ background: rgba(124,92,240,.12); border-color: rgba(150,150,230,.24); color: #eef1ff; }

/* ⑧ 温馨提示「换一换」：顶部一枚次要胶囊；AI 批只读、标「参考」 */
.p31-tbrefresh{
  margin-left: auto; flex: none; height: 28px; padding: 0 11px; border-radius: 999px; cursor: pointer;
  font-family: inherit; font-size: 12px; font-weight: 700; color: #5b4bd6;
  background: rgba(124,92,240,.08); border: 1px solid rgba(124,92,240,.3);
}
.p31-tbrefresh:active{ transform: scale(.97); }
.p31-tbrefresh[disabled]{ opacity: .55; cursor: default; }
.p31-tblist.is-ai{ margin-top: 8px; }
.p31-tbrow.is-ai{ background: rgba(8,145,178,.06); }
.p31-tbref{
  flex: none; font-style: normal; font-size: 11px; font-weight: 700; color: #1a1f36;
  background: rgba(8,145,178,.14); border: 1px solid rgba(8,145,178,.3); border-radius: 999px; padding: 1px 6px;
}
[data-theme="dark"] .p31-tbrefresh{ color: #c4b2ff; background: rgba(124,92,240,.18); border-color: rgba(150,140,255,.34); }
[data-theme="dark"] .p31-tbrow.is-ai{ background: rgba(8,145,178,.14); }
[data-theme="dark"] .p31-tbref{ color: #5fd39b; background: rgba(8,145,178,.2); border-color: rgba(103,232,249,.32); }

/* ⑨ 还没定的：一行一条（说明 + 去规划按钮），布局整齐不堆叠 */

@media (prefers-reduced-motion: reduce){
  .p31-tbrefresh, .p31-region-pick, .p32-exact{ transition: none; }
}

/* ============================================================================
   v1.6.74 · AI 计划收官版（按老板 6 条 · 图序对齐）
   ① 锁定页时间线换成确认页同一条（图标节点，share.js 同口径）
   ② 条目内空档填上 ③ 三合一摘要卡 ④ 预览面板按钮重排与样式
   ⑤ 去规划「先确认再重算」 ⑥ 结果页 / 长图字号整体调小一档。
   ============================================================================ */

/* ② 条目内空档填上：说明文字上移，紧接标题行（所有环节统一） */
.plan31-page .p31-edit{ margin-top: 5px; padding-top: 5px; }
.plan31-page .p31-elab{ margin: 2px 0 2px; }
.plan31-page .p31-ero{  margin: 0; }
.plan31-page .p31-eacts{ margin-top: 6px; }



/* ③ 「为你排好了 + 依据 + 摘要 chips」三块合成一张卡 */
.plan31-page .p31-sumcard{
   border-radius: 16px; 
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(250,249,255,.96));
  border: 1px solid rgba(196,200,240,.5); box-shadow: 0 9px 22px rgba(31,38,135,.06);
}
.p31-sumcard .p31-sumtop{ display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; }
.p31-sumcard .p31-sumtop .p32-t1{ margin: 0; }
.p31-sumcard .p31-sumtop em{ font-style: normal; font-size: 12px; font-weight: 700; color: #1a1f36; }
.p31-sumcard .p31-basis2{ margin: 0 0 8px; }
.p31-sumcard .p31-sum{ margin: 0; }
.p31-sumcard .p31-warn{ margin-top: 0; }
[data-theme="dark"] .p31-sumcard{ background: linear-gradient(160deg, rgba(28,32,52,.94), rgba(24,26,44,.92)); border-color: rgba(124,92,240,.26); }
[data-theme="dark"] .p31-sumcard .p31-sumtop em{ color: #eef1ff; }

/* ④ 预览面板按钮：收起 → 修改（次要、改小）→ 确认（带勾、显眼克制） */
.p31-ebtn.sec{
  flex: none; height: 38px; padding: 0 14px; border-radius: 12px; font-size: 12px;
  color: #5b4bd6; background: #fff; box-shadow: none; border: 1px solid rgba(124,92,240,.24);
}
.p31-ebtn.ok{
  flex: none; height: 38px; padding: 0 14px; border-radius: 12px; font-size: 12px;
  color: #fff; background: linear-gradient(96deg,#3f9d6b,#2f8f63); box-shadow: 0 6px 14px rgba(46,150,100,.24);
}
.p31-ebtn.ok svg{ width: 14px; height: 14px; }
[data-theme="dark"] .p31-ebtn.sec{ color: #c4b2ff; background: rgba(28,32,52,.94); border-color: rgba(150,140,255,.3); }

/* ⑤ 去规划补充：先弹「会动哪几条」，确认更新才重算（取消 = 保持原样） */
.p31-todocf{
  display: flex; align-items: center; gap: 8px; flex-wrap: nowrap;
  margin: 0 0 9px; padding: 9px 11px; border-radius: 14px;
  background: linear-gradient(150deg, rgba(240,247,245,.98), rgba(255,255,255,.96));
  border: 1px solid rgba(15,118,110,.24); box-shadow: 0 8px 18px rgba(15,118,110,.08);
}
.p31-todocf-t{ flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 6px; overflow: hidden; }
.p31-todocf-t svg{ flex: none; color: #1a1f36; }
.p31-todocf-t b{ font-size: 12px; font-weight: 700; color: #1a1f36; white-space: nowrap; }
.p31-todocf-t i{ font-style: normal; font-size: 12px; color: #1a1f36; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p31-todocf-use{
  flex: none; height: 34px; padding: 0 13px; border-radius: 11px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #fff; background: linear-gradient(96deg,#0f766e,#14b8a6); border: 0;
}
.p31-todocf-keep{
  flex: none; height: 34px; padding: 0 13px; border-radius: 11px; cursor: pointer; font-family: inherit;
  font-size: 12px; font-weight: 700; color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.3);
}
.p31-todocf-use:active, .p31-todocf-keep:active{ transform: scale(.97); }
[data-theme="dark"] .p31-todocf{ background: linear-gradient(150deg, rgba(20,48,44,.94), rgba(28,32,52,.92)); border-color: rgba(45,212,191,.3); }
[data-theme="dark"] .p31-todocf-t b{ color: #5fd39b; }
[data-theme="dark"] .p31-todocf-t i{ color: #eef1ff; }
[data-theme="dark"] .p31-todocf-keep{ color: #6b85ff; background: rgba(28,32,52,.94); border-color: rgba(150,150,230,.28); }

/* ⑥ 结果页字号整体下调一档：标题、正文、标签全部（层级仍靠字重与颜色） */
.plan31-page .p31-hbmain .t{
  line-height: 1.35; font-size: 14px; }


.plan31-page .p31-ero{ font-size: 12px; }
.plan31-page .p31-ein, .plan31-page .p31-eta{ font-size: 12px; }



@media (prefers-reduced-motion: reduce){
  .p31-ebtn.sec, .p31-ebtn.ok, .p31-todocf-use, .p31-todocf-keep{ transition: none; }
}

/* ============================================================================
   v1.6.75 · AI 计划细节版（按老板 6 条 · 图序对齐）
   ① 去规划抽屉底部让开主菜单 ② 底部操作条再下移一点 ③ 时间线统一并下移一线
   ④ 明细文字缩进到标题下方 ⑤ 依据一行截断可展开 ⑥ 折叠态补一行小明细。
   ============================================================================ */

/* ② 底部操作条（及所有同位置操作条）再下移一点：页面底垫 74 → 70，全站同类按钮同一落点 */


/* ① 去规划抽屉底部预留安全区（v1.8.01 ⑪⑫：抽屉整块下线，规则随之删除，不留死代码） */

/* ③ 结果页时间线整体下移一线（页面 / 锁定页长图 / DOM 降级海报同一套节点） */


/* ④ 展开后的明细 / 编辑表单缩进到标题起始位置（左列编号区不再被文字顶满） */


/* ⑤ 依据改成一行截断：依据：<内容>…；点击整行展开；chevron 表达展开 / 收起 */
.plan31-page .p31-basis2 summary{ display: flex; align-items: center; gap: 6px; }
.plan31-page .p31-basis2 .p31-basisline{
  flex: 1 1 auto; min-width: 0; font-size: 12px; line-height: 1.5; color: #1a1f36;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.plan31-page .p31-basis2 .p31-basisline b{ font-weight: 700; color: inherit; }
.plan31-page .p31-basis2 .p31-bchev{ flex: none; color: #6b7390; transition: transform .16s ease; }
.plan31-page .p31-basis2 .p31-bchev svg{ width: 14px; height: 14px; }
.plan31-page .p31-basis2[open] .p31-bchev{ transform: rotate(90deg); }
.plan31-page .p31-basis2 .p31-basis-full{ margin-top: 7px; }

/* ⑥ 折叠态补一行小明细：标题下方空白处放正文首句，超长截断；行高靠右列两行维持，不把卡片撑高 */
.plan31-page .p31-hbtext{
    display: flex;  
}
.plan31-page .p31-hbtext .t{ display: block; flex: none; }
.plan31-page .p31-hbdetail{
  display: block; margin: 0;   
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
[data-theme="dark"] .plan31-page .p31-hbdetail{ color: #a8b0c8; }

/* ③ v1.6.85②：DOM 降级海报里那排进度节点（.p35-prnodes / .p35-nd）随整条时间线删除，规则一并下线 */

@media (prefers-reduced-motion: reduce){
  .plan31-page .p31-basis2 .p31-bchev{ transition: none; }
}

/* ============================================================================
   v1.6.76 · AI 计划成品质感版（按老板 6 条 · 图序对齐）
   ① 生成中卡片（大数字 / 流光进度 / 阶段打勾与呼吸）
   ② 确认自动收起（行为在 app.js；这里只统一收起后的视觉）
   ③ hero 场次卡文字放大填满（高度不变）
   ④ 全新流动时间线（结果页 / 锁定页长图 / DOM 降级三处同源）
   ⑤ 条目标题与正文零空档（硬验收）
   ⑥ 结果页 / 锁定页统一间距节奏与卡片语言（8/12/16）。
   ============================================================================ */

/* ---------- ① 生成中：一张真的在「干活」的 AI 卡 ---------- */
.plan31-page .plan-ai-loading{
  position: relative; overflow: hidden; 
  border: 1px solid transparent;
  background:
    linear-gradient(155deg, rgba(255,255,255,.99), rgba(248,247,255,.98)) padding-box,
    linear-gradient(120deg, rgba(85,111,232,.62), rgba(124,92,240,.72) 46%, rgba(44,150,189,.62)) border-box;
  
}
/* v1.8.01（老板图 2）：.plan-ai-aura（卡片背后的紫/青大光斑，右上角看着像白斜线）整块删除 ——
   元素、规则、动画一起下线，不留残影（reduced-motion 名单里的同名引用也一并清掉）。 */
.plan31-page .plan-ai-loading .plan-ai-head{ align-items: flex-end; }
.plan31-page .plan-ai-loading .plan-ai-head b{ font-size: 12px; letter-spacing: .4px; color: #5b4bd6; }
.plan31-page .plan-ai-loading .plan-ai-pct{
  font-size: 28px; line-height: 1; font-weight: 700; letter-spacing: -1.2px; color: #5b4bd6;
  text-shadow: 0 5px 18px rgba(124,92,240,.22); font-variant-numeric: tabular-nums;
}
.plan31-page .plan-ai-loading .plan-ai-pct i{ margin-left: 1px; font-size: 18px; font-style: normal; font-weight: 700; letter-spacing: 0; }
.plan31-page .plan-ai-loading .plan-ai-bar{
  position: relative; height: 10px; margin-top: 10px; border-radius: 999px; overflow: hidden;
  background: linear-gradient(90deg, rgba(85,111,232,.12), rgba(124,92,240,.15), rgba(44,150,189,.12));
  
}
.plan31-page .plan-ai-loading .plan-ai-bar > i{
  position: relative; display: block; height: 100%; border-radius: 999px;
  background: linear-gradient(90deg,#556fe8,#7c5cf0 52%,#2c96bd);
  box-shadow: 0 0 16px rgba(124,92,240,.42); transition: width .3s cubic-bezier(.22,.8,.3,1);
}
/* v1.8.01（老板图 2）：进度条右端那道白色斜光（p76 那支流光动画）整块删除 —— 生成中卡片右上角不再有白斜线残影。 */
/* v1.6.82（老板图 1）：进度条那颗白色发光圆点整颗下线 —— 规则、关键帧、reduced-motion 名单一起删干净 */
.plan31-page .plan-ai-loading .p32-steps{ gap: 8px; margin-top: 11px; }
.plan31-page .plan-ai-loading .p32-st{
  position: relative; min-height: 42px; align-items: center; overflow: hidden;
  transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease, background .18s ease;
}
.plan31-page .plan-ai-loading .p32-st.done{
  color: #1a1f36; background: linear-gradient(145deg, rgba(34,197,94,.13), rgba(255,255,255,.78));
  border-color: rgba(34,197,94,.42); box-shadow: 0 5px 14px rgba(34,197,94,.10);
}
.plan31-page .plan-ai-loading .p32-st.done .p32-stok{ opacity: 1; transform: scale(1); }
.plan31-page .plan-ai-loading .p32-st.on{
  color: #5b4bd6; background: linear-gradient(145deg, rgba(124,92,240,.16), rgba(255,255,255,.78));
  border-color: rgba(124,92,240,.58); box-shadow: 0 0 0 3px rgba(124,92,240,.09), 0 8px 18px rgba(96,86,220,.15);
  animation: p76StageBreath 1.65s ease-in-out infinite;
}
.plan31-page .plan-ai-loading .p32-stok{
  position: absolute; top: 5px; right: 6px; display: inline-flex; color: #1f9d63;
  opacity: 0; transform: scale(.6); transition: opacity .18s ease, transform .18s ease;
}
.plan31-page .plan-ai-loading .p32-stok svg{ width: 12px; height: 12px; }
.plan31-page .plan-ai-loading .plan-ai-meta{ margin-top: 8px; }
.plan31-page .plan-ai-loading .plan-ai-elapsed{ color: #6d5ce7; font-weight: 700; }
/* v1.8.01（老板图 2）：光斑那条 @keyframes（p76 那支呼吸动画）随 .plan-ai-aura 一起删除，不留死代码。 */
/* v1.6.82 删掉的那条流光点关键帧已下线（不留死代码） */
@keyframes p76StageBreath{ 0%, 100%{ transform: scale(1); } 50%{ transform: scale(1.018); } }

/* ---------- ③ hero 场次卡：字号整体上浮一档，正好填满原有高度 ---------- */

.plan31-page .p31-hero .p31-hname{  line-height: 1.3; }
.plan31-page .p31-hero .p31-hvenue{   line-height: 1.36; }






/* 锁定页 / 结果页真正展示的是长图封面：标题 / 副信息 / 已确认行同步放大 */





/* ---------- ④ 全新流动时间线：渐变轨 + 沿线光点 + 图标徽章 + 开演金紫特别节点 ---------- */
.plan31-page .p31-prog{
    margin-top: 8px; 
  border-radius: 18px; border: 1px solid rgba(124,92,240,.20);
  
  
}

.plan31-page .p31-prail{
  position: absolute;     border-radius: 999px; overflow: hidden;
  background: linear-gradient(90deg, rgba(85,111,232,.14), rgba(124,92,240,.19) 52%, rgba(44,150,189,.14));
  
}
.plan31-page .p31-prail-fill{
  background: linear-gradient(90deg,#556fe8,#7c5cf0 52%,#2c96bd);
  
}
.plan31-page .p31-prail-flow{
  width: 30%; left: -30%; opacity: .95;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.98), transparent);
  animation: p76RailFlow 2.7s linear infinite;
}
.plan31-page .p31-prn{ z-index: 1; }




.plan31-page .p31-prn.is-show .p31-prd{
    border-width: 2.5px; border-color: rgba(255,255,255,.98); 
  
  
  
}





@keyframes p76RailFlow{ 0%{ transform: translateX(0); } 100%{ transform: translateX(440%); } }
@keyframes p76NodePulse{ 0%, 100%{ transform: scale(1); } 50%{ transform: scale(1.10); } }
@keyframes p76ShowGlow{ 0%, 100%{ box-shadow: 0 0 0 5px rgba(245,158,11,.12), 0 0 18px rgba(219,39,119,.42), 0 7px 16px rgba(124,58,237,.24); } 50%{ box-shadow: 0 0 0 7px rgba(245,158,11,.18), 0 0 28px rgba(219,39,119,.62), 0 7px 20px rgba(124,58,237,.32); } }

/* ---------- ⑤ v1.6.77（老板图 5/8）：展开面板恢复 v1.6.75 布局（时间 / 标题 / 做法三段式，标签与值之间有呼吸感），
   唯一保留 v1.6.76 的行为 = 点「确认」自动收起；标题与正文之间零空档、正文统一墨水色 ---------- */
.plan31-page .p31-edit{ padding-left: 39px; }
.plan31-page .p31-edit .p31-eacts{ margin-top: 8px; }
.plan31-page .p31-hbtext{
  flex: 1 1 auto;
  min-width: 0;
  flex-direction: column; gap: 0; }
.plan31-page .p31-hbdetail{  font-size: 11px; line-height: 1.25; color: #1a1f36; }
.plan31-page .p32-det{ margin-top: 0 !important; }
.plan31-page .p32-det.is-ro b{ display: block; margin: 0; font-size: 14px; line-height: 1.32; }
.plan31-page .p32-det.is-ro p{ margin: 1px 0 0 !important; font-size: 12px; line-height: 1.55; color: #1a1f36; }


/* ---------- ⑥ 结果页 / 锁定页统一节奏：同一套 8 / 12 / 16 的间距与卡片语言 ---------- */
.plan31-page .p31-book{ --p76-r: 18px; }
.plan31-page .p31-sumcard,
.plan31-page .p31-tipsbox,
.plan31-page .p31-hb,
.plan31-page .p31-prog{
  border: 1px solid rgba(150,150,230,.28);
  box-shadow: 0 10px 26px rgba(53,40,150,.075);
}
.plan31-page .p31-sumcard{ margin-bottom: 12px;  border-radius: var(--p76-r); }
.plan31-page .p31-bookbar{ margin: 12px 2px 8px; }
.plan31-page .p31-hbs{ gap: 12px; }
.plan31-page .p31-day{ margin: 16px 2px 8px; }
.plan31-page .p31-tipsbox{ margin-top: 16px; border-radius: var(--p76-r); box-shadow: 0 8px 20px rgba(53,40,150,.065); }
.plan31-page .p31-hb .t{ letter-spacing: .1px; }
.plan31-page .p31-hcol .p31-htag{ border-radius: 999px; }
.plan31-page .p31-hcol .tm{ padding-top: 1px; }

@media (prefers-reduced-motion: reduce){
  .plan31-page .plan-ai-loading .p32-st.on,
  .plan31-page .p31-prail-flow,
  .plan31-page .p31-prn.is-cur .p31-prd,
  .plan31-page .p31-prn.is-show .p31-prd{ animation: none !important; }
  .plan31-page .plan-ai-loading .p32-st,
  .plan31-page .p31-prn .p31-prd{ transition: none !important; }
  .plan31-page .p31-prail-flow{ display: none; }
}

/* ============================================================================
   v1.6.77 · AI 计划纠错版（按老板 9 条 · 图序对齐）
   ① 时间线「开演」旁孤点已删（markup 同删，这里清掉残留规则）
   ② 「已写进计划」整行 + 衍生只读副本整块删除（纯函数与状态一并下线）
   ③ 「准备 30min」与「08:00–08:30」两枚胶囊完全同尺寸（同高 / 同内边距 / 同字号）
   ④ 条目上的「参考」小标全局删除
   ⑤ 展开面板恢复 v1.6.75 布局（仅保留确认自动收起）
   ⑥ ——（同 ②）
   ⑦ 锁定页时间线单独设计（有主轴 / 光流 / 高对比节点 / 开演专属；见上文 .p35-tl*）
   ⑧ 正文深色墨水 + 缩进标题下方 + 零空档（见上文 ⑤ 区块）
   ⑨ 锁定页场次卡三行文字放大一档填满卡片。
   ============================================================================ */

/* ---------- ③ 类型标与时间胶囊：完全同一尺寸（高度 / 内边距 / 字号），所有条目统一 ---------- */
.plan31-page .p31-hcol .p31-htag,
.plan31-page .p31-hcol .tm{
  height: 22px;  padding: 0 8px; font-size: 11px;
  border-radius: 999px; 
}
.plan31-page .p31-hcol .tm{
  font-style: normal; font-weight: 700; color: #1a1f36; font-variant-numeric: tabular-nums;
  background: rgba(124,92,240,.07); border: 1px solid rgba(150,150,230,.26);
}
[data-theme="dark"] .plan31-page .p31-hcol .tm{
  color: #eef1ff; background: rgba(124,92,240,.16); border-color: rgba(160,150,255,.34);
}

/* ---------- ⑨ 锁定页长图封面（DOM 降级与 canvas 同口径）：三行文字放大一档填满卡片 ---------- */
.p35-cover h4{ font-size: 22px; }
.p35-cover .p35-sub{ font-size: 14px; line-height: 1.5; }
.p35-cover .p35-lock{ font-size: 12px; }
.p35-badge{ font-size: 12px; }

/* ============================================================================
   v1.6.78 · AI 计划视觉校准版（按老板 3 条 · 图序对齐）
   （详注见 git 历史 · W-023 样式表瘦身） */

/* ---------- ① 结果页六节点时间线：节点 + 图标加大一档，纯描边不带光晕 ---------- */



.plan31-page .p31-prn{
  display: grid;  justify-items: center; align-items: center;
   flex: 1 1 0; min-width: 0;  
}
.plan31-page .p31-prn .p31-prd{
  display: inline-flex; align-items: center; justify-content: center; margin: 0;
    border-radius: 50%;
    
  
}
.plan31-page .p31-prn .p31-prd svg{ display: block;    }


.plan31-page .p31-prn.is-show .p31-prd{
    margin: 0;  
  
   animation: none;
}




.plan31-page .p31-prn.is-cur .p31-prl{ font-weight: 700; }

[data-theme="dark"] .plan31-page .p31-prn.is-show .p31-prd{
  background: linear-gradient(135deg,#db2777,#f472b6); border-color: #fff; color: #fff;
}

/* ---------- ② 场次卡（首屏 / 参数页 hero）：文字块整体垂直居中，卡片高度不变 ---------- */
.plan31-page .p31-gig.p31-hero{ display: flex; flex-direction: column;  }

/* ② 锁定页长图封面（DOM 降级）：与 canvas 同口径 —— 文字块垂直居中、上留白 = 下留白 */



/* ---------- ③ 环节行：标题与右侧两枚胶囊垂直居中对齐 ---------- */
.plan31-page .p31-hbmain{ align-items: center; }

/* ============================================================================
   v1.6.79 · AI 计划整顿版（按老板 4 条 · 图序一一对照）
   ① 键盘弹起四角/四周不露白（图 1）：html / body / 根容器统一铺满页面底色，含键盘区与安全区；
      「具体位置」聚焦弹历史（最近 5 条可点选，落库去重最多 10 条）。
   ② 正文不再有灰色（图 2）：正文 / 次要行全部深色墨水色（#2b2f4a 系），层级靠字号字重底色；
      演出条目专属差异化（专属底色 + 描边 + 图标 + 更重字）。
   ③ 时间线放大重设计（图 3）：节点名 13px / 时间 12px、图标再大一档、主轴更清晰、
      已完成 / 进行中 / 未开始三态明显、「开演」最大最亮（金紫）；结果页 / 锁定页 / 长图同一套。
   ④ 补齐信息卡「开场」（图 4）：标准时间选择器（原生轮盘）+ 空态「如 19:30」+ 未填写提示贴字段旁。
   ============================================================================ */

/* ---------- ① 键盘弹起不露白：底层铺满，任何 WebView 缩高都不露白底 ---------- */
html{ background-color: #f2f4fc; }
body{ background-color: #f2f4fc; }
.phone-shell{ background-color: #f2f4fc; }
[data-theme="dark"] html,
[data-theme="dark"] body,
[data-theme="dark"] .phone-shell{ background-color: #0a0d1c; }
/* 键盘弹起时 body 会挂 .plan-kb-open（app.js 里 visualViewport 同步）—— 再钉一次底色 + 不许整页滚动 */
body.plan-kb-open{ background-color: #f2f4fc; overscroll-behavior: none; }
[data-theme="dark"] body.plan-kb-open{ background-color: #0a0d1c; }

/* ---------- ① 具体位置：聚焦弹历史（最近 5 条），点选直接填入 ---------- */
.p32-exact-wrap{ position: relative; display: block; }
.p32-exhist{ display: none; flex-wrap: wrap; gap: 7px; align-items: center; margin-top: 8px; }
.p32-exhist.on{ display: flex; }
.p32-exhist .p32-exhlb{ flex: none; font-size: 11px; font-weight: 700; color: #5a6178; }
.p32-exhist .p32-exh{
  max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-family: inherit; font-size: 12px; font-weight: 700; padding: 7px 11px; border-radius: 999px;
  color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34);
}
.p32-exhist .p32-exh:active{ transform: scale(.97); }
.p32-exhist .p32-exclr{
  flex: none; font-family: inherit; font-size: 11px; font-weight: 700; padding: 6px 9px; border-radius: 999px;
  color: #5a6178; background: transparent; border: 1px dashed rgba(150,150,230,.44);
}
[data-theme="dark"] .p32-exhist .p32-exh{ color: #eef1ff; background: rgba(124,92,240,.16); }
[data-theme="dark"] .p32-exhist .p32-exhlb{ color: #a8b0c8; }

/* ---------- ② 演出条目专属差异化（一眼看出全场核心） ---------- */
.plan31-page .p31-hb[data-tp="演出"]{
  
  border-left: 4px solid #db2777;
  
  box-shadow: 0 10px 26px rgba(190,24,93,.16);
}
.plan31-page .p31-hb[data-tp="演出"] .t{ font-size: 18px; font-weight: 700; color: #d6457f; letter-spacing: .2px; }
.plan31-page .p31-hb[data-tp="演出"] .p31-hbdetail{ color: #1a1f36; font-size: 11px; }
.plan31-page .p31-hb[data-tp="演出"] .p32-hbi{
  width: 34px; height: 34px; border-radius: 12px; color: #fff;
  background: linear-gradient(135deg,#f59e0b 0%,#db2777 56%,#7c3aed 100%);
  box-shadow: 0 7px 16px rgba(219,39,119,.30);
}
.plan31-page .p31-hb[data-tp="演出"] .p31-hcol .p31-htag{
  color: #fff; background: linear-gradient(120deg,#db2777,#7c3aed); border-color: transparent;
  box-shadow: 0 4px 12px rgba(219,39,119,.26);
}

[data-theme="dark"] .plan31-page .p31-hb[data-tp="演出"] .t{ color: #ff8cc0; }
[data-theme="dark"] .plan31-page .p31-hb[data-tp="演出"] .p31-hbdetail{ color: #ff8cc0; }

/* ---------- ③ 时间线放大重设计（结果页 DOM）：节点名 13 / 时间 12、图标再大一档、三态明显 ---------- */


.plan31-page .p31-prn{
    color: #1a1f36;
}








.plan31-page .p31-prn.is-done .p31-prl{ color: #1a1f36; }

[data-theme="dark"] .plan31-page .p31-prn .p31-prl{ color: #eef1ff; }
[data-theme="dark"] .plan31-page .p31-prn em{ color: #6b85ff; }
[data-theme="dark"] .plan31-page .p31-prn.is-show .p31-prl,
[data-theme="dark"] .plan31-page .p31-prn.is-show em{ color: #ff8cc0; }

/* ③ v1.6.85②：锁定页兜底海报那排进度节点已整条删除（这一段的放大口径随之作废） */

/* ② DOM 降级海报：演出条目同款专属差异化 */
.p35-it.is-core{ background: linear-gradient(118deg, rgba(245,158,11,.12), rgba(219,39,119,.12) 46%, rgba(124,58,237,.10)); border-radius: 14px; padding: 10px 10px 10px 8px; }
.p35-it.is-core .p35-trow strong{ font-size: 18px; font-weight: 700; color: #d6457f; }
.p35-it.is-core .p35-trow strong::before{ content: '★ '; color: #d6457f; }
.p35-it.is-core > b.mono{ background: linear-gradient(135deg,#db2777,#7c3aed) !important; }
[data-theme="dark"] .p35-it.is-core .p35-trow strong{ color: #ff8cc0; }

/* ---------- ④ 补齐信息卡「开场」：标准时间选择器 + 空态「如 19:30」+ 未填写提示贴字段旁 ---------- */
.p31-gate .p31-pf{ display: block; margin: 0 0 12px; }
.p31-gate .p31-pf > span{ display: block; margin-bottom: 6px; font-size: 12px; font-weight: 700; color: #1a1f36; }
.p31-gate .p31-pin{ height: 42px; padding: 0 12px; font-size: 14px; font-weight: 600; color: #1a1f36; }
.p31-tfield{ position: relative; display: block; }
.p31-tfield .p31-pin{ width: 100%; }
.p31-pin[type="time"]{
  -webkit-appearance: none; appearance: none;
  height: 42px; padding: 0 12px; font-size: 16px; font-weight: 700;
  color: #1a1f36; -webkit-text-fill-color: #232849; background: #fff;
}
.p31-pin[type="time"]::-webkit-date-and-time-value{ text-align: left; color: #1a1f36; -webkit-text-fill-color: #232849; }
.p31-pin[type="time"]::-webkit-calendar-picker-indicator{ opacity: .5; }
.p31-tfield .p31-tph{
  position: absolute; left: 10px; top: 50%; transform: translateY(-50%);
  /* 白底和输入框同色：正好盖住原生空值自带的「--:--」，看着就是一行 placeholder */
  padding: 2px 4px; border-radius: 6px; background: #fff;
  font-size: 14px; font-weight: 600; color: #5a6178; pointer-events: none;
}
.p31-tfield.has-val .p31-tph{ display: none; }
.p31-tfield.has-val .p31-terr{ display: none; }
.p31-terr{
  position: absolute; right: 10px; top: 50%; transform: translateY(-50%);
  padding: 3px 8px; border-radius: 999px; font-size: 11px; font-weight: 700;
  color: #8a5a00; background: rgba(245,158,11,.14);
}
[data-theme="dark"] .p31-gate .p31-pf > span{ color: #eef1ff; }
[data-theme="dark"] .p31-tfield .p31-tph{ color: #a8b0c8; background: #1b1f36; }

/* ============================================================================
   v1.6.80 · AI 计划（按老板 3 条 · 新图 1/2/3）
   ① 场次卡内容往左上：首屏 / 参数页 hero（.p31-hero）与锁定页长图封面（画布侧见 share.js）
      同口径 —— 撤掉 v1.6.78 的整块垂直居中，文字贴左上、卡片随之收矮。
   ② 时间线推倒重做：一根贯通渐变主轴 + 实心里程碑节点（白外环 + 白色矢量图标），
      未开始 = 白底彩环 + 彩色图标；「开演」最大最亮（金 → 品红 → 紫 + 光晕）。
      结果页（.p31-prn）/ 锁定页长图（share.js · sheetProgressBar）/ DOM 降级（.p35-tlnodes）三处同一套。
   ③ 明细小字紧贴标题下方 + 正文不再灰（长图 canvas 侧见 share.js 的 descLead / descBase / SHEET_INK）。
   ============================================================================ */

/* ---------- ① 场次卡：文字块贴左上（撤掉垂直居中） ---------- */


.p35-cover.has-badge{ padding-top: 20px; padding-bottom: 24px; }

/* ---------- ② 结果页时间线：贯通主轴 + 实心节点 ---------- */













/* ============================================================================
   v1.6.81 · AI 计划九条修版（按老板 9 张图 · 图序对齐）
   ① 出发地区：区县 + 具体位置并排一行两个框（原来上下两行）
   ② 生成中卡片：进度条左端被裁出来的残影 + 卡片下方那层投影，一并去掉
   ③⑨ 时间线推倒重做（合并）：克制尺寸 —— 节点 22 / 开演 26 / 图标 12·14 / 名称 12 / 时间 11 / 主轴 4，
        结果页（.p31-prn）/ 锁定页长图（share.js · sheetProgressBar）/ DOM 降级（.p35-tlnodes）三处同一套
   ④ 两枚胶囊等宽等高、文字居中（右列改成单列栅格，两枚一起撑到较宽那枚的宽度）
   ⑤ 确认后自动收起（行为在 app.js，这里只保证折叠态基线一致）
   ⑥ 「还差这几条，补上更准」多给 3–5 条（纯函数在 ai-plan.js）
   ⑦ 场次卡文字左上起排 + 一行先用满宽度再换行（长图封面见 share.js 的 coverPadL/R）
   ⑧ 明细上移：贴到标题下方、可用宽度与高度都用满
   ============================================================================ */

/* ---------- ① 出发地区：一行两个框（左区县 / 右具体位置）---------- */
.p32-region-big .p32-region-row{ display: grid; grid-template-columns: 1fr 1fr; gap: 10px; align-items: stretch; min-width: 0; }
.p32-region-big .p32-region-row .p32-region-pick,
.p32-region-big .p32-region-row .p32-exact{
  min-width: 0; height: 44px; box-sizing: border-box; margin-top: 0; border-radius: 13px; font-size: 12px;
}
.p32-region-big .p32-region-row .p32-region-pick{ padding: 0 9px; gap: 4px; }
.p32-region-big .p32-region-row .p32-region-pick .p32-val{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p32-region-big .p32-region-row .p32-region-pick .p32-chev{ flex: none; display: inline-flex; }
.p32-region-big .p32-region-row .p32-exact-wrap{ position: relative; display: block; min-width: 0; }
.p32-region-big .p32-region-row .p32-exact{ width: 100%; padding: 0 9px; }

/* ---------- ② 生成中卡片：进度条两端干净、卡片下方不再压一层阴影 ---------- */
.plan31-page .plan-ai-loading{ box-shadow: inset 0 1px 0 rgba(255,255,255,.92); }
.plan31-page .plan-ai-loading .plan-ai-bar{ box-shadow: none; }
/* v1.6.82：v1.6.81 那条「流光点跟着进度头走」的 clamp 覆盖段随那颗亮点一起删掉 */

/* ---------- ③⑨ 时间线：克制版（结果页 DOM）---------- */


.plan31-page .p31-prail-fill{ box-shadow: none; }

.plan31-page .p31-prn .p31-prd{
   position: relative;
    border: 1.5px solid rgba(124,92,240,.42);
  background: #fff; color: #6d5ce7; 
}

.plan31-page .p31-prn.is-done .p31-prd{
  background: linear-gradient(135deg,#556fe8,#2c96bd); border-color: #fff; color: #fff; box-shadow: 0 0 0 2px #fff;
}
.plan31-page .p31-prn.is-cur .p31-prd{
  background: linear-gradient(135deg,#5a52dc,#8a4fe0); border-color: #fff; color: #fff;
  
  
}
.plan31-page .p31-prn.is-show .p31-prd{
    border: 1.5px solid #fff; color: #fff;
  background: linear-gradient(135deg,#f59e0b 0%,#db2777 55%,#7c3aed 100%);
  
}
/* 「开演」的小星标：靠颜色与细节区分，不靠放大 */


.plan31-page .p31-prn .p31-prl{    color: #1a1f36; }

.plan31-page .p31-prn.is-done .p31-prl,
.plan31-page .p31-prn.is-cur .p31-prl{ font-weight: 700; color: #1a1f36; }
.plan31-page .p31-prn.is-show .p31-prl,
.plan31-page .p31-prn.is-show em{ color: #d6457f; font-weight: 700; }
@keyframes p81NodePulse{ 0%,100%{ transform: scale(1); } 50%{ transform: scale(1.07); } }
[data-theme="dark"] .plan31-page .p31-prn .p31-prd{ background: #1b1f36; border-color: rgba(150,150,230,.46); color: #6b85ff; box-shadow: 0 0 0 2px #0a0d1c; }
[data-theme="dark"] .plan31-page .p31-prn.is-done .p31-prd,
[data-theme="dark"] .plan31-page .p31-prn.is-cur .p31-prd,
[data-theme="dark"] .plan31-page .p31-prn.is-show .p31-prd{ border-color: #fff; color: #fff; box-shadow: none; }


/* ---------- ④ 两枚胶囊完全等宽等高、文字居中 ---------- */
.plan31-page .p31-hcol{
  flex: none; display: grid; grid-auto-flow: row; justify-items: stretch; align-items: center;
  gap: 4px; margin-left: auto;
}
.plan31-page .p31-hcol .p31-htag,
.plan31-page .p31-hcol .tm{
  line-height: 20px;
  white-space: nowrap;
  display: inline-flex; align-items: center; justify-content: center; text-align: center;
  width: auto; min-width: 0; margin: 0; box-sizing: border-box;
}
.plan31-page .p31-hcol .p31-htag{ height: 22px; line-height: 20px; padding: 0 8px; font-size: 11px; }
.plan31-page .p31-hcol .tm{ height: 22px; line-height: 20px; padding: 0 8px; font-size: 11px; }
.plan31-page .p31-hb .p31-hcol{ margin-right: 8px; }

/* ---------- ⑧ 明细上移 + 展示区扩大（展开面板）---------- */
.plan31-page .p31-hb.is-open .p31-edit{
  padding-bottom: 0; margin-top: 2px; padding-top: 6px; }
.plan31-page .p31-ero{ min-height: 34px; padding: 8px 11px; line-height: 1.6; }
.plan31-page .p31-eta{ min-height: 76px; padding: 9px 11px; line-height: 1.6; }
.plan31-page .p31-hbdetail{ margin-top: 1px; }

/* ---------- ⑦ 场次卡：文字左上起排、一行先用满宽度 ---------- */
.plan31-page .p31-gig.p31-hero{ align-items: flex-start; justify-content: flex-start; }
.plan31-page .p31-hero .p31-hmain{ min-width: 0; }
.plan31-page .p31-hero .p31-hvenue{ overflow: visible; }
/* ⑦ 长图封面（DOM 降级）同口径：左 24 / 右 16，与画布一致 */
.p35-cover{
  display: flex;
  flex-direction: column;
  justify-content: flex-start; padding-left: 24px; padding-right: 16px; }
.p35-cover .p35-sub{ max-width: none; }

@media (prefers-reduced-motion: reduce){
  .plan31-page .p31-prn.is-cur .p31-prd{ animation: none !important; }
}

/* ============================================================================
   v1.6.82 · AI 计划六条修版（按老板 6 张图 · 图序一一对照）
   ① 生成中进度条那颗白色发光圆点整颗删（规则 / 关键帧 / reduced-motion 名单
      已在 v1.6.76 段落里一并删干净，这里不重复）—— 进度条、百分比、六段步骤、条内流光一个不动。
   ② 六节点时间线「缩一半 + 全不加粗」：结果页 DOM（本段）+ 长图 canvas（share.js · sheetProgressBar）
      + DOM 兜底海报（.p35-tlnodes，本段）三处同一套尺寸与字重，状态只靠颜色区分。
   ③ 日期徽标 / 开演胶囊 / 距开演胶囊：去立体、纯色扁平（同一枚 hero 组件 ⇒ 首页 / 参数页 / 结果页
      / 锁定页一起变；深色模式同规则）。
   ④ 三张 AI 入口卡统一元素：图标容器一律 38px + 同一枚品牌星标打底（淡水印）+ AI 标贴提亮；
      三个 AI 页面再叠一层极淡水印（一行可摘）。
   ⑤ 「未填写」提示离框远一点：卡片顶部内边距 14px、标签与胶囊间距 8px（五处同一口径）。
   ============================================================================ */

/* ---------- ② 六节点时间线：缩到一半左右，且一个字都不加粗 ---------- */

.plan31-page .p31-prail{ top: 9px;  box-shadow: inset 0 1px 1px rgba(31,38,135,.07); }


.plan31-page .p31-prn .p31-prl{ font-size: 11px;   }

/* 三种状态的加粗全部拆掉（原来 700 / 800）—— 只靠颜色区分：已过蓝紫、当前紫、开演金紫 */

/* ---------- ③ 日期徽标 / 开演胶囊 / 距开演胶囊：纯色扁平（无渐变 / 无高光 / 无投影 / 无模糊）---------- */
.plan31-page .p31-hero .p31-hdate{
  background: rgba(255,255,255,.22);
  border: 1px solid rgba(255,255,255,.45);
  box-shadow: none;
  -webkit-backdrop-filter: none; backdrop-filter: none;
}
.plan31-page .p31-hero .p31-hdate b{ color: #fff; text-shadow: none; }
.plan31-page .p31-hero .p31-hdate i{ color: #ffffff;  }
.plan31-page .p31-hero .p31-htime{
  color: #1a1f36; background: rgba(255,255,255,.94); border: 1px solid rgba(255,255,255,.6);
  border-radius: 12px; box-shadow: none;
   
}
/* 「开演胶囊」那道流光（p31HtimeShine）本轮下线 —— 扁平化不留动效残留 */
.plan31-page .p31-hero .p31-htime::after{ display: none; animation: none; }
.plan31-page .p31-hero .p31-htime.is-todo{
  color: #1a1f36; background: rgba(255,255,255,.86);
  border-style: dashed; border-color: rgba(255,255,255,.62); box-shadow: none;
}
.plan31-page .p31-hero .p31-hleft{
  background: rgba(255,255,255,.94); border: 1px solid rgba(255,255,255,.6);
  border-radius: 12px; box-shadow: none;
}
.plan31-page .p31-hero .p31-hleft i{ color: #5a6178; }
.plan31-page .p31-hero .p31-hleft b{ color: #1a1f36; }
[data-theme="dark"] .plan31-page .p31-hero .p31-hdate{
  background: rgba(255,255,255,.16); border-color: rgba(255,255,255,.34); box-shadow: none;
}
[data-theme="dark"] .plan31-page .p31-hero .p31-htime,
[data-theme="dark"] .plan31-page .p31-hero .p31-hleft{
  color: #fff; background: rgba(255,255,255,.16); border-color: rgba(255,255,255,.34); box-shadow: none;
}
[data-theme="dark"] .plan31-page .p31-hero .p31-hleft i,
[data-theme="dark"] .plan31-page .p31-hero .p31-hleft b{ color: #fff; }

/* ---------- ④ 三张 AI 入口卡：统一图标容器 + 品牌星标打底 + AI 标贴提亮 ---------- */
/* 打底水印：渐变主卡用白星，两张白卡用实心星 —— 位置 / 尺寸三张完全一致，pointer-events:none 不挡点击 */
.plan31-page .p31-cta::before{
  content: ''; position: absolute; right: -18px; bottom: -30px; width: 92px; height: 92px;
  background-repeat: no-repeat; background-position: center; background-size: contain;
  pointer-events: none;
}
.plan31-page .p31-cta.is-main::before{ background-image: url('/logo/icon-white.svg'); opacity: .16; }

/* 卡片内容抬到水印上面 */
.plan31-page .p31-cta .p31-ic,
.plan31-page .p31-cta .p31-cta-t,
.plan31-page .p31-cta .p31-arr{ position: relative; z-index: 1; }
/* 图标容器三张统一（删掉 .is-mini 的 34px 覆盖 —— 那就是「不像一家人」的来源） */
.plan31-page .p31-cta .p31-ic,
.plan31-page .p31-cta.is-sub .p31-ic{ width: 38px; height: 38px; border-radius: 12px; }
.plan31-page .p31-cta .p31-ic svg{ width: 20px; height: 20px; }
/* AI 标贴：纯白底 + 亮蓝字（替掉发深的 #5340c8），两枚完全一致；深色模式同一套 */
.plan31-page .p31-cta .p31-cta-t b .ai-tag,
.plan31-page .p31-cta .ai-tag{
  position: static; display: inline-flex; align-items: center; height: 18px; padding: 0 8px; margin-left: 6px;
  border-radius: 999px; font-size: 11px; font-weight: 700; letter-spacing: .3px; line-height: 1; vertical-align: 1px;
  color: #4a6cf7; background: #FFFFFF; border: 1px solid rgba(63,99,245,.45);
  box-shadow: 0 0 8px rgba(63,99,245,.22);
}
/* v1.8.03 ①：这条深色「白底蓝字」作废 —— 四处的 AI 标贴统一金底深字，深色主题同一支（见上） */
/* 三个 AI 页面（计划首页 / 参数页 / 结果页）再叠一层极淡水印：同一枚星标、右下角、220px、opacity ≤ .04 */
.plan31-page::before{
  content: ''; position: absolute; right: -40px; bottom: calc(30px + env(safe-area-inset-bottom));
  width: 220px; height: 220px; z-index: 0; pointer-events: none;
  background: url('/logo/icon-solid.svg') no-repeat center/contain; opacity: .035;
}
[data-theme="dark"] .plan31-page::before{ background-image: url('/logo/icon-white.svg'); opacity: .05; }

/* ---------- ⑤ 「未填写」提示：离卡片上边框 ≥10px、离标签 ≥8px（五处同一口径）---------- */
.plan31-page .p32-box{ padding-top: 14px; }
.plan31-page .p32-box.p32-region-big{ padding-top: 14px; }
.plan31-page .p32-trow{ gap: 8px; }
.plan31-page .p32-region-big .p32-trow{ gap: 8px; }
.plan31-page .p32-tcol .p32-trow{ gap: 8px; }
.plan31-page .p32-err{ margin-left: 2px; }

/* ============================================================================
   v1.6.83 · AI 计划三条修版（按老板 3 张图 · 图序一一对照）
   ① 锁定页长图里那条时间线**整条作废**，照抄确认页那条（老板图 1 = 改哪里，图 2 = 照它做）：
      三处（确认页 DOM / 长图 canvas / DOM 兜底海报）从此共用 plan-timeline.js 这一份值 ——
      页面与兜底海报吃本段生成的 --tl-* 变量，canvas 直接 import 同一份常量（share.js · sheetProgressBar）。
      ⚠️ 确认页那条本身**一个字不动**（它是标准件），所以本节给 `.p31-prog` 的都是它现有的最终计算值。
      ⚠️ v1.6.85 ②（老板图 2「这个时间线删除」）：本轮把**锁定页 / 长图里那条**整条删除
         ⇒ 这一份值现在的消费者只剩确认前手册页的 `.p31-prog` 一处（canvas 那份 import 已摘掉）。
   ② 交通 / 人数 的「未填写」胶囊：与标签同一水平线、且光学居中（五处同一口径）。
   ③ 参数页压缩：不滚动就能完整看到「开始推算」（下面每一块都收一点，按钮本身不缩）。
   ============================================================================ */

/* ---------- ① 时间线卡片：确认页那条（v1.6.85 起锁定页与长图里那条整条删除，只剩它这一处）---------- */
.plan31-page .p31-prog{
  padding: var(--tl-card-pad, 9px 10px 8px);
  border-radius: var(--tl-card-radius, 18px);
  border: var(--tl-card-border-w, 1px) solid var(--tl-card-border, rgba(150,150,230,.28));
  background:
    linear-gradient(120deg, rgba(255,255,255,.99), rgba(248,248,255,.98)) padding-box,
    linear-gradient(120deg, rgba(85,111,232,.34), rgba(124,92,240,.30), rgba(44,150,189,.28)) border-box;
  box-shadow: var(--tl-card-shadow, 0 10px 26px rgba(53,40,150,.075));
  position: relative; overflow: hidden;
}
/* ---------- ① 确认页那条（DOM）：尺寸全部改吃共享变量 ---------- */
.plan31-page .p31-prnodes{
  min-height: 44px; position: relative; min-height: var(--tl-row-min-h, 49px); padding-top: 1px; align-items: flex-start; }
.plan31-page .p31-prail{
  left: var(--tl-rail-inset, 8%); right: var(--tl-rail-inset, 8%);
  top: var(--tl-rail-top, 9px); height: var(--tl-rail, 2.5px);
}
.plan31-page .p31-prn{
  text-align: center; grid-template-rows: 19px auto auto; row-gap: 2px; }
.plan31-page .p31-prn .p31-prd{
  transition: transform .22s cubic-bezier(.22,.8,.3,1), box-shadow .22s, background .22s, color .22s;
  align-self: center;
  width: var(--tl-node, 15px); height: var(--tl-node, 15px);
  border-width: var(--tl-stroke, 1px); border-color: var(--tl-node-border, rgba(124,92,240,.42));
  box-shadow: 0 0 0 var(--tl-ring, 1.5px) #fff;
}
.plan31-page .p31-prn .p31-prd svg{ width: var(--tl-icon, 9px); height: var(--tl-icon, 9px); stroke-width: 1.6; }
.plan31-page .p31-prn.is-show .p31-prd{
  width: var(--tl-show, 17px); height: var(--tl-show, 17px);
  box-shadow: 0 0 0 var(--tl-ring, 1.5px) #fff, 0 2px 6px rgba(219,39,119,.16);
}
.plan31-page .p31-prn.is-show .p31-prd svg{ width: var(--tl-icon-show, 10px); height: var(--tl-icon-show, 10px); stroke-width: 1.7; }
.plan31-page .p31-prn.is-show .p31-prd::after{
  content: '';
  position: absolute;
  border-radius: 50%;
  background: #f59e0b;
  width: 5px;
  height: 5px;
  top: -1px;
  right: -1px;
  box-shadow: 0 0 0 1px #fff; width: var(--tl-dot, 5px); height: var(--tl-dot, 5px); box-shadow: 0 0 0 var(--tl-dot-ring, 1px) #fff; background: var(--tl-dot-color, #f59e0b); }
.plan31-page .p31-prn.is-cur .p31-prd{ box-shadow: 0 0 0 var(--tl-ring, 1.5px) #fff, 0 0 0 3.5px rgba(124,92,240,.12);  }
.plan31-page .p31-prn .p31-prl{ font-size: var(--tl-label, 10.5px); font-weight: var(--tl-weight, 400); line-height: 1.2; color: var(--tl-label-color, #232849); }
.plan31-page .p31-prn em{
  white-space: nowrap;
  color: #5a6178;
  font-size: 11px;
  font-weight: 400; min-height: 12px; font-size: var(--tl-time, 9.5px); font-weight: var(--tl-weight, 400); line-height: 1.2; color: var(--tl-time-color, #3a3f60); }
.plan31-page .p31-prn.is-done .p31-prl,
.plan31-page .p31-prn.is-cur .p31-prl,
.plan31-page .p31-prn.is-show .p31-prl,
.plan31-page .p31-prn.is-show em{ font-weight: var(--tl-weight, 400); }
.plan31-page .p31-prn.is-show .p31-prl,
.plan31-page .p31-prn.is-show em{ color: var(--tl-show-color, #9d174d); }


/* ---------- ② 「未填写」提示：五处同一口径，且与标签光学居中（往上半个身位）---------- */
.plan31-page .p32-box .p32-trow .p32-lb{ margin: 0; }
.plan31-page .p32-trow .p32-err{ align-self: center; margin-bottom: 2px; }
.plan31-page .p32-box.p32-region-big .p32-trow .p32-lb{ margin: 0; }

/* ---------- ③ 参数页压缩：让「开始推算」首屏完整可见（按钮本身不缩，点按高度 ≥44px）---------- */
/* 1 · 场次卡（页面唯一不滚的那块，压它等于把滚动区的可视高度还回来） */




.plan31-page .p31-hero .p31-hdate i{
  text-shadow: none; font-size: 11px; }
.plan31-page .p31-hero .p31-htime{
  -webkit-backdrop-filter: none;
  backdrop-filter: none; padding: 2px 9px; font-size: 12px; }
.plan31-page .p31-hero .p31-hleft{ padding: 4px 9px; }
.plan31-page .p31-hero .p31-hleft i{ font-size: 11px; }
.plan31-page .p31-hero .p31-hleft b{ font-size: 11px; }
.plan31-page .p31-hero .p31-hrow{ grid-template-columns: 56px minmax(0, 1fr) auto; gap: 10px; }
/* 2 · 参数卡外壳 */

/* 3 · 出发地区：两框降一档、板块底边距收一点 */
.plan31-page .p32-region-big .p32-region-pick,
.plan31-page .p32-region-big .p32-exact{ height: 38px; }

/* 4 · 开始 / 结束 */
.plan31-page .p32-date{ height: 30px; }
.plan31-page .p32-trow .p32-date{ margin-top: 0; }
.plan31-page .p32-tcol .p32-trow{ margin-bottom: 5px; }

.plan31-page .p32-hr{ height: 24px; }
.plan31-page .p32-tcol .p32-hr{ height: 22px; }
/* 5 · 交通 */

.plan31-page .p32-mode i svg{ width: 15px; height: 15px; }
/* 6 · 人数 / 档位 */
.plan31-page .p32-num{ height: 25px; }
.plan31-page .p32-tier{ padding: 3px 2px; }
.plan31-page .p32-tier b{ font-size: 12px; }
/* 7 · 板块间隙 */

.plan31-page .p32-trow{ margin-bottom: 3px; }
/* 卡片四边内边距同步收 1px（**顶部 14px 不动** —— 上一轮老板要的「离框 ≥10px」是红线） */
.plan31-page .p32-box{ padding: 14px 6px 6px; }
/* 8 · 小屏兜底：「开始推算」吸底常显（滚动时既不被内容盖住，也不盖住内容） */
.plan31-page .p31-pgo{ margin-top: 2px; }


.plan31-page .p32-region-big{ padding-bottom: 6px; }
.plan31-page .p32-mode{ padding: 3px 4px 4px; }
@media (max-height: 760px){
  .plan31-page .p31-pgo{ position: sticky; bottom: calc(74px + env(safe-area-inset-bottom)); z-index: 5; }
}

/* ============================================================================
   v1.6.84 · 自行计划页精简（老板 2 图 3 条）—— 只作用于 `.p2-manual`（这一页），其它页面一个字不动
   （详注见 git 历史 · W-023 样式表瘦身） */
/* ① 顶部（老板图 1 红框那块）：标题 → 15px · 小字两行 · 块上下留白一起收 */
.p2-manual .p2-manualbar{ margin-bottom: 8px; }
.p2-manual .plan-head{ margin: 2px 2px 0; }
.p2-manual .plan-head h2{ font-size: 16px; }
.p2-manual .plan-head p{ margin-top: 3px; font-size: 11px; line-height: 1.35; gap: 1px; }
/* ① 全程进度卡：保留（这一页唯一的进度表达），上下留白各收一档、整卡 ≤110px */
.p2-manual .plan-overall{ margin: 7px 0 2px; padding: 8px 14px 6px; }
.p2-manual .plan-overall-p{ font-size: 22px; }
.p2-manual .plan-overall-bar{ margin-top: 6px; height: 8px; }
.p2-manual .plan-overall-ft{ margin-top: 4px; }
/* ① 块与块之间的节奏收一档（只作用这一页；卡片内部与清单行本身不动） */
.p2-manual .p31-mans{ margin: 8px 0 4px; }
.p2-manual .p31-msrow{ margin-top: 8px; }
.p2-manual .plan-list{ padding: 8px 12px 2px; }
.p2-manual .plan-day{ margin: 11px 4px 6px; }
.p2-manual .plan-row{ margin-bottom: 6px; }
.p2-manual .plan-card{ padding: 9px 12px 9px 15px; }
.p2-manual .plan-notes{ margin: 10px 2px 4px; }
/* 底部预留（原本 132px）收 20px：内容末尾到导航坞之间不再多留一条空白 */
.plan-page.p2-manual{ padding-bottom: 112px !important; }
/* ③ 底部工具栏：一排两颗等宽（生成长图 / 导入整份计划）+ 单独一行「删除计划」（红字，danger）——
   375px 下三颗挤一行会把「导入整份计划」折成两行（v1.6.67 红线：小屏不裁切不溢出），
   所以删除按规格里那句「放最右**或单独一行**」走单独一行；二次确认条吸在导航坞上方，永远看得见。 */
.p2-manual .p31-manbar{ display: block; margin: 8px 0 12px; }
.p2-manual .p31-manrow{ display: flex; gap: 8px; }
.p2-manual .p31-manrow .p31-mbtn{ flex: 1 1 0; min-width: 0; justify-content: center; }
.p2-manual .p31-mdel{
  width: 100%; margin-top: 8px; cursor: pointer; font-family: inherit; font-size: 12px; font-weight: 700;
  padding: 9px 12px; border-radius: 12px; display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  color: #dc3545; background: #fff; border: 1px solid rgba(239,68,68,.34);
}
.p2-manual .p31-mdel:active{ transform: scale(.98); }
.p2-manual .p31-cf{
  display: flex; align-items: center; gap: 8px; margin-bottom: 8px; padding: 10px 12px;
  border-radius: 14px; background: #fff5f5; border: 1px solid rgba(239,68,68,.28);
  /* 老板原话「点删除 → 确认条必须立刻出现在可见位置」：吸在底部导航坞上方，不靠滚动 */
  position: fixed; left: 10px; right: 10px; bottom: calc(70px + env(safe-area-inset-bottom));
  z-index: 40; margin: 0; box-shadow: 0 12px 30px rgba(120,20,30,.16);
}
.p2-manual .p31-cf > span{ flex: 1 1 auto; font-size: 12px; line-height: 1.5; font-weight: 700; color: #5a6178; }
.p2-manual .p31-cf-no, .p2-manual .p31-cf-yes{
  flex: none; cursor: pointer; font-family: inherit; font-size: 12px; font-weight: 700;
  padding: 7px 12px; border-radius: 999px;
}
.p2-manual .p31-cf-no{ color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.34); }
.p2-manual .p31-cf-yes.is-danger{ color: #fff; border: 0; background: linear-gradient(96deg,#dc2626,#b91c1c); }
[data-theme="dark"] .p2-manual .p31-cf{ background: #2a1014; border-color: rgba(248,113,113,.4); box-shadow: 0 12px 30px rgba(0,0,0,.5); }
[data-theme="dark"] .p2-manual .p31-cf > span{ color: #ff9d9d; }
[data-theme="dark"] .p2-manual .p31-mdel{ color: #ff9d9d; background: rgba(60,20,26,.7); border-color: rgba(248,113,113,.35); }

/* ============================================================================
   v1.6.85 · AI 计划四条修版（按老板 5 图 · 图序一一对照）—— 全部只作用 `.plan31-page`
   ① 锁定页顶栏「上一步」（按钮样式沿用 `.p31-hbtn`，只保证两枚并排、间距 8px）
   ② 锁定页 / 长图里那条六节点时间线**整条删除**（页面 DOM、长图 canvas、DOM 兜底海报三处，
      相关 CSS 已随本轮施工整段下线）；确认前手册页那条 `.p31-prog` 一个字不动
   ③ 参数页纵向铺满：多余高度均匀分到卡片间距（单处 ≤24px），底部那行正好落在主菜单上方 8–12px
   ④ 「不补了」→ 整行变绿打勾（CHECK 图标，不许 emoji），可撤销；全打完钩整块收起（点标题还能展开）
   ⑤ 长图首帧即内容：DOM 版先铺满（同步），高清 canvas 后台画完再 200ms 淡入替换
   ============================================================================ */
/* ① 顶栏两枚按钮：上一步在左、重新生成在右（等高、8px 间距，标题仍省略号） */
.plan31-page .back-bar .bb-actions .p31-hbtn{ white-space: nowrap; }
.plan31-page .back-bar .bb-actions .p31-hbtn + .p31-hbtn{ margin-left: 0; }

/* ② 锁定页那张长图：整张铺满（去掉外层白卡与四周留白 —— v1.6.71 老板图 7 的口径保持不变） */
.plan31-page .p31-locked .p31-poster{ position: relative; }
.plan31-page .p31-locked .p31-poster[data-first="dom"] [data-poster-host] > .p35-poster{ margin: 0; }
/* ⑤ v1.6.90（老板图 1「有被切的情况」）：这里原来那套「DOM 版与 canvas 版高度对齐（--p35-add /
      --p35-tail）+ 画完 200ms 淡入换上」整段下线 —— 大画布不再上屏，页面里只有 DOM 版长图，
      既不需要对齐高度，也不再有合成层（真机那条被切就是这么来的，见 app.js · planAiPosterPaint）。 */

/* ③ 参数页纵向铺满：可用高度 = `.p31-body` 的高度（页面已「绝对定位铺满 + 底部让出导航坞 + 安全区」） */
/*   4px 是「页面给导航坞留的那条带」与导航坞实体之间的差：不留这一手，参数卡最底下 4px 会压进导航坞里 */
.plan31-page[data-p="params"] .p31-body{ display: flex; flex-direction: column; padding-bottom: 4px; }
.plan31-page[data-p="params"] #plan-ai-host{ display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.plan31-page[data-p="params"] .p31-params{ flex: 1 1 auto;  flex-direction: column;  }
/* 卡片本身一个像素都不涨：多出来的高度只进「行与行之间」的间距（上限 24px，见 app.js · planAiParamsFill） */
.plan31-page[data-p="params"] .p32-grid{ flex: 0 0 auto;  }
/* 剩下的高度全部留给底部那行 ⇒ 配额行底沿到主菜单顶沿 8–12px（`@media (max-height:760px)` 的吸底兜底照旧生效） */
.plan31-page[data-p="params"] .p31-pgo{ margin-top: auto; }

/* v1.8.01（老板图 11/12）：「不补了 / 已处理 / 折叠态」这组样式随整块下线 —— 规则整组删除，不留死代码。 */

/* ============================================================================
   v1.6.87 · AI 计划首屏改版（老板 5 条 · 图序对齐）—— 只覆盖这一页首屏的四张卡
   ----------------------------------------------------------------------------
   ① 首屏不再顶场次卡（planAiGigVisible 对 home 返回 false）：四张卡一排到底 + 配额行在最底
   ② 统一化（老板第 5 条）：四张卡同宽 / 同圆角 / 同内距 / 同图标容器 / 同字号 / 同箭头、间距一致；
      层级只保留一档 —— 「AI 推荐行程」= 唯一渐变强调卡，导入 / 自行 / 历史 = 同款浅底白卡
      （旧的「一大两小 + 青蓝 / 紫 / 虚线三种形态」在 .is-sub 上被统一覆盖）
   ③ 副文案一律深墨色 #2b2f4a（不许灰 —— 质量门①守着）
   ============================================================================ */
.p31-home{ gap: 10px; }
.p31-home .p31-cta{ margin: 0; padding: 16px 15px; border-radius: 12px; min-height: 84px; }
.p31-home .p31-cta.is-main,
.p31-home .p31-cta.is-sub{ flex: 1 1 0; min-height: 84px; }
/* 主卡给一条透明边：与三张白卡的 1px 描边同厚 → 四张卡高度逐像素一致（border-box，视觉不变） */
.p31-home .p31-cta.is-main{ border: 1px solid transparent; }
.p31-home .p31-cta .p31-ic{ width: 38px; height: 38px; border-radius: 12px; }
.p31-home .p31-cta .p31-ic svg{ width: 20px; height: 20px; }
.p31-home .p31-cta .p31-cta-t b{ font-size: 16px; }
.p31-home .p31-cta .p31-cta-t span{ font-size: 12px; }
/* 非主卡 = 同款浅底白卡（导入 / 自行 / 历史三张完全一致，只有标题文案不同） */
.p31-home .p31-cta.is-sub{
  color: #1a1f36; background: #fff; border: 1px solid rgba(150,150,230,.30);
  box-shadow: 0 10px 22px -18px rgba(31,38,135,.42);
}
.p31-home .p31-cta.is-sub::after{ display: none; }
.p31-home .p31-cta.is-sub .p31-cta-t b{ color: #1a1f36; }
.p31-home .p31-cta.is-sub .p31-cta-t span{ color: #1a1f36; }
.p31-home .p31-cta.is-sub .p31-ic{
  color: #6d5ce7; background: rgba(124,92,240,.10); border: 1px solid rgba(124,92,240,.18); box-shadow: none;
}
/* 非主卡与主卡同一套水印（三张图标底色统一成白卡的紫系，不再青蓝 / 紫两种底） */
.plan31-page .p31-cta.is-sub::before{ background-image: url('/logo/icon-solid.svg'); opacity: .07; }
/* 历史计划卡：与其它三张同骨架，只多一枚 .is-hist 钩子（便于将来单独调，不改骨架） */
.plan31-page .p31-cta.is-hist{ position: relative; }
[data-theme="dark"] .p31-home .p31-cta.is-sub{
  background: rgba(28,32,52,.94); border-color: rgba(150,140,255,.30); color: #eef1ff;
}
[data-theme="dark"] .p31-home .p31-cta.is-sub .p31-cta-t b{ color: #eef1ff; }
[data-theme="dark"] .p31-home .p31-cta.is-sub .p31-cta-t span{ color: #a8b0c8; }
[data-theme="dark"] .p31-home .p31-cta.is-sub .p31-ic{ color: #c4b2ff; background: rgba(124,92,240,.20); border-color: rgba(150,140,255,.30); }
/* 历史计划面板：骨架沿用 v1.6.68 那套（.p31-his / .p31-hisl / .p31-hiscf），此处只补空态一行 */


/* ================= v1.6.88 · AI 计划四条线重做 + 全站统一化 =================
   1) 统一步骤条（参数 → 确认 → 成品；自行线 = 编排 → 成品）
   2) 「正在变更」进度条（改时间 / 补待办 → 真重排时的那条）
   3) 计划档案独立页面（按演唱会折叠 + 查看 / 删除 / 还原）
   4) 自由编排编辑页（AI 编辑页模板：增 / 删 / 改 + 确认结果）
   ⚠️ 全局红线：正文一律深色墨水色（#232849 / #2b2f4a），灰字禁令长期生效。 */
.p39-page{
  
  
  
  
  
  overflow-x: hidden;
}
.p39-page .p39-archwrap{ overflow-x: hidden; }

/* ---------- 1. 步骤条（v1.6.89 整块下线：步骤只用页头标题「第 X 步 · 名称」表达）----------
   ⚠️ 别再加回来 —— 长期规范见 docs/ai/06-页面空间体系.md（Z2 只认标题）。 */

/* ---------- 2. 「正在变更」进度条 ---------- */
.p39-busy{
  margin: 8px 0 10px; padding: 10px 12px; border-radius: 14px;
  background: rgba(124,92,240,.08); border: 1px solid var(--p39-line);
}
.p39-busy-h{ display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 700; color: var(--p39-ink); }
.p39-busy-h b{ font-weight: 700; }
.p39-busy-h i{ margin-left: auto; font-style: normal; font-size: 11px; font-weight: 700; color: #5b4bd6; }
.p39-busy-t{ margin-top: 7px; height: 4px; border-radius: 999px; background: rgba(124,92,240,.14); overflow: hidden; }
.p39-busy-t em{ display: block; height: 100%; width: 0; border-radius: 999px; background: var(--grad-cta); transition: width .28s ease; }

/* ---------- 3. 计划档案（独立页面）---------- */
.p39-arch{ display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }
.p39-empty{
  padding: 26px 14px; text-align: center; border-radius: 18px;
  font-size: 12px; color: var(--p39-ink2);
  background: rgba(255,255,255,.94); border: 1px solid var(--p39-line);
}
.p39-grp{ border-radius: 18px; background: rgba(255,255,255,.96); border: 1px solid var(--p39-line); overflow: hidden; }
.p39-ghead{
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
  padding: 12px 13px; border: 0; background: none; font-family: inherit; cursor: pointer;
}
.p39-ghead:active{ transform: scale(.995); }
.p39-gt{ display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1 1 auto; }
.p39-gt b{ font-size: 14px; font-weight: 700; color: var(--p39-ink); }
.p39-gt i{ font-style: normal; font-size: 11px; color: var(--p39-ink2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.p39-gn{ flex: none; font-size: 11px; font-weight: 700; color: #5b4bd6; white-space: nowrap; }
.p39-chev{ flex: none; display: inline-flex; color: #5b4bd6; transition: transform .18s ease; }
.p39-grp.is-open .p39-chev{ transform: rotate(90deg); }
.p39-gbody{ padding: 2px 10px 10px; display: flex; flex-direction: column; gap: 8px; }
.p39-row{
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding: 10px 11px; border-radius: 14px;
  background: rgba(124,92,240,.05); border: 1px solid rgba(124,92,240,.14);
}
.p39-rl{ display: flex; align-items: center; gap: 7px; min-width: 0; flex: 1 1 auto; }
.p39-ch{
  flex: none; font-style: normal; font-size: 11px; font-weight: 700; color: #5b4bd6;
  padding: 3px 8px; border-radius: 999px; background: rgba(124,92,240,.14);
}
.p39-rl b{ font-size: 11px; font-weight: 700; color: var(--p39-ink2); }
.p39-st{ flex: none; font-style: normal; font-size: 11px; font-weight: 700; padding: 3px 7px; border-radius: 999px; color: var(--p39-ink2); background: rgba(35,40,73,.07); }
.p39-st.is-cur{ color: #1a1f36; background: rgba(60,190,140,.16); }
.p39-st.is-draft{ color: #5a6178; background: rgba(240,180,60,.18); }
.p39-rb{ display: flex; align-items: center; gap: 6px; flex: none; margin-left: auto; }
.p39-btn{
  border: 1px solid rgba(124,92,240,.28); background: rgba(255,255,255,.96);
  border-radius: 999px; padding: 7px 12px; min-height: 32px; cursor: pointer;
  font-family: inherit; font-size: 12px; font-weight: 700; color: #5b4bd6;
}
.p39-btn:active{ transform: scale(.98); }
.p39-btn.is-main{ color: #fff; background: var(--grad-cta); border-color: transparent; }

.p39-btn.is-danger{ color: #dc3545; border-color: rgba(192,57,43,.3); background: rgba(192,57,43,.06); }
.p39-btn[disabled]{ opacity: .5; cursor: default; }
.p39-row .p31-cf{ flex: 1 1 100%; }

/* ---------- 4. 自由编排（编辑页）---------- */
/* v1.8.01（老板图 9）：顶部两行文字换成和其他页面同款的场次卡 —— .p39-manhead 整组下线（不留死代码） */
.p39-err{ margin: 8px 0; padding: 9px 12px; border-radius: 12px; font-size: 12px; font-weight: 700; color: #dc3545; background: rgba(192,57,43,.08); border: 1px solid rgba(192,57,43,.24); }
.p39-man{ margin-top: 10px; }
.p39-mlist{ display: flex; flex-direction: column; gap: 9px; }
.p39-mrow{
  display: flex; flex-wrap: wrap; align-items: flex-start; gap: 9px;
  padding: 11px 12px; border-radius: 16px;
  background: rgba(255,255,255,.97); border: 1px solid var(--p39-line);
}
.p39-mrow.is-edit{ flex-direction: column; align-items: stretch; }
.p39-mtime{
  flex: none; min-width: 84px; font-size: 12px; font-weight: 700; color: #5b4bd6;
  padding: 4px 9px; border-radius: 999px; background: rgba(124,92,240,.12); text-align: center;
}
.p39-mt{ display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1 1 auto; }
.p39-mt b{ font-size: 12px; font-weight: 700; color: var(--p39-ink); }
.p39-mt i{ font-style: normal; font-size: 11px; line-height: 1.45; color: var(--p39-ink2); word-break: break-word; }
.p39-mbtns{ flex: none; display: flex; align-items: center; gap: 6px; margin-left: auto; }
.p39-mrow .p31-cf{ flex: 1 1 100%; }
.p39-mform{ display: flex; flex-direction: column; gap: 8px; width: 100%; }
.p39-mline{ display: flex; align-items: center; gap: 8px; }
.p39-mf{ flex: 1 1 0; min-width: 0; }
.p39-mf2{ width: 100%; }
.p39-mto{ flex: none; font-size: 12px; font-weight: 700; color: var(--p39-ink2); }
.p39-mfoot{ display: flex; align-items: center; gap: 10px; margin-top: 12px; }
.p39-madd{
  flex: 1 1 auto; min-height: 44px; border-radius: 14px; cursor: pointer;
  border: 1px dashed rgba(124,92,240,.4); background: rgba(124,92,240,.06);
  font-family: inherit; font-size: 12px; font-weight: 700; color: #5b4bd6;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
}
.p39-mok{
  flex: 1 1 auto; min-height: 48px; border: 0; border-radius: 16px; cursor: pointer;
  background: var(--grad-cta); color: #fff; font-family: inherit; font-size: 14px; font-weight: 700;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
}
.p39-madd:active, .p39-mok:active{ transform: scale(.99); }
.p39-mok[disabled]{ opacity: .5; cursor: default; }
.p39-mhint{ margin-top: 8px;    }
.p39-manalt{ margin: 14px 0 6px; display: flex; }
.p39-manalt .p39-btn{ width: 100%; min-height: 36px; }

/* 深色模式：底色跟着全站走，文字仍用深色墨水色系里的高对比同族（不出现灰字） */
[data-theme="dark"] .p39-grp, [data-theme="dark"] .p39-mrow, [data-theme="dark"] .p39-empty{
  background: linear-gradient(160deg, rgba(30,34,56,.94), rgba(24,28,46,.9)); border-color: rgba(124,92,240,.28);
}
[data-theme="dark"] .p39-gt b, [data-theme="dark"] .p39-mt b, [data-theme="dark"] .p39-busy-h{ color: #eef1ff; }
[data-theme="dark"] .p39-gt i, [data-theme="dark"] .p39-mt i, [data-theme="dark"] .p39-mhint, [data-theme="dark"] .p39-empty{ color: #6b85ff; }
[data-theme="dark"] .p39-rl b, [data-theme="dark"] .p39-st{ color: #eef1ff; }
[data-theme="dark"] .p39-row{ background: rgba(124,92,240,.10); border-color: rgba(124,92,240,.24); }
[data-theme="dark"] .p39-btn{ background: rgba(124,92,240,.14); color: #c4b2ff; border-color: rgba(124,92,240,.34); }
[data-theme="dark"] .p39-btn.is-main, [data-theme="dark"] .p39-btn.is-restore{ color: #fff; }
[data-theme="dark"] .p39-madd{ color: #c4b2ff; }

/* ================= v1.6.89 · AI 计划全页面空间体系（重排 + 收敛） =================
   定版骨架（所有 AI 计划页面自上而下；长期规范见 docs/ai/06-页面空间体系.md）：
     Z1 页头 44px：左 = 返回（唯一出口 · 30×30 圆钮）；中 = 标题 16px/600 居中；右 = 永远留空
     Z2 步骤：只用标题表达「第 X 步 · 名称」（v1.6.88 那条横向步骤条已整块下线，别再加回来）
     Z3 主体：唯一滚动区；左右内距 16px；首块顶距 8px
     Z4 操作区：吸底（主菜单上方 8px + 安全区）；最多 2 枚按钮（同高 46px）+ 一条 12px 小字动作行
     Z5 主菜单：不动
   红线：说明文字一律深色系 70%（禁用浅灰 #9?? 系）；禁止横向滚动；375×812 基准 + 320 宽适配。 */

/* ---------- Z1 · 页头（返回唯一出口） ---------- */
.plan31-page{
  padding: 0 12px calc(74px + env(safe-area-inset-bottom)) !important; padding-left: 16px !important; padding-right: 16px !important; padding-bottom: calc(82px + env(safe-area-inset-bottom)) !important; }
.plan31-page > .back-bar{
  
  
   gap: 8px;
}
.plan31-page > .back-bar .bb-back{ width: 30px; height: 30px;   border-radius: 50%; }
.plan31-page > .back-bar .bb-title{ font-size: 16px; font-weight: 600;   }


/* ---------- Z3 · 主体（唯一滚动区） ---------- */
.plan31-page .p31-body{
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  touch-action: pan-y; padding-top: 0; }
.plan31-page .p31-body > *:first-child{ margin-top: 8px; }

/* ---------- Z4 · 操作区（吸底：主菜单上方 8px + 安全区） ---------- */
.p31-bar{ gap: 10px; }
.p31-bar .p31-pill, .p31-bar .p31-save{ min-height: 46px; height: 46px; padding: 0 14px; border-radius: 12px; font-size: 14px; }
.p31-bar .p31-pill{ flex: 1 1 0; color: #5b4bd6; background: rgba(255,255,255,.96); border: 1px solid rgba(150,150,230,.34); box-shadow: none; }
.p31-bar .p31-save{ flex: 1 1 0; }
.p31-srow{ display: flex; align-items: center;   margin-top: 2px; min-height: 44px; }
.p31-sbtn{
  min-height: 44px; padding: 0 8px; border: 0; background: none; cursor: pointer;
  font-family: inherit; font-size: 12px; font-weight: 700; color: #6b7390;
}
.p31-sbtn:active{ transform: scale(.97); }
.p31-sbtn.is-danger{ color: #dc3545; }
[data-theme="dark"] .p31-sbtn{ color: #6b85ff; }
[data-theme="dark"] .p31-sbtn.is-danger{ color: #ff9d9d; }

/* ---------- 确认页 · 摘要条（两行：状态/条数/核对 + 事实/依据） ---------- */
.plan31-page .p31-sumcard{ padding: 11px 12px 10px; }
.plan31-page .p31-sumcard .p31-sumtop{ align-items: center; flex-wrap: nowrap; gap: 8px; margin-bottom: 5px; }
.p31-sumr{ margin-left: auto; display: inline-flex; align-items: center; gap: 6px; }
.p31-sumchk{ display: inline-flex; align-items: center; gap: 6px; }
.p31-sumchk [data-checkbar]{ font-size: 11px; font-weight: 700; color: #1a1f36; }
.p31-sumline{ display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.p31-facts{ font-size: 11px; line-height: 1.5; color: #6b7390; }
.plan31-page .p31-sumcard .p31-basis2.is-compact{ margin: 0; padding: 0; border: 0; background: none; }
.p31-basis2.is-compact summary{ padding: 0 2px; min-height: 22px; }
.p31-sumcard .p31-basis2.is-compact .p31-basisline{ font-size: 11px; font-weight: 700; color: #5b4bd6; }
.plan31-page .p31-sumcard .p31-basis2.is-compact p{ margin: 6px 2px 0; }
[data-theme="dark"] .p31-facts{ color: #6b85ff; }
[data-theme="dark"] .p31-sumchk [data-checkbar]{ color: #eef1ff; }
@media (max-width: 340px){
  .plan31-page .p31-sumcard .p31-sumtop{ flex-wrap: wrap; }
  .p31-sumr{ margin-left: 0; width: 100%; }
}

/* ---------- 自由编排：吸底操作区（主「确认结果」｜次「新增环节」）+ 条件提示 ---------- */
.p39-manbody{ display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.p39-page[data-empty="1"] .p31-body{ justify-content: center; }

.p39-mactions{
  flex: none; position: relative; z-index: 5; padding: 8px 0 0; margin-top: 8px;
  background: linear-gradient(180deg, rgba(238,240,252,0), rgba(236,238,252,.92) 46%, rgba(236,238,252,.99));
}
.p39-mactions .p31-bar{ gap: 10px; }
.p39-mactions .p39-madd{
  flex: 1 1 0; min-height: 46px; border-radius: 14px; font-size: 14px;
  border: 1px solid rgba(150,150,230,.34); background: rgba(255,255,255,.96); color: #5b4bd6;
}
.p39-mactions .p39-mok{ flex: 1 1 0; min-height: 46px; border-radius: 14px; font-size: 14px; }
.p39-mactions .p39-mhint{ margin: 0 0 6px; }
.p39-mhint{ text-align: center; font-size: 11px; line-height: 1.4; color: #6b7390; }
[data-theme="dark"] .p39-mhint{ color: #6b85ff; }
[data-theme="dark"] .p39-mactions{ background: linear-gradient(180deg, rgba(20,24,42,0), rgba(18,22,38,.92) 46%, rgba(18,22,38,.99)); }

/* ---------- 空态不空：垂直居中 + 品牌水印打底 ---------- */
.p39-page{
  --grad-cta: linear-gradient(118deg,#4f46c8 0%,#6b52d9 46%,#2b7fae 100%);
  --grad-iris: linear-gradient(120deg,#7ee0ff 0%,#b58cff 48%,#ff9ad5 100%);
  --p39-ink: #232849;
  --p39-ink2: #2b2f4a;
  --p39-line: rgba(124,92,240,.22); position: relative; }
.p39-wm{
  position: absolute; right: -26px; bottom: 64px; width: 190px; height: 190px;
  pointer-events: none; opacity: .06; background: no-repeat center/contain
  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cpath d='M100 8 C 104 60, 140 96, 192 100 C 140 104, 104 140, 100 192 C 96 140, 60 104, 8 100 C 60 96, 96 60, 100 8 Z' fill='none' stroke='%234a6cf7' stroke-width='10'/%3E%3C/svg%3E");
}
[data-theme="dark"] .p39-wm{ opacity: .09; }


/* ==========================================================================
   v1.6.90 · 老板 3 图三条（成品页长图被切 / 档案页顶部白线 / 小字行动作没有框）
   ========================================================================== */

/* ---------- ① 成品页长图「被切」：那张大画布不再上屏（真根因见 app.js · planAiPosterPaint）
     页面里只有 DOM 版长图；这里只把「类型标胶囊」调成与画布同色（画布用的是环节类型色，
     DOM 版以前一律紫色 —— 既然 DOM 版成了唯一呈现，这一处必须同源）。 ---------- */
.p35-trow em{ color: var(--p35c, #5b53c8); background: var(--p35bg, rgba(124,92,240,.14)); }
.p35-hcol em{ color: var(--p35c, #5b53c8); background: var(--p35bg, rgba(124,92,240,.14)); }

/* ---------- ② 页面背景置顶：`.page` 自带 9px 顶内边距（styles-v130），.plan31-page 那套 Z1
     早就把它清零了 —— 档案页 / 编排兜底页（.p39-page 不带 .plan31-page）漏了，页面最上面
     因此露出 9px 一条页面渐变头（#f4f6fa ≈ 白）＝ 老板图 2 那条白线。
     改法：页面顶内边距归零，页头自己把这条补进上内边距（18 = 9 页面 + 9 页头），
     内容位置一毫米不动，底色由页头从最上沿铺满。 ---------- */
.p39-page:not(.plan31-page){ padding-top: 0 !important; }
.p39-page:not(.plan31-page) > .back-bar{ margin-top: 0; padding-top: 18px; }

/* ---------- ③ 底部小字行动作：给一枚看得见的框（老板图 3「这些按钮没有框框」）。
     44px 热区不动，框画在热区里（30px 高的白底描边胶囊）；危险动作的框走红调。 ---------- */
.p31-srow{
  justify-content: center; gap: 8px; }
.p31-srow .p31-sbtn{ position: relative; z-index: 0; padding: 0 14px; }
/* v1.8.03 ③：这组 ::before「假框」整组下线 —— v1.8.01 已经给小字行按钮真描边（.plan31-page .p31-srow.is-eq .p31-sbtn），
   两层叠在一起就是老板图 3 的「双层框」；删掉假框只留单层真描边，样式与上面「分享」同族。 */

/* ==========================================================================
   v1.6.92 · AI 计划五项打磨（归档详情替换 / 补充闭环变绿 / 同城铁律 / 过渡细腻化 / 计算精细度）
   ========================================================================== */

/* ---------- ① 计划详情页（#/plans/:id）：只读看这一份 + 底部「替换为当前计划」 ----------
     复用成品页那套手册组件与操作条（不新造第二套配色）；这里只补「渠道 · 时间 · 当前/历史」那一行。 */
.plan31-page .p31-pmeta{
  display: flex; align-items: center; gap: 8px; margin: 2px 2px 8px;
}
.plan31-page .p31-pmeta .p39-ch{
  font-style: normal; font-size: 11px; font-weight: 700; color: #5b4bd6;
  background: rgba(124,92,240,.12); border: 1px solid rgba(124,92,240,.24);
  padding: 2px 8px; border-radius: 999px;
}
.plan31-page .p31-pmeta b{ font-size: 12px; font-weight: 700; color: #1a1f36; }
.plan31-page .p31-pmeta .p39-st{
  font-style: normal; font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 999px;
  color: #5a6178; background: rgba(148,163,184,.14);
}
.plan31-page .p31-pmeta .p39-st.is-cur{ color: #1a1f36; background: rgba(34,197,94,.14); }
.plan31-page .p31-pmeta .p39-st.is-old{ color: #5a6178; background: rgba(148,163,184,.16); }

/* ---------- ② 补充成功那一行：随 v1.8.01 ⑪⑫ 整块下线（规则删除，不留死代码） ---------- */
/* v1.8.01：is-done 行样式一并下线 */

/* ---------- ④ 过渡细腻化：AI 计划这一簇页面进出统一 170ms（透明度 + 6px 位移），
     返回时反向（从上方 6px 落下）；系统「减弱动态」时全部归零。
     只作用在 .plan31-page / .p39-page（AI 计划 / 档案 / 详情）——社区、主菜单那些页不动，
     避免把 v1.6.12「软切换不重播动画」的修复打回去。 */
@keyframes fxp92In{ from{ opacity: 0; transform: translateY(6px); } to{ opacity: 1; transform: none; } }
@keyframes fxp92Back{ from{ opacity: 0; transform: translateY(-6px); } to{ opacity: 1; transform: none; } }
.plan31-page, .p39-page{ animation: fxp92In 170ms cubic-bezier(.4,0,.2,1); }
.soft-swap .plan31-page, .soft-swap .p39-page{ animation: fxp92In 170ms cubic-bezier(.4,0,.2,1); }
.app-back .plan31-page, .app-back .p39-page,
.app-back.soft-swap .plan31-page, .app-back.soft-swap .p39-page{ animation: fxp92Back 170ms cubic-bezier(.4,0,.2,1); }
@media (prefers-reduced-motion: reduce){
  .plan31-page, .p39-page, .soft-swap .plan31-page, .soft-swap .p39-page{ animation: none !important; }
}

/* =====================================================================
   v1.6.94 · 回忆页「+」记一笔 —— 底部抽屉（选演唱会 → 录入票根 / 现场记录）
   老板原话：「回忆页面的"+"控件，点击后抽屉弹窗选择演唱会后（页面需要加强，现在不好看），
   需要支持选择录入票根和现场记录，搜位按钮就是录入票根」。
   视觉参数照 .p31-sheet / .p31-scard 同一套（遮罩 .42 + blur4 / 面板 22 圆角 + 渐变底 +
   -18px 阴影 / 卡 18 圆角 + 发丝边 + 白→浅紫渐变）；正文一律深墨色，不许灰。
   挂载：app.js · syncMemSheet() 把本组件挂到 .phone-shell 直接子级（与 .fab-add 同级，
   不在 #app 滚动区里，滚列表时抽屉不动）。
   ===================================================================== */
.mem-sheet{
  position: absolute; inset: 0; z-index: 200; display: flex; flex-direction: column; justify-content: flex-end;
  background: rgba(24,26,52,.42); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
  animation: memFade .18s ease both;
}
@keyframes memFade{ from{ opacity: 0 } to{ opacity: 1 } }
.mem-panel{
  max-height: 88%; display: flex; flex-direction: column; border-radius: 22px 22px 0 0; overflow: hidden;
  background: linear-gradient(180deg,#f7f8ff,#fdf7ff);
  box-shadow: 0 -18px 40px rgba(20,22,60,.22);
  padding-bottom: calc(14px + env(safe-area-inset-bottom));
  animation: memUp .22s cubic-bezier(.22,.8,.3,1) both;
}
@keyframes memUp{ from{ transform: translateY(14px) } to{ transform: none } }
.mem-grip{ flex: none; width: 36px; height: 4px; border-radius: 4px; margin: 8px auto 0; background: rgba(120,124,170,.35); }
.mem-p-head{ flex: none; display: flex; align-items: flex-start; gap: 8px; padding: 10px 16px 8px; }
.mem-p-t{ flex: 1 1 auto; min-width: 0; }
.mem-p-t b{ display: block; font-size: 16px; font-weight: 700; color: #1a1f36; }
.mem-p-t i{ display: block; margin-top: 3px; font-style: normal; font-size: 12px; color: #1a1f36; }
.mem-p-x{
  flex: none; width: 30px; height: 30px; border: 0; border-radius: 50%; cursor: pointer;
  font-family: inherit; font-size: 12px; font-weight: 700; color: #6d5ce7; background: rgba(124,92,240,.1);
}
.mem-p-body{
  min-height: 0; overflow-y: auto; padding: 2px 14px 6px; display: flex; flex-direction: column; gap: 9px;
  animation: memStep .17s ease both;
}
@keyframes memStep{ from{ opacity: 0; transform: translateY(6px) } to{ opacity: 1; transform: none } }
.mem-s-grp{ flex: none; padding: 6px 2px 0; font-size: 11px; font-weight: 700; color: #1a1f36; }
.mem-s-load{ padding: 26px 0; text-align: center; font-size: 12px; color: #1a1f36; }

.mem-scard{
  display: flex; align-items: flex-start; gap: 12px; width: 100%; text-align: left; font-family: inherit;
  padding: 12px 12px 13px; border-radius: 18px; cursor: pointer;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(246,246,255,.97) 55%, rgba(252,243,255,.95));
  border: 1px solid rgba(196,200,240,.55); box-shadow: 0 8px 20px rgba(31,38,135,.06);
}
.mem-s-date{
  flex: none; width: 54px; padding: 7px 0 6px; border-radius: 13px; text-align: center; display: flex; flex-direction: column; gap: 2px;
  background: rgba(124,92,240,.08); border: 1px solid rgba(124,92,240,.18);
}
.mem-s-date b{ font-size: 16px; font-weight: 700; color: #1a1f36; }
.mem-s-date i{ font-size: 11px; font-style: normal; color: #5a6178; }
.mem-s-main{ flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.mem-s-artist{ font-size: 14px; font-weight: 700; color: #1a1f36; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mem-s-meta{ font-size: 12px; color: #1a1f36; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mem-s-meta3{ font-size: 11px; color: #1a1f36; }
.mem-s-side{ flex: none; display: flex; align-items: center; gap: 6px; margin-top: 6px; }
.mem-s-tag{ font-style: normal; font-size: 11px; font-weight: 700; padding: 3px 8px; border-radius: 999px; background: rgba(124,92,240,.12); color: #6d5ce7; white-space: nowrap; }
.mem-s-tag.is-past{ background: rgba(245,185,78,.18); color: #1a1f36; }
.mem-s-arr{ display: inline-flex; color: #6d5ce7; }

.mem-sel{
  display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 16px;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(246,246,255,.97));
  border: 1px solid rgba(196,200,240,.55); box-shadow: 0 8px 20px rgba(31,38,135,.06);
}
.mem-sel .mem-s-date{ width: 48px; }
.mem-sel-swap{
  flex: none; margin-left: auto; border: 0; cursor: pointer; font-family: inherit; font-weight: 700; font-size: 11px;
  color: #6d5ce7; background: rgba(124,92,240,.1); padding: 6px 10px; border-radius: 999px;
}
.mem-act{
  display: flex; align-items: center; gap: 12px; width: 100%; min-height: 68px; text-align: left; font-family: inherit;
  padding: 12px 14px; border-radius: 16px; cursor: pointer;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(248,246,255,.97));
  border: 1px solid rgba(196,200,240,.55); box-shadow: 0 8px 20px rgba(31,38,135,.06);
}
.mem-act.is-main{ border-color: rgba(124,92,240,.45); background: linear-gradient(160deg, rgba(246,244,255,.98), rgba(252,246,255,.97)); }
.mem-act-ic{ flex: none; width: 40px; height: 40px; border-radius: 12px; display: inline-flex; align-items: center; justify-content: center; }
.mem-act-ic.is-ticket{ color: #fff; background: var(--grad-brand); }
.mem-act-ic.is-memory{ color: #6d5ce7; background: rgba(124,92,240,.13); }
.mem-act-tx{ flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.mem-act-tx b{ font-size: 16px; font-weight: 700; color: #1a1f36; }
.mem-act-tx span{ font-size: 12px; line-height: 1.45; color: #1a1f36; }

.mem-s-empty{
  display: flex; flex-direction: column; align-items: center; gap: 6px; width: 100%; font-family: inherit;
  padding: 24px 14px 22px; border-radius: 18px; cursor: pointer;
  background: linear-gradient(160deg, rgba(255,255,255,.97), rgba(248,246,255,.97));
  border: 1px dashed rgba(150,150,230,.5);
}
.mem-s-empty-ic{ display: inline-flex; width: 44px; height: 44px; border-radius: 50%; align-items: center; justify-content: center; color: #6d5ce7; background: rgba(124,92,240,.12); }
.mem-s-empty b{ font-size: 14px; font-weight: 700; color: #1a1f36; }
.mem-s-empty-go{ position: relative; overflow: visible; margin-top: 2px; font-size: 12px; font-weight: 700; color: #6d5ce7; }

[data-theme="dark"] .mem-panel{ background: linear-gradient(180deg,#1a1e34,#20203a); }
[data-theme="dark"] .mem-p-t b, [data-theme="dark"] .mem-s-artist, [data-theme="dark"] .mem-act-tx b, [data-theme="dark"] .mem-s-empty b{ color: #eef1ff; }
[data-theme="dark"] .mem-p-t i, [data-theme="dark"] .mem-s-meta, [data-theme="dark"] .mem-s-meta3, [data-theme="dark"] .mem-act-tx span, [data-theme="dark"] .mem-s-load, [data-theme="dark"] .mem-s-grp{ color: #eef1ff; }
[data-theme="dark"] .mem-scard, [data-theme="dark"] .mem-act, [data-theme="dark"] .mem-sel, [data-theme="dark"] .mem-s-empty{
  background: linear-gradient(160deg, rgba(30,34,56,.94), rgba(24,28,46,.9)); border-color: rgba(124,92,240,.28);
}
[data-theme="dark"] .mem-s-date{ background: rgba(124,92,240,.18); border-color: rgba(124,92,240,.3); }
[data-theme="dark"] .mem-s-date b, [data-theme="dark"] .mem-s-date i{ color: #c4b2ff; }

@media (prefers-reduced-motion: reduce){
  .mem-sheet, .mem-panel, .mem-p-body{ animation: none !important; }
}

/* ============================================================
   v1.6.96 · 纪念票「分享图」抽屉弹窗：内容与纪念票大图统一（米金票纸 + 金 + 深棕墨）
   老板澄清：「不是《生成分享图》按钮…要改的是纪念票分享图抽屉弹窗的内容需要与纪念票大图样式保持一致」。
   弹窗只给这一个入口加 .tk-share-modal 类（helpers.js modal() 的 modalClass 参数，纯加法、默认不变）；
   票纸口径照 .memt-inner（米金渐变 + 微噪点 + 金发丝边），金色照票面「已观演」金胶囊 .mt-pill.ok。
   ============================================================ */
.modal.tk-share-modal{
  background:
    radial-gradient(rgba(124,94,46,.05) 0.6px, rgba(255,255,255,0) 0.9px) 0 0/3px 3px,
    linear-gradient(180deg,#fffdf6 0%,#f9efdc 46%,#f6ecd6 100%);
  border-top:1px solid rgba(190,156,100,.42);
}
.modal.tk-share-modal h3{ color:#2b2315; }
.tk-share{ text-align:center; }
.tk-share .share-ticket-img{
  border-radius:14px;
  border:1px solid rgba(190,156,100,.45);
  box-shadow:0 12px 26px rgba(52,38,12,.18);
}
.tk-share-save{
  display:flex; align-items:center; justify-content:center; gap:7px; width:100%;
  margin-top:14px; padding:14px 16px; border:none; border-radius:14px;
  background:linear-gradient(135deg,#ffd98a,#efae3f); color:#4a3000;
  font-size:15px; font-weight:700; letter-spacing:.3px; text-decoration:none;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.55),0 10px 22px rgba(238,160,50,.32);
}
.tk-share-save:active{ transform:scale(.98); }
.tk-share-hint{ margin-top:10px; font-size:12px; color:#6d5a38; }
.modal.tk-share-modal [data-m="ok"]{
  background:linear-gradient(135deg,#ffd98a,#efae3f); color:#4a3000;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.55),0 10px 22px rgba(238,160,50,.3);
}
.modal.tk-share-modal [data-m="cancel"]{
  background:rgba(255,255,255,.7); border:1px solid rgba(190,156,100,.4); color:#6d5a38; box-shadow:none;
}
/* 暗色：票纸在暗色下仍是一张浅纸（与 [data-theme="dark"] .memt-inner 同口径），墨色不变，只压一层更实的投影 */
[data-theme="dark"] .modal.tk-share-modal{
  background:linear-gradient(180deg,#fbf3e2 0%,#f2e7d0 46%,#eee0c6 100%);
  border-top-color:rgba(190,156,100,.35);
}
[data-theme="dark"] .modal.tk-share-modal h3{ color:#2b2315; }
[data-theme="dark"] .tk-share-hint{ color:#6d5a38; }
[data-theme="dark"] .modal.tk-share-modal [data-m="cancel"]{
  background:rgba(255,255,255,.62); border-color:rgba(190,156,100,.42); color:#6d5a38;
}
[data-theme="dark"] .tk-share-save,
[data-theme="dark"] .modal.tk-share-modal [data-m="ok"]{
  box-shadow:inset 0 1px 0 rgba(255,255,255,.55),0 10px 22px rgba(0,0,0,.28);
}

/* ============================================================
   v1.8.05（老板 图 1）· 识别结果卡定版：唯一一张卡 + 两枚按钮
   v1.6.97 ④【2】那排「按识别填写 / 按赴星推荐填写 / 手动填写」三枚按钮（.ai-acts.is-one + is-strong / is-soft）
   已随冲突分支一起删除，不留死代码；结果卡只剩「确认无误，填入表单」+「不用 AI 结果，清空重填」两枚，
   样式沿用 .ai-import-host .ai-acts .ai-cta / .ai-danger 既有两档，本批不动数值。
   ============================================================ */

/* ============================================================
   v1.6.98（老板图 1）· 参数页页头右侧「继续计划」
   门面 = 页头右插槽既有小胶囊口径（浅紫底 + 品牌紫字 + 999 圆角 + 高约 28px），不加实心渐变 ——
   这一页的主按钮仍然是「开始推算」。没有这枚按钮时右插槽照旧 30px 宽（v1.6.89 定的「右上角留空」不变）。
   ============================================================ */
.plan31-page > .back-bar .bb-actions.has-resume{ width: auto; min-width: 0; }
.plan31-page > .back-bar .bb-actions .p31-headbtn{
  display: inline-flex; align-items: center; justify-content: center; gap: 4px; height: 28px; min-height: 0;
  padding: 0 11px; border-radius: 999px; font-family: inherit; font-size: 12px; font-weight: 700; white-space: nowrap;
  color: #6d5ce7; background: rgba(124,92,240,.10); border: 1px solid rgba(124,92,240,.18); box-shadow: none;
}
.plan31-page > .back-bar .bb-actions .p31-headbtn:active{ transform: scale(.98); }
[data-theme="dark"] .plan31-page > .back-bar .bb-actions .p31-headbtn{
  color: #c4b2ff; background: rgba(124,92,240,.18); border-color: rgba(150,150,230,.28);
}

/* v1.6.98（老板图 2）· 参数页底部块（「开始推算」+ 它下面那行配额）整体下移 2px。
   为什么不是只改 `.p31-pgo` 的上外边距：这一页那条 `.plan31-page[data-p="params"] .p31-pgo{margin-top:auto}`
   把上外边距接管了（computed = 0px，auto 在「内容刚好铺满」的账上分不到余量）——单改上外边距在这页不产生位移。
   所以参数页改「主体首块顶距」8 → 10px：参数卡连同底部这一组（按钮 + 配额行）一起下移 2px；
   卡片内部任何间距、按钮与配额行之间的间距（4px）、窄屏吸底兜底都不动。 */
.plan31-page[data-p="params"] .p31-body > *:first-child{ margin-top: 10px; }

/* ============================================================
   v1.6.99（任务 5）· AI 计划页头标题**真居中**
   根因：标题是 flex:1，在「返回键 30px」与「右插槽」之间居中 —— 右插槽挂上
   「继续计划」变 72px 后，标题中心左偏 (72−30)/2 = 21px。
   改法：标题绝对定位到页头几何中心（left 50% + translateX(-50%)），右插槽 margin-left:auto 钉到最右；
   老规则（9929 那条 flex 口径）保留不删 —— 这里只做覆盖，宽度不够时标题截断不换行。
   ============================================================ */
.plan31-page > .back-bar .bb-title{
  text-align: center;
  letter-spacing: .2px;
  position: absolute; left: 50%; transform: translateX(-50%);
  top: env(safe-area-inset-top); bottom: 0;
  display: flex; align-items: center; justify-content: center;
   white-space: nowrap; overflow: hidden;
}
.plan31-page > .back-bar .bb-actions{
  width: 30px;
  min-width: 30px; margin-left: auto; }

/* ============================================================================
   v1.8.00 · AI 计划 UI 定版（方向 B：品牌明快）· 令牌先行（只作用于 AI 计划页族）
   —— 作用域：.plan31-page（P01–P08）/ .p39-page（P07/P09/P10）/ .p35-poster（P06 长图）
   —— 令牌表（色板 8 · 字号 5 · 间距 6 · 圆角 4 · 阴影 2 · 动效 2）；本区块内不许出现令牌以外的色/圆角/字号
   ── 色板（8）：--ai-brand #4a6cf7（品牌蓝）· --ai-brand-2 #7c5cf0（品牌紫）· --ai-iris #a855f7（紫粉高光）
                --ai-gold #e8a33d（开演金）· --ai-ink #232849（正文实色）· --ai-ink-2 #4a5070（副文实色）
                --ai-line rgba(150,150,230,.28)（发丝边）· --ai-card #ffffff（卡底）
   ── 字号（5）：--ai-fs-1 17 · --ai-fs-2 15 · --ai-fs-3 13 · --ai-fs-4 12 · --ai-fs-5 11（px）
   ── 间距（6）：--ai-s1 4 · --ai-s2 6 · --ai-s3 8 · --ai-s4 10 · --ai-s5 12 · --ai-s6 16（px）
   ── 圆角（4）：--ai-r1 12 · --ai-r2 16 · --ai-r3 20 · --ai-r4 999（px）
   ── 阴影（2）：--ai-sh-1 0 6px 18px rgba(31,38,135,.06)（卡）· --ai-sh-2 0 10px 24px rgba(58,52,170,.22)（主按钮/焦点）
   ── 动效（2）：--ai-anim-flow 2.4s（流光）· --ai-anim-pulse 3s（呼吸）；减弱动态 / 低端机 → 静态
   三条硬规矩：① 一屏只有一个主按钮（实心渐变）② 卡片=一条线（同圆角/同边/同影）③ 禁灰字（副文最多降一档明度）
   ============================================================================ */
.plan31-page, .p39-page, .p35-poster{
  --ai-brand:#4a6cf7; --ai-brand-2:#7c5cf0; --ai-iris:#a855f7; --ai-gold:#e8a33d;
  --ai-ink:#232849; --ai-ink-2:#4a5070; --ai-line:rgba(150,150,230,.28); --ai-card:#ffffff;
  --ai-grad:linear-gradient(135deg, var(--ai-brand) 0%, var(--ai-brand-2) 58%, var(--ai-iris) 100%);
  --ai-fs-1:17px; --ai-fs-2:15px; --ai-fs-3:13px; --ai-fs-4:12px; --ai-fs-5:11px;
  --ai-s1:4px; --ai-s2:6px; --ai-s3:8px; --ai-s4:10px; --ai-s5:12px; --ai-s6:16px;
  --ai-r1:12px; --ai-r2:16px; --ai-r3:20px; --ai-r4:999px;
  --ai-sh-1:0 6px 18px rgba(31,38,135,.06); --ai-sh-2:0 10px 24px rgba(58,52,170,.22);
  --ai-anim-flow:2.4s; --ai-anim-pulse:3s;
}

/* —— P01 四卡首屏：主卡=品牌大色块；三张白卡同尺寸同内距；12px 缝 + 发丝边；清掉装饰小圆点 —— */
.plan31-page .p31-home{ gap: var(--ai-s5); }
.plan31-page .p31-home .p31-cta.is-main{
  min-height: 100px; padding: var(--ai-s6) var(--ai-s6) 15px var(--ai-s6);
  border-radius: var(--ai-r3); background: var(--ai-grad); box-shadow: var(--ai-sh-2);
}
.plan31-page .p31-home .p31-cta.is-sub{
  min-height: 78px; padding: 13px 14px; border-radius: var(--ai-r2);
  background: var(--ai-card); border: 1px solid var(--ai-line); box-shadow: var(--ai-sh-1); color: var(--ai-ink);
}
.plan31-page .p31-home .p31-cta.is-sub .p31-ic{ background: rgba(74,108,247,.10); border-color: rgba(74,108,247,.18); color: var(--ai-brand); }
.plan31-page .p31-home .p31-cta.is-sub .p31-cta-t b{ font-size: var(--ai-fs-2); color: var(--ai-ink); }
.plan31-page .p31-home .p31-cta.is-sub .p31-cta-t span{ margin-top: var(--ai-s1); font-size: var(--ai-fs-4); color: var(--ai-ink-2); }
.plan31-page .p31-home .p31-cta.is-sub .p31-arr, .plan31-page .p31-home .p31-cta.is-sub .p31-chev{ color: var(--ai-brand); opacity: 1; }
.plan31-page .p31-cta.is-main .p31-cta-t b{ font-size: var(--ai-fs-1); }
.plan31-page .p31-cta.is-main .p31-cta-t span{ margin-top: var(--ai-s2); font-size: var(--ai-fs-4); color: #ffffff; }
.plan31-page .p31-home .p31-cta::before{ display: none; }
.plan31-page .p31-quota{ font-size: var(--ai-fs-4); color: var(--ai-ink-2); }

/* —— P02 补录 / P03 参数：两组分区（行程基础 / 偏好）+ 选中态统一（品牌描边 + 浅紫底 + 勾）—— */
.plan31-page .p32-grp{
   font-size: var(--ai-fs-5); font-weight: 700;
  color: var(--ai-brand); 
}
.plan31-page .p32-grid > .p32-grp:first-child{ margin-top: var(--ai-s1); }
.plan31-page .p32-box{
  border-radius: var(--ai-r2); border: 1px solid var(--ai-line); background: var(--ai-card); box-shadow: var(--ai-sh-1);
}
.plan31-page .p32-box.is-err{ border-color: rgba(220,38,38,.5); }
.plan31-page .p32-lb{ font-size: var(--ai-fs-4); font-weight: 700; color: var(--ai-ink); }
.plan31-page .p32-mode.on, .plan31-page .p32-num.on, .plan31-page .p32-tier.on,
.plan31-page .p32-hr.on, .plan31-page .p32-region-pick:focus-visible{
  border-color: rgba(124,92,240,.6); background: rgba(124,92,240,.12); color: var(--ai-ink);
}
.plan31-page .p32-hr{ border-radius: var(--ai-r4); font-weight: 700; }
.plan31-page .p31-params .p32-val, .plan31-page .p32-exact{ font-size: var(--ai-fs-3); color: var(--ai-ink); }
.plan31-page .p32-exact::placeholder{ color: var(--ai-ink-2); }
.plan31-page .p31-pgo{
  min-height: 46px; border-radius: var(--ai-r2); background: var(--ai-grad);
  box-shadow: var(--ai-sh-2); font-size: var(--ai-fs-2); font-weight: 700;
}
.plan31-page .p31-pfoot{ font-size: var(--ai-fs-4); color: var(--ai-ink-2); }
.plan31-page .p31-pquota b, .plan31-page .p31-pquota em{ color: var(--ai-ink); }

/* —— P04 生成中：品牌渐变轨道 + 当前段光流；卡片居中、含 AI 徽标 —— */
.plan31-page .plan-ai-loading{
  isolation: isolate;
  padding: 18px var(--ai-s6) var(--ai-s6); border-radius: var(--ai-r3);
  background: var(--ai-card); border: 1px solid var(--ai-line); box-shadow: var(--ai-sh-1);
}
.plan31-page .plan-ai-loading .plan-ai-head{ justify-content: center; gap: var(--ai-s2); font-size: var(--ai-fs-2); color: var(--ai-ink); }
.plan31-page .plan-ai-bar{ background: rgba(74,108,247,.12); border-radius: var(--ai-r4); overflow: hidden; }
.plan31-page .plan-ai-bar > i{
  min-width: 8px; border-radius: var(--ai-r4); background: var(--ai-grad);
  animation: aiV180Flow var(--ai-anim-flow) ease-in-out infinite;
}
@keyframes aiV180Flow{ 0%,100%{ filter: saturate(1) } 50%{ filter: saturate(1.25) brightness(1.04) } }
.plan31-page .plan-ai-loading .p32-st.on{ color: var(--ai-brand-2); }

/* —— P05 核对页：时间线**恢复 v1.7.00 版式**（v1.8.01 老板图 3 —— 不许第三个版式），只把品牌家族的
      颜色换成 v1.8.00 令牌；开演节点保留上一版的品红识别色（它不在 8 色令牌内，改色就等于又造一版）。
      v1.8.00 那三条（p31-prog 圆角/影、is-now 呼吸、is-show 金紫渐变）整块撤掉。 —— */
.plan31-page .p31-prail-fill{ background: linear-gradient(90deg, var(--ai-brand), var(--ai-brand-2) 55%, #2c96bd); }
.plan31-page .p31-prn.is-done .p31-prd{ background: linear-gradient(135deg, var(--ai-brand), var(--ai-brand-2)); }
.plan31-page .p31-prn.is-cur .p31-prd{
  animation: none; background: linear-gradient(135deg, var(--ai-brand-2), var(--ai-iris)); }
.plan31-page .p31-hb{ border-radius: var(--ai-r2); border: 1px solid var(--ai-line); box-shadow: var(--ai-sh-1); }
.plan31-page .p31-hb[data-tp="演出"]{ border-color: rgba(232,163,61,.55); background: linear-gradient(160deg, rgba(255,252,244,.98), rgba(255,255,255,.96)); }
.plan31-page .p31-hb .tm{ background: rgba(124,92,240,.10); border-radius: var(--ai-r4); padding: 2px 8px; }
.plan31-page .p31-hb .tag, .plan31-page .p31-hb .dur{ border-radius: var(--ai-r4); }
.plan31-page .p31-note{ border-radius: var(--ai-r2); border: 1px solid var(--ai-line); box-shadow: var(--ai-sh-1); }
.plan31-page .p31-note .hd, .plan31-page .p31-hl h4{ color: var(--ai-brand-2); }
.plan31-page .p31-note p, .plan31-page .p31-hl li{ color: var(--ai-ink); }

/* —— P06 成品页：封面 / 条目 / 进度只对齐令牌（信息一个不减）—— */

.p35-poster .p35-it{ border-radius: var(--ai-r1); border: 1px solid var(--ai-line); box-shadow: var(--ai-sh-1); }
.p35-poster .p35-it > b{ background: var(--ai-grad); }
.p35-poster .p35-bd strong{ color: var(--ai-ink); }
.p35-poster .p35-bd u, .p35-poster .p35-sub{ color: var(--ai-ink-2); }
.p35-poster .p35-day, .p35-poster .p35-day span{ color: var(--ai-ink); }
.p35-poster h4, .p35-poster .p35-foot, .p35-poster .p35-brand{ color: var(--ai-ink); }
.p35-poster .p35-hint{ color: var(--ai-brand-2); }

/* —— P08 导入面板：三种方式 = 3 张同尺寸大按钮（图 / 文 / 语音）—— */
.plan31-page .p31-sheet .p31-panel{ border-radius: 22px 22px 0 0; }
.plan31-page .p31-pick3{ display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--ai-s3); }
.plan31-page .p31-pick3 .p31-b2{
  flex-direction: column; align-items: center; justify-content: center; gap: var(--ai-s2);
  min-height: 108px; padding: var(--ai-s5) var(--ai-s3); text-align: center;
}
.plan31-page .p31-pick3 .p31-b2 .p31-cta-t{ align-items: center; text-align: center; }
.plan31-page .p31-pick3 .p31-b2 .p31-cta-t b{ font-size: var(--ai-fs-3); }
.plan31-page .p31-pick3 .p31-b2 .p31-cta-t span{ font-size: var(--ai-fs-5); color: var(--ai-ink-2); }
.plan31-page .p31-pick3 .p31-b2 .p31-chev{ display: none; }
.plan31-page .p31-b2.is-main{ border-color: rgba(124,92,240,.5); background: linear-gradient(160deg, rgba(244,245,255,.98), rgba(248,242,255,.96)); }

/* —— P07 自由编排 / P09 档案列表 / P10 档案详情：同一套卡、三档按钮、三态分档 —— */
.p39-page .p39-grp, .p39-page .p39-row{ border-radius: var(--ai-r2); border: 1px solid var(--ai-line); box-shadow: var(--ai-sh-1); }
.p39-page .p39-gt b{ font-size: var(--ai-fs-3); color: var(--ai-ink); }
.p39-page .p39-gt i, .p39-page .p39-rl b{ font-size: var(--ai-fs-5); color: var(--ai-ink-2); }
.p39-page .p39-gn, .p39-page .p39-chev, .p39-page .p39-ch{ color: var(--ai-brand-2); }
.p39-page .p39-st{ border-radius: var(--ai-r4); font-weight: 700; }
.p39-page .p39-st.is-cur{ color: #1a1f36; background: rgba(60,190,140,.18); }
.p39-page .p39-st.is-old{ color: var(--ai-ink-2); background: rgba(74,80,112,.10); }
.p39-page .p39-st.is-draft{ color: #5a6178; background: rgba(240,180,60,.2); }
.p39-page .p39-btn{ border-radius: var(--ai-r4); border: 1px solid var(--ai-line); background: var(--ai-card); color: var(--ai-brand-2); font-weight: 700; }
.p39-page .p39-madd{ border-radius: var(--ai-r2); border: 1px solid var(--ai-line); background: var(--ai-card); color: var(--ai-brand-2); font-weight: 700; }
.p39-page .p39-mok{ border-radius: var(--ai-r2); background: var(--ai-grad); box-shadow: var(--ai-sh-2); color: #fff; font-weight: 700; }
.p39-page .p39-mhint, .p39-page .p39-empty{ font-size: var(--ai-fs-5); color: var(--ai-ink-2); }
.p39-page .p39-err{ color: #dc3545; }

/* —— 暗色：同一套令牌语义（卡底走深色，主色/字色不降级；灰字禁令不破）—— */
[data-theme="dark"] .plan31-page, [data-theme="dark"] .p39-page, [data-theme="dark"] .p35-poster{ --ai-card:rgba(28,32,52,.94); --ai-line:rgba(150,150,230,.28); }
[data-theme="dark"] .plan31-page .p31-home .p31-cta.is-sub,
[data-theme="dark"] .plan31-page .p32-box,
[data-theme="dark"] .plan31-page .p31-hb,
[data-theme="dark"] .plan31-page .plan-ai-loading,
[data-theme="dark"] .plan31-page .p31-note,
[data-theme="dark"] .plan31-page .p31-pick3 .p31-b2,
[data-theme="dark"] .p39-page .p39-grp,
[data-theme="dark"] .p39-page .p39-row,
[data-theme="dark"] .p39-page .p39-btn,
[data-theme="dark"] .p39-page .p39-madd{ background: var(--ai-card); border-color: var(--ai-line); color: var(--ai-ink); }
[data-theme="dark"] .plan31-page, [data-theme="dark"] .p39-page{ --ai-ink:#e8eaff; --ai-ink-2:#c3c7e2; }
[data-theme="dark"] .plan31-page .p31-home .p31-cta.is-sub .p31-cta-t b,
[data-theme="dark"] .plan31-page .p31-hb .t{ color: var(--ai-ink); }
[data-theme="dark"] .plan31-page .p31-hb[data-tp="演出"]{ background: linear-gradient(160deg, rgba(46,38,30,.6), rgba(28,32,52,.94)); border-color: rgba(232,163,61,.5); }
[data-theme="dark"] .p39-page .p39-st.is-old{ color: #eef1ff; background: rgba(150,150,230,.16); }

/* —— 降级：系统开了「减少动态效果」→ 流光 / 呼吸全部静态（不新增第三条动效）—— */
@media (prefers-reduced-motion: reduce){
  .plan31-page .plan-ai-bar > i, .plan31-page .p31-prn.is-now .p31-prd{ animation: none; }
}

/* v1.8.00 修：主卡（品牌渐变底）上的 AI 标贴 —— 不能沿用白底白字（实测白底看不清），
   改成「透明白底 + 白字」，与副卡（浅紫底 + 品牌字）各自有对比度。 */
.plan31-page .p31-cta.is-main .ai-tag{
  background: rgba(255,255,255,.24);  
}

/* ============================================================================
   v1.8.01 · AI 计划 12 条精修（只动样式与局部组件；颜色只用 v1.8.00 令牌）
   —— 作用域同 v1.8.00：.plan31-page / .p39-page / .p35-poster / .sheetv
   ============================================================================ */

/* ① P03 参数页压缩纵向高度：hero 场次卡 108 → 88；参数卡内距 / 板块缝各收；底部按钮离卡片 ≥12px */
.plan31-page .p31-gig.p31-hero{ min-height: 88px; padding: 9px 12px 10px; margin-bottom: 8px; }
.plan31-page .p31-hero .p31-hname{ font-size: 14px; }
.plan31-page .p31-hero .p31-hvenue{ margin-top: 4px; font-size: 12px; }
.plan31-page .p31-hero .p31-hdate b{ font-size: 16px; }
.plan31-page .p31-params{ padding-bottom: 4px; }
.plan31-page[data-p="params"] .p31-params{
  display: flex; padding-bottom: 8px; margin-bottom: 12px; }
.plan31-page .p32-grid{ gap: 1px; }
.plan31-page .p32-grp{
  letter-spacing: .6px; margin: 8px 2px 4px; }

.plan31-page .p31-pfoot{ margin-top: 8px; }
/* ①b 真机复测（探针）：hero 的高度由内容驱动，min-height 不生效 —— 只压 params 这一页的 hero 内部，
     不动其它页面那张同款卡。目标：整卡真实高度从 128.7 → ≈88（hdate 徽标 / 上下两行 / 内距一起收）。 */
.plan31-page[data-p="params"] .p31-gig.p31-hero{    margin-bottom: 8px; }
.plan31-page[data-p="params"] .p31-hero .p31-hdate{ padding: 2px 0; border-radius: 14px; }
.plan31-page[data-p="params"] .p31-hero .p31-hdate b{ font-size: 16px; }
.plan31-page[data-p="params"] .p31-hero .p31-hdate i{ font-size: 11px; margin-top: 1px; }
.plan31-page[data-p="params"] .p31-hero .p31-hname{ font-size: 14px; }
.plan31-page[data-p="params"] .p31-hero .p31-hvenue{ margin-top: 2px; font-size: 11px; }
.plan31-page[data-p="params"] .p31-hero .p31-hfoot{ margin-top: 0; padding-top: 3px; }
.plan31-page[data-p="params"] .p31-hero .p31-htime{ padding: 1px 8px; font-size: 11px; }
.plan31-page[data-p="params"] .p31-hero .p31-hleft{ padding: 3px 8px; }
/* ①c 参数卡再收一档（内距 / 时间格行高 / 人数档位），并把「开始推算」上沿与卡片的净距钉在 ≥12px */
.plan31-page[data-p="params"] .p32-grid{ margin-bottom: 12px; }

.plan31-page[data-p="params"] .p32-date{ height: 28px; }
.plan31-page[data-p="params"] .p32-hrs{ margin-top: 3px; gap: 3px; }
.plan31-page[data-p="params"] .p32-hr{ height: 19px; }
.plan31-page[data-p="params"] .p32-mode{ padding: 2px 4px 3px; }
.plan31-page[data-p="params"] .p32-num{ height: 22px; }
.plan31-page[data-p="params"] .p32-tier{ padding: 2px 2px; }
/* ①d 参数页内容撑满滚动区：内容比屏短时，卡片跟着拉满、按钮吸到卡片底（正好贴主菜单上方）；
     内容仍比屏长时退回自然流 + 下面那条吸底兜底 */
.plan31-page[data-p="params"] .p31-body > #plan-ai-host{ flex: 1 1 auto; display: flex; flex-direction: column; min-height: 0; }
.plan31-page[data-p="params"] #plan-ai-host > .p31-params{ flex: 1 1 auto; }
/* ①e 参数页底垫比其它页再收 14px：内容撑满后「开始推算 + 配额行」贴到主菜单上方 ≈12px（老板图 1「正好贴」） */
.plan31-page[data-p="params"]{ padding-bottom: calc(56px + env(safe-area-inset-bottom)) !important; }

/* ② P04：进度条右端白光已删（见上面规则注释）；卡片本身不再有背后光斑 */

/* ③ P05 时间线：版式 = v1.7.00（上面已恢复），颜色 = v1.8.00 令牌（见上面三条颜色规则） */

/* ④/⑥ 核对页 / 成品页底部动作区：一排等宽等高等尺寸 + 整排下移到主菜单上方约 8px */
.plan31-page .p31-bar{ gap: 8px; }
.plan31-page .p31-bar .p31-pill, .plan31-page .p31-bar .p31-save, .plan31-page .p31-bar .p31-sbtn{
  flex: 1 1 0; min-width: 0; height: 46px; min-height: 46px; padding: 0 8px; border-radius: var(--ai-r2);
  display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  font-size: 12px; font-weight: 700; white-space: nowrap;
}
.plan31-page .p31-bar .p31-pill{ margin: 0; background: var(--ai-card); color: var(--ai-brand-2); border: 1px solid var(--ai-line); box-shadow: var(--ai-sh-1); }
.plan31-page .p31-bar .p31-sbtn{ border: 1px solid var(--ai-line); background: var(--ai-card); color: var(--ai-ink); }
.plan31-page .p31-bar .p31-save{ background: var(--ai-grad); color: #fff; box-shadow: var(--ai-sh-2); }
.plan31-page .p31-bar .p31-save[disabled]{ opacity: .55; }
.plan31-page .p31-srow.is-eq{ display: flex; align-items: center; gap: 8px; margin: 8px 0 0; }
.plan31-page .p31-srow.is-eq .p31-sbtn{
  flex: 1 1 0; min-width: 0; height: 44px; min-height: 44px; padding: 0 6px; border-radius: var(--ai-r2);
  border: 1px solid var(--ai-line); background: var(--ai-card); color: var(--ai-ink);
  font-size: 12px; font-weight: 700; white-space: nowrap;
}
.plan31-page .p31-srow.is-eq .p31-sbtn.is-danger{ color: #dc3545; border-color: rgba(185,28,28,.3); background: var(--ai-card); }
.plan31-page .p31-composer{ padding: 8px 0 8px; margin-bottom: 8px; }
[data-theme="dark"] .plan31-page .p31-bar .p31-pill,
[data-theme="dark"] .plan31-page .p31-bar .p31-sbtn,
[data-theme="dark"] .plan31-page .p31-srow.is-eq .p31-sbtn{ background: var(--ai-card); border-color: var(--ai-line); color: var(--ai-ink); }
[data-theme="dark"] .plan31-page .p31-srow.is-eq .p31-sbtn.is-danger{ color: #ff9d9d; border-color: rgba(252,165,165,.3); }

/* ⑤ 长图查看器：浅色主题 = 浅底 + 深字 + 浅色按钮；深色主题维持原样（长图本身不变） */
html:not([data-theme="dark"]) .sheetv{ background: #eef0f8; }
html:not([data-theme="dark"]) .sheetv-hd{ background: rgba(255,255,255,.97); border-bottom-color: var(--ai-line, rgba(150,150,230,.28)); }
html:not([data-theme="dark"]) .sheetv-hd b{ color: #a8b0c8; }
html:not([data-theme="dark"]) .sheetv-x{ color: #a8b0c8; background: rgba(124,92,240,.08); border-color: rgba(150,150,230,.3); }
html:not([data-theme="dark"]) .sheetv-bd{ background: #e9ecf7; }
html:not([data-theme="dark"]) .sheetv-ft{ background: rgba(255,255,255,.97); border-top-color: rgba(150,150,230,.22); }
html:not([data-theme="dark"]) .sheetv-zoom button{ color: #a8b0c8; background: rgba(124,92,240,.08); border-color: rgba(150,150,230,.28); }
html:not([data-theme="dark"]) .sheetv-zoom b{ color: #a8b0c8; }
html:not([data-theme="dark"]) .sheetv-hint{ background: rgba(255,255,255,.97); color: #a8b0c8; }

/* ⑦ P01 主卡 AI 标贴：金底深字（主卡 / 副卡统一同一款，两处都能看清「AI」） */
.plan31-page .p31-cta .ai-tag{ background: var(--ai-gold); border-color: rgba(232,163,61,.6); color: #1a1f36; }
.plan31-page .p31-cta.is-main .ai-tag{ background: var(--ai-gold); border-color: rgba(255,255,255,.5); color: #1a1f36; }

/* ⑧ P08 导入成行抽屉：底部给主菜单让位（与 region / history 抽屉同款口径） */
.plan31-page .p31-sheet[data-sheet="free"] .p31-panel{ padding-bottom: calc(84px + env(safe-area-inset-bottom)); }

/* ⑨ P07 顶部场次卡：与其它页同一张卡（点它 = 复用选场次面板），不再用两行纯文字 */
.p39-page .p31-gig.p31-hero{ margin: 0 0 10px; }

/* ⑩ P07 环节编辑：时间字段 = 日期 + 时间（datetime-local），跨天带日期显示 */
.p39-page .p39-mf input[type="datetime-local"]{ font-size: 12px; }
.p39-page .p39-mtime{ font-size: 12px; color: var(--ai-ink); }

/* ⑪⑫「还差 N 条，补上更准」整块下线：相关样式一并清掉，不留死代码 */

/* v1.8.01 · 收口规则（文件末尾保持「以规则收尾」的既有测试口径） */
.plan31-page .p31-srow.is-eq .p31-sbtn[disabled]{ opacity: .55; }

/* ============================================================================
   v1.8.02 · AI 计划 7 条收尾（只动样式与局部组件；颜色只用 v1.8.00 令牌）
   ============================================================================ */

/* ① P06 成品页顶部：确认封面卡换成与 P03 / P05 同款的场次卡（renderPlanGigCard），
      封面卡本体退成透明容器（不再有品牌渐变底 / 白字），「已确认」标 + 时间留在卡下一行。 */
.p35-poster .p35-cover{
  display: block; padding: 0; min-height: 0; border: 0; border-radius: 0; box-shadow: none; background: none;
}
.p35-poster .p35-cover.has-badge{ padding-top: 0; padding-bottom: 0; }
.p35-poster .p35-cover .p31-gig.p31-hero{ margin: 0 0 8px; }
.p35-poster .p35-cover .p35-lock{
  display: flex; align-items: center; gap: 6px; margin: 0 0 8px; text-align: left;
  font-size: 11.5px; font-weight: 700; color: var(--ai-ink-2);
}
.p35-poster .p35-cover .p35-lock .p35-badge{
  position: static; top: auto; right: auto; padding: 1px 7px; border-radius: 999px;
  font-size: 10px; font-weight: 800; letter-spacing: .3px; line-height: 1.6;
  color: #3a2a06; background: var(--ai-gold); border: 1px solid rgba(232,163,61,.6);
  box-shadow: none; animation: none;
}
[data-theme="dark"] .p35-poster .p35-cover .p35-lock{ color: var(--ai-ink-2); }

/* ②③ P06 底部：删「上一步」后 = 一排 分享 / 保存长图 + 一排 重新生成 / 删除；
      整块再往下贴 —— 最后一行距主菜单 6–8px（把多余的底部留白收掉）。 */
.plan31-page[data-p="locked"]{ padding-bottom: calc(65px + env(safe-area-inset-bottom)) !important; }

/* ④ 长图查看器：标题栏与长图之间不再有横带（顶满、背景连续）—— 浅色 / 深色同一口径。 */
html .sheetv-hd, html:not([data-theme="dark"]) .sheetv-hd, [data-theme="dark"] .sheetv-hd{ border-bottom-color: transparent; }
.sheetv-bd{
  -webkit-overflow-scrolling: touch; padding-top: 0; }

/* ⑤ P08 导入成行抽屉：「继续上次的导入计划」那一行与下面三张卡同一左右内距（16px），四条边对齐。 */
.plan31-page .p31-sheet[data-sheet="free"] .p31-pick3{ padding-left: 16px; padding-right: 16px; }
.plan31-page .p31-sheet[data-sheet="free"] .p31-b2.is-main{ width: auto; margin: 0 16px 10px; }

/* ⑥ P09 计划档案页：返回键与 AI 计划页同款 30×30 圆钮（通用 40×40 只作用于非 AI 页，这里收窄）。 */
.p39-page:not(.plan31-page) > .back-bar .bb-back{
  width: 30px; height: 30px; min-width: 30px; min-height: 30px; border-radius: 50%;
}

/* ============================================================================
   v1.8.03 · AI 计划 4 条收尾（只动样式与局部布局；数据 / 接口 / 状态机零变化）
   ① .ai-tag 全站行内金底小胶囊（改在基类上，见 v1.6.52 区块）
   ② P07 自由编排空态：场次卡到按钮区之间不再留成片空白（空态卡撑满 + 文字垂直居中）
   ③ P06 小字行双层框（v1.6.90 假框已下线，见上）
   ④ P03 参数页回调一档：hero 96px / 内距 +2 / 板块缝 +2，一屏仍不滚动
   ============================================================================ */

/* ② P07 自由编排空态：.p39-manbody 是纵向 flex —— 空态时把「剩余高度」全给清单，
     空态卡跟着撑满、文案在卡内垂直居中；按钮区（.p39-mactions）仍在最下面。 */
.p39-page[data-empty="1"] .p39-manbody{ flex: 1 1 auto; min-height: 0; }
.p39-page[data-empty="1"] .p39-man{ flex: 1 1 auto; display: flex; flex-direction: column; min-height: 0; }
.p39-page[data-empty="1"] .p39-mlist{ flex: 1 1 auto; min-height: 0; justify-content: stretch; }
.p39-page[data-empty="1"] .p39-empty{
  flex: 1 1 auto; display: flex; align-items: center; justify-content: center; padding: 16px;
}

/* ④ P03 参数页：hero 真实高 87.6 → ≈96（内距 8 → 12）；参数卡内距 / 板块缝各回 2px。
     硬约束不变：375×812 一屏内「开始推算 + 配额行」完整贴主菜单上方，bodyScroll = bodyClient。 */
.plan31-page[data-p="params"] .p31-gig.p31-hero{
  min-height: 0;
  gap: 6px; padding: 12px; }
.plan31-page[data-p="params"] .p32-box{ padding-left: 8px; padding-right: 8px; padding-bottom: 5px; }
.plan31-page[data-p="params"] .p32-grid{ gap: 3px; row-gap: 3px; }

/* ⑦ P04 生成中卡片：那条「白斜线」的真身 = 卡片里那枚 .ai-tag（v1.8.02 定位到）。
   v1.8.03 ① 起基类已改成行内金底小胶囊 ⇒ 这条局部覆盖整块撤掉（不再有 white 版 / 不再有 absolute）。 */

/* ① 收口（点名的四处，一处一份选择器）：这些卡里 `.ai-tag` 是个 span，会被同级的
   「副文案 .p31-cta-t span」规则按 (0,4,1) 的特异性盖掉（实测主卡 = 白胶囊 + 白字，看不见「AI」）。
   这里用 (0,5,2) 的选择器把金底深字钉死，四处逐一对齐 —— 颜色写死，不吃变量解析。 */
.plan31-page .p31-cta .p31-cta-t b span.ai-tag,
.plan31-page .p31-cta.is-main .p31-cta-t b span.ai-tag,
.plan31-page .p31-cta.is-sub .p31-cta-t b span.ai-tag,
.plan31-page .plan-ai-loading .plan-ai-head span.ai-tag,
[data-theme="dark"] .plan31-page .p31-cta .p31-cta-t b span.ai-tag{
  position: static; display: inline-flex; align-items: center; vertical-align: 1px; margin: 0 0 0 6px;
  height: 18px; padding: 0 8px; border-radius: 999px;
  font-size: 11px; font-weight: 700; letter-spacing: .3px; line-height: 1;
  color: #fff; background: linear-gradient(120deg, #556fe8, #8a4fe0 48%, #2c96bd);
  -webkit-text-fill-color: currentColor;
  border: 1px solid rgba(109,92,231,.5);
  box-shadow: 0 2px 7px rgba(109,92,231,.36), inset 0 1px 0 rgba(255,255,255,.3);
}

/* ============================================================================
   v1.8.04 · 两条热修（只动样式；数据 / 接口 / 状态机零变化）
   ① P03 参数页「开始 / 结束」小时胶囊：三套规则（flex 换行 / 12 列 grid / tcol 里 flex）统一成一套 grid ——
      375 宽下每行 6 枚（11 小时 + 「更多」= 12 枚，正好两行排满，末行不留空洞）；两栏完全对称。
   ② AI 标贴底色回到紫色（见上面基类）；首页格子回到右上角角标（卡片里仍是行内小胶囊），四处同色同字号。
   ============================================================================ */
.plan31-page .p32-hrs,
.plan31-page .p32-tcol .p32-hrs{
  display: grid !important; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 3px; margin-top: 4px;
  flex-wrap: nowrap;
}
.plan31-page .p32-hrs .p32-hr,
.plan31-page .p32-tcol .p32-hr{
  min-width: 0; width: 100%; height: 24px; padding: 0; font-size: 11px; border-radius: 999px;
  white-space: nowrap; overflow: hidden; display: flex; align-items: center; justify-content: center;
}
/* 「更多」那枚是两个字，6 列下每格只有 ~21px —— 收字距，别被折成两行溢出胶囊 */
.plan31-page .p32-hrs .p32-hr.p32-more,
.plan31-page .p32-tcol .p32-hr.p32-more{
  font-size: 11px; letter-spacing: -.2px; padding: 0 1px;
}
@media (max-width: 340px){
  .plan31-page .p32-hrs,
  .plan31-page .p32-tcol .p32-hrs{ grid-template-columns: repeat(5, minmax(0, 1fr)); }
}

/* v1.8.04 ② 的「格子右上角角标」规则在 v1.8.06 作废：标贴改为贴图标右上角的小胶囊（见文件末尾 v1.8.06 段）。 */

/* ============================================================================
   v1.8.06 · 赴星 AI 入口按钮五处统一（UI 部定稿《赴星-AI按钮统一设计.png》）
   主按钮：渐变 #5865F5→#7C5CF0→#8B5CF6 · 高 48 · 圆角 999 · 白字 15/800；
   AI 标识统一为「按钮内胶囊」（白 22% 底 + 白字 + 左侧 1px 竖分隔线）。
   作用域纪律：本段只覆盖下面点名的五处入口；全局 AI 标识基类 / 站点主按钮基类 / 品牌渐变令牌 一律不动
   （识别卡的 .ai-cta 是另一支浅底样式，本段不碰）。
   ============================================================================ */

/* —— 组件本体（只在点名的入口生效）—— */
.card.empty-start.hero-empty-grad .heg-btn.ai-cta,
.empty-acts .btn.ai-cta,
.fab-add:has(.ai-tag){
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  height: 48px; padding: 0 16px 0 18px; border: none; border-radius: 999px;
  background: var(--grad-ai-entry); color: #fff;
  font-family: inherit; font-size: 16px; font-weight: 700; line-height: 1;
  box-shadow: 0 10px 22px rgba(88,101,245,.32);
  -webkit-appearance: none; appearance: none; cursor: pointer;
  transition: transform .16s cubic-bezier(.4,0,.2,1);
}
.card.empty-start.hero-empty-grad .heg-btn.ai-cta svg,
.empty-acts .btn.ai-cta svg{ width: 19px !important; height: 19px !important; vertical-align: 0; }
.card.empty-start.hero-empty-grad .heg-btn.ai-cta .ai-tag,
.empty-acts .btn.ai-cta .ai-tag{
  position: relative; display: inline-flex; align-items: center; height: auto;
  margin: 0 0 0 16px; padding: 3px 10px; border: none; border-radius: 999px;
  background: rgba(255,255,255,.22); color: #fff; box-shadow: none;
  font-size: 11px; font-weight: 700; line-height: 1; letter-spacing: .3px;
  animation: none; pointer-events: none;
}
.card.empty-start.hero-empty-grad .heg-btn.ai-cta .ai-tag::before,
.empty-acts .btn.ai-cta .ai-tag::before{
  content: ''; position: absolute; left: -8px; top: 50%; transform: translateY(-50%);
  width: 1px; height: 18px; background: rgba(255,255,255,.45);
}
.card.empty-start.hero-empty-grad .heg-btn.ai-cta:active,
.empty-acts .btn.ai-cta:active{ transform: scale(.97); }

/* —— on-dark（深色底白色款）—— */
.card.empty-start.hero-empty-grad .heg-btn.ai-cta.on-dark{
  background: #fff; color: #6d5ce7; box-shadow: 0 8px 18px rgba(28,20,80,.20);
}
.card.empty-start.hero-empty-grad .heg-btn.ai-cta.on-dark .ai-tag{ background: #EFEDFF; color: #6d5ce7; }
.card.empty-start.hero-empty-grad .heg-btn.ai-cta.on-dark .ai-tag::before{ background: rgba(88,101,245,.28); }

/* ① 首页 hero 空态：两处状态卡同一套（旧尺寸 11/20 内距 · 13 圆角 · 13px 字 · 15px 图标 全部按 48/999/15/19 覆盖） */
.card.empty-start.hero-empty-grad .heg-btn.solid.ai-cta{
  padding: 0 16px 0 18px; border-radius: 999px; font-size: 16px; height: 48px;
}
.card.empty-start.hero-empty-grad .heg-btn.solid.ai-cta .ai-tag{ margin-left: 16px; }

/* ② 行程页空态：主按钮 = 渐变款；同排「从备忘录批量导入」只把圆角对齐 999（不加 AI、不加渐变） */
.empty-acts .btn-ghost{ border-radius: 999px; }

/* ③ 行程页悬浮加号（只这一颗，靠 :has(.ai-tag) 限定；另外 3 颗无 ai-tag 的保持现状） */
.fab-add:has(.ai-tag){
  width: 56px; height: 56px; flex-direction: column; gap: 0;
  background: var(--grad-ai-entry); box-shadow: 0 12px 26px rgba(88,101,245,.42);
}
.fab-add:has(.ai-tag) .ai-tag{
  position: static; display: block; margin: 2px auto 0; padding: 0;
  background: none; border: none; box-shadow: none; animation: none;
  color: #fff; font-size: 11px; font-weight: 700; line-height: 1; letter-spacing: .3px;
}

/* ④⑤ 筹备中心「AI 计划」格（首页速办 / 演唱会详情共用同一组件，改一次两处一致） */
.qt-grid .qt.is-ai{
  background: linear-gradient(165deg,#F2F0FF,#E9E9FD); border: none;
}
[data-theme="dark"] .qt-grid .qt.is-ai{
  background: linear-gradient(165deg,#2A2750,#232043);
}
.qt-grid .qt.is-ai .qt-ic{
  position: relative; overflow: visible;
  background: linear-gradient(135deg,#9B7BF8,#7C4DEF); color: #fff;
  box-shadow: 0 6px 14px rgba(124,77,239,.32);
}
.qt-grid .qt.is-ai .qt-ic .ai-tag{
  position: absolute; top: -6px; right: -8px; margin: 0; padding: 0 5px;
  height: 14px; line-height: 12px; border-radius: 999px;
  background: #EDE9FF; color: #6D5CE7; border: 1px solid #fff;
  font-size: 11px; font-weight: 700; letter-spacing: .2px;
  box-shadow: none; animation: none; z-index: 4;
}
[data-theme="dark"] .qt-grid .qt.is-ai .qt-ic .ai-tag{
  background: #3B3470; color: #eef1ff; border-color: rgba(255,255,255,.35);
}
.qt-grid .qt.is-ai .qt-bd b{
  background: none; -webkit-background-clip: border-box; background-clip: border-box;
  -webkit-text-fill-color: currentColor; color: #5b4bd6; font-weight: 700;
}
[data-theme="dark"] .qt-grid .qt.is-ai .qt-bd b{
  -webkit-background-clip: text;
  background: none; -webkit-text-fill-color: currentColor; color: #c4b2ff;
}
.qt-grid .qt.is-ai .qt-bd span, .qt-grid .qt.is-ai .qt-sub2{ color: #6b7390; }
[data-theme="dark"] .qt-grid .qt.is-ai .qt-bd span,
[data-theme="dark"] .qt-grid .qt.is-ai .qt-sub2{ color: #8b7af6; }

/* ④⑤（续）演唱会详情 · 筹备中心那 5 格里的「AI 计划」：与首页速办同一套皮（同一颗胶囊贴图标右上角） */
.func-grid.func-5 .f.is-ai{
  background: linear-gradient(165deg,#F2F0FF,#E9E9FD);
}
[data-theme="dark"] .func-grid.func-5 .f.is-ai{ background: linear-gradient(165deg,#2A2750,#232043); }
.func-grid.func-5 .f.is-ai .fi{
  position: relative; overflow: visible;
  background: linear-gradient(135deg,#9B7BF8,#7C4DEF); color: #fff;
  box-shadow: 0 6px 14px rgba(124,77,239,.32);
}
.func-grid.func-5 .f.is-ai .fi .ai-tag{
  position: absolute; top: -6px; right: -8px; margin: 0; padding: 0 5px;
  height: 14px; line-height: 12px; border-radius: 999px;
  background: #EDE9FF; color: #6D5CE7; border: 1px solid #fff;
  font-size: 11px; font-weight: 700; letter-spacing: .2px; box-shadow: none; animation: none; z-index: 4;
}
[data-theme="dark"] .func-grid.func-5 .f.is-ai .fi .ai-tag{ background: #3B3470; color: #eef1ff; border-color: rgba(255,255,255,.35); }
.func-grid.func-5 .f.is-ai .f-name{ color: #5b4bd6; font-weight: 700; }
[data-theme="dark"] .func-grid.func-5 .f.is-ai .f-name{ color: #c4b2ff; }
.func-grid.func-5 .f.is-ai .f-sub{ color: #6b7390; }
[data-theme="dark"] .func-grid.func-5 .f.is-ai .f-sub{ color: #8b7af6; }

/* ============================================================================
   v1.8.07 · 无感性能优化（视觉静止帧零变化）
   ① A1 已撤（v1.8.10）：真机滚动显示异常 —— 滚动期把毛玻璃置 none 会让内容
      透出「破相」、起止瞬间有变清 ↔ 变模糊跳变（iOS WebKit 还可能闪帧），且
      帧耗时无可测收益。整块回退、不做替代方案；4 处毛玻璃回到常驻 blur，
      一个字节不留（反向护栏见 smoke.mjs · v1.8.10 两条）。
   ② 首页 hero 扫光：**.hero-home::after 在本项目早已 content:none（不渲染）**，
      heroDrift 键帧没有任何运行时开销。此处把它的 background 保持为不渲染态、
      并把 animation 显式钉成 none —— 等效于「把一条已在跑的 background-position
      动画彻底关掉」，视觉与今天完全一致，且防止未来有人误恢复那条重绘动画。
   ============================================================================ */

.hero-home::after{
  background:
    radial-gradient(3px 3px at 18% 24%, #fff 0 100%, transparent),
    none;
  background-size: auto, auto;
  animation: none;
}

/* ============================================================================
   v1.9.02 · AI 识别热修 + 6 条 UI 收口（专段）
   ① [object Promise] 热修 = app.js（同步直取 + 就绪门闸），无 CSS；
   ② 筹备中心第 6 格「敬请期待」；
   ③ 顶栏右上动作按钮扁平款 —— 已就地落在上面的「⑤ 页面右上操作位」一节；
   ④ 行程空态两按钮同宽同高 —— 已就地落在 v1.5.76 那段（232×48）；
   ⑤ 海报缩略图 1px 浅描边 —— 已就地落在 .ps-pv 旁边（真缩略图 thumb.jpg 本体在 assets）；
   ⑥ 滑动光影下线 —— 已就地删除 v1.6.71 段的扫光 / 呼吸两条动效。
   ============================================================================ */

/* ② 敬请期待：不可跳转卡 —— 尺寸 / 圆角 / 底色与同排完全一致（沿用 .func-grid.func-5 .f 的底板），
   只把图标与文字弱化一档；点按无形变（不是可跳转入口），hover 抬起照旧。 */
.func-grid.func-5 .f.is-soon{ cursor: default; }
.func-grid.func-5 .f.is-soon:active{ transform: none; }
.func-grid.func-5 .f.is-soon:active .fi{ transform: none; }
.func-grid.func-5 .f.is-soon .fi{ background: rgba(150,150,230,.12); color: #6b7390; border-color: transparent; box-shadow: none; }
.func-grid.func-5 .f.is-soon .f-name{ color: #6b7390; }
.func-grid.func-5 .f.is-soon .f-sub{ color: #6b7390; font-weight: 700; }
[data-theme="dark"] .func-grid.func-5 .f.is-soon .fi{ background: rgba(150,150,230,.14); color: #8b7af6; }
[data-theme="dark"] .func-grid.func-5 .f.is-soon .f-name,
[data-theme="dark"] .func-grid.func-5 .f.is-soon .f-sub{ color: #8b7af6; }

/* ============================================================================
   v1.9.03 · 首页 hero 空态按钮缩半 + 顶栏动作钮胶囊轮廓（专段）
   ② 顶栏动作钮族（.bb-save / .edit-pill）的胶囊轮廓 —— 已就地落在上面的「⑤ 页面右上操作位」一节。
   ① 首页 hero 空态（两处状态卡共用 .hero-empty-grad）：两枚按钮几何完全统一 ——
      老板原话「尺寸小1/2，两个按钮对的样式保持一致」：高 48→28 / 圆角 999 / 12px·700 /
      内距 0 12 / min-width 126；主按钮内部同比缩小：加号 19→13 · AI 胶囊 11.5→9px（2px 6px · 左距 10）·
      竖分隔线 18→12。只统一形状与尺寸，不动配色（主=白底紫字 / 次=半透明底 + 1px 白描边 + 白字）。
      作用域只认 hero 空态 —— 行程页空态 .empty-acts（232×48）与悬浮加号（56×56）不受影响。
      回滚 = 删掉本段（回到 v1.8.06 的 48/999/15/19 口径）。
   ============================================================================ */
.card.empty-start.hero-empty-grad .heg-btn.ai-cta,
.card.empty-start.hero-empty-grad .heg-btn.solid.ai-cta,
.card.empty-start.hero-empty-grad .heg-btn.ghost{
  height: 28px; min-width: 126px; padding: 0 12px; border-radius: 999px;
  font-size: 12px; font-weight: 700;
}
.card.empty-start.hero-empty-grad .heg-btn.ai-cta svg,
.card.empty-start.hero-empty-grad .heg-btn.solid.ai-cta svg{
  width: 13px !important; height: 13px !important;
}
.card.empty-start.hero-empty-grad .heg-btn.ai-cta .ai-tag,
.card.empty-start.hero-empty-grad .heg-btn.solid.ai-cta .ai-tag{
  margin: 0 0 0 10px; padding: 2px 6px; font-size: 11px; letter-spacing: .2px;
}
.card.empty-start.hero-empty-grad .heg-btn.ai-cta .ai-tag::before,
.card.empty-start.hero-empty-grad .heg-btn.solid.ai-cta .ai-tag::before{
  height: 12px;
}

/* ============================================================================
   v1.9.04 · 票根票价计入花费统计（方案 A：派生不落库）—— 只加两枚展示件：
   ① 「来自票根」描边小签（花费明细流水 / 记账页派生行共用；参照时间轴 .tl-tag 的描边风格）；
   ② 花费明细里派生行整行可点（data-act=nav）的按压反馈。
   颜色沿用品牌紫，不用灰色（项目灰字禁令）；回滚 = 删掉本段 + 派生行渲染。
   ============================================================================ */
.tag-from-ticket{
  display: inline-flex; align-items: center; flex: none;
  margin-left: 6px; padding: 2px 7px; border-radius: 12px;
  font-size: 11px; font-weight: 600; line-height: 1.3;
  border: 1px solid rgba(124,92,240,.45); color: #6d5ce7; background: transparent;
  vertical-align: 1px;
}
[data-theme="dark"] .tag-from-ticket{ border-color: rgba(160,141,255,.5); color: #c4b2ff; }
.cost-flow[data-act="nav"]{ cursor: pointer; }
.cost-flow[data-act="nav"]:active{ background: rgba(124,92,240,.06); }
[data-theme="dark"] .cost-flow[data-act="nav"]:active{ background: rgba(160,141,255,.10); }

/* ============================================================================
   v1.9.07 · 历史场次 → 票根 → 纪念票 主线（专段）
   ① 成品页底部次级操作行 .mt-subacts —— 「编辑票根 / 补充现场记录」两枚 ghost 按钮
      等宽一行，位置在主按钮「保存图片」与「返回票册」之间。
      只复用现有 .btn.btn-ghost 外观（浅紫底 + 品牌字 + 胶囊圆角，深色主题走既有 [data-theme="dark"] 规则），
      不新建颜色、不建平行样式系统；两枚按钮高度沿用 .btn 的 min-height（46px），
      比主按钮（约 50px）略矮一档，保持主次层次。
   ② .btn-ghost 的按压态 / hover 全部继承既有规则，本段不需要另写。
   回滚 = 删掉本段（HTML 里 .mt-subacts 两枚按钮一并删除，reserveOf 194 回 146）。
   ============================================================================ */
.mt-subacts{ display:flex; align-items:center; gap:9px; margin:0 0 10px; }
.mt-subacts .btn{ flex:1 1 0; min-width:0; padding:13px 10px; font-size:14px; }
.mt-subacts .btn svg{ width:14px !important; height:14px !important; }

/* ===== W-005 · 注销账号抽屉（复用 .consent-mask / .consent-sheet 的遮罩与卡片）===== */
.del-desc{margin-top:10px;font-size:12px;line-height:1.7;color:var(--danger);}
.del-q{margin:14px 0 8px;font-size:12px;font-weight:600;color:var(--text);}
.del-reasons{display:flex;flex-wrap:wrap;gap:8px;}
.del-reason{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--border);border-radius:999px;font-size:12px;color:var(--text);cursor:pointer;}
.del-reason input[type="checkbox"]{-webkit-appearance:auto;appearance:auto;width:15px;height:15px;margin:0;accent-color:var(--danger);}
.del-reason.on{border-color:var(--danger);}
.del-other{width:100%;box-sizing:border-box;margin-top:10px;padding:8px 10px;border:1px solid var(--border);border-radius:10px;font:inherit;font-size:12px;color:var(--text);background:var(--card-solid);resize:none;}
.del-sheet .del-ok{margin-top:16px;}
.del-sheet .del-cancel{margin-top:8px;}
.del-other[hidden]{display:none;}

/* ===== W-010 · 新用户第一步（单页引导，沿用 .onb-wrap / .onb-slide / .onb-emoji 视觉）===== */
.onb-first .onb-actions .btn + .btn { margin-top: 12px; }
.onb-first .onb-links { display: flex; justify-content: center; gap: 22px; margin-top: 16px; }
.onb-first .onb-links .btn-link { width: auto; margin: 0; font-size: 12px; color: var(--text-2); }
[data-theme="dark"] .onb-first .onb-links .btn-link { color: #a8b0c8; }
/* 轻高亮：引导后落到详情页的「准备清单 / AI 计划」两格、以及被直接拉起的 AI 识别卡；3 秒内由脚本摘掉 */
.fx-glow { animation: fxGlow 1.4s ease-in-out 2; }
@keyframes fxGlow {
  0%, 100% { box-shadow: 0 0 0 0 rgba(107, 92, 246, 0); }
  50% { box-shadow: 0 0 0 4px rgba(107, 92, 246, .32), 0 6px 18px rgba(107, 92, 246, .28); }
}
@media (prefers-reduced-motion: reduce) { .fx-glow { animation: none; outline: 2px solid rgba(107, 92, 246, .45); outline-offset: 2px; } }


/* ===== W-019 · 体验打磨第一轮 ===== */
/* Q3-03：AI 计划首屏「当前计划」直达卡（已确认过计划才出现） */
.p31-curplan{display:flex;align-items:center;justify-content:space-between;width:100%;margin:0 0 12px;padding:12px 16px;border:1px solid rgba(109,92,231,.28);border-radius:16px;background:var(--card-solid);text-align:left;cursor:pointer;}
.p31-curplan-t{display:flex;flex-direction:column;gap:2px;}
.p31-curplan-t b{font-size:16px;font-weight:700;color:var(--text);}
.p31-curplan-t span{font-size:12px;color:var(--text-2);}
.p31-curplan-go{font-size:12px;font-weight:600;color:var(--primary);white-space:nowrap;}
/* Q3-06：页面底部留白只此一处 —— Tab 栏（底 7px + 高约 63px）+ 24px 余量 + 刘海屏 Home 条安全区。
   原来 5 种写法（100 / 95 / 90 / 110!important / 100!important），且都没算安全区：iPhone 带 Home 条时 Tab 栏上移 34px，最后约 10px 内容被盖。 */
/* W-064：#app 下沿本来就在安全区上方（.phone-shell 自带 padding-bottom:safe），而 .tabbar 的 bottom=max(0,safe-18) 又让它下探进安全区 ⇒
   导航坞顶边离 #app 下沿 = 74 − min(safe,18)。旧写法再 + 整个 safe 是重复扣（iPhone 多出约 40px）。现在 = 导航坞顶边 + 12px（+ 末项自带 8px 外边距 ≈ 20px）。 */
:root { --page-bottom: calc(86px - min(env(safe-area-inset-bottom, 0px), 18px)); }
/* Q3-07：有右下「＋」悬浮按钮的页面（按钮由 app.js 挂到 .phone-shell 下），列表末尾再让出按钮高度，滚到底时不压「设预算」等最后一行 */
.phone-shell:has(> .fab-add) .page > *:last-child { margin-bottom: calc(84px + min(env(safe-area-inset-bottom, 0px), 18px)); }   /* W-064：72 实测仍被「＋」盖 8px（＋顶离导航坞顶 92px） */
/* Q3-16：AI 计划四张入口卡按内容高度排（原来被 flex:1 撑满整屏，每张约一半是空白） */
.plan31-page .p31-home{ min-height: 0; }
.plan31-page .p31-home .p31-cta{ flex: 0 0 auto; }
/* Q3-15：准备清单分类胶囊一行放不下时折成两行（原来横排截断「穿搭美妆」且无横滑提示） */
#pack-chips{ flex-wrap: wrap; overflow: visible; row-gap: 8px; }
/* Q3-19：「删除这场」从场次详情挪到编辑页底部，改成小号危险色文字链 */
/* W-025：「删除这场」改成规范 §4 危险按钮（淡危险底 + 危险色字 · 高 44 · 圆角 12），与保存按钮隔 18px */
.del-concert-link{ margin-top:18px; }
/* W-023 合层补丁：选择器组里混着作品类选择器的规则，只给非作品类部分统一（3 条） */
.recap-year.on{color:#6d5ce7}
[data-theme="dark"] .recap-year.on{color:#eef1ff}
[data-theme="dark"] .p35-bd strong, [data-theme="dark"] .p35-day{color:#eef1ff}
/* ===== W-020 设计令牌（docs/design-tokens.md，老板 2026-10-15 拍板）===== */
:root{
  --fs-xs:11px; --fs-sm:12px; --fs-md:14px; --fs-lg:16px; --fs-xl:18px; --fs-2xl:22px; --fs-num:28px;
  --c-brand:#6d5ce7; --c-brand-deep:#5b4bd6; --c-brand-soft:rgba(109,92,231,.10); --c-accent:#4a6cf7; --c-gold:#f5b94e; --c-gold-ink:#8a5a00;
  --c-text:#1a1f36; --c-text-2:#5a6178; --c-text-3:#6b7390; --c-bg:#e9ecfa; --c-card:#ffffff; --c-line:rgba(109,92,231,.30);
  --c-danger:#dc3545; --c-danger-soft:rgba(220,53,69,.10); --c-success:#1f9d63; --c-pink:#d6457f; --c-on-brand:#ffffff;
  --r-sm:8px; --r-md:12px; --r-lg:18px; --r-pill:999px; --gap-page:12px; --gap-card:12px; --pad-card:16px;
}
[data-theme="dark"]{
  --c-brand:#8b7af6; --c-brand-deep:#c4b2ff; --c-brand-soft:rgba(139,122,246,.16); --c-accent:#6b85ff; --c-gold-ink:#f5b94e;
  --c-text:#eef1ff; --c-text-2:#a8b0c8; --c-text-3:#9aa1b5; --c-bg:#0b0f1c; --c-card:#161c2e; --c-line:rgba(160,140,255,.34);
  --c-danger:#ff9d9d; --c-danger-soft:rgba(248,113,113,.16); --c-success:#5fd39b; --c-pink:#ff8cc0;
}
/* W-020 ④ 页头：二级页一律 backBar —— 返回 40×40 + 左对齐标题 18/700；AI 计划（原居中 16/600）与帖子详情（原粉色实心条）改回同一长相 */
.back-bar .bb-title{ font-size:var(--fs-xl); font-weight:700; }
.plan31-page > .back-bar{ padding:env(safe-area-inset-top) 12px 0; margin:0 -12px 8px; min-height:calc(59px + env(safe-area-inset-top)); background:linear-gradient(rgba(236,238,252,.9), rgba(238,236,252,0)); }
[data-theme="dark"] .plan31-page > .back-bar{ background:linear-gradient(rgba(12,14,26,.92), rgba(12,14,26,0)); }
.plan31-page > .back-bar .bb-back{ width:40px; height:40px; min-width:40px; min-height:40px; }
.plan31-page > .back-bar .bb-title{ font-size:var(--fs-xl); font-weight:700; text-align:left; justify-content:flex-start; flex:1 1 auto; position:static; left:auto; transform:none; max-width:none; }
.page:has(.post-detail) .back-bar, .page:has(.post-detail) .back-bar.bb-over-img{ background:linear-gradient(rgba(236,238,252,.96), rgba(238,236,252,.86)); box-shadow:none; }
[data-theme="dark"] .page:has(.post-detail) .back-bar, [data-theme="dark"] .page:has(.post-detail) .back-bar.bb-over-img{ background:linear-gradient(rgba(12,14,26,.96), rgba(12,14,26,.86)); box-shadow:none; }
.page:has(.post-detail) .back-bar .bb-back{ width:40px; height:40px; }
/* W-020 ⑤ 边距：主体 12px（AI 计划原 16 → 12）；登录 / 引导整屏插画页 24px 为例外 */
.plan31-page{ padding-left:12px !important; padding-right:12px !important; }
/* W-020 ⑥ 状态胶囊（Q3-13）：压在紫色大卡上的胶囊一律白底深字，对比度 ≥4.5:1（原蓝字压紫底 / 金字压紫底几乎看不清） */
.hero-card .tag, .hero-card .tag-blue, .hero-card .tag-gold, .hero-card .tag-gray{ background:#ffffff !important; border-color:transparent !important; -webkit-text-fill-color:currentColor; }
.hero-card .tag-blue{ color:#5b4bd6 !important; }
.hero-card .tag-gold{ color:#8a5a00 !important; }
.hero-card .tag-gray, .hero-card .tag:not(.tag-blue):not(.tag-gold){ color:#5a6178 !important; }
/* W-020 ③ AI 计划自有字号阶梯并入全站 7 档（17/15/13 → 18/16/14） */
:root, .plan31-page, .plan-page{ --ai-fs-1:18px; --ai-fs-2:16px; --ai-fs-3:14px; --ai-fs-4:12px; --ai-fs-5:11px; }
/* W-020 ② 按钮收口：全站只剩 主 / 次 / 文字 / 危险 4 种 × 默认(44) / 小号(32)，圆角 12，字 14/600（小号 12/600）。
   21 个旧类名保留做别名，长相一律归到这 4 种；按下 = 亮度 -8%，禁用 = .45 且不响应，加载中沿用「保存中…」+ disabled。 */
button, [role="button"]{ font-size:var(--fs-md); font-weight:600; }
.btn, .ai-cta, .bb-save, .heg-btn, .del-ok{ min-height:44px !important; border-radius:var(--r-md) !important; font-size:var(--fs-md) !important; font-weight:600 !important; }
.btn.btn-sm, .edit-pill, .btn-sm{ min-height:32px !important; height:auto; font-size:var(--fs-sm) !important; font-weight:600 !important; border-radius:var(--r-md) !important; }
/* 页头右侧操作 = 小号胶囊（样张：高 32、999 圆角） */
.back-bar .bb-actions .btn, .back-bar .edit-pill, .edit-pill{ border-radius:var(--r-pill) !important; }
.btn-text, .btn-link, .ps-rule, .rule-link{ min-height:0 !important; background:none !important; border:0 !important; box-shadow:none !important; color:var(--c-brand) !important; font-size:var(--fs-md) !important; font-weight:600 !important; }
.btn-primary:not(.tk-share-modal *):not(.mt-show *), .ai-cta, .bb-save{ background:var(--grad-brand) !important; color:#ffffff !important; border:0 !important; }   /* 纪念票大图 / 分享抽屉是作品类同族金色，豁免 */
.btn-ghost, .btn-glass, .heg-btn, .edit-pill{ background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; border-color:transparent !important; box-shadow:none !important; }
.btn-danger, .del-ok{ background:var(--c-danger-soft) !important; color:var(--c-danger) !important; border-color:transparent !important; box-shadow:none !important; }
.modal .btn-danger, .modal .del-ok, .modal-mask .btn-danger{ background:var(--c-danger) !important; color:#ffffff !important; }
.btn:active, .ai-cta:active, .edit-pill:active, .heg-btn:active{ filter:brightness(.92); }
.btn[disabled], .btn:disabled, button:disabled{ opacity:.45; pointer-events:none; }
/* W-020 ⑤ 登录 / 新用户引导：整屏插画页统一 24px（原 32 / 26） */
.auth-wrap, .onb-wrap{ padding-left:24px !important; padding-right:24px !important; }
/* W-020 ③ <b>/<strong> 默认是 bolder（父级 700 时会变 900）：钉成 700 */
b, strong{ font-weight:700; }
/* W-023 合层校准：统一层合回原选择器后，层叠顺序回到原表；下面几条把老板 W-020 验收时看到的值钉住（视觉 0 变化） */
.rc-top .grow > b{ font-size:16px; }
.rc-cell b{ font-size:16px; }
.hot-txt b{ font-size:11px; }
.grid2 .muted, form .card > .muted, .card > .row.between > span.muted, .pr-links .list-item > span.muted, .pf-jump > span.muted{ font-size:12px; }
.cat-tabs > .chip, .pr-links .list-item > .chip, .page > .seg{ border-radius:12px; }
.tk-styles .tkopt:not(.on):not(.active), .page > .seg > button:not(.on){ border-radius:12px !important; }
.tk-styles .tkopt:not(.on):not(.active), .cat-select .cat-option:not(.on):not(.active), .detail-action-bar .comment-entry{ color:#6b7390; }
.recap-banner-go{ font-size:22px; }
.topbar .notif-bell{ color:#5b4bd6; }
.post-author-name{ font-size:12px; }
.pr-links .list-item, .pr-links .list-item > .li-ico{ font-size:12px; }
/* W-023 · 卡片式按钮规范（docs/design-tokens.md §4.5）：功能格 3 列 × 高 92 / 快捷格 4 列 × 高 76 / 行卡高 76；圆角一律 --r-lg */
.qt-grid, .func-grid{ display:grid !important; grid-template-columns:repeat(3, minmax(0, 1fr)) !important; gap:10px !important; }
.qt-grid > .qt, .func-grid > .f{ width:auto !important; min-width:0 !important; margin:0 !important; aspect-ratio:auto !important; height:92px !important; min-height:92px !important; padding:10px 6px !important; border-radius:var(--r-lg) !important; box-sizing:border-box; display:flex !important; flex-direction:column; align-items:center; justify-content:center; gap:4px; }
.qt-grid > .qt .qt-ic, .func-grid > .f .fi{ width:32px !important; height:32px !important; min-width:32px; border-radius:10px; display:inline-flex; align-items:center; justify-content:center; }
.qt-grid > .qt .qt-ic svg, .func-grid > .f .fi svg{ width:20px !important; height:20px !important; }
.qt-grid > .qt .qt-bd b, .func-grid > .f .f-name{ font-size:var(--fs-md) !important; font-weight:600 !important; line-height:1.25 !important; }
.qt-grid > .qt .qt-bd span, .func-grid > .f .f-sub{ font-size:var(--fs-xs) !important; font-weight:400 !important; line-height:1.3 !important; }
.ht-grid{ display:grid !important; grid-template-columns:repeat(4, minmax(0, 1fr)) !important; gap:8px !important; }
.ht-grid > .ht{ height:76px !important; min-height:76px !important; padding:8px 4px !important; border-radius:var(--r-lg) !important; box-sizing:border-box; display:flex !important; flex-direction:column; align-items:center; justify-content:center; gap:2px; }
.ht-grid > .ht .ht-ic{ width:24px !important; height:24px !important; }
.ht-grid > .ht > b{ font-size:var(--fs-xl) !important; font-weight:700 !important; line-height:1.15 !important; }
.ht-grid > .ht > span{ font-size:var(--fs-sm) !important; font-weight:600 !important; }
.p31-home .p31-cta, .plan31-page .p31-home .p31-cta.is-main, .plan31-page .p31-home .p31-cta.is-sub, .mem-act{ min-height:76px !important; height:auto; padding:14px 16px !important; border-radius:var(--r-lg) !important; box-sizing:border-box; }
/* ===== W-025 · 危险按钮统一 + 彩色底上的按钮（docs/design-tokens.md §4 第 5、6 种）===== */
.btn-danger, .del-ok{ background:var(--c-danger-soft) !important; color:var(--c-danger) !important; border:0 !important; box-shadow:none !important; }
.modal .btn-danger, .modal-mask .btn-danger, .consent-sheet .del-ok, .del-ok{ background:var(--c-danger) !important; color:#ffffff !important; }
[data-theme="dark"] .modal .btn-danger, [data-theme="dark"] .modal-mask .btn-danger, [data-theme="dark"] .del-ok{ background:#e5484d !important; color:#ffffff !important; }
/* 规范第 5 种 · on-color 主：白色实底 + 品牌深紫字 + 轻投影（紫色 / 渐变卡片上最醒目的那一颗）
   第 6 种 · on-color 次：深紫 22% 透明底 + 白字 + 1px 白半透明描边（白 18% 底在浅紫卡上只有 3.3:1，改深色薄底才 ≥5.3:1）。两种都压过 .ai-cta 的渐变（W-020 那条 !important 把白底盖成了同色渐变 = 老板说的「看不清是按钮」） */
.btn.oc-main, .heg-btn.oc-main, .heg-btn.ai-cta.oc-main{ min-height:44px !important; height:44px !important; padding:0 18px !important; border-radius:var(--r-pill) !important; background:#ffffff !important; color:#5b4bd6 !important; -webkit-text-fill-color:#5b4bd6; border:0 !important; font-size:var(--fs-md) !important; font-weight:700 !important; box-shadow:0 6px 16px rgba(28,20,80,.22) !important; }
.heg-btn.ai-cta.oc-main .ai-tag{ background:#efedff !important; color:#5b4bd6 !important; }
.heg-btn.ai-cta.oc-main svg{ color:#5b4bd6; }
.btn.oc-sub, .heg-btn.oc-sub{ min-height:44px !important; height:44px !important; padding:0 16px !important; border-radius:var(--r-pill) !important; background:rgba(30,20,90,.22) !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; border:1px solid rgba(255,255,255,.55) !important; font-size:var(--fs-md) !important; font-weight:600 !important; box-shadow:none !important; }
.oc-icon{ background:rgba(30,20,90,.22) !important; color:#ffffff !important; border:1px solid rgba(255,255,255,.55) !important; }
.oc-main:active, .oc-sub:active{ filter:brightness(.94); transform:scale(.98); }
[data-theme="dark"] .btn.oc-main, [data-theme="dark"] .heg-btn.oc-main{ background:#ffffff !important; color:#5b4bd6 !important; }
.card.empty-start.hero-empty-grad .heg-acts{ gap:10px; flex-wrap:wrap; }
/* ===== W-030 · 小控件统一（docs/design-tokens.md §4.6）===== */
/* 筛选胶囊：常规 32 / 小号 28；未选中 = 品牌淡底深紫字无描边，选中 = 品牌渐变白字 */
.chip, .cat-option, .tkopt, .feed-sort > button, .seg-mini > button{ height:32px !important; min-height:32px !important; padding:0 14px !important; border-radius:var(--r-pill) !important; border:0 !important; box-shadow:none !important; font-size:var(--fs-sm) !important; font-weight:600 !important; background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; }
.cat-tab, .head-mini, .link-more.head-mini, .tk-prev-zoom, .t-act-btn{ height:28px !important; min-height:28px !important; padding:0 12px !important; border-radius:var(--r-pill) !important; border:0 !important; box-shadow:none !important; font-size:var(--fs-xs) !important; font-weight:600 !important; background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; }
.chip.active, .chip.on, .cat-option.on, .tkopt.active, .cat-tab.on, .feed-sort > button.on{ background:var(--grad-brand) !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; }
.tk-styles .tkopt:not(.on):not(.active), .page > .seg > button:not(.on){ border-radius:var(--r-pill) !important; }
.cat-tabs > .chip, .pr-links .list-item > .chip{ border-radius:var(--r-pill) !important; }
/* 横向放不下：可横滑 + 右侧渐隐提示（准备清单那条 W-019 定为折两行，不动） */
.cat-tabs:not(#pack-chips), .community-header .cat-tabs, .tk-styles, .cat-select{ overflow-x:auto; flex-wrap:nowrap; scrollbar-width:none; -webkit-mask-image:linear-gradient(90deg, #000 calc(100% - 24px), transparent); mask-image:linear-gradient(90deg, #000 calc(100% - 24px), transparent); }
/* 圆形图标按钮：常规 40 / 小号 32（热区透明外扩到 44） */
.bb-back, .notif-bell, .action-icon-btn, .icon-btn, .plan31-page > .back-bar .bb-back, .page:has(.post-detail) .back-bar .bb-back{ width:40px !important; height:40px !important; min-width:40px !important; min-height:40px !important; padding:0 !important; border-radius:50% !important; border:0 !important; background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; font-size:var(--fs-md) !important; font-weight:600 !important; display:inline-flex; align-items:center; justify-content:center; }
.bb-back svg, .notif-bell svg, .action-icon-btn svg, .icon-btn svg{ width:20px; height:20px; }
.oc-icon, .icon-sm, .t-clean{ position:relative; width:32px !important; height:32px !important; min-width:32px !important; min-height:32px !important; padding:0 !important; border-radius:50% !important; font-size:var(--fs-md) !important; font-weight:600 !important; display:inline-flex; align-items:center; justify-content:center; }
.oc-icon svg, .icon-sm svg, .t-clean svg{ width:16px; height:16px; }
.oc-icon::after, .icon-sm::after, .t-clean::after{ content:''; position:absolute; inset:-6px; }
.action-icon-btn.active{ color:#dc3545 !important; } .action-icon-btn.fav-active{ color:#b97a00 !important; }
/* 文字按钮：高 32 · 14/600 · 品牌色（热区外扩） */
.btn-text, .btn-link, .comment-reply, .comment-like, .up-hint-link, .ps-rule, .rule-link{ position:relative; height:32px !important; min-height:32px !important; padding:0 6px !important; border-radius:0 !important; border:0 !important; background:none !important; box-shadow:none !important; font-size:var(--fs-md) !important; font-weight:600 !important; color:var(--c-brand) !important; display:inline-flex; align-items:center; }
.btn-text::after, .btn-link::after, .comment-reply::after, .comment-like::after{ content:''; position:absolute; inset:-6px 0; }
/* 按钮高度：主 / 次 / 危险 44，小号 32；次按钮去描边（同一长相） */
.btn:not(.btn-sm):not(.oc-main):not(.oc-sub){ height:44px !important; }
.btn.btn-sm:not(.oc-main):not(.oc-sub){ height:32px !important; }
.btn-ghost{ border:0 !important; }
/* W-030 补：点赞小胶囊 / 卡片角「自选 · 去社区」/ 回忆页分段 / 页头编辑胶囊 / 「更多 · 共 N 档」并入同一套 */
.xh-like, .link-more{ height:28px !important; min-height:28px !important; padding:0 12px !important; border-radius:var(--r-pill) !important; border:0 !important; font-size:var(--fs-xs) !important; font-weight:600 !important; background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; }
.page > .seg > button, .page > .seg > button:not(.on){ height:32px !important; min-height:32px !important; padding:0 14px !important; border-radius:var(--r-pill) !important; border:0 !important; font-size:var(--fs-sm) !important; font-weight:600 !important; background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; }
.page > .seg > button.on{ background:var(--grad-brand) !important; color:#ffffff !important; }
.edit-pill, .back-bar .bb-actions .btn{ height:32px !important; min-height:32px !important; border:0 !important; }
.ps-more{ height:32px !important; border-radius:var(--r-pill) !important; font-size:var(--fs-sm) !important; font-weight:600 !important; background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; }
/* ===== W-032 · 老板真机反馈 6 条 ===== */
/* ① 首页倒计时卡：倒计时收成底部一条毛玻璃横条（09 天 07:24:34），标题 / 场馆 / 倒计时都在卡片底部，底部渐变遮罩保字可读；
      左上状态签与右上两颗圆钮缩小、半透明深底，尽量不压画面中上部（人脸常在中上）。所有版式（data-lay）一律适用。 */
.hero-card.hero-home[data-lay]{ display:flex !important; flex-direction:column !important; justify-content:flex-end !important; align-items:stretch !important; min-height:220px; position:relative; overflow:hidden; }
.hero-card.hero-home[data-lay]::after{ content:''; position:absolute; inset:0; background:linear-gradient(180deg, rgba(10,8,30,0) 34%, rgba(10,8,30,.30) 58%, rgba(10,8,30,.74) 100%); pointer-events:none; z-index:0; }
.hero-card.hero-home[data-lay] > *{ position:relative; z-index:1; }
.hero-card.hero-home[data-lay] > .stars-bg{ position:absolute; z-index:0; }
.hero-card.hero-home[data-lay] .hero-top{ position:absolute !important; top:12px !important; left:12px !important; right:12px !important; z-index:2 !important; margin:0 !important; display:flex !important; justify-content:space-between !important; align-items:center !important; }
.hero-card.hero-home[data-lay] .hero-status{ font-size:var(--fs-xs) !important; padding:3px 9px !important; border-radius:var(--r-pill) !important; background:rgba(10,8,30,.36) !important; color:#ffffff !important; border:0 !important; -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px); }
.hero-card.hero-home[data-lay] .oc-icon{ background:rgba(10,8,30,.36) !important; border:0 !important; }
.hero-card.hero-home[data-lay] .artist{ margin:0 !important; text-align:left !important; }
.hero-card.hero-home[data-lay] .place{ margin:6px 0 0 !important; text-align:left !important; }
.hero-card.hero-home[data-lay] .countdown{ position:static !important; inset:auto !important; transform:none !important; display:inline-flex !important; flex-direction:row !important; flex-wrap:nowrap !important; align-items:baseline !important; align-self:flex-start !important; gap:0 !important; width:auto !important; height:auto !important; margin:10px 0 0 !important; padding:7px 14px !important; border-radius:var(--r-pill) !important; background:rgba(255,255,255,.16) !important; border:1px solid rgba(255,255,255,.28) !important; box-shadow:none !important; -webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px); grid-template-columns:none !important; }
.hero-card.hero-home[data-lay] .countdown .unit{ display:inline-flex !important; align-items:baseline !important; flex:none !important; width:auto !important; height:auto !important; min-width:0 !important; min-height:0 !important; padding:0 !important; margin:0 !important; background:none !important; border:0 !important; box-shadow:none !important; -webkit-backdrop-filter:none; backdrop-filter:none; border-radius:0 !important; }
.hero-card.hero-home[data-lay] .countdown .num{ font-size:var(--fs-xl) !important; font-weight:700 !important; line-height:1 !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; background:none !important; font-variant-numeric:tabular-nums; letter-spacing:.4px; }
.hero-card.hero-home[data-lay] .countdown .lbl{ display:none !important; }
.hero-card.hero-home[data-lay] .countdown .unit:first-child .lbl{ display:inline !important; font-size:var(--fs-sm) !important; font-weight:600 !important; color:rgba(255,255,255,.86) !important; margin:0 8px 0 3px !important; }
.hero-card.hero-home[data-lay] .countdown .unit:nth-child(2)::after, .hero-card.hero-home[data-lay] .countdown .unit:nth-child(3)::after{ content:':'; color:#ffffff; font-size:var(--fs-xl); font-weight:700; margin:0 1px; }
.hero-card.hero-home[data-lay] .cd-live{ background:rgba(255,255,255,.16); border-radius:var(--r-pill); padding:6px 12px; }

/* ② 本场速办 / 筹备中心：扁平图标 —— 该色约 12% 浅实底 + 同色实心图形，无渐变 / 高光 / 阴影；副标题弱化、进度条更细 */
.qt-grid > .qt .qt-ic[data-k], .func-grid > .f .fi[data-k]{ --flat-cut:#ffffff; width:40px !important; height:40px !important; min-width:40px !important; border-radius:12px !important; background:var(--k-bg) !important; color:var(--k) !important; border:0 !important; box-shadow:none !important; display:inline-flex !important; align-items:center !important; justify-content:center !important; }
.qt-grid > .qt .qt-ic[data-k] svg{ width:22px !important; height:22px !important; } .func-grid > .f .fi[data-k] svg{ width:22px !important; height:22px !important; }
[data-k="sparkles"], [data-k="flag"]{ --k:#6d5ce7; --k-bg:rgba(109,92,231,.13); }
[data-k="checklist"], [data-k="clock"]{ --k:#4a6cf7; --k-bg:rgba(74,108,247,.13); }
[data-k="wallet"], [data-k="users"]{ --k:#e8a33d; --k-bg:rgba(232,163,61,.16); }
[data-k="hotel"], [data-k="train"]{ --k:#2bb3a3; --k-bg:rgba(43,179,163,.15); }
[data-k="ticket"], [data-k="camera"]{ --k:#e05a8f; --k-bg:rgba(224,90,143,.13); }
[data-k="gift"]{ --k:#8b90a8; --k-bg:rgba(139,144,168,.15); }
[data-theme="dark"] .qt-grid > .qt .qt-ic[data-k], [data-theme="dark"] .func-grid > .f .fi[data-k]{ --flat-cut:#1d2338; }
[data-theme="dark"] [data-k]{ --k-bg:rgba(139,122,246,.18); }
[data-theme="dark"] [data-k="checklist"], [data-theme="dark"] [data-k="clock"]{ --k:#6b85ff; --k-bg:rgba(107,133,255,.18); }
[data-theme="dark"] [data-k="wallet"], [data-theme="dark"] [data-k="users"]{ --k:#f5b94e; --k-bg:rgba(245,185,78,.18); }
[data-theme="dark"] [data-k="hotel"], [data-theme="dark"] [data-k="train"]{ --k:#4fd1bf; --k-bg:rgba(79,209,191,.16); }
[data-theme="dark"] [data-k="ticket"], [data-theme="dark"] [data-k="camera"]{ --k:#ff8cc0; --k-bg:rgba(255,140,192,.16); }
[data-theme="dark"] [data-k="sparkles"], [data-theme="dark"] [data-k="flag"]{ --k:#a99bff; }
.qt-grid > .qt .qt-bd span, .func-grid > .f .f-sub{ color:var(--c-text-3) !important; font-weight:400 !important; }
.qt-grid > .qt .qt-bar, .func-grid > .f .f-prog{ height:3px !important; border-radius:3px !important; }

/* ③ AI 角标：品牌紫实色胶囊 + 白色粗体 AI + 右上小星光，一种尺寸（高 18），贴在标题文字右侧；
      紫色 / 渐变底上（悬浮加号、首步引导主按钮）反色成白底紫字，免得同色看不见 */
.ai-tag, span.ai-tag, i.ai-tag{ position:relative !important; display:inline-flex !important; align-items:center !important; justify-content:center; height:18px !important; min-height:18px !important; padding:0 9px 0 6px !important; margin:0 0 0 5px !important; border-radius:var(--r-pill) !important; background:#6d5ce7 !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; font-size:var(--fs-xs) !important; font-weight:700 !important; font-style:normal !important; line-height:1 !important; letter-spacing:.2px; border:0 !important; box-shadow:none !important; top:auto !important; right:auto !important; bottom:auto !important; left:auto !important; transform:none !important; vertical-align:middle; flex:none; }
.ai-tag::before{ display:none !important; }
.ai-tag::after{ content:'' !important; position:absolute !important; top:2px !important; right:2px !important; width:6px !important; height:6px !important; background:#ffffff !important; border:0 !important; clip-path:polygon(50% 0, 62% 38%, 100% 50%, 62% 62%, 50% 100%, 38% 62%, 0 50%, 38% 38%); display:block !important; }
.fab-add .ai-tag, .btn-primary .ai-tag, .ai-cta:not(.oc-main) .ai-tag{ background:#ffffff !important; color:#6d5ce7 !important; -webkit-text-fill-color:#6d5ce7; }
.fab-add .ai-tag::after, .btn-primary .ai-tag::after, .ai-cta:not(.oc-main) .ai-tag::after{ background:#6d5ce7 !important; }
[data-theme="dark"] .ai-tag:not(.fab-add .ai-tag){ background:#7c6cf0 !important; }

/* ④ 社区排序：分类行右侧小号文字切换「最新 · 最热」（选中加粗 + 品牌色 + 下方小圆点），分类胶囊照旧横滑不被挤压 */
.cat-row{ display:flex !important; align-items:center !important; gap:10px !important; }
.cat-row > .cat-tabs{ flex:1 1 auto !important; min-width:0 !important; }
.sort-text{ flex:none; display:inline-flex; align-items:center; gap:2px; }
.sort-text > button{ position:relative; height:28px !important; min-height:0 !important; padding:0 3px !important; border:0 !important; background:none !important; box-shadow:none !important; font-size:var(--fs-sm) !important; font-weight:600 !important; color:var(--c-text-3) !important; }
.sort-text > button.on{ color:var(--c-brand) !important; font-weight:700 !important; }
.sort-text > button.on::after{ content:''; position:absolute; left:50%; bottom:1px; width:4px; height:4px; margin-left:-2px; border-radius:50%; background:var(--c-brand); }
.sort-text > i{ font-style:normal; font-size:var(--fs-sm); color:var(--c-text-3); }

/* ⑤ 「我的」统计：紧凑统计行（数字 + 小标签竖排、四列均分、无方块边框、列间细分隔线），与资料卡同一块面 */

/* ⑥ 底部导航：白色圆角底栏 + 扁平线性图标；选中 = 品牌紫实心图标 + 下方小圆点（去掉大块渐变选中胶囊），未选中灰色描边；保留小号文字 */
nav.tabbar{ background:#ffffff !important; border:0 !important; box-shadow:0 8px 24px rgba(40,30,110,.10) !important; -webkit-backdrop-filter:none; backdrop-filter:none; }
nav.tabbar .tab, nav.tabbar .tab.on{ position:relative; background:none !important; box-shadow:none !important; border:0 !important; transform:none !important; color:#8b90a8 !important; gap:2px !important; }
nav.tabbar .tab.on{ color:#6d5ce7 !important; }
nav.tabbar .tab::before{ display:none !important; }
nav.tabbar .tab .ti, nav.tabbar .tab .ti svg{ width:24px !important; height:24px !important; }
nav.tabbar .tab > span:last-child{ font-size:var(--fs-xs) !important; font-weight:600 !important; }
nav.tabbar .tab.on::after{ content:'' !important; position:absolute !important; left:50% !important; bottom:4px !important; width:5px !important; height:5px !important; margin-left:-2.5px !important; border-radius:50% !important; background:#6d5ce7 !important; display:block !important; }
nav.tabbar .tab.on > span:last-child{ font-weight:700 !important; }
nav.tabbar .tab .ti svg{ --flat-cut:#ffffff; }
[data-theme="dark"] nav.tabbar{ background:#161c2e !important; box-shadow:0 8px 24px rgba(0,0,0,.4) !important; }
[data-theme="dark"] nav.tabbar .tab{ color:#8b90a8 !important; }
[data-theme="dark"] nav.tabbar .tab.on{ color:#a99bff !important; }
[data-theme="dark"] nav.tabbar .tab.on::after{ background:#a99bff !important; }
[data-theme="dark"] nav.tabbar .tab .ti svg{ --flat-cut:#161c2e; }
/* W-032 ① 补：旧版式规则选择器更具体（带 data-lay 值），用 #cd 钉死横条排版；冒号改成行内字符 */
#cd.countdown{ display:inline-flex !important; flex-direction:row !important; align-items:baseline !important; gap:0 !important; }
#cd.countdown .unit{ display:inline-flex !important; flex-direction:row !important; align-items:baseline !important; position:static !important; width:auto !important; min-width:0 !important; height:auto !important; padding:0 !important; margin:0 !important; background:none !important; border:0 !important; box-shadow:none !important; }
#cd.countdown .num{ display:inline !important; width:auto !important; min-width:0 !important; height:auto !important; }
#cd.countdown .lbl{ display:none !important; }
#cd.countdown .unit:first-child .lbl{ display:inline !important; margin:0 8px 0 3px !important; }
#cd.countdown .unit::before{ display:none !important; }
#cd.countdown .unit::after{ display:none !important; content:none !important; }
#cd.countdown .unit:nth-child(2)::after, #cd.countdown .unit:nth-child(3)::after{ display:inline !important; content:':' !important; position:static !important; inset:auto !important; width:auto !important; height:auto !important; background:none !important; color:#ffffff !important; font-size:var(--fs-xl) !important; font-weight:700 !important; line-height:1 !important; margin:0 1px !important; }
/* W-032 ② 补：图标块在纵向 flex 里被压扁 —— 不许缩 */
.qt-grid > .qt .qt-ic[data-k], .func-grid > .f .fi[data-k]{ flex:none !important; min-height:40px !important; max-height:40px !important; }
nav.tabbar .tab .ti, nav.tabbar .tab.on .ti{ background:none !important; box-shadow:none !important; border:0 !important; }

/* ===== W-035 · 老板测试版反馈 14 条（docs/design-tokens.md §4：小号按钮 36 / 14）===== */
/* 总原则：卡片内按钮降一档 = 小号 36 高 · 14/600 · 0 16；页头右侧胶囊仍 32（W-030 §4.6） */
.btn.btn-sm:not(.oc-main):not(.oc-sub), .btn-sm{ height:36px !important; min-height:36px !important; padding:0 16px !important; font-size:var(--fs-md) !important; font-weight:600 !important; }
.back-bar .bb-actions .btn.btn-sm{ height:32px !important; min-height:32px !important; }
.btn.btn-sm.oc-main, .btn.btn-sm.oc-sub{ height:36px !important; min-height:36px !important; padding:0 16px !important; font-size:var(--fs-md) !important; font-weight:600 !important; }
/* ① 首页空态卡两颗按钮：36 高并排；白底主按钮上的 AI 角标 = 品牌紫实底白字 */
.card.empty-start.hero-empty-grad .heg-acts{ flex-wrap:nowrap !important; gap:8px !important; }
.card.empty-start.hero-empty-grad .heg-acts .heg-btn, .heg-acts .heg-btn.oc-main, .heg-acts .heg-btn.oc-sub{ height:36px !important; min-height:36px !important; padding:0 16px !important; font-size:var(--fs-md) !important; font-weight:600 !important; white-space:nowrap; }
.heg-acts .heg-btn svg{ width:16px !important; height:16px !important; }
.heg-btn.ai-cta.oc-main .ai-tag, .btn.oc-main .ai-tag{ background:var(--c-brand) !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; }
.heg-btn.ai-cta.oc-main .ai-tag::after, .btn.oc-main .ai-tag::after{ background:#ffffff !important; }
/* ② 首页统计宫格：图标块 36 / 图形 20；数字 18 · 标签 11 */
.ht-grid > .ht .ht-ic{ width:36px !important; height:36px !important; min-width:36px; border-radius:11px !important; display:inline-flex !important; align-items:center; justify-content:center; }
.ht-grid > .ht .ht-ic svg{ width:20px !important; height:20px !important; }
.ht-grid > .ht > b{ font-size:var(--fs-xl) !important; line-height:1.1 !important; }
.ht-grid > .ht > span{ font-size:var(--fs-xs) !important; font-weight:600 !important; }
/* ④ 「去社区 ›」= 文字按钮（无底色 13/600 品牌色），与标题同一基线 */
.card-head:has(> .card-link){ display:flex; align-items:baseline !important; justify-content:space-between; }
.card-link{ height:auto !important; min-height:0 !important; padding:0 !important; margin:0; border:0 !important; background:none !important; box-shadow:none !important; font-size:13px !important; font-weight:600 !important; line-height:1.4; color:var(--c-brand) !important; cursor:pointer; }
.card-link:active{ opacity:.7; }
/* ⑤ 倒计时重做：「76」大号 + 「天」小字；时分秒各一个小毛玻璃块（等宽数字，块间冒号弱化）；整体左对齐贴卡片底部，无大胶囊边框 */
.hero-card #cd.countdown{ align-items:center !important; gap:8px !important; margin:12px 0 0 !important; padding:0 !important; background:none !important; border:0 !important; border-radius:0 !important; box-shadow:none !important; -webkit-backdrop-filter:none !important; backdrop-filter:none !important; }
.hero-card #cd.countdown .unit:first-child{ align-items:baseline !important; margin-right:4px !important; }
.hero-card #cd.countdown .unit:first-child .num{ font-size:32px !important; font-weight:800 !important; letter-spacing:0 !important; line-height:1 !important; }
.hero-card #cd.countdown .unit:first-child .lbl{ font-size:13px !important; font-weight:600 !important; color:rgba(255,255,255,.86) !important; margin:0 0 0 3px !important; }
.hero-card #cd.countdown .unit:not(:first-child){ position:relative !important; justify-content:center; min-width:34px !important; height:30px !important; padding:0 6px !important; border-radius:8px !important; background:rgba(255,255,255,.16) !important; -webkit-backdrop-filter:blur(12px) !important; backdrop-filter:blur(12px) !important; align-items:center !important; box-sizing:border-box; }
.hero-card #cd.countdown .unit:not(:first-child) .num{ font-size:16px !important; font-weight:700 !important; line-height:1 !important; font-variant-numeric:tabular-nums; letter-spacing:.3px; }
.hero-card #cd.countdown .unit:nth-child(2)::after, .hero-card #cd.countdown .unit:nth-child(3)::after{ position:absolute !important; right:-6px !important; top:50% !important; transform:translateY(-55%); margin:0 !important; font-size:13px !important; font-weight:600 !important; color:rgba(255,255,255,.5) !important; }
/* ⑧ 筹备中心进度：与首页速办同一根 3px 细条（.qt-bar），居中 */
.func-grid > .f .qt-bar.f-prog{ display:block; width:64% !important; height:3px !important; margin:3px auto 0 !important; }
/* ⑩ 「一键录入历史场次」只在添加页、表单顶部一行文字入口 */
.pe-page .pe-hist.pe-hist-top{ width:auto; display:inline-flex; justify-content:flex-start; margin:0 0 10px 2px; padding:4px 0; border:0; border-radius:0; background:none; color:var(--c-brand); font-size:13px; font-weight:600; }
/* ⑪ 回忆页顶部 Tab：恢复分段轨道（浅色长条底 + 滑动的白色选中块），只用于回忆页 */
.page > .seg.mem-seg{ position:relative; display:flex !important; padding:4px !important; gap:0 !important; border-radius:12px !important; background:rgba(109,92,231,.08) !important; border:0 !important; box-shadow:none !important; overflow:hidden; }
.page > .seg.mem-seg::before{ content:''; position:absolute; top:4px; bottom:4px; left:4px; width:calc((100% - 8px) / 4); border-radius:9px; background:#ffffff; box-shadow:0 2px 8px rgba(40,30,110,.10); transform:translateX(calc(var(--i, 0) * 100%)); transition:transform .25s cubic-bezier(.3,.7,.3,1); }
.page > .seg.mem-seg > button, .page > .seg.mem-seg > button:not(.on), .page > .seg.mem-seg > button.on{ position:relative; z-index:1; flex:1 1 0; height:34px !important; min-height:34px !important; padding:0 4px !important; border-radius:9px !important; border:0 !important; background:none !important; box-shadow:none !important; font-size:var(--fs-md) !important; font-weight:600 !important; color:#6b7390 !important; -webkit-text-fill-color:currentColor; }
.page > .seg.mem-seg > button.on{ color:var(--c-brand-deep) !important; font-weight:700 !important; }
[data-theme="dark"] .page > .seg.mem-seg{ background:rgba(255,255,255,.06) !important; }
[data-theme="dark"] .page > .seg.mem-seg::before{ background:rgba(255,255,255,.16); box-shadow:none; }
[data-theme="dark"] .page > .seg.mem-seg > button{ color:#b4b9cf !important; }
[data-theme="dark"] .page > .seg.mem-seg > button.on{ color:#ffffff !important; }
@media (prefers-reduced-motion: reduce){ .page > .seg.mem-seg::before{ transition:none; } }
/* ⑫ 纪念票分享抽屉：黄色按钮改紫色体系（下载 / 完成 = 主，关闭 = 次）；票面米黄纸保留 */
.tk-share-modal .tk-share-save, .modal.tk-share-modal [data-m="ok"]{ background:var(--c-brand) !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; border:0 !important; box-shadow:none !important; }
.modal.tk-share-modal [data-m="cancel"]{ background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; -webkit-text-fill-color:var(--c-brand-deep); border:0 !important; box-shadow:none !important; }
/* ⑭ 「我的」资料卡统计：去分隔线与外框，资料卡内一块白 12% 毛玻璃浅底圆角条；数字 20/700 白 · 标签 11 白 70% */
/* W-035 ⑧ 补：格子是定高纵向 flex，细条不许被压成 0 */
.func-grid > .f .qt-bar.f-prog{ flex:none !important; min-height:3px !important; }

/* ===== W-036 · W-035 补改 6 处（老板 10-17）===== */
/* ① 空态卡两颗按钮 + 行程详情「标记已观演」：32 高 · 13/600 · 0 14；「标记已观演」宽度随内容 */
.card.empty-start.hero-empty-grad .heg-acts .heg-btn, .heg-acts .heg-btn.oc-main, .heg-acts .heg-btn.oc-sub, .btn.btn-sm.trip-attend-btn, .btn.btn-sm.trip-attend-btn.oc-main, .btn.btn-sm.trip-attend-btn.oc-sub{ height:32px !important; min-height:32px !important; padding:0 14px !important; font-size:13px !important; font-weight:600 !important; }
.btn.btn-sm.trip-attend-btn{ width:auto !important; flex:none !important; }
/* ② 首页统计宫格：数字 18/700 · 标签 11/600（不再用 --fs-xl） */
.ht-grid > .ht > b{ font-size:18px !important; font-weight:700 !important; }
.ht-grid > .ht > span{ font-size:11px !important; font-weight:600 !important; }
/* ④ 编辑演唱会页头右上「保存」：品牌紫实底白字 · 32 高 · 13/600（提交同一张表单） */
.back-bar .bb-actions .btn.btn-sm.bb-save{ height:32px !important; min-height:32px !important; padding:0 14px !important; font-size:13px !important; font-weight:600 !important; background:var(--c-brand) !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; border:0 !important; box-shadow:none !important; }
/* ⑤ 编辑票根：底部留白 ≥ 底栏高度 + 24，「删除这张票根」= 危险按钮（淡红底红字 · 36 高） */
.page:has(.del-concert-link){ padding-bottom:calc(var(--w036-tabbar-h, 96px) + 24px + env(safe-area-inset-bottom)) !important; }
.btn.btn-danger.del-concert-link{ box-sizing:border-box !important; height:36px !important; min-height:36px !important; max-height:36px !important; padding:0 16px !important; line-height:36px !important; font-size:14px !important; font-weight:600 !important; background:var(--c-danger-soft) !important; color:var(--c-danger) !important; -webkit-text-fill-color:var(--c-danger); }
/* ⑥ 纪念票分享抽屉：下载 / 完成 = 品牌紫实底白字，关闭 = 品牌淡底紫字（W-035 已写，此处加固选择器） */
.modal.tk-share-modal .tk-share-save, .modal.tk-share-modal .btn[data-m="ok"]{ background:var(--c-brand) !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; }
.modal.tk-share-modal .btn[data-m="cancel"]{ background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; -webkit-text-fill-color:var(--c-brand-deep); }

/* ===== W-037 · 老板二轮反馈（10-17）===== */
/* 编号 2 · 统计宫格：W-030 定高 76 装不下 36 图标 + 18 数字 + 11 标签 → 格高随内容，上下内边距 10（图标距框顶 ≥8、标签距框底 ≥8） */
.ht-grid > .ht{ height:auto !important; min-height:0 !important; padding:10px 4px !important; overflow:visible; }
.ht-grid > .ht .ht-ic{ flex:none !important; margin:0 0 2px !important; }
/* 编号 6 · 预算记账：无预算也画 3px 浅色空轨道（不填充）；首页速办与筹备中心同源 .qt-bar */
.qt-bar.is-empty > i{ display:none !important; }
.qt > .qt-bd .qt-bar, .func-grid > .f .qt-bar.f-prog{ height:3px !important; }
/* 编号 12 · 分享抽屉对齐纪念大图页：淡紫粉渐变 + 小星光底；去米黄点阵与外框 */
.modal.tk-share-modal, [data-theme="dark"] .modal.tk-share-modal{
  background:
    radial-gradient(1.5px 1.5px at 18% 22%, rgba(255,255,255,.95), transparent 60%),
    radial-gradient(1.2px 1.2px at 82% 14%, rgba(255,255,255,.9), transparent 60%),
    radial-gradient(1.5px 1.5px at 88% 58%, rgba(255,255,255,.9), transparent 60%),
    radial-gradient(1.2px 1.2px at 8% 70%, rgba(255,255,255,.85), transparent 60%),
    linear-gradient(170deg, #eef0ff 0%, #e6dcfb 45%, #f6dcec 100%) !important;
  border:0 !important; border-top:0 !important;
}
.modal.tk-share-modal h3, [data-theme="dark"] .modal.tk-share-modal h3{ color:var(--c-ink, #1f2440); }
.tk-share .share-ticket-img{ border:0 !important; border-radius:0 !important; box-shadow:none !important; filter:drop-shadow(0 20px 30px rgba(52,38,12,.16)); }
.modal.tk-share-modal .tk-share-save, [data-theme="dark"] .modal.tk-share-modal .tk-share-save{ height:52px !important; padding:0 16px !important; border-radius:999px !important; background:linear-gradient(90deg,#5b6cf6,#8b5cf6) !important; color:#ffffff !important; -webkit-text-fill-color:#ffffff; box-shadow:0 10px 22px rgba(109,92,231,.28) !important; }
.modal.tk-share-modal .btn[data-m="cancel"], .modal.tk-share-modal .btn[data-m="ok"], [data-theme="dark"] .modal.tk-share-modal .btn[data-m="cancel"], [data-theme="dark"] .modal.tk-share-modal .btn[data-m="ok"]{ background:rgba(109,92,231,.12) !important; color:var(--c-brand-deep) !important; -webkit-text-fill-color:var(--c-brand-deep); border:0 !important; box-shadow:none !important; border-radius:18px !important; }
.tk-share-hint, [data-theme="dark"] .tk-share-hint{ color:var(--c-text-2, #6b7390) !important; }

/* ===== W-039 · 恢复 W-036 底栏 + 页头毛玻璃（W-037 误删，老板 10-17 12:51）===== */
nav.tabbar{ background:rgba(255,255,255,.55) !important; -webkit-backdrop-filter:saturate(180%) blur(24px) !important; backdrop-filter:saturate(180%) blur(24px) !important; border:1px solid rgba(255,255,255,.7) !important; box-shadow:0 8px 24px rgba(40,30,110,.10), inset 0 0 0 .5px rgba(109,92,231,.08) !important; }
nav.tabbar .tab, nav.tabbar .tab.on{ -webkit-backdrop-filter:none !important; backdrop-filter:none !important; }
.back-bar{ background:rgba(255,255,255,.55) !important; -webkit-backdrop-filter:saturate(180%) blur(24px) !important; backdrop-filter:saturate(180%) blur(24px) !important; }
[data-theme="dark"] nav.tabbar{ border:1px solid rgba(255,255,255,.08) !important; box-shadow:0 8px 24px rgba(0,0,0,.4) !important; }
[data-theme="dark"] nav.tabbar, [data-theme="dark"] .back-bar{ background:rgba(22,28,46,.55) !important; }

/* ===== W-043 · 筹备中心 / 速办：副标题单行 + 短进度条（老板 10-18 真机）===== */
.qt-grid > .qt, .func-grid > .f{ height:auto !important; min-height:92px !important; padding:10px 6px 10px !important; overflow:hidden; }
.func-grid > .f .f-name, .qt-grid > .qt .qt-bd b{ max-width:100%; }
.func-grid > .f .f-sub, .func-grid > .f .f-sub-empty, .qt-grid > .qt .qt-bd > span{ display:block; box-sizing:border-box; max-width:100%; padding:0 6px; font-size:11px !important; white-space:nowrap !important; overflow:hidden; text-overflow:ellipsis; text-align:center; }
.qt-grid > .qt .qt-bd{ width:100%; align-items:center; }
.qt-bar, .qt-grid .qt .qt-bar, .func-grid > .f .qt-bar.f-prog, .qt > .qt-bd .qt-bar{ width:45% !important; max-width:64px !important; height:3px !important; margin:6px auto 0 !important; flex:none !important; }
/* W-043 · 批量上传按钮 / 抽屉 / 批量票根页 */
.btn.bulk-up-btn{ box-sizing:border-box !important; height:36px !important; min-height:36px !important; margin-top:10px; padding:0 16px !important; display:flex; align-items:center; justify-content:center; gap:6px; font-size:14px !important; font-weight:600 !important; background:var(--c-brand-soft) !important; color:var(--c-brand-deep) !important; -webkit-text-fill-color:var(--c-brand-deep); border:0 !important; box-shadow:none !important; }
.btn.bulk-up-btn svg{ transform:rotate(180deg); }
.bulk-list{ display:flex; flex-direction:column; gap:8px; }
.bulk-row{ display:flex; align-items:center; gap:12px; width:100%; padding:12px; border:0; border-radius:var(--r-md); background:var(--c-brand-soft); color:var(--c-brand-deep); text-align:left; cursor:pointer; }
.bulk-row .bulk-ic{ flex:none; width:36px; height:36px; border-radius:10px; background:rgba(109,92,231,.14); display:inline-flex; align-items:center; justify-content:center; }
.bulk-row .bulk-tx{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
.bulk-row .bulk-tx b{ font-size:14px; font-weight:600; color:var(--c-ink, #1f2440); }
.bulk-row .bulk-tx small{ font-size:12px; color:var(--c-text-3); }
.bulk-tk-row{ display:flex; align-items:center; gap:10px; margin-top:10px; }
.bulk-tk-img{ flex:none; width:56px; height:56px; border-radius:10px; object-fit:cover; background:rgba(109,92,231,.08); }
.bulk-tk-row .input{ flex:1; min-width:0; }

/* ===== W-045 · 首页演唱会大卡「高级感」重做（只作用于 .hero-home；不删旧规则，靠后置 + 更高特异度覆盖）=====
   照片原色 + 上下两道很淡的深色渐变托字；标题两层；地点日期单行；倒计时一整行；按钮 32px 毛玻璃小圆；状态玻璃小胶囊。 */
.hero-card.hero-home[data-lay]{ --w45-pad:16px; padding:56px var(--w45-pad) var(--w45-pad) !important; min-height:224px; height:auto !important; }
/* 渐变层：只在有封面时出（顶部 .25 暗边托按钮，底部 .72→透明 托文字）；整卡不再有任何彩色蒙层 */
.hero-card.hero-home.has-cover[data-lay]::before{ content:'' !important; border-radius:0 !important; filter:none !important; transform:none !important; opacity:1 !important; width:auto !important; animation:none !important; mix-blend-mode:normal !important; box-shadow:none !important; position:absolute; left:0; right:0; top:0; bottom:auto; height:64px; background:linear-gradient(180deg,rgba(15,10,30,.25),rgba(15,10,30,0)); pointer-events:none; z-index:0; }
.hero-card.hero-home.has-cover[data-lay]::after{ content:'' !important; border-radius:0 !important; filter:none !important; transform:none !important; opacity:1 !important; width:auto !important; animation:none !important; mix-blend-mode:normal !important; box-shadow:none !important; position:absolute; left:0; right:0; top:auto; bottom:0; height:62%; background:linear-gradient(0deg,rgba(15,10,30,.72),rgba(15,10,30,0)); pointer-events:none; z-index:0; }
.hero-card.hero-home[data-lay] .artist, .hero-card.hero-home[data-lay] .place, .hero-card.hero-home[data-lay] .countdown{ text-shadow:0 1px 8px rgba(0,0,0,.25); }
/* 标题 */
.hero-card.hero-home[data-lay] .artist{ display:flex !important; flex-direction:column; gap:3px; font-size:22px !important; font-weight:700 !important; line-height:1.25 !important; letter-spacing:0 !important; color:#fff !important; background:none !important; -webkit-text-fill-color:#fff !important; min-width:0; }
.hero-card.hero-home[data-lay] .artist:not(.two){ display:-webkit-box !important; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden; text-wrap:balance; }
.hero-card.hero-home[data-lay] .artist .ar-name{ font-size:13px; font-weight:600; line-height:1.3; letter-spacing:.04em; color:rgba(255,255,255,.8); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.hero-card.hero-home[data-lay] .artist .ar-tour{ display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden; font-size:22px; font-weight:700; line-height:1.25; text-wrap:balance; word-break:keep-all; overflow-wrap:anywhere; }
/* 地点日期：单行；只截场馆名 */
.hero-card.hero-home[data-lay] .place{ display:flex !important; align-items:center; flex-wrap:nowrap; gap:0; margin:8px 0 0 !important; font-size:12px !important; font-weight:400 !important; color:rgba(255,255,255,.78) !important; white-space:nowrap; min-width:0; }
.hero-card.hero-home[data-lay] .place svg{ width:11px !important; height:11px !important; flex:none; stroke:currentColor !important; margin-right:4px; }
.hero-card.hero-home[data-lay] .place .pl-city, .hero-card.hero-home[data-lay] .place .pl-date, .hero-card.hero-home[data-lay] .place .pl-sep{ flex:none; }
.hero-card.hero-home[data-lay] .place .pl-sep{ margin:0 5px; opacity:.6; }
.hero-card.hero-home[data-lay] .place .pl-venue{ flex:0 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; }
/* 倒计时：一整行  73 天  22:09:24 （玻璃胶囊） */
.hero-card.hero-home[data-lay] #cd.countdown{ display:inline-flex !important; flex-wrap:nowrap !important; align-items:baseline !important; align-self:flex-start !important; margin:12px 0 0 !important; padding:7px 14px 8px !important; border-radius:14px !important; background:rgba(255,255,255,.12) !important; border:.5px solid rgba(255,255,255,.2) !important; -webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px); box-shadow:none !important; font-variant-numeric:tabular-nums; }
.hero-card.hero-home[data-lay] #cd.countdown{ gap:0 !important; }
.hero-card.hero-home[data-lay] #cd.countdown .unit{ background:none !important; width:auto !important; min-width:0 !important; flex:none !important; padding:0 !important; border:0 !important; box-shadow:none !important; -webkit-backdrop-filter:none !important; backdrop-filter:none !important; }
.hero-card.hero-home[data-lay] #cd.countdown .num{ background:none !important; border:0 !important; box-shadow:none !important; padding:0 !important; border-radius:0 !important; font-size:18px !important; font-weight:500 !important; line-height:1.1 !important; letter-spacing:0 !important; font-variant-numeric:tabular-nums; font-feature-settings:'tnum'; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:first-child .num{ font-size:34px !important; font-weight:700 !important; line-height:1 !important; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:first-child .lbl{ font-size:15px !important; font-weight:500 !important; color:rgba(255,255,255,.86) !important; margin:0 12px 0 4px !important; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(2)::after, .hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(3)::after{ position:static !important; transform:none !important; display:inline !important; line-height:1 !important; font-size:18px !important; font-weight:500 !important; color:rgba(255,255,255,.5) !important; margin:0 4px !important; }
.hero-card.hero-home[data-lay] #cd.countdown .cd-live{ background:none; padding:0; display:inline-flex; flex-direction:row; align-items:center; gap:10px; font-size:15px; }
/* 顶部：状态胶囊 + 两颗小毛玻璃圆 */
.hero-card.hero-home[data-lay] .hero-top{ top:14px !important; left:var(--w45-pad) !important; right:var(--w45-pad) !important; }
.hero-card.hero-home[data-lay] .hero-top-r{ gap:8px; }
.hero-card.hero-home[data-lay] .hero-status{ display:inline-flex !important; align-items:center; gap:6px; height:24px; padding:0 10px !important; font-size:11px !important; font-weight:600 !important; line-height:1; opacity:1; background:rgba(255,255,255,.16) !important; border:.5px solid rgba(255,255,255,.28) !important; -webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px); }
.hero-status .hs-dot{ width:6px; height:6px; border-radius:50%; flex:none; background:#fff; }
.hero-status[data-ph="soon"] .hs-dot{ background:#34D399; animation:w45Breathe 2s ease-in-out infinite; }
.hero-status[data-ph="live"] .hs-dot{ background:#A78BFA; }
.hero-status[data-ph="past"] .hs-dot{ background:rgba(255,255,255,.5); }
@keyframes w45Breathe{ 0%,100%{ opacity:1; box-shadow:0 0 0 0 rgba(52,211,153,.5) } 50%{ opacity:.55; box-shadow:0 0 0 4px rgba(52,211,153,0) } }
@media (prefers-reduced-motion:reduce){ .hero-status .hs-dot{ animation:none !important; } }
.hero-card.hero-home[data-lay] .oc-icon.hc-clean, .hero-card.hero-home[data-lay] .oc-icon.hc-lay{ position:relative; width:32px !important; height:32px !important; min-width:0; padding:0; border-radius:50%; background:rgba(255,255,255,.18) !important; border:.5px solid rgba(255,255,255,.3) !important; -webkit-backdrop-filter:blur(16px); backdrop-filter:blur(16px); color:#fff; display:inline-flex; align-items:center; justify-content:center; }
.hero-card.hero-home[data-lay] .oc-icon::after{ content:''; position:absolute; inset:-4px; border-radius:50%; }
.hero-card.hero-home[data-lay] .oc-icon svg{ width:15px !important; height:15px !important; stroke:#fff; }
.hero-card.hero-home[data-lay] .oc-icon.hc-clean.on{ background:#fff !important; border-color:#fff !important; }
.hero-card.hero-home[data-lay] .oc-icon.hc-clean.on svg{ stroke:#6d5ce7; }
/* ---- 4 种版式 ---- */
/* 经典沉底：默认流（artist → place → countdown），无需额外规则 */
/* 倒计时置顶：倒计时在上（让开顶部按钮），标题沉底 */
.hero-card.hero-home[data-lay="cdtop"]{ padding-top:56px !important; }
.hero-card.hero-home[data-lay="cdtop"] > #cd.countdown{ order:2; margin:0 !important; align-self:flex-start !important; }
.hero-card.hero-home[data-lay="cdtop"] > .artist{ order:3; margin-top:auto !important; padding-top:14px !important; }
.hero-card.hero-home[data-lay="cdtop"] > .place{ order:4; }
/* 标题居中：标题、地点、倒计时全部居中 */
.hero-card.hero-home[data-lay="center"] > .artist{ align-items:center; text-align:center !important; align-self:stretch !important; margin-top:auto !important; }
.hero-card.hero-home[data-lay="center"] > .artist .ar-tour{ text-align:center; }
.hero-card.hero-home[data-lay="center"] > .place{ justify-content:center; align-self:stretch; }
.hero-card.hero-home[data-lay="center"] > #cd.countdown{ align-self:center !important; }
/* 海报分栏：左标题、右倒计时（竖排：大天数 + 一行时分秒）；地点横贯全宽 */
.hero-card.hero-home[data-lay="split"] > .artist{ margin-top:auto !important; padding-right:128px !important; }
.hero-card.hero-home[data-lay="split"] > .place{ margin-top:8px !important; padding-right:0 !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown{ position:absolute !important; right:var(--w45-pad) !important; bottom:40px !important; margin:0 !important; width:auto !important; display:inline-grid !important; grid-template-columns:repeat(3,auto) !important; justify-content:end; align-self:auto !important; padding:8px 12px 9px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:first-child{ grid-column:1 / -1; justify-self:end; width:auto !important; margin-bottom:3px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:first-child .lbl{ margin:0 0 0 3px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .num{ font-size:15px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:first-child .num{ font-size:34px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:nth-child(2)::after, .hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:nth-child(3)::after{ font-size:15px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown.is-live{ display:inline-flex !important; grid-template-columns:none !important; }
/* ---- 版式弹窗示意图：白（主条）+ 淡紫（次条）+ 白 30% 小块，去掉金色 ---- */
.hc-tb .hn{ background:#fff; }
.hc-tb .hm{ background:#C4B5FD; }
.hc-tb .cd b{ background:rgba(255,255,255,.3); box-shadow:none; }
.hc-tb .cd b.dd{ background:rgba(255,255,255,.5); }

/* ===== W-046 · 首页大卡二改（只作用 .hero-home）：标题一整段 / 倒计时大胆重做 / 顶部按钮缩小上移 ===== */
.hero-card.hero-home[data-lay]{ --w45-pad:12px; padding:44px 16px 16px !important; }
.hero-card.hero-home[data-lay="cdtop"]{ padding-top:44px !important; }
/* 标题：一个元素、同字号 */
.hero-card.hero-home[data-lay] .artist{ display:-webkit-box !important; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden; font-size:21px !important; font-weight:700 !important; line-height:1.28 !important; text-wrap:balance; word-break:keep-all; overflow-wrap:anywhere; }
/* 顶部一排 */
.hero-card.hero-home[data-lay] .hero-top{ top:10px !important; left:12px !important; right:12px !important; }
.hero-card.hero-home[data-lay] .hero-top-r{ gap:6px; }
.hero-card.hero-home[data-lay] .hero-status{ height:20px; gap:5px; padding:0 8px !important; font-size:10px !important; font-weight:600 !important; }
.hero-status .hs-dot{ width:5px; height:5px; }
.hero-card.hero-home[data-lay] .oc-icon.hc-clean, .hero-card.hero-home[data-lay] .oc-icon.hc-lay{ width:26px !important; height:26px !important; min-width:26px !important; min-height:26px !important; }
.hero-card.hero-home[data-lay] .oc-icon::after{ inset:-5px; }
.hero-card.hero-home[data-lay] .oc-icon svg{ width:13px !important; height:13px !important; }
/* 倒计时：无胶囊无方块，天数当主角 */
.hero-card.hero-home[data-lay] #cd.countdown{ display:flex !important; flex-wrap:nowrap !important; align-items:flex-end !important; align-self:flex-start !important; margin:10px 0 0 !important; padding:0 !important; border:0 !important; border-radius:0 !important; background:none !important; -webkit-backdrop-filter:none; backdrop-filter:none; font-variant-numeric:tabular-nums; }
.hero-card.hero-home[data-lay] #cd.countdown .unit{ display:flex; align-items:baseline; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:first-child{ align-items:flex-end; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:first-child .num{ font-size:64px !important; font-weight:800 !important; line-height:.95 !important; letter-spacing:-.04em !important; font-feature-settings:'tnum'; background:linear-gradient(180deg,#fff 30%,#E9D5FF) !important; -webkit-background-clip:text !important; background-clip:text !important; -webkit-text-fill-color:transparent !important; color:transparent !important; filter:drop-shadow(0 2px 16px rgba(0,0,0,.25)); }
.hero-card.hero-home[data-lay] #cd.countdown .unit:first-child .lbl{ display:flex !important; flex-direction:column; justify-content:flex-end; margin:0 0 4px 6px !important; line-height:1.15; text-align:left; }
.hero-card.hero-home[data-lay] #cd.countdown .lbl b{ font-size:15px; font-weight:700; color:#fff; }
.hero-card.hero-home[data-lay] #cd.countdown .lbl small{ font-size:11px; font-weight:400; color:rgba(255,255,255,.7); white-space:nowrap; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(n+2) .lbl{ display:none !important; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(n+2) .num{ font-size:15px !important; font-weight:600 !important; line-height:1 !important; color:rgba(255,255,255,.85) !important; -webkit-text-fill-color:rgba(255,255,255,.85) !important; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(4) .num{ color:#C4B5FD !important; -webkit-text-fill-color:#C4B5FD !important; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(2), .hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(3), .hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(4){ padding-bottom:5px !important; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(2)::before{ content:''; display:block; width:1px; height:22px; margin:0 10px 0 12px; background:rgba(255,255,255,.25); align-self:center; }
.hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(2)::after, .hero-card.hero-home[data-lay] #cd.countdown .unit:nth-child(3)::after{ font-size:15px !important; font-weight:600 !important; color:rgba(255,255,255,.55) !important; margin:0 3px !important; }
/* 当天开演：大字「今天」 */
.hero-card.hero-home[data-lay] #cd.countdown.is-today .unit:first-child .num{ font-size:0 !important; line-height:1 !important; }
.hero-card.hero-home[data-lay] #cd.countdown.is-today .unit:first-child .num::after{ content:'今天'; font-size:48px; font-weight:800; letter-spacing:-.02em; }
.hero-card.hero-home[data-lay] #cd.countdown.is-today .unit:first-child .lbl{ display:none !important; }
/* 版式 */
.hero-card.hero-home[data-lay="cdtop"] > #cd.countdown{ margin:0 !important; }
.hero-card.hero-home[data-lay="center"] > #cd.countdown{ align-self:center !important; }
.hero-card.hero-home[data-lay="split"] > .artist{ padding-right:120px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown{ display:inline-grid !important; grid-template-columns:repeat(3,auto) !important; justify-content:end; align-items:end !important; position:absolute !important; right:16px !important; bottom:40px !important; margin:0 !important; padding:0 !important; text-align:right; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:first-child{ grid-column:1 / -1; justify-self:end; flex-direction:column; align-items:flex-end; margin:0 0 2px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:first-child .num{ font-size:56px !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:first-child .lbl{ flex-direction:row; align-items:baseline; gap:0; margin:2px 0 0 !important; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .lbl small{ font-size:11px; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:nth-child(2)::before{ display:none; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown .unit:nth-child(n+2){ padding-bottom:0 !important; margin-top:6px; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown.is-today .unit:first-child .num::after{ font-size:40px; }
.hero-card.hero-home[data-lay="split"] > #cd.countdown.is-live{ display:inline-flex !important; }
.hero-card.hero-home[data-lay="split"] > .artist{ padding-right:112px !important; word-break:normal; overflow-wrap:break-word; }

/* ===== W-047 · 首页大卡「E1-b 数字玻璃方块」+ 4 种摆放（只作用 .hero-home.hh；不用 data-lay，旧 W-045/046 规则不再命中）===== */
.hero-card.hero-home.hh{ display:block !important; position:relative; height:224px !important; min-height:0 !important; aspect-ratio:auto !important; padding:0 !important; border-radius:22px; overflow:hidden; color:#fff; background-size:cover; background-position:center 22%; box-shadow:0 12px 28px rgba(40,20,90,.2); }
.hero-card.hero-home.hh.has-cover::before, .hero-card.hero-home.hh.has-cover::after{ content:none !important; }
.hero-card.hero-home.hh .hh-sh{ position:absolute; left:0; right:0; bottom:0; height:120px; z-index:0; pointer-events:none; background:linear-gradient(to top,rgba(14,8,30,.82),rgba(14,8,30,.35) 55%,transparent); }
.hero-card.hero-home.hh[data-hl="mid"] .hh-sh, .hero-card.hero-home.hh[data-hl="bar"] .hh-sh{ height:150px; }
.hero-card.hero-home.hh .stars-bg{ z-index:0; }
/* 顶部一排 */
.hero-card.hero-home.hh .hero-top{ position:absolute !important; top:10px !important; left:12px !important; right:12px !important; z-index:3; display:flex; justify-content:space-between; align-items:center; margin:0; padding:0; }
.hero-card.hero-home.hh .hero-top-r{ display:flex; gap:6px; }
.hero-card.hero-home.hh .hero-status{ display:inline-flex !important; align-items:center; gap:5px; height:20px; padding:0 8px !important; border-radius:10px; font-size:10px !important; font-weight:600 !important; letter-spacing:0; line-height:1; background:rgba(20,12,40,.28) !important; border:.5px solid rgba(255,255,255,.3) !important; -webkit-backdrop-filter:blur(14px); backdrop-filter:blur(14px); }
.hero-card.hero-home.hh .oc-icon.hc-clean, .hero-card.hero-home.hh .oc-icon.hc-lay{ position:relative; width:26px !important; height:26px !important; min-width:26px !important; min-height:26px !important; padding:0; border-radius:50%; display:inline-flex; align-items:center; justify-content:center; color:#fff; background:rgba(20,12,40,.28) !important; border:.5px solid rgba(255,255,255,.3) !important; -webkit-backdrop-filter:blur(14px); backdrop-filter:blur(14px); }
.hero-card.hero-home.hh .oc-icon::after{ content:''; position:absolute; inset:-5px; border-radius:50%; }
.hero-card.hero-home.hh .oc-icon svg{ width:13px !important; height:13px !important; stroke:#fff; }
.hero-card.hero-home.hh .oc-icon.hc-clean.on{ background:#fff !important; border-color:#fff !important; }
.hero-card.hero-home.hh .oc-icon.hc-clean.on svg{ stroke:#6d5ce7; }
/* 标题 + 地点 */
.hero-card.hero-home.hh .hh-info{ position:absolute; z-index:2; min-width:0; }
.hero-card.hero-home.hh .hh-t{ font-size:18px; font-weight:800; line-height:1.3; letter-spacing:0; text-wrap:balance; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; word-break:keep-all; overflow-wrap:anywhere;
  background:linear-gradient(100deg,#fff 30%,#ffe9b0 55%,#fff 80%); -webkit-background-clip:text; background-clip:text; color:transparent; -webkit-text-fill-color:transparent; filter:drop-shadow(0 1px 6px rgba(0,0,0,.35)); }
.hero-card.hero-home.hh[data-hl="sq-right"] .hh-t, .hero-card.hero-home.hh[data-hl="sq-left"] .hh-t{ font-size:20.5px; text-wrap:wrap; }
.hero-card.hero-home.hh .hh-m{ display:flex; align-items:center; gap:4px; margin-top:5px; font-size:11px; font-weight:500; color:rgba(255,255,255,.85); white-space:nowrap; overflow:hidden; text-shadow:0 1px 4px rgba(0,0,0,.3); }
.hero-card.hero-home.hh .hh-m svg{ width:12px; height:12px; flex:none; stroke:#ffe9a8; fill:none; stroke-width:2.2; }
.hero-card.hero-home.hh .hh-mc, .hero-card.hero-home.hh .hh-md{ flex:none; }
.hero-card.hero-home.hh .hh-mv{ flex:0 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; }
/* 倒计时玻璃件 */
.hero-card.hero-home.hh .hh-cd{ position:absolute; z-index:2; color:#fff; font-variant-numeric:tabular-nums; font-feature-settings:'tnum'; background:rgba(255,255,255,.16); -webkit-backdrop-filter:blur(18px) saturate(160%); backdrop-filter:blur(18px) saturate(160%); border:.5px solid rgba(255,255,255,.32); box-sizing:border-box; }
.hero-card.hero-home.hh .hh-d{ display:flex; align-items:baseline; }
.hero-card.hero-home.hh .hh-n{ font-weight:800; letter-spacing:-.04em; line-height:1; white-space:nowrap; }
.hero-card.hero-home.hh .hh-u{ white-space:nowrap; }
.hero-card.hero-home.hh .hh-tm{ font-weight:600; white-space:nowrap; line-height:1; }
.hero-card.hero-home.hh .hh-tm em{ font-style:normal; color:#C4B5FD; }
.hero-card.hero-home.hh .hh-cd.is-today .hh-n{ font-size:0 !important; }
.hero-card.hero-home.hh .hh-cd.is-today .hh-n::after{ content:'今天'; font-size:var(--tdy,24px); letter-spacing:0; }
.hero-card.hero-home.hh .hh-cd.is-today .hh-u{ display:none; }
.hero-card.hero-home.hh .hh-cd .cd-live{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:5px; width:100%; height:100%; font-size:11px; font-weight:600; background:none; padding:0; }
.hero-card.hero-home.hh .hh-cd .cd-live .lvb-l{ display:inline-flex; align-items:center; gap:4px; }
.hero-card.hero-home.hh .hh-cd .cd-live .lvb-dot{ width:5px; height:5px; border-radius:50%; background:#34D399; }
/* ① 方块在右 / ② 方块在左 */
.hero-card.hero-home.hh[data-hl="sq-right"] .hh-info{ left:16px; right:100px; bottom:14px; }
.hero-card.hero-home.hh[data-hl="sq-left"] .hh-info{ left:104px; right:16px; bottom:14px; text-align:right; }
.hero-card.hero-home.hh[data-hl="sq-left"] .hh-m{ justify-content:flex-end; }
.hero-card.hero-home.hh[data-hl="sq-right"] .hh-cd, .hero-card.hero-home.hh[data-hl="sq-left"] .hh-cd{ bottom:10px; width:82px; height:82px; border-radius:20px; display:flex; flex-direction:column; align-items:center; justify-content:center; --tdy:26px; }
.hero-card.hero-home.hh[data-hl="sq-right"] .hh-cd{ right:10px; }
.hero-card.hero-home.hh[data-hl="sq-left"] .hh-cd{ left:10px; }
.hero-card.hero-home.hh:is([data-hl="sq-right"],[data-hl="sq-left"]) .hh-d{ flex-direction:column; align-items:center; line-height:1; }
.hero-card.hero-home.hh:is([data-hl="sq-right"],[data-hl="sq-left"]) .hh-n{ font-size:38px; }
.hero-card.hero-home.hh:is([data-hl="sq-right"],[data-hl="sq-left"]) .hh-cd.d3 .hh-n{ font-size:30px; }
.hero-card.hero-home.hh:is([data-hl="sq-right"],[data-hl="sq-left"]) .hh-u{ font-size:9.5px; letter-spacing:.12em; opacity:.85; margin-top:4px; }
.hero-card.hero-home.hh:is([data-hl="sq-right"],[data-hl="sq-left"]) .hh-tm{ font-size:11px; margin-top:5px; }
/* ③ 居中胶囊 */
.hero-card.hero-home.hh[data-hl="mid"] .hh-info{ left:20px; right:20px; bottom:56px; text-align:center; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-m{ justify-content:center; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-cd{ left:50%; transform:translateX(-50%); bottom:10px; height:38px; border-radius:19px; display:flex; align-items:center; gap:10px; padding:0 16px; white-space:nowrap; --tdy:18px; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-n{ font-size:24px; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-cd.d3 .hh-n{ font-size:20px; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-d{ gap:2px; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-u{ font-size:10.5px; opacity:.85; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-tm{ font-size:13px; padding-left:10px; border-left:1px solid rgba(255,255,255,.3); line-height:16px; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-cd.is-today .hh-tm{ }
.hero-card.hero-home.hh[data-hl="mid"] .hh-cd .cd-live{ flex-direction:row; gap:10px; width:auto; }
/* ④ 底部横条 */
.hero-card.hero-home.hh[data-hl="bar"] .hh-info{ left:16px; right:16px; bottom:66px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-cd{ left:10px; right:10px; bottom:10px; height:48px; border-radius:16px; display:flex; align-items:center; justify-content:space-between; padding:0 14px; gap:8px; --tdy:22px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-n{ font-size:30px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-cd.d3 .hh-n{ font-size:25px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-d{ gap:3px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-u{ font-size:11px; opacity:.85; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-tm{ font-size:15px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-cd .cd-live{ flex-direction:row; justify-content:space-between; padding:0; font-size:13px; }
/* 版式弹窗示意图：照片底 + 白色标题条 + 白色半透明小方块/胶囊/横条（无黄色） */
.hc-tb[class*="hb-"]{ background:linear-gradient(180deg,#6f86c8 0%,#8a7cc0 45%,#3d3566 100%); }
.hc-tb[class*="hb-"]::after{ content:''; position:absolute; left:0; right:0; bottom:0; height:55%; background:linear-gradient(to top,rgba(14,8,30,.6),transparent); }
.hc-tb[class*="hb-"] i{ position:absolute; z-index:1; border-radius:3px; }
.hc-tb .hb-t{ height:6px; width:46%; background:#fff; }
.hc-tb .hb-m{ height:3px; width:34%; background:rgba(255,255,255,.7); }
.hc-tb .hb-g{ background:rgba(255,255,255,.5); border:.5px solid rgba(255,255,255,.8); }
.hc-tb.hb-sq-right .hb-t{ left:8%; bottom:30%; } .hc-tb.hb-sq-right .hb-m{ left:8%; bottom:18%; } .hc-tb.hb-sq-right .hb-g{ right:7%; bottom:10%; width:26px; height:26px; border-radius:7px; }
.hc-tb.hb-sq-left .hb-t{ right:8%; bottom:30%; } .hc-tb.hb-sq-left .hb-m{ right:8%; bottom:18%; } .hc-tb.hb-sq-left .hb-g{ left:7%; bottom:10%; width:26px; height:26px; border-radius:7px; }
.hc-tb.hb-mid .hb-t{ left:27%; bottom:50%; } .hc-tb.hb-mid .hb-m{ left:33%; bottom:38%; width:34%; } .hc-tb.hb-mid .hb-g{ left:50%; transform:translateX(-50%); bottom:8%; width:44%; height:12px; border-radius:6px; }
.hc-tb.hb-bar .hb-t{ left:8%; bottom:58%; } .hc-tb.hb-bar .hb-m{ left:8%; bottom:46%; } .hc-tb.hb-bar .hb-g{ left:6%; right:6%; bottom:8%; height:15px; border-radius:6px; }

/* ===== W-048 · 首页大卡三态：今天开演 / 演出进行中（红 LIVE）/ 刚散场（记录今晚）；样式同一套，4 种摆放通吃 ===== */
.hero-status[data-ph="today"] .hs-dot{ background:#34D399; animation:w45Breathe 2s ease-in-out infinite; }
.hero-status[data-ph="onair"] .hs-dot{ background:#FF4D6D; animation:w45Breathe 1.6s ease-in-out infinite; }
.hero-status[data-ph="ended"] .hs-dot{ background:#C4B5FD; }
/* 今天：不再藏「距开场」 */
.hero-card.hero-home.hh .hh-cd.is-today .hh-u{ display:block; }
/* 演出中：玻璃变红，隐藏天数，露出 LIVE + 已开演（时分秒节点复用，正计时） */
.hero-card.hero-home.hh .hh-cd .hh-lv{ display:none; align-items:center; }
.hero-card.hero-home.hh .hh-cd.is-live{ background:rgba(255,77,109,.22); border-color:rgba(255,160,175,.5); }
.hero-card.hero-home.hh .hh-cd.is-live .hh-d{ display:none; }
.hero-card.hero-home.hh .hh-cd.is-live .hh-lv{ display:flex; }
.hero-card.hero-home.hh .hh-lvb{ display:flex; align-items:center; font-size:20px; font-weight:900; letter-spacing:.06em; line-height:1; }
.hero-card.hero-home.hh .hh-lvb i{ width:7px; height:7px; border-radius:50%; margin-right:6px; background:#FF4D6D; box-shadow:0 0 0 4px rgba(255,77,109,.3); animation:w45Breathe 1.6s ease-in-out infinite; }
.hero-card.hero-home.hh .hh-lvs{ font-size:9.5px; letter-spacing:.12em; opacity:.9; white-space:nowrap; }
.hero-card.hero-home.hh:is([data-hl="sq-right"],[data-hl="sq-left"]) .hh-lv{ flex-direction:column; justify-content:center; gap:4px; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-lv{ gap:6px; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-lvb{ font-size:16px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-lv{ gap:8px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-lvs{ font-size:11px; }
/* 整卡外圈红色呼吸光 */
@keyframes w48Glow{ 0%,100%{ box-shadow:0 0 0 2px rgba(255,77,109,.55),0 12px 30px rgba(255,77,109,.35); } 50%{ box-shadow:0 0 0 2px rgba(255,77,109,.25),0 12px 30px rgba(255,77,109,.2); } }
.hero-card.hero-home.hh.hh-live{ animation:w48Glow 2.4s ease-in-out infinite; }
@media (prefers-reduced-motion:reduce){
  .hero-card.hero-home.hh.hh-live{ animation:none; box-shadow:0 0 0 2px rgba(255,77,109,.55),0 12px 30px rgba(255,77,109,.35); }
  .hero-card.hero-home.hh .hh-lvb i, .hero-status[data-ph="onair"] .hs-dot{ animation:none; }
}
/* 刚散场：白色按钮「✦ 记录今晚 照片 · 心情」 */
.hero-card.hero-home.hh .hh-cd.hh-rec{ font:inherit; cursor:pointer; margin:0; padding:0; color:#5B3FD6; background:rgba(255,255,255,.9); border:0; -webkit-backdrop-filter:none; backdrop-filter:none; -webkit-tap-highlight-color:transparent; text-align:center; }
.hero-card.hero-home.hh .hh-rec .rc-i{ font-size:22px; font-weight:800; line-height:1; }
.hero-card.hero-home.hh .hh-rec .rc-t{ font-size:11px; font-weight:700; margin-top:6px; white-space:nowrap; }
.hero-card.hero-home.hh .hh-rec .rc-s{ font-size:9.5px; margin-top:3px; letter-spacing:.04em; color:#7C6BD9; white-space:nowrap; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-cd.hh-rec, .hero-card.hero-home.hh[data-hl="bar"] .hh-cd.hh-rec{ flex-direction:row; gap:8px; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-cd.hh-rec{ padding:0 16px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-cd.hh-rec{ padding:0 14px; }
.hero-card.hero-home.hh:is([data-hl="mid"],[data-hl="bar"]) .hh-rec .rc-t, .hero-card.hero-home.hh:is([data-hl="mid"],[data-hl="bar"]) .hh-rec .rc-s{ margin-top:0; }
.hero-card.hero-home.hh[data-hl="mid"] .hh-rec .rc-t{ font-size:13px; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-rec .rc-t{ font-size:15px; margin-right:auto; }
.hero-card.hero-home.hh[data-hl="bar"] .hh-rec .rc-i{ font-size:20px; }

/* ===== W-049 出发准备（首页卡 + 准备清单页） ===== */
.pk-ring{ --p:0; width:48px; height:48px; border-radius:50%; background:conic-gradient(#8B5CF6 calc(var(--p)*1%), #EEEAFB 0); display:grid; place-items:center; flex:none; }
.pk-ring > i{ width:38px; height:38px; border-radius:50%; background:#fff; display:grid; place-items:center; align-content:center; font-style:normal; font-weight:700; font-size:11.5px; color:#6D28D9; font-variant-numeric:tabular-nums; text-align:center; line-height:1.15; }
.pk-ring > i small{ display:block; font-size:8px; color:#9A93BC; font-weight:600; }
.pk-ring.big{ width:60px; height:60px; }
.pk-ring.big > i{ width:48px; height:48px; font-size:14px; font-weight:800; }
.pk-ring.big > i small{ font-size:8.5px; }
.pk-ring.ok{ background:conic-gradient(#10B981 calc(var(--p)*1%), #D1FAE5 0); }
.pk-ring.ok > i{ color:#059669; }
.pk-card .pk-top{ display:flex; gap:12px; align-items:center; }
.pk-card .tt b{ font-size:13px; font-weight:700; }
.pk-card .tt p{ font-size:10px; color:var(--text-3,#8A84A8); margin:3px 0 0; }
.pk-chips{ display:flex; flex-wrap:wrap; gap:6px; margin-top:10px; }
.pk-chip{ height:24px; padding:0 8px 0 6px; border-radius:12px; background:#F5F3FF; border:1px solid #E9E3FF; font-size:11px; font-weight:500; color:#4C3BA8; display:inline-flex; align-items:center; gap:5px; max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; cursor:pointer; font-family:inherit; -webkit-touch-callout:none; user-select:none; -webkit-user-select:none; }
.pk-chip .c{ width:12px; height:12px; border-radius:50%; border:1.6px solid #B9A8F5; background:#fff; position:relative; flex:none; }
.pk-chip.done{ background:#8B5CF6; border-color:#8B5CF6; color:#fff; }
.pk-chip.done .c{ border-color:#fff; }
.pk-chip.done .c:after{ content:"✓"; position:absolute; inset:0; font-size:9px; color:#8B5CF6; text-align:center; line-height:10px; font-weight:900; }
.pk-chip.pk-more{ padding:0 12px; background:#fff; color:#8A84A8; }
.pk-chip.add{ padding:0 12px; background:#fff; border:1.5px dashed #C9BDF7; color:#8B5CF6; }
.pk-empty{ margin-top:4px; padding:10px 12px; border-radius:12px; background:#F5F3FF; color:#5B3FD6; font-size:13px; font-weight:600; cursor:pointer; }
.pk-next{ margin-top:14px; display:flex; align-items:center; gap:10px; padding:8px 10px; border-radius:14px; background:linear-gradient(100deg,#F5F3FF,#FDF4FF); cursor:pointer; }
.pk-card .pk-empty + .pk-next{ margin-top:10px; }
.pk-next .tm{ font-size:9.5px; font-weight:700; color:#fff; background:linear-gradient(135deg,#7C3AED,#C084FC); border-radius:8px; padding:4px 7px; line-height:1.2; text-align:center; font-variant-numeric:tabular-nums; }
.pk-next .g{ flex:1; min-width:0; font-size:12px; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pk-next .g small{ display:block; font-size:9.5px; color:#8A84A8; font-weight:500; margin-top:2px; }
.pk-next .ar{ color:#A78BFA; font-weight:700; }
/* 清单页 */
.pk-hero{ display:flex; gap:12px; align-items:center; border-radius:22px; }
.pk-hero-r{ min-width:0; }
.pk-hero-r b{ font-size:14px; font-weight:700; }
.pk-hero-r p{ font-size:10px; color:#8A84A8; margin:3px 0 0; }
.pk-acts{ display:flex; gap:8px; margin-top:10px; flex-wrap:wrap; }
.pk-acts button{ font:inherit; font-size:11px; font-weight:700; color:#5B3FD6; background:#F5F3FF; border:0; border-radius:12px; padding:4px 9px; display:inline-flex; align-items:center; gap:4px; cursor:pointer; }
.pk-warn{ display:flex; gap:8px; align-items:flex-start; font-size:11px; color:#8A6A2A; background:#FFF9EC; border:1px solid #FBEBC8; border-radius:14px; padding:9px 12px; margin:12px 0; line-height:1.5; }
.pk-warn .w-ic{ flex:none; color:#B7791F; display:inline-flex; margin-top:2px; }
.pk-warn .w-tx{ flex:1; min-width:0; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.pk-warn .w-tx b{ color:#B7791F; }
.pk-warn.open .w-tx{ -webkit-line-clamp:unset; display:block; }
.pk-warn .w-more{ flex:none; border:0; background:none; font:inherit; font-weight:700; color:#B7791F; cursor:pointer; padding:0; align-self:flex-end; }
.pk-warn.short .w-more{ display:none; }
.pk-sec{ background:#fff; border-radius:20px; padding:12px 12px 10px; margin-bottom:10px; box-shadow:0 6px 18px rgba(91,70,190,.05); }
.pk-sec .sh{ display:flex; align-items:center; gap:8px; }
.pk-sec .sh b{ font-size:13px; font-weight:700; }
.pk-sec .sh .c{ margin-left:auto; font-size:11px; color:#9A93BC; font-weight:700; font-variant-numeric:tabular-nums; }
.pk-sec .sh .c.ok{ color:#10B981; }
.pk-sec .pk-chips{ margin-top:8px; }
.pk-pie{ --p:0; width:18px; height:18px; border-radius:50%; flex:none; background:conic-gradient(#8B5CF6 calc(var(--p)*1%), #EEEAFB 0); }
.pk-fold{ display:flex; align-items:center; gap:8px; background:#fff; border-radius:16px; padding:10px 12px; margin-bottom:10px; font-size:12.5px; font-weight:600; cursor:pointer; }
.pk-fold .ck{ width:18px; height:18px; border-radius:50%; background:#10B981; color:#fff; font-size:12px; display:grid; place-items:center; }
.pk-fold .c{ margin-left:auto; font-size:11.5px; color:#9A93BC; font-weight:600; }
.pk-tip{ font-size:11px; color:#A49DC4; text-align:center; margin:6px 0 20px; }

/* ---- W-050 行程卡三颗小胶囊 ---- */
.concert-card .cc-acts{ display:flex; gap:6px; margin-top:9px; flex-wrap:nowrap; }
.concert-card .cc-acts .cca{
  display:inline-flex; align-items:center; gap:4px; height:26px; padding:0 9px; border-radius:13px;
  font-size:11.5px; font-weight:700; white-space:nowrap; cursor:pointer; font-family:inherit;
  background:#fff; color:#6D28D9; border:none; box-shadow:0 3px 10px rgba(28,20,90,.22);
  transition:transform .15s;
}
.concert-card .cc-acts .cca svg{ width:13px; height:13px; flex:none; stroke:currentColor; background:none; box-shadow:none; padding:0; margin:0; }
.concert-card .cc-acts .cca.g{
  background:rgba(255,255,255,.16); color:#fff; border:.5px solid rgba(255,255,255,.35); box-shadow:none;
  backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
}
.concert-card .cc-acts .cca:active{ transform:scale(.96); }
[data-theme="dark"] .concert-card .cc-acts .cca{ background:rgba(255,255,255,.94); }
[data-theme="dark"] .concert-card .cc-acts .cca.g{ background:rgba(255,255,255,.16); }
@media (max-width:339px){ .concert-card .cc-acts{ gap:3px; } .concert-card .cc-acts .cca{ font-size:10.5px; padding:0 6px; gap:3px; } .concert-card .cc-acts .cca svg{ width:12px; height:12px; } }

/* ===== W-051 · 「我的」页改版：资料卡标签两排 + 宫格/精简列表（只用品牌渐变 + 金色点缀）===== */
.pr-top .pr-go { position: absolute; right: 0; top: 4px; }
.pr-top .pr-info { padding-right: 18px; }
.pr-tags { gap: 5px; }
.pr-tags span { padding: 1px 6px; }
.pr-tags .pr-badge { color: #f5b94e; }
.pr-tags .admin-badge { padding: 1px 6px; font-size: 11px; color: #1a1f36; background: linear-gradient(135deg,#ffd97a,#f0a93b); border: 0; }
.me-ic { width: 34px; height: 34px; border-radius: 11px; display: grid; place-items: center; flex: none; color: #fff; background: var(--grad-brand); }
.me-ic.gold { background: linear-gradient(135deg,#f5b94e,#ffd782); }
.me-ic svg { width: 17px !important; height: 17px !important; }
.me-recap { display: flex; align-items: center; gap: 12px; margin-top: 14px; padding: 14px; border-radius: 18px; color: #fff; background: var(--grad-brand); cursor: pointer; text-decoration: none; }
.me-recap .me-ic { background: rgba(255,255,255,.22); }
.me-recap .grow { min-width: 0; }
.me-recap b { display: block; font-size: 14px; font-weight: 800; }
.me-recap .grow span { font-size: 10.5px; color: rgba(255,255,255,.82); }
.me-recap .go { margin-left: auto; font-size: 12px; font-weight: 700; background: #fff; color: #5b4bd6; border-radius: 12px; padding: 5px 10px; flex: none; }
.me-g2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 10px; }
.me-tile, .me-sm, .me-ls { background: #fff; box-shadow: 0 6px 16px rgba(91,70,190,.06); }
.me-tile { border-radius: 18px; padding: 14px; min-height: 84px; cursor: pointer; }
.me-tile .me-ic { margin-bottom: 8px; }
.me-tile b { display: block; font-size: 14px; font-weight: 800; }
.me-tile span:not(.me-ic) { font-size: 10.5px; color: var(--muted, #8A84A8); }
.me-gl { font-size: 11.5px; font-weight: 700; color: var(--muted, #9A93BC); letter-spacing: .1em; margin: 16px 4px 8px; }
.me-g3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.me-sm { border-radius: 16px; padding: 12px 4px; text-align: center; cursor: pointer; }
.me-sm .me-ic { width: 34px; height: 34px; border-radius: 50%; margin: 0 auto 6px; background: #EEF0FF; color: #5b4bd6; }
.me-sm b { display: block; font-size: 12px; font-weight: 700; }
.me-sm small { display: block; font-size: 10px; color: var(--muted, #9A93BC); margin-top: 1px; }
.me-ls { border-radius: 18px; overflow: hidden; }
.me-r { display: flex; align-items: center; gap: 12px; padding: 12px 14px; font-size: 13.5px; font-weight: 600; cursor: pointer; }
.me-r + .me-r { border-top: 1px solid rgba(124,92,252,.1); }
.me-r .me-ic { width: 28px; height: 28px; border-radius: 9px; }
.me-r .me-ic svg { width: 15px !important; height: 15px !important; }
.me-r .grow { min-width: 0; flex: 1; }
.me-r small { display: block; font-size: 10.5px; color: var(--muted, #9A93BC); font-weight: 500; }
.me-ar { color: #C4BEDC; }
.me-sw { width: 42px; height: 25px; border-radius: 13px; background: #E5E1F3; position: relative; flex: none; transition: background .2s; }
.me-sw::after { content: ""; position: absolute; left: 2px; top: 2px; width: 21px; height: 21px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.2); transition: left .2s; }
.me-sw.on { background: #6d5ce7; }
.me-sw.on::after { left: 19px; }
.me-xhs { margin-top: 12px; display: flex; align-items: center; gap: 10px; background: #F1EFFF; color: #5b4bd6; border-radius: 14px; padding: 10px 12px; font-size: 12.5px; font-weight: 700; cursor: pointer; }
.me-xhs .grow { flex: 1; }
.me-xhs .cp { background: #fff; border-radius: 10px; padding: 3px 9px; font-size: 11px; }
.me-xhs svg { width: 15px !important; height: 15px !important; }
.me-out { text-align: center; margin-top: 16px; }
.me-out .out { display: inline-block; font-size: 13px; font-weight: 700; color: #e5484d; cursor: pointer; padding: 4px 12px; }
.me-out small { display: block; color: #B5B0CC; font-size: 11px; margin-top: 6px; cursor: pointer; padding: 4px; }
.me-login { display: block; width: 100%; margin-top: 16px; border: 0; border-radius: 14px; padding: 13px; font-size: 14px; font-weight: 800; color: #fff; background: var(--grad-brand); cursor: pointer; }
[data-theme="dark"] .me-tile, [data-theme="dark"] .me-sm, [data-theme="dark"] .me-ls { background: rgba(255,255,255,.07); box-shadow: none; }
[data-theme="dark"] .me-r + .me-r { border-top-color: rgba(255,255,255,.08); }
[data-theme="dark"] .me-sm .me-ic { background: rgba(139,156,255,.18); color: #c4b2ff; }
[data-theme="dark"] .me-sw { background: rgba(255,255,255,.18); }
[data-theme="dark"] .me-sw.on { background: #6d5ce7; }
[data-theme="dark"] .me-xhs { background: rgba(139,156,255,.14); color: #c4b2ff; }
[data-theme="dark"] .me-xhs .cp { background: rgba(255,255,255,.12); }
.legal-sheet .me-ls { background: transparent; box-shadow: none; }
html:not([data-theme="dark"]) .me-tile, html:not([data-theme="dark"]) .me-sm, html:not([data-theme="dark"]) .me-ls { background: #fff !important; background-image: none !important; }

/* ===== W-054 · 「我的」页票根墙（资料卡下，横滑票根卡）===== */
.me-wall { margin: 14px -12px 0; }
.me-tkhd { display: flex; align-items: baseline; justify-content: space-between; padding: 0 16px 8px; }
.me-tkhd b { font-size: 14px; font-weight: 800; }
.me-tkhd span { font-size: 11px; color: var(--muted, #9A93BC); cursor: pointer; }
.me-tkhd em { font-style: normal; font-weight: 800; color: #5b4bd6; font-size: 12px; }
.me-tkrow { display: flex; gap: 10px; overflow-x: auto; padding: 0 16px 4px; scroll-snap-type: x proximity; scroll-padding: 0 16px; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.me-tkrow::-webkit-scrollbar { display: none; }
.me-tk { position: relative; flex: none; width: 236px; height: 92px; border-radius: 16px; display: flex; overflow: hidden; cursor: pointer; scroll-snap-align: start; color: #fff; background: linear-gradient(150deg,#4a55cf,#5d4bd0 46%,#7c3fa8); box-shadow: 0 6px 16px rgba(91,70,190,.18); }
.me-tk.past { background: linear-gradient(150deg,#414cbd,#5140be 46%,#6d3f97); }
.me-tk .tk-po { flex: none; width: 92px; height: 92px; background: rgba(255,255,255,.14) center/cover no-repeat; }
.me-tk .tk-bd { position: relative; flex: 1; min-width: 0; border-left: 2px dashed rgba(255,255,255,.35); padding: 12px 10px 8px; display: flex; flex-direction: column; justify-content: center; gap: 4px; }
.me-tk .tk-bd::before, .me-tk .tk-bd::after { content: ""; position: absolute; left: -7px; width: 12px; height: 12px; border-radius: 50%; background: #f2f4fc; }
.me-tk .tk-bd::before { top: -6px; }
.me-tk .tk-bd::after { bottom: -6px; }
.me-tk b { font-size: 13px; font-weight: 800; color: #fff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.me-tk em { font-style: normal; font-size: 10px; color: rgba(255,255,255,.78); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.me-tk i { font-style: normal; font-size: 10px; font-weight: 700; color: #FDE68A; text-align: right; margin-top: 2px; }
.me-tkall { flex: none; width: 84px; height: 92px; border-radius: 16px; background: #fff; color: #5b4bd6; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; cursor: pointer; scroll-snap-align: end; box-shadow: 0 6px 16px rgba(91,70,190,.06); }
.me-tkall b { font-size: 14px; font-weight: 800; }
.me-tkall span { font-size: 11px; font-weight: 600; }
.me-tkempty { margin: 0 16px; display: flex; align-items: center; gap: 10px; padding: 14px; border-radius: 16px; background: #fff; border: 1.5px dashed rgba(124,92,252,.35); }
.me-tkempty .grow { flex: 1; min-width: 0; }
.me-tkempty b { display: block; font-size: 13.5px; font-weight: 800; }
.me-tkempty span { font-size: 10.5px; color: var(--muted, #9A93BC); }
.me-tkempty button { flex: none; border: 0; border-radius: 12px; padding: 7px 12px; font-size: 12px; font-weight: 700; color: #fff; background: #6d5ce7; cursor: pointer; }
.me-wall + .me-recap { margin-top: 12px; }
.me-recap + .me-gl { margin-top: 12px; }
[data-theme="dark"] .me-tk .tk-bd::before, [data-theme="dark"] .me-tk .tk-bd::after { background: #0a0d1c; }
[data-theme="dark"] .me-tkall, [data-theme="dark"] .me-tkempty { background: rgba(255,255,255,.07); box-shadow: none; }
[data-theme="dark"] .me-tkall { color: #c4b2ff; }
[data-theme="dark"] .me-tkempty { border-color: rgba(196,178,255,.35); }
[data-theme="dark"] .me-tkhd em { color: #c4b2ff; }

/* ===== W-057 · 首页大卡溢出修正 + 进度条加粗 + 全站扁平化（纯色 + 细边线，去层次感）===== */
/* ① 大卡：iOS WKWebView 下 overflow+圆角不裁带 backdrop-filter / 遮罩的子层 → 自成合成层 + 圆角蒙版；去 1px 半透明描边与投影（圆角外那圈深色带的来源） */
.hero-card.hero-home.hh{ isolation:isolate; transform:translateZ(0); -webkit-mask-image:-webkit-radial-gradient(#fff,#000); border:0 !important; box-shadow:none !important; margin-bottom:12px !important; background-clip:border-box; }
.hero-card.hero-home.hh .hh-sh{ inset:auto 0 0 0; }
.hero-card.hero-home.hh .stars-bg{ inset:0; }

/* ② 进度条：6px · 撑满磁贴内宽（左右各 14px）· 纯色轨道(18%) + 纯色填充 · 无渐变无发光 */
.qt-grid > .qt, .func-grid > .f{ --bc:#6d5ce7; aspect-ratio:auto !important; }
.qt-grid > .qt:nth-child(1), .func-grid > .f.is-ai{ --bc:#6d5ce7; }
.qt-grid > .qt:nth-child(2), .func-grid > .f.is-pack{ --bc:#4a6cf7; }
.qt-grid > .qt:nth-child(3), .func-grid > .f.is-wallet{ --bc:#f59e0b; }
.qt-grid > .qt:nth-child(4){ --bc:#10b981; }
.qt-grid > .qt:nth-child(5), .func-grid > .f.is-ticket{ --bc:#ec4899; }
.qt > .qt-bd .qt-bar, .qt-bar, .qt-grid .qt .qt-bar, .func-grid > .f .qt-bar.f-prog{
  display:block; box-sizing:border-box; align-self:stretch; width:auto !important; max-width:none !important;
  height:6px !important; min-height:6px !important; flex:none !important; margin:8px 8px 0 !important;
  border-radius:3px !important; background:color-mix(in srgb, var(--bc, #6d5ce7) 18%, transparent) !important; overflow:hidden;
}
.qt-bar > i, .qt-bar.over > i, .f-prog > i{ display:block; height:100%; border-radius:3px !important; background:var(--bc, #6d5ce7) !important; box-shadow:none !important; }
.qt-bar.over > i{ background:#ef4444 !important; }
.qt-bar.is-empty > i{ display:none !important; }
.qt-grid > .qt .qt-bd{ width:100%; }
.qt-grid > .qt .qt-bd > span{ position:relative; z-index:1; }
.rc-prog-bar, .p2-prog i{ height:6px !important; border-radius:3px !important; background:rgba(109,92,231,.18) !important; }
.rc-prog-bar i, .p2-prog i b{ border-radius:3px !important; background:#6d5ce7 !important; box-shadow:none !important; }

/* ③ 扁平化：白卡 = 纯白 + 1px 淡边线，无投影 / 渐变 / 高光 */
.card, .ht, .rc-cell, .hot-mini, .xh-card, .search-box, .me-sm, .me-ls, .me-tkall, .pk-hero, .pk-sec, .recap-card, .link-card, .p31-prog, .ps-panel{
  background-image:none !important; box-shadow:none !important; -webkit-backdrop-filter:none !important; backdrop-filter:none !important;
}
.card, .ht, .xh-card, .search-box, .me-sm, .me-ls, .pk-hero, .pk-sec, .ps-panel, .recap-card{ background-color:#fff !important; border:1px solid rgba(124,92,252,.10) !important; }
.hot-cv.hot-cv-ph{ background:#EEF0FF !important; }
.rc-cell{ background:#F0EEFB !important; border:0 !important; }
.ht{ background-color:#fff !important; }
/* 色块磁贴：纯色浅底 */
.qt-grid .qt:nth-child(1){ background:#EEF0FF !important; } .qt-grid .qt:nth-child(2){ background:#E8F0FF !important; }
.qt-grid .qt:nth-child(3){ background:#FFF3E0 !important; } .qt-grid .qt:nth-child(4){ background:#E3F6EE !important; }
.qt-grid .qt:nth-child(5){ background:#FDE8EF !important; } .qt-grid .qt:nth-child(6){ background:#F0EEFB !important; }
.f.is-ai{ background:#EEF0FF !important; } .f.is-ticket{ background:#FDE8EF !important; } .f.is-pack{ background:#E8F0FF !important; }
.f.is-wallet{ background:#FFF3E0 !important; } .f.is-memory, .f.is-soon{ background:#F0EEFB !important; }
.qt, .f{ box-shadow:none !important; background-image:none !important; border:0 !important; }
.f .fi{ -webkit-backdrop-filter:none !important; backdrop-filter:none !important; }
/* 图标底块 / 小件：纯色、无阴影 */
.me-ic{ background:#6d5ce7 !important; box-shadow:none !important; color:#fff !important; } .me-ic svg{ stroke:#fff !important; } .me-ic.gold{ background:#f59e0b !important; }
.rc-ico, .banner-icon, .recap-hero-ring, .trip-attend-btn, .fab-add{ box-shadow:none !important; }
.fab-add{ background:#6d5ce7 !important; }
.pk-ring.big{ background-image:none; }
/* 非海报表面的胶囊 / 分段条：去玻璃 */
.seg, .seg.mem-seg, .cat-tab, .cat-tab.on, .icon-btn, .mtc-pill.ok{ -webkit-backdrop-filter:none !important; backdrop-filter:none !important; }
.cat-tab.on, .seg button.on{ background-image:none !important; background-color:#6d5ce7 !important; color:#fff !important; }
/* 记忆 / 回忆册统计格（非横条上的）*/
.mem-page .stat, .page .stat{ box-shadow:none !important; }
.recap-hero .stat{ box-shadow:none !important; }
/* 暗色：只去阴影/渐变，保留现有深色底（给个纯色深底兜底） */
[data-theme="dark"] .card, [data-theme="dark"] .ht, [data-theme="dark"] .xh-card, [data-theme="dark"] .search-box,
[data-theme="dark"] .me-sm, [data-theme="dark"] .me-ls, [data-theme="dark"] .pk-hero, [data-theme="dark"] .pk-sec, [data-theme="dark"] .ps-panel, [data-theme="dark"] .recap-card{
  background-color:#1a1d33 !important; border:1px solid rgba(255,255,255,.08) !important; }
[data-theme="dark"] .rc-cell{ background:rgba(255,255,255,.06) !important; }
[data-theme="dark"] .qt-grid .qt:nth-child(1){ background:rgba(124,92,252,.22) !important; } [data-theme="dark"] .qt-grid .qt:nth-child(2){ background:rgba(59,130,246,.22) !important; }
[data-theme="dark"] .qt-grid .qt:nth-child(3){ background:rgba(245,158,11,.22) !important; } [data-theme="dark"] .qt-grid .qt:nth-child(4){ background:rgba(16,185,129,.22) !important; }
[data-theme="dark"] .qt-grid .qt:nth-child(5){ background:rgba(236,72,153,.22) !important; } [data-theme="dark"] .qt-grid .qt:nth-child(6){ background:rgba(124,92,252,.22) !important; }
[data-theme="dark"] .f.is-ai, [data-theme="dark"] .f.is-memory, [data-theme="dark"] .f.is-soon{ background:rgba(124,92,252,.22) !important; }
[data-theme="dark"] .f.is-ticket{ background:rgba(236,72,153,.22) !important; } [data-theme="dark"] .f.is-pack{ background:rgba(59,130,246,.22) !important; } [data-theme="dark"] .f.is-wallet{ background:rgba(245,158,11,.22) !important; }
[data-theme="dark"] .rc-prog-bar, [data-theme="dark"] .p2-prog i{ background:rgba(196,178,255,.22) !important; }
.xh-card .xh-body{ background:transparent !important; }

/* ===== W-058：进度条 4px / 行程悬浮钮「+」与 AI 同轴居中 ===== */
.qt > .qt-bd .qt-bar, .qt-bar, .qt-grid .qt .qt-bar, .func-grid > .f .qt-bar.f-prog{ height:4px !important; min-height:4px !important; border-radius:2px !important; }
.qt-bar > i, .qt-bar.over > i, .f-prog > i{ border-radius:2px !important; }
.rc-prog-bar, .p2-prog i{ height:4px !important; border-radius:2px !important; }
.rc-prog-bar i, .p2-prog i b{ border-radius:2px !important; }
.fab-add:has(.ai-tag){ padding:0 !important; align-items:center !important; justify-content:center !important; }
.fab-add:has(.ai-tag) > svg{ display:block; margin:0 auto; flex:none; }
.fab-add:has(.ai-tag) .ai-tag{ margin:2px 0 0 !important; padding:0 6px !important; align-self:center; }

/* ===== W-060 · 七点真机修正 ===== */
/* ① 速办第一格「开始计划 / 计划一览」+ AI 小标：与汉字同一条水平中线、同字重（flex 居中，不再靠 vertical-align 估） */
.qt-grid .qt.is-ai .qt-bd b, .func-grid .f.is-ai .f-name{ display:flex; align-items:center; gap:5px; }
.qt-grid .qt.is-ai .qt-bd b .ai-tag, .func-grid .f.is-ai .f-name .ai-tag{
  position:static !important; margin:0 !important; flex:none; vertical-align:baseline !important;
  font-weight:600 !important; line-height:1 !important; box-shadow:none !important; animation:none !important;
}
/* ② 已散场「记录今晚」：品牌金纯色 + 深紫字（扁平、无阴影、无毛玻璃） */
.hero-card.hero-home.hh .hh-cd.hh-rec{ background:#f5b94e !important; color:#2a1f5c; box-shadow:none !important; -webkit-backdrop-filter:none !important; backdrop-filter:none !important; }
.hero-card.hero-home.hh .hh-rec .rc-i, .hero-card.hero-home.hh .hh-rec .rc-t{ color:#2a1f5c; }
.hero-card.hero-home.hh .hh-rec .rc-s{ color:rgba(42,31,92,.72); }
/* ③ 「编辑」与「删除」成对：淡紫底 + 紫字，同尺寸 */
.btn.btn-ghost.btn-edit{ background:rgba(109,92,231,.12) !important; color:#5b4bd6 !important; border:0 !important; box-shadow:none !important; }
[data-theme="dark"] .btn.btn-ghost.btn-edit{ background:rgba(139,122,246,.2) !important; color:#c4b2ff !important; }
/* ④ 大白框公共 logo 水印（扁平：无渐变 / 阴影 / 发光；压在内容之下） */
.wm-logo{ position:relative; overflow:hidden; isolation:isolate; }
.wm-logo::before{
  content:''; position:absolute; right:-10px; top:-12px; width:96px; height:96px; z-index:-1; pointer-events:none;
  background:#6d5ce7; opacity:.07;
  -webkit-mask:url(/logo/icon-solid.svg) no-repeat center / contain; mask:url(/logo/icon-solid.svg) no-repeat center / contain;
}
.wm-logo.wm-sm::before{ width:64px; height:64px; right:6px; top:5px; }
[data-theme="dark"] .wm-logo::before{ background:#fff; opacity:.05; }
/* ⑤ 首页「大家都在聊」封面：上面 v1.9 扁平化把 .hot-cv 的 background-image 一并清掉了（所以有图也是空白方块）→ 放回来 */
/* ⑥ 帖子详情「全部评论」不要白底框，直接铺在页面背景上 */
.cmt-sec{ margin-top:16px; padding:0 2px; }
.cmt-sec .cmt-h{ margin:0 0 6px; font-size:15px; }
.cmt-sec .comment-empty{ padding:28px 0 36px; text-align:center; }
/* ⑦ 公共默认封面：品牌蓝紫纯色底 + 居中白色赴星 logo（占 45%） */
.cv-ph{ position:relative; background:#6d5ce7 !important; background-image:none !important; overflow:hidden; }
.cv-ph > *{ display:none !important; }
.cv-ph::before{ content:''; position:absolute; inset:0; background:url(/logo/icon-white.svg) no-repeat center / 45%; }
.cv-ph::after{ display:none !important; }

/* ===== W-063 · 花费明细总花费大卡：W-057 的 .card 纯白 !important 盖掉了紫底（白字落白底=空白框）→ 同权重以上恢复实色紫 ===== */
.card.cost-hero{ background-color:#6d5ce7 !important; background-image:none !important; border:0 !important; box-shadow:none !important; }
[data-theme="dark"] .card.cost-hero{ background-color:#5b4bd6 !important; background-image:none !important; border:0 !important; box-shadow:none !important; }

/* ===== W-064 ===== */
/* ① 「记录今晚」：品牌紫纯色 + 白字 + 1px 白描边（扁平，无阴影） */
.hero-card.hero-home.hh .hh-cd.hh-rec{ background:#8b5cf6 !important; color:#fff; border:1px solid rgba(255,255,255,.35) !important; box-shadow:none !important; }
.hero-card.hero-home.hh .hh-rec .rc-i, .hero-card.hero-home.hh .hh-rec .rc-t{ color:#fff; }
.hero-card.hero-home.hh .hh-rec .rc-s{ color:rgba(255,255,255,.8); }
/* ① AI 小标：恢复 ✦（行内、右侧、同中线 0.8em 白色）；名字与小标并排不重叠，窄时名字省略号 */
.qt-grid .qt.is-ai .qt-bd b, .func-grid .f.is-ai .f-name{ justify-content:center; max-width:100%; min-width:0; }
.qt-grid .qt.is-ai .qt-bd b .nm-t, .func-grid .f.is-ai .f-name .nm-t{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.qt-grid .qt.is-ai .qt-bd b .ai-tag, .func-grid .f.is-ai .f-name .ai-tag{ gap:2px; white-space:nowrap; }
.qt-grid .qt.is-ai .qt-bd b .ai-tag::after, .func-grid .f.is-ai .f-name .ai-tag::after{
  position:static !important; display:inline-block !important; flex:none; top:auto !important; right:auto !important;
  width:.8em !important; height:.8em !important; background:#fff !important;
}
/* ③ 票面背景图：从「更多信息」提到样式条与预览之间 */
.tkbg .tkbg-row{ display:flex; gap:12px; align-items:center; }
.tkbg .tkbg-thumb{ position:relative; flex:none; width:64px; height:64px; border-radius:10px; overflow:hidden; background:#eef0f8; }
.tkbg .tkbg-ph{ position:absolute; inset:0; }
.tkbg .tkbg-thumb img.up-img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; border-radius:0; margin:0; max-height:none; }
.tkbg .tkbg-thumb:has(img[src]:not([src=""])) .tkbg-ph{ display:none; }
.tkbg .tkbg-bd{ flex:1; min-width:0; }
.tkbg .tkbg-acts{ display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
.tkbg .tkbg-up{ position:relative; overflow:hidden; cursor:pointer; }
.tkbg .tkbg-file{ position:absolute; inset:0; width:100%; height:100%; opacity:0; cursor:pointer; font-size:0; }
.tkbg .tkbg-t-has{ display:none; }
.tkbg:has(img[src]:not([src=""])) .tkbg-t-has{ display:inline; }
.tkbg:has(img[src]:not([src=""])) .tkbg-t-new{ display:none; }
.tkbg .up-hint{ margin-top:6px; }
.tkbg .up-hint-link{ font:inherit; }
.qt-grid .qt.is-ai .qt-bd b, .func-grid .f.is-ai .f-name{ gap:4px; }
.qt-grid .qt.is-ai .qt-bd b .ai-tag, .func-grid .f.is-ai .f-name .ai-tag{ padding:2px 5px !important; font-size:10px !important; gap:1px; }
.qt-grid .qt.is-ai .qt-bd b .ai-tag, .func-grid .f.is-ai .f-name .ai-tag{ transform:translateY(-.6px) !important; }
.tkbg .up-hint-link{ font-size:11px; font-weight:600; }
/* W-066：.nm-t 是名字本体，不是副标题——被 `.qt-bd span` / `.is-ai .qt-bd span` 吃成灰色 12px/400，这里还原为与同格其它磁贴名字一致 */
.qt-grid > .qt.is-ai .qt-bd b .nm-t, .func-grid > .f.is-ai .f-name .nm-t{ display:inline; padding:0 !important; font-size:inherit !important; font-weight:inherit !important; line-height:inherit !important; color:inherit !important; -webkit-text-fill-color:currentColor; }
/* W-066：速办格内容宽仅 88px，「开始计划」56 + 间距 4 + AI 标 30 = 90 会把名字省略；收紧间距与标内边距，名字完整显示 */
.qt-grid .qt.is-ai .qt-bd b, .func-grid .f.is-ai .f-name{ gap:2px; }
.qt-grid .qt.is-ai .qt-bd b .ai-tag, .func-grid .f.is-ai .f-name .ai-tag{ padding:2px 4px !important; }

/* ===== W-071 ① 首页空态大卡（所有奔赴都已收藏 / 全新空态 / nudge）：W-057 的 .card 纯白 !important 盖掉了 .hero-empty-grad 渐变（白字落白底）
   同 W-063 cost-hero：同权重以上恢复实色蓝紫扁平底（亮 #6d5ce7 / 暗 #5b4bd6），保留 .heg-glow 柔光装饰 ===== */
.card.empty-start.hero-empty-grad{ background-color:#6d5ce7 !important; background-image:none !important; border:0 !important; box-shadow:none !important; }
[data-theme="dark"] .card.empty-start.hero-empty-grad{ background-color:#5b4bd6 !important; background-image:none !important; border:0 !important; box-shadow:none !important; }

/* ===== W-071 ②③④ 添加/编辑演唱会表单：场馆/开场/座位区同行 + 备注单行 + 封面压矮 + 保存吸底 ===== */
.pe-page .pe-row3{ display:grid; grid-template-columns:1.5fr 1fr 1fr; gap:8px; }
.pe-page .pe-row3 > .pe-field{ min-width:0; margin-bottom:10px; }
.pe-page .pe-row3 .input{ min-width:0; width:100%; padding-left:9px; padding-right:6px; font-size:14px; text-overflow:ellipsis; }
.pe-page .pe-row3 label{ white-space:nowrap; font-size:12px; }
.pe-page .pe-note{ margin-bottom:6px; }
.pe-page .pe-cover{ min-height:0; height:100px; padding:8px 12px; }
.pe-page .pe-cover-ph{ flex-direction:row; gap:8px; }
.pe-page .pe-cover-ph svg{ margin-bottom:0; }
.pe-page .pe-cover-ph > span{ display:none; }
.pe-page .pe-cover-img{ max-height:84px; }
.pe-page .up-hint{ margin-top:6px; }
.pe-page .pe-divider{ margin:10px -15px; }
#pe-submit{ position:sticky; bottom:calc(var(--page-bottom) - 6px); z-index:5; }
/* ⑥ 日期/时间输入框文字左对齐（iOS 原生控件默认居中，与其它输入框不一致） */
form[data-form="concert"] .fx-box > input.input.input[type="date"], form[data-form="concert"] .fx-box > input.input.input[type="time"],
form[data-form="concert"] input[type="date"], form[data-form="concert"] input[type="time"]{ text-align:left !important; text-align-last:left; }
form[data-form="concert"] input[type="date"]::-webkit-datetime-edit, form[data-form="concert"] input[type="time"]::-webkit-datetime-edit{ justify-content:flex-start !important; text-align:left !important; }
form[data-form="concert"] input[type="date"]::-webkit-date-and-time-value, form[data-form="concert"] input[type="time"]::-webkit-date-and-time-value{ text-align:left !important; }
/* 开场时间格很窄：去掉原生时钟图标，保证「19:30」完整显示 */
.pe-page .pe-row3 input[type="time"]::-webkit-calendar-picker-indicator{ display:none; }
.pe-page .pe-row3 input[type="time"]{ padding-left:9px; padding-right:2px; }
