accessify-widget 0.3.59 → 0.3.60
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.
- package/dist/accessify.min.js +1 -1
- package/dist/accessify.min.js.map +1 -1
- package/dist/accessify.mjs +1 -1
- package/dist/{animation-stop-fR6pB-nV.js → animation-stop-DrDe9Q9n.js} +120 -143
- package/dist/animation-stop-DrDe9Q9n.js.map +1 -0
- package/dist/{index-UdJq2Ln2.js → index-kzWIIKQd.js} +14 -7
- package/dist/{index-UdJq2Ln2.js.map → index-kzWIIKQd.js.map} +1 -1
- package/dist/{keyboard-nav-Dg0yGJq0.js → keyboard-nav-DLIviKXx.js} +2 -2
- package/dist/{keyboard-nav-Dg0yGJq0.js.map → keyboard-nav-DLIviKXx.js.map} +1 -1
- package/dist/loader.min.js +1 -1
- package/dist/{page-structure-0qC8QqRB.js → page-structure-Bo1-XXRs.js} +2 -2
- package/dist/{page-structure-0qC8QqRB.js.map → page-structure-Bo1-XXRs.js.map} +1 -1
- package/dist/widget.js +1 -1
- package/dist/widget.js.map +1 -1
- package/package.json +1 -1
- package/dist/animation-stop-fR6pB-nV.js.map +0 -1
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"animation-stop-fR6pB-nV.js","sources":["../src/features/animation-stop.ts"],"sourcesContent":["import type { FeatureModule, FeatureState } from '../types';\n\n/**\n * Animation Stop – V5 (baseline + Framer hover kill)\n *\n * Layer 0: window-capture pointerenter blocker — stops Framer Motion's\n * whileHover gesture at the source (pointerenter is where Framer's\n * native bubble-phase element listener fires — a window-capture\n * stopImmediatePropagation kills dispatch before it reaches them)\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\n * Layer 3: JS library detection — GSAP globalTimeline, inline-style freeze\n * Layer 4: Media — pause videos, freeze GIFs, stop SVG SMIL, stop marquees\n *\n * DOES NOT (avoided after regression cycle Apr 2026):\n * - Patch matchMedia (Framer disables ALL transforms incl. entry → layout break)\n * - Freeze transforms via !important CSS (breaks scroll-linked ancestors)\n * - Walk pointer target ancestors (freezes section/main/body → scroll break)\n * - Cancel visual-only WAAPI animations (strands entry animations)\n */\n\n/**\n * Walk up parentNode → shadowRoot.host chain to detect if a node belongs\n * to our own widget UI. When an event bounces off the Shadow DOM boundary,\n * its target from outside becomes the shadow host (accessify-root), so we\n * only need to check for that plus the custom element tag / class prefix.\n */\nfunction isWidgetInternalNode(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 = parent;\n else if ((n as any).host) n = (n as any).host;\n else break;\n hops++;\n }\n return false;\n}\n\nfunction createAnimationStopModuleImpl(): 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 let pointerenterBlocker: ((e: Event) => void) | null = null;\n let styleFreezeObserver: MutationObserver | null = null;\n let frozenStyles: WeakMap<Element, string> | null = null;\n let ignoreStyleMutations = false;\n\n // =========================================================================\n // Layer 0: Framer Motion hover kill — window-capture pointerenter blocker\n //\n // Framer Motion registers its whileHover gesture as a NATIVE bubble-phase\n // listener directly on each motion element:\n //\n // element.addEventListener(\"pointerenter\", onPointerEnter, { passive: true })\n //\n // (see packages/motion-dom/src/gestures/hover.ts in motiondivision/motion)\n //\n // Event dispatch for pointerenter (non-bubbling) flows:\n // window-capture → document-capture → ... → target (capture + bubble listeners)\n //\n // By attaching a capture-phase listener on window and calling\n // stopImmediatePropagation(), we halt dispatch before it reaches the target,\n // so Framer's element-level listener NEVER runs and whileHover is never\n // activated. No transform is written, no animation starts, no end state\n // persists. Entry animations (which are NOT gated on pointerenter) still\n // run and reach their end state normally.\n //\n // CSS :hover is independent of JS pointer events — it's applied by the\n // compositor based on hit-testing — so text hover colors, underline effects,\n // and our own widget trigger/card CSS hover continue to work.\n //\n // Widget-internal events (shadow DOM re-targeted to accessify-root) are\n // bypassed so our own potential JS pointer listeners (none today, but safe)\n // keep working.\n // =========================================================================\n\n function blockFramerHover() {\n if (pointerenterBlocker) return;\n pointerenterBlocker = (e: Event) => {\n const target = e.target as Element | null;\n if (!target || !(target instanceof Element)) return;\n if (isWidgetInternalNode(target)) return;\n // This is the critical line — stops the event before any element-level\n // pointerenter listener (including Framer Motion's whileHover gesture).\n e.stopImmediatePropagation();\n };\n window.addEventListener('pointerenter', pointerenterBlocker, { capture: true });\n }\n\n function unblockFramerHover() {\n if (!pointerenterBlocker) return;\n window.removeEventListener('pointerenter', pointerenterBlocker, { capture: true });\n pointerenterBlocker = null;\n }\n\n // =========================================================================\n // Layer 0: Element.prototype.animate() intercept\n //\n // This is THE critical piece for Framer Motion. Framer uses WAAPI\n // (Element.prototype.animate()) for ALL visual animations — hover,\n // appear, scroll, transitions. CSS rules do NOT affect WAAPI.\n // We intercept at creation time and force duration to 0.001ms\n // so every animation completes instantly.\n // =========================================================================\n\n function patchAnimate() {\n if (originalAnimate) return;\n originalAnimate = Element.prototype.animate;\n\n Element.prototype.animate = function (\n this: Element,\n keyframes: Keyframe[] | PropertyIndexedKeyframes | null,\n options?: number | KeyframeAnimationOptions,\n ): Animation {\n if (!enabled) {\n return originalAnimate!.call(this, keyframes, options);\n }\n\n // Force instant completion: duration 0.001ms, no delay, 1 iteration, fill forwards\n let opts: KeyframeAnimationOptions;\n if (typeof options === 'number') {\n opts = { duration: 0.001, fill: 'forwards' as FillMode };\n } else {\n opts = {\n ...(options || {}),\n duration: 0.001,\n delay: 0,\n iterations: 1,\n fill: 'forwards' as FillMode,\n };\n // Remove iterationStart, endDelay etc. that could interfere\n delete (opts as any).iterationStart;\n delete (opts as any).endDelay;\n }\n\n const anim = originalAnimate!.call(this, keyframes, opts);\n // Immediately finish so element lands in end-state\n try { anim.finish(); } catch { /* ignore */ }\n return anim;\n };\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 < 1 (computed, not stylesheet)\n // For Framer elements (data-framer-appear-id, framer- class prefix,\n // or will-change:transform) we force to 1 if INLINE opacity is set\n // below 1 — these are mid-animation entries that won't ever complete\n // because Framer writes opacity from rAF, not WAAPI. For all other\n // elements we keep the old low-threshold behavior (< 0.1) so we don't\n // clobber intentionally-dimmed UI on non-Framer sites.\n const opacityVal = parseFloat(computed.opacity);\n const isFramerEl = el.hasAttribute('data-framer-appear-id')\n || /(?:^|\\s)framer-/.test(el.getAttribute('class') || '')\n || /transform/.test(computed.willChange || '');\n if (isFramerEl && opacityVal < 1 && inline.opacity !== '' && inline.opacity !== '1') {\n originals.opacity = inline.opacity;\n el.style.opacity = '1';\n needsFix = true;\n } else 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 originals.opacity = inline.opacity || '';\n el.style.opacity = '1';\n needsFix = true;\n }\n\n // Framer elements with inline translate still mid-entry: reset transform\n if (isFramerEl && inline.transform && /translate[XY]?\\([^0]/.test(inline.transform)) {\n if (!originals.transform) originals.transform = inline.transform;\n el.style.transform = 'none';\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 * Clamp inline-animated Framer styles via MutationObserver.\n *\n * WHY: Framer's useScroll + useTransform writes element.style.transform /\n * .opacity directly from a rAF driven by window 'scroll' events. These\n * writes never go through Element.prototype.animate() (so patchAnimate can't\n * see them) and the listener is already registered before we activate (so\n * stopImmediatePropagation at capture can't block it).\n *\n * HOW: Stateless clamp. On any style mutation of a Framer element, if the\n * current inline opacity is < 1 or inline transform contains a non-trivial\n * translate/scale, we reset opacity to 1 and transform to none. No\n * snapshots to get stale, survives element re-renders, catches lazy-mounted\n * components automatically because we observe with subtree:true on <body>.\n *\n * Scoped to Framer elements only (via data-framer-name / class prefix /\n * data-framer-appear-id) so we don't interfere with modals, tooltips,\n * drag-drop, or other non-Framer inline style manipulation.\n */\n const FRAMER_SELECTOR = '[data-framer-name], [class*=\"framer-\"], [data-framer-appear-id]';\n\n function isFramerElement(el: Element): boolean {\n if (!(el instanceof HTMLElement)) return false;\n if (el.hasAttribute('data-framer-name')) return true;\n if (el.hasAttribute('data-framer-appear-id')) return true;\n const cls = el.getAttribute('class') || '';\n return /(?:^|\\s)framer-/.test(cls);\n }\n\n /** Parse translateX/Y from a matrix() or translate() transform. */\n function hasNonTrivialTransform(tr: string): boolean {\n if (!tr || tr === 'none') return false;\n // matrix(a, b, c, d, tx, ty)\n const mMatrix = tr.match(/matrix\\(([^)]+)\\)/);\n if (mMatrix) {\n const p = mMatrix[1].split(',').map((v) => parseFloat(v.trim()));\n // Non-identity translate or non-1 scale\n if (Math.abs(p[4] || 0) > 0.5 || Math.abs(p[5] || 0) > 0.5) return true;\n if (Math.abs((p[0] || 1) - 1) > 0.02 || Math.abs((p[3] || 1) - 1) > 0.02) return true;\n return false;\n }\n // translate(), translateX/Y()\n const mTrans = tr.match(/translate[XY3dD]*\\(([^)]+)\\)/);\n if (mTrans) {\n const parts = mTrans[1].split(',').map((v) => parseFloat(v.trim()));\n if (parts.some((p) => !isNaN(p) && Math.abs(p) > 0.5)) return true;\n }\n // scale() with non-1 factor\n const mScale = tr.match(/scale[XY]?\\(([^)]+)\\)/);\n if (mScale) {\n const p = parseFloat(mScale[1].split(',')[0].trim());\n if (!isNaN(p) && Math.abs(p - 1) > 0.02) return true;\n }\n return false;\n }\n\n function clampFramerElement(el: HTMLElement) {\n const style = el.style;\n let changed = false;\n // Inline opacity < 1 → force 1\n if (style.opacity !== '' && style.opacity !== '1') {\n const v = parseFloat(style.opacity);\n if (!isNaN(v) && v < 1) {\n style.opacity = '1';\n changed = true;\n }\n }\n // Inline transform with non-trivial translate/scale → none\n if (style.transform && hasNonTrivialTransform(style.transform)) {\n style.transform = 'none';\n changed = true;\n }\n return changed;\n }\n\n function freezeScrollAnimations() {\n // Initial pass: clamp anything already inline.\n ignoreStyleMutations = true;\n try {\n document.querySelectorAll<HTMLElement>(FRAMER_SELECTOR).forEach((el) => {\n if (el.closest('#accessify-root') || el.closest('accessify-widget')) return;\n clampFramerElement(el);\n });\n } finally {\n ignoreStyleMutations = false;\n }\n\n if (styleFreezeObserver) return;\n styleFreezeObserver = new MutationObserver((mutations) => {\n if (!enabled || ignoreStyleMutations) return;\n ignoreStyleMutations = true;\n try {\n for (const m of mutations) {\n if (m.type !== 'attributes' || m.attributeName !== 'style') continue;\n const el = m.target as HTMLElement;\n if (!isFramerElement(el)) continue;\n if (el.closest('#accessify-root') || el.closest('accessify-widget')) continue;\n clampFramerElement(el);\n }\n } finally {\n ignoreStyleMutations = false;\n }\n });\n // Subtree + attributeFilter on body: catches writes to every descendant\n // and automatically picks up lazily-mounted Framer components.\n try {\n styleFreezeObserver.observe(document.body, {\n attributes: true,\n attributeFilter: ['style'],\n subtree: true,\n });\n } catch { /* ignore */ }\n }\n\n /** No-op: the MutationObserver with subtree:true already catches new elements. */\n function refreezeStyles() {\n if (!enabled) return;\n ignoreStyleMutations = true;\n try {\n document.querySelectorAll<HTMLElement>(FRAMER_SELECTOR).forEach((el) => {\n if (el.closest('#accessify-root') || el.closest('accessify-widget')) return;\n clampFramerElement(el);\n });\n } finally {\n ignoreStyleMutations = false;\n }\n }\n\n function unfreezeScrollAnimations() {\n if (styleFreezeObserver) {\n styleFreezeObserver.disconnect();\n styleFreezeObserver = null;\n }\n frozenStyles = null;\n if (scrollHandler) {\n window.removeEventListener('scroll', scrollHandler, true);\n scrollHandler = null;\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: Block Framer Motion whileHover at the source (pointerenter capture)\n blockFramerHover();\n\n // Layer 0b: Intercept Element.animate() — catches ALL new WAAPI animations instantly\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 // On each tick: finish any WAAPI animations that just started, force any\n // freshly-revealed hidden elements visible, then re-snapshot the style\n // freeze baseline so newly mounted Framer elements get locked in their\n // settled state (Framer mounts components lazily on scroll).\n for (const delay of [50, 200, 500, 1000, 2000, 4000]) {\n setTimeout(() => {\n if (!enabled) return;\n finishAllAnimations();\n forceHiddenElementsVisible();\n refreezeStyles();\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 unblockFramerHover();\n restoreAnimate();\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\nexport default createAnimationStopModuleImpl;\n"],"names":[],"mappings":"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"}
|