/* =========================================================
   BIRUNI PEST CONTROL
   Animation & Motion System
   File: assets/css/animation.css
   ========================================================= */


/* =========================================================
   1. MOTION TOKENS
   ========================================================= */

:root {
  --motion-fast: 180ms;
  --motion-base: 420ms;
  --motion-slow: 700ms;
  --motion-extra-slow: 1100ms;

  --ease-standard: cubic-bezier(0.2, 0.8, 0.2, 1);
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-smooth: cubic-bezier(0.65, 0, 0.35, 1);
  --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
}


/* =========================================================
   2. SCROLL REVEAL FOUNDATION
   JavaScript menambahkan class .is-visible
   ========================================================= */

[data-reveal] {
  visibility: hidden;
  opacity: 0;

  transition:
    opacity var(--motion-slow) var(--ease-out),
    transform var(--motion-slow) var(--ease-out),
    filter var(--motion-slow) var(--ease-out);

  transition-delay: var(--reveal-delay, 0ms);
}

[data-reveal].is-visible {
  visibility: visible;
  opacity: 1;
  transform: translate3d(0, 0, 0) scale(1);
  filter: blur(0);
}


/* Fade up */

[data-reveal="fade-up"] {
  transform: translate3d(0, 38px, 0);
}


/* Fade down */

[data-reveal="fade-down"] {
  transform: translate3d(0, -38px, 0);
}


/* Fade left */

[data-reveal="fade-left"] {
  transform: translate3d(42px, 0, 0);
}


/* Fade right */

[data-reveal="fade-right"] {
  transform: translate3d(-42px, 0, 0);
}


/* Scale */

[data-reveal="scale"] {
  transform: scale(0.94);
}


/* Zoom */

[data-reveal="zoom"] {
  transform: scale(1.08);
}


/* Blur */

[data-reveal="blur"] {
  transform: translate3d(0, 20px, 0);
  filter: blur(10px);
}


/* Reveal delay helpers */

.reveal-delay-1 {
  --reveal-delay: 80ms;
}

.reveal-delay-2 {
  --reveal-delay: 160ms;
}

.reveal-delay-3 {
  --reveal-delay: 240ms;
}

.reveal-delay-4 {
  --reveal-delay: 320ms;
}

.reveal-delay-5 {
  --reveal-delay: 400ms;
}

.reveal-delay-6 {
  --reveal-delay: 480ms;
}


/* =========================================================
   3. STAGGERED REVEAL
   Parent memperoleh class .is-visible
   ========================================================= */

[data-stagger] > * {
  opacity: 0;
  transform: translate3d(0, 30px, 0);

  transition:
    opacity var(--motion-slow) var(--ease-out),
    transform var(--motion-slow) var(--ease-out);

  transition-delay:
    calc(
      var(--stagger-index, 0) *
      var(--stagger-step, 90ms)
    );
}

[data-stagger].is-visible > * {
  opacity: 1;
  transform: translate3d(0, 0, 0);
}

[data-stagger="fast"] {
  --stagger-step: 60ms;
}

[data-stagger="slow"] {
  --stagger-step: 130ms;
}


/* Maksimal 12 child otomatis */

[data-stagger] > *:nth-child(1) {
  --stagger-index: 1;
}

[data-stagger] > *:nth-child(2) {
  --stagger-index: 2;
}

[data-stagger] > *:nth-child(3) {
  --stagger-index: 3;
}

[data-stagger] > *:nth-child(4) {
  --stagger-index: 4;
}

[data-stagger] > *:nth-child(5) {
  --stagger-index: 5;
}

[data-stagger] > *:nth-child(6) {
  --stagger-index: 6;
}

[data-stagger] > *:nth-child(7) {
  --stagger-index: 7;
}

[data-stagger] > *:nth-child(8) {
  --stagger-index: 8;
}

[data-stagger] > *:nth-child(9) {
  --stagger-index: 9;
}

[data-stagger] > *:nth-child(10) {
  --stagger-index: 10;
}

[data-stagger] > *:nth-child(11) {
  --stagger-index: 11;
}

[data-stagger] > *:nth-child(12) {
  --stagger-index: 12;
}


/* =========================================================
   4. IMAGE REVEAL
   ========================================================= */

.image-reveal {
  position: relative;
  overflow: hidden;
}

.image-reveal img {
  transform: scale(1.08);

  transition:
    transform var(--motion-extra-slow) var(--ease-out),
    filter var(--motion-slow) var(--ease-out);
}

.image-reveal::after {
  position: absolute;
  inset: 0;
  z-index: 2;

  content: "";
  pointer-events: none;

  background-color: var(--color-primary-dark);
  transform-origin: right center;
  transform: scaleX(1);

  transition:
    transform var(--motion-extra-slow) var(--ease-smooth);

  transition-delay: var(--image-delay, 100ms);
}

.image-reveal.is-visible::after {
  transform: scaleX(0);
}

.image-reveal.is-visible img {
  transform: scale(1);
}


/* Orange variation */

.image-reveal.is-accent::after {
  background-color: var(--color-accent);
}


/* Vertical reveal */

.image-reveal.is-vertical::after {
  transform-origin: center bottom;
  transform: scaleY(1);
}

.image-reveal.is-vertical.is-visible::after {
  transform: scaleY(0);
}


/* =========================================================
   5. TEXT REVEAL
   ========================================================= */

.text-reveal {
  overflow: hidden;
}

.text-reveal > span {
  display: inline-block;

  opacity: 0;
  transform: translate3d(0, 110%, 0);

  transition:
    opacity var(--motion-slow) var(--ease-out),
    transform var(--motion-slow) var(--ease-out);

  transition-delay: var(--text-delay, 0ms);
}

.text-reveal.is-visible > span {
  opacity: 1;
  transform: translate3d(0, 0, 0);
}


/* =========================================================
   6. PARALLAX FOUNDATION
   Transform diatur oleh parallax.js
   ========================================================= */

[data-parallax] {
  --parallax-x: 0px;
  --parallax-y: 0px;
  --parallax-rotate: 0deg;
  --parallax-scale: 1;

  transform:
    translate3d(
      var(--parallax-x),
      var(--parallax-y),
      0
    )
    rotate(var(--parallax-rotate))
    scale(var(--parallax-scale));

  transform-origin: center;
  backface-visibility: hidden;
  will-change: auto;
}

[data-parallax].is-parallax-active {
  will-change: transform;
}

.parallax-layer {
  position: absolute;
  pointer-events: none;
  user-select: none;
}

.parallax-layer.is-behind {
  z-index: -1;
}

.parallax-layer.is-front {
  z-index: 4;
}


/* =========================================================
   7. HERO ENTRANCE
   ========================================================= */

.hero .badge,
.hero .hero-title,
.hero .hero-description,
.hero .hero-actions,
.hero .hero-trust,
.hero .hero-media {
  opacity: 0;
  transform: translate3d(0, 26px, 0);

  animation:
    hero-content-enter
    var(--motion-slow)
    var(--ease-out)
    forwards;
}

.hero .badge {
  animation-delay: 80ms;
}

.hero .hero-title {
  animation-delay: 160ms;
}

.hero .hero-description {
  animation-delay: 240ms;
}

.hero .hero-actions {
  animation-delay: 320ms;
}

.hero .hero-trust {
  animation-delay: 400ms;
}

.hero .hero-media {
  transform: translate3d(30px, 20px, 0) scale(0.98);
  animation-delay: 220ms;
  animation-duration: 900ms;
}


/* =========================================================
   8. FLOATING ELEMENTS
   ========================================================= */

.animate-float {
  animation:
    floating-element
    5.5s
    ease-in-out
    infinite;
}

.animate-float-slow {
  animation:
    floating-element
    8s
    ease-in-out
    infinite;
}

.animate-float-reverse {
  animation:
    floating-element-reverse
    6.5s
    ease-in-out
    infinite;
}

.animate-rotate-slow {
  animation:
    rotate-slow
    22s
    linear
    infinite;
}

.animate-pulse-soft {
  animation:
    pulse-soft
    2.8s
    ease-in-out
    infinite;
}

.animate-breathe {
  animation:
    breathe
    5s
    ease-in-out
    infinite;
}


/* =========================================================
   9. DECORATIVE SHAPES
   ========================================================= */

.decorative-orbit {
  position: absolute;

  width: clamp(180px, 25vw, 340px);
  aspect-ratio: 1;

  pointer-events: none;
  border: 1px solid rgba(0, 153, 51, 0.2);
  border-radius: 50%;
}

.decorative-orbit::before,
.decorative-orbit::after {
  position: absolute;

  content: "";

  border-radius: 50%;
}

.decorative-orbit::before {
  top: 12%;
  right: 8%;

  width: 16px;
  height: 16px;

  background-color: var(--color-accent);
  box-shadow: 0 0 0 9px rgba(255, 102, 0, 0.12);
}

.decorative-orbit::after {
  bottom: 16%;
  left: 4%;

  width: 11px;
  height: 11px;

  background-color: var(--color-primary);
  box-shadow: 0 0 0 7px rgba(0, 153, 51, 0.1);
}

.decorative-dot-grid {
  position: absolute;

  width: 130px;
  height: 130px;

  pointer-events: none;
  opacity: 0.28;

  background-image:
    radial-gradient(
      circle,
      var(--color-primary) 2px,
      transparent 2.5px
    );

  background-size: 18px 18px;
}

.decorative-blur {
  position: absolute;

  width: clamp(180px, 30vw, 420px);
  aspect-ratio: 1;

  pointer-events: none;

  border-radius: 50%;
  background-color: rgba(0, 153, 51, 0.14);
  filter: blur(70px);
}

.decorative-blur.is-accent {
  background-color: rgba(255, 102, 0, 0.13);
}


/* =========================================================
   10. CARD MICRO-INTERACTIONS
   ========================================================= */

.card,
.service-card,
.industry-card,
.contact-card,
.stat-card {
  transform: translateZ(0);
  backface-visibility: hidden;
}

.card::before,
.service-card::before {
  position: absolute;
  inset: 0;

  content: "";
  pointer-events: none;

  border-radius: inherit;

  background:
    linear-gradient(
      135deg,
      rgba(255, 255, 255, 0.7),
      transparent 38%
    );

  opacity: 0;

  transition: opacity var(--transition-base);
}

.card:hover::before,
.service-card:hover::before {
  opacity: 1;
}

.card-icon,
.feature-icon,
.contact-card-icon {
  transition:
    color var(--transition-base),
    background-color var(--transition-base),
    transform var(--transition-base);
}

.card:hover .card-icon {
  color: var(--color-white);
  background-color: var(--color-primary);
  transform: rotate(-4deg) scale(1.06);
}

.contact-card:hover .contact-card-icon {
  color: var(--color-white);
  background-color: var(--color-primary);
  transform: scale(1.06);
}


/* =========================================================
   11. BUTTON MICRO-INTERACTIONS
   ========================================================= */

.btn .btn-icon {
  transition: transform var(--transition-fast);
}

.btn:hover .btn-icon {
  transform: translateX(3px);
}

.btn-icon.is-left {
  transition: transform var(--transition-fast);
}

.btn:hover .btn-icon.is-left {
  transform: translateX(-3px);
}

.btn::before {
  position: absolute;
  top: 0;
  left: -120%;

  width: 80%;
  height: 100%;

  content: "";
  pointer-events: none;

  background:
    linear-gradient(
      110deg,
      transparent,
      rgba(255, 255, 255, 0.22),
      transparent
    );

  transform: skewX(-18deg);

  transition: left 650ms var(--ease-standard);
}

.btn:hover::before {
  left: 140%;
}


/* =========================================================
   12. LINK UNDERLINE ANIMATION
   ========================================================= */

.link-animated {
  position: relative;
  display: inline-flex;
  width: fit-content;
}

.link-animated::after {
  position: absolute;
  right: 0;
  bottom: -3px;
  left: 0;

  height: 2px;

  content: "";

  background-color: currentColor;

  transform-origin: right center;
  transform: scaleX(0);

  transition:
    transform var(--transition-base) var(--ease-out);
}

.link-animated:hover::after,
.link-animated:focus-visible::after {
  transform-origin: left center;
  transform: scaleX(1);
}


/* =========================================================
   13. ICON ANIMATIONS
   ========================================================= */

.icon-bounce:hover svg,
a:hover .icon-bounce svg,
button:hover .icon-bounce svg {
  animation:
    icon-bounce
    520ms
    var(--ease-bounce);
}

.icon-shake:hover svg,
a:hover .icon-shake svg,
button:hover .icon-shake svg {
  animation:
    icon-shake
    480ms
    ease-in-out;
}

.icon-rotate:hover svg,
a:hover .icon-rotate svg,
button:hover .icon-rotate svg {
  transform: rotate(12deg);
}

.icon-rotate svg {
  transition: transform var(--transition-base);
}


/* =========================================================
   14. SCROLL INDICATOR
   ========================================================= */

.scroll-indicator {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;

  font-size: var(--font-size-xs);
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;

  color: var(--color-muted);
}

.scroll-indicator-mouse {
  position: relative;

  width: 26px;
  height: 42px;

  border: 2px solid currentColor;
  border-radius: var(--radius-pill);
}

.scroll-indicator-mouse::before {
  position: absolute;
  top: 8px;
  left: 50%;

  width: 4px;
  height: 8px;

  content: "";

  border-radius: var(--radius-pill);
  background-color: currentColor;

  transform: translateX(-50%);

  animation:
    scroll-wheel
    1.8s
    ease-in-out
    infinite;
}


/* =========================================================
   15. ACTIVE NAVIGATION INDICATOR
   ========================================================= */

@media (min-width: 992px) {
  .nav-link::after {
    position: absolute;
    right: 16px;
    bottom: 5px;
    left: 16px;

    height: 2px;

    content: "";

    border-radius: var(--radius-pill);
    background-color: var(--color-accent);

    transform: scaleX(0);
    transform-origin: center;

    transition:
      transform var(--transition-base) var(--ease-out);
  }

  .nav-link:hover::after,
  .nav-link.is-active::after,
  .nav-link[aria-current="page"]::after {
    transform: scaleX(1);
  }

  .site-header.is-dark:not(.is-scrolled) .nav-link::after {
    background-color: var(--color-accent);
  }
}


/* =========================================================
   16. ACCORDION MOTION
   ========================================================= */

.accordion-trigger {
  transition:
    color var(--transition-fast),
    background-color var(--transition-fast);
}

.accordion-item.is-open .accordion-trigger {
  color: var(--color-primary-dark);
  background-color: rgba(234, 246, 237, 0.56);
}

.accordion-content {
  opacity: 0;
  transform: translate3d(0, -8px, 0);

  transition:
    opacity var(--transition-base),
    transform var(--transition-base);
}

.accordion-item.is-open .accordion-content {
  opacity: 1;
  transform: translate3d(0, 0, 0);
}


/* =========================================================
   17. FORM INTERACTIONS
   ========================================================= */

.form-label {
  transition: color var(--transition-fast);
}

.form-group:focus-within .form-label {
  color: var(--color-primary-dark);
}

.form-group.has-success .form-control {
  border-color: var(--color-success);
}

.form-group.has-success .form-label {
  color: var(--color-success);
}

.form-status {
  opacity: 0;
  transform: translate3d(0, 8px, 0);

  transition:
    opacity var(--transition-base),
    transform var(--transition-base);
}

.form-status.is-visible {
  opacity: 1;
  transform: translate3d(0, 0, 0);
}


/* =========================================================
   18. FLOATING WHATSAPP ATTENTION
   ========================================================= */

.floating-whatsapp::after {
  position: absolute;
  inset: -6px;
  z-index: -1;

  content: "";

  pointer-events: none;

  border: 2px solid rgba(31, 168, 85, 0.45);
  border-radius: inherit;

  animation:
    whatsapp-pulse
    2.6s
    ease-out
    infinite;
}


/* =========================================================
   19. PAGE TRANSITION
   ========================================================= */

.page-wrapper {
  animation:
    page-enter
    500ms
    var(--ease-out)
    both;
}


/* =========================================================
   20. SKELETON LOADING
   ========================================================= */

.skeleton {
  position: relative;
  overflow: hidden;

  color: transparent;
  background-color: var(--color-surface-soft);
  border-radius: var(--radius-sm);
}

.skeleton::after {
  position: absolute;
  inset: 0;

  content: "";

  background:
    linear-gradient(
      90deg,
      transparent,
      rgba(255, 255, 255, 0.72),
      transparent
    );

  transform: translateX(-100%);

  animation:
    skeleton-loading
    1.5s
    ease-in-out
    infinite;
}

.skeleton-text {
  min-height: 14px;
}

.skeleton-title {
  min-height: 32px;
}

.skeleton-image {
  min-height: 240px;
}


/* =========================================================
   21. KEYFRAMES
   ========================================================= */

@keyframes hero-content-enter {
  from {
    opacity: 0;
    transform: translate3d(0, 26px, 0);
  }

  to {
    opacity: 1;
    transform: translate3d(0, 0, 0) scale(1);
  }
}

@keyframes floating-element {
  0%,
  100% {
    transform: translate3d(0, 0, 0);
  }

  50% {
    transform: translate3d(0, -14px, 0);
  }
}

@keyframes floating-element-reverse {
  0%,
  100% {
    transform: translate3d(0, -10px, 0);
  }

  50% {
    transform: translate3d(0, 8px, 0);
  }
}

@keyframes rotate-slow {
  from {
    transform: rotate(0deg);
  }

  to {
    transform: rotate(360deg);
  }
}

@keyframes pulse-soft {
  0%,
  100% {
    opacity: 0.72;
    transform: scale(1);
  }

  50% {
    opacity: 1;
    transform: scale(1.04);
  }
}

@keyframes breathe {
  0%,
  100% {
    transform: scale(1);
  }

  50% {
    transform: scale(1.025);
  }
}

@keyframes icon-bounce {
  0%,
  100% {
    transform: translateY(0);
  }

  45% {
    transform: translateY(-5px);
  }

  70% {
    transform: translateY(2px);
  }
}

@keyframes icon-shake {
  0%,
  100% {
    transform: rotate(0deg);
  }

  25% {
    transform: rotate(-8deg);
  }

  50% {
    transform: rotate(8deg);
  }

  75% {
    transform: rotate(-4deg);
  }
}

@keyframes scroll-wheel {
  0% {
    opacity: 0;
    transform: translate(-50%, 0);
  }

  30% {
    opacity: 1;
  }

  100% {
    opacity: 0;
    transform: translate(-50%, 12px);
  }
}

@keyframes whatsapp-pulse {
  0% {
    opacity: 0.75;
    transform: scale(0.94);
  }

  70%,
  100% {
    opacity: 0;
    transform: scale(1.22);
  }
}

@keyframes page-enter {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

@keyframes skeleton-loading {
  to {
    transform: translateX(100%);
  }
}


/* =========================================================
   22. MOBILE PERFORMANCE
   ========================================================= */

@media (max-width: 767px) {
  [data-reveal="fade-left"],
  [data-reveal="fade-right"] {
    transform: translate3d(0, 30px, 0);
  }

  [data-reveal] {
    transition-duration: 560ms;
  }

  .animate-rotate-slow {
    animation-duration: 28s;
  }

  .hero .hero-media {
    transform: translate3d(0, 20px, 0) scale(0.98);
  }

  .decorative-blur {
    filter: blur(48px);
  }
}


/* =========================================================
   23. TOUCH DEVICE
   ========================================================= */

@media (hover: none) {
  .card:hover,
  .service-card:hover,
  .industry-card:hover,
  .contact-card:hover,
  .btn:hover,
  .floating-whatsapp:hover {
    transform: none;
  }

  .card:hover .card-icon,
  .contact-card:hover .contact-card-icon {
    transform: none;
  }

  .btn::before {
    display: none;
  }

  .service-card:hover .service-card-media img,
  .industry-card:hover .industry-card-background img {
    transform: none;
  }
}


/* =========================================================
   24. REDUCED MOTION
   ========================================================= */

@media (prefers-reduced-motion: reduce) {
  [data-reveal],
  [data-stagger] > *,
  .text-reveal > span,
  .image-reveal img,
  .accordion-content,
  .form-status {
    visibility: visible;
    opacity: 1;
    transform: none;
    filter: none;
  }

  .image-reveal::after {
    display: none;
  }

  .hero .badge,
  .hero .hero-title,
  .hero .hero-description,
  .hero .hero-actions,
  .hero .hero-trust,
  .hero .hero-media {
    opacity: 1;
    transform: none;
    animation: none;
  }

  .animate-float,
  .animate-float-slow,
  .animate-float-reverse,
  .animate-rotate-slow,
  .animate-pulse-soft,
  .animate-breathe,
  .floating-whatsapp::after,
  .scroll-indicator-mouse::before,
  .skeleton::after {
    animation: none;
  }

  [data-parallax] {
    transform: none !important;
    will-change: auto;
  }

  .page-wrapper {
    animation: none;
  }
}


/* =========================================================
   25. PRINT
   ========================================================= */

@media print {
  [data-reveal],
  [data-stagger] > *,
  .text-reveal > span,
  .image-reveal img {
    visibility: visible !important;
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
  }

  .image-reveal::after,
  .decorative-orbit,
  .decorative-dot-grid,
  .decorative-blur,
  .scroll-indicator {
    display: none !important;
  }
}