@oksigenia/access-panel 0.4.2 → 0.4.3

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/CHANGELOG.md CHANGED
@@ -1,10 +1,16 @@
1
1
  # @oksigenia/access-panel
2
2
 
3
+ ## 0.4.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 93bdea9: Fix body class cleanup leaving junk tokens that piled up on every click: two-hyphen classes like `oks-a11y-font` were split by the old regex, leaving `-font` residue behind. Cleanup now removes `oks-` tokens via classList. Also fix the focus trap skipping the footer branding link: `a[href]` is now part of the Tab cycle, so keyboard users can reach it and Tab no longer escapes the panel from it.
8
+
3
9
  ## 0.4.2
4
10
 
5
11
  ### Patch Changes
6
12
 
7
- Fix `aria-hidden-focus` (axe / Lighthouse, severity *serious*): while closed, `#oks-panel` kept `aria-hidden="true"` but still held ~24 focusable controls (buttons, inputs, `[tabindex]`). An `aria-hidden` element with focusable descendants is a violation — a keyboard or screen-reader user can land "inside" something hidden from assistive tech — and it contradicted the `aria-modal="true"` on the same element.
13
+ Fix `aria-hidden-focus` (axe / Lighthouse, severity _serious_): while closed, `#oks-panel` kept `aria-hidden="true"` but still held ~24 focusable controls (buttons, inputs, `[tabindex]`). An `aria-hidden` element with focusable descendants is a violation — a keyboard or screen-reader user can land "inside" something hidden from assistive tech — and it contradicted the `aria-modal="true"` on the same element.
8
14
 
9
15
  The closed state now uses the `inert` attribute instead of `aria-hidden`. `inert` removes the panel from both the tab order and the accessibility tree, so its controls are genuinely unreachable while closed, and the `aria-modal`/`aria-hidden` contradiction is gone. On open we `removeAttribute('inert')`; on close we `setAttribute('inert', '')` before returning focus to the trigger. The dialog pattern (focus moves in on open, Esc closes, focus returns to the trigger, Tab is trapped while open) was already in place and is unchanged.
10
16
 
package/dist/index.js CHANGED
@@ -253,7 +253,9 @@ function bindPanelBehavior(root, opts = {}) {
253
253
  function applyState() {
254
254
  const body = document.body;
255
255
  const root2 = document.documentElement;
256
- body.className = body.className.replace(/\boks-\w+(?:-\d+)?\b/g, "").trim();
256
+ for (const cls of Array.from(body.classList)) {
257
+ if (cls.startsWith("oks-")) body.classList.remove(cls);
258
+ }
257
259
  [1, 2, 3].forEach((l) => root2.classList.remove(`oks-colorblind-${l}`));
258
260
  if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);
259
261
  if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);
@@ -377,7 +379,7 @@ function bindPanelBehavior(root, opts = {}) {
377
379
  return;
378
380
  }
379
381
  if (e.key !== "Tab") return;
380
- const focusable = Array.from(panel.querySelectorAll("button:not([disabled])"));
382
+ const focusable = Array.from(panel.querySelectorAll("button:not([disabled]), a[href]"));
381
383
  if (focusable.length === 0) return;
382
384
  const first = focusable[0];
383
385
  const last = focusable[focusable.length - 1];
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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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuOlB,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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 mask: string;\n targets: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n /** Section title for the preset row. */\n presets: string;\n /** Preset labels. */\n pLow: string;\n pDys: string;\n pMot: string;\n pCalm: 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', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.' },\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', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.' },\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', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy' },\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', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.' },\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', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.' },\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', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.' },\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', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.' },\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', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.' },\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// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></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_MASK, ICON_TARGETS,\n 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 const mask = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"mask\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const preset = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" 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\" inert>\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.presets)}</h4>\n <div class=\"oks-access-presets\">\n ${preset('lowvision', t.pLow, ICON_CONTRAST)}\n ${preset('dyslexia', t.pDys, ICON_DYSLEXIA)}\n ${preset('motor', t.pMot, ICON_CURSOR)}\n ${preset('calm', t.pCalm, ICON_HIDE)}\n </div>\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 mask(t.mask, ICON_MASK),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-bigtargets', t.targets, ICON_TARGETS),\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 '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, '&#39;');\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 del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\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 /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: 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 readingMask: false,\n bigTargets: 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 !state.readingMask &&\n !state.bigTargets\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 'oks-a11y-bigtargets': 'bigTargets',\n};\n\n/** Preset profiles: set the listed flags to true, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nconst PRESETS: Record<string, Partial<PanelState>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\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, .oks-preset'));\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 if (state.readingMask) body.classList.add('oks-a11y-mask');\n if (state.bigTargets) body.classList.add('oks-a11y-bigtargets');\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 } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n // Preset buttons don't carry persistent active state — they apply\n // a bundle of flags and let the user adjust afterwards.\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 } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') ?? '';\n const preset = PRESETS[id];\n if (preset) Object.assign(state, preset);\n // Transient click feedback — see styles.ts .oks-preset.is-flashing.\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\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.removeAttribute('inert');\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 // inert (not aria-hidden) while closed: its focusable controls leave the\n // tab order and the accessibility tree, fixing the aria-hidden-focus\n // violation. inert also blurs any focus held inside before we restore it.\n panel.setAttribute('inert', '');\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 // Clicks that originate inside our Shadow DOM are retargeted to the\n // host element when they bubble to `document`, so `panel.contains(t)`\n // returns false even though the user clicked something *inside* the\n // panel. composedPath() preserves the full path across shadow\n // boundaries — use that to detect \"click stayed within the widget\".\n const path = e.composedPath();\n if (path.includes(panel) || path.includes(trigger) || path.includes(wrapper)) return;\n 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 + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\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-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\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: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\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/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\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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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;AAuOlB,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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 mask: string;\n targets: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n /** Section title for the preset row. */\n presets: string;\n /** Preset labels. */\n pLow: string;\n pDys: string;\n pMot: string;\n pCalm: 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', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.' },\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', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.' },\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', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy' },\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', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.' },\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', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.' },\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', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.' },\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', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.' },\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', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.' },\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// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></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_MASK, ICON_TARGETS,\n 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 const mask = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"mask\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const preset = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" 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\" inert>\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.presets)}</h4>\n <div class=\"oks-access-presets\">\n ${preset('lowvision', t.pLow, ICON_CONTRAST)}\n ${preset('dyslexia', t.pDys, ICON_DYSLEXIA)}\n ${preset('motor', t.pMot, ICON_CURSOR)}\n ${preset('calm', t.pCalm, ICON_HIDE)}\n </div>\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 mask(t.mask, ICON_MASK),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-bigtargets', t.targets, ICON_TARGETS),\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 '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, '&#39;');\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 del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\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 /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: 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 readingMask: false,\n bigTargets: 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 !state.readingMask &&\n !state.bigTargets\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 'oks-a11y-bigtargets': 'bigTargets',\n};\n\n/** Preset profiles: set the listed flags to true, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nconst PRESETS: Record<string, Partial<PanelState>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\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, .oks-preset'));\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 // Clear everything of ours before re-applying. Token by token via\n // classList: a regex over className used to split two-hyphen classes\n // (oks-a11y-font → \"-font\" residue) and leave junk piling up.\n for (const cls of Array.from(body.classList)) {\n if (cls.startsWith('oks-')) body.classList.remove(cls);\n }\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 if (state.readingMask) body.classList.add('oks-a11y-mask');\n if (state.bigTargets) body.classList.add('oks-a11y-bigtargets');\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 } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n // Preset buttons don't carry persistent active state — they apply\n // a bundle of flags and let the user adjust afterwards.\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 } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') ?? '';\n const preset = PRESETS[id];\n if (preset) Object.assign(state, preset);\n // Transient click feedback — see styles.ts .oks-preset.is-flashing.\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\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.removeAttribute('inert');\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 // inert (not aria-hidden) while closed: its focusable controls leave the\n // tab order and the accessibility tree, fixing the aria-hidden-focus\n // violation. inert also blurs any focus held inside before we restore it.\n panel.setAttribute('inert', '');\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 // Clicks that originate inside our Shadow DOM are retargeted to the\n // host element when they bubble to `document`, so `panel.contains(t)`\n // returns false even though the user clicked something *inside* the\n // panel. composedPath() preserves the full path across shadow\n // boundaries — use that to detect \"click stayed within the widget\".\n const path = e.composedPath();\n if (path.includes(panel) || path.includes(trigger) || path.includes(wrapper)) return;\n 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 // a[href] included: the branding link in the footer is focusable too —\n // buttons alone would make the trap skip it (or leak when it has focus).\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled]), a[href]'));\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 + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\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-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\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: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\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/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n"]}
@@ -232,7 +232,9 @@ function bindPanelBehavior(root, opts = {}) {
232
232
  function applyState() {
233
233
  const body = document.body;
234
234
  const root2 = document.documentElement;
235
- body.className = body.className.replace(/\boks-\w+(?:-\d+)?\b/g, "").trim();
235
+ for (const cls of Array.from(body.classList)) {
236
+ if (cls.startsWith("oks-")) body.classList.remove(cls);
237
+ }
236
238
  [1, 2, 3].forEach((l) => root2.classList.remove(`oks-colorblind-${l}`));
237
239
  if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);
238
240
  if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);
@@ -356,7 +358,7 @@ function bindPanelBehavior(root, opts = {}) {
356
358
  return;
357
359
  }
358
360
  if (e.key !== "Tab") return;
359
- const focusable = Array.from(panel.querySelectorAll("button:not([disabled])"));
361
+ const focusable = Array.from(panel.querySelectorAll("button:not([disabled]), a[href]"));
360
362
  if (focusable.length === 0) return;
361
363
  const first = focusable[0];
362
364
  const last = focusable[focusable.length - 1];
@@ -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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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAuOlB,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;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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// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></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_MASK, ICON_TARGETS,\n 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 const mask = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"mask\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const preset = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" 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\" inert>\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.presets)}</h4>\n <div class=\"oks-access-presets\">\n ${preset('lowvision', t.pLow, ICON_CONTRAST)}\n ${preset('dyslexia', t.pDys, ICON_DYSLEXIA)}\n ${preset('motor', t.pMot, ICON_CURSOR)}\n ${preset('calm', t.pCalm, ICON_HIDE)}\n </div>\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 mask(t.mask, ICON_MASK),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-bigtargets', t.targets, ICON_TARGETS),\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 '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, '&#39;');\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 del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\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 /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: 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 readingMask: false,\n bigTargets: 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 !state.readingMask &&\n !state.bigTargets\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 'oks-a11y-bigtargets': 'bigTargets',\n};\n\n/** Preset profiles: set the listed flags to true, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nconst PRESETS: Record<string, Partial<PanelState>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\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, .oks-preset'));\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 if (state.readingMask) body.classList.add('oks-a11y-mask');\n if (state.bigTargets) body.classList.add('oks-a11y-bigtargets');\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 } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n // Preset buttons don't carry persistent active state — they apply\n // a bundle of flags and let the user adjust afterwards.\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 } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') ?? '';\n const preset = PRESETS[id];\n if (preset) Object.assign(state, preset);\n // Transient click feedback — see styles.ts .oks-preset.is-flashing.\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\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.removeAttribute('inert');\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 // inert (not aria-hidden) while closed: its focusable controls leave the\n // tab order and the accessibility tree, fixing the aria-hidden-focus\n // violation. inert also blurs any focus held inside before we restore it.\n panel.setAttribute('inert', '');\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 // Clicks that originate inside our Shadow DOM are retargeted to the\n // host element when they bubble to `document`, so `panel.contains(t)`\n // returns false even though the user clicked something *inside* the\n // panel. composedPath() preserves the full path across shadow\n // boundaries — use that to detect \"click stayed within the widget\".\n const path = e.composedPath();\n if (path.includes(panel) || path.includes(trigger) || path.includes(wrapper)) return;\n 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 + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\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-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\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: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\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/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\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 mask: string;\n targets: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n /** Section title for the preset row. */\n presets: string;\n /** Preset labels. */\n pLow: string;\n pDys: string;\n pMot: string;\n pCalm: 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', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.' },\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', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.' },\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', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy' },\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', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.' },\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', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.' },\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', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.' },\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', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.' },\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', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.' },\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';\nconst MASK_ID = 'oks-reading-mask';\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 if (!document.getElementById(MASK_ID)) {\n const mask = document.createElement('div');\n mask.id = MASK_ID;\n mask.className = 'oks-reading-mask';\n document.body.appendChild(mask);\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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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAuOlB,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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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// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></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_MASK, ICON_TARGETS,\n 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 const mask = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"mask\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const preset = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" 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\" inert>\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.presets)}</h4>\n <div class=\"oks-access-presets\">\n ${preset('lowvision', t.pLow, ICON_CONTRAST)}\n ${preset('dyslexia', t.pDys, ICON_DYSLEXIA)}\n ${preset('motor', t.pMot, ICON_CURSOR)}\n ${preset('calm', t.pCalm, ICON_HIDE)}\n </div>\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 mask(t.mask, ICON_MASK),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-bigtargets', t.targets, ICON_TARGETS),\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 '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, '&#39;');\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 del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\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 /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: 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 readingMask: false,\n bigTargets: 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 !state.readingMask &&\n !state.bigTargets\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 'oks-a11y-bigtargets': 'bigTargets',\n};\n\n/** Preset profiles: set the listed flags to true, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nconst PRESETS: Record<string, Partial<PanelState>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\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, .oks-preset'));\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 // Clear everything of ours before re-applying. Token by token via\n // classList: a regex over className used to split two-hyphen classes\n // (oks-a11y-font → \"-font\" residue) and leave junk piling up.\n for (const cls of Array.from(body.classList)) {\n if (cls.startsWith('oks-')) body.classList.remove(cls);\n }\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 if (state.readingMask) body.classList.add('oks-a11y-mask');\n if (state.bigTargets) body.classList.add('oks-a11y-bigtargets');\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 } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n // Preset buttons don't carry persistent active state — they apply\n // a bundle of flags and let the user adjust afterwards.\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 } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') ?? '';\n const preset = PRESETS[id];\n if (preset) Object.assign(state, preset);\n // Transient click feedback — see styles.ts .oks-preset.is-flashing.\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\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.removeAttribute('inert');\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 // inert (not aria-hidden) while closed: its focusable controls leave the\n // tab order and the accessibility tree, fixing the aria-hidden-focus\n // violation. inert also blurs any focus held inside before we restore it.\n panel.setAttribute('inert', '');\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 // Clicks that originate inside our Shadow DOM are retargeted to the\n // host element when they bubble to `document`, so `panel.contains(t)`\n // returns false even though the user clicked something *inside* the\n // panel. composedPath() preserves the full path across shadow\n // boundaries — use that to detect \"click stayed within the widget\".\n const path = e.composedPath();\n if (path.includes(panel) || path.includes(trigger) || path.includes(wrapper)) return;\n 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 // a[href] included: the branding link in the footer is focusable too —\n // buttons alone would make the trap skip it (or leak when it has focus).\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled]), a[href]'));\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 + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\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-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\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: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\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/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\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 mask: string;\n targets: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n /** Section title for the preset row. */\n presets: string;\n /** Preset labels. */\n pLow: string;\n pDys: string;\n pMot: string;\n pCalm: 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', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.' },\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', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.' },\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', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy' },\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', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.' },\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', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.' },\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', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.' },\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', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.' },\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', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.' },\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';\nconst MASK_ID = 'oks-reading-mask';\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 if (!document.getElementById(MASK_ID)) {\n const mask = document.createElement('div');\n mask.id = MASK_ID;\n mask.className = 'oks-reading-mask';\n document.body.appendChild(mask);\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.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Accessibility panel as a web component. 17 controls (text size, line height, dyslexia font, contrast, colorblind, reading guide, reading mask, big cursor, big targets, pause animations, focus, …) + 4 profile presets (low vision, dyslexia, motor, no distractions), across 8 locales (incl. Guaraní). Zero deps, no tracking.",
5
5
  "keywords": [
6
6
  "accessibility",