accessify-widget 0.2.11 → 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/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 → animation-stop-D7fUkoyL.js} +177 -58
- package/dist/animation-stop-D7fUkoyL.js.map +1 -0
- package/dist/{index-BJsmy-I2.js → index-8Pdy-P-C.js} +4 -4
- package/dist/{index-BJsmy-I2.js.map → index-8Pdy-P-C.js.map} +1 -1
- package/dist/{keyboard-nav-DpyT397R.js → keyboard-nav-CcbrBWbb.js} +2 -2
- package/dist/{keyboard-nav-DpyT397R.js.map → keyboard-nav-CcbrBWbb.js.map} +1 -1
- package/dist/{page-structure-K6J7uNzJ.js → page-structure-DG1b6-Dl.js} +2 -2
- package/dist/{page-structure-K6J7uNzJ.js.map → page-structure-DG1b6-Dl.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-Bk5e1Tvj.js.map +0 -1
package/dist/accessify.mjs
CHANGED
|
@@ -2,13 +2,16 @@ function createAnimationStopModule() {
|
|
|
2
2
|
let enabled = false;
|
|
3
3
|
const STYLE_ID = "accessify-animation-stop";
|
|
4
4
|
const STORAGE_KEY = "accessify-animation-stop";
|
|
5
|
+
const DATA_ORIG = "data-accessify-orig-style";
|
|
6
|
+
const DATA_FIXED = "data-accessify-fixed";
|
|
5
7
|
let pausedVideos = [];
|
|
6
8
|
let gifOriginals = /* @__PURE__ */ new Map();
|
|
7
9
|
let mutationObserver = null;
|
|
8
10
|
let originalVideoPlay = null;
|
|
9
|
-
let
|
|
11
|
+
let originalIntersectionObserver = null;
|
|
10
12
|
let interactionTimer = null;
|
|
11
13
|
let styleEl = null;
|
|
14
|
+
let scanTimers = [];
|
|
12
15
|
function strictCSS() {
|
|
13
16
|
return `
|
|
14
17
|
/* Accessify animation-stop — strict mode */
|
|
@@ -33,7 +36,9 @@ function createAnimationStopModule() {
|
|
|
33
36
|
dialog, dialog *, [aria-expanded] + *,
|
|
34
37
|
.accordion *, .collapse *, .dropdown-menu *,
|
|
35
38
|
.faq *, [data-dropdown] *, [data-framer-component-type="CollapsibleContent"] *,
|
|
36
|
-
[data-framer-name="Accordion"] *, [data-framer-name="FAQ"]
|
|
39
|
+
[data-framer-name="Accordion"] *, [data-framer-name="FAQ"] *,
|
|
40
|
+
[data-framer-component-type="NavigationContainer"] *,
|
|
41
|
+
.nav *, .navbar *, .menu * {
|
|
37
42
|
transition-duration: 0.15s !important;
|
|
38
43
|
animation-duration: 0.15s !important;
|
|
39
44
|
}
|
|
@@ -78,6 +83,9 @@ function createAnimationStopModule() {
|
|
|
78
83
|
if (enabled && styleEl) styleEl.textContent = strictCSS();
|
|
79
84
|
}, 350);
|
|
80
85
|
}
|
|
86
|
+
function onKeyInteraction(e) {
|
|
87
|
+
if (e.key === "Enter" || e.key === " ") onUserInteraction();
|
|
88
|
+
}
|
|
81
89
|
function addInteractionListeners() {
|
|
82
90
|
document.addEventListener("click", onUserInteraction, true);
|
|
83
91
|
document.addEventListener("keydown", onKeyInteraction, true);
|
|
@@ -90,66 +98,160 @@ function createAnimationStopModule() {
|
|
|
90
98
|
interactionTimer = null;
|
|
91
99
|
}
|
|
92
100
|
}
|
|
93
|
-
function
|
|
94
|
-
if (
|
|
101
|
+
function patchIntersectionObserver() {
|
|
102
|
+
if (originalIntersectionObserver) return;
|
|
103
|
+
originalIntersectionObserver = window.IntersectionObserver;
|
|
104
|
+
const FakeObserver = class {
|
|
105
|
+
constructor(callback, _options) {
|
|
106
|
+
this.callback = callback;
|
|
107
|
+
this._entries = [];
|
|
108
|
+
}
|
|
109
|
+
observe(target) {
|
|
110
|
+
const entry = {
|
|
111
|
+
target,
|
|
112
|
+
isIntersecting: true,
|
|
113
|
+
intersectionRatio: 1,
|
|
114
|
+
boundingClientRect: target.getBoundingClientRect(),
|
|
115
|
+
intersectionRect: target.getBoundingClientRect(),
|
|
116
|
+
rootBounds: null,
|
|
117
|
+
time: performance.now()
|
|
118
|
+
};
|
|
119
|
+
this._entries.push(entry);
|
|
120
|
+
setTimeout(() => {
|
|
121
|
+
try {
|
|
122
|
+
this.callback([entry], this);
|
|
123
|
+
} catch {
|
|
124
|
+
}
|
|
125
|
+
}, 0);
|
|
126
|
+
}
|
|
127
|
+
unobserve(_target) {
|
|
128
|
+
this._entries = this._entries.filter((e) => e.target !== _target);
|
|
129
|
+
}
|
|
130
|
+
disconnect() {
|
|
131
|
+
this._entries = [];
|
|
132
|
+
}
|
|
133
|
+
takeRecords() {
|
|
134
|
+
return this._entries;
|
|
135
|
+
}
|
|
136
|
+
get root() {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
get rootMargin() {
|
|
140
|
+
return "0px 0px 0px 0px";
|
|
141
|
+
}
|
|
142
|
+
get thresholds() {
|
|
143
|
+
return [0];
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
window.IntersectionObserver = FakeObserver;
|
|
147
|
+
}
|
|
148
|
+
function restoreIntersectionObserver() {
|
|
149
|
+
if (originalIntersectionObserver) {
|
|
150
|
+
window.IntersectionObserver = originalIntersectionObserver;
|
|
151
|
+
originalIntersectionObserver = null;
|
|
152
|
+
}
|
|
95
153
|
}
|
|
96
|
-
function
|
|
97
|
-
|
|
154
|
+
function isInsideWidget(el) {
|
|
155
|
+
return !!el.closest("#accessify-root");
|
|
156
|
+
}
|
|
157
|
+
function bruteForceVisibilityScan() {
|
|
158
|
+
const all = document.querySelectorAll("*");
|
|
98
159
|
for (const el of all) {
|
|
99
|
-
if (el
|
|
100
|
-
if (el.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
160
|
+
if (isInsideWidget(el)) continue;
|
|
161
|
+
if (el.hasAttribute(DATA_FIXED)) continue;
|
|
162
|
+
fixElementIfHidden(el);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function fixElementIfHidden(el) {
|
|
166
|
+
if (isInsideWidget(el)) return;
|
|
167
|
+
if (el.hasAttribute(DATA_FIXED)) return;
|
|
168
|
+
if (el.tagName === "SCRIPT" || el.tagName === "STYLE" || el.tagName === "LINK" || el.tagName === "META") return;
|
|
169
|
+
const computed = window.getComputedStyle(el);
|
|
170
|
+
const inlineStyle = el.getAttribute("style") || "";
|
|
171
|
+
let needsFix = false;
|
|
172
|
+
const fixes = [];
|
|
173
|
+
if (computed.display !== "none") {
|
|
174
|
+
const opacityVal = parseFloat(computed.opacity);
|
|
175
|
+
if (!isNaN(opacityVal) && opacityVal < 0.1) {
|
|
176
|
+
const rect = el.getBoundingClientRect();
|
|
177
|
+
if (rect.width > 0 || rect.height > 0 || el.children.length > 0) {
|
|
178
|
+
fixes.push("opacity:1");
|
|
179
|
+
needsFix = true;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (computed.visibility === "hidden" && el.children.length > 0) {
|
|
184
|
+
const rect = el.getBoundingClientRect();
|
|
185
|
+
if (rect.width > 1 && rect.height > 1) {
|
|
186
|
+
fixes.push("visibility:visible");
|
|
187
|
+
needsFix = true;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const clipPath = computed.clipPath || computed.webkitClipPath || "";
|
|
191
|
+
if (clipPath && clipPath !== "none" && (clipPath.includes("inset(100") || clipPath.includes("circle(0") || clipPath.includes("polygon(0") || clipPath === "inset(50%)")) {
|
|
192
|
+
fixes.push("clip-path:none");
|
|
193
|
+
needsFix = true;
|
|
194
|
+
}
|
|
195
|
+
if (inlineStyle && /translate/i.test(inlineStyle)) {
|
|
196
|
+
const transformMatch = inlineStyle.match(/transform\s*:\s*([^;]+)/i);
|
|
197
|
+
if (transformMatch) {
|
|
198
|
+
const t = transformMatch[1];
|
|
199
|
+
const translateYMatch = t.match(/translateY\(\s*(-?\d+)/);
|
|
200
|
+
const translateXMatch = t.match(/translateX\(\s*(-?\d+)/);
|
|
201
|
+
if (translateYMatch) {
|
|
202
|
+
const val = Math.abs(parseInt(translateYMatch[1], 10));
|
|
203
|
+
if (val > 20) {
|
|
204
|
+
fixes.push("transform:none");
|
|
205
|
+
needsFix = true;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (translateXMatch) {
|
|
209
|
+
const val = Math.abs(parseInt(translateXMatch[1], 10));
|
|
210
|
+
if (val > 20) {
|
|
211
|
+
fixes.push("transform:none");
|
|
212
|
+
needsFix = true;
|
|
112
213
|
}
|
|
113
214
|
}
|
|
114
215
|
}
|
|
115
216
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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 {
|
|
217
|
+
if (needsFix) {
|
|
218
|
+
el.setAttribute(DATA_ORIG, inlineStyle);
|
|
219
|
+
el.setAttribute(DATA_FIXED, "true");
|
|
220
|
+
for (const fix of fixes) {
|
|
221
|
+
const [prop, val] = fix.split(":");
|
|
222
|
+
el.style.setProperty(prop, val, "important");
|
|
131
223
|
}
|
|
132
224
|
}
|
|
133
|
-
fixedElements = [];
|
|
134
225
|
}
|
|
135
|
-
function
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
226
|
+
function restoreFixedElements() {
|
|
227
|
+
const fixed = document.querySelectorAll(`[${DATA_FIXED}]`);
|
|
228
|
+
for (const el of fixed) {
|
|
229
|
+
const orig = el.getAttribute(DATA_ORIG);
|
|
230
|
+
if (orig !== null) {
|
|
231
|
+
el.setAttribute("style", orig);
|
|
232
|
+
} else {
|
|
233
|
+
el.removeAttribute("style");
|
|
234
|
+
}
|
|
235
|
+
el.removeAttribute(DATA_ORIG);
|
|
236
|
+
el.removeAttribute(DATA_FIXED);
|
|
237
|
+
}
|
|
141
238
|
}
|
|
142
|
-
function
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
239
|
+
function finishAllAnimations() {
|
|
240
|
+
try {
|
|
241
|
+
const animations = document.getAnimations?.();
|
|
242
|
+
if (animations) {
|
|
243
|
+
for (const anim of animations) {
|
|
244
|
+
try {
|
|
245
|
+
anim.finish();
|
|
246
|
+
} catch {
|
|
247
|
+
try {
|
|
248
|
+
anim.cancel();
|
|
249
|
+
} catch {
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
152
253
|
}
|
|
254
|
+
} catch {
|
|
153
255
|
}
|
|
154
256
|
}
|
|
155
257
|
function pauseAllVideos() {
|
|
@@ -260,6 +362,7 @@ function createAnimationStopModule() {
|
|
|
260
362
|
for (const mutation of mutations) {
|
|
261
363
|
for (const node of mutation.addedNodes) {
|
|
262
364
|
if (!(node instanceof HTMLElement)) continue;
|
|
365
|
+
if (isInsideWidget(node)) continue;
|
|
263
366
|
if (node.tagName === "VIDEO") {
|
|
264
367
|
const v = node;
|
|
265
368
|
if (!v.paused) {
|
|
@@ -289,7 +392,20 @@ function createAnimationStopModule() {
|
|
|
289
392
|
} catch {
|
|
290
393
|
}
|
|
291
394
|
});
|
|
292
|
-
|
|
395
|
+
fixElementIfHidden(node);
|
|
396
|
+
node.querySelectorAll?.("*")?.forEach((child) => {
|
|
397
|
+
fixElementIfHidden(child);
|
|
398
|
+
});
|
|
399
|
+
try {
|
|
400
|
+
const anims = node.getAnimations?.() || [];
|
|
401
|
+
for (const a of anims) {
|
|
402
|
+
try {
|
|
403
|
+
a.finish();
|
|
404
|
+
} catch {
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
} catch {
|
|
408
|
+
}
|
|
293
409
|
}
|
|
294
410
|
}
|
|
295
411
|
});
|
|
@@ -299,12 +415,12 @@ function createAnimationStopModule() {
|
|
|
299
415
|
mutationObserver?.disconnect();
|
|
300
416
|
mutationObserver = null;
|
|
301
417
|
}
|
|
302
|
-
let scanTimers = [];
|
|
303
418
|
function scheduleScans() {
|
|
304
|
-
for (const delay of [500, 1500, 3e3]) {
|
|
419
|
+
for (const delay of [100, 500, 1500, 3e3, 5e3]) {
|
|
305
420
|
scanTimers.push(setTimeout(() => {
|
|
306
421
|
if (!enabled) return;
|
|
307
|
-
|
|
422
|
+
finishAllAnimations();
|
|
423
|
+
bruteForceVisibilityScan();
|
|
308
424
|
pauseAllVideos();
|
|
309
425
|
freezeAllGifs();
|
|
310
426
|
pauseSVG();
|
|
@@ -319,7 +435,9 @@ function createAnimationStopModule() {
|
|
|
319
435
|
if (enabled) return;
|
|
320
436
|
enabled = true;
|
|
321
437
|
injectStyles();
|
|
322
|
-
|
|
438
|
+
patchIntersectionObserver();
|
|
439
|
+
finishAllAnimations();
|
|
440
|
+
bruteForceVisibilityScan();
|
|
323
441
|
pauseAllVideos();
|
|
324
442
|
interceptVideoPlay();
|
|
325
443
|
freezeAllGifs();
|
|
@@ -339,7 +457,8 @@ function createAnimationStopModule() {
|
|
|
339
457
|
resumeSVG();
|
|
340
458
|
restoreAllGifs();
|
|
341
459
|
resumeAllVideos();
|
|
342
|
-
|
|
460
|
+
restoreFixedElements();
|
|
461
|
+
restoreIntersectionObserver();
|
|
343
462
|
removeStyles();
|
|
344
463
|
localStorage.removeItem(STORAGE_KEY);
|
|
345
464
|
}
|
|
@@ -361,4 +480,4 @@ function createAnimationStopModule() {
|
|
|
361
480
|
export {
|
|
362
481
|
createAnimationStopModule as default
|
|
363
482
|
};
|
|
364
|
-
//# sourceMappingURL=animation-stop-
|
|
483
|
+
//# sourceMappingURL=animation-stop-D7fUkoyL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation-stop-D7fUkoyL.js","sources":["../src/features/animation-stop.ts"],"sourcesContent":["import type { FeatureModule, FeatureState } from '../types';\n\n/**\n * Animation Stop – V3\n *\n * 6-Layer approach for universal animation stopping:\n * 1. CSS: fill-mode:forwards + duration:0.01ms (NOT 0ms or none!)\n * 2. IntersectionObserver monkey-patch: scroll-triggered content appears immediately\n * 3. Brute-force element scan: force hidden-by-animation elements visible\n * 4. Web Animations API: finish() running animations\n * 5. Media: pause videos, freeze GIFs, stop SVG SMIL, stop marquees\n * 6. MutationObserver: handle dynamically added content\n *\n * Interactive elements (accordions, dropdowns) keep short transitions.\n * User clicks temporarily allow transitions (350ms window).\n * Clean restore via data-attributes when deactivated.\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 const DATA_ORIG = 'data-accessify-orig-style';\n const DATA_FIXED = 'data-accessify-fixed';\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 originalIntersectionObserver: typeof IntersectionObserver | null = null;\n let interactionTimer: ReturnType<typeof setTimeout> | null = null;\n let styleEl: HTMLStyleElement | null = null;\n let scanTimers: ReturnType<typeof setTimeout>[] = [];\n\n // =========================================================================\n // 1. CSS – force end-states via fill-mode:forwards + 0.01ms duration\n // =========================================================================\n\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 [data-framer-component-type=\"NavigationContainer\"] *,\n .nav *, .navbar *, .menu * {\n transition-duration: 0.15s !important;\n animation-duration: 0.15s !important;\n }\n `;\n }\n\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 styleEl.textContent = relaxedCSS();\n if (interactionTimer) clearTimeout(interactionTimer);\n interactionTimer = setTimeout(() => {\n if (enabled && styleEl) styleEl.textContent = strictCSS();\n }, 350);\n }\n\n function onKeyInteraction(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') onUserInteraction();\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 // =========================================================================\n // 3. IntersectionObserver monkey-patch\n // Scroll-triggered animations (AOS, Framer, ScrollReveal, GSAP ScrollTrigger)\n // rely on IntersectionObserver. We replace it with a fake that immediately\n // reports all observed elements as intersecting, so their reveal callbacks fire.\n // =========================================================================\n\n function patchIntersectionObserver() {\n if (originalIntersectionObserver) return;\n originalIntersectionObserver = window.IntersectionObserver;\n\n const FakeObserver = class {\n private callback: IntersectionObserverCallback;\n private _entries: IntersectionObserverEntry[];\n\n constructor(callback: IntersectionObserverCallback, _options?: IntersectionObserverInit) {\n this.callback = callback;\n this._entries = [];\n }\n\n observe(target: Element) {\n const entry: IntersectionObserverEntry = {\n target,\n isIntersecting: true,\n intersectionRatio: 1,\n boundingClientRect: target.getBoundingClientRect(),\n intersectionRect: target.getBoundingClientRect(),\n rootBounds: null,\n time: performance.now(),\n };\n this._entries.push(entry);\n // Fire callback async so it behaves like real observer\n setTimeout(() => {\n try { this.callback([entry], this as any); } catch { /* lib error */ }\n }, 0);\n }\n\n unobserve(_target: Element) {\n this._entries = this._entries.filter(e => e.target !== _target);\n }\n\n disconnect() {\n this._entries = [];\n }\n\n takeRecords(): IntersectionObserverEntry[] {\n return this._entries;\n }\n\n get root() { return null; }\n get rootMargin() { return '0px 0px 0px 0px'; }\n get thresholds() { return [0]; }\n };\n\n (window as any).IntersectionObserver = FakeObserver;\n }\n\n function restoreIntersectionObserver() {\n if (originalIntersectionObserver) {\n window.IntersectionObserver = originalIntersectionObserver;\n originalIntersectionObserver = null;\n }\n }\n\n // =========================================================================\n // 4. Brute-force element scan — force hidden-by-animation elements visible\n // Checks: computed opacity, inline transform/translate, visibility, clipPath\n // Stores originals in data-attributes for clean restore\n // =========================================================================\n\n function isInsideWidget(el: HTMLElement): boolean {\n return !!el.closest('#accessify-root');\n }\n\n /**\n * Scan ALL elements and force anything that looks animation-hidden into visible state.\n * We check both computed styles and inline styles.\n */\n function bruteForceVisibilityScan() {\n const all = document.querySelectorAll<HTMLElement>('*');\n for (const el of all) {\n if (isInsideWidget(el)) continue;\n if (el.hasAttribute(DATA_FIXED)) continue; // already fixed\n fixElementIfHidden(el);\n }\n }\n\n function fixElementIfHidden(el: HTMLElement) {\n if (isInsideWidget(el)) return;\n if (el.hasAttribute(DATA_FIXED)) return;\n if (el.tagName === 'SCRIPT' || el.tagName === 'STYLE' || el.tagName === 'LINK' || el.tagName === 'META') return;\n\n const computed = window.getComputedStyle(el);\n const inlineStyle = el.getAttribute('style') || '';\n let needsFix = false;\n const fixes: string[] = [];\n\n // Check opacity — anything below 0.1 that's not display:none\n if (computed.display !== 'none') {\n const opacityVal = parseFloat(computed.opacity);\n if (!isNaN(opacityVal) && opacityVal < 0.1) {\n // Only fix if element has some dimensions (not a zero-size wrapper)\n const rect = el.getBoundingClientRect();\n if (rect.width > 0 || rect.height > 0 || el.children.length > 0) {\n fixes.push('opacity:1');\n needsFix = true;\n }\n }\n }\n\n // Check visibility:hidden (only if element has content)\n if (computed.visibility === 'hidden' && el.children.length > 0) {\n // Don't fix elements that are likely intentionally hidden (e.g. screen-reader-only)\n const rect = el.getBoundingClientRect();\n if (rect.width > 1 && rect.height > 1) {\n fixes.push('visibility:visible');\n needsFix = true;\n }\n }\n\n // Check clip-path that hides element completely\n const clipPath = computed.clipPath || (computed as any).webkitClipPath || '';\n if (clipPath && clipPath !== 'none' && (\n clipPath.includes('inset(100') || clipPath.includes('circle(0') ||\n clipPath.includes('polygon(0') || clipPath === 'inset(50%)'\n )) {\n fixes.push('clip-path:none');\n needsFix = true;\n }\n\n // Check inline transform with translateY/translateX that moves element offscreen\n // BUT do NOT touch transform:none or transforms that are purely for layout\n if (inlineStyle && /translate/i.test(inlineStyle)) {\n const transformMatch = inlineStyle.match(/transform\\s*:\\s*([^;]+)/i);\n if (transformMatch) {\n const t = transformMatch[1];\n // Only fix large translates that look like animation start-states\n const translateYMatch = t.match(/translateY\\(\\s*(-?\\d+)/);\n const translateXMatch = t.match(/translateX\\(\\s*(-?\\d+)/);\n if (translateYMatch) {\n const val = Math.abs(parseInt(translateYMatch[1], 10));\n if (val > 20) { fixes.push('transform:none'); needsFix = true; }\n }\n if (translateXMatch) {\n const val = Math.abs(parseInt(translateXMatch[1], 10));\n if (val > 20) { fixes.push('transform:none'); needsFix = true; }\n }\n }\n }\n\n if (needsFix) {\n // Store original inline style for clean restore\n el.setAttribute(DATA_ORIG, inlineStyle);\n el.setAttribute(DATA_FIXED, 'true');\n // Apply fixes\n for (const fix of fixes) {\n const [prop, val] = fix.split(':');\n el.style.setProperty(prop, val, 'important');\n }\n }\n }\n\n function restoreFixedElements() {\n const fixed = document.querySelectorAll<HTMLElement>(`[${DATA_FIXED}]`);\n for (const el of fixed) {\n const orig = el.getAttribute(DATA_ORIG);\n if (orig !== null) {\n el.setAttribute('style', orig);\n } else {\n el.removeAttribute('style');\n }\n el.removeAttribute(DATA_ORIG);\n el.removeAttribute(DATA_FIXED);\n }\n }\n\n // =========================================================================\n // 5. Web Animations API — finish() running animations\n // =========================================================================\n\n function finishAllAnimations() {\n try {\n const animations = document.getAnimations?.();\n if (animations) {\n for (const anim of animations) {\n try {\n // finish() jumps to END state (visible) — NOT pause() which freezes at START\n anim.finish();\n } catch {\n try { anim.cancel(); } catch { /* ignore */ }\n }\n }\n }\n } catch { /* getAnimations not supported */ }\n }\n\n // =========================================================================\n // 6. 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 // 7. 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 // 8. 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 // 9. 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 if (isInsideWidget(node)) 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 // Fix hidden-by-animation elements\n fixElementIfHidden(node);\n node.querySelectorAll?.('*')?.forEach((child) => {\n fixElementIfHidden(child as HTMLElement);\n });\n\n // Finish any new animations\n try {\n const anims = node.getAnimations?.() || [];\n for (const a of anims) { try { a.finish(); } catch { /* */ } }\n } catch { /* */ }\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 // 10. Delayed re-scans — frameworks render async\n // =========================================================================\n\n function scheduleScans() {\n for (const delay of [100, 500, 1500, 3000, 5000]) {\n scanTimers.push(setTimeout(() => {\n if (!enabled) return;\n finishAllAnimations();\n bruteForceVisibilityScan();\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 // Layer 1: CSS — force end-states + kill visible motion\n injectStyles();\n\n // Layer 2: IntersectionObserver monkey-patch\n patchIntersectionObserver();\n\n // Layer 3: Finish running Web Animations\n finishAllAnimations();\n\n // Layer 4: Brute-force visibility scan\n bruteForceVisibilityScan();\n\n // Layer 5: Media\n pauseAllVideos();\n interceptVideoPlay();\n freezeAllGifs();\n pauseSVG();\n stopMarquees();\n\n // Interaction listener for accordions etc.\n addInteractionListeners();\n\n // Layer 6: Dynamic content\n setupObserver();\n\n // Async re-scans for framework render timing\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 restoreFixedElements();\n restoreIntersectionObserver();\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-CcbrBWbb.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-D7fUkoyL.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-DG1b6-Dl.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-8Pdy-P-C.js.map
|