/* DapperFellas motion layer — pure CSS for animations + state hooks.
 * JS (js/motion.js) toggles .is-revealed, --reveal, --progress, etc.
 * All animations respect prefers-reduced-motion via reset.css global rule.
 */

/* ============================================================
   1. SCROLL REVEAL — fail-open: visible by default for no-JS,
   crawlers, reduced-motion, and headless QA tools. The .js-motion
   class is added by an inline <head> script before first paint
   when JS is enabled — only then do we hide+animate.
   ============================================================ */
[data-reveal],
.reveal,
.reveal-stagger > * {
  transition:
    opacity 700ms var(--ease-out),
    transform 700ms var(--ease-out);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform;
}

.js-motion [data-reveal]:not(.is-revealed),
.js-motion .reveal:not(.is-revealed) {
  opacity: 0;
  transform: translateY(24px);
}

.js-motion [data-reveal="fade"]:not(.is-revealed)        { transform: none; }
.js-motion [data-reveal="slide-left"]:not(.is-revealed)  { transform: translateX(40px); }
.js-motion [data-reveal="slide-right"]:not(.is-revealed) { transform: translateX(-40px); }
.js-motion [data-reveal="scale"]:not(.is-revealed)       { transform: scale(0.96); }

[data-reveal].is-revealed,
.reveal.is-revealed {
  opacity: 1;
  transform: translate(0,0) scale(1);
}

.js-motion .reveal-stagger:not(.is-revealed) > * { opacity: 0; transform: translateY(20px); }
.reveal-stagger.is-revealed > * { opacity: 1; transform: translateY(0); }
.reveal-stagger > *:nth-child(1)    { transition-delay: 0ms; }
.reveal-stagger > *:nth-child(2)    { transition-delay: 80ms; }
.reveal-stagger > *:nth-child(3)    { transition-delay: 160ms; }
.reveal-stagger > *:nth-child(4)    { transition-delay: 240ms; }
.reveal-stagger > *:nth-child(5)    { transition-delay: 320ms; }
.reveal-stagger > *:nth-child(6)    { transition-delay: 400ms; }
.reveal-stagger > *:nth-child(7)    { transition-delay: 480ms; }
.reveal-stagger > *:nth-child(n+8)  { transition-delay: 560ms; }

/* ============================================================
   2. MARQUEE
   ============================================================ */
.marquee {
  overflow: hidden;
  display: flex;
  gap: var(--space-10);
  --marquee-duration: 40s;
  mask-image: linear-gradient(90deg, transparent, black 10%, black 90%, transparent);
  -webkit-mask-image: linear-gradient(90deg, transparent, black 10%, black 90%, transparent);
}
.marquee-track {
  display: flex;
  gap: var(--space-10);
  flex-shrink: 0;
  animation: marquee-scroll var(--marquee-duration) linear infinite;
  min-width: 100%;
  align-items: center;
}
.marquee[data-paused="true"] .marquee-track { animation-play-state: paused; }
.marquee:hover .marquee-track { animation-play-state: paused; }

@keyframes marquee-scroll {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-100%, 0, 0); }
}

.marquee-item {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  color: var(--text-muted);
  font-family: var(--font-display);
  font-size: var(--text-2xl);
  font-style: italic;
  white-space: nowrap;
}
.marquee-item .dot-sep {
  color: var(--accent);
  font-size: var(--text-base);
}

/* ============================================================
   3. MAGNETIC
   ============================================================ */
[data-magnetic] {
  transition: transform 400ms var(--ease-out);
  will-change: transform;
}

/* ============================================================
   4. SPLIT TEXT
   ============================================================ */
.split-text .split-char {
  display: inline-block;
  opacity: 0;
  transform: translateY(0.5em) rotate(4deg);
  transition:
    opacity 500ms var(--ease-out),
    transform 700ms var(--ease-out);
  transition-delay: calc(var(--base-delay, 0ms) + var(--i, 0) * 28ms);
  will-change: opacity, transform;
}
.split-text.is-revealed .split-char {
  opacity: 1;
  transform: translateY(0) rotate(0);
}

/* Prevent H1 layout collapse before JS splits */
.split-text-line { overflow: visible; }
.split-text-line em { display: inline-block; }

/* ============================================================
   5. HOVER REVEAL (before/after wipe)
   ============================================================ */
[data-hover-reveal] {
  --reveal: 50%;
  position: relative;
  overflow: hidden;
}
[data-hover-reveal] .reveal-after {
  position: absolute;
  inset: 0;
  clip-path: inset(0 calc(100% - var(--reveal)) 0 0);
  transition: clip-path 60ms linear;
  will-change: clip-path;
}
[data-hover-reveal]::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: var(--reveal);
  width: 2px;
  background: var(--accent);
  pointer-events: none;
  opacity: 0;
  transition: opacity 200ms var(--ease-out);
}
[data-hover-reveal]:hover::after { opacity: 1; }

/* ============================================================
   6. PARALLAX
   ============================================================ */
[data-parallax] {
  will-change: transform;
  transform: translate3d(0, var(--parallax-y, 0), 0);
  transition: transform 50ms linear;
}

/* ============================================================
   8. TEXT SCRAMBLE
   ============================================================ */
[data-scramble] {
  cursor: default;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum";
  display: inline-block;
  min-width: max-content;
}

/* ============================================================
   9. COUNT UP — no styling needed, just smooth font
   ============================================================ */
[data-count-up] { font-variant-numeric: tabular-nums; }

/* ============================================================
   10. PROGRESS RAIL
   ============================================================ */
.progress-rail {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  background: transparent;
  z-index: var(--z-nav);
  pointer-events: none;
}
.progress-rail::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  width: var(--progress, 0);
  background: linear-gradient(90deg, transparent, var(--accent), var(--accent-hover));
  transition: width 100ms linear;
}

/* ============================================================
   11. LAZY IMAGE FADE
   ============================================================ */
img[loading="lazy"] {
  opacity: 0;
  transition: opacity 600ms var(--ease-out);
}
img[loading="lazy"].is-loaded { opacity: 1; }

/* ============================================================
   12. NAV SCROLL SHADOW (sticky elevation indicator)
   ============================================================ */
.nav.is-scrolled {
  box-shadow: var(--shadow-md);
}

/* Hero video transition is owned by sections.css — duplicate removed here. */

/* ============================================================
   14. BUTTON HOVER — subtle scale + shine
   ============================================================ */
.btn-primary {
  position: relative;
  overflow: hidden;
}
.btn-primary::after {
  content: "";
  position: absolute;
  top: -50%;
  left: -100%;
  width: 60%;
  height: 200%;
  background: linear-gradient(
    100deg,
    transparent 20%,
    color-mix(in oklch, var(--accent-contrast), transparent 75%) 50%,
    transparent 80%
  );
  transform: skewX(-20deg);
  transition: left 700ms var(--ease-out);
  pointer-events: none;
}
.btn-primary:hover::after { left: 150%; }

/* Razor theme — disable shine (against its minimalism) */
[data-theme="razor"] .btn-primary::after { display: none; }

/* ============================================================
   15. LINK UNDERLINE (animated underline on hover)
   ============================================================ */
.link-underline {
  position: relative;
  color: var(--text);
}
.link-underline::after {
  content: "";
  position: absolute;
  bottom: -2px;
  left: 0;
  right: 0;
  height: 1px;
  background: var(--accent);
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 400ms var(--ease-out);
}
.link-underline:hover::after {
  transform: scaleX(1);
  transform-origin: left;
}

/* ============================================================
   16. THEME BAR — subtle breathing on initial page load
   ============================================================ */
@keyframes theme-bar-nudge {
  0%, 10%, 100% { transform: translateX(-50%) translateY(0); }
  5% { transform: translateX(-50%) translateY(-4px); }
}
.theme-bar {
  animation: theme-bar-nudge 8s ease-in-out 2s;
}
@media (prefers-reduced-motion: reduce) {
  .theme-bar { animation: none; }
}

/* ============================================================
   18. MARQUEE TICKER — review quotes scrolling
   ============================================================ */
.ticker {
  padding-block: var(--space-10);
  border-block: 1px solid var(--border);
  background: var(--bg-elevated);
  overflow: hidden;
}

/* ============================================================
   19. 3D TILT ON CARDS
   ============================================================ */
[data-tilt] {
  transform-style: preserve-3d;
  transition: transform 400ms var(--ease-out);
  will-change: transform;
}
[data-tilt] > * { transform: translateZ(20px); }

@media (prefers-reduced-motion: reduce) {
  [data-tilt] { transform: none !important; }
}

/* ============================================================
   20. CONIC-GRADIENT ANIMATED BORDER (featured card)
   ============================================================ */
/* Featured Gatsby card — bg gradient comes from sections.css.
   Here we add a slow gold conic-ring spinning around the edge. */
.service-card.is-featured {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}
.service-card.is-featured::before {
  content: "";
  position: absolute;
  inset: -2px;
  z-index: -2;
  background: conic-gradient(
    from var(--angle, 0deg),
    transparent 0deg,
    color-mix(in oklch, var(--accent), transparent 30%) 30deg,
    transparent 90deg,
    transparent 240deg,
    color-mix(in oklch, var(--accent), transparent 60%) 280deg,
    transparent 320deg
  );
  border-radius: inherit;
  animation: spin-angle 14s linear infinite;
}
.service-card.is-featured::after {
  content: "";
  position: absolute;
  inset: 1px;
  background:
    linear-gradient(135deg,
      color-mix(in oklch, var(--accent), transparent 92%) 0%,
      var(--bg-card) 60%);
  border-radius: inherit;
  z-index: -1;
}

@property --angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}

@keyframes spin-angle {
  to { --angle: 360deg; }
}

@media (prefers-reduced-motion: reduce) {
  .service-card.is-featured::before { animation: none; }
}

[data-theme="razor"] .service-card.is-featured::before { display: none; }
[data-theme="razor"] .service-card.is-featured::after { display: none; }

/* ============================================================
   21. STICKY MOBILE CTA — Floating Glass Pill (M3)
   ============================================================ */
.mobile-cta { display: none; }

@media (max-width: 767px) {
  .mobile-cta {
    display: flex;
    position: fixed;
    bottom: calc(var(--space-4) + env(safe-area-inset-bottom, 0px));
    left: var(--space-4);
    right: var(--space-4);
    z-index: var(--z-nav);
    gap: var(--space-1);
    padding: 6px;
    background: oklch(0.13 0.006 60 / 0.88);
    backdrop-filter: blur(24px) saturate(1.4);
    -webkit-backdrop-filter: blur(24px) saturate(1.4);
    border: 1px solid oklch(1 0 0 / 0.06);
    border-radius: 999px;
    box-shadow: 0 12px 40px oklch(0.05 0 0 / 0.55), 0 0 0 1px oklch(0 0 0 / 0.4);
    transform: translateY(0);
    transition: transform 300ms var(--ease-out), opacity 300ms var(--ease-out);
  }
  .mobile-cta.is-hidden { transform: translateY(120%); opacity: 0; }
  .mobile-cta .btn {
    flex: 1;
    padding: 11px var(--space-4);
    font-size: var(--text-sm);
    min-height: 44px;
    border-radius: 999px;
    border: none;
    letter-spacing: 0.16em;
  }
  .mobile-cta .btn-primary {
    background: var(--accent);
    color: var(--accent-contrast);
  }
  .mobile-cta .btn-outline {
    background: transparent;
    color: var(--text);
    border: 1px solid oklch(1 0 0 / 0.12);
  }
  .mobile-cta .btn-icon {
    flex: 0 0 44px;
    min-width: 44px;
    padding: 0;
    background: transparent;
    color: var(--text);
    border: 1px solid oklch(1 0 0 / 0.12);
  }
  /* Theme bar offset above floating pill */
  .theme-bar { bottom: calc(64px + var(--space-4) + env(safe-area-inset-bottom, 0px)); }
}
