@oksigenia/access-panel 0.3.4 → 0.3.6
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/index.d.ts +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/web-component.js +4 -1
- package/dist/web-component.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -85,7 +85,7 @@ interface BehaviorOptions {
|
|
|
85
85
|
*/
|
|
86
86
|
declare function bindPanelBehavior(root: ShadowRoot, opts?: BehaviorOptions): () => void;
|
|
87
87
|
|
|
88
|
-
declare const PANEL_CSS = "\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 88px; padding: 14px 8px; }\n .oks-icon svg { width: 30px; height: 30px; }\n .oks-label { font-size: 12px; line-height: 1.3; }\n .oks-access-grid { gap: 10px; }\n .oks-access-content { padding: 0 16px 24px; }\n .oks-access-title { font-size: 12px; margin: 14px 0 6px; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n";
|
|
88
|
+
declare const PANEL_CSS = "\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 88px; padding: 14px 8px; }\n .oks-icon svg { width: 30px; height: 30px; }\n .oks-label { font-size: 12px; line-height: 1.3; }\n .oks-access-grid { gap: 10px; }\n .oks-access-content { padding: 0 16px 24px; }\n .oks-access-title { font-size: 12px; margin: 14px 0 6px; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n";
|
|
89
89
|
declare const EFFECT_CSS = "\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body \u2014 anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n";
|
|
90
90
|
|
|
91
91
|
export { type BehaviorOptions, COLORBLIND_FILTERS_SVG, DEFAULT_STATE, EFFECT_CSS, type LocaleCode, PANEL_CSS, type PanelState, type Position, type Translation, type TriggerIcon, bindPanelBehavior, buildPanelHtml, getTranslation, isStateEmpty, loadState, positionCss, saveState, supportedLocales };
|
package/dist/index.js
CHANGED
|
@@ -506,7 +506,7 @@ var PANEL_CSS = `
|
|
|
506
506
|
text-transform: uppercase;
|
|
507
507
|
color: #888;
|
|
508
508
|
}
|
|
509
|
-
.oks-access-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
|
|
509
|
+
.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }
|
|
510
510
|
.oks-access-opt {
|
|
511
511
|
background: #f9f9f9;
|
|
512
512
|
border: 2px solid #eee;
|
|
@@ -517,6 +517,7 @@ var PANEL_CSS = `
|
|
|
517
517
|
align-items: center;
|
|
518
518
|
justify-content: center;
|
|
519
519
|
cursor: pointer;
|
|
520
|
+
min-width: 0;
|
|
520
521
|
min-height: 70px;
|
|
521
522
|
color: #333;
|
|
522
523
|
transition: 0.2s;
|
|
@@ -537,6 +538,8 @@ var PANEL_CSS = `
|
|
|
537
538
|
text-transform: uppercase;
|
|
538
539
|
text-align: center;
|
|
539
540
|
line-height: 1.2;
|
|
541
|
+
overflow-wrap: anywhere;
|
|
542
|
+
word-break: break-word;
|
|
540
543
|
}
|
|
541
544
|
.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }
|
|
542
545
|
.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/translations.ts","../src/icons.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts"],"names":["root"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2LlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","file":"index.js","sourcesContent":["// Heredado del plugin WP oksigenia-access v16.9.\n// 8 locales: español PY (con Guaraní separado como lengua oficial PY),\n// inglés, francés, italiano, alemán, neerlandés, sueco.\n\nexport type LocaleCode = 'es' | 'gn' | 'en' | 'fr' | 'it' | 'de' | 'nl' | 'sv';\n\nexport interface Translation {\n title: string;\n close: string;\n txt: string;\n size: string;\n lh: string;\n align: string;\n font: string;\n dyslexia: string;\n vis: string;\n contrast: string;\n gray: string;\n hide: string;\n links: string;\n ori: string;\n guide: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco' },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus' },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha' },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus' },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus' },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus' },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus' },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus' },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n\n// 4 iconos del botón flotante.\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>',\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","import type { Translation } from './translations.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position = 'top-left' | 'top-right' | 'mid-left' | 'mid-right' | 'bottom-left' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n}\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n const grid = (rows: string[]): string =>\n `<div class=\"oks-access-grid\">${rows.join('')}</div>`;\n\n const multi = (action: string, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (klass: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const overlay = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"overlay\" data-target=\"${id}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const guide = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"guide\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n\n return `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" aria-hidden=\"true\">\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n <h4 class=\"oks-access-title\">${escapeHtml(t.txt)}</h4>\n ${grid([\n multi('multi', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('multi', 'oks-lh', 3, t.lh, ICON_LH),\n multi('multi', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('oks-a11y-font', t.font, ICON_FONT),\n toggle('oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('multi', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.vis)}</h4>\n ${grid([\n toggle('oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.ori)}</h4>\n ${grid([\n guide(t.guide, ICON_GUIDE),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&', '<': '<', '>': '>', '\"': '"',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, ''');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n let css = `.oks-access-wrapper { ${d.wrap} } .oks-access-panel { ${d.panel} }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n // El panel pasa a fullscreen en móvil (regla existente en PANEL_CSS),\n // así que aquí solo redirigimos el wrapper del trigger.\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un dispose para\n * limpiar.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): () => void {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt'));\n\n if (!trigger || !panel || !closeBtn || !resetBtn || !wrapper) {\n return () => {};\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n // Aplica `state` al DOM (clases en body/html + estado de los botones).\n function applyState(): void {\n const body = document.body;\n const root = document.documentElement;\n // Limpiar todo lo nuestro antes de re-aplicar.\n body.className = body.className.replace(/\\boks-\\w+(?:-\\d+)?\\b/g, '').trim();\n [1, 2, 3].forEach((l) => root.classList.remove(`oks-colorblind-${l}`));\n\n if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) body.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) body.classList.add(`oks-ls-${state.ls}`);\n if (state.colorblind > 0) root.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.font) body.classList.add('oks-a11y-font');\n if (state.dyslexia) body.classList.add('oks-dyslexia');\n if (state.contrast) body.classList.add('oks-a11y-contrast');\n if (state.hideImages) body.classList.add('oks-a11y-hide');\n if (state.highlightLinks) body.classList.add('oks-a11y-links');\n if (state.bigCursor) body.classList.add('oks-big-cursor');\n if (state.pauseAnim) body.classList.add('oks-a11y-pause');\n if (state.focusOutline) body.classList.add('oks-a11y-focus');\n if (state.readingGuide) body.classList.add('oks-a11y-guide');\n\n const overlay = ensureOverlay();\n overlay.classList.toggle('is-active', state.grayOverlay);\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n }\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n // Contrast y grayOverlay son mutuamente excluyentes.\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n const openPanel = (): void => {\n panel.classList.add('is-open');\n panel.setAttribute('aria-hidden', 'false');\n trigger.setAttribute('aria-expanded', 'true');\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n panel.classList.remove('is-open');\n panel.setAttribute('aria-hidden', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n };\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n const t = e.target as Node;\n if (!panel.contains(t) && !trigger.contains(t) && !wrapper.contains(t)) closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Reading guide ──────────────────────────────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide) return;\n const guide = document.getElementById('oks-reading-guide');\n if (!guide) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y === 'number') guide.style.top = `${y}px`;\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n return () => {\n trigger.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n };\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 88px; padding: 14px 8px; }\n .oks-icon svg { width: 30px; height: 30px; }\n .oks-label { font-size: 12px; line-height: 1.3; }\n .oks-access-grid { gap: 10px; }\n .oks-access-content { padding: 0 16px 24px; }\n .oks-access-title { font-size: 12px; margin: 14px 0 6px; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n`;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/translations.ts","../src/icons.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts"],"names":["root"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8LlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","file":"index.js","sourcesContent":["// Heredado del plugin WP oksigenia-access v16.9.\n// 8 locales: español PY (con Guaraní separado como lengua oficial PY),\n// inglés, francés, italiano, alemán, neerlandés, sueco.\n\nexport type LocaleCode = 'es' | 'gn' | 'en' | 'fr' | 'it' | 'de' | 'nl' | 'sv';\n\nexport interface Translation {\n title: string;\n close: string;\n txt: string;\n size: string;\n lh: string;\n align: string;\n font: string;\n dyslexia: string;\n vis: string;\n contrast: string;\n gray: string;\n hide: string;\n links: string;\n ori: string;\n guide: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco' },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus' },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha' },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus' },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus' },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus' },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus' },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus' },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n\n// 4 iconos del botón flotante.\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>',\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","import type { Translation } from './translations.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position = 'top-left' | 'top-right' | 'mid-left' | 'mid-right' | 'bottom-left' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n}\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n const grid = (rows: string[]): string =>\n `<div class=\"oks-access-grid\">${rows.join('')}</div>`;\n\n const multi = (action: string, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (klass: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const overlay = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"overlay\" data-target=\"${id}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const guide = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"guide\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n\n return `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" aria-hidden=\"true\">\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n <h4 class=\"oks-access-title\">${escapeHtml(t.txt)}</h4>\n ${grid([\n multi('multi', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('multi', 'oks-lh', 3, t.lh, ICON_LH),\n multi('multi', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('oks-a11y-font', t.font, ICON_FONT),\n toggle('oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('multi', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.vis)}</h4>\n ${grid([\n toggle('oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.ori)}</h4>\n ${grid([\n guide(t.guide, ICON_GUIDE),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&', '<': '<', '>': '>', '\"': '"',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, ''');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n let css = `.oks-access-wrapper { ${d.wrap} } .oks-access-panel { ${d.panel} }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n // El panel pasa a fullscreen en móvil (regla existente en PANEL_CSS),\n // así que aquí solo redirigimos el wrapper del trigger.\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un dispose para\n * limpiar.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): () => void {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt'));\n\n if (!trigger || !panel || !closeBtn || !resetBtn || !wrapper) {\n return () => {};\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n // Aplica `state` al DOM (clases en body/html + estado de los botones).\n function applyState(): void {\n const body = document.body;\n const root = document.documentElement;\n // Limpiar todo lo nuestro antes de re-aplicar.\n body.className = body.className.replace(/\\boks-\\w+(?:-\\d+)?\\b/g, '').trim();\n [1, 2, 3].forEach((l) => root.classList.remove(`oks-colorblind-${l}`));\n\n if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) body.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) body.classList.add(`oks-ls-${state.ls}`);\n if (state.colorblind > 0) root.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.font) body.classList.add('oks-a11y-font');\n if (state.dyslexia) body.classList.add('oks-dyslexia');\n if (state.contrast) body.classList.add('oks-a11y-contrast');\n if (state.hideImages) body.classList.add('oks-a11y-hide');\n if (state.highlightLinks) body.classList.add('oks-a11y-links');\n if (state.bigCursor) body.classList.add('oks-big-cursor');\n if (state.pauseAnim) body.classList.add('oks-a11y-pause');\n if (state.focusOutline) body.classList.add('oks-a11y-focus');\n if (state.readingGuide) body.classList.add('oks-a11y-guide');\n\n const overlay = ensureOverlay();\n overlay.classList.toggle('is-active', state.grayOverlay);\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n }\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n // Contrast y grayOverlay son mutuamente excluyentes.\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n const openPanel = (): void => {\n panel.classList.add('is-open');\n panel.setAttribute('aria-hidden', 'false');\n trigger.setAttribute('aria-expanded', 'true');\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n panel.classList.remove('is-open');\n panel.setAttribute('aria-hidden', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n };\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n const t = e.target as Node;\n if (!panel.contains(t) && !trigger.contains(t) && !wrapper.contains(t)) closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Reading guide ──────────────────────────────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide) return;\n const guide = document.getElementById('oks-reading-guide');\n if (!guide) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y === 'number') guide.style.top = `${y}px`;\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n return () => {\n trigger.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n };\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 88px; padding: 14px 8px; }\n .oks-icon svg { width: 30px; height: 30px; }\n .oks-label { font-size: 12px; line-height: 1.3; }\n .oks-access-grid { gap: 10px; }\n .oks-access-content { padding: 0 16px 24px; }\n .oks-access-title { font-size: 12px; margin: 14px 0 6px; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n`;\n"]}
|
package/dist/web-component.js
CHANGED
|
@@ -485,7 +485,7 @@ var PANEL_CSS = `
|
|
|
485
485
|
text-transform: uppercase;
|
|
486
486
|
color: #888;
|
|
487
487
|
}
|
|
488
|
-
.oks-access-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
|
|
488
|
+
.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }
|
|
489
489
|
.oks-access-opt {
|
|
490
490
|
background: #f9f9f9;
|
|
491
491
|
border: 2px solid #eee;
|
|
@@ -496,6 +496,7 @@ var PANEL_CSS = `
|
|
|
496
496
|
align-items: center;
|
|
497
497
|
justify-content: center;
|
|
498
498
|
cursor: pointer;
|
|
499
|
+
min-width: 0;
|
|
499
500
|
min-height: 70px;
|
|
500
501
|
color: #333;
|
|
501
502
|
transition: 0.2s;
|
|
@@ -516,6 +517,8 @@ var PANEL_CSS = `
|
|
|
516
517
|
text-transform: uppercase;
|
|
517
518
|
text-align: center;
|
|
518
519
|
line-height: 1.2;
|
|
520
|
+
overflow-wrap: anywhere;
|
|
521
|
+
word-break: break-word;
|
|
519
522
|
}
|
|
520
523
|
.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }
|
|
521
524
|
.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/icons.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts","../src/translations.ts","../src/web-component.ts"],"names":["root"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2LlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;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","file":"web-component.js","sourcesContent":["// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n\n// 4 iconos del botón flotante.\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>',\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","import type { Translation } from './translations.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position = 'top-left' | 'top-right' | 'mid-left' | 'mid-right' | 'bottom-left' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n}\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n const grid = (rows: string[]): string =>\n `<div class=\"oks-access-grid\">${rows.join('')}</div>`;\n\n const multi = (action: string, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (klass: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const overlay = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"overlay\" data-target=\"${id}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const guide = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"guide\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n\n return `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" aria-hidden=\"true\">\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n <h4 class=\"oks-access-title\">${escapeHtml(t.txt)}</h4>\n ${grid([\n multi('multi', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('multi', 'oks-lh', 3, t.lh, ICON_LH),\n multi('multi', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('oks-a11y-font', t.font, ICON_FONT),\n toggle('oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('multi', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.vis)}</h4>\n ${grid([\n toggle('oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.ori)}</h4>\n ${grid([\n guide(t.guide, ICON_GUIDE),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&', '<': '<', '>': '>', '\"': '"',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, ''');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n let css = `.oks-access-wrapper { ${d.wrap} } .oks-access-panel { ${d.panel} }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n // El panel pasa a fullscreen en móvil (regla existente en PANEL_CSS),\n // así que aquí solo redirigimos el wrapper del trigger.\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un dispose para\n * limpiar.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): () => void {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt'));\n\n if (!trigger || !panel || !closeBtn || !resetBtn || !wrapper) {\n return () => {};\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n // Aplica `state` al DOM (clases en body/html + estado de los botones).\n function applyState(): void {\n const body = document.body;\n const root = document.documentElement;\n // Limpiar todo lo nuestro antes de re-aplicar.\n body.className = body.className.replace(/\\boks-\\w+(?:-\\d+)?\\b/g, '').trim();\n [1, 2, 3].forEach((l) => root.classList.remove(`oks-colorblind-${l}`));\n\n if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) body.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) body.classList.add(`oks-ls-${state.ls}`);\n if (state.colorblind > 0) root.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.font) body.classList.add('oks-a11y-font');\n if (state.dyslexia) body.classList.add('oks-dyslexia');\n if (state.contrast) body.classList.add('oks-a11y-contrast');\n if (state.hideImages) body.classList.add('oks-a11y-hide');\n if (state.highlightLinks) body.classList.add('oks-a11y-links');\n if (state.bigCursor) body.classList.add('oks-big-cursor');\n if (state.pauseAnim) body.classList.add('oks-a11y-pause');\n if (state.focusOutline) body.classList.add('oks-a11y-focus');\n if (state.readingGuide) body.classList.add('oks-a11y-guide');\n\n const overlay = ensureOverlay();\n overlay.classList.toggle('is-active', state.grayOverlay);\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n }\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n // Contrast y grayOverlay son mutuamente excluyentes.\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n const openPanel = (): void => {\n panel.classList.add('is-open');\n panel.setAttribute('aria-hidden', 'false');\n trigger.setAttribute('aria-expanded', 'true');\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n panel.classList.remove('is-open');\n panel.setAttribute('aria-hidden', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n };\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n const t = e.target as Node;\n if (!panel.contains(t) && !trigger.contains(t) && !wrapper.contains(t)) closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Reading guide ──────────────────────────────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide) return;\n const guide = document.getElementById('oks-reading-guide');\n if (!guide) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y === 'number') guide.style.top = `${y}px`;\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n return () => {\n trigger.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n };\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 88px; padding: 14px 8px; }\n .oks-icon svg { width: 30px; height: 30px; }\n .oks-label { font-size: 12px; line-height: 1.3; }\n .oks-access-grid { gap: 10px; }\n .oks-access-content { padding: 0 16px 24px; }\n .oks-access-title { font-size: 12px; margin: 14px 0 6px; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n`;\n","// Heredado del plugin WP oksigenia-access v16.9.\n// 8 locales: español PY (con Guaraní separado como lengua oficial PY),\n// inglés, francés, italiano, alemán, neerlandés, sueco.\n\nexport type LocaleCode = 'es' | 'gn' | 'en' | 'fr' | 'it' | 'de' | 'nl' | 'sv';\n\nexport interface Translation {\n title: string;\n close: string;\n txt: string;\n size: string;\n lh: string;\n align: string;\n font: string;\n dyslexia: string;\n vis: string;\n contrast: string;\n gray: string;\n hide: string;\n links: string;\n ori: string;\n guide: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco' },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus' },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha' },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus' },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus' },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus' },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus' },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus' },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// Web component <oksigenia-access-panel>. Importar este módulo\n// registra el custom element y monta el panel + sus efectos globales.\n\nimport { buildPanelHtml, positionCss, type Position } from './render.js';\nimport { bindPanelBehavior } from './behavior.js';\nimport { PANEL_CSS, EFFECT_CSS } from './styles.js';\nimport { COLORBLIND_FILTERS_SVG } from './icons.js';\nimport { getTranslation } from './translations.js';\nimport type { TriggerIcon } from './icons.js';\n\nconst OBSERVED = ['locale', 'position', 'position-mobile', 'trigger-icon', 'storage-key'] as const;\nconst STYLE_ID = 'oksigenia-access-effects';\nconst FILTERS_ID = 'oksigenia-access-filters';\nconst GUIDE_ID = 'oks-reading-guide';\n\nfunction ensureGlobalStyles(): void {\n if (typeof document === 'undefined') return;\n if (!document.getElementById(STYLE_ID)) {\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = EFFECT_CSS;\n document.head.appendChild(style);\n }\n if (!document.getElementById(FILTERS_ID)) {\n const wrap = document.createElement('div');\n wrap.id = FILTERS_ID;\n wrap.style.cssText = 'position:absolute;width:0;height:0;overflow:hidden;';\n wrap.innerHTML = COLORBLIND_FILTERS_SVG;\n document.body.appendChild(wrap);\n }\n if (!document.getElementById(GUIDE_ID)) {\n const guide = document.createElement('div');\n guide.id = GUIDE_ID;\n guide.className = 'oks-reading-guide';\n document.body.appendChild(guide);\n }\n}\n\nconst VALID_POSITIONS: readonly Position[] = [\n 'top-left', 'top-right', 'mid-left', 'mid-right', 'bottom-left', 'bottom-right',\n];\nconst VALID_ICONS: readonly TriggerIcon[] = ['vitruvian', 'wheelchair', 'eye', 'universal'];\n\nexport class OksigeniaAccessPanelElement extends HTMLElement {\n static get observedAttributes(): readonly string[] {\n return OBSERVED;\n }\n\n private _dispose: (() => void) | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback(): void {\n ensureGlobalStyles();\n this.render();\n }\n\n disconnectedCallback(): void {\n this._dispose?.();\n this._dispose = null;\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) this.render();\n }\n\n private getPosition(): Position {\n const attr = (this.getAttribute('position') ?? 'mid-left') as Position;\n return VALID_POSITIONS.includes(attr) ? attr : 'mid-left';\n }\n\n private getPositionMobile(): Position | undefined {\n const attr = this.getAttribute('position-mobile') as Position | null;\n return attr && VALID_POSITIONS.includes(attr) ? attr : undefined;\n }\n\n private getTriggerIcon(): TriggerIcon {\n const attr = (this.getAttribute('trigger-icon') ?? 'vitruvian') as TriggerIcon;\n return VALID_ICONS.includes(attr) ? attr : 'vitruvian';\n }\n\n private getLocale(): string {\n return this.getAttribute('locale')\n ?? (typeof navigator !== 'undefined' ? navigator.language : 'en');\n }\n\n private render(): void {\n const shadow = this.shadowRoot;\n if (!shadow) return;\n this._dispose?.();\n\n const position = this.getPosition();\n const positionMobile = this.getPositionMobile();\n const html = buildPanelHtml({\n t: getTranslation(this.getLocale()),\n triggerIcon: this.getTriggerIcon(),\n position,\n });\n shadow.innerHTML = `<style>${PANEL_CSS}${positionCss(position, positionMobile)}</style>${html}`;\n this._dispose = bindPanelBehavior(shadow, {\n storageKey: this.getAttribute('storage-key') ?? undefined,\n });\n }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('oksigenia-access-panel')) {\n customElements.define('oksigenia-access-panel', OksigeniaAccessPanelElement);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'oksigenia-access-panel': OksigeniaAccessPanelElement;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/icons.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts","../src/translations.ts","../src/web-component.ts"],"names":["root"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA8LlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;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","file":"web-component.js","sourcesContent":["// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n\n// 4 iconos del botón flotante.\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>',\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","import type { Translation } from './translations.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position = 'top-left' | 'top-right' | 'mid-left' | 'mid-right' | 'bottom-left' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n}\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n const grid = (rows: string[]): string =>\n `<div class=\"oks-access-grid\">${rows.join('')}</div>`;\n\n const multi = (action: string, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (klass: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const overlay = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"overlay\" data-target=\"${id}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const guide = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"guide\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n\n return `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" aria-hidden=\"true\">\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n <h4 class=\"oks-access-title\">${escapeHtml(t.txt)}</h4>\n ${grid([\n multi('multi', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('multi', 'oks-lh', 3, t.lh, ICON_LH),\n multi('multi', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('oks-a11y-font', t.font, ICON_FONT),\n toggle('oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('multi', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.vis)}</h4>\n ${grid([\n toggle('oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.ori)}</h4>\n ${grid([\n guide(t.guide, ICON_GUIDE),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&', '<': '<', '>': '>', '\"': '"',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, ''');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n let css = `.oks-access-wrapper { ${d.wrap} } .oks-access-panel { ${d.panel} }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n // El panel pasa a fullscreen en móvil (regla existente en PANEL_CSS),\n // así que aquí solo redirigimos el wrapper del trigger.\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un dispose para\n * limpiar.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): () => void {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt'));\n\n if (!trigger || !panel || !closeBtn || !resetBtn || !wrapper) {\n return () => {};\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n // Aplica `state` al DOM (clases en body/html + estado de los botones).\n function applyState(): void {\n const body = document.body;\n const root = document.documentElement;\n // Limpiar todo lo nuestro antes de re-aplicar.\n body.className = body.className.replace(/\\boks-\\w+(?:-\\d+)?\\b/g, '').trim();\n [1, 2, 3].forEach((l) => root.classList.remove(`oks-colorblind-${l}`));\n\n if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) body.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) body.classList.add(`oks-ls-${state.ls}`);\n if (state.colorblind > 0) root.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.font) body.classList.add('oks-a11y-font');\n if (state.dyslexia) body.classList.add('oks-dyslexia');\n if (state.contrast) body.classList.add('oks-a11y-contrast');\n if (state.hideImages) body.classList.add('oks-a11y-hide');\n if (state.highlightLinks) body.classList.add('oks-a11y-links');\n if (state.bigCursor) body.classList.add('oks-big-cursor');\n if (state.pauseAnim) body.classList.add('oks-a11y-pause');\n if (state.focusOutline) body.classList.add('oks-a11y-focus');\n if (state.readingGuide) body.classList.add('oks-a11y-guide');\n\n const overlay = ensureOverlay();\n overlay.classList.toggle('is-active', state.grayOverlay);\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n }\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n // Contrast y grayOverlay son mutuamente excluyentes.\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n const openPanel = (): void => {\n panel.classList.add('is-open');\n panel.setAttribute('aria-hidden', 'false');\n trigger.setAttribute('aria-expanded', 'true');\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n panel.classList.remove('is-open');\n panel.setAttribute('aria-hidden', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n };\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n const t = e.target as Node;\n if (!panel.contains(t) && !trigger.contains(t) && !wrapper.contains(t)) closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Reading guide ──────────────────────────────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide) return;\n const guide = document.getElementById('oks-reading-guide');\n if (!guide) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y === 'number') guide.style.top = `${y}px`;\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n return () => {\n trigger.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n };\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 88px; padding: 14px 8px; }\n .oks-icon svg { width: 30px; height: 30px; }\n .oks-label { font-size: 12px; line-height: 1.3; }\n .oks-access-grid { gap: 10px; }\n .oks-access-content { padding: 0 16px 24px; }\n .oks-access-title { font-size: 12px; margin: 14px 0 6px; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n`;\n","// Heredado del plugin WP oksigenia-access v16.9.\n// 8 locales: español PY (con Guaraní separado como lengua oficial PY),\n// inglés, francés, italiano, alemán, neerlandés, sueco.\n\nexport type LocaleCode = 'es' | 'gn' | 'en' | 'fr' | 'it' | 'de' | 'nl' | 'sv';\n\nexport interface Translation {\n title: string;\n close: string;\n txt: string;\n size: string;\n lh: string;\n align: string;\n font: string;\n dyslexia: string;\n vis: string;\n contrast: string;\n gray: string;\n hide: string;\n links: string;\n ori: string;\n guide: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco' },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus' },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha' },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus' },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus' },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus' },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus' },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus' },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// Web component <oksigenia-access-panel>. Importar este módulo\n// registra el custom element y monta el panel + sus efectos globales.\n\nimport { buildPanelHtml, positionCss, type Position } from './render.js';\nimport { bindPanelBehavior } from './behavior.js';\nimport { PANEL_CSS, EFFECT_CSS } from './styles.js';\nimport { COLORBLIND_FILTERS_SVG } from './icons.js';\nimport { getTranslation } from './translations.js';\nimport type { TriggerIcon } from './icons.js';\n\nconst OBSERVED = ['locale', 'position', 'position-mobile', 'trigger-icon', 'storage-key'] as const;\nconst STYLE_ID = 'oksigenia-access-effects';\nconst FILTERS_ID = 'oksigenia-access-filters';\nconst GUIDE_ID = 'oks-reading-guide';\n\nfunction ensureGlobalStyles(): void {\n if (typeof document === 'undefined') return;\n if (!document.getElementById(STYLE_ID)) {\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = EFFECT_CSS;\n document.head.appendChild(style);\n }\n if (!document.getElementById(FILTERS_ID)) {\n const wrap = document.createElement('div');\n wrap.id = FILTERS_ID;\n wrap.style.cssText = 'position:absolute;width:0;height:0;overflow:hidden;';\n wrap.innerHTML = COLORBLIND_FILTERS_SVG;\n document.body.appendChild(wrap);\n }\n if (!document.getElementById(GUIDE_ID)) {\n const guide = document.createElement('div');\n guide.id = GUIDE_ID;\n guide.className = 'oks-reading-guide';\n document.body.appendChild(guide);\n }\n}\n\nconst VALID_POSITIONS: readonly Position[] = [\n 'top-left', 'top-right', 'mid-left', 'mid-right', 'bottom-left', 'bottom-right',\n];\nconst VALID_ICONS: readonly TriggerIcon[] = ['vitruvian', 'wheelchair', 'eye', 'universal'];\n\nexport class OksigeniaAccessPanelElement extends HTMLElement {\n static get observedAttributes(): readonly string[] {\n return OBSERVED;\n }\n\n private _dispose: (() => void) | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback(): void {\n ensureGlobalStyles();\n this.render();\n }\n\n disconnectedCallback(): void {\n this._dispose?.();\n this._dispose = null;\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) this.render();\n }\n\n private getPosition(): Position {\n const attr = (this.getAttribute('position') ?? 'mid-left') as Position;\n return VALID_POSITIONS.includes(attr) ? attr : 'mid-left';\n }\n\n private getPositionMobile(): Position | undefined {\n const attr = this.getAttribute('position-mobile') as Position | null;\n return attr && VALID_POSITIONS.includes(attr) ? attr : undefined;\n }\n\n private getTriggerIcon(): TriggerIcon {\n const attr = (this.getAttribute('trigger-icon') ?? 'vitruvian') as TriggerIcon;\n return VALID_ICONS.includes(attr) ? attr : 'vitruvian';\n }\n\n private getLocale(): string {\n return this.getAttribute('locale')\n ?? (typeof navigator !== 'undefined' ? navigator.language : 'en');\n }\n\n private render(): void {\n const shadow = this.shadowRoot;\n if (!shadow) return;\n this._dispose?.();\n\n const position = this.getPosition();\n const positionMobile = this.getPositionMobile();\n const html = buildPanelHtml({\n t: getTranslation(this.getLocale()),\n triggerIcon: this.getTriggerIcon(),\n position,\n });\n shadow.innerHTML = `<style>${PANEL_CSS}${positionCss(position, positionMobile)}</style>${html}`;\n this._dispose = bindPanelBehavior(shadow, {\n storageKey: this.getAttribute('storage-key') ?? undefined,\n });\n }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('oksigenia-access-panel')) {\n customElements.define('oksigenia-access-panel', OksigeniaAccessPanelElement);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'oksigenia-access-panel': OksigeniaAccessPanelElement;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oksigenia/access-panel",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"description": "Accessibility panel as a web component. 15 controls (text size, line height, dyslexia font, contrast, colorblind, reading guide, big cursor, pause animations, focus, …) across 8 locales (incl. Guaraní). Zero deps, no tracking.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"accessibility",
|