+
+
+
+
+
+``` ### What's happening and why | Concern | Decision | |---|---| | **FOUC — heading** | CSS
+`opacity: 0` in `
+ ` (equivalent to `generate(config)` server output) + `data-interact-initial="true"` so the runtime
+ coordinates keyframe application. `fill: 'both'` holds the final visible state. | | **FOUC —
+ icon** | Manual `opacity: 0; transform: scale(0)` CSS. `generate()` only covers `viewEnter + once`
+ same-element cases, so the icon needs an explicit guard. `ExpandIn` + `fill: 'both'` takes over
+ and holds opacity/scale after the animation ends. | | **Chaining** | `effectId: 'heading-fade-in'`
+ on the `FadeIn` effect is the stable handle. The `animationEnd` interaction references that same
+ ID via `params.effectId` — the runtime fires it the moment the heading's `FadeIn` completes. | |
+ **`triggerType: 'once'`** | Mandatory when source and target are the same element on `viewEnter`;
+ animating the observed element could push it out of the viewport and cause rapid re-triggers. | |
+ **Reduced motion** | `conditions: ['reduced-motion']` on both interactions suppresses all
+ animations. The `@media (prefers-reduced-motion: reduce)` CSS overrides the initial-hidden rules
+ so both elements remain visible without any JS involvement. | | **`registerEffects` / `create` /
+ `destroy`** | `registerEffects` runs first (required before `create` when using `namedEffect`).
+ `instance.destroy()` in `beforeunload` cleans up all observers and listeners. |
+
diff --git a/packages/interact-debug/eval-raw-output/hover-interest.html b/packages/interact-debug/eval-raw-output/hover-interest.html
new file mode 100644
index 00000000..dc09ef00
--- /dev/null
+++ b/packages/interact-debug/eval-raw-output/hover-interest.html
@@ -0,0 +1,299 @@
+```html
+
+
+
+
+
+ Card Hover Scale — @wix/interact
+
+
+
+
+
+
+
+
+
+ @wix/interact
+
+
Scale on Hover
+
+ Mouse over or focus this card for a smooth scale-up animation. Uses
+ triggerType "alternate" so it reverses gracefully on mouse-leave
+ or blur.
+
+
+
+
+
+
+
+
Hover the card — or Tab to focus it
+
+
+
+
+``` ### Key decisions & rules applied | Rule | Implementation | |---|---| | **Hit-area shift** |
+`.card-outer` is the hover source (never transforms); `.card-inner` is the animation target,
+resolved via `selector: '.card-inner'` on the shared effect. This prevents the scaled element from
+shifting the pointer hit-area and causing flicker. | | **`fill: 'both'`** | Required for
+`triggerType: 'alternate'` so the animation holds its state between hover enter/leave. | | **a11y
+pairing** | `hover` + `interest` interactions share the same `effectId` reference.
+`Interact.allowA11yTriggers = true` is set before `create()`. `.card-outer` has `tabindex="0"` so it
+receives focus events. | | **Reduced motion** | `conditions: ['reduced-motion']` on both
+interactions suppresses the animation when `prefers-reduced-motion: reduce` is active. | | **Shared
+effect registry** | The `'card-scale-up'` entry in `effects` is defined once and referenced by both
+interactions — no duplication. | | **Destroy** | `instance.destroy()` is called on `window unload`
+to clean up all listeners and running animations. |
diff --git a/packages/interact-debug/eval-raw-output/pointerMove-tracking.html b/packages/interact-debug/eval-raw-output/pointerMove-tracking.html
new file mode 100644
index 00000000..1c8afa49
--- /dev/null
+++ b/packages/interact-debug/eval-raw-output/pointerMove-tracking.html
@@ -0,0 +1,253 @@
+
+
+
+
+
+ 3D Tilt Card — @wix/interact
+
+
+
+
+
+ The card below glides in as it enters the viewport and glides back out when you scroll past
+ it.
+
+
+
+ Scroll
+
+
+
+
+
+
+
+
+
+
+
+ ✦ Featured
+
Scroll-driven Entrance
+
+ Built with viewEnter + triggerType 'alternate' and
+ the GlideIn preset. Animates in on viewport entry and reverses out
+ on exit — GPU-accelerated and accessible by default.
+
+
+
+
+
60fps
+
Smooth
+
+
+
GPU
+
Accelerated
+
+
+
A11y
+
Accessible
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+``` Here's a breakdown of every key decision made: ### Why separate source (`card-source`) and
+target (`card`) elements The **CRITICAL** rule for `viewEnter` + `triggerType: 'alternate'` forbids
+using the same element as both trigger source and animation target. If the card itself were
+observed, the `GlideIn` transform would push it out of the viewport mid-animation, causing an
+infinite enter/exit loop. The outer `
+
+ ` is observed; the inner `.card` is animated. ### Why `opacity: 0` is set in CSS (no
+ `data-interact-initial`) `data-interact-initial` (FOUC prevention) is **only valid** for
+ `triggerType: 'once'`. For `alternate`, the starting keyframe must be applied manually. Setting
+ `opacity: 0` in CSS ensures the card is invisible before the animation attaches. `fill: 'both'`
+ then takes over and holds both the start and end keyframes during the animation lifecycle. ### Why
+ `fill: 'both'` Required for `alternate` — `backwards` applies the start keyframe during any delay,
+ and `forwards` holds the final visible state while the card is in view. ### `reduced-motion`
+ condition Placed on the interaction (not just the effect) to gate the **entire trigger**, so no
+ animation runs at all for users with `prefers-reduced-motion: reduce`. ### `registerEffects()` →
+ `Interact.create()` → `destroy()` order Presets must be registered before `create()` or
+ `namedEffect: { type: 'GlideIn' }` won't resolve. The instance is stored and destroyed on
+ `beforeunload` to prevent stale listeners.
+
+ Triggered by viewEnter with triggerType: 'once',
+ this section uses the FadeIn preset from
+ @wix/motion-presets. FOUC is prevented via
+ generate(config) and data-interact-initial.
+
+
+
+
+
+
+
+
+
+```
+
+Key decisions made:
+
+| Choice | Reason |
+|---|---|
+| `FadeIn` preset | Canonical entrance preset; semantically matches `viewEnter` trigger |
+| `triggerType: 'once'` | Source and target are the **same** element — required by the rules |
+| `fill: 'backwards'` | `FadeIn` ends at natural `opacity: 1`, so only the backwards fill (applying `opacity: 0` during delay) is needed |
+| `threshold: 0.2` | Animation fires when 20% of the section enters the viewport — avoids triggering on a single pixel |
+| `conditions: ['reduced-motion']` | Gates the entire entrance interaction for users with `prefers-reduced-motion: reduce` |
+| Dual FOUC guard | Static CSS in `
+
+
+ ${html}
+
+
+