/**
 * gist-shared.css — Epyso Gist Redesign: Shared Component Library
 *
 * Loaded ONCE, sitewide, via a <link> in header.php (same convention this
 * theme already uses for homepage-dark.css: one dedicated file, directly
 * linked, cached by the browser across every page load rather than
 * duplicated inline per-template).
 *
 * Contains every component reused across 2+ templates: story cards,
 * the genre dial grid, community cards, trending/leaderboard rows.
 * Page-specific layout (hero, story detail, reading typography, entry
 * forms) stays inline per-template, since those are genuinely one-off.
 *
 * Depends on the global --clr-*/--font-display variables defined in
 * header.php. Do not hardcode colors here — reference the variables so
 * a future palette change only has to happen in one place.
 */

/* ============ STORY CARD (2:3 cover, title overlaid on gradient) ============ */
body .ep-story-card{
  background:var(--clr-bg-card);
  border:1px solid rgba(243,233,221,0.5);
  border-radius:18px;
  overflow:hidden;
  transition:transform .2s ease, border-color .2s ease, box-shadow .2s ease;
  box-shadow:0 1px 0 rgba(255,255,255,0.03) inset, 0 8px 24px rgba(0,0,0,0.4);
}
body .ep-story-card:hover{ transform:translateY(-4px); border-color:var(--clr-primary-dark); box-shadow:0 1px 0 rgba(255,255,255,0.03) inset, 0 12px 32px rgba(0,0,0,0.45), 0 0 0 1px rgba(255,176,32,0.15); }
body .ep-story-card__link{ display:block; color:inherit; text-decoration:none; }
body .ep-story-card__cover{
  aspect-ratio:2/3;
  position:relative;
  overflow:hidden;
  display:flex;
  align-items:flex-end;
}
body .ep-story-card__cover img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
body .ep-story-card__cover-fallback{
  position:absolute; inset:0;
  display:flex; align-items:center; justify-content:center;
  background:var(--clr-bg-card-hover);
  color:var(--clr-text-faint);
  opacity:0.5;
}
/* Signature amber glow — the prototype's branded accent on every card cover,
   layered over the scrim so real photos still carry the same warm, designed
   feel the mockup had (not just a generic photo-with-fade-at-bottom look). */
body .ep-story-card__cover::before{
  content:"";
  position:absolute; inset:0;
  background:radial-gradient(circle at 75% 15%, rgba(255,176,32,0.12), transparent 55%);
  z-index:1;
  pointer-events:none;
}
body .ep-story-card__scrim{
  position:absolute; inset:0;
  /* Removed entirely — the overlaid genre/title text this scrim used to
     back is gone (the cover art carries the title now), so the gradient
     was only dimming the real title baked into the artwork, making the
     card look dull next to the clean, bright cover on the story page.
     The status pill and view-count chip carry their own background, so
     they don't need this for contrast. Cover now reads sharp, like the
     single-story cover (.sp-cover), which has no scrim at all. */
  background:none;
}
body .ep-story-card__cover-text{ position:relative; z-index:2; padding:16px; }
body .ep-story-card__genre{
  display:block;
  font-family:'JetBrains Mono',monospace;
  font-size:10px;
  color:var(--clr-primary);
  text-transform:uppercase;
  letter-spacing:0.05em;
  margin-bottom:6px;
}
body .ep-story-card__title{
  font-family:'Fraunces',serif;
  font-size:17px;
  font-weight:600;
  color:#fff;
  margin:0;
  line-height:1.2;
}
body .ep-story-card__body{ padding:12px 16px 16px; }
body .ep-story-card__meta{
  display:flex; gap:14px;
  font-family:'JetBrains Mono',monospace;
  font-size:11px;
  color:var(--clr-text-muted);
}
body .ep-story-card__stat{ display:flex; align-items:center; gap:4px; }

/* ============ AUTH PAGES (Become a Writer / register form) ============
   Was completely unstyled — .ep-auth* classes existed in the markup but
   had no CSS anywhere in the theme, so the page rendered as raw browser
   HTML. This is the missing stylesheet, matching the rest of the theme's
   dark-card/amber-accent language. */
body .ep-auth{
  min-height:60vh;
  display:flex; align-items:center; justify-content:center;
  padding:60px 6vw 100px;
}
body .ep-auth__card{
  width:100%; max-width:420px;
  background:var(--clr-bg-card);
  border:1px solid rgba(240,234,216,0.1);
  border-radius:20px;
  padding:36px 32px;
  box-shadow:0 8px 32px rgba(0,0,0,0.4);
}
body .ep-auth__eyebrow{
  display:block;
  font-family:'JetBrains Mono',monospace;
  font-size:11px; letter-spacing:0.08em; text-transform:uppercase;
  color:var(--clr-primary);
  margin-bottom:14px;
}
body .ep-auth__title{
  font-family:'Fraunces',serif; font-size:clamp(24px,4vw,30px); font-weight:600;
  color:var(--clr-text); line-height:1.15; margin:0 0 10px;
}
body .ep-auth__sub{
  font-size:14px; line-height:1.55; color:var(--clr-text-muted);
  margin:0 0 28px;
}
body .ep-auth__form{ display:flex; flex-direction:column; gap:18px; }
body .ep-auth__field{ display:flex; flex-direction:column; gap:7px; }
body .ep-auth__field span{
  font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:0.04em;
  text-transform:uppercase; color:var(--clr-text-muted);
}
body .ep-auth__field input{
  background:var(--clr-bg); border:1px solid rgba(240,234,216,0.14);
  border-radius:10px; padding:12px 14px;
  font-family:'Inter',sans-serif; font-size:15px; color:var(--clr-text);
  outline:none; transition:border-color .2s ease, box-shadow .2s ease;
}
body .ep-auth__field input:focus{
  border-color:var(--clr-primary-dark);
  box-shadow:0 0 0 3px var(--clr-primary-glow);
}
body .ep-auth__hp{ position:absolute !important; left:-9999px !important; width:1px; height:1px; overflow:hidden; }
body .ep-auth__error{
  background:rgba(244,69,90,0.12); border:1px solid rgba(244,69,90,0.3);
  color:#f4455a; font-size:13px; padding:10px 14px; border-radius:10px; margin:0;
}
body .ep-auth__submit{
  display:flex; align-items:center; justify-content:center;
  background:var(--grad-primary); color:#1a1206;
  border:none; border-radius:100px; padding:14px 20px;
  font-family:'Inter',sans-serif; font-size:15px; font-weight:700;
  cursor:pointer; transition:transform .15s ease, box-shadow .15s ease;
  margin-top:6px;
}
body .ep-auth__submit:hover{ transform:translateY(-2px); box-shadow:0 8px 20px rgba(255,176,32,0.3); }
body .ep-auth__submit.is-loading{ opacity:0.7; cursor:wait; pointer-events:none; }
body .ep-auth__alt{
  text-align:center; font-size:13.5px; color:var(--clr-text-muted);
  margin:24px 0 0;
}
body .ep-auth__alt a{ color:var(--clr-primary); text-decoration:none; font-weight:600; }
body .ep-auth__alt a:hover{ text-decoration:underline; }
@media(max-width:480px){
  body .ep-auth{ padding:40px 6vw 70px; }
  body .ep-auth__card{ padding:28px 22px; border-radius:16px; }
}

/* ============ HORIZONTAL SLIDER (Latest Stories, Genres) ============
   Real feature, not decorative: mobile shows ~2 items per row via
   percentage width + scroll-snap, matching the requested "two cards on
   a row for mobile" behavior. Desktop shows more, still scrollable. */
.ep-slider{
  display:flex; gap:16px; overflow-x:auto; scroll-snap-type:x mandatory;
  -webkit-overflow-scrolling:touch;
  padding-bottom:6px; scrollbar-width:none; -ms-overflow-style:none;
}
.ep-slider::-webkit-scrollbar{ display:none; }
.ep-slider > *{ scroll-snap-align:start; scroll-snap-stop:always; flex:0 0 auto; }
.ep-slider .ep-story-card{ width:220px; }
.ep-slider .ep-slide-item{ width:220px; }
@media(max-width:700px){
  .ep-slider .ep-story-card{ width:46vw; }
  .ep-slider .ep-slide-item{ width:70vw; }
}
/* When ep-story-grid (a plain CSS grid, defined in homepage-dark.css)
   ALSO carries ep-slider (this file's scroll-snap carousel), the slider
   must win outright — a grid track and a forced child width fighting
   each other is what caused the "sliding to the left when I drag it"
   half-broken feel. Two-class selector beats either single-class rule
   on specificity alone, so this applies regardless of file load order. */
.ep-story-grid.ep-slider{
  display:flex;
  grid-template-columns:none;
}
.ep-see-all-btn{
  display:inline-flex; align-items:center; gap:6px;
  font-family:'JetBrains Mono',monospace; font-size:12px; font-weight:600;
  color:var(--clr-primary); text-decoration:none;
  padding:9px 16px; border:1px solid var(--clr-primary-dark); border-radius:100px;
  white-space:nowrap;
}
/* Story-level grid wrapper (used for the plain, badge-free listing pattern —
   e.g. archive/browse pages, genre listings — as opposed to the homepage's
   .ep-story-grid which carries new/challenge badges) */
.ep-card-grid{
  display:grid;
  grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));
  gap:20px;
}

/* ============ REAL SHARED CARD (template-parts/card-story.php) ============
   Used by archive-story.php and the AJAX load-more endpoint behind it.
   Different class family from .ep-story-card above (that one is the
   homepage's own inline markup, with new/challenge badges card-story.php
   doesn't have) — NOT unified into one system in this pass, since doing so
   would mean touching the AJAX endpoint's response markup, which needs its
   own review first rather than being changed as a side effect of a CSS pass. */
body .story-card{
  background:var(--clr-bg-card);
  border:1px solid rgba(240,234,216,0.1);
  border-radius:18px;
  overflow:hidden;
  transition:transform .2s ease, border-color .2s ease;
}
body .story-card:hover{ transform:translateY(-4px); border-color:var(--clr-primary-dark); }
body .story-card a{ display:block; color:inherit; text-decoration:none; }
body .story-card__cover{
  aspect-ratio:2/3;
  position:relative;
  overflow:hidden;
}
body .story-card__cover img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
body .story-card__cover-fallback{
  position:absolute; inset:0;
  display:flex; align-items:center; justify-content:center;
  background:var(--clr-bg-card-hover);
  color:var(--clr-text-faint);
  opacity:0.5;
}
/* Same signature amber glow as .ep-story-card, so every card on the site —
   homepage, archive, genre pages — carries the same branded accent. */
body .story-card__cover::before{
  content:"";
  position:absolute; inset:0;
  background:radial-gradient(circle at 75% 15%, rgba(255,176,32,0.28), transparent 55%);
  z-index:1;
  pointer-events:none;
}
body .story-card__cover-overlay{
  position:absolute; inset:0;
  /* SECOND TIME THIS BUG HAS BITTEN: this selector (body .story-card__cover-overlay)
     has higher specificity than the plain .story-card__cover-overlay in
     style.css, so it's the one that actually renders on the live site —
     style.css's copy was already lightened in an earlier fix, but this
     one, the one that actually wins, was never touched, so covers were
     still going out with the old heavy 92%-opacity darkening sitting
     right over the real title in the artwork. Both files' copies must
     be kept in sync whenever this changes — lightened to match
     style.css's version now. */
  background:linear-gradient(to bottom, transparent 50%, rgba(13,10,15,0.12) 75%, rgba(13,10,15,0.4) 100%);
}
body .story-card__trophy{
  position:absolute; top:10px; left:10px; z-index:2;
  font-size:14px; background:rgba(13,10,15,0.6); border-radius:50%;
  width:26px; height:26px; display:flex; align-items:center; justify-content:center;
}
body .story-card__ep-chip{
  position:absolute; bottom:10px; right:10px; z-index:2;
  display:flex; align-items:center; gap:4px;
  font-family:'JetBrains Mono',monospace; font-size:10px;
  background:rgba(13,10,15,0.7); color:var(--clr-text);
  padding:4px 8px; border-radius:100px;
}
body .story-card__info{ padding:14px 16px 16px; }
/* body .story-card__genre / __title removed — card-story.php no longer
   outputs either; the cover art now carries the title, poster-style. */
body .story-card__stats{ display:flex; gap:12px; }
body .story-card__stat{
  display:flex; align-items:center; gap:4px;
  font-family:'JetBrains Mono',monospace; font-size:11px;
  color:var(--clr-text-muted);
}

/* ============ COMMUNITY CARD ============
   Theme-aware, not a permanently-dark island: white card + colored border/
   icon in light mode, dark card in dark mode, driven entirely by the
   existing --clr-bg-card token — same markup, no per-theme overrides
   needed. Brand color (WhatsApp green / Telegram blue) lives in the icon
   badge, border and CTA button via --ep-comm-accent, set per card
   modifier class below. */
.ep-community-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(240px, 1fr));
  gap:18px;
}
.ep-community-card{
  display:flex; flex-direction:column; gap:16px;
  background:var(--clr-bg-card);
  border:1.5px solid var(--ep-comm-border, rgba(240,234,216,0.12));
  border-radius:16px;
  padding:20px;
  text-decoration:none;
  color:inherit;
  transition:border-color .2s ease, transform .2s ease;
}
.ep-community-card:hover{ transform:translateY(-3px); }
.ep-community-card__top{ display:flex; align-items:center; gap:12px; }
.ep-community-icon{
  width:40px; height:40px; border-radius:10px; flex:0 0 auto;
  display:flex; align-items:center; justify-content:center;
  background:var(--ep-comm-accent, var(--clr-primary));
  color:var(--ep-comm-accent-ink, #1d0f14);
}
.ep-community-body{ min-width:0; }
.ep-community-body h4{
  font-family:'Fraunces',serif; font-size:16px; font-weight:700;
  margin:0; color:var(--clr-text); line-height:1.25;
}
.ep-community-body p{
  font-size:12.5px; color:var(--clr-text-muted); line-height:1.5; margin:3px 0 0;
}
.ep-community-cta{
  display:flex; align-items:center; justify-content:center; gap:6px;
  background:var(--ep-comm-accent, var(--clr-primary));
  color:var(--ep-comm-accent-ink, #1d0f14);
  font-weight:700; font-size:13.5px; padding:11px; border-radius:9px;
  transition:opacity .2s ease;
}
.ep-community-card:hover .ep-community-cta{ opacity:.88; }

.ep-community-card--telegram{ --ep-comm-accent:#2997F6; --ep-comm-accent-ink:#0f1d30; --ep-comm-border:rgba(41,151,246,0.28); }
.ep-community-card--whatsapp{ --ep-comm-accent:#25D366; --ep-comm-accent-ink:#0a2a20; --ep-comm-border:rgba(37,211,102,0.28); }

/* Mobile: collapse the tall stacked cards into compact single-row list
   items so this section stops eating a whole screen. The full card is
   already the link, so the big "Join channel" button was redundant — it
   shrinks to a small round arrow on the right. Desktop keeps the roomier
   stacked cards above. */
@media (max-width: 639px){
  .ep-community-grid{ gap:10px; }
  .ep-community-card{ flex-direction:row; align-items:center; gap:12px; padding:12px 14px; }
  .ep-community-card__top{ flex:1 1 auto; min-width:0; }
  .ep-community-icon{ width:38px; height:38px; }
  .ep-community-body h4{ font-size:15px; }
  .ep-community-body p{
    font-size:11.5px; margin-top:1px;
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  }
  .ep-community-cta{
    margin-left:auto; flex:0 0 auto;
    width:36px; height:36px; padding:0; border-radius:50%; gap:0;
    font-size:0;               /* hide the label text; the arrow <svg> stays */
  }
}

/* ============ TRENDING / RANKED ROW (leaderboard-style) ============ */
body .ep-trending-item__link{
  display:flex; align-items:center; gap:14px; padding:14px 0;
  border-bottom:1px solid rgba(240,234,216,0.1);
  text-decoration:none; color:inherit;
}
body .ep-trending-item:last-child .ep-trending-item__link{ border-bottom:none; }
body .ep-trending-item__rank{
  font-family:'JetBrains Mono',monospace; font-size:14px;
  color:var(--clr-text-muted); width:24px; flex:0 0 auto;
}
body .ep-trending-item:nth-child(-n+3) .ep-trending-item__rank{ color:var(--clr-primary); font-weight:700; }
body .ep-trending-item__cover{
  width:44px; height:66px; flex:0 0 auto; border-radius:6px;
  overflow:hidden; background:var(--clr-bg-card-hover);
}
body .ep-trending-item__cover img{ width:100%; height:100%; object-fit:cover; }
body .ep-trending-item__body{ flex:1; min-width:0; }
body .ep-trending-item__genre{
  display:block; font-family:'JetBrains Mono',monospace; font-size:10px;
  color:var(--clr-primary); text-transform:uppercase; margin-bottom:3px;
}
body .ep-trending-item__title{
  font-family:'Fraunces',serif; font-size:15.5px; font-weight:600;
  margin:0; color:var(--clr-text); line-height:1.3;
}
body .ep-trending-item__author{ font-size:11.5px; color:var(--clr-text-muted); }
body .ep-trending-item__reads{ text-align:right; flex:0 0 auto; }
body .ep-trending-item__count{
  display:block; font-family:'Fraunces',serif; font-size:16px;
  font-weight:600; color:var(--clr-text);
}
body .ep-trending-item__reads-label{
  font-family:'JetBrains Mono',monospace; font-size:9.5px;
  color:var(--clr-text-muted); text-transform:uppercase;
}

@media (max-width:700px){
  .ep-card-grid{ grid-template-columns:repeat(auto-fill, minmax(140px, 1fr)); gap:14px; }
}
/* ============================================================
   EPISODE FINALE SEQUENCE
   Replaces: sticky-next-bar (75%) + inline-next-suggestion (80%)
             + episode-completion-banner (95%) — three separate
             pop-ins — with ONE choreographed moment at ~92%.

   Drop-in: uses your existing tokens (--clr-primary, --ease-out,
   --dur-fast/base/slow, --font-display/--font-body). No new deps.
   ============================================================ */

/* ---- 1. Approach cue: previously an edge-fade gradient + breathing
   opacity on the last paragraph. Removed — it was fading the actual
   story text toward the background color, i.e. making the real ending
   sentences hard to read, which defeats the entire point of a reading
   page. The floating "up next" pill already signals "you're near the
   end" without touching the content itself, so this class is kept
   (JS still adds it, harmless) but no longer does anything visual. ---- */
.episode-content.is-finale-approaching {
  position: relative;
}

/* ---- 2. The finale block itself ---- */
.episode-finale {
  margin: 8px 0 0;
  opacity: 0;
  transform: translateY(14px);
}
.episode-finale.is-visible {
  animation: finale-rise var(--dur-slow) var(--ease-out) forwards;
}
@keyframes finale-rise {
  to { opacity: 1; transform: translateY(0); }
}

/* Stamp mark */
.episode-finale__mark {
  display: flex;
  align-items: center;
  gap: 14px;
  margin: 40px 0 28px;
  opacity: 0;
  transform: scale(0.92);
}
.episode-finale.is-visible .episode-finale__mark {
  animation: finale-stamp 480ms var(--ease-out) 60ms forwards;
}
@keyframes finale-stamp {
  60%  { opacity: 1; transform: scale(1.03); }
  100% { opacity: 1; transform: scale(1); }
}
.episode-finale__mark::before,
.episode-finale__mark::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--clr-border-light, rgba(240,234,216,0.14));
}
.episode-finale__mark-text {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--clr-primary);
  white-space: nowrap;
}

/* Reactions — staggered in after the mark */
.episode-finale .reaction-bar {
  opacity: 0;
  transform: translateY(10px);
}
.episode-finale.is-visible .reaction-bar {
  animation: finale-rise 420ms var(--ease-out) 220ms forwards;
}

/* Share — staggered in after reactions */
.episode-finale .episode-share {
  opacity: 0;
  transform: translateY(10px);
}
.episode-finale.is-visible .episode-share {
  animation: finale-rise 420ms var(--ease-out) 360ms forwards;
}

/* ---- 3. Next-episode card — a real card, not a link ---- */
.finale-next-card {
  display: block;
  position: relative;
  margin-top: 40px;
  padding: 28px 26px;
  border-radius: 14px;
  background: var(--clr-bg-card);
  border: 1px solid var(--clr-border-light, rgba(240,234,216,0.1));
  text-decoration: none;
  overflow: hidden;
  opacity: 0;
  transform: translateY(14px);
  transition: transform var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}
.episode-finale.is-visible .finale-next-card {
  animation: finale-rise 460ms var(--ease-out) 500ms forwards;
}
.finale-next-card::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse 70% 60% at 100% 0%, var(--clr-primary-glow), transparent 70%);
  opacity: 0;
  transition: opacity var(--dur-base) var(--ease-out);
}
.finale-next-card:hover {
  transform: translateY(-3px);
  border-color: var(--clr-primary-dark);
  box-shadow: var(--shadow-lg);
}
.finale-next-card:hover::before { opacity: 1; }

.finale-next-card__kicker {
  position: relative;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--clr-text-faint);
  margin-bottom: 8px;
}
.finale-next-card__title {
  position: relative;
  font-family: var(--font-display);
  font-size: clamp(19px, 2.4vw, 23px);
  font-weight: 600;
  color: var(--clr-text);
  line-height: 1.3;
  margin-bottom: 18px;
  padding-right: 40px;
}
.finale-next-card__cta {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 14px;
  font-weight: 700;
  color: var(--clr-primary);
}
.finale-next-card__cta svg {
  transition: transform var(--dur-base) var(--ease-out);
}
.finale-next-card:hover .finale-next-card__cta svg {
  transform: translateX(5px);
}

/* Story-complete variant (no next episode) reads calmer, not "dead end" */
.finale-next-card--complete {
  background: var(--clr-bg-2);
  text-align: center;
}
.finale-next-card--complete .finale-next-card__title { padding-right: 0; }

@media (max-width: 600px) {
  .finale-next-card { padding: 22px 20px; }
}

/* Reduced motion: keep the state changes, drop the choreography */
@media (prefers-reduced-motion: reduce) {
  .episode-finale, .episode-finale *, .finale-next-card {
    animation: none !important;
    transition: none !important;
    opacity: 1 !important;
    transform: none !important;
  }
}

/* ============================================================
   FLOATING NEXT-EPISODE PILL
   Shows while the reader is ~80-96% through — a quiet on-screen hint
   that there's more, without the three-popup pile-up the old sticky
   bar + inline suggestion + banner used to create. Hands off to the
   full .finale-next-card the moment the finale reveals at 96%.
   ============================================================ */
.floating-next-pill {
  position: fixed;
  left: 50%;
  bottom: 20px;
  transform: translate(-50%, 24px);
  z-index: 40;
  display: flex;
  align-items: center;
  gap: 10px;
  max-width: min(420px, calc(100vw - 32px));
  background: var(--clr-bg-card);
  border: 1px solid rgba(255,176,32,0.3);
  border-radius: 100px;
  padding: 10px 16px 10px 18px;
  box-shadow: 0 10px 28px rgba(0,0,0,0.5), 0 0 0 1px rgba(0,0,0,0.2);
  text-decoration: none;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out);
}
.floating-next-pill.is-visible {
  opacity: 1;
  transform: translate(-50%, 0);
  pointer-events: auto;
}
.floating-next-pill__label {
  flex-shrink: 0;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--clr-primary);
}
.floating-next-pill__title {
  flex: 1;
  min-width: 0;
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 600;
  color: var(--clr-text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.floating-next-pill svg { flex-shrink: 0; color: var(--clr-primary); }

@media (max-width: 480px) {
  .floating-next-pill { bottom: 14px; padding: 9px 14px 9px 16px; }
}
@media (prefers-reduced-motion: reduce) {
  .floating-next-pill { transition: none; }
}
