accessify-widget 0.3.55 → 0.3.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { d, i } from "./index-C3zhg2nP.js";
1
+ import { d, i } from "./index--LDQcJNd.js";
2
2
  export {
3
3
  d as destroy,
4
4
  i as init
@@ -67,32 +67,44 @@ function createAnimationStopModule() {
67
67
  }
68
68
  frozenElements.clear();
69
69
  }
70
- function onPointerEnter(e) {
71
- const target = e.target;
72
- if (!target || !(target instanceof HTMLElement)) return;
73
- if (isWidgetInternal(target)) return;
74
- let n = target;
70
+ const STRUCTURAL_TAGS = /* @__PURE__ */ new Set([
71
+ "HTML",
72
+ "BODY",
73
+ "MAIN",
74
+ "SECTION",
75
+ "HEADER",
76
+ "FOOTER",
77
+ "NAV",
78
+ "ARTICLE",
79
+ "ASIDE"
80
+ ]);
81
+ function findHoverTarget(start) {
82
+ let n = start;
75
83
  let hops = 0;
76
- while (n && hops < 5) {
77
- if (n instanceof HTMLElement && !isWidgetInternal(n)) {
78
- freezeElementTransform(n);
84
+ while (n && hops < 4) {
85
+ if (STRUCTURAL_TAGS.has(n.tagName)) return null;
86
+ if (isWidgetInternal(n)) return null;
87
+ const tag = n.tagName;
88
+ if (tag === "A" || tag === "BUTTON" || n.getAttribute("role") === "button" || n.hasAttribute("data-framer-name") || n.hasAttribute("data-framer-component-type")) {
89
+ return n;
79
90
  }
80
91
  n = n.parentElement;
81
92
  hops++;
82
93
  }
94
+ return null;
95
+ }
96
+ function onPointerEnter(e) {
97
+ const target = e.target;
98
+ if (!target || !(target instanceof HTMLElement)) return;
99
+ if (isWidgetInternal(target)) return;
100
+ const hoverTarget = findHoverTarget(target);
101
+ if (hoverTarget) freezeElementTransform(hoverTarget);
83
102
  }
84
103
  function onPointerLeave(e) {
85
104
  const target = e.target;
86
105
  if (!target || !(target instanceof HTMLElement)) return;
87
- let n = target;
88
- let hops = 0;
89
- while (n && hops < 5) {
90
- if (n instanceof HTMLElement) {
91
- unfreezeElementTransform(n);
92
- }
93
- n = n.parentElement;
94
- hops++;
95
- }
106
+ const hoverTarget = findHoverTarget(target);
107
+ if (hoverTarget) unfreezeElementTransform(hoverTarget);
96
108
  }
97
109
  function startHoverFreeze() {
98
110
  if (hoverEnterListener) return;
@@ -478,4 +490,4 @@ function createAnimationStopModule() {
478
490
  export {
479
491
  createAnimationStopModule as default
480
492
  };
481
- //# sourceMappingURL=animation-stop-B_Leg12C.js.map
493
+ //# sourceMappingURL=animation-stop-Ci9CX8u6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-stop-Ci9CX8u6.js","sources":["../src/features/animation-stop.ts"],"sourcesContent":["import type { FeatureModule, FeatureState } from '../types';\n\n/**\n * Animation Stop – V4 (Clean 3-Layer Approach)\n *\n * Layer 1: CSS injection — kill all CSS animations/transitions via 0.001ms duration\n * Layer 2: Web Animations API — finish() all running WAAPI animations (Framer Motion etc.)\n * Layer 3: JS library detection — GSAP globalTimeline, inline-style freeze for rAF-based libs\n * Layer 4: Media — pause videos, freeze GIFs, stop SVG SMIL, stop marquees\n *\n * + MutationObserver for dynamic content\n * + Periodic re-scan (every 500ms) for frameworks that create new animations\n *\n * DOES NOT:\n * - Monkey-patch IntersectionObserver (breaks lazy loading)\n * - Override requestAnimationFrame (breaks entire page)\n * - Override Element.prototype.animate() (too invasive)\n * - Override matchMedia (too invasive)\n * - Set opacity:1 !important via CSS (breaks modals/hidden elements)\n * - Use animation:none or transition:none (breaks JS events)\n */\n/**\n * Walk up parentNode → shadowRoot.host chain to detect if a node belongs\n * to our own widget UI. Used to skip widget-internal animations so the\n * trigger/card hover effects inside our Shadow DOM keep working.\n */\nfunction isWidgetInternal(node: Node | null | undefined): boolean {\n let n: Node | null = node || null;\n let hops = 0;\n while (n && hops < 50) {\n if (n instanceof Element) {\n if (n.id === 'accessify-root') return true;\n if (n.tagName === 'ACCESSIFY-WIDGET') return true;\n const cls = n.getAttribute?.('class');\n if (cls && /(?:^|\\s)accessify-/.test(cls)) return true;\n }\n const parent = (n as any).parentNode;\n if (parent) {\n n = parent;\n } else if ((n as any).host) {\n n = (n as any).host;\n } else {\n break;\n }\n hops++;\n }\n return false;\n}\n\nexport default function createAnimationStopModule(): FeatureModule {\n let enabled = false;\n const STYLE_ID = 'a11y-stop-animations';\n const STORAGE_KEY = 'accessify-animation-stop';\n\n // --- State ---\n let mutationObserver: MutationObserver | null = null;\n let scanInterval: ReturnType<typeof setInterval> | null = null;\n let scrollHandler: (() => void) | null = null;\n let originalVideoPlay: typeof HTMLVideoElement.prototype.play | null = null;\n let originalAnimate: typeof Element.prototype.animate | null = null;\n let pausedVideos: HTMLVideoElement[] = [];\n let gifOriginals = new Map<HTMLImageElement, string>();\n\n // --- Hover-freeze state ---\n //\n // Motion v11 / framer-motion v11 writes transform animations directly as\n // `element.style.transform = 'scale(1.5)'` via an rAF loop — NOT via the\n // WAAPI animate() API we were patching. So to kill Framer's whileHover\n // zoom we have to win the cascade against inline style writes.\n //\n // Strategy: on pointerenter for a non-widget element, snapshot that\n // element's computed transform into a CSS custom property and mark it\n // with `data-accessify-hover-freeze`. A global stylesheet rule with\n // `!important` then forces `transform: var(--accessify-orig-transform)`,\n // which beats any non-important inline style write that Motion's rAF\n // loop performs. On pointerleave we remove the mark and the custom\n // property, restoring normal behavior.\n //\n // This is surgical: it only affects elements the pointer is currently\n // over, it preserves existing layout transforms via the custom property\n // (so cookie banners / sticky elements stay where they are), and it\n // doesn't touch entry / scroll / layout animations.\n const HOVER_FREEZE_ATTR = 'data-accessify-hover-freeze';\n const ORIG_TRANSFORM_VAR = '--accessify-orig-transform';\n const HOVER_STYLE_ID = 'a11y-stop-hover-freeze';\n const frozenElements = new Set<HTMLElement>();\n let hoverEnterListener: ((e: Event) => void) | null = null;\n let hoverLeaveListener: ((e: Event) => void) | null = null;\n\n // =========================================================================\n // Layer 0a: Hover-freeze — snapshot transform on pointerenter so the\n // !important CSS rule wins over Motion's inline transform writes.\n // =========================================================================\n\n function injectHoverFreezeStyle() {\n if (document.getElementById(HOVER_STYLE_ID)) return;\n const s = document.createElement('style');\n s.id = HOVER_STYLE_ID;\n // !important beats non-important inline style writes (Motion v11 rAF loop).\n // The custom property preserves existing layout transforms so cookie\n // banners / sticky elements positioned via transform stay where they are.\n s.textContent = `[${HOVER_FREEZE_ATTR}] { transform: var(${ORIG_TRANSFORM_VAR}, none) !important; }`;\n document.head.appendChild(s);\n }\n\n function removeHoverFreezeStyle() {\n document.getElementById(HOVER_STYLE_ID)?.remove();\n }\n\n function freezeElementTransform(el: HTMLElement) {\n if (frozenElements.has(el)) return;\n // Snapshot the CURRENT computed transform (includes layout transforms from\n // inline style AND stylesheet rules). This is what the element looks like\n // right before any hover gesture would modify it.\n const current = getComputedStyle(el).transform;\n // 'none' is the valid neutral value for the transform property.\n const snapshot = current && current !== 'none' ? current : 'none';\n el.style.setProperty(ORIG_TRANSFORM_VAR, snapshot);\n el.setAttribute(HOVER_FREEZE_ATTR, '');\n frozenElements.add(el);\n }\n\n function unfreezeElementTransform(el: HTMLElement) {\n if (!frozenElements.has(el)) return;\n el.removeAttribute(HOVER_FREEZE_ATTR);\n el.style.removeProperty(ORIG_TRANSFORM_VAR);\n frozenElements.delete(el);\n }\n\n function unfreezeAll() {\n for (const el of frozenElements) {\n el.removeAttribute(HOVER_FREEZE_ATTR);\n el.style.removeProperty(ORIG_TRANSFORM_VAR);\n }\n frozenElements.clear();\n }\n\n // Tags we must NEVER freeze transforms on — structural / scroll containers.\n // Freezing these strands scroll-linked transforms (e.g. Framer pinned sections,\n // sticky nav transforms, parallax headers) at whatever their current scroll\n // value was when the pointer first entered, which visually breaks the page.\n const STRUCTURAL_TAGS = new Set([\n 'HTML', 'BODY', 'MAIN', 'SECTION', 'HEADER', 'FOOTER', 'NAV', 'ARTICLE', 'ASIDE',\n ]);\n\n /**\n * Walk from the pointer target up to 4 ancestors looking for the nearest\n * element that actually is a hover target (link, button, role=button, or a\n * Framer component with data-framer-name / data-framer-component-type).\n * Return null if we cross a structural container or find nothing — in that\n * case we freeze NOTHING. This avoids freezing wrappers/sections/body which\n * would break scroll-linked transforms on the host page.\n */\n function findHoverTarget(start: HTMLElement): HTMLElement | null {\n let n: HTMLElement | null = start;\n let hops = 0;\n while (n && hops < 4) {\n if (STRUCTURAL_TAGS.has(n.tagName)) return null;\n if (isWidgetInternal(n)) return null;\n const tag = n.tagName;\n if (\n tag === 'A' ||\n tag === 'BUTTON' ||\n n.getAttribute('role') === 'button' ||\n n.hasAttribute('data-framer-name') ||\n n.hasAttribute('data-framer-component-type')\n ) {\n return n;\n }\n n = n.parentElement;\n hops++;\n }\n return null;\n }\n\n function onPointerEnter(e: Event) {\n const target = e.target as Element | null;\n if (!target || !(target instanceof HTMLElement)) return;\n if (isWidgetInternal(target)) return;\n const hoverTarget = findHoverTarget(target);\n if (hoverTarget) freezeElementTransform(hoverTarget);\n }\n\n function onPointerLeave(e: Event) {\n const target = e.target as Element | null;\n if (!target || !(target instanceof HTMLElement)) return;\n const hoverTarget = findHoverTarget(target);\n if (hoverTarget) unfreezeElementTransform(hoverTarget);\n }\n\n function startHoverFreeze() {\n if (hoverEnterListener) return;\n injectHoverFreezeStyle();\n hoverEnterListener = onPointerEnter;\n hoverLeaveListener = onPointerLeave;\n const opts: AddEventListenerOptions = { capture: true, passive: true };\n window.addEventListener('pointerenter', hoverEnterListener, opts);\n window.addEventListener('mouseenter', hoverEnterListener, opts);\n window.addEventListener('pointerleave', hoverLeaveListener, opts);\n window.addEventListener('mouseleave', hoverLeaveListener, opts);\n }\n\n function stopHoverFreeze() {\n const opts: AddEventListenerOptions = { capture: true };\n if (hoverEnterListener) {\n window.removeEventListener('pointerenter', hoverEnterListener, opts);\n window.removeEventListener('mouseenter', hoverEnterListener, opts);\n hoverEnterListener = null;\n }\n if (hoverLeaveListener) {\n window.removeEventListener('pointerleave', hoverLeaveListener, opts);\n window.removeEventListener('mouseleave', hoverLeaveListener, opts);\n hoverLeaveListener = null;\n }\n unfreezeAll();\n removeHoverFreezeStyle();\n }\n\n // =========================================================================\n // Layer 0b: Element.prototype.animate() intercept\n //\n // For libraries that DO use WAAPI for hover (older framer-motion, some\n // direct el.animate() callers), we still need to stop persistent end-state.\n // We simply passthrough — the hover-freeze CSS rule above will override\n // any transform-based visible effect via inline-style. Opacity/color\n // hover animations are allowed to complete.\n //\n // NOTE: we intentionally do NOT force fill:forwards + finish() here (that\n // was the 0.3.49 behavior) because that persisted transform end-state\n // for Framer hover gestures that DO use WAAPI, defeating the hover-freeze.\n // We also do NOT cancel() visual-only animations because that strands\n // entry animations at their starting offset. Passthrough is safest; the\n // CSS layer caps CSS transition/animation duration and the hover-freeze\n // layer handles transform-based hover motion from inline-style writers.\n // =========================================================================\n\n function patchAnimate() {\n // Intentionally no-op (kept for API shape, removed in deactivate()).\n // See NOTE above — the hover-freeze layer and CSS layer together\n // cover the cases patchAnimate used to handle, without the regressions.\n }\n\n function restoreAnimate() {\n if (originalAnimate) {\n Element.prototype.animate = originalAnimate;\n originalAnimate = null;\n }\n }\n\n // =========================================================================\n // Layer 1: CSS Injection\n // =========================================================================\n\n function injectStyles() {\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = `\n *, *::before, *::after {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n animation-delay: 0s !important;\n animation-fill-mode: forwards !important;\n transition-duration: 0.001ms !important;\n transition-delay: 0s !important;\n scroll-behavior: auto !important;\n animation-timeline: auto !important;\n scroll-timeline: none !important;\n }\n `;\n document.head.appendChild(style);\n }\n\n function removeStyles() {\n document.getElementById(STYLE_ID)?.remove();\n }\n\n // =========================================================================\n // Layer 2: Web Animations API — finish all WAAPI animations\n // =========================================================================\n\n function finishAllAnimations() {\n try {\n const animations = document.getAnimations?.();\n if (!animations) return;\n for (const anim of animations) {\n try {\n anim.finish();\n } catch {\n try { anim.cancel(); } catch { /* ignore */ }\n }\n }\n } catch { /* getAnimations not supported */ }\n }\n\n // =========================================================================\n // Layer 3: JS animation library detection + inline style freeze\n // =========================================================================\n\n function patchGSAP() {\n const g = (window as any).gsap;\n if (g?.globalTimeline) {\n try {\n g.globalTimeline.timeScale(0);\n (window as any)._a11yGsapPatched = true;\n } catch { /* ignore */ }\n }\n }\n\n function restoreGSAP() {\n const g = (window as any).gsap;\n if ((window as any)._a11yGsapPatched && g?.globalTimeline) {\n try {\n g.globalTimeline.timeScale(1);\n delete (window as any)._a11yGsapPatched;\n } catch { /* ignore */ }\n }\n }\n\n /**\n * Force hidden-by-animation elements visible.\n * Only touches INLINE styles — never sets CSS !important on opacity etc.\n * which would break modals and intentionally hidden elements.\n */\n function forceHiddenElementsVisible() {\n // Only process elements near the viewport to avoid layout chaos on\n // Framer/scroll-animated pages where dozens of off-screen elements\n // are hidden via opacity:0 / translateY as part of scroll reveals.\n const viewH = window.innerHeight;\n const margin = viewH * 1.5; // 1.5x viewport ahead\n\n const all = document.querySelectorAll<HTMLElement>('*');\n for (const el of all) {\n if (el.tagName === 'SCRIPT' || el.tagName === 'STYLE' || el.tagName === 'NOSCRIPT' || el.tagName === 'META' || el.tagName === 'LINK') continue;\n if (el.closest('#accessify-root') || el.closest('accessify-widget')) continue;\n if (el.dataset.a11yOrigStyle) continue; // Already processed\n\n const computed = window.getComputedStyle(el);\n if (computed.display === 'none') continue; // Intentionally hidden\n\n // Skip elements far below the current scroll position —\n // they will be handled when the user scrolls to them (periodic re-scan).\n const rect = el.getBoundingClientRect();\n if (rect.top > viewH + margin) continue; // Too far below viewport\n // Also skip if entirely above viewport (already scrolled past)\n if (rect.bottom < -margin) continue;\n\n const inline = el.style;\n let needsFix = false;\n const originals: Record<string, string> = {};\n\n // Inline opacity 0 or near-0 (computed, not stylesheet)\n const opacityVal = parseFloat(computed.opacity);\n if (opacityVal < 0.1 && inline.opacity !== '') {\n originals.opacity = inline.opacity;\n el.style.opacity = '1';\n needsFix = true;\n } else if (opacityVal < 0.1 && el.hasAttribute('data-framer-appear-id')) {\n // Framer appear elements: opacity set via WAAPI or framework\n originals.opacity = inline.opacity || '';\n el.style.opacity = '1';\n needsFix = true;\n }\n\n // Inline transform with translate that moves element off-screen\n if (inline.transform && /translate[XY]\\([^0]/.test(inline.transform)) {\n originals.transform = inline.transform;\n el.style.transform = 'none';\n needsFix = true;\n }\n\n // Inline visibility hidden\n if (inline.visibility === 'hidden') {\n originals.visibility = inline.visibility;\n el.style.visibility = 'visible';\n needsFix = true;\n }\n\n // Inline clip-path that hides element\n if (inline.clipPath && inline.clipPath !== 'none') {\n originals.clipPath = inline.clipPath;\n el.style.clipPath = 'none';\n needsFix = true;\n }\n\n if (needsFix) {\n el.dataset.a11yOrigStyle = JSON.stringify(originals);\n }\n }\n }\n\n function restoreHiddenElements() {\n document.querySelectorAll<HTMLElement>('[data-a11y-orig-style]').forEach(el => {\n try {\n const orig: Record<string, string> = JSON.parse(el.dataset.a11yOrigStyle || '{}');\n for (const [prop, val] of Object.entries(orig)) {\n if (val === '') {\n el.style.removeProperty(prop);\n } else {\n (el.style as any)[prop] = val;\n }\n }\n } catch { /* malformed JSON */ }\n delete el.dataset.a11yOrigStyle;\n });\n }\n\n /**\n * Freeze inline-animated styles so scroll-handlers can't update them.\n * Takes a snapshot of current inline transforms and enforces them on scroll.\n */\n function freezeScrollAnimations() {\n document.querySelectorAll<HTMLElement>('[style]').forEach(el => {\n if (el.closest('#accessify-root') || el.closest('accessify-widget')) return;\n if (el.dataset.a11yFrozenStyle) return;\n const s = el.style;\n if (s.transform || s.opacity) {\n el.dataset.a11yFrozenStyle = JSON.stringify({\n transform: s.transform || '',\n opacity: s.opacity || '',\n });\n }\n });\n\n if (!scrollHandler) {\n scrollHandler = () => {\n if (!enabled) return;\n document.querySelectorAll<HTMLElement>('[data-a11y-frozen-style]').forEach(el => {\n try {\n const frozen = JSON.parse(el.dataset.a11yFrozenStyle || '{}');\n if (frozen.transform && el.style.transform !== frozen.transform) {\n el.style.transform = frozen.transform;\n }\n } catch { /* ignore */ }\n });\n };\n window.addEventListener('scroll', scrollHandler, { passive: true, capture: true });\n }\n }\n\n function unfreezeScrollAnimations() {\n if (scrollHandler) {\n window.removeEventListener('scroll', scrollHandler, true);\n scrollHandler = null;\n }\n document.querySelectorAll<HTMLElement>('[data-a11y-frozen-style]').forEach(el => {\n delete el.dataset.a11yFrozenStyle;\n });\n }\n\n // =========================================================================\n // Layer 4: Media\n // =========================================================================\n\n function pauseAllVideos() {\n document.querySelectorAll<HTMLVideoElement>('video').forEach(v => {\n if (!v.paused) {\n v.dataset.a11yPaused = 'true';\n v.pause();\n pausedVideos.push(v);\n }\n });\n }\n\n function interceptVideoPlay() {\n if (originalVideoPlay) return;\n originalVideoPlay = HTMLVideoElement.prototype.play;\n HTMLVideoElement.prototype.play = function () {\n if (enabled) return Promise.resolve();\n return originalVideoPlay!.call(this);\n };\n }\n\n function restoreVideoPlay() {\n if (originalVideoPlay) {\n HTMLVideoElement.prototype.play = originalVideoPlay;\n originalVideoPlay = null;\n }\n }\n\n function resumeAllVideos() {\n restoreVideoPlay();\n document.querySelectorAll<HTMLVideoElement>('video[data-a11y-paused]').forEach(v => {\n try { v.play(); } catch { /* gone */ }\n delete v.dataset.a11yPaused;\n });\n pausedVideos = [];\n }\n\n function freezeGif(img: HTMLImageElement) {\n const src = (img.currentSrc || img.src || '').toLowerCase();\n if (!src.match(/\\.gif(\\?|$)/i)) return;\n if (gifOriginals.has(img)) return;\n\n const doFreeze = () => {\n try {\n const w = img.naturalWidth || img.width;\n const h = img.naturalHeight || img.height;\n if (w === 0 || h === 0) return;\n const c = document.createElement('canvas');\n c.width = w; c.height = h;\n const ctx = c.getContext('2d');\n if (!ctx) return;\n ctx.drawImage(img, 0, 0);\n gifOriginals.set(img, img.src);\n img.src = c.toDataURL('image/png');\n } catch { /* CORS */ }\n };\n\n if (img.complete && img.naturalWidth > 0) doFreeze();\n else img.addEventListener('load', doFreeze, { once: true });\n }\n\n function freezeAllGifs() {\n document.querySelectorAll<HTMLImageElement>('img').forEach(freezeGif);\n }\n\n function restoreAllGifs() {\n for (const [img, src] of gifOriginals) {\n try { img.src = src; } catch { /* gone */ }\n }\n gifOriginals.clear();\n }\n\n function pauseSVG() {\n document.querySelectorAll('svg').forEach(s => {\n try { (s as any).pauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n\n function resumeSVG() {\n document.querySelectorAll('svg').forEach(s => {\n try { (s as any).unpauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n\n function stopMarquees() {\n document.querySelectorAll('marquee').forEach(m => {\n try { (m as any).stop?.(); } catch { /* ignore */ }\n });\n }\n\n function startMarquees() {\n document.querySelectorAll('marquee').forEach(m => {\n try { (m as any).start?.(); } catch { /* ignore */ }\n });\n }\n\n // =========================================================================\n // MutationObserver — dynamic content\n // =========================================================================\n\n function setupObserver() {\n if (mutationObserver) return;\n mutationObserver = new MutationObserver(mutations => {\n if (!enabled) return;\n let hasNewContent = false;\n for (const m of mutations) {\n if (m.addedNodes.length > 0) { hasNewContent = true; break; }\n }\n if (hasNewContent) {\n finishAllAnimations();\n forceHiddenElementsVisible();\n pauseAllVideos();\n freezeAllGifs();\n pauseSVG();\n }\n });\n mutationObserver.observe(document.body, { childList: true, subtree: true });\n }\n\n function teardownObserver() {\n mutationObserver?.disconnect();\n mutationObserver = null;\n }\n\n // =========================================================================\n // Periodic re-scan — frameworks create new animations constantly\n // =========================================================================\n\n function startPeriodicScan() {\n if (scanInterval) return;\n scanInterval = setInterval(() => {\n if (!enabled) return;\n finishAllAnimations();\n }, 500);\n }\n\n function stopPeriodicScan() {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n function activate() {\n if (enabled) return;\n enabled = true;\n\n // Layer 0a: Hover-freeze — snapshot transform into CSS custom property\n // + !important stylesheet rule that beats Motion's inline-style writes.\n startHoverFreeze();\n\n // Layer 0b: WAAPI passthrough (no-op kept for API shape)\n patchAnimate();\n\n // Layer 1: CSS\n injectStyles();\n\n // Layer 2: Kill all currently running WAAPI animations\n finishAllAnimations();\n\n // Layer 3: JS libs + inline style fixes\n patchGSAP();\n forceHiddenElementsVisible();\n freezeScrollAnimations();\n\n // Layer 4: Media\n pauseAllVideos();\n interceptVideoPlay();\n freezeAllGifs();\n pauseSVG();\n stopMarquees();\n\n // Observers\n setupObserver();\n startPeriodicScan();\n\n // Delayed re-scans for async rendering frameworks\n for (const delay of [50, 200, 500, 1000, 2000, 4000]) {\n setTimeout(() => {\n if (!enabled) return;\n finishAllAnimations();\n forceHiddenElementsVisible();\n freezeScrollAnimations();\n pauseAllVideos();\n freezeAllGifs();\n }, delay);\n }\n\n localStorage.setItem(STORAGE_KEY, 'true');\n }\n\n function deactivate() {\n enabled = false;\n\n stopPeriodicScan();\n teardownObserver();\n restoreAnimate();\n stopHoverFreeze();\n unfreezeScrollAnimations();\n restoreGSAP();\n restoreHiddenElements();\n startMarquees();\n resumeSVG();\n restoreAllGifs();\n resumeAllVideos();\n removeStyles();\n\n localStorage.removeItem(STORAGE_KEY);\n }\n\n return {\n id: 'animation-stop',\n name: () => 'Stop Animations',\n description: 'Pause all animations, transitions, and auto-playing videos (WCAG 2.3.1)',\n icon: 'animation-stop',\n category: 'visual',\n activate,\n deactivate,\n getState: (): FeatureState => ({ id: 'animation-stop', enabled }),\n setState: (state: { enabled: boolean }) => {\n if (state.enabled) activate();\n else deactivate();\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -6620,14 +6620,14 @@ function FeatureGrid($$anchor, $$props) {
6620
6620
  const FEATURE_LOADERS = {
6621
6621
  contrast: () => import("./contrast-CqsOs6Uo.js"),
6622
6622
  "text-size": () => import("./text-size-m_mHNPWo.js"),
6623
- "keyboard-nav": () => import("./keyboard-nav-BEcvqCtK.js"),
6623
+ "keyboard-nav": () => import("./keyboard-nav-DqUhy2t8.js"),
6624
6624
  "link-highlight": () => import("./link-highlight-DBGm067Y.js"),
6625
6625
  "reading-guide": () => import("./reading-guide-VT8NciIL.js"),
6626
6626
  "reading-mask": () => import("./reading-mask-BABChuCz.js"),
6627
- "animation-stop": () => import("./animation-stop-B_Leg12C.js"),
6627
+ "animation-stop": () => import("./animation-stop-Ci9CX8u6.js"),
6628
6628
  "hide-images": () => import("./hide-images-B_LeCBcd.js"),
6629
6629
  "big-cursor": () => import("./big-cursor-B2UKu9dQ.js"),
6630
- "page-structure": () => import("./page-structure-BIS5uvu8.js"),
6630
+ "page-structure": () => import("./page-structure-Blmi35kx.js"),
6631
6631
  tts: () => import("./tts-CjszLRnb.js"),
6632
6632
  "text-simplify": () => import("./text-simplify-B0hIi6bW.js"),
6633
6633
  "alt-text": () => Promise.resolve().then(() => altText)
@@ -9030,4 +9030,4 @@ export {
9030
9030
  init as i,
9031
9031
  t
9032
9032
  };
9033
- //# sourceMappingURL=index-C3zhg2nP.js.map
9033
+ //# sourceMappingURL=index--LDQcJNd.js.map