/* Greenfield Animations — modern minimal entrance effects.
   Subtle, mask-based reveals with no coloured overlays or directional slides. */

@media (prefers-reduced-motion: no-preference) {

  .gf-anim {
    opacity: 0;
    transition:
      opacity 1300ms cubic-bezier(0.22, 1, 0.36, 1),
      transform 1300ms cubic-bezier(0.22, 1, 0.36, 1),
      clip-path 1500ms cubic-bezier(0.22, 1, 0.36, 1),
      filter 1300ms cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: var(--gf-delay, 0ms);
    will-change: transform, opacity, filter;
  }

  /* === Initial states === */

  /* Pure fade — no movement, just opacity */
  .gf-fade           {  }

  /* Subtle vertical fade — small y-shift */
  .gf-fade-up        { transform: translate3d(0, 16px, 0); }
  .gf-fade-down      { transform: translate3d(0, -12px, 0); }

  /* Modern "loading focus" — content arrives slightly blurred and scaled,
     then settles. Used for hero/feature areas. */
  .gf-blur-in        { transform: scale(1.02); filter: blur(8px); }

  /* Image reveal: clip-path mask + subtle scale on the IMG element only,
     not the widget container. Two reasons:
     1. Outer widget keeps real bounding box (IntersectionObserver works).
     2. Widgets that escape their container with full-bleed background
        images (e.g. quote galleries, hero overlays) won't get clipped to
        the narrow column width. Those still get a clean opacity fade. */
  .gf-image-reveal {
    opacity: 0;
  }
  .gf-image-reveal .elementor-image,
  .gf-image-reveal img {
    clip-path: inset(0 0 100% 0);
    transform: scale(1.04);
    transition:
      clip-path 1500ms cubic-bezier(0.22, 1, 0.36, 1),
      transform 1500ms cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: var(--gf-delay, 0ms);
  }
  .gf-image-reveal.gf-in-view { opacity: 1; }
  .gf-image-reveal.gf-in-view .elementor-image,
  .gf-image-reveal.gf-in-view img {
    clip-path: inset(0 0 0 0);
    transform: scale(1);
  }

  /* Mask up — text block reveal: clip-path on inner container only. */
  .gf-mask-up { opacity: 0; }
  .gf-mask-up > .elementor-widget-container {
    clip-path: inset(0 0 100% 0);
    transition: clip-path 1500ms cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: var(--gf-delay, 0ms);
  }
  .gf-mask-up.gf-in-view { opacity: 1; }
  .gf-mask-up.gf-in-view > .elementor-widget-container { clip-path: inset(0 0 0 0); }

  /* Counters / numerics — gentle scale */
  .gf-zoom-in        { transform: scale(0.96); }

  /* Divider — line grows from its visual anchor (alignment-aware via JS) */
  .gf-divider-line {
    opacity: 1 !important;
    transform: none !important;
    position: relative;
  }
  .gf-divider-line .elementor-divider-separator,
  .gf-divider-line hr {
    transform: scaleX(0);
    transform-origin: center;
    transition: transform 1400ms cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: var(--gf-delay, 0ms);
  }
  .gf-divider-line.gf-align-left  .elementor-divider-separator,
  .gf-divider-line.gf-align-left  hr  { transform-origin: left  center; }
  .gf-divider-line.gf-align-right .elementor-divider-separator,
  .gf-divider-line.gf-align-right hr  { transform-origin: right center; }
  .gf-divider-line.gf-in-view .elementor-divider-separator,
  .gf-divider-line.gf-in-view hr      { transform: scaleX(1); }

  /* === In-view states (resolves to neutral) === */
  .gf-in-view.gf-fade,
  .gf-in-view.gf-fade-up,
  .gf-in-view.gf-fade-down,
  .gf-in-view.gf-zoom-in {
    opacity: 1;
    transform: none;
  }
  .gf-in-view.gf-blur-in {
    opacity: 1;
    transform: none;
    filter: none;
  }

  /* === Word-stagger reveal for headings === */
  .gf-words {
    opacity: 1 !important;
    transform: none !important;
    transition: none;
  }
  .gf-word-mask {
    display: inline-block;
    overflow: hidden;
    vertical-align: top;
    line-height: inherit;
    padding-bottom: 0.05em;
  }
  .gf-word-inner {
    display: inline-block;
    transform: translate3d(0, 105%, 0);
    transition: transform 1100ms cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: var(--gf-word-delay, 0ms);
    will-change: transform;
  }
  .gf-words.gf-in-view .gf-word-inner { transform: translate3d(0, 0, 0); }
  .gf-word-space { display: inline-block; white-space: pre; }
}

/* Reduced-motion: bypass all animation */
@media (prefers-reduced-motion: reduce) {
  .gf-anim, .gf-words, .gf-word-inner, .gf-image-reveal,
  .gf-image-reveal .elementor-image, .gf-image-reveal img,
  .gf-mask-up, .gf-mask-up > .elementor-widget-container,
  .gf-blur-in, .gf-divider-line .elementor-divider-separator {
    opacity: 1 !important;
    transform: none !important;
    clip-path: none !important;
    filter: none !important;
  }
}
