accessify-widget 0.3.59 → 0.3.61
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-fR6pB-nV.js → animation-stop-DrDe9Q9n.js} +120 -143
- package/dist/animation-stop-DrDe9Q9n.js.map +1 -0
- package/dist/{index-UdJq2Ln2.js → index-nzfT-SzJ.js} +38 -9
- package/dist/{index-UdJq2Ln2.js.map → index-nzfT-SzJ.js.map} +1 -1
- package/dist/{keyboard-nav-Dg0yGJq0.js → keyboard-nav-DDSxMaow.js} +2 -2
- package/dist/{keyboard-nav-Dg0yGJq0.js.map → keyboard-nav-DDSxMaow.js.map} +1 -1
- package/dist/loader.min.js +1 -1
- package/dist/{page-structure-0qC8QqRB.js → page-structure-C_KIRohv.js} +2 -2
- package/dist/{page-structure-0qC8QqRB.js.map → page-structure-C_KIRohv.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-fR6pB-nV.js.map +0 -1
package/dist/accessify.mjs
CHANGED
|
@@ -1,48 +1,49 @@
|
|
|
1
|
-
function
|
|
2
|
-
let n = node || null;
|
|
3
|
-
let hops = 0;
|
|
4
|
-
while (n && hops < 50) {
|
|
5
|
-
if (n instanceof Element) {
|
|
6
|
-
if (n.id === "accessify-root") return true;
|
|
7
|
-
if (n.tagName === "ACCESSIFY-WIDGET") return true;
|
|
8
|
-
const cls = n.getAttribute?.("class");
|
|
9
|
-
if (cls && /(?:^|\s)accessify-/.test(cls)) return true;
|
|
10
|
-
}
|
|
11
|
-
const parent = n.parentNode;
|
|
12
|
-
if (parent) n = parent;
|
|
13
|
-
else if (n.host) n = n.host;
|
|
14
|
-
else break;
|
|
15
|
-
hops++;
|
|
16
|
-
}
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
function createAnimationStopModuleImpl() {
|
|
1
|
+
function createAnimationStopModule() {
|
|
20
2
|
let enabled = false;
|
|
21
3
|
const STYLE_ID = "a11y-stop-animations";
|
|
22
4
|
const STORAGE_KEY = "accessify-animation-stop";
|
|
23
5
|
let mutationObserver = null;
|
|
24
6
|
let scanInterval = null;
|
|
7
|
+
let scrollHandler = null;
|
|
25
8
|
let originalVideoPlay = null;
|
|
26
9
|
let originalAnimate = null;
|
|
27
10
|
let pausedVideos = [];
|
|
28
11
|
let gifOriginals = /* @__PURE__ */ new Map();
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
12
|
+
const VISUAL_ONLY_PROPS = /* @__PURE__ */ new Set([
|
|
13
|
+
"transform",
|
|
14
|
+
"scale",
|
|
15
|
+
"rotate",
|
|
16
|
+
"translate",
|
|
17
|
+
"filter",
|
|
18
|
+
"backdropFilter",
|
|
19
|
+
"backdrop-filter",
|
|
20
|
+
"webkitTransform",
|
|
21
|
+
"webkitFilter",
|
|
22
|
+
"-webkit-transform",
|
|
23
|
+
"-webkit-filter",
|
|
24
|
+
"offset",
|
|
25
|
+
"easing",
|
|
26
|
+
"composite"
|
|
27
|
+
]);
|
|
28
|
+
function isVisualOnlyKeyframes(keyframes) {
|
|
29
|
+
if (!keyframes) return false;
|
|
30
|
+
try {
|
|
31
|
+
if (Array.isArray(keyframes)) {
|
|
32
|
+
for (const kf of keyframes) {
|
|
33
|
+
if (!kf || typeof kf !== "object") return false;
|
|
34
|
+
for (const key of Object.keys(kf)) {
|
|
35
|
+
if (!VISUAL_ONLY_PROPS.has(key)) return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
for (const key of Object.keys(keyframes)) {
|
|
41
|
+
if (!VISUAL_ONLY_PROPS.has(key)) return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
} catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
46
47
|
}
|
|
47
48
|
function patchAnimate() {
|
|
48
49
|
if (originalAnimate) return;
|
|
@@ -51,6 +52,19 @@ function createAnimationStopModuleImpl() {
|
|
|
51
52
|
if (!enabled) {
|
|
52
53
|
return originalAnimate.call(this, keyframes, options);
|
|
53
54
|
}
|
|
55
|
+
try {
|
|
56
|
+
let node = this;
|
|
57
|
+
while (node) {
|
|
58
|
+
if (node.id === "accessify-root") {
|
|
59
|
+
return originalAnimate.call(this, keyframes, options);
|
|
60
|
+
}
|
|
61
|
+
const parent = node.parentNode || node.host;
|
|
62
|
+
if (parent === node) break;
|
|
63
|
+
node = parent;
|
|
64
|
+
}
|
|
65
|
+
} catch {
|
|
66
|
+
}
|
|
67
|
+
const visualOnly = isVisualOnlyKeyframes(keyframes);
|
|
54
68
|
let opts;
|
|
55
69
|
if (typeof options === "number") {
|
|
56
70
|
opts = { duration: 1e-3, fill: "forwards" };
|
|
@@ -67,7 +81,11 @@ function createAnimationStopModuleImpl() {
|
|
|
67
81
|
}
|
|
68
82
|
const anim = originalAnimate.call(this, keyframes, opts);
|
|
69
83
|
try {
|
|
70
|
-
|
|
84
|
+
if (visualOnly) {
|
|
85
|
+
anim.cancel();
|
|
86
|
+
} else {
|
|
87
|
+
anim.finish();
|
|
88
|
+
}
|
|
71
89
|
} catch {
|
|
72
90
|
}
|
|
73
91
|
return anim;
|
|
@@ -95,17 +113,49 @@ function createAnimationStopModuleImpl() {
|
|
|
95
113
|
animation-timeline: auto !important;
|
|
96
114
|
scroll-timeline: none !important;
|
|
97
115
|
}
|
|
116
|
+
/* Neutralize interaction transforms (hover zoom, click scale, focus
|
|
117
|
+
lift). Without this, CSS like \`.card:hover { transform: scale(1.05) }\`
|
|
118
|
+
still visibly changes the element — just instantly. Users who
|
|
119
|
+
disable animations expect NO motion including the end-state. */
|
|
120
|
+
*:not(#accessify-root):not(#accessify-root *):hover,
|
|
121
|
+
*:not(#accessify-root):not(#accessify-root *):focus,
|
|
122
|
+
*:not(#accessify-root):not(#accessify-root *):focus-within,
|
|
123
|
+
*:not(#accessify-root):not(#accessify-root *):focus-visible,
|
|
124
|
+
*:not(#accessify-root):not(#accessify-root *):active {
|
|
125
|
+
transform: none !important;
|
|
126
|
+
scale: 1 !important;
|
|
127
|
+
rotate: 0deg !important;
|
|
128
|
+
translate: 0 0 !important;
|
|
129
|
+
filter: none !important;
|
|
130
|
+
-webkit-filter: none !important;
|
|
131
|
+
}
|
|
98
132
|
`;
|
|
99
133
|
document.head.appendChild(style);
|
|
100
134
|
}
|
|
101
135
|
function removeStyles() {
|
|
102
136
|
document.getElementById(STYLE_ID)?.remove();
|
|
103
137
|
}
|
|
138
|
+
function isWidgetAnimation(anim) {
|
|
139
|
+
try {
|
|
140
|
+
const target = anim.effect?.target;
|
|
141
|
+
if (!target) return false;
|
|
142
|
+
let node = target;
|
|
143
|
+
while (node) {
|
|
144
|
+
if (node.id === "accessify-root") return true;
|
|
145
|
+
const parent = node.parentNode || node.host;
|
|
146
|
+
if (parent === node) break;
|
|
147
|
+
node = parent;
|
|
148
|
+
}
|
|
149
|
+
} catch {
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
104
153
|
function finishAllAnimations() {
|
|
105
154
|
try {
|
|
106
155
|
const animations = document.getAnimations?.();
|
|
107
156
|
if (!animations) return;
|
|
108
157
|
for (const anim of animations) {
|
|
158
|
+
if (isWidgetAnimation(anim)) continue;
|
|
109
159
|
try {
|
|
110
160
|
anim.finish();
|
|
111
161
|
} catch {
|
|
@@ -155,12 +205,7 @@ function createAnimationStopModuleImpl() {
|
|
|
155
205
|
let needsFix = false;
|
|
156
206
|
const originals = {};
|
|
157
207
|
const opacityVal = parseFloat(computed.opacity);
|
|
158
|
-
|
|
159
|
-
if (isFramerEl && opacityVal < 1 && inline.opacity !== "" && inline.opacity !== "1") {
|
|
160
|
-
originals.opacity = inline.opacity;
|
|
161
|
-
el.style.opacity = "1";
|
|
162
|
-
needsFix = true;
|
|
163
|
-
} else if (opacityVal < 0.1 && inline.opacity !== "") {
|
|
208
|
+
if (opacityVal < 0.1 && inline.opacity !== "") {
|
|
164
209
|
originals.opacity = inline.opacity;
|
|
165
210
|
el.style.opacity = "1";
|
|
166
211
|
needsFix = true;
|
|
@@ -169,11 +214,6 @@ function createAnimationStopModuleImpl() {
|
|
|
169
214
|
el.style.opacity = "1";
|
|
170
215
|
needsFix = true;
|
|
171
216
|
}
|
|
172
|
-
if (isFramerEl && inline.transform && /translate[XY]?\([^0]/.test(inline.transform)) {
|
|
173
|
-
if (!originals.transform) originals.transform = inline.transform;
|
|
174
|
-
el.style.transform = "none";
|
|
175
|
-
needsFix = true;
|
|
176
|
-
}
|
|
177
217
|
if (inline.transform && /translate[XY]\([^0]/.test(inline.transform)) {
|
|
178
218
|
originals.transform = inline.transform;
|
|
179
219
|
el.style.transform = "none";
|
|
@@ -210,103 +250,42 @@ function createAnimationStopModuleImpl() {
|
|
|
210
250
|
delete el.dataset.a11yOrigStyle;
|
|
211
251
|
});
|
|
212
252
|
}
|
|
213
|
-
const FRAMER_SELECTOR = '[data-framer-name], [class*="framer-"], [data-framer-appear-id]';
|
|
214
|
-
function isFramerElement(el) {
|
|
215
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
216
|
-
if (el.hasAttribute("data-framer-name")) return true;
|
|
217
|
-
if (el.hasAttribute("data-framer-appear-id")) return true;
|
|
218
|
-
const cls = el.getAttribute("class") || "";
|
|
219
|
-
return /(?:^|\s)framer-/.test(cls);
|
|
220
|
-
}
|
|
221
|
-
function hasNonTrivialTransform(tr) {
|
|
222
|
-
if (!tr || tr === "none") return false;
|
|
223
|
-
const mMatrix = tr.match(/matrix\(([^)]+)\)/);
|
|
224
|
-
if (mMatrix) {
|
|
225
|
-
const p = mMatrix[1].split(",").map((v) => parseFloat(v.trim()));
|
|
226
|
-
if (Math.abs(p[4] || 0) > 0.5 || Math.abs(p[5] || 0) > 0.5) return true;
|
|
227
|
-
if (Math.abs((p[0] || 1) - 1) > 0.02 || Math.abs((p[3] || 1) - 1) > 0.02) return true;
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
const mTrans = tr.match(/translate[XY3dD]*\(([^)]+)\)/);
|
|
231
|
-
if (mTrans) {
|
|
232
|
-
const parts = mTrans[1].split(",").map((v) => parseFloat(v.trim()));
|
|
233
|
-
if (parts.some((p) => !isNaN(p) && Math.abs(p) > 0.5)) return true;
|
|
234
|
-
}
|
|
235
|
-
const mScale = tr.match(/scale[XY]?\(([^)]+)\)/);
|
|
236
|
-
if (mScale) {
|
|
237
|
-
const p = parseFloat(mScale[1].split(",")[0].trim());
|
|
238
|
-
if (!isNaN(p) && Math.abs(p - 1) > 0.02) return true;
|
|
239
|
-
}
|
|
240
|
-
return false;
|
|
241
|
-
}
|
|
242
|
-
function clampFramerElement(el) {
|
|
243
|
-
const style = el.style;
|
|
244
|
-
let changed = false;
|
|
245
|
-
if (style.opacity !== "" && style.opacity !== "1") {
|
|
246
|
-
const v = parseFloat(style.opacity);
|
|
247
|
-
if (!isNaN(v) && v < 1) {
|
|
248
|
-
style.opacity = "1";
|
|
249
|
-
changed = true;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
if (style.transform && hasNonTrivialTransform(style.transform)) {
|
|
253
|
-
style.transform = "none";
|
|
254
|
-
changed = true;
|
|
255
|
-
}
|
|
256
|
-
return changed;
|
|
257
|
-
}
|
|
258
253
|
function freezeScrollAnimations() {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
if (styleFreezeObserver) return;
|
|
269
|
-
styleFreezeObserver = new MutationObserver((mutations) => {
|
|
270
|
-
if (!enabled || ignoreStyleMutations) return;
|
|
271
|
-
ignoreStyleMutations = true;
|
|
272
|
-
try {
|
|
273
|
-
for (const m of mutations) {
|
|
274
|
-
if (m.type !== "attributes" || m.attributeName !== "style") continue;
|
|
275
|
-
const el = m.target;
|
|
276
|
-
if (!isFramerElement(el)) continue;
|
|
277
|
-
if (el.closest("#accessify-root") || el.closest("accessify-widget")) continue;
|
|
278
|
-
clampFramerElement(el);
|
|
279
|
-
}
|
|
280
|
-
} finally {
|
|
281
|
-
ignoreStyleMutations = false;
|
|
254
|
+
document.querySelectorAll("[style]").forEach((el) => {
|
|
255
|
+
if (el.closest("#accessify-root") || el.closest("accessify-widget")) return;
|
|
256
|
+
if (el.dataset.a11yFrozenStyle) return;
|
|
257
|
+
const s = el.style;
|
|
258
|
+
if (s.transform || s.opacity) {
|
|
259
|
+
el.dataset.a11yFrozenStyle = JSON.stringify({
|
|
260
|
+
transform: s.transform || "",
|
|
261
|
+
opacity: s.opacity || ""
|
|
262
|
+
});
|
|
282
263
|
}
|
|
283
264
|
});
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (el.closest("#accessify-root") || el.closest("accessify-widget")) return;
|
|
299
|
-
clampFramerElement(el);
|
|
300
|
-
});
|
|
301
|
-
} finally {
|
|
302
|
-
ignoreStyleMutations = false;
|
|
265
|
+
if (!scrollHandler) {
|
|
266
|
+
scrollHandler = () => {
|
|
267
|
+
if (!enabled) return;
|
|
268
|
+
document.querySelectorAll("[data-a11y-frozen-style]").forEach((el) => {
|
|
269
|
+
try {
|
|
270
|
+
const frozen = JSON.parse(el.dataset.a11yFrozenStyle || "{}");
|
|
271
|
+
if (frozen.transform && el.style.transform !== frozen.transform) {
|
|
272
|
+
el.style.transform = frozen.transform;
|
|
273
|
+
}
|
|
274
|
+
} catch {
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
};
|
|
278
|
+
window.addEventListener("scroll", scrollHandler, { passive: true, capture: true });
|
|
303
279
|
}
|
|
304
280
|
}
|
|
305
281
|
function unfreezeScrollAnimations() {
|
|
306
|
-
if (
|
|
307
|
-
|
|
308
|
-
|
|
282
|
+
if (scrollHandler) {
|
|
283
|
+
window.removeEventListener("scroll", scrollHandler, true);
|
|
284
|
+
scrollHandler = null;
|
|
309
285
|
}
|
|
286
|
+
document.querySelectorAll("[data-a11y-frozen-style]").forEach((el) => {
|
|
287
|
+
delete el.dataset.a11yFrozenStyle;
|
|
288
|
+
});
|
|
310
289
|
}
|
|
311
290
|
function pauseAllVideos() {
|
|
312
291
|
document.querySelectorAll("video").forEach((v) => {
|
|
@@ -450,7 +429,6 @@ function createAnimationStopModuleImpl() {
|
|
|
450
429
|
function activate() {
|
|
451
430
|
if (enabled) return;
|
|
452
431
|
enabled = true;
|
|
453
|
-
blockFramerHover();
|
|
454
432
|
patchAnimate();
|
|
455
433
|
injectStyles();
|
|
456
434
|
finishAllAnimations();
|
|
@@ -469,7 +447,7 @@ function createAnimationStopModuleImpl() {
|
|
|
469
447
|
if (!enabled) return;
|
|
470
448
|
finishAllAnimations();
|
|
471
449
|
forceHiddenElementsVisible();
|
|
472
|
-
|
|
450
|
+
freezeScrollAnimations();
|
|
473
451
|
pauseAllVideos();
|
|
474
452
|
freezeAllGifs();
|
|
475
453
|
}, delay);
|
|
@@ -480,7 +458,6 @@ function createAnimationStopModuleImpl() {
|
|
|
480
458
|
enabled = false;
|
|
481
459
|
stopPeriodicScan();
|
|
482
460
|
teardownObserver();
|
|
483
|
-
unblockFramerHover();
|
|
484
461
|
restoreAnimate();
|
|
485
462
|
unfreezeScrollAnimations();
|
|
486
463
|
restoreGSAP();
|
|
@@ -508,6 +485,6 @@ function createAnimationStopModuleImpl() {
|
|
|
508
485
|
};
|
|
509
486
|
}
|
|
510
487
|
export {
|
|
511
|
-
|
|
488
|
+
createAnimationStopModule as default
|
|
512
489
|
};
|
|
513
|
-
//# sourceMappingURL=animation-stop-
|
|
490
|
+
//# sourceMappingURL=animation-stop-DrDe9Q9n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation-stop-DrDe9Q9n.js","sources":["../src/features/animation-stop.ts"],"sourcesContent":["import type { FeatureModule, FeatureState } from '../types';\n\n/**\n * Animation Stop – V4 (Clean 3-Layer Approach)\n *\n * Layer 1: CSS injection — kill all CSS animations/transitions via 0.001ms duration\n * Layer 2: Web Animations API — finish() all running WAAPI animations (Framer Motion etc.)\n * Layer 3: JS library detection — GSAP globalTimeline, inline-style freeze for rAF-based libs\n * Layer 4: Media — pause videos, freeze GIFs, stop SVG SMIL, stop marquees\n *\n * + MutationObserver for dynamic content\n * + Periodic re-scan (every 500ms) for frameworks that create new animations\n *\n * DOES NOT:\n * - Monkey-patch IntersectionObserver (breaks lazy loading)\n * - Override requestAnimationFrame (breaks entire page)\n * - Override Element.prototype.animate() (too invasive)\n * - Override matchMedia (too invasive)\n * - Set opacity:1 !important via CSS (breaks modals/hidden elements)\n * - Use animation:none or transition:none (breaks JS events)\n */\nexport default function createAnimationStopModule(): FeatureModule {\n let enabled = false;\n const STYLE_ID = 'a11y-stop-animations';\n const STORAGE_KEY = 'accessify-animation-stop';\n\n // --- State ---\n let mutationObserver: MutationObserver | null = null;\n let scanInterval: ReturnType<typeof setInterval> | null = null;\n let scrollHandler: (() => void) | null = null;\n let originalVideoPlay: typeof HTMLVideoElement.prototype.play | null = null;\n let originalAnimate: typeof Element.prototype.animate | null = null;\n let pausedVideos: HTMLVideoElement[] = [];\n let gifOriginals = new Map<HTMLImageElement, string>();\n\n // =========================================================================\n // Layer 0: Element.prototype.animate() intercept\n //\n // This is THE critical piece for Framer Motion. Framer uses WAAPI\n // (Element.prototype.animate()) for ALL visual animations — hover,\n // appear, scroll, transitions. CSS rules do NOT affect WAAPI.\n // We intercept at creation time and force duration to 0.001ms\n // so every animation completes instantly.\n // =========================================================================\n\n /**\n * Detect animations whose keyframes only modify transform-like or filter\n * properties. These are the signature of interaction animations (hover\n * zoom, click scale, focus rings) that Framer Motion and similar libs\n * create on-the-fly. We must CANCEL these instead of FINISHING them,\n * otherwise the element lands in the visible end-state (e.g. scale(1.05)).\n */\n const VISUAL_ONLY_PROPS = new Set([\n 'transform', 'scale', 'rotate', 'translate',\n 'filter', 'backdropFilter', 'backdrop-filter',\n 'webkitTransform', 'webkitFilter', '-webkit-transform', '-webkit-filter',\n 'offset', 'easing', 'composite',\n ]);\n function isVisualOnlyKeyframes(\n keyframes: Keyframe[] | PropertyIndexedKeyframes | null,\n ): boolean {\n if (!keyframes) return false;\n try {\n if (Array.isArray(keyframes)) {\n for (const kf of keyframes) {\n if (!kf || typeof kf !== 'object') return false;\n for (const key of Object.keys(kf)) {\n if (!VISUAL_ONLY_PROPS.has(key)) return false;\n }\n }\n return true;\n }\n // PropertyIndexedKeyframes\n for (const key of Object.keys(keyframes)) {\n if (!VISUAL_ONLY_PROPS.has(key)) return false;\n }\n return true;\n } catch {\n return false;\n }\n }\n\n function patchAnimate() {\n if (originalAnimate) return;\n originalAnimate = Element.prototype.animate;\n\n Element.prototype.animate = function (\n this: Element,\n keyframes: Keyframe[] | PropertyIndexedKeyframes | null,\n options?: number | KeyframeAnimationOptions,\n ): Animation {\n if (!enabled) {\n return originalAnimate!.call(this, keyframes, options);\n }\n\n // Never interfere with the widget's own animations. The widget lives\n // in shadow DOM under #accessify-root — walk up through shadow roots\n // and skip if we find the accessify host.\n try {\n let node: Node | null = this;\n while (node) {\n if ((node as Element).id === 'accessify-root') {\n return originalAnimate!.call(this, keyframes, options);\n }\n const parent = (node as any).parentNode || (node as any).host;\n if (parent === node) break;\n node = parent;\n }\n } catch { /* ignore */ }\n\n const visualOnly = isVisualOnlyKeyframes(keyframes);\n\n // Force instant completion: duration 0.001ms, no delay, 1 iteration, fill forwards\n let opts: KeyframeAnimationOptions;\n if (typeof options === 'number') {\n opts = { duration: 0.001, fill: 'forwards' as FillMode };\n } else {\n opts = {\n ...(options || {}),\n duration: 0.001,\n delay: 0,\n iterations: 1,\n fill: 'forwards' as FillMode,\n };\n // Remove iterationStart, endDelay etc. that could interfere\n delete (opts as any).iterationStart;\n delete (opts as any).endDelay;\n }\n\n const anim = originalAnimate!.call(this, keyframes, opts);\n try {\n if (visualOnly) {\n anim.cancel();\n } else {\n anim.finish();\n }\n } catch { /* ignore */ }\n return anim;\n };\n }\n\n function restoreAnimate() {\n if (originalAnimate) {\n Element.prototype.animate = originalAnimate;\n originalAnimate = null;\n }\n }\n\n // =========================================================================\n // Layer 1: CSS Injection\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 = `\n *, *::before, *::after {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n animation-delay: 0s !important;\n animation-fill-mode: forwards !important;\n transition-duration: 0.001ms !important;\n transition-delay: 0s !important;\n scroll-behavior: auto !important;\n animation-timeline: auto !important;\n scroll-timeline: none !important;\n }\n /* Neutralize interaction transforms (hover zoom, click scale, focus\n lift). Without this, CSS like \\`.card:hover { transform: scale(1.05) }\\`\n still visibly changes the element — just instantly. Users who\n disable animations expect NO motion including the end-state. */\n *:not(#accessify-root):not(#accessify-root *):hover,\n *:not(#accessify-root):not(#accessify-root *):focus,\n *:not(#accessify-root):not(#accessify-root *):focus-within,\n *:not(#accessify-root):not(#accessify-root *):focus-visible,\n *:not(#accessify-root):not(#accessify-root *):active {\n transform: none !important;\n scale: 1 !important;\n rotate: 0deg !important;\n translate: 0 0 !important;\n filter: none !important;\n -webkit-filter: none !important;\n }\n `;\n document.head.appendChild(style);\n }\n\n function removeStyles() {\n document.getElementById(STYLE_ID)?.remove();\n }\n\n // =========================================================================\n // Layer 2: Web Animations API — finish all WAAPI animations\n // =========================================================================\n\n function isWidgetAnimation(anim: Animation): boolean {\n try {\n const target = (anim.effect as any)?.target as Element | null;\n if (!target) return false;\n let node: Node | null = target;\n while (node) {\n if ((node as Element).id === 'accessify-root') return true;\n const parent = (node as any).parentNode || (node as any).host;\n if (parent === node) break;\n node = parent;\n }\n } catch { /* ignore */ }\n return false;\n }\n\n function finishAllAnimations() {\n try {\n const animations = document.getAnimations?.();\n if (!animations) return;\n for (const anim of animations) {\n if (isWidgetAnimation(anim)) continue;\n try {\n anim.finish();\n } catch {\n try { anim.cancel(); } catch { /* ignore */ }\n }\n }\n } catch { /* getAnimations not supported */ }\n }\n\n // =========================================================================\n // Layer 3: JS animation library detection + inline style freeze\n // =========================================================================\n\n function patchGSAP() {\n const g = (window as any).gsap;\n if (g?.globalTimeline) {\n try {\n g.globalTimeline.timeScale(0);\n (window as any)._a11yGsapPatched = true;\n } catch { /* ignore */ }\n }\n }\n\n function restoreGSAP() {\n const g = (window as any).gsap;\n if ((window as any)._a11yGsapPatched && g?.globalTimeline) {\n try {\n g.globalTimeline.timeScale(1);\n delete (window as any)._a11yGsapPatched;\n } catch { /* ignore */ }\n }\n }\n\n /**\n * Force hidden-by-animation elements visible.\n * Only touches INLINE styles — never sets CSS !important on opacity etc.\n * which would break modals and intentionally hidden elements.\n */\n function forceHiddenElementsVisible() {\n // Only process elements near the viewport to avoid layout chaos on\n // Framer/scroll-animated pages where dozens of off-screen elements\n // are hidden via opacity:0 / translateY as part of scroll reveals.\n const viewH = window.innerHeight;\n const margin = viewH * 1.5; // 1.5x viewport ahead\n\n const all = document.querySelectorAll<HTMLElement>('*');\n for (const el of all) {\n if (el.tagName === 'SCRIPT' || el.tagName === 'STYLE' || el.tagName === 'NOSCRIPT' || el.tagName === 'META' || el.tagName === 'LINK') continue;\n if (el.closest('#accessify-root') || el.closest('accessify-widget')) continue;\n if (el.dataset.a11yOrigStyle) continue; // Already processed\n\n const computed = window.getComputedStyle(el);\n if (computed.display === 'none') continue; // Intentionally hidden\n\n // Skip elements far below the current scroll position —\n // they will be handled when the user scrolls to them (periodic re-scan).\n const rect = el.getBoundingClientRect();\n if (rect.top > viewH + margin) continue; // Too far below viewport\n // Also skip if entirely above viewport (already scrolled past)\n if (rect.bottom < -margin) continue;\n\n const inline = el.style;\n let needsFix = false;\n const originals: Record<string, string> = {};\n\n // Inline opacity 0 or near-0 (computed, not stylesheet)\n const opacityVal = parseFloat(computed.opacity);\n if (opacityVal < 0.1 && inline.opacity !== '') {\n originals.opacity = inline.opacity;\n el.style.opacity = '1';\n needsFix = true;\n } else if (opacityVal < 0.1 && el.hasAttribute('data-framer-appear-id')) {\n // Framer appear elements: opacity set via WAAPI or framework\n originals.opacity = inline.opacity || '';\n el.style.opacity = '1';\n needsFix = true;\n }\n\n // Inline transform with translate that moves element off-screen\n if (inline.transform && /translate[XY]\\([^0]/.test(inline.transform)) {\n originals.transform = inline.transform;\n el.style.transform = 'none';\n needsFix = true;\n }\n\n // Inline visibility hidden\n if (inline.visibility === 'hidden') {\n originals.visibility = inline.visibility;\n el.style.visibility = 'visible';\n needsFix = true;\n }\n\n // Inline clip-path that hides element\n if (inline.clipPath && inline.clipPath !== 'none') {\n originals.clipPath = inline.clipPath;\n el.style.clipPath = 'none';\n needsFix = true;\n }\n\n if (needsFix) {\n el.dataset.a11yOrigStyle = JSON.stringify(originals);\n }\n }\n }\n\n function restoreHiddenElements() {\n document.querySelectorAll<HTMLElement>('[data-a11y-orig-style]').forEach(el => {\n try {\n const orig: Record<string, string> = JSON.parse(el.dataset.a11yOrigStyle || '{}');\n for (const [prop, val] of Object.entries(orig)) {\n if (val === '') {\n el.style.removeProperty(prop);\n } else {\n (el.style as any)[prop] = val;\n }\n }\n } catch { /* malformed JSON */ }\n delete el.dataset.a11yOrigStyle;\n });\n }\n\n /**\n * Freeze inline-animated styles so scroll-handlers can't update them.\n * Takes a snapshot of current inline transforms and enforces them on scroll.\n */\n function freezeScrollAnimations() {\n document.querySelectorAll<HTMLElement>('[style]').forEach(el => {\n if (el.closest('#accessify-root') || el.closest('accessify-widget')) return;\n if (el.dataset.a11yFrozenStyle) return;\n const s = el.style;\n if (s.transform || s.opacity) {\n el.dataset.a11yFrozenStyle = JSON.stringify({\n transform: s.transform || '',\n opacity: s.opacity || '',\n });\n }\n });\n\n if (!scrollHandler) {\n scrollHandler = () => {\n if (!enabled) return;\n document.querySelectorAll<HTMLElement>('[data-a11y-frozen-style]').forEach(el => {\n try {\n const frozen = JSON.parse(el.dataset.a11yFrozenStyle || '{}');\n if (frozen.transform && el.style.transform !== frozen.transform) {\n el.style.transform = frozen.transform;\n }\n } catch { /* ignore */ }\n });\n };\n window.addEventListener('scroll', scrollHandler, { passive: true, capture: true });\n }\n }\n\n function unfreezeScrollAnimations() {\n if (scrollHandler) {\n window.removeEventListener('scroll', scrollHandler, true);\n scrollHandler = null;\n }\n document.querySelectorAll<HTMLElement>('[data-a11y-frozen-style]').forEach(el => {\n delete el.dataset.a11yFrozenStyle;\n });\n }\n\n // =========================================================================\n // Layer 4: Media\n // =========================================================================\n\n function pauseAllVideos() {\n document.querySelectorAll<HTMLVideoElement>('video').forEach(v => {\n if (!v.paused) {\n v.dataset.a11yPaused = 'true';\n v.pause();\n pausedVideos.push(v);\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 document.querySelectorAll<HTMLVideoElement>('video[data-a11y-paused]').forEach(v => {\n try { v.play(); } catch { /* gone */ }\n delete v.dataset.a11yPaused;\n });\n pausedVideos = [];\n }\n\n function freezeGif(img: HTMLImageElement) {\n const src = (img.currentSrc || img.src || '').toLowerCase();\n if (!src.match(/\\.gif(\\?|$)/i)) 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 { /* CORS */ }\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 function pauseSVG() {\n document.querySelectorAll('svg').forEach(s => {\n try { (s as any).pauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n\n function resumeSVG() {\n document.querySelectorAll('svg').forEach(s => {\n try { (s as any).unpauseAnimations?.(); } catch { /* ignore */ }\n });\n }\n\n function stopMarquees() {\n document.querySelectorAll('marquee').forEach(m => {\n try { (m as any).stop?.(); } catch { /* ignore */ }\n });\n }\n\n function startMarquees() {\n document.querySelectorAll('marquee').forEach(m => {\n try { (m as any).start?.(); } catch { /* ignore */ }\n });\n }\n\n // =========================================================================\n // MutationObserver — dynamic content\n // =========================================================================\n\n function setupObserver() {\n if (mutationObserver) return;\n mutationObserver = new MutationObserver(mutations => {\n if (!enabled) return;\n let hasNewContent = false;\n for (const m of mutations) {\n if (m.addedNodes.length > 0) { hasNewContent = true; break; }\n }\n if (hasNewContent) {\n finishAllAnimations();\n forceHiddenElementsVisible();\n pauseAllVideos();\n freezeAllGifs();\n pauseSVG();\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 // Periodic re-scan — frameworks create new animations constantly\n // =========================================================================\n\n function startPeriodicScan() {\n if (scanInterval) return;\n scanInterval = setInterval(() => {\n if (!enabled) return;\n finishAllAnimations();\n }, 500);\n }\n\n function stopPeriodicScan() {\n if (scanInterval) {\n clearInterval(scanInterval);\n scanInterval = null;\n }\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n function activate() {\n if (enabled) return;\n enabled = true;\n\n // Layer 0: Intercept Element.animate() — catches ALL new WAAPI animations instantly\n patchAnimate();\n\n // Layer 1: CSS\n injectStyles();\n\n // Layer 2: Kill all currently running WAAPI animations\n finishAllAnimations();\n\n // Layer 3: JS libs + inline style fixes\n patchGSAP();\n forceHiddenElementsVisible();\n freezeScrollAnimations();\n\n // Layer 4: Media\n pauseAllVideos();\n interceptVideoPlay();\n freezeAllGifs();\n pauseSVG();\n stopMarquees();\n\n // Observers\n setupObserver();\n startPeriodicScan();\n\n // Delayed re-scans for async rendering frameworks\n for (const delay of [50, 200, 500, 1000, 2000, 4000]) {\n setTimeout(() => {\n if (!enabled) return;\n finishAllAnimations();\n forceHiddenElementsVisible();\n freezeScrollAnimations();\n pauseAllVideos();\n freezeAllGifs();\n }, delay);\n }\n\n localStorage.setItem(STORAGE_KEY, 'true');\n }\n\n function deactivate() {\n enabled = false;\n\n stopPeriodicScan();\n teardownObserver();\n restoreAnimate();\n unfreezeScrollAnimations();\n restoreGSAP();\n restoreHiddenElements();\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 => ({ 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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"}
|
|
@@ -6292,7 +6292,7 @@ function createProxyService(siteKey, proxyUrl) {
|
|
|
6292
6292
|
return {
|
|
6293
6293
|
async simplifyText(text, level = "einfache", lang = "de") {
|
|
6294
6294
|
const blockId = `b-${simpleHash(text)}`;
|
|
6295
|
-
const variant =
|
|
6295
|
+
const variant = level;
|
|
6296
6296
|
try {
|
|
6297
6297
|
const cacheRes = await fetch(`${base}/v1/cache/query`, {
|
|
6298
6298
|
method: "POST",
|
|
@@ -6495,6 +6495,13 @@ function getGermanSimplificationPrompt(level) {
|
|
|
6495
6495
|
- Benutze positive Formulierungen
|
|
6496
6496
|
- Zielgruppe: CEFR A1-A2
|
|
6497
6497
|
|
|
6498
|
+
STRENGE REGELN — Verstoß = fehlerhaft:
|
|
6499
|
+
1. ALLE Personen-Namen MÜSSEN im vereinfachten Text vorkommen. Lösche NIEMALS einen Namen.
|
|
6500
|
+
2. Zitate: IMMER den vollen Namen des Sprechers behalten.
|
|
6501
|
+
3. Zahlen, Daten, Ergebnisse, Spielstände: Wort für Wort übernehmen.
|
|
6502
|
+
4. Eigennamen (Vereine, Orte, Firmen): exakt übernehmen.
|
|
6503
|
+
5. Erfinde NICHTS dazu.
|
|
6504
|
+
|
|
6498
6505
|
Gib NUR den vereinfachten Text zurück.`;
|
|
6499
6506
|
}
|
|
6500
6507
|
return `Du bist ein Experte für Einfache Sprache (DIN ISO 24495-1). Vereinfache den folgenden Text:
|
|
@@ -6503,7 +6510,15 @@ Gib NUR den vereinfachten Text zurück.`;
|
|
|
6503
6510
|
- Benutze aktive Formulierungen
|
|
6504
6511
|
- Strukturiere den Text mit klaren Absätzen
|
|
6505
6512
|
- Zielgruppe: CEFR B1-B2
|
|
6506
|
-
|
|
6513
|
+
|
|
6514
|
+
STRENGE REGELN — Verstoß = fehlerhaft:
|
|
6515
|
+
1. ALLE Personen-Namen MÜSSEN im vereinfachten Text vorkommen. Wenn im Original "Simon Dornieden" steht, MUSS "Simon Dornieden" auch in der Ausgabe stehen. Lösche NIEMALS einen Namen.
|
|
6516
|
+
2. Zitate: IMMER den vollen Namen des Sprechers behalten (z.B. „Simon Dornieden sagt: …")
|
|
6517
|
+
3. Zahlen, Daten, Ergebnisse, Spielstände: Wort für Wort übernehmen, NICHT umformulieren
|
|
6518
|
+
4. Eigennamen (Vereine, Orte, Firmen): exakt übernehmen
|
|
6519
|
+
5. Adressen, Postleitzahlen: exakt übernehmen
|
|
6520
|
+
6. Bildunterschriften, Quellenangaben, Fotocredits: NICHT verändern
|
|
6521
|
+
7. Erfinde NICHTS dazu. Nur vorhandenen Inhalt in einfacherer Sprache wiedergeben.
|
|
6507
6522
|
|
|
6508
6523
|
Gib NUR den vereinfachten Text zurück.`;
|
|
6509
6524
|
}
|
|
@@ -6514,6 +6529,13 @@ function getEnglishSimplificationPrompt() {
|
|
|
6514
6529
|
- Use active voice
|
|
6515
6530
|
- Target reading level: grade 6-8
|
|
6516
6531
|
|
|
6532
|
+
STRICT RULES — violating any = incorrect output:
|
|
6533
|
+
1. ALL person names MUST appear in the simplified text. NEVER delete a name.
|
|
6534
|
+
2. Quotes: ALWAYS keep the full speaker name.
|
|
6535
|
+
3. Numbers, dates, scores, results: copy verbatim.
|
|
6536
|
+
4. Proper nouns (teams, places, companies): copy exactly.
|
|
6537
|
+
5. Do NOT invent details.
|
|
6538
|
+
|
|
6517
6539
|
Return ONLY the simplified text.`;
|
|
6518
6540
|
}
|
|
6519
6541
|
var root_3$1 = /* @__PURE__ */ from_html(`<span class="accessify-chip-check" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"></path></svg></span>`);
|
|
@@ -6620,14 +6642,14 @@ function FeatureGrid($$anchor, $$props) {
|
|
|
6620
6642
|
const FEATURE_LOADERS = {
|
|
6621
6643
|
contrast: () => import("./contrast-CqsOs6Uo.js"),
|
|
6622
6644
|
"text-size": () => import("./text-size-m_mHNPWo.js"),
|
|
6623
|
-
"keyboard-nav": () => import("./keyboard-nav-
|
|
6645
|
+
"keyboard-nav": () => import("./keyboard-nav-DDSxMaow.js"),
|
|
6624
6646
|
"link-highlight": () => import("./link-highlight-DBGm067Y.js"),
|
|
6625
6647
|
"reading-guide": () => import("./reading-guide-VT8NciIL.js"),
|
|
6626
6648
|
"reading-mask": () => import("./reading-mask-BABChuCz.js"),
|
|
6627
|
-
"animation-stop": () => import("./animation-stop-
|
|
6649
|
+
"animation-stop": () => import("./animation-stop-DrDe9Q9n.js"),
|
|
6628
6650
|
"hide-images": () => import("./hide-images-B_LeCBcd.js"),
|
|
6629
6651
|
"big-cursor": () => import("./big-cursor-B2UKu9dQ.js"),
|
|
6630
|
-
"page-structure": () => import("./page-structure-
|
|
6652
|
+
"page-structure": () => import("./page-structure-C_KIRohv.js"),
|
|
6631
6653
|
tts: () => import("./tts-CjszLRnb.js"),
|
|
6632
6654
|
"text-simplify": () => import("./text-simplify-B0hIi6bW.js"),
|
|
6633
6655
|
"alt-text": () => Promise.resolve().then(() => altText)
|
|
@@ -8816,14 +8838,20 @@ const REMOVED_FEATURES = /* @__PURE__ */ new Set([
|
|
|
8816
8838
|
"saturation",
|
|
8817
8839
|
"text-align",
|
|
8818
8840
|
"line-height",
|
|
8819
|
-
"page-structure",
|
|
8820
8841
|
"focus-highlight",
|
|
8821
8842
|
"auto-scan"
|
|
8822
8843
|
]);
|
|
8844
|
+
function detectLang() {
|
|
8845
|
+
const htmlLang = document.documentElement.lang?.trim();
|
|
8846
|
+
if (htmlLang) return htmlLang.split("-")[0].toLowerCase();
|
|
8847
|
+
const nav = (navigator.language || navigator.userLanguage || "").trim();
|
|
8848
|
+
if (nav) return nav.split("-")[0].toLowerCase();
|
|
8849
|
+
return "en";
|
|
8850
|
+
}
|
|
8823
8851
|
const DEFAULT_CONFIG = {
|
|
8824
8852
|
position: "bottom-right",
|
|
8825
8853
|
theme: "auto",
|
|
8826
|
-
lang:
|
|
8854
|
+
lang: detectLang(),
|
|
8827
8855
|
features: [
|
|
8828
8856
|
"contrast",
|
|
8829
8857
|
"text-size",
|
|
@@ -8836,7 +8864,8 @@ const DEFAULT_CONFIG = {
|
|
|
8836
8864
|
"animation-stop",
|
|
8837
8865
|
"tts",
|
|
8838
8866
|
"text-simplify",
|
|
8839
|
-
"alt-text"
|
|
8867
|
+
"alt-text",
|
|
8868
|
+
"page-structure"
|
|
8840
8869
|
],
|
|
8841
8870
|
zIndex: 2147483647,
|
|
8842
8871
|
compact: false
|
|
@@ -9030,4 +9059,4 @@ export {
|
|
|
9030
9059
|
init as i,
|
|
9031
9060
|
t
|
|
9032
9061
|
};
|
|
9033
|
-
//# sourceMappingURL=index-
|
|
9062
|
+
//# sourceMappingURL=index-nzfT-SzJ.js.map
|