accessify-widget 0.2.10 → 0.2.12

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.2.10",
3
+ "version": "0.2.12",
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,236 +0,0 @@
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
@@ -1 +0,0 @@
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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"}