accessify-widget 0.2.9 → 0.2.11
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-Bk5e1Tvj.js +364 -0
- package/dist/animation-stop-Bk5e1Tvj.js.map +1 -0
- package/dist/{index-DiDUF8l8.js → index-BJsmy-I2.js} +4 -4
- package/dist/{index-DiDUF8l8.js.map → index-BJsmy-I2.js.map} +1 -1
- package/dist/{keyboard-nav--OdykeMg.js → keyboard-nav-DpyT397R.js} +2 -2
- package/dist/{keyboard-nav--OdykeMg.js.map → keyboard-nav-DpyT397R.js.map} +1 -1
- package/dist/{page-structure-BfHcMDYY.js → page-structure-K6J7uNzJ.js} +2 -2
- package/dist/{page-structure-BfHcMDYY.js.map → page-structure-K6J7uNzJ.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-BDP0PVUZ.js +0 -541
- package/dist/animation-stop-BDP0PVUZ.js.map +0 -1
package/dist/accessify.mjs
CHANGED
|
@@ -0,0 +1,364 @@
|
|
|
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
|
+
let fixedElements = [];
|
|
10
|
+
let interactionTimer = null;
|
|
11
|
+
let styleEl = null;
|
|
12
|
+
function strictCSS() {
|
|
13
|
+
return `
|
|
14
|
+
/* Accessify animation-stop — strict mode */
|
|
15
|
+
*, *::before, *::after {
|
|
16
|
+
animation-fill-mode: forwards !important;
|
|
17
|
+
animation-duration: 0.01ms !important;
|
|
18
|
+
animation-delay: 0s !important;
|
|
19
|
+
animation-iteration-count: 1 !important;
|
|
20
|
+
transition-duration: 0.01ms !important;
|
|
21
|
+
transition-delay: 0s !important;
|
|
22
|
+
}
|
|
23
|
+
html {
|
|
24
|
+
scroll-behavior: auto !important;
|
|
25
|
+
}
|
|
26
|
+
marquee {
|
|
27
|
+
-moz-binding: none !important;
|
|
28
|
+
overflow: hidden !important;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Interactive elements keep a short functional transition */
|
|
32
|
+
details > *, [data-accordion] > *, [role="tabpanel"],
|
|
33
|
+
dialog, dialog *, [aria-expanded] + *,
|
|
34
|
+
.accordion *, .collapse *, .dropdown-menu *,
|
|
35
|
+
.faq *, [data-dropdown] *, [data-framer-component-type="CollapsibleContent"] *,
|
|
36
|
+
[data-framer-name="Accordion"] *, [data-framer-name="FAQ"] * {
|
|
37
|
+
transition-duration: 0.15s !important;
|
|
38
|
+
animation-duration: 0.15s !important;
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
function relaxedCSS() {
|
|
43
|
+
return `
|
|
44
|
+
/* Accessify animation-stop — relaxed (post-interaction) */
|
|
45
|
+
*, *::before, *::after {
|
|
46
|
+
animation-fill-mode: forwards !important;
|
|
47
|
+
animation-duration: 0.01ms !important;
|
|
48
|
+
animation-delay: 0s !important;
|
|
49
|
+
animation-iteration-count: 1 !important;
|
|
50
|
+
transition-duration: 0.15s !important;
|
|
51
|
+
transition-delay: 0s !important;
|
|
52
|
+
}
|
|
53
|
+
html {
|
|
54
|
+
scroll-behavior: auto !important;
|
|
55
|
+
}
|
|
56
|
+
marquee {
|
|
57
|
+
-moz-binding: none !important;
|
|
58
|
+
overflow: hidden !important;
|
|
59
|
+
}
|
|
60
|
+
`;
|
|
61
|
+
}
|
|
62
|
+
function injectStyles() {
|
|
63
|
+
if (document.getElementById(STYLE_ID)) return;
|
|
64
|
+
styleEl = document.createElement("style");
|
|
65
|
+
styleEl.id = STYLE_ID;
|
|
66
|
+
styleEl.textContent = strictCSS();
|
|
67
|
+
document.head.appendChild(styleEl);
|
|
68
|
+
}
|
|
69
|
+
function removeStyles() {
|
|
70
|
+
document.getElementById(STYLE_ID)?.remove();
|
|
71
|
+
styleEl = null;
|
|
72
|
+
}
|
|
73
|
+
function onUserInteraction() {
|
|
74
|
+
if (!enabled || !styleEl) return;
|
|
75
|
+
styleEl.textContent = relaxedCSS();
|
|
76
|
+
if (interactionTimer) clearTimeout(interactionTimer);
|
|
77
|
+
interactionTimer = setTimeout(() => {
|
|
78
|
+
if (enabled && styleEl) styleEl.textContent = strictCSS();
|
|
79
|
+
}, 350);
|
|
80
|
+
}
|
|
81
|
+
function addInteractionListeners() {
|
|
82
|
+
document.addEventListener("click", onUserInteraction, true);
|
|
83
|
+
document.addEventListener("keydown", onKeyInteraction, true);
|
|
84
|
+
}
|
|
85
|
+
function removeInteractionListeners() {
|
|
86
|
+
document.removeEventListener("click", onUserInteraction, true);
|
|
87
|
+
document.removeEventListener("keydown", onKeyInteraction, true);
|
|
88
|
+
if (interactionTimer) {
|
|
89
|
+
clearTimeout(interactionTimer);
|
|
90
|
+
interactionTimer = null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function onKeyInteraction(e) {
|
|
94
|
+
if (e.key === "Enter" || e.key === " ") onUserInteraction();
|
|
95
|
+
}
|
|
96
|
+
function forceInlineEndStates() {
|
|
97
|
+
const all = document.querySelectorAll("[style]");
|
|
98
|
+
for (const el of all) {
|
|
99
|
+
if (el.closest("#accessify-root")) continue;
|
|
100
|
+
if (el.style.display === "none") continue;
|
|
101
|
+
const opacity = el.style.opacity;
|
|
102
|
+
if (opacity !== "" && opacity !== "1") {
|
|
103
|
+
const val = parseFloat(opacity);
|
|
104
|
+
if (!isNaN(val) && val < 0.1) {
|
|
105
|
+
if (isLikelyAnimationTarget(el)) {
|
|
106
|
+
fixedElements.push({ el, origStyle: el.getAttribute("style") || "" });
|
|
107
|
+
el.style.opacity = "1";
|
|
108
|
+
const t = el.style.transform;
|
|
109
|
+
if (t && /translate/i.test(t)) {
|
|
110
|
+
el.style.transform = "none";
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function isLikelyAnimationTarget(el) {
|
|
118
|
+
if (el.hasAttribute("data-framer-appear-id")) return true;
|
|
119
|
+
if (el.closest("[data-framer-component-type]")) return true;
|
|
120
|
+
if (el.hasAttribute("data-aos")) return true;
|
|
121
|
+
if (el.classList.toString().match(/aos-|sr-|gsap|scroll-|reveal|animate__|fade|slide/i)) return true;
|
|
122
|
+
const wc = el.style.willChange || "";
|
|
123
|
+
if (wc.includes("transform") || wc.includes("opacity")) return true;
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
function restoreInlineEndStates() {
|
|
127
|
+
for (const { el, origStyle } of fixedElements) {
|
|
128
|
+
try {
|
|
129
|
+
el.setAttribute("style", origStyle);
|
|
130
|
+
} catch {
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
fixedElements = [];
|
|
134
|
+
}
|
|
135
|
+
function forceEndStatesForNode(node) {
|
|
136
|
+
if (node.closest("#accessify-root")) return;
|
|
137
|
+
checkAndFixElement(node);
|
|
138
|
+
node.querySelectorAll?.("[style]")?.forEach((child) => {
|
|
139
|
+
checkAndFixElement(child);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function checkAndFixElement(el) {
|
|
143
|
+
if (el.style.display === "none") return;
|
|
144
|
+
const opacity = el.style.opacity;
|
|
145
|
+
if (opacity !== "" && opacity !== "1") {
|
|
146
|
+
const val = parseFloat(opacity);
|
|
147
|
+
if (!isNaN(val) && val < 0.1 && isLikelyAnimationTarget(el)) {
|
|
148
|
+
fixedElements.push({ el, origStyle: el.getAttribute("style") || "" });
|
|
149
|
+
el.style.opacity = "1";
|
|
150
|
+
const t = el.style.transform;
|
|
151
|
+
if (t && /translate/i.test(t)) el.style.transform = "none";
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function pauseAllVideos() {
|
|
156
|
+
document.querySelectorAll("video").forEach((video) => {
|
|
157
|
+
if (!video.paused) {
|
|
158
|
+
video.pause();
|
|
159
|
+
video.dataset.accessifyPaused = "true";
|
|
160
|
+
pausedVideos.push(video);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function interceptVideoPlay() {
|
|
165
|
+
if (originalVideoPlay) return;
|
|
166
|
+
originalVideoPlay = HTMLVideoElement.prototype.play;
|
|
167
|
+
HTMLVideoElement.prototype.play = function() {
|
|
168
|
+
if (enabled) return Promise.resolve();
|
|
169
|
+
return originalVideoPlay.call(this);
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function restoreVideoPlay() {
|
|
173
|
+
if (originalVideoPlay) {
|
|
174
|
+
HTMLVideoElement.prototype.play = originalVideoPlay;
|
|
175
|
+
originalVideoPlay = null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function resumeAllVideos() {
|
|
179
|
+
restoreVideoPlay();
|
|
180
|
+
pausedVideos.forEach((video) => {
|
|
181
|
+
try {
|
|
182
|
+
delete video.dataset.accessifyPaused;
|
|
183
|
+
video.play();
|
|
184
|
+
} catch {
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
pausedVideos = [];
|
|
188
|
+
}
|
|
189
|
+
function freezeGif(img) {
|
|
190
|
+
const src = (img.src || img.getAttribute("src") || "").toLowerCase();
|
|
191
|
+
if (!src.includes(".gif")) return;
|
|
192
|
+
if (gifOriginals.has(img)) return;
|
|
193
|
+
const doFreeze = () => {
|
|
194
|
+
try {
|
|
195
|
+
const w = img.naturalWidth || img.width;
|
|
196
|
+
const h = img.naturalHeight || img.height;
|
|
197
|
+
if (w === 0 || h === 0) return;
|
|
198
|
+
const c = document.createElement("canvas");
|
|
199
|
+
c.width = w;
|
|
200
|
+
c.height = h;
|
|
201
|
+
const ctx = c.getContext("2d");
|
|
202
|
+
if (!ctx) return;
|
|
203
|
+
ctx.drawImage(img, 0, 0);
|
|
204
|
+
gifOriginals.set(img, img.src);
|
|
205
|
+
img.src = c.toDataURL("image/png");
|
|
206
|
+
} catch {
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
if (img.complete && img.naturalWidth > 0) doFreeze();
|
|
210
|
+
else img.addEventListener("load", doFreeze, { once: true });
|
|
211
|
+
}
|
|
212
|
+
function freezeAllGifs() {
|
|
213
|
+
document.querySelectorAll("img").forEach(freezeGif);
|
|
214
|
+
}
|
|
215
|
+
function restoreAllGifs() {
|
|
216
|
+
for (const [img, src] of gifOriginals) {
|
|
217
|
+
try {
|
|
218
|
+
img.src = src;
|
|
219
|
+
} catch {
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
gifOriginals.clear();
|
|
223
|
+
}
|
|
224
|
+
function pauseSVG() {
|
|
225
|
+
document.querySelectorAll("svg").forEach((s) => {
|
|
226
|
+
try {
|
|
227
|
+
s.pauseAnimations?.();
|
|
228
|
+
} catch {
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
function resumeSVG() {
|
|
233
|
+
document.querySelectorAll("svg").forEach((s) => {
|
|
234
|
+
try {
|
|
235
|
+
s.unpauseAnimations?.();
|
|
236
|
+
} catch {
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
function stopMarquees() {
|
|
241
|
+
document.querySelectorAll("marquee").forEach((m) => {
|
|
242
|
+
try {
|
|
243
|
+
m.stop?.();
|
|
244
|
+
} catch {
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function startMarquees() {
|
|
249
|
+
document.querySelectorAll("marquee").forEach((m) => {
|
|
250
|
+
try {
|
|
251
|
+
m.start?.();
|
|
252
|
+
} catch {
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
function setupObserver() {
|
|
257
|
+
if (mutationObserver) return;
|
|
258
|
+
mutationObserver = new MutationObserver((mutations) => {
|
|
259
|
+
if (!enabled) return;
|
|
260
|
+
for (const mutation of mutations) {
|
|
261
|
+
for (const node of mutation.addedNodes) {
|
|
262
|
+
if (!(node instanceof HTMLElement)) continue;
|
|
263
|
+
if (node.tagName === "VIDEO") {
|
|
264
|
+
const v = node;
|
|
265
|
+
if (!v.paused) {
|
|
266
|
+
v.pause();
|
|
267
|
+
v.dataset.accessifyPaused = "true";
|
|
268
|
+
pausedVideos.push(v);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
node.querySelectorAll?.("video")?.forEach((v) => {
|
|
272
|
+
if (!v.paused) {
|
|
273
|
+
v.pause();
|
|
274
|
+
v.dataset.accessifyPaused = "true";
|
|
275
|
+
pausedVideos.push(v);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
if (node.tagName === "IMG") freezeGif(node);
|
|
279
|
+
node.querySelectorAll?.("img")?.forEach((i) => freezeGif(i));
|
|
280
|
+
if (node.tagName === "SVG") {
|
|
281
|
+
try {
|
|
282
|
+
node.pauseAnimations?.();
|
|
283
|
+
} catch {
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
node.querySelectorAll?.("svg")?.forEach((s) => {
|
|
287
|
+
try {
|
|
288
|
+
s.pauseAnimations?.();
|
|
289
|
+
} catch {
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
forceEndStatesForNode(node);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
mutationObserver.observe(document.body, { childList: true, subtree: true });
|
|
297
|
+
}
|
|
298
|
+
function teardownObserver() {
|
|
299
|
+
mutationObserver?.disconnect();
|
|
300
|
+
mutationObserver = null;
|
|
301
|
+
}
|
|
302
|
+
let scanTimers = [];
|
|
303
|
+
function scheduleScans() {
|
|
304
|
+
for (const delay of [500, 1500, 3e3]) {
|
|
305
|
+
scanTimers.push(setTimeout(() => {
|
|
306
|
+
if (!enabled) return;
|
|
307
|
+
forceInlineEndStates();
|
|
308
|
+
pauseAllVideos();
|
|
309
|
+
freezeAllGifs();
|
|
310
|
+
pauseSVG();
|
|
311
|
+
}, delay));
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function clearScans() {
|
|
315
|
+
scanTimers.forEach(clearTimeout);
|
|
316
|
+
scanTimers = [];
|
|
317
|
+
}
|
|
318
|
+
function activate() {
|
|
319
|
+
if (enabled) return;
|
|
320
|
+
enabled = true;
|
|
321
|
+
injectStyles();
|
|
322
|
+
forceInlineEndStates();
|
|
323
|
+
pauseAllVideos();
|
|
324
|
+
interceptVideoPlay();
|
|
325
|
+
freezeAllGifs();
|
|
326
|
+
pauseSVG();
|
|
327
|
+
stopMarquees();
|
|
328
|
+
addInteractionListeners();
|
|
329
|
+
setupObserver();
|
|
330
|
+
scheduleScans();
|
|
331
|
+
localStorage.setItem(STORAGE_KEY, "true");
|
|
332
|
+
}
|
|
333
|
+
function deactivate() {
|
|
334
|
+
enabled = false;
|
|
335
|
+
clearScans();
|
|
336
|
+
teardownObserver();
|
|
337
|
+
removeInteractionListeners();
|
|
338
|
+
startMarquees();
|
|
339
|
+
resumeSVG();
|
|
340
|
+
restoreAllGifs();
|
|
341
|
+
resumeAllVideos();
|
|
342
|
+
restoreInlineEndStates();
|
|
343
|
+
removeStyles();
|
|
344
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
345
|
+
}
|
|
346
|
+
return {
|
|
347
|
+
id: "animation-stop",
|
|
348
|
+
name: () => "Stop Animations",
|
|
349
|
+
description: "Pause all animations, transitions, and auto-playing videos (WCAG 2.3.1)",
|
|
350
|
+
icon: "animation-stop",
|
|
351
|
+
category: "visual",
|
|
352
|
+
activate,
|
|
353
|
+
deactivate,
|
|
354
|
+
getState: () => ({ id: "animation-stop", enabled }),
|
|
355
|
+
setState: (state) => {
|
|
356
|
+
if (state.enabled) activate();
|
|
357
|
+
else deactivate();
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
export {
|
|
362
|
+
createAnimationStopModule as default
|
|
363
|
+
};
|
|
364
|
+
//# sourceMappingURL=animation-stop-Bk5e1Tvj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation-stop-Bk5e1Tvj.js","sources":["../src/features/animation-stop.ts"],"sourcesContent":["import type { FeatureModule, FeatureState } from '../types';\n\n/**\n * Animation Stop – V2\n *\n * Two-stage approach:\n * Stage 1: CSS forces all animations/transitions to END STATE instantly\n * (animation-fill-mode: forwards + duration: 0.01ms)\n * Stage 2: JS cleans up inline-style-driven animations (Framer, GSAP, AOS…)\n *\n * Interactive elements (accordions, dropdowns) get a short transition\n * so they remain functional. User clicks temporarily allow transitions.\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 let fixedElements: Array<{ el: HTMLElement; origStyle: string }> = [];\n let interactionTimer: ReturnType<typeof setTimeout> | null = null;\n let styleEl: HTMLStyleElement | null = null;\n\n // =========================================================================\n // 1. CSS – Stage 1: force end-states, kill visible motion\n // =========================================================================\n\n /** Strict rules — no visible motion at all */\n function strictCSS(): string {\n return `\n /* Accessify animation-stop — strict mode */\n *, *::before, *::after {\n animation-fill-mode: forwards !important;\n animation-duration: 0.01ms !important;\n animation-delay: 0s !important;\n animation-iteration-count: 1 !important;\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 /* Interactive elements keep a short functional transition */\n details > *, [data-accordion] > *, [role=\"tabpanel\"],\n dialog, dialog *, [aria-expanded] + *,\n .accordion *, .collapse *, .dropdown-menu *,\n .faq *, [data-dropdown] *, [data-framer-component-type=\"CollapsibleContent\"] *,\n [data-framer-name=\"Accordion\"] *, [data-framer-name=\"FAQ\"] * {\n transition-duration: 0.15s !important;\n animation-duration: 0.15s !important;\n }\n `;\n }\n\n /** Relaxed rules — transitions allowed briefly after user interaction */\n function relaxedCSS(): string {\n return `\n /* Accessify animation-stop — relaxed (post-interaction) */\n *, *::before, *::after {\n animation-fill-mode: forwards !important;\n animation-duration: 0.01ms !important;\n animation-delay: 0s !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.15s !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 styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n styleEl.textContent = strictCSS();\n document.head.appendChild(styleEl);\n }\n\n function removeStyles() {\n document.getElementById(STYLE_ID)?.remove();\n styleEl = null;\n }\n\n // =========================================================================\n // 2. Interaction listener — briefly allow transitions on click/key\n // =========================================================================\n\n function onUserInteraction() {\n if (!enabled || !styleEl) return;\n // Switch to relaxed CSS so the interaction's transition works\n styleEl.textContent = relaxedCSS();\n if (interactionTimer) clearTimeout(interactionTimer);\n interactionTimer = setTimeout(() => {\n if (enabled && styleEl) styleEl.textContent = strictCSS();\n }, 350);\n }\n\n function addInteractionListeners() {\n document.addEventListener('click', onUserInteraction, true);\n document.addEventListener('keydown', onKeyInteraction, true);\n }\n\n function removeInteractionListeners() {\n document.removeEventListener('click', onUserInteraction, true);\n document.removeEventListener('keydown', onKeyInteraction, true);\n if (interactionTimer) { clearTimeout(interactionTimer); interactionTimer = null; }\n }\n\n function onKeyInteraction(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') onUserInteraction();\n }\n\n // =========================================================================\n // 3. Stage 2: JS — force inline-animated elements to end state\n // =========================================================================\n\n /**\n * Scan the page for elements that JS animation libs left in their START\n * state (opacity:0, translateY, etc.) and force them visible.\n * We only touch elements that match known animation-lib patterns.\n */\n function forceInlineEndStates() {\n const all = document.querySelectorAll<HTMLElement>('[style]');\n for (const el of all) {\n if (el.closest('#accessify-root')) continue;\n if (el.style.display === 'none') continue;\n\n const opacity = el.style.opacity;\n if (opacity !== '' && opacity !== '1') {\n const val = parseFloat(opacity);\n if (!isNaN(val) && val < 0.1) {\n // Check if this looks like an animation target (not an intentional design choice)\n if (isLikelyAnimationTarget(el)) {\n fixedElements.push({ el, origStyle: el.getAttribute('style') || '' });\n el.style.opacity = '1';\n // If the element also has a translate transform, reset it\n const t = el.style.transform;\n if (t && /translate/i.test(t)) {\n el.style.transform = 'none';\n }\n }\n }\n }\n }\n }\n\n /** Heuristic: does this element look like it's controlled by an animation library? */\n function isLikelyAnimationTarget(el: HTMLElement): boolean {\n // Framer\n if (el.hasAttribute('data-framer-appear-id')) return true;\n if (el.closest('[data-framer-component-type]')) return true;\n // AOS\n if (el.hasAttribute('data-aos')) return true;\n // ScrollReveal, GSAP ScrollTrigger\n if (el.classList.toString().match(/aos-|sr-|gsap|scroll-|reveal|animate__|fade|slide/i)) return true;\n // will-change on transform or opacity is a strong signal\n const wc = el.style.willChange || '';\n if (wc.includes('transform') || wc.includes('opacity')) return true;\n return false;\n }\n\n function restoreInlineEndStates() {\n for (const { el, origStyle } of fixedElements) {\n try { el.setAttribute('style', origStyle); } catch { /* gone */ }\n }\n fixedElements = [];\n }\n\n /** Force end-states on a single newly added element (and its children) */\n function forceEndStatesForNode(node: HTMLElement) {\n if (node.closest('#accessify-root')) return;\n checkAndFixElement(node);\n node.querySelectorAll?.('[style]')?.forEach((child) => {\n checkAndFixElement(child as HTMLElement);\n });\n }\n\n function checkAndFixElement(el: HTMLElement) {\n if (el.style.display === 'none') return;\n const opacity = el.style.opacity;\n if (opacity !== '' && opacity !== '1') {\n const val = parseFloat(opacity);\n if (!isNaN(val) && val < 0.1 && isLikelyAnimationTarget(el)) {\n fixedElements.push({ el, origStyle: el.getAttribute('style') || '' });\n el.style.opacity = '1';\n const t = el.style.transform;\n if (t && /translate/i.test(t)) el.style.transform = 'none';\n }\n }\n }\n\n // =========================================================================\n // 4. 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 { delete video.dataset.accessifyPaused; video.play(); } catch { /* gone */ }\n });\n pausedVideos = [];\n }\n\n // =========================================================================\n // 5. GIF freeze\n // =========================================================================\n\n function freezeGif(img: HTMLImageElement) {\n const src = (img.src || img.getAttribute('src') || '').toLowerCase();\n if (!src.includes('.gif')) 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 { /* cross-origin */ }\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 // =========================================================================\n // 6. SVG SMIL & Marquee\n // =========================================================================\n\n function pauseSVG() {\n document.querySelectorAll('svg').forEach((s) => {\n try { (s as any).pauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n function resumeSVG() {\n document.querySelectorAll('svg').forEach((s) => {\n try { (s as any).unpauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n function stopMarquees() {\n document.querySelectorAll('marquee').forEach((m) => {\n try { (m as any).stop?.(); } catch { /* ignore */ }\n });\n }\n function startMarquees() {\n document.querySelectorAll('marquee').forEach((m) => {\n try { (m as any).start?.(); } catch { /* ignore */ }\n });\n }\n\n // =========================================================================\n // 7. MutationObserver — dynamic content\n // =========================================================================\n\n function setupObserver() {\n if (mutationObserver) return;\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((i) => freezeGif(i as HTMLImageElement));\n\n // SVGs\n if (node.tagName === 'SVG') { try { (node as any).pauseAnimations?.(); } catch { /* */ } }\n node.querySelectorAll?.('svg')?.forEach((s) => {\n try { (s as any).pauseAnimations?.(); } catch { /* */ }\n });\n\n // Inline-animated elements\n forceEndStatesForNode(node);\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 // 8. Delayed re-scans — frameworks render async\n // =========================================================================\n\n let scanTimers: ReturnType<typeof setTimeout>[] = [];\n\n function scheduleScans() {\n for (const delay of [500, 1500, 3000]) {\n scanTimers.push(setTimeout(() => {\n if (!enabled) return;\n forceInlineEndStates();\n pauseAllVideos();\n freezeAllGifs();\n pauseSVG();\n }, delay));\n }\n }\n\n function clearScans() {\n scanTimers.forEach(clearTimeout);\n scanTimers = [];\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n function activate() {\n if (enabled) return;\n enabled = true;\n\n // Stage 1: CSS — force end-states + kill visible motion\n injectStyles();\n\n // Stage 2: JS — force inline-animated elements visible\n forceInlineEndStates();\n\n // Media\n pauseAllVideos();\n interceptVideoPlay();\n freezeAllGifs();\n pauseSVG();\n stopMarquees();\n\n // Interaction listener for accordions etc.\n addInteractionListeners();\n\n // Dynamic content\n setupObserver();\n\n // Async re-scans\n scheduleScans();\n\n localStorage.setItem(STORAGE_KEY, 'true');\n }\n\n function deactivate() {\n enabled = false;\n\n clearScans();\n teardownObserver();\n removeInteractionListeners();\n startMarquees();\n resumeSVG();\n restoreAllGifs();\n resumeAllVideos();\n restoreInlineEndStates();\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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"}
|
|
@@ -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
|
|
6313
|
+
"keyboard-nav": () => import("./keyboard-nav-DpyT397R.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-
|
|
6317
|
+
"animation-stop": () => import("./animation-stop-Bk5e1Tvj.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-
|
|
6320
|
+
"page-structure": () => import("./page-structure-K6J7uNzJ.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-
|
|
8403
|
+
//# sourceMappingURL=index-BJsmy-I2.js.map
|