accessify-widget 0.3.84 → 0.3.86
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-DrDe9Q9n.js → animation-stop-C2Ced0LV.js} +4 -6
- package/dist/animation-stop-C2Ced0LV.js.map +1 -0
- package/dist/{index-CJB-hRuq.js → index-Cyw7C65x.js} +33 -69
- package/dist/{index-CJB-hRuq.js.map → index-Cyw7C65x.js.map} +1 -1
- package/dist/{keyboard-nav-Bxe4jywQ.js → keyboard-nav-B31LW-g-.js} +2 -2
- package/dist/{keyboard-nav-Bxe4jywQ.js.map → keyboard-nav-B31LW-g-.js.map} +1 -1
- package/dist/{link-highlight-D9gxFmiG.js → link-highlight-DBGm067Y.js} +3 -3
- package/dist/link-highlight-DBGm067Y.js.map +1 -0
- package/dist/{page-structure-BOFg6Zbt.js → page-structure-BvXY-FTc.js} +6 -9
- package/dist/page-structure-BvXY-FTc.js.map +1 -0
- package/dist/{reading-guide-C_jxzorm.js → reading-guide-VT8NciIL.js} +1 -7
- package/dist/reading-guide-VT8NciIL.js.map +1 -0
- package/dist/{reading-mask-B_NxbhTN.js → reading-mask-BABChuCz.js} +7 -21
- package/dist/reading-mask-BABChuCz.js.map +1 -0
- package/dist/widget.js +1 -1
- package/dist/widget.js.map +1 -1
- package/package.json +1 -1
- package/dist/animation-stop-DrDe9Q9n.js.map +0 -1
- package/dist/link-highlight-D9gxFmiG.js.map +0 -1
- package/dist/page-structure-BOFg6Zbt.js.map +0 -1
- package/dist/reading-guide-C_jxzorm.js.map +0 -1
- package/dist/reading-mask-B_NxbhTN.js.map +0 -1
package/dist/accessify.mjs
CHANGED
|
@@ -123,11 +123,9 @@ function createAnimationStopModule() {
|
|
|
123
123
|
*:not(#accessify-root):not(#accessify-root *):focus-visible,
|
|
124
124
|
*:not(#accessify-root):not(#accessify-root *):active {
|
|
125
125
|
transform: none !important;
|
|
126
|
-
scale:
|
|
127
|
-
rotate:
|
|
128
|
-
translate:
|
|
129
|
-
filter: none !important;
|
|
130
|
-
-webkit-filter: none !important;
|
|
126
|
+
scale: none !important;
|
|
127
|
+
rotate: none !important;
|
|
128
|
+
translate: none !important;
|
|
131
129
|
}
|
|
132
130
|
`;
|
|
133
131
|
document.head.appendChild(style);
|
|
@@ -487,4 +485,4 @@ function createAnimationStopModule() {
|
|
|
487
485
|
export {
|
|
488
486
|
createAnimationStopModule as default
|
|
489
487
|
};
|
|
490
|
-
//# sourceMappingURL=animation-stop-
|
|
488
|
+
//# sourceMappingURL=animation-stop-C2Ced0LV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation-stop-C2Ced0LV.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: none !important;\n rotate: none !important;\n translate: 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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"}
|
|
@@ -4749,7 +4749,7 @@ const deJson = {
|
|
|
4749
4749
|
"profile.cognitive": "Kognitive Unterstützung",
|
|
4750
4750
|
"profile.cognitive.desc": "Lesehilfen, Abstände und einfachere Schrift",
|
|
4751
4751
|
"profile.seizureSafe": "Anfallssicher",
|
|
4752
|
-
"profile.seizureSafe.desc": "Animationen
|
|
4752
|
+
"profile.seizureSafe.desc": "Animationen stoppen und Reize reduzieren",
|
|
4753
4753
|
"profile.adhdFriendly": "ADHS-freundlich",
|
|
4754
4754
|
"profile.adhdFriendly.desc": "Ablenkungen reduzieren und Fokus verbessern",
|
|
4755
4755
|
"feature.contrast": "Kontrast",
|
|
@@ -4764,7 +4764,7 @@ const deJson = {
|
|
|
4764
4764
|
"feature.readingGuide.desc": "Horizontales Lineal zum zeilenweisen Lesen",
|
|
4765
4765
|
"feature.focusHighlight": "Fokus-Hervorhebung",
|
|
4766
4766
|
"feature.focusHighlight.desc": "Sichtbare Umrandung fokussierter Elemente",
|
|
4767
|
-
"feature.animationStop": "Animationen
|
|
4767
|
+
"feature.animationStop": "Animationen stoppen",
|
|
4768
4768
|
"feature.animationStop.desc": "Alle Animationen und Videos pausieren",
|
|
4769
4769
|
"feature.bigCursor": "Großer Mauszeiger",
|
|
4770
4770
|
"feature.bigCursor.desc": "Vergrößerter Mauszeiger für bessere Sichtbarkeit",
|
|
@@ -4840,7 +4840,7 @@ const enJson = {
|
|
|
4840
4840
|
"profile.cognitive": "Cognitive Support",
|
|
4841
4841
|
"profile.cognitive.desc": "Reading aids, spacing, and simpler fonts",
|
|
4842
4842
|
"profile.seizureSafe": "Seizure Safe",
|
|
4843
|
-
"profile.seizureSafe.desc": "
|
|
4843
|
+
"profile.seizureSafe.desc": "Stop animations and reduce stimuli",
|
|
4844
4844
|
"profile.adhdFriendly": "ADHD Friendly",
|
|
4845
4845
|
"profile.adhdFriendly.desc": "Reduce distractions and improve focus",
|
|
4846
4846
|
"feature.contrast": "Contrast",
|
|
@@ -4855,7 +4855,7 @@ const enJson = {
|
|
|
4855
4855
|
"feature.readingGuide.desc": "Horizontal ruler for line-by-line reading",
|
|
4856
4856
|
"feature.focusHighlight": "Focus Highlight",
|
|
4857
4857
|
"feature.focusHighlight.desc": "Visible outline on focused elements",
|
|
4858
|
-
"feature.animationStop": "
|
|
4858
|
+
"feature.animationStop": "Stop Animations",
|
|
4859
4859
|
"feature.animationStop.desc": "Pause all animations and videos",
|
|
4860
4860
|
"feature.bigCursor": "Big Cursor",
|
|
4861
4861
|
"feature.bigCursor.desc": "Enlarged cursor for better visibility",
|
|
@@ -6642,14 +6642,14 @@ function FeatureGrid($$anchor, $$props) {
|
|
|
6642
6642
|
const FEATURE_LOADERS = {
|
|
6643
6643
|
contrast: () => import("./contrast-CqsOs6Uo.js"),
|
|
6644
6644
|
"text-size": () => import("./text-size-m_mHNPWo.js"),
|
|
6645
|
-
"keyboard-nav": () => import("./keyboard-nav-
|
|
6646
|
-
"link-highlight": () => import("./link-highlight-
|
|
6647
|
-
"reading-guide": () => import("./reading-guide-
|
|
6648
|
-
"reading-mask": () => import("./reading-mask-
|
|
6649
|
-
"animation-stop": () => import("./animation-stop-
|
|
6645
|
+
"keyboard-nav": () => import("./keyboard-nav-B31LW-g-.js"),
|
|
6646
|
+
"link-highlight": () => import("./link-highlight-DBGm067Y.js"),
|
|
6647
|
+
"reading-guide": () => import("./reading-guide-VT8NciIL.js"),
|
|
6648
|
+
"reading-mask": () => import("./reading-mask-BABChuCz.js"),
|
|
6649
|
+
"animation-stop": () => import("./animation-stop-C2Ced0LV.js"),
|
|
6650
6650
|
"hide-images": () => import("./hide-images-B_LeCBcd.js"),
|
|
6651
6651
|
"big-cursor": () => import("./big-cursor-B2UKu9dQ.js"),
|
|
6652
|
-
"page-structure": () => import("./page-structure-
|
|
6652
|
+
"page-structure": () => import("./page-structure-BvXY-FTc.js"),
|
|
6653
6653
|
tts: () => import("./tts-CjszLRnb.js"),
|
|
6654
6654
|
"text-simplify": () => import("./text-simplify-BIFpqadq.js"),
|
|
6655
6655
|
"alt-text": () => Promise.resolve().then(() => altText)
|
|
@@ -7798,7 +7798,7 @@ function createWidgetStyles(config2) {
|
|
|
7798
7798
|
transition: transform var(--fast), box-shadow var(--fast), opacity var(--fast);
|
|
7799
7799
|
touch-action: none;
|
|
7800
7800
|
}
|
|
7801
|
-
.accessify-trigger:hover
|
|
7801
|
+
.accessify-trigger:hover { transform: translateY(-2px); box-shadow: 0 8px 28px rgba(50,60,100,0.6); }
|
|
7802
7802
|
.accessify-trigger:active { transform: scale(0.96); }
|
|
7803
7803
|
.accessify-trigger--hidden { opacity:0; pointer-events:none; transform:scale(0.9); }
|
|
7804
7804
|
.accessify-trigger svg { width: 26px; height: 26px; }
|
|
@@ -7851,7 +7851,7 @@ function createWidgetStyles(config2) {
|
|
|
7851
7851
|
background: var(--surface); color: var(--text-dim);
|
|
7852
7852
|
cursor: pointer; transition: background var(--fast), color var(--fast);
|
|
7853
7853
|
}
|
|
7854
|
-
.accessify-header-btn:hover
|
|
7854
|
+
.accessify-header-btn:hover { background: var(--surface-hover); color: var(--text); }
|
|
7855
7855
|
.accessify-header-btn svg { width: 16px; height: 16px; }
|
|
7856
7856
|
.accessify-header-btn--icon { padding: 0; }
|
|
7857
7857
|
.accessify-header-btn--close { background: transparent; border-color: transparent; }
|
|
@@ -7880,8 +7880,8 @@ function createWidgetStyles(config2) {
|
|
|
7880
7880
|
font-size: 15px; font-weight: 700;
|
|
7881
7881
|
transition: background var(--fast);
|
|
7882
7882
|
}
|
|
7883
|
-
.accessify-lang-toggle:hover,
|
|
7884
|
-
.accessify-accordion-toggle:hover
|
|
7883
|
+
.accessify-lang-toggle:hover,
|
|
7884
|
+
.accessify-accordion-toggle:hover { background: var(--surface-hover); }
|
|
7885
7885
|
|
|
7886
7886
|
.accessify-lang-toggle-left,
|
|
7887
7887
|
.accessify-accordion-toggle-left {
|
|
@@ -7921,7 +7921,7 @@ function createWidgetStyles(config2) {
|
|
|
7921
7921
|
transition: background var(--fast);
|
|
7922
7922
|
min-height: 44px;
|
|
7923
7923
|
}
|
|
7924
|
-
.accessify-lang-option:hover
|
|
7924
|
+
.accessify-lang-option:hover { background: var(--surface-hover); }
|
|
7925
7925
|
.accessify-lang-option[data-active="true"] { color: var(--accent); font-weight: 700; }
|
|
7926
7926
|
.accessify-lang-option svg { width: 18px; height: 18px; color: var(--accent); flex-shrink: 0; }
|
|
7927
7927
|
|
|
@@ -7934,7 +7934,7 @@ function createWidgetStyles(config2) {
|
|
|
7934
7934
|
font-family: inherit; text-align: left;
|
|
7935
7935
|
transition: background var(--fast);
|
|
7936
7936
|
}
|
|
7937
|
-
.accessify-accordion-option:hover
|
|
7937
|
+
.accessify-accordion-option:hover { background: var(--surface-hover); }
|
|
7938
7938
|
.accessify-accordion-option[data-active="true"] { background: var(--accent-soft); }
|
|
7939
7939
|
|
|
7940
7940
|
.accessify-accordion-option-left {
|
|
@@ -7999,7 +7999,7 @@ function createWidgetStyles(config2) {
|
|
|
7999
7999
|
text-align: center; line-height: 1.25;
|
|
8000
8000
|
transition: background var(--fast), color var(--fast), border-color var(--fast);
|
|
8001
8001
|
}
|
|
8002
|
-
.accessify-chip:hover
|
|
8002
|
+
.accessify-chip:hover { border-color: var(--border-hl); background: var(--surface-hover); }
|
|
8003
8003
|
.accessify-chip[data-active="true"] {
|
|
8004
8004
|
background: var(--accent); color: var(--accent-on);
|
|
8005
8005
|
border-color: var(--accent);
|
|
@@ -8031,7 +8031,7 @@ function createWidgetStyles(config2) {
|
|
|
8031
8031
|
color: var(--text); cursor: pointer; font-size: 18px; font-weight: 700;
|
|
8032
8032
|
transition: background var(--fast); font-family: inherit;
|
|
8033
8033
|
}
|
|
8034
|
-
.accessify-stepper-btn:hover:not(:disabled)
|
|
8034
|
+
.accessify-stepper-btn:hover:not(:disabled) { background: var(--surface-hover); }
|
|
8035
8035
|
.accessify-stepper-btn:disabled { opacity: 0.3; cursor: default; }
|
|
8036
8036
|
.accessify-stepper-value {
|
|
8037
8037
|
min-width: 48px; text-align: center;
|
|
@@ -8057,7 +8057,7 @@ function createWidgetStyles(config2) {
|
|
|
8057
8057
|
cursor: pointer; text-align: center; font-family: inherit;
|
|
8058
8058
|
transition: transform var(--fast), border-color var(--fast), background var(--fast), box-shadow var(--fast);
|
|
8059
8059
|
}
|
|
8060
|
-
.accessify-card:hover
|
|
8060
|
+
.accessify-card:hover { transform: translateY(-2px); border-color: var(--border-hl); box-shadow: 0 4px 16px rgba(0,0,0,0.15); }
|
|
8061
8061
|
.accessify-card[data-active="true"] { border-color: var(--accent); background: var(--accent-soft); }
|
|
8062
8062
|
.accessify-card-icon {
|
|
8063
8063
|
display: inline-flex; align-items: center; justify-content: center;
|
|
@@ -8073,10 +8073,10 @@ function createWidgetStyles(config2) {
|
|
|
8073
8073
|
display: inline-flex; align-items: center; justify-content: center;
|
|
8074
8074
|
width: 22px; height: 22px; border-radius: 999px;
|
|
8075
8075
|
color: var(--text-dim); cursor: help; background: none; border: none;
|
|
8076
|
-
opacity: 0.
|
|
8076
|
+
opacity: 0.35; transition: opacity var(--fast), color var(--fast);
|
|
8077
8077
|
}
|
|
8078
8078
|
.accessify-card-info svg { width: 14px; height: 14px; }
|
|
8079
|
-
.accessify-card-info:hover
|
|
8079
|
+
.accessify-card-info:hover { opacity: 1; color: var(--accent); }
|
|
8080
8080
|
|
|
8081
8081
|
/* ─── Section Divider ─── */
|
|
8082
8082
|
.accessify-section-divider {
|
|
@@ -8099,7 +8099,7 @@ function createWidgetStyles(config2) {
|
|
|
8099
8099
|
display: flex; align-items: center; gap: 8px;
|
|
8100
8100
|
}
|
|
8101
8101
|
.accessify-footer a { color: var(--accent); text-decoration: none; font-weight: 600; }
|
|
8102
|
-
.accessify-footer a:hover
|
|
8102
|
+
.accessify-footer a:hover { text-decoration: underline; }
|
|
8103
8103
|
|
|
8104
8104
|
.accessify-footer-close {
|
|
8105
8105
|
display: inline-flex; align-items: center; gap: 5px;
|
|
@@ -8110,7 +8110,7 @@ function createWidgetStyles(config2) {
|
|
|
8110
8110
|
transition: background var(--fast), color var(--fast), border-color var(--fast);
|
|
8111
8111
|
flex-shrink: 0;
|
|
8112
8112
|
}
|
|
8113
|
-
.accessify-footer-close:hover
|
|
8113
|
+
.accessify-footer-close:hover { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }
|
|
8114
8114
|
.accessify-footer-close svg { width: 14px; height: 14px; flex-shrink: 0; }
|
|
8115
8115
|
|
|
8116
8116
|
/* ─── Reduced Motion ─── */
|
|
@@ -8128,11 +8128,6 @@ function createWidgetStyles(config2) {
|
|
|
8128
8128
|
${isRight ? "right: 16px" : "left: 16px"};
|
|
8129
8129
|
width: 50px; height: 50px; border-radius: 14px;
|
|
8130
8130
|
}
|
|
8131
|
-
/* WCAG 2.5.8: touch targets ≥ 44px */
|
|
8132
|
-
.accessify-header-btn { width: 44px; height: 44px; }
|
|
8133
|
-
.accessify-stepper-btn { width: 44px; min-height: 44px; }
|
|
8134
|
-
.accessify-stepper { height: 44px; }
|
|
8135
|
-
.accessify-footer-close { min-height: 44px; padding: 8px 16px; }
|
|
8136
8131
|
}
|
|
8137
8132
|
`;
|
|
8138
8133
|
}
|
|
@@ -8429,10 +8424,8 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
|
|
|
8429
8424
|
const BADGE_ATTR = "data-accessify-badge";
|
|
8430
8425
|
const WRAPPER_ATTR = "data-accessify-badge-wrap";
|
|
8431
8426
|
const OVERLAY_ID = "accessify-badge-overlay";
|
|
8432
|
-
const BADGE_STYLE_ID = "accessify-badge-styles";
|
|
8433
8427
|
let badgePositionRAF = null;
|
|
8434
8428
|
let trackedBadges = [];
|
|
8435
|
-
let outsideClickHandler = null;
|
|
8436
8429
|
function getOrCreateOverlay() {
|
|
8437
8430
|
let overlay = document.getElementById(OVERLAY_ID);
|
|
8438
8431
|
if (!overlay) {
|
|
@@ -8450,18 +8443,6 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
|
|
|
8450
8443
|
});
|
|
8451
8444
|
document.body.appendChild(overlay);
|
|
8452
8445
|
}
|
|
8453
|
-
if (!document.getElementById(BADGE_STYLE_ID)) {
|
|
8454
|
-
const style = document.createElement("style");
|
|
8455
|
-
style.id = BADGE_STYLE_ID;
|
|
8456
|
-
style.textContent = `
|
|
8457
|
-
[${BADGE_ATTR}="badge"]:hover + [${BADGE_ATTR}="tooltip"] { display: block !important; }
|
|
8458
|
-
[${BADGE_ATTR}="badge"]:hover { background: rgba(0,0,0,0.85) !important; }
|
|
8459
|
-
@media (pointer: coarse) {
|
|
8460
|
-
[${BADGE_ATTR}="badge"] { width: 36px !important; height: 36px !important; line-height: 36px !important; font-size: 16px !important; }
|
|
8461
|
-
}
|
|
8462
|
-
`;
|
|
8463
|
-
document.head.appendChild(style);
|
|
8464
|
-
}
|
|
8465
8446
|
return overlay;
|
|
8466
8447
|
}
|
|
8467
8448
|
function positionBadge(target, badge, tooltip) {
|
|
@@ -8494,27 +8475,12 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
|
|
|
8494
8475
|
badgePositionRAF = requestAnimationFrame(tick);
|
|
8495
8476
|
};
|
|
8496
8477
|
badgePositionRAF = requestAnimationFrame(tick);
|
|
8497
|
-
if (!outsideClickHandler) {
|
|
8498
|
-
outsideClickHandler = (e) => {
|
|
8499
|
-
const target = e.target;
|
|
8500
|
-
if (target.getAttribute(BADGE_ATTR) === "badge") return;
|
|
8501
|
-
for (const entry of trackedBadges) {
|
|
8502
|
-
entry.tooltip.style.display = "none";
|
|
8503
|
-
entry.badge.style.background = "rgba(0,0,0,0.6)";
|
|
8504
|
-
}
|
|
8505
|
-
};
|
|
8506
|
-
document.addEventListener("click", outsideClickHandler, { passive: true });
|
|
8507
|
-
}
|
|
8508
8478
|
}
|
|
8509
8479
|
function stopBadgeTracking() {
|
|
8510
8480
|
if (badgePositionRAF !== null) {
|
|
8511
8481
|
cancelAnimationFrame(badgePositionRAF);
|
|
8512
8482
|
badgePositionRAF = null;
|
|
8513
8483
|
}
|
|
8514
|
-
if (outsideClickHandler) {
|
|
8515
|
-
document.removeEventListener("click", outsideClickHandler);
|
|
8516
|
-
outsideClickHandler = null;
|
|
8517
|
-
}
|
|
8518
8484
|
}
|
|
8519
8485
|
function addInfoBadge(target, altText2) {
|
|
8520
8486
|
if (target.getAttribute(BADGE_ATTR)) return;
|
|
@@ -8565,16 +8531,13 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
|
|
|
8565
8531
|
tooltip.setAttribute("translate", "no");
|
|
8566
8532
|
tooltip.classList.add("notranslate");
|
|
8567
8533
|
tooltip.setAttribute(BADGE_ATTR, "tooltip");
|
|
8568
|
-
badge.addEventListener("
|
|
8569
|
-
|
|
8570
|
-
|
|
8571
|
-
|
|
8572
|
-
|
|
8573
|
-
|
|
8574
|
-
|
|
8575
|
-
badge.style.background = "rgba(0,0,0,0.85)";
|
|
8576
|
-
tooltip.style.display = "block";
|
|
8577
|
-
}
|
|
8534
|
+
badge.addEventListener("mouseenter", () => {
|
|
8535
|
+
badge.style.background = "rgba(0,0,0,0.85)";
|
|
8536
|
+
tooltip.style.display = "block";
|
|
8537
|
+
});
|
|
8538
|
+
badge.addEventListener("mouseleave", () => {
|
|
8539
|
+
badge.style.background = "rgba(0,0,0,0.6)";
|
|
8540
|
+
tooltip.style.display = "none";
|
|
8578
8541
|
});
|
|
8579
8542
|
overlay.appendChild(badge);
|
|
8580
8543
|
overlay.appendChild(tooltip);
|
|
@@ -8585,7 +8548,6 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
|
|
|
8585
8548
|
stopBadgeTracking();
|
|
8586
8549
|
trackedBadges = [];
|
|
8587
8550
|
document.getElementById(OVERLAY_ID)?.remove();
|
|
8588
|
-
document.getElementById(BADGE_STYLE_ID)?.remove();
|
|
8589
8551
|
document.querySelectorAll(`[${BADGE_ATTR}]`).forEach((el) => el.removeAttribute(BADGE_ATTR));
|
|
8590
8552
|
document.querySelectorAll(`[${WRAPPER_ATTR}]`).forEach((wrapper) => {
|
|
8591
8553
|
const img = wrapper.querySelector("img");
|
|
@@ -8951,6 +8913,8 @@ async function fetchSiteConfig(siteKey, proxyUrl) {
|
|
|
8951
8913
|
}
|
|
8952
8914
|
async function init(userConfig = {}) {
|
|
8953
8915
|
if (widgetInstance) return;
|
|
8916
|
+
const isMobile = navigator.maxTouchPoints > 0 && matchMedia("(pointer:coarse)").matches && !matchMedia("(pointer:fine)").matches;
|
|
8917
|
+
if (isMobile) return;
|
|
8954
8918
|
const dataConfig = window.__accessify_dataConfig || {};
|
|
8955
8919
|
config = { ...DEFAULT_CONFIG, ...dataConfig, ...userConfig };
|
|
8956
8920
|
const siteKey = config.siteKey || config.siteKey;
|
|
@@ -9099,4 +9063,4 @@ export {
|
|
|
9099
9063
|
init as i,
|
|
9100
9064
|
t
|
|
9101
9065
|
};
|
|
9102
|
-
//# sourceMappingURL=index-
|
|
9066
|
+
//# sourceMappingURL=index-Cyw7C65x.js.map
|