/* ==========================================================================
   Reveal-on-scroll system + loader + ambient motion
   Re-triggers on re-entry (JS toggles .is-in on IntersectionObserver, both
   directions) — not a "play once" library.
   ========================================================================== */

[data-reveal] {
  opacity: 0;
  transition: opacity var(--dur-slow) var(--ease-out), transform var(--dur-slow) var(--ease-out), filter var(--dur-slow) var(--ease-out);
  will-change: transform, opacity;
}

[data-reveal="up"] {
  transform: translateY(28px);
}
[data-reveal="down"] {
  transform: translateY(-28px);
}
[data-reveal="left"] {
  transform: translateX(32px);
}
[data-reveal="right"] {
  transform: translateX(-32px);
}
[data-reveal="scale"] {
  transform: scale(0.92);
}
[data-reveal="blur"] {
  filter: blur(10px);
  transform: translateY(14px);
}
[data-reveal="clip"] {
  clip-path: inset(0 0 100% 0);
  transform: none;
  transition: clip-path var(--dur-slow) var(--ease-out);
}

[data-reveal].is-in {
  opacity: 1;
  transform: none;
  filter: blur(0);
  clip-path: inset(0 0 0% 0);
}

/* stagger children via CSS var set inline by JS: --stag-i */
[data-reveal-group] > [data-reveal] {
  transition-delay: calc(var(--stag-i, 0) * 90ms);
}

@media (prefers-reduced-motion: reduce) {
  [data-reveal] {
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
    clip-path: none !important;
    transition: none !important;
  }
}

/* --- Loader ------------------------------------------------------------ */
#loader {
  position: fixed;
  inset: 0;
  z-index: 999;
  display: grid;
  place-items: center;
  background: var(--ink);
  transition: opacity 520ms var(--ease-in-out), visibility 520ms var(--ease-in-out);
}

#loader[data-done="true"] {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

.loader-mark {
  position: relative;
  width: 84px;
  height: 84px;
}

.loader-mark svg {
  width: 100%;
  height: 100%;
}

.loader-mark circle {
  fill: none;
  stroke: var(--gold-400);
  stroke-width: 1.4;
  stroke-linecap: round;
  stroke-dasharray: 289;
  stroke-dashoffset: 289;
  animation: loader-draw 1100ms var(--ease-out) forwards;
}

.loader-mark .loader-crest {
  opacity: 0;
  animation: loader-fade 500ms var(--ease-out) 550ms forwards;
}

@keyframes loader-draw {
  to {
    stroke-dashoffset: 0;
  }
}

@keyframes loader-fade {
  to {
    opacity: 1;
  }
}

.loader-label {
  position: absolute;
  bottom: -2.1rem;
  left: 50%;
  translate: -50% 0;
  font-size: 0.62rem;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--text-3);
  white-space: nowrap;
}

/* --- Ambient marquee (trust strip) -------------------------------------- */
.marquee {
  overflow: hidden;
  mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}

.marquee-track {
  display: flex;
  width: max-content;
  animation: marquee-scroll 34s linear infinite;
}

.marquee:hover .marquee-track,
.marquee:focus-within .marquee-track {
  animation-play-state: paused;
}

@keyframes marquee-scroll {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-50%);
  }
}

@media (prefers-reduced-motion: reduce) {
  .marquee-track {
    animation: none;
  }
}

/* --- Floating ambient (hero / cert layers) ------------------------------ */
@keyframes float-y {
  0%,
  100% {
    transform: translateY(0) rotate(var(--rot, 0deg));
  }
  50% {
    transform: translateY(-10px) rotate(var(--rot, 0deg));
  }
}

.float {
  animation: float-y 6s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
  .float {
    animation: none;
  }
}

/* --- Pulse dot (live / activo indicator) -------------------------------- */
@keyframes pulse-ring {
  0% {
    box-shadow: 0 0 0 0 rgba(111, 191, 139, 0.55);
  }
  100% {
    box-shadow: 0 0 0 9px rgba(111, 191, 139, 0);
  }
}

.pulse-dot {
  position: relative;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--success);
  animation: pulse-ring 1.8s ease-out infinite;
}

/* --- Counter number roll ------------------------------------------------ */
[data-count] {
  font-variant-numeric: tabular-nums;
}
