/* ============================================================
   漫游旅线 · 移动端设计系统
   深青 × 沙白 × 珊瑚橙 —— 山水旅行的呼吸感
   ============================================================ */

:root {
  --brand-900:#072623;
  --brand-800:#0B3B36;
  --brand-700:#0E4F47;
  --brand-600:#13796B;
  --brand-500:#1B9A87;
  --accent-600:#F26B38;
  --accent-500:#FF7A52;
  --accent-400:#FF9A5C;
  --sun:#FFC98B;
  --sand:#F6F1E9;
  --sand-2:#EFE7DB;
  --ink:#1C2624;
  --ink-2:#55635F;
  --ink-3:#8A9894;
  --line:#E6DED1;
  --surface:#FFFFFF;
  --danger:#D64545;
  --ok:#2E9E6B;
  --radius-lg:24px;
  --radius-md:16px;
  --radius-sm:10px;
  --shadow-sm:0 1px 2px rgba(11,59,54,.06), 0 4px 14px rgba(11,59,54,.06);
  --shadow-md:0 6px 24px rgba(11,59,54,.10), 0 2px 6px rgba(11,59,54,.05);
  --shadow-lg:0 16px 48px rgba(7,38,35,.18);
  --ease-out:cubic-bezier(.22,1,.36,1);
  --safe-top:clamp(0px, var(--real-safe-top, env(safe-area-inset-top,0px)), 64px);
  --safe-bottom:clamp(0px, var(--real-safe-bottom, env(safe-area-inset-bottom,0px)), 64px);
  --nav-h:64px;
}

* { margin:0; padding:0; box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
html { -webkit-text-size-adjust:100%; }
body {
  font-family:-apple-system, BlinkMacSystemFont, "PingFang SC", "HarmonyOS Sans",
             "Noto Sans SC", "Microsoft YaHei", sans-serif;
  background:var(--sand);
  color:var(--ink);
  line-height:1.5;
  overscroll-behavior-y:none;
}

/* ---------- 应用外壳 ---------- */
.app {
  max-width:520px;
  margin:0 auto;
  min-height:100dvh;
  background:var(--sand);
  position:relative;
  box-shadow:0 0 60px rgba(7,38,35,.10);
}
.view {
  padding:0 18px calc(var(--nav-h) + var(--safe-bottom) + 24px);
  min-height:100dvh;
  animation:viewIn .38s var(--ease-out) both;
}
@keyframes viewIn { from{opacity:0; transform:translateY(14px)} to{opacity:1; transform:none} }

.hidden { display:none !important; }

/* ---------- 顶部栏 ---------- */
.app-header { position:sticky; top:0; z-index:40; padding-top:var(--safe-top); }
/* 详情/编辑页：固定顶栏（部分安卓 WebView 下 sticky 会失效，改用 fixed 保证不随滚动移动） */
body.back-on .app-header,
body.edit-on .app-header {
  position:fixed; top:0; left:0; right:0; margin:0 auto; width:100%; max-width:520px;
  padding-top:var(--safe-top);
  background:rgba(246,241,233,.96);
  box-shadow:0 6px 18px rgba(11,59,54,.10);
}
body.back-on .view { padding-top:calc(var(--safe-top) + 96px); }
body.edit-on .view { padding-top:calc(var(--safe-top) + 52px); }
.app-header .bar {
  display:flex; align-items:center; gap:10px;
  height:52px; padding:0 18px;
}
.app-header .bar.back-mode { background:transparent; backdrop-filter:none; }
.app-header .back-btn {
  width:38px; height:38px; border:none; border-radius:12px;
  background:rgba(255,255,255,.9); color:var(--brand-800);
  display:flex; align-items:center; justify-content:center;
  box-shadow:var(--shadow-sm); cursor:pointer;
  transition:transform .15s var(--ease-out);
}
.app-header .back-btn:active { transform:scale(.92); }
.app-header .back-btn svg { width:20px; height:20px; }
.app-header .bar-title { font-size:calc(17px + var(--fs-add-m, 0px)); font-weight:700; letter-spacing:.5px; color:var(--ink); }

/* 详情页固定信息条（随顶栏一起固定，滚动时不突兀；单行不换行，避免顶栏长高压住内容） */
.dh-strip {
  display:flex; align-items:center; gap:8px; flex-wrap:nowrap;
  padding:0 18px 12px; overflow:hidden;
}
.dh-strip-tag {
  flex:none; font-size:calc(11px + var(--fs-add-s, 0px)); padding:4px 10px; border-radius:999px;
  background:var(--brand-700); color:#F4EFE6; font-weight:600; letter-spacing:.5px;
  white-space:nowrap;
}
.dh-strip-date {
  font-size:calc(12px + var(--fs-add-s, 0px)); font-weight:700; color:var(--ink-2);
  display:inline-flex; align-items:center; gap:4px; white-space:nowrap;
  overflow:hidden; text-overflow:ellipsis; min-width:0;
}
.dh-strip-date svg { width:13px; height:13px; color:var(--accent-600); flex:none; }

/* 首页头部 */
.hero {
  position:relative; overflow:hidden;
  margin:-18px -18px 14px;
  padding:calc(var(--safe-top) + 20px) 22px 34px;
  color:#F4EFE6;
  background:
    radial-gradient(120% 90% at 85% -10%, rgba(255,154,92,.28) 0%, transparent 55%),
    linear-gradient(160deg, var(--brand-600) 0%, var(--brand-800) 62%, var(--brand-900) 100%);
}
.hero-top { display:flex; align-items:center; justify-content:space-between; margin-bottom:26px; }
.brand { display:flex; align-items:center; gap:12px; }
.brand-mark {
  width:44px; height:44px; border-radius:14px; flex:none;
  background:linear-gradient(135deg, var(--sun), var(--accent-500));
  display:flex; align-items:center; justify-content:center;
  font-size:calc(22px + var(--fs-add-l, 0px)); font-weight:800; color:var(--brand-900);
  box-shadow:0 8px 20px rgba(255,154,92,.35);
}
.brand-name { font-size:calc(20px + var(--fs-add-l, 0px)); font-weight:800; letter-spacing:2px; line-height:1.1; }
.brand-sub { font-size:calc(11px + var(--fs-add-s, 0px)); opacity:.72; letter-spacing:3px; margin-top:2px; }
.hero-city {
  font-size:calc(12px + var(--fs-add-s, 0px)); padding:7px 12px; border-radius:999px;
  background:rgba(255,255,255,.14); backdrop-filter:blur(8px);
  border:1px solid rgba(255,255,255,.22); letter-spacing:1px;
}
.hero-title { font-size:calc(26px + var(--fs-add-l, 0px)); font-weight:800; letter-spacing:1px; line-height:1.25; }
.hero-desc { margin-top:8px; font-size:calc(13.5px + var(--fs-add-m, 0px)); opacity:.82; letter-spacing:.5px; }
/* 首页操作条：暗黑模式 / 检查更新（游客与管理员均可见） */
.hero-ops { display:flex; gap:10px; margin-top:22px; position:relative; z-index:2; }
.hero-op {
  padding:9px 16px; border-radius:999px; font-size:calc(12.5px + var(--fs-add-m, 0px)); letter-spacing:.5px;
  background:rgba(255,255,255,.14); backdrop-filter:blur(8px);
  border:1px solid rgba(255,255,255,.24); color:#F4EFE6; cursor:pointer;
  transition:all .2s var(--ease-out); font-family:inherit;
}
.hero-op:active { transform:scale(.96); background:rgba(255,255,255,.24); }
/* 底部波浪：必须给元素本身定高。只写 `.hero-wave svg` 是选不中的——
   波浪自己就是那个 <svg>，不给高度它会按 viewBox 比例随屏宽变高
   （手机 48px、桌面 150px），把上面的操作按钮整片盖住。 */
.hero-wave { position:absolute; left:0; right:0; bottom:-1px; width:100%; height:26px; }
.hero-wave svg { display:block; width:100%; height:26px; }

/* 大字模式（老年人模式）：全局放大，游客与管理员均可见 */
:root { --fs-add-s:0px; --fs-add-m:0px; --fs-add-l:0px; }
body.large { --fs-add-s:2.5px; --fs-add-m:3.5px; --fs-add-l:5.5px; }

/* ---------- 筛选条 ---------- */
.filterbar {
  position:sticky; top:calc(var(--safe-top) + 8px); z-index:30;
  display:flex; align-items:center; gap:10px;
  margin:0 0 16px; padding:10px;
  background:rgba(255,255,255,.9); backdrop-filter:blur(16px);
  border-radius:var(--radius-md); box-shadow:var(--shadow-sm);
}
.fb-type { flex:1; display:flex; gap:6px; overflow-x:auto; scrollbar-width:none; -ms-overflow-style:none; }
.fb-type::-webkit-scrollbar { display:none; }
.chip {
  flex:none; border:1.5px solid var(--line); background:transparent; color:var(--ink-2);
  padding:7px 13px; border-radius:999px; font-size:calc(13px + var(--fs-add-m, 0px)); cursor:pointer;
  transition:all .22s var(--ease-out); letter-spacing:.5px;
}
.chip.active { background:var(--brand-800); border-color:var(--brand-800); color:#F4EFE6; font-weight:600;
  box-shadow:0 4px 12px rgba(11,59,54,.25); }
.fb-btn {
  flex:none; display:flex; align-items:center; gap:6px;
  border:1.5px solid var(--line); background:var(--surface); color:var(--ink);
  padding:8px 14px; border-radius:999px; font-size:calc(13px + var(--fs-add-m, 0px)); cursor:pointer;
  transition:all .22s var(--ease-out);
}
.fb-btn:active { transform:scale(.95); }
.fb-btn svg { width:15px; height:15px; }
.fb-btn .dot { width:7px; height:7px; border-radius:50%; background:var(--accent-500); }

/* ---------- 线路卡片 ---------- */
.line-card {
  background:var(--surface); border-radius:var(--radius-lg);
  box-shadow:var(--shadow-sm); padding:16px 16px 14px;
  margin-bottom:14px; cursor:pointer; position:relative; overflow:hidden;
  transition:transform .28s var(--ease-out), box-shadow .28s var(--ease-out);
  animation:cardIn .5s var(--ease-out) both;
}
@keyframes cardIn { from{opacity:0; transform:translateY(18px) scale(.985)} to{opacity:1; transform:none} }
.line-card:active { transform:scale(.985); box-shadow:var(--shadow-md); }
.line-card::before {
  content:""; position:absolute; inset:0 auto 0 0; width:4px;
  background:linear-gradient(180deg, var(--accent-400), var(--accent-600));
  opacity:0; transition:opacity .25s;
}
.line-card:active::before { opacity:1; }

.card-top { display:flex; align-items:flex-start; gap:10px; }
.type-tag {
  flex:none; font-size:calc(11px + var(--fs-add-s, 0px)); font-weight:700; letter-spacing:1.5px;
  padding:4px 9px; border-radius:8px;
  background:rgba(19,121,107,.10); color:var(--brand-600);
}
.type-tag.港澳台 { background:rgba(242,107,56,.10); color:var(--accent-600); }
.type-tag.出境游 { background:rgba(46,158,107,.12); color:var(--ok); }
.type-tag.短线游 { background:rgba(139,154,148,.14); color:var(--ink-2); }
.card-name { flex:1; font-size:calc(16px + var(--fs-add-m, 0px)); font-weight:700; line-height:1.4; color:var(--ink); }
.card-meta { display:flex; flex-wrap:wrap; gap:6px 14px; margin-top:12px; }
.meta-item { display:flex; align-items:center; gap:5px; font-size:calc(12.5px + var(--fs-add-m, 0px)); color:var(--ink-2); }
.meta-item svg { width:13px; height:13px; opacity:.7; }
.meta-item b { color:var(--ink); font-weight:600; }
/* 出发地 → 目的地：固定独立一行（不与出发日期/天数混排） */
.card-route {
  display:flex; align-items:center; gap:5px;
  margin-top:8px; font-size:calc(12.5px + var(--fs-add-m, 0px)); color:var(--ink-2);
}
/* 路线文字可压缩 + 省略号兜底（交通信息占右侧，长目的地不撑破卡片） */
.card-route .route-text { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.card-route svg { width:13px; height:13px; opacity:.7; flex:none; }
.card-route b { color:var(--ink); font-weight:600; }
/* 交通方式（线路级）：与路线同行、右对齐、中性灰（方案 C，2026-10-15 用户选定）。
   卡片上**只显示交通方式**——车次/航班号按团期不同而变，只在该团期卡片里显示。 */
.card-transport {
  margin-left:auto; flex:none; display:inline-flex; align-items:center; gap:5px;
  max-width:56%; color:var(--ink-3); font-weight:500;
}
.card-transport svg { width:13px; height:13px; opacity:.7; flex:none; }
.card-transport b { color:var(--ink-3); font-weight:600; flex:none; }
.card-foot { display:flex; align-items:flex-end; justify-content:space-between; margin-top:14px; }
.price { font-size:calc(12px + var(--fs-add-s, 0px)); color:var(--ink-3); }
.price b { font-size:calc(20px + var(--fs-add-l, 0px)); font-weight:800; color:var(--accent-600); font-variant-numeric:tabular-nums; }
.price i { font-style:normal; }
.card-badges { display:flex; gap:6px; flex-wrap:wrap; justify-content:flex-end; row-gap:6px; }
.badge {
  font-size:calc(11px + var(--fs-add-s, 0px)); padding:4px 8px; border-radius:8px; letter-spacing:.5px;
  background:var(--sand); color:var(--ink-2);
}
.badge.doc { background:rgba(19,121,107,.10); color:var(--brand-600); }
.badge.multi { background:rgba(242,107,56,.10); color:var(--accent-600); }

/* 备案页脚（工信部要求：展示备案号 + 链接 beian.miit.gov.cn）
   在 #view 之后随内容滚动；底部预留安全区与导航高度，避免被固定导航压住 */
.app-footer {
  margin:26px 0 0; padding:14px 4px calc(var(--real-safe-bottom, 0px) + 30px);
  text-align:center; line-height:1.75; letter-spacing:.2px;
  font-size:calc(11.5px + var(--fs-add-s, 0px)); color:var(--ink-3);
}
.app-footer a { color:var(--ink-3); text-decoration:none; border-bottom:1px solid transparent; }
.app-footer a:hover, .app-footer a:active { color:var(--ink-2); border-bottom-color:var(--line); }
/* 公司名单独一行、再小一号：窄屏不会把"营业部"挤成孤字 */
.app-footer-org {
  margin-top:3px; font-size:calc(10.5px + var(--fs-add-s, 0px));
  color:var(--ink-3); opacity:.85; letter-spacing:.1px;
}

/* 骨架屏 */
.skeleton { border-radius:var(--radius-lg); background:var(--surface); padding:16px; margin-bottom:14px; box-shadow:var(--shadow-sm); }
.sk { border-radius:8px; background:linear-gradient(90deg,#EFE7DB 25%,#F6F1E9 45%,#EFE7DB 65%);
  background-size:200% 100%; animation:shimmer 1.4s infinite; }
@keyframes shimmer { to { background-position:-200% 0; } }
.sk.h-16 { height:16px; width:72%; }
.sk.h-12 { height:12px; width:45%; margin-top:12px; }
.sk.h-24 { height:24px; width:38%; margin-top:14px; }

/* ---------- 空状态 ---------- */
.empty { text-align:center; padding:70px 30px; color:var(--ink-3); animation:viewIn .5s var(--ease-out); }
.empty svg { width:120px; height:120px; opacity:.85; }
.empty h3 { font-size:calc(16px + var(--fs-add-m, 0px)); color:var(--ink-2); margin-top:14px; font-weight:600; }
.empty p { font-size:calc(13px + var(--fs-add-m, 0px)); margin-top:6px; }
.empty .btn { margin-top:18px; display:inline-flex; }

/* ---------- 按钮 ---------- */
.btn {
  border:none; cursor:pointer; font-size:calc(15px + var(--fs-add-m, 0px)); font-weight:600;
  border-radius:var(--radius-md); padding:13px 20px;
  transition:transform .15s var(--ease-out), box-shadow .2s, background .2s, opacity .2s;
  font-family:inherit; letter-spacing:.5px;
}
.btn:active { transform:scale(.96); }
.btn-primary { background:linear-gradient(135deg, var(--brand-600), var(--brand-800)); color:#F4EFE6;
  box-shadow:0 8px 20px rgba(11,59,54,.25); }
.btn-accent { background:linear-gradient(135deg, var(--accent-400), var(--accent-600)); color:#fff;
  box-shadow:0 8px 20px rgba(242,107,56,.28); }
.btn-ghost { background:transparent; color:var(--brand-600); }
.btn-danger { background:rgba(214,69,69,.08); color:var(--danger); }
.btn-block { display:block; width:100%; }
/* 主次操作同行（编辑页底部）：主按钮占满剩余宽度、次按钮不换行不挤压 */
.btn-row { display:flex; gap:10px; margin-top:6px; }
.btn-row .btn { white-space:nowrap; }
.btn-row .btn-block { flex:1 1 auto; width:auto; }
.btn-row .btn:not(.btn-block) { flex:0 0 auto; }
.btn-sm { padding:7px 13px; font-size:calc(13px + var(--fs-add-m, 0px)); border-radius:var(--radius-sm); }
.btn:disabled { opacity:.45; pointer-events:none; }

/* ---------- 底部弹层（筛选） ---------- */
.sheet-mask {
  position:fixed; inset:0; z-index:60;
  background:rgba(7,38,35,.45); backdrop-filter:blur(3px);
  opacity:0; pointer-events:none; transition:opacity .3s;
}
.sheet-mask.open { opacity:1; pointer-events:auto; }
.sheet {
  position:absolute; left:0; right:0; bottom:0; margin:0 auto; max-width:520px;
  background:var(--surface); border-radius:26px 26px 0 0;
  padding:10px 20px calc(20px + var(--safe-bottom));
  transform:translateY(105%); transition:transform .42s var(--ease-out);
  max-height:86dvh; display:flex; flex-direction:column;
}
.sheet-mask.open .sheet { transform:none; }
.sheet-grab { width:42px; height:5px; border-radius:99px; background:var(--line); margin:2px auto 14px; }
.sheet-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:8px; }
.sheet-head h3 { font-size:calc(17px + var(--fs-add-m, 0px)); font-weight:700; letter-spacing:.5px; }
.sheet-body { overflow-y:auto; padding:6px 0 10px; }
.sheet-foot { padding-top:10px; }

/* ---------- 表单 ---------- */
.field { margin-top:14px; }
.field label { display:block; font-size:calc(12px + var(--fs-add-s, 0px)); color:var(--ink-3); letter-spacing:1px; margin-bottom:7px; font-weight:600; }
.field input, .field textarea, .field select {
  width:100%; border:1.5px solid var(--line); background:var(--sand);
  border-radius:var(--radius-sm); padding:12px 14px; font-size:calc(15px + var(--fs-add-m, 0px));
  color:var(--ink); font-family:inherit; outline:none;
  transition:border-color .2s, box-shadow .2s, background .2s;
  appearance:none; -webkit-appearance:none;
}
.field input:focus, .field textarea:focus { border-color:var(--brand-500); background:#fff;
  box-shadow:0 0 0 3px rgba(27,154,135,.14); }
.field textarea { resize:vertical; min-height:88px; line-height:1.6; }
.field-row { display:grid; grid-template-columns:1fr 1fr; gap:12px; }
.field .hint { font-size:calc(11.5px + var(--fs-add-s, 0px)); color:var(--ink-3); margin-top:6px; }

/* 单选胶囊组（类型） */
.radio-caps { display:grid; grid-template-columns:repeat(4,1fr); gap:8px; }
.radio-caps label {
  position:relative; cursor:pointer; text-align:center;
  border:1.5px solid var(--line); border-radius:var(--radius-sm);
  padding:11px 4px; font-size:calc(13.5px + var(--fs-add-m, 0px)); color:var(--ink-2);
  transition:all .22s var(--ease-out);
}
.radio-caps input { position:absolute; opacity:0; pointer-events:none; }
.radio-caps label:has(input:checked) {
  background:var(--brand-800); border-color:var(--brand-800); color:#F4EFE6; font-weight:600;
  box-shadow:0 4px 12px rgba(11,59,54,.22);
}

/* 选填标记（如「交通方式 选填」）——降低视觉权重，不与必填项抢注意力 */
.field label .opt {
  margin-left:6px; font-weight:500; letter-spacing:.5px; color:var(--ink-3); opacity:.9;
  font-size:calc(11px + var(--fs-add-s, 0px));
}
/* 表单里的可选项组（交通方式）：与「类型」的 4 列网格同构，8 项正好两行，视觉语言统一 */
.chip-row.form { display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); gap:8px; }
.chip-row.form .chip { padding:10px 4px; text-align:center; }
/* 筛选弹层里的胶囊组（类型 / 交通方式）：统一换行与间距，比 inline 空白间隙更稳 */
.sheet .chip-row { display:flex; flex-wrap:wrap; gap:8px; }
.sheet .chip-row .chip { padding:8px 13px; }
/* 胶囊按压反馈（全局，含首页类型筛选） */
.chip:active { transform:scale(.94); }

/* 团期编辑器 */
.grp-row {
  background:var(--sand); border:1.5px solid var(--line); border-radius:var(--radius-md);
  padding:12px; margin-bottom:10px; position:relative;
}
.grp-row .grp-head { display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; }
.grp-row .grp-no { font-size:calc(12px + var(--fs-add-s, 0px)); color:var(--ink-3); letter-spacing:1px; }
.grp-row .grp-del { border:none; background:transparent; color:var(--danger); font-size:calc(12px + var(--fs-add-s, 0px)); cursor:pointer; padding:4px; }
.grp-grid { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.grp-grid .mini label { font-size:calc(11px + var(--fs-add-s, 0px)); }
.grp-grid .mini input { padding:9px 10px; font-size:calc(14px + var(--fs-add-m, 0px)); width:100%; box-sizing:border-box; }

/* ---------- 线路详情 ---------- */
.detail-hero {
  position:relative; overflow:hidden;
  margin:-18px -18px 16px; padding:22px 22px 30px;
  color:#F4EFE6;
  background:
    radial-gradient(110% 80% at 90% -5%, rgba(255,154,92,.30) 0%, transparent 55%),
    linear-gradient(160deg, var(--brand-600), var(--brand-800) 60%, var(--brand-900));
}
.detail-hero .dh-tags { display:flex; gap:8px; align-items:center; }
.detail-hero .dh-name { font-size:calc(21px + var(--fs-add-l, 0px)); font-weight:800; line-height:1.35; margin-top:12px; letter-spacing:.5px; }
.detail-hero .dh-price { margin-top:14px; display:flex; align-items:baseline; gap:6px; }
.detail-hero .dh-price .cur { font-size:calc(12.5px + var(--fs-add-m, 0px)); opacity:.8; }
.detail-hero .dh-price .amt { font-size:calc(28px + var(--fs-add-l, 0px)); font-weight:800; color:var(--sun); font-variant-numeric:tabular-nums; }
.detail-hero .dh-price .from { font-size:calc(12.5px + var(--fs-add-m, 0px)); opacity:.75; }
.detail-hero .dh-badge { font-size:calc(11px + var(--fs-add-s, 0px)); padding:5px 10px; border-radius:999px;
  background:rgba(255,255,255,.16); border:1px solid rgba(255,255,255,.25); letter-spacing:1px; }

.dh-grid {
  display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:10px; margin-top:16px;
}
/* 有交通信息时扩成三格（选填，ADR-0007）；窄屏（≤359px）回落两格并把交通整行铺开 */
.dh-grid.has-3 { grid-template-columns:repeat(3, minmax(0,1fr)); }
.dh-cell {
  background:rgba(255,255,255,.09); border:1px solid rgba(255,255,255,.16);
  border-radius:var(--radius-md); padding:11px 13px; backdrop-filter:blur(6px);
  animation:cellIn .5s var(--ease-out) both;
}
.dh-grid .dh-cell:nth-child(2) { animation-delay:.05s; }
.dh-grid .dh-cell:nth-child(3) { animation-delay:.1s; }
@keyframes cellIn { from { opacity:0; transform:translateY(10px); } to { opacity:1; transform:none; } }
.dh-cell .k { font-size:calc(10.5px + var(--fs-add-s, 0px)); opacity:.72; letter-spacing:1.5px; }
.dh-cell .v { font-size:calc(14.5px + var(--fs-add-m, 0px)); font-weight:700; margin-top:3px; }
.dh-cell-transport .v { display:flex; align-items:center; gap:5px; flex-wrap:wrap; }
.dh-cell-transport .v svg { width:15px; height:15px; flex:none; opacity:.9; }
.dh-cell-transport .v { display:flex; align-items:center; gap:6px; }
@media (max-width:359px) {
  .dh-grid.has-3 { grid-template-columns:repeat(2, minmax(0,1fr)); }
  .dh-grid.has-3 .dh-cell-transport { grid-column:1 / -1; }
}

.section { background:var(--surface); border-radius:var(--radius-lg); box-shadow:var(--shadow-sm);
  padding:18px; margin-bottom:14px; }
.section h4 { font-size:calc(15px + var(--fs-add-m, 0px)); font-weight:700; letter-spacing:1px; display:flex; align-items:center; gap:8px; }
.section h4::before { content:""; width:4px; height:15px; border-radius:3px;
  background:linear-gradient(180deg, var(--accent-400), var(--accent-600)); }
.section .body { margin-top:12px; font-size:calc(14px + var(--fs-add-m, 0px)); color:var(--ink-2); line-height:1.75; white-space:pre-wrap; word-break:break-word; }
.section .body:empty::after { content:"暂无内容"; color:var(--ink-3); }
/* 卡片列表容器：必须关掉父级继承来的 pre-wrap。
   否则模板里的换行/缩进会在 flex 容器里变成"真实空白项"，把卡片撑高、把按钮挤走
   （这是详情页团期卡片留大片空白、文档卡片错位的根因）。 */
.section .body.cards { white-space:normal; line-height:1.5; }

/* 团期卡片 */
.grp-card {
  background:var(--surface); border:1.5px solid var(--line); border-radius:var(--radius-md);
  padding:12px 14px; margin-top:10px;
  transition:border-color .2s, transform .2s var(--ease-out);
}
.grp-card:active { transform:scale(.985); }
.grp-top { display:flex; align-items:center; gap:12px; }
.grp-date { flex:none; text-align:center; padding:8px 12px; border-radius:var(--radius-sm);
  background:linear-gradient(160deg, var(--brand-600), var(--brand-800)); color:#F4EFE6;
  min-width:56px; white-space:nowrap; }
.grp-date .d { font-size:calc(16px + var(--fs-add-m, 0px)); font-weight:800; line-height:1.2; white-space:nowrap; }
.grp-date .m { font-size:calc(10px + var(--fs-add-s, 0px)); opacity:.8; letter-spacing:1px; white-space:nowrap; }
.grp-info { flex:1; min-width:0; }
.grp-info .arr { display:flex; align-items:center; gap:6px; font-size:calc(13px + var(--fs-add-m, 0px)); font-weight:600; color:var(--ink);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.grp-info .arr svg { width:13px; height:13px; color:var(--ink-3); flex:none; }
/* 团期里的车次/航班号（团期级字段，ADR-0007 修订）：同一线路不同出发日期可不同 */
.grp-transport {
  display:flex; align-items:center; gap:5px; margin-top:5px; min-width:0;
  font-size:calc(12px + var(--fs-add-s, 0px)); color:var(--ink-3);
}
.grp-transport svg { width:13px; height:13px; opacity:.7; flex:none; }
.grp-transport span { flex:none; }
.grp-transport b { color:var(--ink-2); font-weight:700; font-variant-numeric:tabular-nums; letter-spacing:.3px;
  min-width:0; max-width:16ch; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.grp-foot { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-top:6px; }
.grp-no { font-size:calc(11.5px + var(--fs-add-s, 0px)); color:var(--ink-3);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.grp-price { flex:none; display:flex; flex-direction:column; align-items:flex-end; gap:2px;
  font-size:calc(13px + var(--fs-add-m, 0px)); font-weight:800; color:var(--accent-600); font-variant-numeric:tabular-nums; }
.grp-price .ap { font-size:calc(14px + var(--fs-add-m, 0px)); color:var(--accent-600); white-space:nowrap; }
.grp-price .cp { font-size:calc(12px + var(--fs-add-s, 0px)); color:var(--ink-2); font-weight:700; white-space:nowrap; }
.grp-price .free { font-size:calc(11px + var(--fs-add-s, 0px)); color:var(--ink-3); font-weight:500; white-space:nowrap; }

/* 文档卡片 */
.doc-card {
  display:flex; align-items:center; gap:12px;
  border:1.5px solid var(--line); border-radius:var(--radius-md);
  padding:12px 14px; margin-top:10px; background:var(--surface);
}
.doc-ico {
  flex:none; width:40px; height:40px; border-radius:12px;
  display:flex; align-items:center; justify-content:center; font-size:calc(10px + var(--fs-add-s, 0px)); font-weight:800; letter-spacing:.5px;
}
.doc-ico.pdf { background:rgba(214,69,69,.10); color:var(--danger); }
.doc-ico.word { background:rgba(30,105,222,.10); color:#1E69DE; }
.doc-info { flex:1; min-width:0; }
.doc-info .n { font-size:calc(14px + var(--fs-add-m, 0px)); font-weight:600; color:var(--ink);
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; word-break:break-all; }
.doc-info .m { font-size:calc(11.5px + var(--fs-add-s, 0px)); color:var(--ink-3); margin-top:2px; }
.doc-actions { display:flex; gap:6px; }
.doc-actions .btn { padding:8px 11px; font-size:calc(12.5px + var(--fs-add-m, 0px)); border-radius:var(--radius-sm); }

/* ---------- 管理端 ---------- */
.admin-login {
  min-height:100dvh; display:flex; flex-direction:column; justify-content:center;
  padding:30px 26px; position:relative; overflow:hidden;
}
.admin-login::before {
  content:""; position:absolute; inset:0;
  background:
    radial-gradient(120% 80% at 90% -5%, rgba(255,154,92,.30) 0%, transparent 55%),
    linear-gradient(160deg, var(--brand-600), var(--brand-800) 62%, var(--brand-900));
}
.admin-login .box { position:relative; z-index:1; }
.admin-login .brand-login { color:#F4EFE6; text-align:center; margin-bottom:30px; }
.admin-login .brand-login .mark { width:58px; height:58px; margin:0 auto 14px; border-radius:18px;
  background:linear-gradient(135deg, var(--sun), var(--accent-500));
  display:flex; align-items:center; justify-content:center; font-size:calc(28px + var(--fs-add-l, 0px)); font-weight:800; color:var(--brand-900);
  box-shadow:0 12px 28px rgba(255,154,92,.35); }
.admin-login .brand-login h1 { font-size:calc(22px + var(--fs-add-l, 0px)); font-weight:800; letter-spacing:2px; }
.admin-login .brand-login p { font-size:calc(12.5px + var(--fs-add-m, 0px)); opacity:.75; margin-top:6px; letter-spacing:2px; }
.login-card {
  background:var(--surface); border-radius:var(--radius-lg); padding:24px 22px;
  box-shadow:var(--shadow-lg);
}
.login-card .field input { background:#fff; }

.stat-grid { display:grid; grid-template-columns:repeat(2,1fr); gap:10px; margin-bottom:16px; }
.stat-card { background:var(--surface); border-radius:var(--radius-md); box-shadow:var(--shadow-sm);
  padding:14px 16px; }
.stat-card .n { font-size:calc(24px + var(--fs-add-l, 0px)); font-weight:800; color:var(--brand-700); font-variant-numeric:tabular-nums; }
.stat-card .l { font-size:calc(11.5px + var(--fs-add-s, 0px)); color:var(--ink-3); letter-spacing:1px; margin-top:2px; }

.admin-ops { display:flex; gap:10px; margin-bottom:16px; }
.admin-ops .btn { flex:1; }

.admin-line {
  background:var(--surface); border-radius:var(--radius-lg); box-shadow:var(--shadow-sm);
  padding:15px 16px; margin-bottom:12px;
}
.admin-line .t { display:flex; justify-content:space-between; gap:10px; }
.admin-line .n { font-size:calc(15px + var(--fs-add-m, 0px)); font-weight:700; line-height:1.4; }
.admin-line .meta { font-size:calc(12px + var(--fs-add-s, 0px)); color:var(--ink-3); margin-top:6px; display:flex; flex-wrap:wrap; gap:4px 12px; }
.admin-line .ops { display:flex; gap:8px; margin-top:12px; }
.admin-line .ops .btn { flex:1; }

/* 管理端线路筛选 */
.admin-filter {
  background:var(--surface); border-radius:var(--radius-lg); box-shadow:var(--shadow-sm);
  padding:14px 16px;
}
.admin-filter input[type="search"] {
  width:100%; padding:11px 14px; font-size:calc(14px + var(--fs-add-m, 0px)); border:1.5px solid var(--line);
  border-radius:var(--radius-sm); background:#fff; box-sizing:border-box;
}
.admin-filter .chip-row { display:flex; gap:8px; flex-wrap:wrap; margin-top:10px; }
.admin-filter .chip-row .chip {
  padding:8px 12px; font-size:calc(12.5px + var(--fs-add-m, 0px)); border-radius:999px; cursor:pointer;
  border:1.5px solid var(--line); background:var(--surface); color:var(--ink-2);
}
.admin-filter .chip-row .chip.active {
  background:var(--brand-800); border-color:var(--brand-800); color:#F4EFE6; font-weight:600;
}

/* ---------- 底部导航 ---------- */
.bottom-nav {
  position:fixed; bottom:0; left:50%; transform:translateX(-50%);
  width:100%; max-width:520px; z-index:50;
  display:flex; padding:8px 20px calc(8px + var(--safe-bottom));
  background:rgba(255,255,255,.92); backdrop-filter:blur(18px);
  border-top:1px solid rgba(230,222,209,.8);
}
.nav-item {
  flex:1; border:none; background:transparent; cursor:pointer;
  display:flex; flex-direction:column; align-items:center; gap:3px;
  color:var(--ink-3); font-size:calc(10.5px + var(--fs-add-s, 0px)); letter-spacing:1px;
  padding:4px 0; transition:color .2s; font-family:inherit;
}
.nav-item .nav-ico { width:22px; height:22px; fill:none; stroke:currentColor; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round;
  transition:transform .25s var(--ease-out); }
.nav-item.active { color:var(--brand-700); font-weight:700; }
.nav-item.active .nav-ico { transform:translateY(-1.5px); }

/* ---------- 轻提示 ---------- */
.toast {
  position:fixed; left:50%; bottom:calc(var(--nav-h) + var(--safe-bottom) + 20px);
  transform:translateX(-50%) translateY(20px); z-index:99;
  background:var(--brand-900); color:#F4EFE6; font-size:calc(13.5px + var(--fs-add-m, 0px));
  padding:11px 20px; border-radius:999px; box-shadow:var(--shadow-lg);
  opacity:0; pointer-events:none; transition:all .35s var(--ease-out);
  max-width:82%; text-align:center;
}
.toast.show { opacity:1; transform:translateX(-50%) translateY(0); }

/* ---------- 通用工具 ---------- */
.mt-4 { margin-top:4px; } .mt-8 { margin-top:8px; } .mt-12 { margin-top:12px; } .mt-16 { margin-top:16px; }
.muted { color:var(--ink-3); }

/* ---------- 响应式（桌面居中） ---------- */
@media (min-width:640px) {
  .app { box-shadow:0 0 80px rgba(7,38,35,.14); }
  .bottom-nav { border-radius:18px 18px 0 0; }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration:.01ms !important; transition-duration:.01ms !important; }
}

/* ============================================================
   暗黑模式（body.dark）
   ============================================================ */
body.dark {
  --sand:#0F1614;
  --sand-2:#161F1D;
  --surface:#1C2825;
  --ink:#E7EFEC;
  --ink-2:#A6B8B3;
  --ink-3:#6C7F7A;
  --line:#2E3D3A;
  --shadow-sm:0 1px 2px rgba(0,0,0,.35), 0 4px 14px rgba(0,0,0,.35);
  --shadow-md:0 6px 24px rgba(0,0,0,.4), 0 2px 6px rgba(0,0,0,.3);
  --shadow-lg:0 16px 48px rgba(0,0,0,.5);
  background:var(--sand);
  color:var(--ink);
}
body.dark .app { background:var(--sand); }
body.dark .app-header { background:rgba(15,22,20,.96); }
body.dark .app-header .back-btn { background:rgba(46,61,58,.9); color:#E7EFEC; box-shadow:none; }
body.dark .bar-title { color:var(--ink); }
body.dark .dh-strip-date { color:var(--ink-2); }
body.dark .filterbar { background:rgba(28,40,37,.92); }
body.dark .bottom-nav { background:rgba(15,22,20,.94); border-top-color:rgba(46,61,58,.9); }
body.dark .sheet { background:var(--surface); }
body.dark .sk { background:linear-gradient(90deg,#232F2C 25%,#2A3834 45%,#232F2C 65%);
  background-size:200% 100%; }
body.dark .field input, body.dark .field textarea,
body.dark .login-card .field input,
body.dark .admin-filter input[type="search"] { background:#0F1614; color:var(--ink); }
body.dark .field input:focus, body.dark .field textarea:focus { background:#0F1614; }
body.dark .chip { border-color:var(--line); color:var(--ink-2); }
body.dark .grp-row { background:var(--sand-2); }
body.dark .doc-card, body.dark .admin-line, body.dark .stat-card, body.dark .admin-filter,
body.dark .section, body.dark .line-card, body.dark .grp-card, body.dark .skeleton { background:var(--surface); }
body.dark .toast { background:#2A3A37; color:#E7EFEC; }
body.dark .btn-ghost { border-color:var(--line); color:var(--ink-2); }
body.dark .hero-op { background:rgba(255,255,255,.12); }
/* 深色下的信息型青绿徽章：提亮到可读对比度（浅色主题的 #13796B 在深底上偏暗） */
body.dark .badge.doc { color:#5FD0BB; background:rgba(95,208,187,.14); }
body.dark .type-tag { color:var(--ink-2); }
body.dark .type-tag.短线游 { background:rgba(139,154,148,.16); }

/* ============================================================
   桌面端适配（≥1024px 宽屏；纯增量，不改变手机端布局）
   设计目标：宽屏信息密度提升，保留品牌视觉语言
   ============================================================ */
@media (min-width:1024px) {
  body { background:var(--sand-2); }
  .app {
    max-width:1280px;
    box-shadow:0 0 90px rgba(7,38,35,.16);
    border-left:1px solid rgba(230,222,209,.55);
    border-right:1px solid rgba(230,222,209,.55);
  }
  body.back-on .app-header,
  body.edit-on .app-header { max-width:1280px; }

  /* ---- 首页 hero ---- */
  .hero { padding:60px 48px 44px; }
  .hero-top { margin-bottom:32px; }
  .hero-title { font-size:calc(40px + var(--fs-add-l, 0px)); }
  .hero-desc { max-width:620px; font-size:calc(15px + var(--fs-add-m, 0px)); }
  .hero-ops { gap:14px; }
  .hero-op { padding:12px 22px; font-size:calc(14px + var(--fs-add-m, 0px)); }

  /* ---- 首页筛选条 ---- */
  .filterbar { padding:16px 48px; gap:14px; }
  .fb-type { flex:none; }
  .chip { padding:9px 18px; font-size:calc(13px + var(--fs-add-s, 0px)); }

  /* ---- 首页线路卡片网格 ---- */
  .view { padding-left:48px; padding-right:48px; }
  #listArea {
    display:grid;
    grid-template-columns:repeat(3, minmax(0,1fr));
    gap:20px;
  }
  #listArea .skeleton { margin:0; }
  .line-card { margin:0; }
  .empty { padding:90px 30px; }
  .skeleton { margin-bottom:0; }

  /* ---- 详情页：两栏（左 行程/简介/须知，右 团期/文档） ---- */
  body.back-on .view.detail-view {
    display:grid;
    grid-template-columns:minmax(0,1fr) 400px;
    gap:20px 24px;
    align-items:start;
  }
  .detail-hero { grid-column:1 / -1; }
  .detail-main { grid-column:1; grid-row:2; display:flex; flex-direction:column; gap:16px; }
  .detail-main .section { margin:0; }
  .detail-aside { grid-column:2; }
  .detail-aside + .detail-aside { margin-top:16px; }

  /* ---- 详情页 hero 内部加大 ---- */
  .detail-hero { padding:34px 40px; }
  .detail-hero .dh-name { font-size:calc(30px + var(--fs-add-l, 0px)); }
  .detail-hero .dh-price .amt { font-size:calc(40px + var(--fs-add-l, 0px)); }
  .detail-hero .dh-grid { max-width:480px; }

  /* ---- 管理端 ---- */
  .admin-login { min-height:calc(100dvh - 140px); }
  .admin-login .box { width:100%; max-width:430px; margin:0 auto; padding-top:9vh; }
  .stat-grid { grid-template-columns:repeat(4, 1fr); gap:14px; }
  .admin-ops { gap:12px; }
  .admin-ops .btn { flex:none; padding:12px 26px; }
  .admin-filter { display:flex; align-items:center; gap:12px; flex-wrap:wrap; }
  .admin-filter input[type="search"] { flex:1; min-width:240px; margin:0; }
  .admin-filter .chip-row { margin:0; }
  .admin-filter .btn { width:auto; margin:0; padding:12px 26px; }
  #adminLines { display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:14px; }
  #adminLines .admin-line { margin:0; }

  /* ---- 编辑页 ---- */
  body.edit-on .view { max-width:960px; margin:0 auto; }
  .grp-grid { grid-template-columns:1fr 1fr 1fr; }
  .radio-caps { grid-template-columns:repeat(4, 1fr); }

  /* ---- 底部弹层：桌面居中 modal ---- */
  .sheet-mask { align-items:center; justify-content:center; padding:24px; }
  .sheet {
    position:relative; bottom:auto; left:auto; right:auto; width:100%; max-width:460px;
    max-height:82dvh; border-radius:22px; transform:none; margin:0;
  }
  .sheet-mask.open .sheet { transform:translateY(0); }
  .sheet-grab { display:none; }

  /* ---- 底部导航：桌面居中窄条 ---- */
  .bottom-nav {
    width:auto; max-width:none; left:50%; bottom:20px; transform:translateX(-50%);
    border-radius:20px; border:1px solid rgba(230,222,209,.8);
    box-shadow:var(--shadow-md); padding:8px 10px calc(8px + var(--safe-bottom));
  }
  .nav-item { padding:6px 22px; flex-direction:row; gap:8px; font-size:calc(12px + var(--fs-add-s, 0px)); }

  /* ---- 轻提示 ---- */
  .toast { bottom:30px; }
}

