accessify-widget 0.3.78 → 0.3.80

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "accessify-widget",
3
- "version": "0.3.78",
3
+ "version": "0.3.80",
4
4
  "description": "Accessify-Widget accessibility widget for any website",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/maddesv1-ctrl/accessify-widget",
@@ -1 +0,0 @@
1
- {"version":3,"file":"animation-stop-_C-YdTs3.js","sources":["../src/features/animation-stop.ts"],"sourcesContent":["import type { FeatureModule, FeatureState } from '../types';\n\n/**\n * Animation Stop – V6 (Framer-Safe Rewrite)\n *\n * Layer 1: CSS injection — kill all CSS animations/transitions + force\n * Framer/WAAPI-hidden elements visible via CSS !important (no\n * inline-style manipulation that frameworks fight against).\n * Layer 2: Web Animations API — cancel all running WAAPI animations\n * Layer 3: Element.prototype.animate() intercept — kill new animations\n * Layer 4: GSAP globalTimeline freeze\n * Layer 5: Media — pause videos, freeze GIFs, stop SVG SMIL, marquees\n *\n * + MutationObserver for dynamic content (debounced)\n * + Periodic re-scan (every 2s) for frameworks that create new animations\n *\n * V6 key change: NO inline-style manipulation for visibility forcing.\n * Framer (and similar React-based frameworks) continuously re-set inline\n * styles via WAAPI and React renders. Overwriting inline styles creates an\n * infinite fight (our override → Framer re-sets → MutationObserver fires →\n * we override again → flicker). Instead, V6 uses CSS `!important` rules\n * in the injected stylesheet, which beat inline styles without triggering\n * a mutation loop.\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 originalVideoPlay: typeof HTMLVideoElement.prototype.play | null = null;\n let originalAnimate: typeof Element.prototype.animate | null = null;\n let gifOriginals = new Map<HTMLImageElement, string>();\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let delayedTimers: ReturnType<typeof setTimeout>[] = [];\n\n // =========================================================================\n // Helpers\n // =========================================================================\n\n const WIDGET_SEL = ':not(#accessify-root):not(#accessify-root *)';\n\n function isWidgetElement(el: Element | Node | null): boolean {\n try {\n let node: Node | null = el;\n while (node) {\n if ((node as Element).id === 'accessify-root') return true;\n const parent: Node | null =\n (node as Node).parentNode ||\n ((node as unknown as ShadowRoot).host as Node | null) ||\n null;\n if (parent === node) break;\n node = parent;\n }\n } catch { /* ignore */ }\n return false;\n }\n\n // =========================================================================\n // Layer 1: CSS Injection\n //\n // One big stylesheet handles EVERYTHING CSS can do:\n // a) Kill all transitions + CSS animations (0.001ms)\n // b) Force Framer-appear elements visible (opacity, transform)\n // c) Neutralize hover/focus transforms\n //\n // Because CSS !important beats inline styles, Framer can re-set its\n // inline opacity:0.001 as much as it wants — our rule wins. No JS\n // inline-style manipulation needed, no MutationObserver feedback loop.\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 /* --- Kill all CSS-driven animations & transitions --- */\n *${WIDGET_SEL},\n *${WIDGET_SEL}::before,\n *${WIDGET_SEL}::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 /* --- Force Framer appear-elements visible --- *\n * Framer sets inline opacity:0.001 + transform:translateY(...)\n * on elements waiting for scroll/appear animations. We override\n * with !important which beats inline styles. When animation-stop\n * is deactivated, removing this stylesheet instantly restores\n * Framer's inline values — no cleanup needed. */\n [data-framer-appear-id]${WIDGET_SEL} {\n opacity: 1 !important;\n transform: none !important;\n }\n\n /* --- Force any inline-hidden elements visible ---\n * Some animation frameworks (AOS, wow.js, Framer scroll) hide\n * elements via inline opacity:0 or visibility:hidden. */\n [style*=\"opacity: 0\"]${WIDGET_SEL},\n [style*=\"opacity:0\"]${WIDGET_SEL} {\n opacity: 1 !important;\n }\n [style*=\"visibility: hidden\"]${WIDGET_SEL},\n [style*=\"visibility:hidden\"]${WIDGET_SEL} {\n visibility: visible !important;\n }\n\n /* --- Neutralize interaction transforms --- */\n *${WIDGET_SEL}:hover,\n *${WIDGET_SEL}:focus,\n *${WIDGET_SEL}:focus-within,\n *${WIDGET_SEL}:focus-visible,\n *${WIDGET_SEL}:active {\n transform: none !important;\n scale: 1 !important;\n rotate: 0deg !important;\n translate: 0 0 !important;\n filter: none !important;\n -webkit-filter: 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 — cancel all WAAPI animations\n //\n // We cancel() instead of finish() to avoid leaving elements stuck in\n // animation end-states (e.g. scale(1.05) from a hover animation).\n // The CSS !important rules in Layer 1 handle visibility.\n // =========================================================================\n\n function isWidgetAnimation(anim: Animation): boolean {\n try {\n const target = (anim.effect as any)?.target as Element | null;\n if (!target) return false;\n return isWidgetElement(target);\n } catch { /* ignore */ }\n return false;\n }\n\n function cancelAllAnimations() {\n try {\n const animations = document.getAnimations?.();\n if (!animations) return;\n for (const anim of animations) {\n if (isWidgetAnimation(anim)) continue;\n try { anim.cancel(); } catch { /* ignore */ }\n }\n } catch { /* getAnimations not supported */ }\n }\n\n // =========================================================================\n // Layer 3: Element.prototype.animate() intercept\n //\n // Framer Motion creates new WAAPI animations constantly (hover, appear,\n // scroll). We intercept at creation time and cancel immediately.\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 // Never interfere with the widget's own animations.\n if (isWidgetElement(this)) {\n return originalAnimate!.call(this, keyframes, options);\n }\n\n // Create the animation with instant duration, then cancel it.\n // We must call originalAnimate (not skip it) because some frameworks\n // store the returned Animation object and call methods on it.\n const opts: KeyframeAnimationOptions = typeof options === 'number'\n ? { duration: 0.001, fill: 'none' as FillMode }\n : {\n ...(options || {}),\n duration: 0.001,\n delay: 0,\n iterations: 1,\n fill: 'none' as FillMode,\n };\n delete (opts as any).iterationStart;\n delete (opts as any).endDelay;\n\n const anim = originalAnimate!.call(this, keyframes, opts);\n try { anim.cancel(); } 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 4: GSAP\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 // Layer 5: 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 }\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 }\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 (debounced)\n //\n // V6: Only cancels WAAPI animations and pauses new media. Does NOT\n // manipulate inline styles (that's handled purely by CSS !important).\n // =========================================================================\n\n function debouncedRescan() {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n if (!enabled) return;\n cancelAllAnimations();\n pauseAllVideos();\n freezeAllGifs();\n pauseSVG();\n }, 150);\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 debouncedRescan();\n }\n });\n mutationObserver.observe(document.body, { childList: true, subtree: true });\n }\n\n function teardownObserver() {\n mutationObserver?.disconnect();\n mutationObserver = null;\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n }\n\n // =========================================================================\n // Periodic re-scan — cancel animations frameworks keep creating\n // =========================================================================\n\n function startPeriodicScan() {\n if (scanInterval) return;\n scanInterval = setInterval(() => {\n if (!enabled) return;\n cancelAllAnimations();\n }, 2000);\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 3 first: intercept new WAAPI animations before anything else\n patchAnimate();\n\n // Layer 1: CSS — handles transitions, animations, AND visibility forcing\n injectStyles();\n\n // Layer 2: Cancel all currently running WAAPI animations\n cancelAllAnimations();\n\n // Layer 4: GSAP\n patchGSAP();\n\n // Layer 5: Media\n pauseAllVideos();\n interceptVideoPlay();\n freezeAllGifs();\n pauseSVG();\n stopMarquees();\n\n // Observers\n setupObserver();\n startPeriodicScan();\n\n // Two delayed re-scans for late-loading frameworks (reduced from 6).\n const schedule = (fn: () => void, ms: number) =>\n setTimeout(() => { if (enabled) fn(); }, ms);\n\n delayedTimers.push(schedule(() => {\n cancelAllAnimations();\n pauseAllVideos();\n freezeAllGifs();\n }, 500));\n\n delayedTimers.push(schedule(() => {\n cancelAllAnimations();\n pauseAllVideos();\n freezeAllGifs();\n }, 2000));\n\n localStorage.setItem(STORAGE_KEY, 'true');\n }\n\n function deactivate() {\n enabled = false;\n\n // Clear all timers\n for (const t of delayedTimers) clearTimeout(t);\n delayedTimers = [];\n\n stopPeriodicScan();\n teardownObserver();\n restoreAnimate();\n restoreGSAP();\n startMarquees();\n resumeSVG();\n restoreAllGifs();\n resumeAllVideos();\n\n // Remove CSS — this instantly restores all visibility, transitions,\n // and animations because the !important rules are gone.\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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"}