accessify-widget 0.2.9 → 0.2.10

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-DiDUF8l8.js";
1
+ import { d, i } from "./index-BGQhnTlr.js";
2
2
  export {
3
3
  d as destroy,
4
4
  i as init
@@ -0,0 +1,236 @@
1
+ function createAnimationStopModule() {
2
+ let enabled = false;
3
+ const STYLE_ID = "accessify-animation-stop";
4
+ const STORAGE_KEY = "accessify-animation-stop";
5
+ let pausedVideos = [];
6
+ let gifOriginals = /* @__PURE__ */ new Map();
7
+ let mutationObserver = null;
8
+ let originalVideoPlay = null;
9
+ function getStyles() {
10
+ return `
11
+ /* Accessify — stop visible motion (WCAG 2.3.1)
12
+ 0.01ms duration so animationend/transitionend events still fire. */
13
+ *, *::before, *::after {
14
+ animation-duration: 0.01ms !important;
15
+ animation-iteration-count: 1 !important;
16
+ animation-delay: 0s !important;
17
+ }
18
+ *, *::before, *::after {
19
+ transition-duration: 0.01ms !important;
20
+ transition-delay: 0s !important;
21
+ }
22
+ html {
23
+ scroll-behavior: auto !important;
24
+ }
25
+ marquee {
26
+ -moz-binding: none !important;
27
+ overflow: hidden !important;
28
+ }
29
+ `;
30
+ }
31
+ function injectStyles() {
32
+ if (document.getElementById(STYLE_ID)) return;
33
+ const style = document.createElement("style");
34
+ style.id = STYLE_ID;
35
+ style.textContent = getStyles();
36
+ document.head.appendChild(style);
37
+ }
38
+ function removeStyles() {
39
+ document.getElementById(STYLE_ID)?.remove();
40
+ }
41
+ function pauseAllVideos() {
42
+ document.querySelectorAll("video").forEach((video) => {
43
+ if (!video.paused) {
44
+ video.pause();
45
+ video.dataset.accessifyPaused = "true";
46
+ pausedVideos.push(video);
47
+ }
48
+ });
49
+ }
50
+ function interceptVideoPlay() {
51
+ if (originalVideoPlay) return;
52
+ originalVideoPlay = HTMLVideoElement.prototype.play;
53
+ HTMLVideoElement.prototype.play = function() {
54
+ if (enabled) return Promise.resolve();
55
+ return originalVideoPlay.call(this);
56
+ };
57
+ }
58
+ function restoreVideoPlay() {
59
+ if (originalVideoPlay) {
60
+ HTMLVideoElement.prototype.play = originalVideoPlay;
61
+ originalVideoPlay = null;
62
+ }
63
+ }
64
+ function resumeAllVideos() {
65
+ restoreVideoPlay();
66
+ pausedVideos.forEach((video) => {
67
+ try {
68
+ delete video.dataset.accessifyPaused;
69
+ video.play();
70
+ } catch {
71
+ }
72
+ });
73
+ pausedVideos = [];
74
+ }
75
+ function isGif(img) {
76
+ const src = (img.src || img.getAttribute("src") || "").toLowerCase();
77
+ return src.includes(".gif");
78
+ }
79
+ function freezeGif(img) {
80
+ if (!isGif(img)) return;
81
+ if (gifOriginals.has(img)) return;
82
+ const doFreeze = () => {
83
+ try {
84
+ const w = img.naturalWidth || img.width;
85
+ const h = img.naturalHeight || img.height;
86
+ if (w === 0 || h === 0) return;
87
+ const canvas = document.createElement("canvas");
88
+ canvas.width = w;
89
+ canvas.height = h;
90
+ const ctx = canvas.getContext("2d");
91
+ if (!ctx) return;
92
+ ctx.drawImage(img, 0, 0);
93
+ gifOriginals.set(img, img.src);
94
+ img.src = canvas.toDataURL("image/png");
95
+ } catch {
96
+ }
97
+ };
98
+ if (img.complete && img.naturalWidth > 0) {
99
+ doFreeze();
100
+ } else {
101
+ img.addEventListener("load", doFreeze, { once: true });
102
+ }
103
+ }
104
+ function freezeAllGifs() {
105
+ document.querySelectorAll("img").forEach(freezeGif);
106
+ }
107
+ function restoreAllGifs() {
108
+ for (const [img, originalSrc] of gifOriginals) {
109
+ try {
110
+ img.src = originalSrc;
111
+ } catch {
112
+ }
113
+ }
114
+ gifOriginals.clear();
115
+ }
116
+ function pauseSVG() {
117
+ document.querySelectorAll("svg").forEach((svg) => {
118
+ try {
119
+ svg.pauseAnimations?.();
120
+ } catch {
121
+ }
122
+ });
123
+ }
124
+ function resumeSVG() {
125
+ document.querySelectorAll("svg").forEach((svg) => {
126
+ try {
127
+ svg.unpauseAnimations?.();
128
+ } catch {
129
+ }
130
+ });
131
+ }
132
+ function stopMarquees() {
133
+ document.querySelectorAll("marquee").forEach((el) => {
134
+ try {
135
+ el.stop?.();
136
+ } catch {
137
+ }
138
+ });
139
+ }
140
+ function startMarquees() {
141
+ document.querySelectorAll("marquee").forEach((el) => {
142
+ try {
143
+ el.start?.();
144
+ } catch {
145
+ }
146
+ });
147
+ }
148
+ function setupObserver() {
149
+ if (mutationObserver) return;
150
+ mutationObserver = new MutationObserver((mutations) => {
151
+ if (!enabled) return;
152
+ for (const mutation of mutations) {
153
+ for (const node of mutation.addedNodes) {
154
+ if (!(node instanceof HTMLElement)) continue;
155
+ if (node.tagName === "VIDEO") {
156
+ const v = node;
157
+ if (!v.paused) {
158
+ v.pause();
159
+ v.dataset.accessifyPaused = "true";
160
+ pausedVideos.push(v);
161
+ }
162
+ }
163
+ node.querySelectorAll?.("video")?.forEach((v) => {
164
+ if (!v.paused) {
165
+ v.pause();
166
+ v.dataset.accessifyPaused = "true";
167
+ pausedVideos.push(v);
168
+ }
169
+ });
170
+ if (node.tagName === "IMG") freezeGif(node);
171
+ node.querySelectorAll?.("img")?.forEach((img) => freezeGif(img));
172
+ if (node.tagName === "SVG") {
173
+ try {
174
+ node.pauseAnimations?.();
175
+ } catch {
176
+ }
177
+ }
178
+ node.querySelectorAll?.("svg")?.forEach((svg) => {
179
+ try {
180
+ svg.pauseAnimations?.();
181
+ } catch {
182
+ }
183
+ });
184
+ }
185
+ }
186
+ });
187
+ mutationObserver.observe(document.body, { childList: true, subtree: true });
188
+ }
189
+ function teardownObserver() {
190
+ mutationObserver?.disconnect();
191
+ mutationObserver = null;
192
+ }
193
+ function activate() {
194
+ if (enabled) return;
195
+ enabled = true;
196
+ injectStyles();
197
+ pauseAllVideos();
198
+ interceptVideoPlay();
199
+ freezeAllGifs();
200
+ pauseSVG();
201
+ stopMarquees();
202
+ setupObserver();
203
+ localStorage.setItem(STORAGE_KEY, "true");
204
+ }
205
+ function deactivate() {
206
+ enabled = false;
207
+ teardownObserver();
208
+ startMarquees();
209
+ resumeSVG();
210
+ restoreAllGifs();
211
+ resumeAllVideos();
212
+ removeStyles();
213
+ localStorage.removeItem(STORAGE_KEY);
214
+ }
215
+ return {
216
+ id: "animation-stop",
217
+ name: () => "Stop Animations",
218
+ description: "Pause all animations, transitions, and auto-playing videos (WCAG 2.3.1)",
219
+ icon: "animation-stop",
220
+ category: "visual",
221
+ activate,
222
+ deactivate,
223
+ getState: () => ({
224
+ id: "animation-stop",
225
+ enabled
226
+ }),
227
+ setState: (state) => {
228
+ if (state.enabled) activate();
229
+ else deactivate();
230
+ }
231
+ };
232
+ }
233
+ export {
234
+ createAnimationStopModule as default
235
+ };
236
+ //# sourceMappingURL=animation-stop-DRBnDmlT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-stop-DRBnDmlT.js","sources":["../src/features/animation-stop.ts"],"sourcesContent":["import type { FeatureModule, FeatureState } from '../types';\n\n/**\n * Animation Stop — W3C WAI Technique C39 compliant\n *\n * Architecture:\n * Toggle ON → inject <style>, pause videos, freeze GIFs, start MutationObserver\n * Toggle OFF → remove <style>, resume videos/GIFs, stop MutationObserver\n *\n * Key insight: use duration 0.01ms (NOT 0ms or \"none\") so animationend /\n * transitionend events still fire. This keeps JS-driven page logic intact\n * (lazy loading, content reveal, page transitions) while eliminating visible motion.\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 ---\n let pausedVideos: HTMLVideoElement[] = [];\n let gifOriginals = new Map<HTMLImageElement, string>();\n let mutationObserver: MutationObserver | null = null;\n let originalVideoPlay: typeof HTMLVideoElement.prototype.play | null = null;\n\n // =========================================================================\n // 1. CSS Injection (the only thing that touches animations/transitions)\n // =========================================================================\n\n function getStyles(): string {\n return `\n /* Accessify — stop visible motion (WCAG 2.3.1)\n 0.01ms duration so animationend/transitionend events still fire. */\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n animation-delay: 0s !important;\n }\n *, *::before, *::after {\n transition-duration: 0.01ms !important;\n transition-delay: 0s !important;\n }\n html {\n scroll-behavior: auto !important;\n }\n marquee {\n -moz-binding: none !important;\n overflow: hidden !important;\n }\n `;\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 = getStyles();\n document.head.appendChild(style);\n }\n\n function removeStyles() {\n document.getElementById(STYLE_ID)?.remove();\n }\n\n // =========================================================================\n // 2. Video control\n // =========================================================================\n\n function pauseAllVideos() {\n document.querySelectorAll<HTMLVideoElement>('video').forEach((video) => {\n if (!video.paused) {\n video.pause();\n video.dataset.accessifyPaused = 'true';\n pausedVideos.push(video);\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 pausedVideos.forEach((video) => {\n try {\n delete video.dataset.accessifyPaused;\n video.play();\n } catch { /* removed from DOM */ }\n });\n pausedVideos = [];\n }\n\n // =========================================================================\n // 3. GIF freeze — canvas snapshot of first frame\n // =========================================================================\n\n function isGif(img: HTMLImageElement): boolean {\n const src = (img.src || img.getAttribute('src') || '').toLowerCase();\n return src.includes('.gif');\n }\n\n function freezeGif(img: HTMLImageElement) {\n if (!isGif(img)) 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 canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.drawImage(img, 0, 0);\n gifOriginals.set(img, img.src);\n img.src = canvas.toDataURL('image/png');\n } catch { /* cross-origin */ }\n };\n\n if (img.complete && img.naturalWidth > 0) {\n doFreeze();\n } else {\n img.addEventListener('load', doFreeze, { once: true });\n }\n }\n\n function freezeAllGifs() {\n document.querySelectorAll<HTMLImageElement>('img').forEach(freezeGif);\n }\n\n function restoreAllGifs() {\n for (const [img, originalSrc] of gifOriginals) {\n try { img.src = originalSrc; } catch { /* gone */ }\n }\n gifOriginals.clear();\n }\n\n // =========================================================================\n // 4. SVG SMIL & Marquee\n // =========================================================================\n\n function pauseSVG() {\n document.querySelectorAll('svg').forEach((svg) => {\n try { (svg as any).pauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n\n function resumeSVG() {\n document.querySelectorAll('svg').forEach((svg) => {\n try { (svg as any).unpauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n\n function stopMarquees() {\n document.querySelectorAll('marquee').forEach((el) => {\n try { (el as any).stop?.(); } catch { /* ignore */ }\n });\n }\n\n function startMarquees() {\n document.querySelectorAll('marquee').forEach((el) => {\n try { (el as any).start?.(); } catch { /* ignore */ }\n });\n }\n\n // =========================================================================\n // 5. MutationObserver — handle dynamically added content\n // =========================================================================\n\n function setupObserver() {\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\n // Videos\n if (node.tagName === 'VIDEO') {\n const v = node as HTMLVideoElement;\n if (!v.paused) { v.pause(); v.dataset.accessifyPaused = 'true'; pausedVideos.push(v); }\n }\n node.querySelectorAll?.('video')?.forEach((v) => {\n if (!v.paused) { v.pause(); (v as HTMLVideoElement).dataset.accessifyPaused = 'true'; pausedVideos.push(v); }\n });\n\n // GIFs\n if (node.tagName === 'IMG') freezeGif(node as HTMLImageElement);\n node.querySelectorAll?.('img')?.forEach((img) => freezeGif(img as HTMLImageElement));\n\n // SVG SMIL\n if (node.tagName === 'SVG') {\n try { (node as any).pauseAnimations?.(); } catch { /* ignore */ }\n }\n node.querySelectorAll?.('svg')?.forEach((svg) => {\n try { (svg as any).pauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n }\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 // Lifecycle\n // =========================================================================\n\n function activate() {\n if (enabled) return;\n enabled = true;\n\n // 1. CSS — kills visible motion, events still fire\n injectStyles();\n\n // 2. Videos\n pauseAllVideos();\n interceptVideoPlay();\n\n // 3. GIFs\n freezeAllGifs();\n\n // 4. SVG SMIL + Marquee\n pauseSVG();\n stopMarquees();\n\n // 5. MutationObserver for new content\n setupObserver();\n\n localStorage.setItem(STORAGE_KEY, 'true');\n }\n\n function deactivate() {\n enabled = false;\n\n // Reverse order\n teardownObserver();\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 => ({\n id: 'animation-stop',\n enabled,\n }),\n setState: (state: { enabled: boolean }) => {\n if (state.enabled) activate();\n else deactivate();\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--OdykeMg.js"),
6313
+ "keyboard-nav": () => import("./keyboard-nav-PMKJCPXi.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-BDP0PVUZ.js"),
6317
+ "animation-stop": () => import("./animation-stop-DRBnDmlT.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-BfHcMDYY.js"),
6320
+ "page-structure": () => import("./page-structure-Pdeae1aG.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-DiDUF8l8.js.map
8403
+ //# sourceMappingURL=index-BGQhnTlr.js.map