/* ==========================================================================
   chxlive · Design tokens + shared UI
   ========================================================================== */

/* 视觉隐藏但保留给屏幕阅读器与搜索引擎（用于无可见标题处补 h1）。 */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ============ COLOR TOKENS ============
   Light is the default; dark is opt-in via html[data-theme="dark"].
   Brand orange + state colors stay stable across themes; surfaces and text invert.
   "Invert" tokens are the *opposite-contrast* surface (dark hero on a light page,
   light strip on a dark page) — they auto-swap when the theme flips. */
:root {
  --bg:                #fafaf7;
  --bg-elev:           #ffffff;
  --bg-inset:          #f4f3ee;
  --bg-invert:         #0e0d0b;
  --bg-invert-elev:    #151619;

  --fg:                #15171c;
  --fg-strong:         #0e0d0b;
  --fg-muted:          #54514a;
  --fg-faint:          #78746a;
  --fg-dim:            #a8a49a;
  --fg-on-invert:      #eef0f2;
  --fg-on-invert-muted:#a8a49a;
  --fg-on-invert-faint:#78746a;

  --line-faint:        #f4f3ee;
  --line:              #e8e6df;
  --line-strong:       #d4d1c7;
  --line-on-invert-faint: #1f2125;
  --line-on-invert:    #23262c;
  --line-on-invert-strong:#2a2d33;

  --accent:            #ff6a1a;
  --accent-hover:      #e65c13;
  --accent-fg:         #ffffff;
  --accent-soft-bg:    #fff4ec;
  --accent-soft-fg:    #c2410c;
  --accent-tint-12:    rgba(255,106,26,0.12);
  --accent-tint-25:    rgba(255,106,26,0.25);

  --success:           #10b981;
  --success-dark:      #047857;
  --success-soft-bg:   #ecfdf5;
  --success-tint:      rgba(16,185,129,0.14);

  --warn:              #f5b042;
  --warn-dark:         #b78600;
  --warn-soft-bg:      #fffbe6;
  --warn-tint:         rgba(245,176,66,0.14);

  --danger:            #e11d48;
  --danger-dark:       #9f1239;
  --danger-soft-bg:    #fef2f2;
  --danger-tint:       rgba(225,29,72,0.14);

  --info:              #4c63d6;
  --info-dark:         #2f3f9b;
  --info-tint:         rgba(76,99,214,0.12);

  --shadow-card:       0 12px 32px rgba(15,17,28,0.12);
  --shadow-dropdown:   0 12px 24px rgba(0,0,0,0.4);
}

html[data-theme="dark"] {
  --bg:                #0b0c0e;
  --bg-elev:           #151619;
  --bg-inset:          #0e1013;
  --bg-invert:         #fafaf7;
  --bg-invert-elev:    #ffffff;

  --fg:                #eef0f2;
  --fg-strong:         #ffffff;
  --fg-muted:          #a8a49a;
  --fg-faint:          #78746a;
  --fg-dim:            #5e636d;
  --fg-on-invert:      #15171c;
  --fg-on-invert-muted:#54514a;
  --fg-on-invert-faint:#78746a;

  --line-faint:        #1f2125;
  --line:              #23262c;
  --line-strong:       #2a2d33;
  --line-on-invert-faint: #f4f3ee;
  --line-on-invert:    #e8e6df;
  --line-on-invert-strong:#d4d1c7;

  --accent-soft-bg:    rgba(255,106,26,0.12);
  --accent-soft-fg:    #ff6a1a;

  --success-soft-bg:   rgba(16,185,129,0.12);
  --warn-soft-bg:      rgba(245,176,66,0.12);
  --danger-soft-bg:    rgba(225,29,72,0.12);

  --shadow-card:       0 12px 32px rgba(0,0,0,0.45);
}

/* ============ Always-dark hero/island scope overrides ============
   这些区块在所有主题下都保持深色调色板,把 token 局部钉死避免被主题翻转。
   放在 globals.css 而不是 page 级 css,确保跨路由 client-nav 时立即生效,
   不会因为 page CSS chunk 延迟加载而出现深色 hero 上看不见亮字的瞬间。 */
.hero,
footer,
.rocket-hero,
.launch-hero,
.search-hero,
.cal-focus-card {
  --bg:                #0b0c0e;
  --bg-elev:           #151619;
  --bg-inset:          #0e1013;
  --fg:                #eef0f2;
  --fg-strong:         #fafaf7;
  --fg-muted:          #54514a;
  --fg-faint:          #78746a;
  --fg-dim:            #a8a49a;
  --line:              #23262c;
  --line-strong:       #2a2d33;
  --line-faint:        #1f2125;
}

/* ============ Shared Launch Result ============ */
.launch-result {
  display:inline-flex;
  align-items:center;
  gap:5px;
  font-family:var(--font-mono);
  font-size:12px;
  font-weight:600;
  letter-spacing:0.04em;
  white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
.launch-result::before {
  content:'●';
  font-size:0.9em;
  line-height:1;
}
.launch-result.lr-ok,
.launch-result.lr-success,
.launch-result.lr-go { color:var(--success); }
.launch-result.lr-fail,
.launch-result.lr-abort { color:var(--danger); }
.launch-result.lr-partial,
.launch-result.lr-tbc,
.launch-result.lr-hold { color:var(--warn); }
.launch-result.lr-next,
.launch-result.lr-tbd,
.launch-result.lr-cd,
.launch-result.lr-soon { color:var(--accent); }
.launch-result.lr-sched,
.launch-result.lr-unknown { color:var(--fg-faint); }
.launch-result.lr-live { color:var(--danger); }
.launch-result.lr-live::before { animation:pulse 1.2s infinite; }

/* ============ TYPOGRAPHY TOKENS ============ */
/* Windows 的 Segoe UI Emoji 不含国旗 glyph，会渲染成 "US" "CN" 等字母对。
   引入 Twemoji 国旗 polyfill webfont，靠 unicode-range 仅在国旗 codepoint 落到此字体时按需加载。 */
@font-face {
  font-family: "Twemoji Country Flags";
  unicode-range: U+1F1E6-1F1FF, U+1F3F4, U+E0062-E0063, U+E0065, U+E0067, U+E006C, U+E006E, U+E0073-E0074, U+E0077, U+E007F;
  src: url("https://cdn.jsdelivr.net/npm/country-flag-emoji-polyfill@0.1/dist/TwemojiCountryFlags.woff2") format("woff2");
  font-display: swap;
}

:root {
  --font-sans: "Twemoji Country Flags", "Space Grotesk", "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, sans-serif;
  --font-zh:   "Twemoji Country Flags", "Noto Sans SC", -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif;
  --font-mono: "Twemoji Country Flags", "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;
  --font-display: "Twemoji Country Flags", "Space Grotesk", "Noto Sans SC", sans-serif;

  --fs-xs:   12px;
  --fs-sm:   13px;
  --fs-base: 17.5px;
  --fs-md:   18px;
  --fs-lg:   19px;
  --fs-xl:   22px;
  --fs-2xl:  28px;
  --fs-3xl:  36px;
  --fs-4xl:  48px;
  --fs-5xl:  64px;
  --fs-6xl:  88px;
  --fs-hero: 120px;

  --lh-tight:   1.1;
  --lh-snug:    1.25;
  --lh-normal:  1.5;
  --lh-relaxed: 1.7;

  --fw-light:    300;
  --fw-regular:  400;
  --fw-medium:   500;
  --fw-semibold: 600;
  --fw-bold:     700;
  --fw-black:    900;

  --ls-tight:  -0.02em;
  --ls-normal: 0;
  --ls-wide:   0.02em;
  --ls-wider:  0.08em;
}

.theme-daybreak { --font-body: var(--font-sans); --font-headline: var(--font-display); }
.theme-console  { --font-body: var(--font-sans); --font-headline: var(--font-mono); }
.theme-stream   { --font-body: var(--font-sans); --font-headline: var(--font-sans); }

.t-hero      { font-family: var(--font-headline); font-size: var(--fs-hero); font-weight: 700; line-height: var(--lh-tight); letter-spacing: var(--ls-tight); }
.t-display   { font-family: var(--font-headline); font-size: var(--fs-5xl);  font-weight: 700; line-height: var(--lh-tight); letter-spacing: var(--ls-tight); }
.t-h1        { font-family: var(--font-headline); font-size: var(--fs-4xl);  font-weight: 700; line-height: var(--lh-tight); letter-spacing: var(--ls-tight); }
.t-h2        { font-family: var(--font-headline); font-size: var(--fs-3xl);  font-weight: 600; line-height: var(--lh-snug); }
.t-h3        { font-family: var(--font-headline); font-size: var(--fs-2xl);  font-weight: 600; line-height: var(--lh-snug); }
.t-h4        { font-family: var(--font-headline); font-size: var(--fs-xl);   font-weight: 600; line-height: var(--lh-snug); }
.t-body      { font-family: var(--font-body); font-size: var(--fs-base); font-weight: 400; line-height: var(--lh-normal); }
.t-body-lg   { font-family: var(--font-body); font-size: var(--fs-lg);   font-weight: 400; line-height: var(--lh-relaxed); }
.t-caption   { font-family: var(--font-body); font-size: var(--fs-sm);   font-weight: 400; line-height: var(--lh-normal); color: var(--fg-muted); }
.t-micro     { font-family: var(--font-body); font-size: var(--fs-xs);   font-weight: 500; line-height: var(--lh-normal); letter-spacing: var(--ls-wider); text-transform: uppercase; color: var(--fg-muted); }
.t-mono      { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
.t-countdown { font-family: var(--font-mono); font-size: var(--fs-6xl); font-weight: 700; letter-spacing: var(--ls-tight); font-variant-numeric: tabular-nums; line-height: 1; }

/* ============ SPACING / RADIUS / SHADOW / Z / EASE / GRID ============ */
:root {
  --s-0:   0;
  --s-1:   4px;
  --s-2:   8px;
  --s-3:   12px;
  --s-4:   16px;
  --s-5:   20px;
  --s-6:   24px;
  --s-8:   32px;
  --s-10:  40px;
  --s-12:  48px;
  --s-16:  64px;
  --s-20:  80px;
  --s-24:  96px;
  --s-32:  128px;

  --r-none: 0;
  --r-xs:   3px;
  --r-sm:   6px;
  --r-md:   10px;
  --r-lg:   14px;
  --r-xl:   20px;
  --r-2xl:  28px;
  --r-pill: 9999px;

  --shadow-1: 0 1px 2px rgba(14, 13, 11, 0.04), 0 1px 1px rgba(14, 13, 11, 0.03);
  --shadow-2: 0 2px 6px rgba(14, 13, 11, 0.06), 0 1px 2px rgba(14, 13, 11, 0.04);
  --shadow-3: 0 8px 24px rgba(14, 13, 11, 0.08), 0 2px 6px rgba(14, 13, 11, 0.05);
  --shadow-4: 0 24px 64px rgba(14, 13, 11, 0.12), 0 8px 16px rgba(14, 13, 11, 0.06);

  --z-base:    0;
  --z-sticky:  10;
  --z-drawer:  20;
  --z-modal:   30;
  --z-toast:   40;
  --z-tooltip: 50;

  --ease-out:    cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in:     cubic-bezier(0.7, 0, 0.84, 0);
  --ease-in-out: cubic-bezier(0.87, 0, 0.13, 1);
  --dur-fast: 120ms;
  --dur-base: 200ms;
  --dur-slow: 400ms;

  --container-max: 1280px;
  --container-pad: var(--s-6);
  --grid-gap: var(--s-6);
}

.theme-console { --r-md: 6px;  --r-lg: 8px;  --r-xl: 12px; }
.theme-stream  { --r-md: 14px; --r-lg: 20px; --r-xl: 28px; }

/* ============ RESET ============ */
* { box-sizing: border-box; }
html, body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--fg);
  font-family: var(--font-body);
  font-size: var(--fs-base);
  line-height: var(--lh-normal);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; border: none; background: none; color: inherit; }

/* ============ SHARED · body + topbar ============ */
body { background:var(--bg); color:var(--fg); font-family:var(--font-sans); }

.topbar { display:flex;align-items:center;gap:24px;padding:14px 32px;background:var(--bg-elev);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:50; }
.brand { display:flex;align-items:center;gap:10px;font-family:var(--font-display);font-weight:700;font-size:17px;letter-spacing:-0.01em;color:var(--fg-strong); }
.brand svg { flex-shrink:0; }
.brand .en { color:var(--fg-strong);font-weight:700; }
.brand .dot { color:var(--accent);margin:0 1px; }
.brand .li  { color:var(--fg-faint);font-weight:400; }
.nav { display:flex;gap:2px;flex:1;margin-left:24px; }
.nav a { padding:8px 14px;border-radius:8px;font-size:14px;color:var(--fg-muted);font-weight:500;transition:background 150ms;white-space:nowrap;display:inline-flex;align-items:center;gap:6px; }
.nav a:hover { background:var(--accent-tint-12); }
.nav a.active { background:var(--accent-soft-bg);color:var(--accent); }
.nav-live-badge { --nav-live-glow:rgba(255,106,26,0.18);--nav-live-pulse:rgba(255,106,26,0.38);position:relative;display:inline-flex;align-items:center;gap:4px;height:16px;padding:0 6px;border-radius:999px;background:var(--accent-soft-bg);color:var(--accent-soft-fg);font-family:var(--font-mono);font-size:9px;font-weight:800;letter-spacing:0.08em;line-height:1;animation:navLiveBreath 2.6s ease-in-out infinite; }
.nav-live-badge::before { content:'';width:5px;height:5px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 0 var(--nav-live-pulse);animation:navLiveDot 1.5s ease-out infinite; }
.nav a.active .nav-live-badge { --nav-live-glow:rgba(255,106,26,0.28);--nav-live-pulse:rgba(255,255,255,0.42);background:var(--accent);color:var(--accent-fg); }
.nav a.active .nav-live-badge::before { background:var(--accent-fg); }
@keyframes navLiveBreath {
  0%, 100% { box-shadow:0 0 0 rgba(255,106,26,0); }
  50% { box-shadow:0 0 12px var(--nav-live-glow); }
}
@keyframes navLiveDot {
  0% { transform:scale(1);box-shadow:0 0 0 0 var(--nav-live-pulse); }
  70% { transform:scale(0.82);box-shadow:0 0 0 5px rgba(255,106,26,0); }
  100% { transform:scale(1);box-shadow:0 0 0 0 rgba(255,106,26,0); }
}
@media (prefers-reduced-motion: reduce) {
  .nav-live-badge,
  .nav-live-badge::before {
    animation:none;
  }
}
/* 顶栏主题切换按钮 */
.theme-toggle { width:34px;height:34px;border-radius:8px;border:1px solid var(--line);background:var(--bg-inset);color:var(--fg-muted);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;transition:color 120ms,border-color 120ms,background 120ms; }
.theme-toggle:hover { color:var(--accent);border-color:var(--accent); }
.theme-toggle svg { width:16px;height:16px; }
.theme-toggle .icon-auto,
.theme-toggle .icon-light,
.theme-toggle .icon-dark { display:none; }
html[data-theme-pref="auto"]  .theme-toggle .icon-auto  { display:block; }
html[data-theme-pref="light"] .theme-toggle .icon-light { display:block; }
html[data-theme-pref="dark"]  .theme-toggle .icon-dark  { display:block; }

/* 顶栏内联搜索框 */
.topbar-search-inline { position:relative;flex:0 1 320px;max-width:320px;min-width:180px; }
/* 手机版顶栏搜索图标(点进 /search);桌面隐藏,仅 ≤640 显示 */
.topbar-search-m { display:none;width:34px;height:34px;border-radius:8px;border:1px solid var(--line);background:var(--bg-inset);color:var(--fg-muted);align-items:center;justify-content:center;flex-shrink:0;transition:color 120ms,border-color 120ms; }
.topbar-search-m:hover { color:var(--accent);border-color:var(--accent); }
.tsi-form { display:flex;align-items:center;gap:8px;background:var(--bg-inset);border:1px solid transparent;border-radius:8px;padding:6px 10px;transition:border-color 150ms,background 150ms; }
.tsi-form:focus-within { background:var(--bg-elev);border-color:var(--accent); }
.tsi-glass { color:var(--fg-faint);flex-shrink:0; }
.tsi-form:focus-within .tsi-glass { color:var(--fg-strong); }
.tsi-form input { flex:1;background:transparent;border:none;outline:none;font-family:var(--font-sans);font-size:13px;color:var(--fg);min-width:0; }
.tsi-form input::placeholder { color:var(--fg-faint); }
.tsi-kbd { font-family:var(--font-mono);font-size:10px;color:var(--fg-faint);background:var(--bg-elev);border:1px solid var(--line);padding:1px 5px;border-radius:4px;letter-spacing:0.04em;flex-shrink:0; }
.tsi-form:focus-within .tsi-kbd { display:none; }

.tsi-dropdown { position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--bg-elev);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow-card);max-height:70vh;overflow-y:auto;z-index:60; }
.tsi-state { padding:18px 16px;font-size:13px;color:var(--fg-muted);text-align:center; }
.tsi-state b { color:var(--fg); }
.tsi-state-loading { display:flex;align-items:center;justify-content:center;gap:8px;color:var(--fg-faint); }
.spinner { display:inline-block;width:13px;height:13px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin 0.7s linear infinite;vertical-align:middle;flex-shrink:0; }
@keyframes spin { to { transform:rotate(360deg); } }
.tsi-form .spinner { margin-right:6px;color:var(--fg-dim); }
.tsi-section { padding:6px 0; }
.tsi-section + .tsi-section { border-top:1px solid var(--line-faint); }
.tsi-section-head { padding:6px 14px;font-family:var(--font-mono);font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:var(--fg-faint);display:flex;justify-content:space-between;align-items:center; }
.tsi-section-ct { color:var(--accent);font-weight:600; }
.tsi-row { display:flex;align-items:center;gap:10px;padding:8px 14px;text-decoration:none;color:var(--fg);font-size:13px;line-height:1.4;border-left:2px solid transparent; }
.tsi-row:hover { background:var(--accent-soft-bg);border-left-color:var(--accent); }
.tsi-row-title { flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500; }
.tsi-row-meta { font-family:var(--font-mono);font-size:10px;color:var(--fg-faint);flex-shrink:0;letter-spacing:0.02em; }
.tsi-av { width:24px;height:24px;border-radius:5px;background:linear-gradient(135deg,var(--bg-invert),var(--bg-invert-elev));color:var(--accent);display:inline-flex;align-items:center;justify-content:center;font-family:var(--font-display);font-size:10px;font-weight:700;flex-shrink:0;overflow:hidden; }
.tsi-av img { width:100%;height:100%;object-fit:cover; }
.tsi-footer { display:block;padding:10px 14px;border-top:1px solid var(--line);background:var(--bg);font-size:12.5px;color:var(--fg-muted);text-decoration:none;text-align:center;transition:background 150ms,color 150ms; }
.tsi-footer:hover { background:var(--accent-soft-bg);color:var(--accent); }
.tsi-footer b { color:var(--accent);font-family:var(--font-mono);font-weight:600; }

@media (max-width: 880px) {
  .topbar-search-inline { flex:1 1 auto;min-width:0;max-width:none; }
  .tsi-kbd { display:none; }
}

/* 手机:顶栏精简为「品牌 + 搜索 + 主题」,导航交给底部 tab 栏(MobileTabBar);
   底部留出空间避免被常驻 tab 栏遮挡(含安全区)。
   注:640px 断点需与 MobileTabBar.css 保持一致(tab 栏出现 ⇔ 桌面导航隐藏)。 */
@media (max-width: 640px) {
  .topbar { gap:10px;padding:12px 16px; }
  .topbar .nav, .topbar .clocks, .topbar-search-inline { display:none; }
  .topbar .brand { flex:1;min-width:0; }
  .topbar-search-m { display:inline-flex; }
  body { padding-bottom:calc(60px + env(safe-area-inset-bottom, 0px)); }

  /* 移动端分页:只留 上一页/下一页 两个大按钮,其余(页码/统计/跳页)全部隐藏 */
  .pager { align-items:stretch;gap:10px;margin-top:24px;padding-top:16px; }
  .pager-info { display:none; }
  .pager-nav { flex:1;justify-content:space-between;gap:10px; }
  .pager-nav a:not(.nav-btn), .pager-nav button:not(.nav-btn), .pager-nav .gap { display:none; }
  .pager-nav .nav-btn { flex:1;height:44px;font-size:14px; }
  .pager-jump { display:none; }

  /* 移动端发射状态 = 实心药丸(首页 .cal-list 与日历 .cal-tl-cards 共用;撤掉全局圆点+字) */
  .cal-list .launch-result, .cal-tl-cards .launch-result { padding:3px 7px;border-radius:6px;font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:0.05em;align-self:center;white-space:nowrap; }
  .cal-list .launch-result::before, .cal-tl-cards .launch-result::before { display:none; }
  .cal-list .launch-result.lr-ok, .cal-list .launch-result.lr-success, .cal-list .launch-result.lr-go,
  .cal-tl-cards .launch-result.lr-ok, .cal-tl-cards .launch-result.lr-success, .cal-tl-cards .launch-result.lr-go { background:var(--success-soft-bg);color:var(--success); }
  .cal-list .launch-result.lr-fail, .cal-list .launch-result.lr-abort,
  .cal-tl-cards .launch-result.lr-fail, .cal-tl-cards .launch-result.lr-abort { background:var(--danger-soft-bg);color:var(--danger); }
  .cal-list .launch-result.lr-partial, .cal-list .launch-result.lr-tbc, .cal-list .launch-result.lr-hold,
  .cal-tl-cards .launch-result.lr-partial, .cal-tl-cards .launch-result.lr-tbc, .cal-tl-cards .launch-result.lr-hold { background:var(--warn-soft-bg);color:var(--warn); }
  .cal-list .launch-result.lr-next, .cal-list .launch-result.lr-tbd, .cal-list .launch-result.lr-cd, .cal-list .launch-result.lr-soon, .cal-list .launch-result.lr-live,
  .cal-tl-cards .launch-result.lr-next, .cal-tl-cards .launch-result.lr-tbd, .cal-tl-cards .launch-result.lr-cd, .cal-tl-cards .launch-result.lr-soon, .cal-tl-cards .launch-result.lr-live { background:var(--accent-soft-bg);color:var(--accent); }
  .cal-list .launch-result.lr-sched, .cal-list .launch-result.lr-unknown,
  .cal-tl-cards .launch-result.lr-sched, .cal-tl-cards .launch-result.lr-unknown { background:var(--bg-inset);color:var(--fg-muted); }
}

/* 双时区时钟 · 无边框 · 辅助信息态 */
.clocks { display:flex;align-items:center;gap:14px;padding-right:2px; }
.clk { display:flex;align-items:baseline;gap:6px;font-family:var(--font-mono);min-width:0; }
.clk .lab { font-size:9.5px;color:var(--fg-dim);letter-spacing:0.12em;font-weight:600;text-transform:uppercase;display:inline-flex;align-items:center;gap:4px;line-height:1; }
.clk .lab::before { content:'';width:5px;height:5px;border-radius:50%;background:var(--success);flex-shrink:0;animation:clkPulse 2s infinite ease-in-out; }
.clk.utc .lab::before { background:var(--info); }
.clk .tm { font-size:13px;font-weight:600;color:var(--fg-strong);letter-spacing:-0.01em;font-variant-numeric:tabular-nums;line-height:1; }
.clk .tm .sec { color:var(--fg-dim);font-weight:400; }
.clk + .clk { padding-left:14px;border-left:1px solid var(--line); }
@keyframes clkPulse { 50% { opacity:0.35; } }


/* ============ SHARED · pager ============ */
.pager { margin-top:32px;padding:20px 0 4px;border-top:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap; }
.pager-info { font-family:var(--font-mono);font-size:11px;color:var(--fg-faint);letter-spacing:0.04em;text-transform:uppercase; }
.pager-info b { color:var(--fg);font-weight:700; }
.pager-nav { display:flex;align-items:center;gap:4px; }
.pager-nav button, .pager-nav a, .pager-nav .nav-btn { min-width:36px;height:36px;padding:0 10px;border:1px solid var(--line);background:var(--bg-elev);border-radius:8px;font-family:var(--font-mono);font-size:13px;color:var(--fg);cursor:pointer;font-weight:600;display:inline-flex;align-items:center;justify-content:center;font-variant-numeric:tabular-nums;text-decoration:none;white-space:nowrap; }
.pager-nav button:hover, .pager-nav a:hover { border-color:var(--accent);color:var(--accent); }
.pager-nav .on { background:var(--accent-soft-bg);color:var(--accent);border-color:var(--accent); }
.pager-nav .on:hover { background:var(--accent-soft-bg);color:var(--accent);border-color:var(--accent); }
.pager-nav .gap { border:none;background:transparent;color:var(--fg-faint);cursor:default;min-width:20px; }
.pager-nav .nav-btn { gap:6px;padding:0 14px; }
.pager-nav .nav-btn[disabled], .pager-nav .nav-btn.disabled { opacity:0.4;cursor:not-allowed;pointer-events:none; }
.pager-jump { display:flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:11px;color:var(--fg-faint);letter-spacing:0.04em;text-transform:uppercase; }
.pager-jump input { width:48px;height:30px;border:1px solid var(--line);border-radius:6px;padding:0 8px;font-family:var(--font-mono);font-size:13px;color:var(--fg);text-align:center;font-variant-numeric:tabular-nums;background:var(--bg-elev); }
.pager-jump input:focus { outline:none;border-color:var(--accent); }

/* ============ SHARED · 气象条 WeatherStrip ============ */
.wx-strip { padding-top:18px;border-top:1px solid var(--line); }
.wx-head { display:flex;justify-content:space-between;align-items:baseline;margin-bottom:12px; }
.wx-label { font-family:var(--font-mono);font-size:10px;letter-spacing:0.12em;text-transform:uppercase;color:var(--accent); }
.wx-src { font-family:var(--font-mono);font-size:10px;color:var(--fg-faint);letter-spacing:0.06em; }
.wx-icons { display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px; }
.wxi { padding:10px 10px;border-radius:8px;background:var(--bg-elev);border:1px solid var(--line);position:relative;overflow:hidden; }
.wxi::before { content:'';position:absolute;left:0;top:0;bottom:0;width:3px; }
.wxi.go::before { background:var(--success); }
.wxi.caution::before { background:var(--warn); }
.wxi.hold::before { background:var(--danger); }
.wxi-k { display:block;font-family:var(--font-mono);font-size:9px;letter-spacing:0.1em;text-transform:uppercase;color:var(--fg-faint);margin-bottom:3px; }
.wxi-v { display:block;font-family:var(--font-mono);font-size:14px;font-weight:700;color:var(--fg);letter-spacing:-0.01em; }
.wx-foot { display:flex;justify-content:space-between;align-items:center;font-size:12px; }
.wx-go { font-family:var(--font-mono);font-size:13px;font-weight:700;color:var(--success);display:inline-flex;align-items:center;gap:8px; }
.wx-go-dot { width:8px;height:8px;border-radius:50%;background:var(--success);box-shadow:0 0 0 4px var(--success-tint); }
.wx-go-src { font-weight:500;color:var(--fg-faint);letter-spacing:0.03em; }
.wx-foot a { color:var(--accent);font-weight:500; }

/* ============ SHARED · 气象卡 WeatherCard（发射详情侧栏）============ */
.wx-card h3 { display:flex;align-items:center;justify-content:space-between;gap:8px; }
.wx-card .wx-go { font-family:var(--font-mono);font-size:11px;font-weight:700;padding:3px 8px;border-radius:4px;letter-spacing:0.04em;background:transparent;color:inherit;display:inline; }
.wx-card .wx-go.ok { color:var(--success);background:var(--success-tint); }
.wx-card .wx-go.warn { color:var(--warn);background:var(--warn-tint); }
.wx-card .wx-go.nogo { color:var(--danger);background:var(--danger-tint); }
.wx-loc { font-family:var(--font-mono);font-size:11px;color:var(--fg-faint);margin:8px 0 14px;letter-spacing:0.02em; }
.wx-grid { display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:14px; }
.wx-tile { background:var(--bg);border:1px solid var(--line);border-radius:8px;padding:10px 10px 8px; }
.wx-k { font-family:var(--font-sans);font-size:11px;color:var(--fg-faint);margin-bottom:4px; }
.wx-v { font-family:var(--font-mono);font-size:16px;font-weight:700;color:var(--fg);font-variant-numeric:tabular-nums;line-height:1.1; }
.wx-v.warn { color:var(--warn); }
.wx-v.bad { color:var(--danger); }
.wx-v.ok { color:var(--success);font-size:14px; }
.wx-u { font-family:var(--font-mono);font-size:10px;color:var(--fg-faint);font-weight:400;margin-left:2px; }
.wx-sub { font-family:var(--font-sans);font-size:10px;color:var(--fg-faint);margin-top:2px; }
.wx-sub.warn { color:var(--warn); }
.wx-sub.bad { color:var(--danger); }

/* ============ SHARED · 概述/详情页交叉链接 ============ */
.ov-links { display:flex;flex-wrap:wrap;gap:10px 20px;margin-top:16px; }
.ov-links a { font-family:var(--font-mono);font-size:13px;color:var(--accent);text-decoration:none;border-bottom:1px solid transparent;transition:border-color 120ms; }
.ov-links a:hover { border-bottom-color:var(--accent); }

/* ============ SHARED · keyframes ============ */
@keyframes pulse { 0%,100%{opacity:1;transform:scale(1);} 50%{opacity:0.3;transform:scale(0.7);} }
