/* Ticker dock — one consolidated floating row: The Launch Pad.
   (build-ticker-dock.py). Spotlight features, realized market sales,
   worldwide launches, and the lounge table discussion interleave in a
   single rotation queue, one slide visible
   at a time with a gentle fade every few seconds. Curated, slow-changing
   content — no continuous marquee, so there is no per-frame cost; the only
   always-on motion is a tiny pulse dot (opacity + transform, compositor-only). */
.ticker-dock {
  position: fixed;
  left: 16px; right: 16px; bottom: 16px;
  z-index: 46;
  max-width: 1200px; margin: 0 auto;
  display: flex; align-items: stretch;
  border: 1px solid var(--line); border-radius: 12px;
  background: rgba(6, 8, 14, .93);
  /* backdrop blur is the priciest effect on the dock; 10px keeps the look
     while costing noticeably less than 14px on scroll. */
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  -webkit-box-shadow: 0 14px 44px rgba(0, 0, 0, .5);
  box-shadow: 0 14px 44px rgba(0, 0, 0, .5);
  font-size: 13px; color: var(--muted);
}
.ticker-dock-rows { flex: 1 1 auto; min-width: 0; padding: 4px 0; }
.ticker-dock-row {
  display: flex; align-items: center; gap: 10px;
  padding: 5px 4px 5px 12px;
}
.ticker-dock-kicker {
  flex: none; font-size: 10px; letter-spacing: .16em; text-transform: uppercase;
  border-radius: 20px; padding: 3px 10px; white-space: nowrap;
  font-family: var(--mono, inherit);
  display: inline-flex; align-items: center;
  color: var(--accent); border: 1px solid rgba(232, 182, 76, .45);
}
/* Attention cue: a small gold dot that breathes. Opacity + transform only —
   the cheapest possible animation (no layout, no paint), paused under
   prefers-reduced-motion and invisible cost otherwise. */
.ticker-dock-kicker .pulse-dot {
  display: inline-block; width: 7px; height: 7px; border-radius: 50%;
  background: var(--accent); margin-right: 8px;
  animation: ticker-dock-pulse 2.6s ease-in-out infinite;
}
@keyframes ticker-dock-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: .35; transform: scale(.75); }
}
.ticker-dock-viewport {
  flex: 1 1 auto; min-width: 0;
  overflow: hidden;
  scrollbar-width: none; /* Firefox */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 20px, #000 calc(100% - 20px), transparent);
  mask-image: linear-gradient(90deg, transparent, #000 20px, #000 calc(100% - 20px), transparent);
}
.ticker-dock-viewport::-webkit-scrollbar { display: none; } /* Chrome/Safari */
/* Feed honesty stamp (2026-10-25): the launch feed's true as-of date, set at
   build time from the cache's own timestamp. Quiet on purpose — present and
   readable, never competing with the slides. Hidden on small screens, where
   the row is compressed. */
.ticker-dock-asof {
  flex: none; font-size: 10px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--quiet); white-space: nowrap;
}
@media (max-width: 760px) { .ticker-dock-asof { display: none; } }
.ticker-dock-track { display: block; white-space: nowrap; }
/* Discrete rotation: exactly one slide visible per row; a short rise-and-fade
   plays on each change — motion toward the eye marks "something new" without
   flashing — and nothing animates between rotations. */
.ticker-dock-slide { display: none; }
.ticker-dock-slide.is-active { display: block; animation: ticker-dock-arrive .55s cubic-bezier(.2,.7,.3,1); }
@keyframes ticker-dock-arrive { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
/* Change cue: on each rotation the kicker dot fires one bright pulse, then
   settles back to its gentle breathing. The class swap briefly replaces the
   infinite pulse, so the flash must end at the pulse's resting state
   (opacity 1, scale 1) for a smooth handoff. */
.ticker-dock-kicker.flash .pulse-dot { animation: ticker-dock-dot-flash .8s ease; }
@keyframes ticker-dock-dot-flash {
  0% { opacity: 1; transform: scale(1.9); }
  55% { opacity: 1; transform: scale(1.1); }
  100% { opacity: 1; transform: scale(1); }
}
.ticker-dock .ticker-item, .ticker-dock .launch-item {
  display: inline-flex; align-items: baseline; gap: 7px;
  padding: 2px 4px; color: var(--muted); text-decoration: none; border-radius: 4px;
}
.ticker-dock .ticker-item:hover, .ticker-dock .launch-item:hover,
.ticker-dock .ticker-item:focus-visible, .ticker-dock .launch-item:focus-visible { color: var(--ink); }
.ticker-dock .ticker-item strong, .ticker-dock .launch-item strong {
  color: var(--ink); font-weight: 600; font-variant-numeric: tabular-nums;
}
.ticker-dock .t-price { color: var(--accent-soft); font-weight: 600; font-variant-numeric: tabular-nums; }
.ticker-dock .t-venue, .ticker-dock .l-site { color: var(--quiet); font-size: 12px; }
.ticker-dock .t-kind, .ticker-dock .l-kind, .ticker-dock .s-kind {
  font-size: 10px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--quiet); border: 1px solid var(--line); border-radius: 10px; padding: 1px 7px;
  white-space: nowrap;
}
.ticker-dock .ticker-item.is-launch .t-price { color: var(--accent); }
.ticker-dock .l-date { color: #9db8e8; font-weight: 600; font-variant-numeric: tabular-nums; }

/* Collapse toggle */
.ticker-dock-toggle {
  flex: none; align-self: center;
  display: inline-flex; align-items: center; gap: 6px;
  margin: 6px 10px 6px 4px; padding: 7px 10px;
  background: transparent; border: 1px solid var(--line); border-radius: 999px;
  color: var(--quiet); cursor: pointer;
  font-size: 10px; letter-spacing: .12em; text-transform: uppercase;
  font-family: var(--mono, inherit); white-space: nowrap;
}
.ticker-dock-toggle:hover { color: var(--ink); border-color: var(--accent-soft); }
.ticker-dock-toggle svg { width: 12px; height: 12px; transition: transform .25s ease; }
.ticker-dock.is-collapsed .ticker-dock-toggle svg { transform: rotate(180deg); }
.ticker-dock-toggle-label { display: none; }
.ticker-dock.is-collapsed .ticker-dock-toggle-label { display: inline; }
.ticker-dock.is-collapsed .ticker-dock-rows { display: none; }

/* Spotlight dismiss: the × button hides spotlight-kind slides for the day
   (same localStorage key the old bar used, so a dismissal carries over). */
.ticker-dock .s-item {
  display: inline-flex; align-items: baseline; gap: 6px;
  color: var(--muted); font-size: 12px; white-space: nowrap;
}
.ticker-dock .s-item strong { color: var(--ink); font-weight: 600; }
.ticker-dock .s-item a {
  color: var(--accent-soft); text-decoration: underline;
  text-decoration-color: rgba(205, 165, 111, .55); text-underline-offset: 3px;
  white-space: nowrap; border-radius: 4px;
}
.ticker-dock .s-item a:hover, .ticker-dock .s-item a:focus-visible { color: var(--accent); }
.ticker-dock-spotlight-dismiss {
  flex: none; background: none; border: none; cursor: pointer;
  color: var(--quiet); font-size: 16px; line-height: 1;
  padding: 4px 8px; border-radius: 6px;
}
.ticker-dock-spotlight-dismiss:hover { color: var(--accent); }
.ticker-dock.is-collapsed { left: auto; }

/* Reserve page space so the dock never covers content; lift the
   landing-computer pill above the dock. */
body.sg-has-tickerdock {
  padding-bottom: calc(var(--tickerdock-h, 96px) + env(safe-area-inset-bottom, 0px));
}
body.sg-has-tickerdock .sg-floatnav {
  bottom: calc(var(--tickerdock-h, 96px) + 1rem + env(safe-area-inset-bottom, 0px));
}

@media (prefers-reduced-motion: reduce) {
  .ticker-dock-slide.is-active { animation: none; }
  .ticker-dock-kicker .pulse-dot,
  .ticker-dock-kicker.flash .pulse-dot { animation: none; opacity: 1; }
  .ticker-dock-toggle svg { transition: none; }
}

@media (max-width: 760px) {
  .ticker-dock {
    left: 8px; right: 8px;
    bottom: calc(8px + env(safe-area-inset-bottom, 0px));
    font-size: 11px; border-radius: 10px;
  }
  .ticker-dock-row { gap: 8px; padding: 4px 2px 4px 10px; }
  .ticker-dock-kicker { font-size: 9px; letter-spacing: .1em; padding: 2px 8px; }
  .ticker-dock .ticker-item, .ticker-dock .launch-item { font-size: 11px; gap: 5px; }
  .ticker-dock .t-venue, .ticker-dock .l-site { font-size: 10px; }
  .ticker-dock .t-kind, .ticker-dock .l-kind, .ticker-dock .s-kind { font-size: 9px; padding: 1px 6px; }
  .ticker-dock-toggle { margin: 4px 8px 4px 2px; padding: 6px 8px; }
  /* Pages with the five-tab bottom nav: dock floats above it. */
  body.sg-has-tabbar .ticker-dock { bottom: calc(84px + env(safe-area-inset-bottom, 0px)); }
  body.sg-has-tickerdock.sg-has-tabbar {
    padding-bottom: calc(var(--tickerdock-h, 84px) + 84px + env(safe-area-inset-bottom, 0px));
  }
  .ticker-dock.is-collapsed { left: auto; }
  /* Mobile header: hide the Subscribe/Members button below 760px
     (user request 2026-09-22). Subscribe stays in the mobile bottom tab
     bar on inner pages and the homepage subscribe section.
     (The Circle key was removed from the header entirely 2026-09-22.)
     NOTE: this rule lives here (not in staging/assets/ticker-dock.css)
     because build-ticker-dock.py regenerates that file on every run. */
  .sg-topnav .sg-subscribe-cta { display: none !important; }
}
