/* ============================================================
   PERKSLOCAL · PUBLIC SITE
   Page-level styles for the marketing pages. Design tokens and
   component classes come from tokens/*.css and components.css;
   this file only holds what is specific to the public site.
   ============================================================ */

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--pl-white);
  color: var(--pl-charcoal);
  font-family: var(--font-body);
  -webkit-font-smoothing: antialiased;
}

a { color: var(--pl-purple-500); text-decoration: none; }
a:hover { color: var(--pl-purple-400); }

/* Dark bands: links and selection have to flip or they vanish. */
.pl-dark a { color: var(--pl-purple-300); }
.pl-dark a:hover { color: var(--pl-gold-400); }
.pl-dark ::selection { background: rgba(251, 191, 36, 0.35); }

/* The sticky header is 72px of flow above the hero. On a dark hero we want the
   hero to run underneath it, so pull it up and pad the space back. */
.pl-hero-bleed {
  margin-top: -73px;
  padding-top: calc(73px + clamp(20px, 3vw, 44px)) !important;
}

/* ── Contents rail (legal pages). [data-on] is set by motion-kit's scrollspy. ── */
.pl-toc-link {
  font-size: 14.5px;
  line-height: 1.4;
  color: var(--pl-gray-500);
  padding: 9px 12px;
  border-left: 2px solid transparent;
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  transition: color var(--dur-fast) var(--ease-smooth),
              background var(--dur-fast) var(--ease-smooth),
              border-color var(--dur-fast) var(--ease-smooth);
}
.pl-toc-link:hover { color: var(--pl-purple-500); background: var(--pl-purple-100); border-left-color: var(--pl-purple-400); }
.pl-toc-link:focus-visible { outline: 2px solid var(--pl-purple-400); outline-offset: 2px; }
.pl-toc-link[data-on] {
  color: var(--pl-purple-600);
  background: var(--pl-purple-100);
  border-left-color: var(--pl-purple-500);
  font-weight: 600;
}

/* ── Skip link ──
   Off-screen until focused. The header is sticky and the hero is tall, so a
   keyboard visitor otherwise tabs the whole nav on every page. */
.pl-skip {
  position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--pl-charcoal); color: var(--pl-white);
  font-family: var(--font-ui); font-size: 15px; font-weight: 600;
  padding: 12px 20px; border-radius: 0 0 var(--radius-lg) 0;
}
.pl-skip:focus { left: 0; color: var(--pl-white); }

/* Visible to screen readers only — table captions, form legends. */
.pl-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;
}

/* ── Form validation ──
   A rejected field has to say so. Never let a submit fail silently. */
.pl-input[aria-invalid="true"] { border-color: var(--pl-danger); }
.pl-input[aria-invalid="true"]:focus { box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.14); }
.pl-error { font-family: var(--font-ui); font-size: 13.5px; font-weight: 500; color: var(--pl-danger); }

/* ── Section eyebrow ──
   The small label above a section heading. Deliberately plain text, matching the
   hero's "LOCAL PERKS. REAL VALUE." lockup: a pill on every section made each one
   shout at the same volume, so none of them read as a section. `.pl-overline` (the
   pill in components.css) stays for the UI kit, but the public site does not use it.

   The `--on-*` variants exist because the bands vary: dark hero, purple gradient,
   off-white. Pick the one that matches the band rather than relying on inheritance. */
.pl-eyebrow {
  display: block;
  font-family: var(--font-ui); font-size: 12.5px; font-weight: var(--weight-medium);
  letter-spacing: var(--tracking-tagline); text-transform: uppercase;
  color: var(--pl-purple-500);
}
.pl-eyebrow--gold { color: var(--pl-gold-600); }
.pl-eyebrow--on-dark { color: rgba(255, 255, 255, 0.72); }
.pl-eyebrow--on-dark-gold { color: var(--pl-gold-400); }
.pl-eyebrow .pl-eyebrow__accent { color: var(--pl-gold-400); }

/* ── Header ── */
.pl-nav {
  position: sticky; top: 0; z-index: 60;
  backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px);
  transition: background var(--dur-base) var(--ease-smooth),
              box-shadow var(--dur-base) var(--ease-smooth),
              border-color var(--dur-base) var(--ease-smooth);
  background: rgba(250, 250, 247, 0.72);
  border-bottom: 1px solid transparent;
}
.pl-nav__inner { max-width: 1280px; margin: 0 auto; padding: 14px 24px; display: flex; align-items: center; gap: 28px; }
.pl-nav__logo { display: flex; align-items: center; flex: 0 0 auto; }
.pl-nav__logo img { height: 34px; display: block; transition: filter var(--dur-base) var(--ease-smooth); }
.pl-nav__links { display: flex; align-items: center; gap: 6px; margin-left: 8px; }
.pl-nav__link {
  font-family: var(--font-ui); font-size: 15px; font-weight: 500;
  padding: 9px 14px; border-radius: var(--radius-full);
  color: var(--pl-charcoal); background: transparent;
  transition: background var(--dur-fast) var(--ease-smooth), color var(--dur-fast) var(--ease-smooth);
}
.pl-nav__link:hover { background: var(--pl-purple-100); color: var(--pl-purple-500); }
.pl-nav__link[aria-current="page"] { color: var(--pl-purple-500); background: var(--pl-purple-100); }
.pl-nav__spacer { flex: 1 1 auto; }
.pl-nav__actions { display: flex; align-items: center; gap: 12px; }
.pl-nav__demo {
  font-family: var(--font-ui); font-size: 15px; font-weight: 600;
  color: var(--pl-charcoal); padding: 9px 6px;
  transition: color var(--dur-base) var(--ease-smooth);
}
.pl-nav__demo:hover { color: var(--pl-purple-400); }
/* Sized to `.pl-btn--md` — same height, same type scale as the "Get started"
   button it now sits beside, so the pair reads as one lockup. */
.pl-nav__login {
  display: inline-flex; align-items: center; justify-content: center;
  height: 48px; padding: 0 var(--space-6); white-space: nowrap;
  font-family: var(--font-ui); font-size: var(--text-base); font-weight: 600;
  letter-spacing: 0.01em; color: var(--pl-charcoal);
  border-radius: var(--radius-full);
  border: 1px solid var(--border-medium); background: transparent;
  transition: background var(--dur-base) var(--ease-smooth),
              border-color var(--dur-base) var(--ease-smooth),
              color var(--dur-base) var(--ease-smooth);
}
.pl-nav__login:hover { background: var(--pl-purple-100); border-color: var(--border-accent); color: var(--pl-purple-500); }
.pl-nav__burger {
  width: 44px; height: 44px; border-radius: var(--radius-full);
  border: 1px solid var(--border-default); background: var(--pl-white);
  display: none; flex-direction: column; align-items: center; justify-content: center;
  gap: 5px; cursor: pointer;
  backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
  transition: background var(--dur-base) var(--ease-smooth), border-color var(--dur-base) var(--ease-smooth);
}
.pl-nav__burger span {
  width: 18px; height: 2px; border-radius: 2px; display: block;
  background: var(--pl-charcoal);
  transition: background var(--dur-base) var(--ease-smooth);
}

/* Inverted state, applied by the header script whenever a dark band is under it. */
.pl-nav[data-dark] { background: rgba(12, 7, 24, 0.20); border-bottom-color: rgba(255, 255, 255, 0.10); }
.pl-nav[data-dark][data-scrolled] { background: rgba(12, 7, 24, 0.62); }
.pl-nav[data-dark] .pl-nav__logo img { filter: brightness(0) invert(1); }
.pl-nav[data-dark] .pl-nav__link { color: rgba(255, 255, 255, 0.8); }
.pl-nav[data-dark] .pl-nav__link[aria-current="page"] { color: #fff; background: rgba(255, 255, 255, 0.14); }
/* The light hover pill wins over a dark bar, but the inverted white text does not
   flip back with it — white on near-white. Ink goes dark purple for the hover. */
.pl-nav[data-dark] .pl-nav__link:hover { background: var(--pl-purple-100); color: var(--pl-purple-600); }
.pl-nav[data-dark] .pl-nav__demo { color: rgba(255, 255, 255, 0.88); }
.pl-nav[data-dark] .pl-nav__login { color: rgba(255, 255, 255, 0.88); background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.26); }
.pl-nav[data-dark] .pl-nav__login:hover { background: rgba(255, 255, 255, 0.18); border-color: rgba(255, 255, 255, 0.45); }
.pl-nav[data-dark] .pl-nav__burger { background: rgba(255, 255, 255, 0.10); border-color: rgba(255, 255, 255, 0.26); }
.pl-nav[data-dark] .pl-nav__burger span { background: rgba(255, 255, 255, 0.88); }

/* Light state once scrolled off the dark bands. */
.pl-nav[data-scrolled]:not([data-dark]) {
  background: rgba(255, 255, 255, 0.94);
  border-bottom-color: var(--border-subtle);
  box-shadow: 0 6px 24px rgba(31, 31, 35, 0.06);
}

/* ── Mobile menu ── */
.pl-menu { display: none; border-top: 1px solid var(--border-subtle); padding: 14px 24px 22px; background: var(--pl-white); flex-direction: column; gap: 4px; }
.pl-menu a {
  font-family: var(--font-ui); font-size: 17px; font-weight: 500;
  padding: 12px 8px; border-radius: var(--radius-lg); color: var(--pl-charcoal);
}
.pl-menu a:hover { background: var(--pl-purple-100); }
.pl-menu__login { border-top: 1px solid var(--border-subtle); margin-top: 8px; font-weight: 600 !important; }

/* The bar switches to the burger below 1180px, not at the 900px the rest of the
   layout uses. Between the two, "For Customers" and "Book a demo" wrap onto a
   second line while their neighbours stay on one, and there is no fixing that in
   place: forcing nowrap overflows the bar by 37px at 1024 and 161px at 900. The
   five links only sit on one line from 1180 up, so that is where they are allowed
   to appear. iPad landscape and small laptops get the menu instead.

   The open panel is scoped to this query too. It is the only thing that displays
   it, so widening the window past the breakpoint cannot strand an open menu with
   its burger gone. */
@media (max-width: 1179px) {
  .pl-nav__links, .pl-nav__actions { display: none; }
  .pl-nav__burger { display: flex; }
  .pl-menu[data-open] { display: flex; }
}

/* ── App store badges ──
   Colour is inherited from the band, so the same badge works on the dark customer
   hero and on a white section. An unpublished store renders as [aria-disabled]:
   visibly dimmed and unclickable, never a dead link. */
.pl-store-badges { display: flex; flex-wrap: wrap; gap: 12px; }
.pl-store-badge {
  display: inline-flex; align-items: center; gap: 12px;
  /* A pending store renders as a <button>, a published one as an <a>. The reset
     is what makes the two indistinguishable. */
  font: inherit; text-align: left; cursor: pointer; -webkit-appearance: none; appearance: none;
  min-width: 184px; height: 58px; padding: 0 22px;
  border-radius: var(--radius-xl);
  background: var(--pl-charcoal); color: var(--pl-white);
  border: 1px solid rgba(255, 255, 255, 0.22);
  box-shadow: var(--shadow-card);
  transition: transform var(--dur-base) var(--ease-spring),
              box-shadow var(--dur-base) var(--ease-smooth);
}
.pl-store-badge svg { flex: 0 0 auto; width: 24px; height: 24px; fill: currentColor; display: block; }
.pl-store-badge__lines { display: flex; flex-direction: column; justify-content: center; line-height: 1.2; }
.pl-store-badge__pre {
  font-family: var(--font-ui); font-size: 11px; font-weight: 500;
  letter-spacing: 0.08em; text-transform: uppercase; color: rgba(255, 255, 255, 0.68);
}
.pl-store-badge__name { font-family: var(--font-display); font-size: 17px; font-weight: 600; letter-spacing: -0.01em; }
.pl-store-badge:hover, .pl-dark .pl-store-badge, .pl-dark .pl-store-badge:hover { color: var(--pl-white); }
.pl-store-badge:hover { transform: translateY(-1px); box-shadow: var(--shadow-lg); }
/* A store still in review is dimmed, but stays clickable: the click opens the
   modal, which is where "coming soon" is actually explained. */
.pl-store-badge[data-store-live="0"] { opacity: 0.72; }
.pl-store-badge[data-store-live="0"]:hover { opacity: 1; }
.pl-store-note { font-size: 14px; color: inherit; opacity: 0.72; margin: 16px 0 0; }
/* site.js sets [hidden] on the store a phone cannot install from. Needed because
   the display rules above would otherwise beat the UA stylesheet's [hidden]. */
.pl-store-badge[hidden], .pl-store-note[hidden] { display: none; }

/* ── "Get the app" modal ──
   Shown when a badge is clicked somewhere the click cannot succeed: any desktop,
   and any store still in review. Native <dialog>, so the backdrop, focus trap and
   Escape key are the browser's job, not ours. */
.pl-appmodal {
  width: min(420px, calc(100vw - 32px));
  padding: 30px 30px 34px;
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-2xl);
  background: var(--pl-white); color: var(--pl-charcoal);
  box-shadow: var(--shadow-xl);
  text-align: center;
}
.pl-appmodal::backdrop { background: rgba(15, 15, 20, 0.62); backdrop-filter: blur(3px); }
.pl-appmodal__close {
  position: absolute; top: 12px; right: 14px;
  width: 34px; height: 34px; padding: 0;
  border: 0; border-radius: var(--radius-full);
  background: transparent; color: var(--pl-gray-500);
  font-size: 26px; line-height: 1; cursor: pointer;
}
.pl-appmodal__close:hover { background: var(--pl-purple-100); color: var(--pl-charcoal); }
.pl-appmodal__title {
  font-family: var(--font-display); font-weight: 700;
  font-size: 23px; line-height: 1.15; letter-spacing: -0.02em;
  margin: 6px 0 0;
}
.pl-appmodal__body {
  font-size: 15px; line-height: 1.6; color: var(--pl-gray-500);
  margin: 12px auto 0; max-width: 34ch; text-wrap: pretty;
}
.pl-appmodal__qr { margin: 22px 0 0; }
.pl-appmodal__code {
  width: 190px; margin: 0 auto;
  padding: 10px; border-radius: var(--radius-xl);
  background: #fff; border: 1px solid var(--border-subtle);
}
.pl-appmodal__code svg { display: block; width: 100%; height: auto; }
.pl-appmodal__url { font-size: 14px; color: var(--pl-gray-500); margin: 14px 0 0; }
.pl-appmodal__url strong { color: var(--pl-charcoal); font-weight: 600; }
/* Hidden on a phone, where the visitor is already on the device they need. */
.pl-appmodal__qr[hidden] { display: none; }

/* ── Footer ── */
.pl-footer { background: var(--pl-charcoal); color: var(--pl-white); }
.pl-footer a { color: rgba(255, 255, 255, 0.82); font-size: 15px; }
.pl-footer a:hover { color: var(--pl-gold-400); }

/* ── Legal documents ──
   Styled by descendant selector, never inline: the document body is built from
   database content and its markup is asserted verbatim in
   tests/Feature/PublicLegalDocumentPageTest.php. Adding a style attribute to a
   heading, paragraph or list item there breaks those assertions. */
.pl-legal { min-width: 0; max-width: 68ch; }
.pl-legal h2 {
  font-family: var(--font-display); font-weight: 700;
  font-size: clamp(22px, 2.4vw, 30px); line-height: 1.2; letter-spacing: -0.02em;
  color: var(--pl-charcoal);
  margin: clamp(40px, 4vw, 60px) 0 0;
  padding-top: clamp(28px, 3vw, 40px);
  border-top: 1px solid var(--border-default);
  scroll-margin-top: 108px;
}
.pl-legal h2:first-child { margin-top: 0; padding-top: 0; border-top: none; }
.pl-legal h3 {
  font-family: var(--font-display); font-weight: 600;
  font-size: clamp(17px, 1.6vw, 20px); line-height: 1.35;
  margin: 30px 0 0; color: var(--pl-purple-600);
}
.pl-legal p { font-size: 16.5px; line-height: 1.72; color: var(--pl-gray-500); margin: 16px 0 0; text-wrap: pretty; }
.pl-legal ul { margin: 16px 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 11px; }
.pl-legal li { position: relative; font-size: 16.5px; line-height: 1.65; color: var(--pl-gray-500); padding-left: 24px; text-wrap: pretty; }
.pl-legal li::before {
  content: ''; position: absolute; left: 0; top: 0.62em;
  width: 7px; height: 7px; border-radius: 9999px; background: var(--pl-grad-reward);
}

.pl-legal-grid {
  max-width: 1180px; margin: 0 auto;
  padding: clamp(40px, 5vw, 72px) 24px clamp(56px, 7vw, 110px);
  display: grid; grid-template-columns: minmax(200px, 260px) minmax(0, 1fr);
  gap: clamp(28px, 4vw, 64px); align-items: start;
}
.pl-legal-toc { position: sticky; top: 104px; }
.pl-legal-toc ol { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; max-height: min(62vh, 620px); overflow-y: auto; scroll-behavior: smooth; }
@media (max-width: 899px) {
  .pl-legal-grid { grid-template-columns: minmax(0, 1fr); }
  .pl-legal-toc { position: static; background: var(--pl-offwhite); border: 1px solid var(--border-subtle); border-radius: var(--radius-2xl); padding: 20px; }
  .pl-legal-toc ol { max-height: none; }
}

/* ── Sticky sales bar ──
   Slides in once the reader is past the fold. site.js sets [data-on]. */
.pl-salesbar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 70;
  padding: 12px 16px; display: flex; justify-content: center;
  pointer-events: none;
  transform: translateY(140%); opacity: 0;
  transition: transform var(--dur-slow) var(--ease-smooth), opacity var(--dur-slow) var(--ease-smooth);
}
.pl-salesbar[data-on] { transform: translateY(0); opacity: 1; }
.pl-salesbar__inner {
  pointer-events: auto;
  display: flex; flex-wrap: wrap; align-items: center; gap: 16px;
  background: rgba(31, 31, 35, 0.94);
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
  border-radius: var(--radius-full); box-shadow: var(--shadow-xl);
  padding: 10px 12px 10px 22px; max-width: calc(100vw - 32px);
}
.pl-salesbar__lead { font-family: var(--font-ui); font-size: 14px; font-weight: 600; color: var(--pl-white); }
.pl-salesbar__note { font-size: 14px; color: rgba(255, 255, 255, 0.58); }
@media (max-width: 620px) { .pl-salesbar__note { display: none; } }

/* ── Stamp card demo ── */
.pl-stamp-slot {
  flex: 1; aspect-ratio: 1; border-radius: 9999px;
  display: flex; align-items: center; justify-content: center;
  font-size: 15px; font-weight: 700;
  color: var(--pl-gray-400); background: var(--pl-white);
  border: 2px solid var(--pl-gray-200);
  transition: background var(--dur-base) var(--ease-spring), color var(--dur-base) var(--ease-smooth), border-color var(--dur-base) var(--ease-smooth);
}
.pl-stamp-slot[data-on] { color: var(--pl-white); background: var(--pl-grad-signature); border-color: transparent; }
[data-pl-stamp][data-full] .pl-stamp-slot[data-on] { background: var(--pl-grad-reward); }
.pl-stamp-count { font-family: var(--font-ui); font-size: 12px; font-weight: 700; padding: 6px 12px; border-radius: 9999px; background: var(--pl-purple-100); color: var(--pl-purple-500); }
[data-pl-stamp][data-full] .pl-stamp-count { background: var(--pl-gold-100); color: var(--pl-gold-600); }
.pl-stamp-reward {
  margin-top: 26px; padding: 18px; border-radius: var(--radius-xl);
  background: var(--pl-offwhite); border: 1px solid var(--border-subtle);
  transition: background var(--dur-base) var(--ease-smooth), border-color var(--dur-base) var(--ease-smooth);
}
.pl-stamp-reward[data-full] { background: var(--pl-gold-100); border-color: var(--border-gold); }
.pl-stamp-reward__label { font-family: var(--font-ui); font-size: 11px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--pl-gray-400); }
.pl-stamp-reward[data-full] .pl-stamp-reward__label { color: var(--pl-gold-600); }
.pl-stamp-reward__text { font-family: var(--font-display); font-weight: 600; font-size: 17px; margin-top: 8px; color: var(--pl-gray-500); }
.pl-stamp-reward[data-full] .pl-stamp-reward__text { color: var(--pl-charcoal); }
.pl-stamp-scan {
  display: inline-flex; align-items: center; gap: 11px;
  padding: 15px 26px; border: 0; border-radius: var(--radius-full); cursor: pointer;
  font-family: var(--font-ui); font-size: 16px; font-weight: 700; color: var(--pl-white);
  background: var(--pl-grad-signature); box-shadow: var(--shadow-purple);
  transition: transform var(--dur-fast) var(--ease-spring), box-shadow var(--dur-base) var(--ease-smooth);
}
.pl-stamp-scan:hover { transform: translateY(-1px); }
.pl-stamp-scan[data-full] { background: var(--pl-grad-reward); box-shadow: var(--shadow-gold); }
.pl-stamp-scan__box { width: 20px; height: 20px; border-radius: 5px; border: 2px solid rgba(255, 255, 255, 0.85); display: inline-block; }
.pl-stamp-reset {
  padding: 14px 18px; border: 1px solid var(--border-default); border-radius: var(--radius-full);
  background: transparent; cursor: pointer;
  font-family: var(--font-ui); font-size: 15px; font-weight: 600; color: var(--pl-gray-500);
}
.pl-stamp-reset:hover { background: var(--pl-white); }

/* ── Billing toggle ──
   Both prices ship in the markup; [data-mode] decides which is shown. */
.pl-billing {
  display: inline-flex; align-items: center; gap: 6px; padding: 6px;
  border-radius: var(--radius-full); background: var(--pl-white);
  border: 1px solid var(--border-default); box-shadow: var(--shadow-sm);
}
.pl-billing button {
  font-family: var(--font-ui); font-size: 15px; font-weight: 600;
  padding: 10px 22px; border: 0; border-radius: var(--radius-full); cursor: pointer;
  display: inline-flex; align-items: center; gap: 9px;
  background: transparent; color: var(--pl-gray-500);
  transition: background var(--dur-fast) var(--ease-smooth), color var(--dur-fast) var(--ease-smooth);
}
.pl-billing button[aria-pressed="true"] { background: var(--pl-grad-signature); color: var(--pl-white); }
.pl-billing__save { font-size: 12px; font-weight: 700; padding: 3px 9px; border-radius: 9999px; background: var(--pl-gold-100); color: var(--pl-gold-600); }
.pl-billing button[aria-pressed="true"] .pl-billing__save { background: rgba(255, 255, 255, 0.22); color: var(--pl-white); }

[data-pl-plans] [data-price-yearly], [data-pl-plans] [data-note-yearly] { display: none; }
[data-pl-plans][data-mode="yearly"] [data-price-monthly], [data-pl-plans][data-mode="yearly"] [data-note-monthly] { display: none; }
[data-pl-plans][data-mode="yearly"] [data-price-yearly], [data-pl-plans][data-mode="yearly"] [data-note-yearly] { display: inline; }

/* ── FAQ accordion ── */
.pl-faq-item { background: var(--pl-white); border: 1px solid var(--border-subtle); border-radius: var(--radius-xl); box-shadow: var(--shadow-sm); overflow: hidden; }
.pl-faq-toggle {
  width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 18px;
  text-align: left; padding: 20px 22px; border: 0; background: transparent; cursor: pointer;
  font-family: var(--font-heading); font-size: 17px; font-weight: 600; color: var(--pl-charcoal);
}
.pl-faq-toggle:hover { background: var(--pl-offwhite); }
.pl-faq-sign {
  flex: 0 0 auto; width: 26px; height: 26px; border-radius: 9999px;
  background: var(--pl-purple-100); color: var(--pl-purple-500);
  display: flex; align-items: center; justify-content: center;
  font-size: 16px; font-weight: 700;
}
.pl-faq-panel { display: none; margin: 0; padding: 0 22px 22px; font-size: 16px; line-height: 1.7; color: var(--pl-gray-500); max-width: 64ch; }
.pl-faq-item[data-open] .pl-faq-panel { display: block; }

/* ── Keyframes ── */
@keyframes pl-marquee     { from { transform: translateX(0); }    to { transform: translateX(-50%); } }
@keyframes pl-marquee-rev { from { transform: translateX(-50%); } to { transform: translateX(0); } }
@keyframes pl-float  { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-12px); } }
@keyframes pl-pulse  { 0% { box-shadow: 0 0 0 0 rgba(245,158,11,0.45); } 70% { box-shadow: 0 0 0 22px rgba(245,158,11,0); } 100% { box-shadow: 0 0 0 0 rgba(245,158,11,0); } }
@keyframes pl-scan   { 0% { transform: translateY(-6%); } 100% { transform: translateY(106%); } }
@keyframes pl-drift1 { from { transform: translate(0,0) scale(1); } to { transform: translate(9vmax,7vmax) scale(1.12); } }
@keyframes pl-drift2 { from { transform: translate(0,0) scale(1); } to { transform: translate(-8vmax,-6vmax) scale(1.08); } }
@keyframes pl-drift3 { from { transform: translate(0,0); } to { transform: translate(-6vmax,7vmax); } }
@keyframes pl-dot    { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.35); opacity: 0.7; } }
@keyframes pl-pumpring { 0% { box-shadow: 0 0 0 0 rgba(251,191,36,0.55); } 75% { box-shadow: 0 0 0 20px rgba(251,191,36,0); } 100% { box-shadow: 0 0 0 0 rgba(251,191,36,0); } }

input[type=range] { -webkit-appearance: none; appearance: none; height: 6px; border-radius: 9999px; background: rgba(109,40,217,0.16); outline: none; }
input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 24px; height: 24px; border-radius: 50%; background: var(--pl-grad-signature); border: 3px solid #fff; box-shadow: 0 4px 14px rgba(109,40,217,0.4); cursor: pointer; }
input[type=range]::-moz-range-thumb { width: 20px; height: 20px; border-radius: 50%; background: #6D28D9; border: 3px solid #fff; cursor: pointer; }

::-webkit-scrollbar { height: 8px; width: 8px; }
::-webkit-scrollbar-thumb { background: rgba(31,31,35,0.16); border-radius: 9999px; }

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