/* polish-lite.css — collision-safe slice of the sitewide polish layer (iter-25, 2026-07-10).
   For pages that have their OWN design system (SEO/comparison/pricing/vertical pages) and
   must not inherit primitives.css's generic .btn/.card/.tag/.input component rules.
   Contains ONLY: scroll-reveal rules (paired with /js/reveal.js), the [data-fx-glow]
   cursor-halo plumbing (paired with /js/fx.js), and cross-page View Transitions.
   Every token has a literal fallback so this file works WITHOUT tokens.css.
   Safe to load alongside primitives.css (rules are identical duplicates). */

/* ── Scroll-reveal (added ONLY by reveal.js to below-fold elements; no-JS-safe) ── */
.reveal { opacity: 0; }
.reveal.is-in {
  opacity: 1;
  animation: revealIn .6s var(--ease-out, cubic-bezier(.22, 1, .36, 1)) backwards;
  animation-delay: calc(var(--i, 0) * var(--dur-stagger, 60ms));
}
@keyframes revealIn { from { opacity: 0; transform: translateY(18px) scale(.985); } to { opacity: 1; transform: translateY(0) scale(1); } }
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1 !important; animation: none !important; }
}
/* Print: IntersectionObserver never fires, so un-hide everything reveal.js tagged */
@media print {
  .reveal { opacity: 1 !important; animation: none !important; }
}

/* ── Cursor-follow accent halo (opt-in via [data-fx-glow]; fx.js writes --fx-gx/--fx-gy).
      Decorative + pointer-events:none; never blocks clicks. Static-centred on touch. ── */
[data-fx-glow] { position: relative; }
[data-fx-glow]::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none;
  opacity: 0; transition: opacity var(--dur-base, 220ms) var(--ease-out, cubic-bezier(.22, 1, .36, 1));
  background: radial-gradient(180px circle at var(--fx-gx, 50%) var(--fx-gy, 50%),
    color-mix(in srgb, var(--accent-500, #00D4FF) 16%, transparent), transparent 72%);
}
[data-fx-glow]:hover::after { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  [data-fx-glow]::after { transition: none; }
}

/* ── Cross-page View Transitions (progressive enhancement, Chromium 126+) ──
      Same-origin navigations cross-fade instead of hard-reloading white. ── */
@view-transition { navigation: auto; }
::view-transition-old(root) { animation: vtPageFade .2s var(--ease-out, ease) reverse both; }
::view-transition-new(root) { animation: vtPageFade .28s var(--ease-out, ease) both; }
@keyframes vtPageFade { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root), ::view-transition-new(root) { animation: none; }
}
