accessify-widget 0.2.5 → 0.2.7

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-eprjFXa3.js";
1
+ import { d, i } from "./index-BMtzwb7-.js";
2
2
  export {
3
3
  d as destroy,
4
4
  i as init
@@ -18,36 +18,26 @@ function createAnimationStopModule() {
18
18
  return `
19
19
  /* accessify animation stop - WCAG 2.3.1 compliance */
20
20
  *, *::before, *::after {
21
- animation-duration: 0.01s !important;
21
+ animation-duration: 0.001s !important;
22
22
  animation-delay: 0s !important;
23
23
  animation-iteration-count: 1 !important;
24
- animation-play-state: paused !important;
25
- transition-duration: 0.01s !important;
24
+ animation-fill-mode: forwards !important;
25
+ transition-duration: 0.001s !important;
26
26
  transition-delay: 0s !important;
27
27
  scroll-behavior: auto !important;
28
28
  }
29
29
 
30
- /* Framer appear elements — force visible (they start at opacity:0.001) */
30
+ /* Framer appear elements — force visible only (do NOT touch transform — it breaks layout) */
31
31
  [data-framer-appear-id] {
32
32
  opacity: 1 !important;
33
- transform: none !important;
34
- will-change: auto !important;
35
33
  }
36
34
 
37
- /* Framer page containers with near-zero opacity */
38
- [data-framer-component-type] [style*="opacity"] {
39
- opacity: 1 !important;
40
- }
35
+ marquee { -moz-binding: none; }
41
36
 
42
- /* Generic: any element with will-change:transform that might be hidden by animation libs */
43
- [style*="will-change"][style*="opacity:0"],
44
- [style*="will-change"][style*="opacity: 0"] {
45
- opacity: 1 !important;
46
- transform: none !important;
47
- will-change: auto !important;
37
+ /* Pause HTML5 video playback visually */
38
+ video {
39
+ animation-play-state: paused !important;
48
40
  }
49
-
50
- marquee { -moz-binding: none; }
51
41
  `;
52
42
  }
53
43
  function injectStyles() {
@@ -62,13 +52,20 @@ function createAnimationStopModule() {
62
52
  function removeStyles() {
63
53
  document.getElementById(STYLE_ID)?.remove();
64
54
  }
65
- function pauseAllWebAnimations() {
55
+ function finishAllWebAnimations() {
66
56
  try {
67
57
  const animations = document.getAnimations();
68
58
  for (const anim of animations) {
69
59
  if (anim.playState === "running" || anim.playState === "pending") {
70
- anim.pause();
71
60
  pausedAnimations.push(anim);
61
+ try {
62
+ anim.finish();
63
+ } catch {
64
+ try {
65
+ anim.cancel();
66
+ } catch {
67
+ }
68
+ }
72
69
  }
73
70
  }
74
71
  } catch {
@@ -80,8 +77,15 @@ function createAnimationStopModule() {
80
77
  Element.prototype.animate = function(keyframes, options) {
81
78
  const anim = originalAnimate.call(this, keyframes, options);
82
79
  if (enabled) {
83
- anim.pause();
84
80
  pausedAnimations.push(anim);
81
+ try {
82
+ anim.finish();
83
+ } catch {
84
+ try {
85
+ anim.cancel();
86
+ } catch {
87
+ }
88
+ }
85
89
  }
86
90
  return anim;
87
91
  };
@@ -93,12 +97,6 @@ function createAnimationStopModule() {
93
97
  }
94
98
  }
95
99
  function resumePausedAnimations() {
96
- for (const anim of pausedAnimations) {
97
- try {
98
- anim.play();
99
- } catch {
100
- }
101
- }
102
100
  pausedAnimations = [];
103
101
  }
104
102
  function overrideRAF() {
@@ -148,8 +146,15 @@ function createAnimationStopModule() {
148
146
  const anims = node.getAnimations({ subtree: true });
149
147
  for (const anim of anims) {
150
148
  if (anim.playState === "running" || anim.playState === "pending") {
151
- anim.pause();
152
149
  pausedAnimations.push(anim);
150
+ try {
151
+ anim.finish();
152
+ } catch {
153
+ try {
154
+ anim.cancel();
155
+ } catch {
156
+ }
157
+ }
153
158
  }
154
159
  }
155
160
  } catch {
@@ -261,13 +266,12 @@ function createAnimationStopModule() {
261
266
  const appearEls = document.querySelectorAll("[data-framer-appear-id]");
262
267
  for (const el of appearEls) {
263
268
  if (el.hasAttribute(FRAMER_FIXED_ATTR)) continue;
269
+ if (el.closest("#accessify-root")) continue;
264
270
  const computed = getComputedStyle(el);
265
271
  const opacity = parseFloat(computed.opacity);
266
- if (opacity < 0.95) {
272
+ if (opacity < 0.5) {
267
273
  framerFixedElements.push({ el, origStyle: el.getAttribute("style") || "" });
268
274
  el.style.setProperty("opacity", "1", "important");
269
- el.style.setProperty("transform", "none", "important");
270
- el.style.setProperty("will-change", "auto", "important");
271
275
  el.setAttribute(FRAMER_FIXED_ATTR, "true");
272
276
  }
273
277
  }
@@ -277,11 +281,9 @@ function createAnimationStopModule() {
277
281
  if (el.closest("#accessify-root")) continue;
278
282
  const computed = getComputedStyle(el);
279
283
  const opacity = parseFloat(computed.opacity);
280
- if (opacity < 0.1 && computed.willChange.includes("transform")) {
284
+ if (opacity < 0.05 && computed.willChange.includes("transform")) {
281
285
  framerFixedElements.push({ el, origStyle: el.getAttribute("style") || "" });
282
286
  el.style.setProperty("opacity", "1", "important");
283
- el.style.setProperty("transform", "none", "important");
284
- el.style.setProperty("will-change", "auto", "important");
285
287
  el.setAttribute(FRAMER_FIXED_ATTR, "true");
286
288
  }
287
289
  }
@@ -298,13 +300,12 @@ function createAnimationStopModule() {
298
300
  }
299
301
  function forceFramerAppearVisibleSingle(el) {
300
302
  if (el.hasAttribute(FRAMER_FIXED_ATTR)) return;
303
+ if (el.closest("#accessify-root")) return;
301
304
  const computed = getComputedStyle(el);
302
305
  const opacity = parseFloat(computed.opacity);
303
- if (opacity < 0.95) {
306
+ if (opacity < 0.5) {
304
307
  framerFixedElements.push({ el, origStyle: el.getAttribute("style") || "" });
305
308
  el.style.setProperty("opacity", "1", "important");
306
- el.style.setProperty("transform", "none", "important");
307
- el.style.setProperty("will-change", "auto", "important");
308
309
  el.setAttribute(FRAMER_FIXED_ATTR, "true");
309
310
  }
310
311
  }
@@ -317,14 +318,11 @@ function createAnimationStopModule() {
317
318
  for (const m of mutations) {
318
319
  if (m.type !== "attributes" || m.attributeName !== "style") continue;
319
320
  const el = m.target;
320
- const isFramerEl = el.hasAttribute("data-framer-appear-id") || el.hasAttribute("data-framer-component-type") || el.closest("[data-framer-appear-id]") !== null;
321
- const hasWillChange = el.style.willChange?.includes("transform") || el.style.willChange?.includes("opacity");
322
- if (!isFramerEl && !hasWillChange) continue;
321
+ if (el.closest("#accessify-root")) continue;
322
+ if (!el.hasAttribute("data-framer-appear-id")) continue;
323
323
  const opacity = parseFloat(el.style.opacity);
324
- if (!isNaN(opacity) && opacity < 0.1) {
324
+ if (!isNaN(opacity) && opacity < 0.5) {
325
325
  el.style.setProperty("opacity", "1", "important");
326
- el.style.setProperty("transform", "none", "important");
327
- el.style.setProperty("will-change", "auto", "important");
328
326
  }
329
327
  }
330
328
  isOurChange = false;
@@ -344,8 +342,9 @@ function createAnimationStopModule() {
344
342
  for (const delay of delays) {
345
343
  const timer = setTimeout(() => {
346
344
  if (!enabled) return;
345
+ finishAllWebAnimations();
347
346
  forceAllHiddenVisible();
348
- pauseAllWebAnimations();
347
+ pauseAutoplayVideos();
349
348
  freezeAllGifs();
350
349
  pauseSVGAnimations();
351
350
  stopMarquees();
@@ -360,18 +359,16 @@ function createAnimationStopModule() {
360
359
  function forceAllHiddenVisible() {
361
360
  forceFramerAppearVisible();
362
361
  const candidates = document.querySelectorAll(
363
- '[data-framer-appear-id], [data-framer-component-type] *, [style*="will-change"], [style*="opacity"]'
362
+ '[data-framer-appear-id], [style*="opacity:0.0"], [style*="opacity: 0.0"]'
364
363
  );
365
364
  for (const el of candidates) {
366
365
  if (el.hasAttribute(FRAMER_FIXED_ATTR)) continue;
367
366
  if (el.closest("#accessify-root")) continue;
368
367
  const computed = getComputedStyle(el);
369
368
  const opacity = parseFloat(computed.opacity);
370
- if (opacity < 0.1) {
369
+ if (opacity < 0.05) {
371
370
  frozenInlineElements.set(el, el.getAttribute("style") || "");
372
371
  el.style.setProperty("opacity", "1", "important");
373
- el.style.setProperty("transform", "none", "important");
374
- el.style.setProperty("will-change", "auto", "important");
375
372
  el.setAttribute(FRAMER_FIXED_ATTR, "true");
376
373
  }
377
374
  }
@@ -422,8 +419,9 @@ function createAnimationStopModule() {
422
419
  }
423
420
  });
424
421
  }
422
+ let originalVideoPlay = null;
425
423
  function pauseAutoplayVideos() {
426
- const videos = document.querySelectorAll("video[autoplay], video");
424
+ const videos = document.querySelectorAll("video");
427
425
  pausedVideos = [];
428
426
  videos.forEach((video) => {
429
427
  if (!video.paused) {
@@ -431,8 +429,31 @@ function createAnimationStopModule() {
431
429
  pausedVideos.push(video);
432
430
  }
433
431
  });
432
+ videos.forEach((video) => {
433
+ if (video.hasAttribute("autoplay")) {
434
+ video.dataset.accessifyAutoplay = "true";
435
+ video.removeAttribute("autoplay");
436
+ }
437
+ });
438
+ if (!originalVideoPlay) {
439
+ originalVideoPlay = HTMLVideoElement.prototype.play;
440
+ HTMLVideoElement.prototype.play = function() {
441
+ if (enabled) {
442
+ return Promise.resolve();
443
+ }
444
+ return originalVideoPlay.call(this);
445
+ };
446
+ }
434
447
  }
435
448
  function resumePausedVideos() {
449
+ if (originalVideoPlay) {
450
+ HTMLVideoElement.prototype.play = originalVideoPlay;
451
+ originalVideoPlay = null;
452
+ }
453
+ document.querySelectorAll("video[data-accessify-autoplay]").forEach((video) => {
454
+ video.setAttribute("autoplay", "");
455
+ delete video.dataset.accessifyAutoplay;
456
+ });
436
457
  pausedVideos.forEach((video) => {
437
458
  try {
438
459
  video.play();
@@ -445,7 +466,7 @@ function createAnimationStopModule() {
445
466
  if (enabled) return;
446
467
  enabled = true;
447
468
  injectStyles();
448
- pauseAllWebAnimations();
469
+ finishAllWebAnimations();
449
470
  overrideElementAnimate();
450
471
  overrideRAF();
451
472
  setupMutationObserver();
@@ -502,4 +523,4 @@ function createAnimationStopModule() {
502
523
  export {
503
524
  createAnimationStopModule as default
504
525
  };
505
- //# sourceMappingURL=animation-stop-C6ToNlBr.js.map
526
+ //# sourceMappingURL=animation-stop-qzU8H8Dg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-stop-qzU8H8Dg.js","sources":["../src/features/animation-stop.ts"],"sourcesContent":["import type { FeatureModule, FeatureState } from '../types';\n\nexport default function createAnimationStopModule(): FeatureModule {\n let enabled = false;\n const STYLE_ID = 'accessify-animation-stop';\n const STORAGE_KEY = 'accessify-animation-stop';\n\n // --- State for clean restore ---\n let pausedVideos: HTMLVideoElement[] = [];\n let pausedAnimations: Animation[] = [];\n let originalAnimate: typeof Element.prototype.animate | null = null;\n let originalRAF: typeof window.requestAnimationFrame | null = null;\n let originalMatchMedia: typeof window.matchMedia | null = null;\n let mutationObserver: MutationObserver | null = null;\n let rafLoopTracker = new Map<string, { count: number; lastTime: number }>();\n let blockedRAFs = new Set<number>();\n let gifOriginals = new Map<HTMLImageElement, string>();\n let reducedMotionListeners: Array<{ mql: MediaQueryList; handler: () => void }> = [];\n let styleObserver: MutationObserver | null = null;\n let delayedTimers: ReturnType<typeof setTimeout>[] = [];\n let frozenInlineElements = new Map<HTMLElement, string>();\n\n // -------------------------------------------------------------------------\n // Layer 0: CSS overrides (existing — catches pure CSS animations)\n // -------------------------------------------------------------------------\n\n function getStyles(): string {\n return `\n /* accessify animation stop - WCAG 2.3.1 compliance */\n *, *::before, *::after {\n animation-duration: 0.001s !important;\n animation-delay: 0s !important;\n animation-iteration-count: 1 !important;\n animation-fill-mode: forwards !important;\n transition-duration: 0.001s !important;\n transition-delay: 0s !important;\n scroll-behavior: auto !important;\n }\n\n /* Framer appear elements — force visible only (do NOT touch transform — it breaks layout) */\n [data-framer-appear-id] {\n opacity: 1 !important;\n }\n\n marquee { -moz-binding: none; }\n\n /* Pause HTML5 video playback visually */\n video {\n animation-play-state: paused !important;\n }\n `;\n }\n\n function injectStyles() {\n let styleEl = document.getElementById(STYLE_ID);\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent = getStyles();\n }\n\n function removeStyles() {\n document.getElementById(STYLE_ID)?.remove();\n }\n\n // -------------------------------------------------------------------------\n // Layer 1: Web Animations API — FINISH all running animations instantly\n // Key insight: pause() freezes elements at START state (invisible).\n // finish() jumps to END state (visible). This is what we need.\n // -------------------------------------------------------------------------\n\n function finishAllWebAnimations() {\n try {\n const animations = document.getAnimations();\n for (const anim of animations) {\n if (anim.playState === 'running' || anim.playState === 'pending') {\n pausedAnimations.push(anim);\n try {\n // finish() jumps to end state — element becomes fully visible\n anim.finish();\n } catch {\n // finish() fails on infinite animations — cancel them instead\n // and the CSS !important rules will handle visibility\n try { anim.cancel(); } catch { /* ignore */ }\n }\n }\n }\n } catch { /* getAnimations not supported */ }\n }\n\n function overrideElementAnimate() {\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 const anim = originalAnimate!.call(this, keyframes, options);\n if (enabled) {\n pausedAnimations.push(anim);\n try {\n anim.finish();\n } catch {\n try { anim.cancel(); } catch { /* ignore */ }\n }\n }\n return anim;\n };\n }\n\n function restoreElementAnimate() {\n if (originalAnimate) {\n Element.prototype.animate = originalAnimate;\n originalAnimate = null;\n }\n }\n\n function resumePausedAnimations() {\n // We finished/cancelled animations — nothing to resume.\n // Just clear the list.\n pausedAnimations = [];\n }\n\n // -------------------------------------------------------------------------\n // Layer 2: requestAnimationFrame loop detection\n // -------------------------------------------------------------------------\n\n function overrideRAF() {\n if (originalRAF) return;\n originalRAF = window.requestAnimationFrame;\n const origCancel = window.cancelAnimationFrame;\n\n window.requestAnimationFrame = function (callback: FrameRequestCallback): number {\n if (!enabled) return originalRAF!.call(window, callback);\n\n // Fingerprint callback to detect animation loops\n const key = callback.toString().slice(0, 200);\n const now = performance.now();\n const entry = rafLoopTracker.get(key);\n\n if (entry) {\n entry.count++;\n if (now - entry.lastTime < 100 && entry.count > 3) {\n // This callback is re-registering rapidly — animation loop detected\n const id = originalRAF!.call(window, () => {}); // no-op\n blockedRAFs.add(id);\n return id;\n }\n entry.lastTime = now;\n } else {\n rafLoopTracker.set(key, { count: 1, lastTime: now });\n }\n\n // Allow through but wrap to track re-registration\n return originalRAF!.call(window, callback);\n };\n\n window.cancelAnimationFrame = function (id: number) {\n blockedRAFs.delete(id);\n return origCancel.call(window, id);\n };\n }\n\n function restoreRAF() {\n if (originalRAF) {\n window.requestAnimationFrame = originalRAF;\n originalRAF = null;\n }\n rafLoopTracker.clear();\n blockedRAFs.clear();\n }\n\n // -------------------------------------------------------------------------\n // Layer 3: MutationObserver — catch dynamically added animated elements\n // -------------------------------------------------------------------------\n\n function setupMutationObserver() {\n if (mutationObserver) return;\n\n mutationObserver = new MutationObserver((mutations) => {\n if (!enabled) return;\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (!(node instanceof HTMLElement)) continue;\n // Finish animations on newly added elements (jump to end state)\n try {\n const anims = node.getAnimations({ subtree: true });\n for (const anim of anims) {\n if (anim.playState === 'running' || anim.playState === 'pending') {\n pausedAnimations.push(anim);\n try { anim.finish(); } catch { try { anim.cancel(); } catch { /* ignore */ } }\n }\n }\n } catch { /* not supported */ }\n\n // Pause new videos\n if (node.tagName === 'VIDEO') {\n const video = node as HTMLVideoElement;\n if (!video.paused) {\n video.pause();\n pausedVideos.push(video);\n }\n }\n node.querySelectorAll?.('video')?.forEach((video) => {\n if (!video.paused) {\n video.pause();\n pausedVideos.push(video);\n }\n });\n\n // Freeze new GIFs\n if (node.tagName === 'IMG') {\n freezeGif(node as HTMLImageElement);\n }\n node.querySelectorAll?.('img')?.forEach((img) => freezeGif(img));\n\n // Fix Framer appear elements added dynamically\n if (node.hasAttribute?.('data-framer-appear-id')) {\n forceFramerAppearVisibleSingle(node);\n }\n node.querySelectorAll?.('[data-framer-appear-id]')?.forEach((el) => {\n forceFramerAppearVisibleSingle(el as HTMLElement);\n });\n }\n }\n });\n\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n function disconnectMutationObserver() {\n mutationObserver?.disconnect();\n mutationObserver = null;\n }\n\n // -------------------------------------------------------------------------\n // Layer 4: prefers-reduced-motion emulation\n // -------------------------------------------------------------------------\n\n function emulateReducedMotion() {\n if (originalMatchMedia) return;\n originalMatchMedia = window.matchMedia;\n\n window.matchMedia = function (query: string): MediaQueryList {\n const mql = originalMatchMedia!.call(window, query);\n\n if (query.includes('prefers-reduced-motion')) {\n // Return a proxy that always reports matches: true\n const proxy = Object.create(mql);\n Object.defineProperty(proxy, 'matches', { get: () => enabled, configurable: true });\n Object.defineProperty(proxy, 'media', { get: () => query, configurable: true });\n return proxy;\n }\n return mql;\n };\n\n // Trigger change event on existing reduced-motion media queries\n // so frameworks (Framer Motion, GSAP) react immediately\n try {\n const mql = originalMatchMedia.call(window, '(prefers-reduced-motion: reduce)');\n mql.dispatchEvent(new MediaQueryListEvent('change', { matches: true, media: mql.media }));\n } catch { /* older browsers */ }\n }\n\n function restoreMatchMedia() {\n if (originalMatchMedia) {\n window.matchMedia = originalMatchMedia;\n originalMatchMedia = null;\n\n // Dispatch change event to signal motion is allowed again\n try {\n const mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n mql.dispatchEvent(new MediaQueryListEvent('change', { matches: mql.matches, media: mql.media }));\n } catch { /* older browsers */ }\n }\n }\n\n // -------------------------------------------------------------------------\n // Layer 5: GIF freeze — replace with static first frame\n // -------------------------------------------------------------------------\n\n function freezeGif(img: HTMLImageElement) {\n const src = img.src || img.getAttribute('src') || '';\n if (!src.toLowerCase().includes('.gif')) return;\n if (gifOriginals.has(img)) return;\n\n const freeze = () => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth || img.width;\n canvas.height = img.naturalHeight || img.height;\n if (canvas.width === 0 || canvas.height === 0) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.drawImage(img, 0, 0);\n gifOriginals.set(img, src);\n img.src = canvas.toDataURL('image/png');\n } catch { /* cross-origin, skip */ }\n };\n\n if (img.complete && img.naturalWidth > 0) {\n freeze();\n } else {\n img.addEventListener('load', freeze, { once: true });\n }\n }\n\n function freezeAllGifs() {\n document.querySelectorAll<HTMLImageElement>('img').forEach(freezeGif);\n }\n\n function restoreGifs() {\n for (const [img, originalSrc] of gifOriginals) {\n try { img.src = originalSrc; } catch { /* element may be gone */ }\n }\n gifOriginals.clear();\n }\n\n // -------------------------------------------------------------------------\n // Layer 6: Framer appear animations — force visible\n // Framer renders elements with opacity:0.001 + will-change:transform and\n // animates them in via JS. When we stop animations, they stay invisible.\n // Fix: force all Framer appear elements to their final visible state.\n // -------------------------------------------------------------------------\n\n const FRAMER_FIXED_ATTR = 'data-accessify-framer-fixed';\n let framerFixedElements: Array<{ el: HTMLElement; origStyle: string }> = [];\n\n function forceFramerAppearVisible() {\n // Framer appear elements — force opacity only, NEVER touch transform (breaks layout)\n const appearEls = document.querySelectorAll<HTMLElement>('[data-framer-appear-id]');\n for (const el of appearEls) {\n if (el.hasAttribute(FRAMER_FIXED_ATTR)) continue;\n if (el.closest('#accessify-root')) continue;\n const computed = getComputedStyle(el);\n const opacity = parseFloat(computed.opacity);\n if (opacity < 0.5) {\n framerFixedElements.push({ el, origStyle: el.getAttribute('style') || '' });\n el.style.setProperty('opacity', '1', 'important');\n el.setAttribute(FRAMER_FIXED_ATTR, 'true');\n }\n }\n\n // Generic: any element with very low opacity + will-change:transform\n const allWillChange = document.querySelectorAll<HTMLElement>('[style*=\"will-change\"]');\n for (const el of allWillChange) {\n if (el.hasAttribute(FRAMER_FIXED_ATTR)) continue;\n if (el.closest('#accessify-root')) continue;\n const computed = getComputedStyle(el);\n const opacity = parseFloat(computed.opacity);\n if (opacity < 0.05 && computed.willChange.includes('transform')) {\n framerFixedElements.push({ el, origStyle: el.getAttribute('style') || '' });\n el.style.setProperty('opacity', '1', 'important');\n el.setAttribute(FRAMER_FIXED_ATTR, 'true');\n }\n }\n }\n\n function restoreFramerAppear() {\n for (const { el, origStyle } of framerFixedElements) {\n try {\n el.setAttribute('style', origStyle);\n el.removeAttribute(FRAMER_FIXED_ATTR);\n } catch { /* element may be gone */ }\n }\n framerFixedElements = [];\n }\n\n function forceFramerAppearVisibleSingle(el: HTMLElement) {\n if (el.hasAttribute(FRAMER_FIXED_ATTR)) return;\n if (el.closest('#accessify-root')) return;\n const computed = getComputedStyle(el);\n const opacity = parseFloat(computed.opacity);\n if (opacity < 0.5) {\n framerFixedElements.push({ el, origStyle: el.getAttribute('style') || '' });\n el.style.setProperty('opacity', '1', 'important');\n el.setAttribute(FRAMER_FIXED_ATTR, 'true');\n }\n }\n\n // -------------------------------------------------------------------------\n // Layer 8: Style attribute mutation observer — counter inline style animations\n // Framer, GSAP, and other JS libs set transform/opacity directly via\n // element.style on every frame. CSS !important should win, but some libs\n // use setProperty with 'important' or the style attribute gets fully\n // rewritten. This observer catches and re-forces visibility.\n // -------------------------------------------------------------------------\n\n function setupStyleObserver() {\n if (styleObserver) return;\n let isOurChange = false;\n\n styleObserver = new MutationObserver((mutations) => {\n if (!enabled || isOurChange) return;\n isOurChange = true;\n\n for (const m of mutations) {\n if (m.type !== 'attributes' || m.attributeName !== 'style') continue;\n const el = m.target as HTMLElement;\n if (el.closest('#accessify-root')) continue;\n\n // Only act on Framer appear elements\n if (!el.hasAttribute('data-framer-appear-id')) continue;\n\n const opacity = parseFloat(el.style.opacity);\n if (!isNaN(opacity) && opacity < 0.5) {\n el.style.setProperty('opacity', '1', 'important');\n }\n }\n\n isOurChange = false;\n });\n\n styleObserver.observe(document.body, {\n attributes: true,\n attributeFilter: ['style'],\n subtree: true,\n });\n }\n\n function disconnectStyleObserver() {\n styleObserver?.disconnect();\n styleObserver = null;\n }\n\n // -------------------------------------------------------------------------\n // Layer 9: Delayed re-scans — Framer loads async, elements appear late\n // -------------------------------------------------------------------------\n\n function scheduleDelayedScans() {\n const delays = [500, 1000, 2000, 4000];\n for (const delay of delays) {\n const timer = setTimeout(() => {\n if (!enabled) return;\n finishAllWebAnimations();\n forceAllHiddenVisible();\n pauseAutoplayVideos();\n freezeAllGifs();\n pauseSVGAnimations();\n stopMarquees();\n }, delay);\n delayedTimers.push(timer);\n }\n }\n\n function clearDelayedScans() {\n for (const timer of delayedTimers) clearTimeout(timer);\n delayedTimers = [];\n }\n\n // -------------------------------------------------------------------------\n // Force ALL hidden animation targets visible — aggressive sweep\n // -------------------------------------------------------------------------\n\n function forceAllHiddenVisible() {\n // 1. Framer appear elements\n forceFramerAppearVisible();\n\n // 2. Targeted sweep: only elements that are clearly animation-hidden\n // (very low opacity + animation-related attributes)\n const candidates = document.querySelectorAll<HTMLElement>(\n '[data-framer-appear-id], [style*=\"opacity:0.0\"], [style*=\"opacity: 0.0\"]'\n );\n for (const el of candidates) {\n if (el.hasAttribute(FRAMER_FIXED_ATTR)) continue;\n if (el.closest('#accessify-root')) continue;\n const computed = getComputedStyle(el);\n const opacity = parseFloat(computed.opacity);\n if (opacity < 0.05) {\n frozenInlineElements.set(el, el.getAttribute('style') || '');\n el.style.setProperty('opacity', '1', 'important');\n el.setAttribute(FRAMER_FIXED_ATTR, 'true');\n }\n }\n }\n\n function restoreFrozenInlineElements() {\n for (const [el, origStyle] of frozenInlineElements) {\n try {\n el.setAttribute('style', origStyle);\n el.removeAttribute(FRAMER_FIXED_ATTR);\n } catch { /* element may be gone */ }\n }\n frozenInlineElements.clear();\n }\n\n // -------------------------------------------------------------------------\n // Layer 7: Marquee & SVG SMIL animations\n // -------------------------------------------------------------------------\n\n function stopMarquees() {\n document.querySelectorAll('marquee').forEach((el) => {\n try { (el as any).stop(); } catch { /* not supported */ }\n });\n }\n\n function startMarquees() {\n document.querySelectorAll('marquee').forEach((el) => {\n try { (el as any).start(); } catch { /* not supported */ }\n });\n }\n\n function pauseSVGAnimations() {\n document.querySelectorAll('svg').forEach((svg) => {\n try {\n if (typeof (svg as any).pauseAnimations === 'function') {\n (svg as any).pauseAnimations();\n }\n } catch { /* not supported */ }\n });\n }\n\n function resumeSVGAnimations() {\n document.querySelectorAll('svg').forEach((svg) => {\n try {\n if (typeof (svg as any).unpauseAnimations === 'function') {\n (svg as any).unpauseAnimations();\n }\n } catch { /* not supported */ }\n });\n }\n\n // -------------------------------------------------------------------------\n // Video control — pause all videos + intercept play()\n // -------------------------------------------------------------------------\n\n let originalVideoPlay: typeof HTMLVideoElement.prototype.play | null = null;\n\n function pauseAutoplayVideos() {\n const videos = document.querySelectorAll<HTMLVideoElement>('video');\n pausedVideos = [];\n videos.forEach((video) => {\n if (!video.paused) {\n video.pause();\n pausedVideos.push(video);\n }\n });\n\n // Also remove autoplay attribute to prevent re-play\n videos.forEach((video) => {\n if (video.hasAttribute('autoplay')) {\n video.dataset.accessifyAutoplay = 'true';\n video.removeAttribute('autoplay');\n }\n });\n\n // Override play() to prevent JS from starting videos\n if (!originalVideoPlay) {\n originalVideoPlay = HTMLVideoElement.prototype.play;\n HTMLVideoElement.prototype.play = function () {\n if (enabled) {\n // Block autoplay, return resolved promise to avoid errors\n return Promise.resolve();\n }\n return originalVideoPlay!.call(this);\n };\n }\n }\n\n function resumePausedVideos() {\n // Restore play()\n if (originalVideoPlay) {\n HTMLVideoElement.prototype.play = originalVideoPlay;\n originalVideoPlay = null;\n }\n\n // Restore autoplay attributes\n document.querySelectorAll<HTMLVideoElement>('video[data-accessify-autoplay]').forEach((video) => {\n video.setAttribute('autoplay', '');\n delete video.dataset.accessifyAutoplay;\n });\n\n // Resume previously paused videos\n pausedVideos.forEach((video) => {\n try { video.play(); } catch { /* removed from DOM */ }\n });\n pausedVideos = [];\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n function activate() {\n if (enabled) return;\n enabled = true;\n\n // Layer 0: CSS overrides (includes Framer-specific !important rules)\n injectStyles();\n\n // Layer 1: Web Animations API — finish all (jump to end state)\n finishAllWebAnimations();\n overrideElementAnimate();\n\n // Layer 2: RAF loop detection\n overrideRAF();\n\n // Layer 3: MutationObserver for dynamic content\n setupMutationObserver();\n\n // Layer 4: prefers-reduced-motion emulation\n emulateReducedMotion();\n\n // Layer 5: GIF freeze\n freezeAllGifs();\n\n // Layer 6: Framer appear — force visible\n forceFramerAppearVisible();\n\n // Layer 7: Marquee & SVG SMIL\n stopMarquees();\n pauseSVGAnimations();\n\n // Layer 8: Style attribute mutation observer (counters Framer inline style updates)\n setupStyleObserver();\n\n // Layer 9: Delayed re-scans (Framer loads elements async)\n scheduleDelayedScans();\n\n // Videos\n pauseAutoplayVideos();\n\n // Aggressive sweep — force all hidden animation targets visible\n forceAllHiddenVisible();\n\n localStorage.setItem(STORAGE_KEY, 'true');\n }\n\n function deactivate() {\n enabled = false;\n\n // Reverse order for clean teardown\n clearDelayedScans();\n disconnectStyleObserver();\n restoreFrozenInlineElements();\n resumePausedVideos();\n resumeSVGAnimations();\n startMarquees();\n restoreFramerAppear();\n restoreGifs();\n restoreMatchMedia();\n disconnectMutationObserver();\n restoreRAF();\n restoreElementAnimate();\n resumePausedAnimations();\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 => ({\n id: 'animation-stop',\n enabled,\n }),\n setState: (state: { enabled: boolean }) => {\n if (state.enabled) {\n activate();\n } else {\n deactivate();\n }\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -6310,14 +6310,14 @@ function FeatureGrid($$anchor, $$props) {
6310
6310
  const FEATURE_LOADERS = {
6311
6311
  contrast: () => import("./contrast-CqsICAkU.js"),
6312
6312
  "text-size": () => import("./text-size-C6OFhCGi.js"),
6313
- "keyboard-nav": () => import("./keyboard-nav-CAWn30Tw.js"),
6313
+ "keyboard-nav": () => import("./keyboard-nav-CvcwFy17.js"),
6314
6314
  "link-highlight": () => import("./link-highlight-DBGm067Y.js"),
6315
6315
  "reading-guide": () => import("./reading-guide-VT8NciIL.js"),
6316
6316
  "reading-mask": () => import("./reading-mask-BABChuCz.js"),
6317
- "animation-stop": () => import("./animation-stop-C6ToNlBr.js"),
6317
+ "animation-stop": () => import("./animation-stop-qzU8H8Dg.js"),
6318
6318
  "hide-images": () => import("./hide-images-B_LeCBcd.js"),
6319
6319
  "big-cursor": () => import("./big-cursor-B2UKu9dQ.js"),
6320
- "page-structure": () => import("./page-structure-DDjJeVCc.js"),
6320
+ "page-structure": () => import("./page-structure-JcBWoFgG.js"),
6321
6321
  tts: () => import("./tts-CjszLRnb.js"),
6322
6322
  "text-simplify": () => import("./text-simplify-B1v6Muvn.js"),
6323
6323
  "alt-text": () => Promise.resolve().then(() => altText)
@@ -8400,4 +8400,4 @@ export {
8400
8400
  init as i,
8401
8401
  t
8402
8402
  };
8403
- //# sourceMappingURL=index-eprjFXa3.js.map
8403
+ //# sourceMappingURL=index-BMtzwb7-.js.map