@oksigenia/access-panel 0.5.0 → 0.6.0
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 +13 -0
- package/README.md +62 -3
- package/dist/index.d.ts +31 -1
- package/dist/index.js +139 -23
- package/dist/index.js.map +1 -1
- package/dist/web-component.d.ts +5 -0
- package/dist/web-component.js +172 -29
- package/dist/web-component.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/controls.ts","../src/icons.ts","../src/render.ts","../src/state.ts","../src/translations.ts","../src/behavior.ts","../src/styles.ts","../src/web-component.ts"],"names":[],"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,CAAA;AAmPlB,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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","file":"web-component.js","sourcesContent":["// Single source of truth for the panel's control catalogue.\n//\n// Each atomic control has a stable, human-readable id (the value the host\n// passes in `controls=` / `exclude=`). Render, behavior and the web component\n// all resolve curation against this registry so the three never drift.\n//\n// The ids are part of the public API — they are documented and used by hosts —\n// so treat renames as breaking.\n\nimport type { PanelState } from './state.js';\n\nexport type ControlId =\n | 'text-size'\n | 'line-height'\n | 'text-align'\n | 'readable-font'\n | 'dyslexia-font'\n | 'letter-spacing'\n | 'contrast'\n | 'grayscale'\n | 'hide-images'\n | 'highlight-links'\n | 'colorblind'\n | 'reading-guide'\n | 'reading-mask'\n | 'big-cursor'\n | 'big-targets'\n | 'pause-anim'\n | 'focus';\n\n/** Render order (also the order `exclude=`/`controls=` are validated against). */\nexport const ALL_CONTROLS: readonly ControlId[] = [\n 'text-size', 'line-height', 'text-align', 'readable-font', 'dyslexia-font', 'letter-spacing',\n 'contrast', 'grayscale', 'hide-images', 'highlight-links', 'colorblind',\n 'reading-guide', 'reading-mask', 'big-cursor', 'big-targets', 'pause-anim', 'focus',\n];\n\n/** Control id → the PanelState field it drives. */\nexport const CONTROL_STATE_KEY: Readonly<Record<ControlId, keyof PanelState>> = {\n 'text-size': 'zoom',\n 'line-height': 'lh',\n 'text-align': 'align',\n 'readable-font': 'font',\n 'dyslexia-font': 'dyslexia',\n 'letter-spacing': 'ls',\n 'contrast': 'contrast',\n 'grayscale': 'grayOverlay',\n 'hide-images': 'hideImages',\n 'highlight-links': 'highlightLinks',\n 'colorblind': 'colorblind',\n 'reading-guide': 'readingGuide',\n 'reading-mask': 'readingMask',\n 'big-cursor': 'bigCursor',\n 'big-targets': 'bigTargets',\n 'pause-anim': 'pauseAnim',\n 'focus': 'focusOutline',\n};\n\n/** Reverse of CONTROL_STATE_KEY, for mapping a preset's flags back to controls. */\nconst STATE_KEY_CONTROL = Object.fromEntries(\n Object.entries(CONTROL_STATE_KEY).map(([control, key]) => [key, control as ControlId]),\n) as Record<keyof PanelState, ControlId>;\n\nexport type PresetId = 'lowvision' | 'dyslexia' | 'motor' | 'calm';\n\n/** Preset profiles: set the listed flags, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nexport const PRESETS: Readonly<Record<PresetId, 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 const PRESET_IDS: readonly PresetId[] = ['lowvision', 'dyslexia', 'motor', 'calm'];\n\n/** Control ids a preset touches (used to hide/recompose it under curation). */\nexport function presetControlIds(id: PresetId): ControlId[] {\n return Object.keys(PRESETS[id]).map((k) => STATE_KEY_CONTROL[k as keyof PanelState]);\n}\n\n/**\n * Resolve which controls an instance offers from its `controls=` (whitelist)\n * and `exclude=` (blacklist) attributes. Both optional; unknown ids ignored.\n * No attributes ⇒ all 17 (current behavior).\n */\nexport function resolveEnabledControls(\n controlsAttr?: string | null,\n excludeAttr?: string | null,\n): Set<ControlId> {\n const valid = new Set(ALL_CONTROLS);\n const parse = (raw: string | null | undefined): ControlId[] =>\n (raw ?? '')\n .split(',')\n .map((s) => s.trim().toLowerCase() as ControlId)\n .filter((s) => valid.has(s));\n\n const whitelist = controlsAttr != null ? parse(controlsAttr) : null;\n let enabled = whitelist && whitelist.length > 0 ? new Set(whitelist) : new Set(ALL_CONTROLS);\n\n if (excludeAttr != null) {\n for (const id of parse(excludeAttr)) enabled.delete(id);\n }\n return enabled;\n}\n\n/**\n * Recompose a preset for a curated instance: keep only the flags whose control\n * is still offered. The open design point Bentos flagged — a preset in a window\n * that excludes its controls (e.g. \"dyslexia\" where the dyslexia font and\n * reading guide are gone) collapses to whatever it can still legitimately set,\n * and is hidden entirely (see `presetIsAvailable`) when nothing remains.\n */\nexport function filterPresetForEnabled(\n id: PresetId,\n enabled: Set<ControlId>,\n): Partial<PanelState> {\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(PRESETS[id]) as Array<[keyof PanelState, never]>) {\n if (enabled.has(STATE_KEY_CONTROL[k])) out[k] = v;\n }\n return out;\n}\n\n/**\n * A preset shows only if it still bundles **two or more** controls after\n * curation. A profile is a combination — one that collapses to a single\n * control is redundant with that control's own button, so it is hidden.\n */\nexport function presetIsAvailable(id: PresetId, enabled: Set<ControlId>): boolean {\n return presetControlIds(id).filter((c) => enabled.has(c)).length >= 2;\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// Iconos del botón flotante. `porthole` reutiliza el glifo universal de\n// accesibilidad (persona) y le añade un aro de ojo de buey por CSS — el glifo\n// estándar NUNCA se sustituye, solo se enmarca (a11y: preserva la\n// descubribilidad por convención).\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal' | 'porthole';\n\nconst UNIVERSAL_GLYPH = '<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\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: UNIVERSAL_GLYPH,\n porthole: UNIVERSAL_GLYPH,\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 ALL_CONTROLS, PRESET_IDS, presetIsAvailable,\n type ControlId, type PresetId,\n} from './controls.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 =\n | 'top-left' | 'top-center' | 'top-right'\n | 'mid-left' | 'mid-center' | 'mid-right'\n | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n /** Controls offered by this instance. Defaults to all 17. */\n enabled?: Set<ControlId>;\n /** Render the floating trigger button. `false` for host-driven mode\n * (`trigger=\"none\"`): the panel renders without its launcher and the host\n * opens it via `.open()`. Defaults to true. */\n showTrigger?: boolean;\n /** Render the profile presets row. `false` (`presets=\"none\"`) drops it\n * entirely. Defaults to true; individual presets still self-hide under the\n * ≥2-control rule. */\n showPresets?: boolean;\n}\n\nconst PRESET_ICON: Record<PresetId, string> = {\n lowvision: ICON_CONTRAST,\n dyslexia: ICON_DYSLEXIA,\n motor: ICON_CURSOR,\n calm: ICON_HIDE,\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 enabled = opts.enabled ?? new Set(ALL_CONTROLS);\n const showTrigger = opts.showTrigger ?? true;\n const showPresets = opts.showPresets ?? true;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n // Each control helper emits its button only when the instance offers it\n // (#1 curation). A control id is stamped as data-control so behavior and\n // tests can resolve it back to the registry.\n const multi = (id: ControlId, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n if (!enabled.has(id)) return '';\n const action = id === 'colorblind' ? 'colorblind' : 'multi';\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-control=\"${id}\" 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 = (id: ControlId, klass: string, label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" 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 };\n const overlay = (id: ControlId, target: string, label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"overlay\" data-target=\"${target}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const simple = (id: ControlId, action: 'guide' | 'mask', label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"${action}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const preset = (id: PresetId, label: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" type=\"button\"><span class=\"oks-icon\">${PRESET_ICON[id]}</span><span class=\"oks-label\">${label}</span></button>`;\n\n // A section renders its heading only when it has at least one control —\n // otherwise a curated instance leaves orphan \"TEXT\" / \"VISUAL\" titles.\n const section = (title: string, rows: string[]): string => {\n const kept = rows.filter(Boolean);\n if (kept.length === 0) return '';\n return `<h4 class=\"oks-access-title\">${escapeHtml(title)}</h4><div class=\"oks-access-grid\">${kept.join('')}</div>`;\n };\n\n const presetLabels: Record<PresetId, string> = {\n lowvision: t.pLow, dyslexia: t.pDys, motor: t.pMot, calm: t.pCalm,\n };\n const presetButtons = showPresets\n ? PRESET_IDS.filter((id) => presetIsAvailable(id, enabled)).map((id) => preset(id, presetLabels[id]))\n : [];\n const presetsBlock = presetButtons.length\n ? `<h4 class=\"oks-access-title\">${escapeHtml(t.presets)}</h4><div class=\"oks-access-presets\">${presetButtons.join('')}</div>`\n : '';\n\n const triggerBlock = showTrigger ? `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" part=\"trigger\" data-trigger-icon=\"${triggerIcon}\" 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\n return `${triggerBlock}\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 ${presetsBlock}\n ${section(t.txt, [\n multi('text-size', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('line-height', 'oks-lh', 3, t.lh, ICON_LH),\n multi('text-align', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('readable-font', 'oks-a11y-font', t.font, ICON_FONT),\n toggle('dyslexia-font', 'oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('letter-spacing', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n ${section(t.vis, [\n toggle('contrast', 'oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('grayscale', 'oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('hide-images', 'oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('highlight-links', 'oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n ${section(t.ori, [\n simple('reading-guide', 'guide', t.guide, ICON_GUIDE),\n simple('reading-mask', 'mask', t.mask, ICON_MASK),\n toggle('big-cursor', 'oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('big-targets', 'oks-a11y-bigtargets', t.targets, ICON_TARGETS),\n toggle('pause-anim', 'oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('focus', 'oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&', '<': '<', '>': '>', '\"': '"',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, ''');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-center': return { wrap: 'top: 20px; left: 50%; transform: translateX(-50%);', panel: 'top: 80px; left: 50%; transform: translateX(-50%);' };\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-center': return { wrap: 'top: 50%; left: 50%; transform: translate(-50%, -50%);', panel: 'top: 50%; left: 50%; transform: translate(-50%, -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-center': return { wrap: 'bottom: 20px; left: 50%; transform: translateX(-50%);', panel: 'bottom: 100px; left: 50%; transform: translateX(-50%);' };\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","// 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 /** aria-label de un control multinivel activo: (etiqueta, nivel n, máximo m).\n * Solo se aplica cuando n > 0; en n = 0 el botón usa su etiqueta a secas. */\n level: (label: string, n: number, m: number) => 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.', level: (l, n, m) => `${l}, nivel ${n} de ${m}` },\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.', level: (l, n, m) => `${l}, level ${n} of ${m}` },\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', level: (l, n, m) => `${l}, ${n}/${m}` },\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.', level: (l, n, m) => `${l}, niveau ${n} sur ${m}` },\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.', level: (l, n, m) => `${l}, livello ${n} di ${m}` },\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.', level: (l, n, m) => `${l}, Stufe ${n} von ${m}` },\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.', level: (l, n, m) => `${l}, niveau ${n} van ${m}` },\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.', level: (l, n, m) => `${l}, nivå ${n} av ${m}` },\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","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\nimport { getTranslation } from './translations.js';\nimport {\n ALL_CONTROLS, PRESETS, filterPresetForEnabled, type ControlId, type PresetId,\n} from './controls.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\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n /** Locale para los aria-label dinámicos (nivel de los multinivel). Default en. */\n locale?: string;\n /** Controles que ofrece esta instancia (#1). Default: los 17. Filtra qué\n * flags puede aplicar un perfil. */\n enabled?: Set<ControlId>;\n /** Desplazamiento máximo del usuario para el trigger en px (#5). 0/ausente\n * desactiva el nudge (comportamiento actual). */\n nudgeMax?: number;\n}\n\n/** Dispose function with imperative open/close/toggle attached (#2). Calling\n * the value disposes; the methods drive the panel host-side. */\nexport interface PanelController {\n (): void;\n open(): void;\n close(): void;\n toggle(): void;\n}\n\nfunction noopController(): PanelController {\n return Object.assign(() => {}, { open() {}, close() {}, toggle() {} });\n}\n\n/** Deepest focused element, crossing shadow boundaries — so we can restore\n * focus to whatever opened the panel (the host's own button in trigger=\"none\"\n * mode, the floating trigger otherwise). */\nfunction deepActiveElement(): HTMLElement | null {\n let a = document.activeElement as HTMLElement | null;\n while (a?.shadowRoot?.activeElement) a = a.shadowRoot.activeElement as HTMLElement;\n return a;\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 PanelController:\n * invocarlo limpia; sus métodos abren/cierran el panel.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): PanelController {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const t = getTranslation(opts.locale ?? 'en');\n const enabled = opts.enabled ?? new Set(ALL_CONTROLS);\n const nudgeMax = Math.max(0, opts.nudgeMax ?? 0);\n\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 // trigger + wrapper are optional (trigger=\"none\" host-driven mode); the\n // panel itself and its close/reset are required.\n if (!panel || !closeBtn || !resetBtn) {\n return noopController();\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n function applyState(): void {\n const body = document.body;\n const rootEl = document.documentElement;\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) => rootEl.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) rootEl.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 const max = parseInt(btn.getAttribute('data-levels') ?? '0', 10);\n const lbl = btn.querySelector('.oks-label')?.textContent?.trim() ?? '';\n if (lvl > 0 && max > 0) btn.setAttribute('aria-label', t.level(lbl, lvl, max));\n else btn.removeAttribute('aria-label');\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 }\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 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') as PresetId | null;\n // Recompose the preset to the controls this instance still offers (#1):\n // a profile never sets a flag the user can't see or undo here.\n if (id && PRESETS[id]) Object.assign(state, filterPresetForEnabled(id, enabled));\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 // ─── Open / close (also exposed imperatively, #2) ───────────────\n let opener: HTMLElement | null = null;\n // When the host opens us from its own button (trigger=\"none\"), that click\n // keeps bubbling to document, where onDocClick would treat it as an\n // outside-click and close us in the same gesture. Ignore the doc-click for\n // the current event-loop turn after opening.\n let ignoreDocClose = false;\n const openPanel = (): void => {\n if (panel.classList.contains('is-open')) return;\n opener = deepActiveElement();\n panel.classList.add('is-open');\n panel.removeAttribute('inert');\n trigger?.setAttribute('aria-expanded', 'true');\n ignoreDocClose = true;\n setTimeout(() => { ignoreDocClose = false; }, 0);\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n if (!panel.classList.contains('is-open')) return;\n panel.classList.remove('is-open');\n panel.setAttribute('inert', '');\n trigger?.setAttribute('aria-expanded', 'false');\n // Restore focus to the trigger, or to whatever opened us host-side.\n if (trigger) trigger.focus();\n else if (opener?.isConnected) opener.focus();\n opener = null;\n };\n const togglePanel = (): void => {\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n let suppressClick = false;\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n // A click that ended a drag must not also open the panel.\n if (suppressClick) { suppressClick = false; return; }\n togglePanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (ignoreDocClose) return;\n const path = e.composedPath();\n if (path.includes(panel)) return;\n if (trigger && path.includes(trigger)) return;\n if (wrapper && 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]), 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 // ─── Bounded nudge: user repositions the trigger within limits (#5) ──\n // An accessibility feature in itself — a user with a reduced visual field,\n // a screen magnifier, or left-handed reach can move the launcher out of\n // their way. Bounded so it can never be lost off-screen or buried.\n const NUDGE_KEY = `${storageKey}::pos`;\n const clampMax = (v: number): number => Math.max(-nudgeMax, Math.min(nudgeMax, v));\n let nudge = { x: 0, y: 0 };\n\n const loadNudge = (): void => {\n if (nudgeMax <= 0) return;\n try {\n const raw = localStorage.getItem(NUDGE_KEY);\n if (!raw) return;\n const p = JSON.parse(raw) as { x?: unknown; y?: unknown };\n if (typeof p?.x === 'number' && typeof p?.y === 'number') {\n nudge = { x: clampMax(p.x), y: clampMax(p.y) };\n }\n } catch { /* localStorage blocked / corrupt — ignore */ }\n };\n const saveNudge = (): void => {\n try {\n if (nudge.x === 0 && nudge.y === 0) localStorage.removeItem(NUDGE_KEY);\n else localStorage.setItem(NUDGE_KEY, JSON.stringify(nudge));\n } catch { /* fail silent */ }\n };\n const applyNudge = (): void => {\n // The `translate` property composes with the anchor's `transform`\n // (translateY(-50%) etc.) instead of overwriting it.\n if (wrapper) wrapper.style.translate = `${nudge.x}px ${nudge.y}px`;\n };\n // Clamp a tentative offset to ±max AND to the viewport, so the button never\n // leaves the screen regardless of anchor.\n const clampOffset = (x: number, y: number): { x: number; y: number } => {\n x = clampMax(x); y = clampMax(y);\n if (wrapper) {\n const r = wrapper.getBoundingClientRect();\n const pad = 4;\n const baseLeft = r.left - nudge.x;\n const baseTop = r.top - nudge.y;\n const vw = window.innerWidth || 0;\n const vh = window.innerHeight || 0;\n if (r.width > 0 && vw > 0) x = Math.max(pad - baseLeft, Math.min(vw - pad - r.width - baseLeft, x));\n if (r.height > 0 && vh > 0) y = Math.max(pad - baseTop, Math.min(vh - pad - r.height - baseTop, y));\n }\n return { x, y };\n };\n\n let dragStart: { px: number; py: number; ox: number; oy: number } | null = null;\n let didDrag = false;\n const DRAG_THRESHOLD = 4;\n const onPointerDown = (e: PointerEvent): void => {\n if (nudgeMax <= 0 || e.button !== 0) return;\n dragStart = { px: e.clientX, py: e.clientY, ox: nudge.x, oy: nudge.y };\n didDrag = false;\n trigger?.setPointerCapture?.(e.pointerId);\n };\n const onPointerMove = (e: PointerEvent): void => {\n if (!dragStart) return;\n const dx = e.clientX - dragStart.px;\n const dy = e.clientY - dragStart.py;\n if (!didDrag && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n didDrag = true;\n nudge = clampOffset(dragStart.ox + dx, dragStart.oy + dy);\n applyNudge();\n e.preventDefault();\n };\n const onPointerUp = (): void => {\n if (!dragStart) return;\n dragStart = null;\n if (didDrag) { saveNudge(); suppressClick = true; }\n };\n // Keyboard nudge — the accessible counterpart to drag (never drag-only on an\n // a11y control). Arrows move while the trigger is focused; Shift = fine step.\n const onTriggerKey = (e: KeyboardEvent): void => {\n if (nudgeMax <= 0) return;\n const step = e.shiftKey ? 1 : 10;\n let dx = 0; let dy = 0;\n if (e.key === 'ArrowLeft') dx = -step;\n else if (e.key === 'ArrowRight') dx = step;\n else if (e.key === 'ArrowUp') dy = -step;\n else if (e.key === 'ArrowDown') dy = step;\n else return;\n e.preventDefault();\n nudge = clampOffset(nudge.x + dx, nudge.y + dy);\n applyNudge();\n saveNudge();\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 if (nudgeMax > 0 && trigger) {\n loadNudge();\n applyNudge();\n // Affordance + let the drag own the gesture instead of the page scrolling.\n trigger.style.cursor = 'grab';\n trigger.style.touchAction = 'none';\n trigger.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n trigger.addEventListener('keydown', onTriggerKey);\n }\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n const dispose = (): void => {\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 trigger?.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n trigger?.removeEventListener('keydown', onTriggerKey);\n };\n\n return Object.assign(dispose, { open: openPanel, close: closePanel, toggle: togglePanel });\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/* Porthole preset: a brushed-metal ring framing the standard glyph. The glyph\n itself is untouched (discoverability), only the button gets the frame.\n Hosts wanting a bespoke frame can target ::part(trigger) from light DOM. */\n.oks-access-btn[data-trigger-icon=\"porthole\"] {\n box-shadow: 0 0 0 4px #b0bec5, 0 0 0 7px #546e7a, 0 6px 18px rgba(0,0,0,0.3);\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 (prefers-reduced-motion: reduce) {\n .oks-access-btn, .oks-access-panel, .oks-access-close,\n .oks-preset, .oks-access-opt { transition: none; }\n .oks-access-btn:hover { transform: scale(1); }\n .oks-preset.is-flashing { transform: none; }\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","// 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, type PanelController } from './behavior.js';\nimport { resolveEnabledControls } from './controls.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 = [\n 'locale', 'position', 'position-mobile', 'trigger-icon', 'storage-key',\n 'controls', 'exclude', 'trigger', 'effects-exclude', 'nudge', 'presets',\n] 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-center', 'top-right',\n 'mid-left', 'mid-center', 'mid-right',\n 'bottom-left', 'bottom-center', 'bottom-right',\n];\nconst VALID_ICONS: readonly TriggerIcon[] = ['vitruvian', 'wheelchair', 'eye', 'universal', 'porthole'];\n\nlet fxSeq = 0;\n\nexport class OksigeniaAccessPanelElement extends HTMLElement {\n static get observedAttributes(): readonly string[] {\n return OBSERVED;\n }\n\n private _controller: PanelController | null = null;\n private readonly _fxId = `oks-access-fx-${++fxSeq}`;\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._controller?.();\n this._controller = null;\n if (typeof document !== 'undefined') document.getElementById(this._fxId)?.remove();\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) this.render();\n }\n\n /** Imperative API (#2): open / close / toggle the panel from the host.\n * Useful with `trigger=\"none\"`, where the host drives its own button. */\n open(): void { this._controller?.open(); }\n close(): void { this._controller?.close(); }\n toggle(): void { this._controller?.toggle(); }\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 /** `nudge` (bare) ⇒ default 80px cap; `nudge=\"50\"` ⇒ 50; absent/invalid ⇒ off. */\n private getNudgeMax(): number {\n if (!this.hasAttribute('nudge')) return 0;\n const raw = this.getAttribute('nudge');\n if (raw == null || raw.trim() === '') return 80;\n const n = parseInt(raw, 10);\n return Number.isFinite(n) && n > 0 ? n : 0;\n }\n\n /** Inject the per-instance effects-exclude rule (#4): under high-contrast,\n * drop the destructive filter from selectors the host marks as essential\n * media (video, canvas, scientific imagery). Grayscale is handled by not\n * offering the control (curation), not here. */\n private updateEffectsExclude(): void {\n if (typeof document === 'undefined') return;\n const sel = (this.getAttribute('effects-exclude') ?? '')\n .split(',').map((s) => s.trim()).filter(Boolean);\n const existing = document.getElementById(this._fxId) as HTMLStyleElement | null;\n if (sel.length === 0) { existing?.remove(); return; }\n const style = existing ?? document.createElement('style');\n if (!existing) { style.id = this._fxId; document.head.appendChild(style); }\n const list = sel.join(', ');\n style.textContent =\n `body.oks-a11y-contrast :is(${list}), body.oks-a11y-contrast :is(${list}) * { filter: none !important; }`;\n }\n\n private render(): void {\n const shadow = this.shadowRoot;\n if (!shadow) return;\n this._controller?.();\n\n const position = this.getPosition();\n const positionMobile = this.getPositionMobile();\n const enabled = resolveEnabledControls(this.getAttribute('controls'), this.getAttribute('exclude'));\n const showTrigger = this.getAttribute('trigger') !== 'none';\n const showPresets = (this.getAttribute('presets') ?? '').trim().toLowerCase() !== 'none';\n\n const html = buildPanelHtml({\n t: getTranslation(this.getLocale()),\n triggerIcon: this.getTriggerIcon(),\n position,\n enabled,\n showTrigger,\n showPresets,\n });\n shadow.innerHTML = `<style>${PANEL_CSS}${positionCss(position, positionMobile)}</style>${html}`;\n this._controller = bindPanelBehavior(shadow, {\n storageKey: this.getAttribute('storage-key') ?? undefined,\n locale: this.getLocale(),\n enabled,\n nudgeMax: this.getNudgeMax(),\n });\n this.updateEffectsExclude();\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/controls.ts","../src/icons.ts","../src/render.ts","../src/state.ts","../src/translations.ts","../src/behavior.ts","../src/styles.ts","../src/web-component.ts"],"names":[],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;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;AAmPlB,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;AA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","file":"web-component.js","sourcesContent":["// Single source of truth for the panel's control catalogue.\n//\n// Each atomic control has a stable, human-readable id (the value the host\n// passes in `controls=` / `exclude=`). Render, behavior and the web component\n// all resolve curation against this registry so the three never drift.\n//\n// The ids are part of the public API — they are documented and used by hosts —\n// so treat renames as breaking.\n\nimport type { PanelState } from './state.js';\n\nexport type ControlId =\n | 'text-size'\n | 'line-height'\n | 'text-align'\n | 'readable-font'\n | 'dyslexia-font'\n | 'letter-spacing'\n | 'contrast'\n | 'grayscale'\n | 'hide-images'\n | 'highlight-links'\n | 'colorblind'\n | 'reading-guide'\n | 'reading-mask'\n | 'big-cursor'\n | 'big-targets'\n | 'pause-anim'\n | 'focus';\n\n/** Render order (also the order `exclude=`/`controls=` are validated against). */\nexport const ALL_CONTROLS: readonly ControlId[] = [\n 'text-size', 'line-height', 'text-align', 'readable-font', 'dyslexia-font', 'letter-spacing',\n 'contrast', 'grayscale', 'hide-images', 'highlight-links', 'colorblind',\n 'reading-guide', 'reading-mask', 'big-cursor', 'big-targets', 'pause-anim', 'focus',\n];\n\n/** Control id → the PanelState field it drives. */\nexport const CONTROL_STATE_KEY: Readonly<Record<ControlId, keyof PanelState>> = {\n 'text-size': 'zoom',\n 'line-height': 'lh',\n 'text-align': 'align',\n 'readable-font': 'font',\n 'dyslexia-font': 'dyslexia',\n 'letter-spacing': 'ls',\n 'contrast': 'contrast',\n 'grayscale': 'grayOverlay',\n 'hide-images': 'hideImages',\n 'highlight-links': 'highlightLinks',\n 'colorblind': 'colorblind',\n 'reading-guide': 'readingGuide',\n 'reading-mask': 'readingMask',\n 'big-cursor': 'bigCursor',\n 'big-targets': 'bigTargets',\n 'pause-anim': 'pauseAnim',\n 'focus': 'focusOutline',\n};\n\n/** Reverse of CONTROL_STATE_KEY, for mapping a preset's flags back to controls. */\nconst STATE_KEY_CONTROL = Object.fromEntries(\n Object.entries(CONTROL_STATE_KEY).map(([control, key]) => [key, control as ControlId]),\n) as Record<keyof PanelState, ControlId>;\n\nexport type PresetId = 'lowvision' | 'dyslexia' | 'motor' | 'calm';\n\n/** Preset profiles: set the listed flags, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nexport const PRESETS: Readonly<Record<PresetId, 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 const PRESET_IDS: readonly PresetId[] = ['lowvision', 'dyslexia', 'motor', 'calm'];\n\n/** Control ids a preset touches (used to hide/recompose it under curation). */\nexport function presetControlIds(id: PresetId): ControlId[] {\n return Object.keys(PRESETS[id]).map((k) => STATE_KEY_CONTROL[k as keyof PanelState]);\n}\n\n/**\n * Resolve which controls an instance offers from its `controls=` (whitelist)\n * and `exclude=` (blacklist) attributes. Both optional; unknown ids ignored.\n * No attributes ⇒ all 17 (current behavior).\n */\nexport function resolveEnabledControls(\n controlsAttr?: string | null,\n excludeAttr?: string | null,\n): Set<ControlId> {\n const valid = new Set(ALL_CONTROLS);\n const parse = (raw: string | null | undefined): ControlId[] =>\n (raw ?? '')\n .split(',')\n .map((s) => s.trim().toLowerCase() as ControlId)\n .filter((s) => valid.has(s));\n\n const whitelist = controlsAttr != null ? parse(controlsAttr) : null;\n let enabled = whitelist && whitelist.length > 0 ? new Set(whitelist) : new Set(ALL_CONTROLS);\n\n if (excludeAttr != null) {\n for (const id of parse(excludeAttr)) enabled.delete(id);\n }\n return enabled;\n}\n\n/**\n * Controls that cannot be confined to a container (`scope=`): the full-screen\n * overlays (grayscale, reading guide, reading mask), the colour-blind root\n * `filter` on `<html>`, and the window-level big cursor. A scoped instance\n * auto-excludes these — a per-pane panel only offers what it can regionalise.\n */\nexport const NON_SCOPABLE_CONTROLS: readonly ControlId[] = [\n 'grayscale', 'reading-guide', 'reading-mask', 'big-cursor', 'colorblind',\n];\n\n/** Remove the non-scopable controls from an enabled set (scoped mode). */\nexport function scopedControls(enabled: Set<ControlId>): Set<ControlId> {\n const out = new Set(enabled);\n for (const id of NON_SCOPABLE_CONTROLS) out.delete(id);\n return out;\n}\n\n/**\n * Recompose a preset for a curated instance: keep only the flags whose control\n * is still offered. The open design point Bentos flagged — a preset in a window\n * that excludes its controls (e.g. \"dyslexia\" where the dyslexia font and\n * reading guide are gone) collapses to whatever it can still legitimately set,\n * and is hidden entirely (see `presetIsAvailable`) when nothing remains.\n */\nexport function filterPresetForEnabled(\n id: PresetId,\n enabled: Set<ControlId>,\n): Partial<PanelState> {\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(PRESETS[id]) as Array<[keyof PanelState, never]>) {\n if (enabled.has(STATE_KEY_CONTROL[k])) out[k] = v;\n }\n return out;\n}\n\n/**\n * A preset shows only if it still bundles **two or more** controls after\n * curation. A profile is a combination — one that collapses to a single\n * control is redundant with that control's own button, so it is hidden.\n */\nexport function presetIsAvailable(id: PresetId, enabled: Set<ControlId>): boolean {\n return presetControlIds(id).filter((c) => enabled.has(c)).length >= 2;\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// Iconos del botón flotante. `porthole` reutiliza el glifo universal de\n// accesibilidad (persona) y le añade un aro de ojo de buey por CSS — el glifo\n// estándar NUNCA se sustituye, solo se enmarca (a11y: preserva la\n// descubribilidad por convención).\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal' | 'porthole';\n\nconst UNIVERSAL_GLYPH = '<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\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: UNIVERSAL_GLYPH,\n porthole: UNIVERSAL_GLYPH,\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 ALL_CONTROLS, PRESET_IDS, presetIsAvailable,\n type ControlId, type PresetId,\n} from './controls.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 =\n | 'top-left' | 'top-center' | 'top-right'\n | 'mid-left' | 'mid-center' | 'mid-right'\n | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n /** Controls offered by this instance. Defaults to all 17. */\n enabled?: Set<ControlId>;\n /** Render the floating trigger button. `false` for host-driven mode\n * (`trigger=\"none\"`): the panel renders without its launcher and the host\n * opens it via `.open()`. Defaults to true. */\n showTrigger?: boolean;\n /** Render the profile presets row. `false` (`presets=\"none\"`) drops it\n * entirely. Defaults to true; individual presets still self-hide under the\n * ≥2-control rule. */\n showPresets?: boolean;\n}\n\nconst PRESET_ICON: Record<PresetId, string> = {\n lowvision: ICON_CONTRAST,\n dyslexia: ICON_DYSLEXIA,\n motor: ICON_CURSOR,\n calm: ICON_HIDE,\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 enabled = opts.enabled ?? new Set(ALL_CONTROLS);\n const showTrigger = opts.showTrigger ?? true;\n const showPresets = opts.showPresets ?? true;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n // Each control helper emits its button only when the instance offers it\n // (#1 curation). A control id is stamped as data-control so behavior and\n // tests can resolve it back to the registry.\n const multi = (id: ControlId, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n if (!enabled.has(id)) return '';\n const action = id === 'colorblind' ? 'colorblind' : 'multi';\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-control=\"${id}\" 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 = (id: ControlId, klass: string, label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" 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 };\n const overlay = (id: ControlId, target: string, label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"overlay\" data-target=\"${target}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const simple = (id: ControlId, action: 'guide' | 'mask', label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"${action}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const preset = (id: PresetId, label: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" type=\"button\"><span class=\"oks-icon\">${PRESET_ICON[id]}</span><span class=\"oks-label\">${label}</span></button>`;\n\n // A section renders its heading only when it has at least one control —\n // otherwise a curated instance leaves orphan \"TEXT\" / \"VISUAL\" titles.\n const section = (title: string, rows: string[]): string => {\n const kept = rows.filter(Boolean);\n if (kept.length === 0) return '';\n return `<h4 class=\"oks-access-title\">${escapeHtml(title)}</h4><div class=\"oks-access-grid\">${kept.join('')}</div>`;\n };\n\n const presetLabels: Record<PresetId, string> = {\n lowvision: t.pLow, dyslexia: t.pDys, motor: t.pMot, calm: t.pCalm,\n };\n const presetButtons = showPresets\n ? PRESET_IDS.filter((id) => presetIsAvailable(id, enabled)).map((id) => preset(id, presetLabels[id]))\n : [];\n const presetsBlock = presetButtons.length\n ? `<h4 class=\"oks-access-title\">${escapeHtml(t.presets)}</h4><div class=\"oks-access-presets\">${presetButtons.join('')}</div>`\n : '';\n\n const triggerBlock = showTrigger ? `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" part=\"trigger\" data-trigger-icon=\"${triggerIcon}\" 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\n return `${triggerBlock}\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 ${presetsBlock}\n ${section(t.txt, [\n multi('text-size', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('line-height', 'oks-lh', 3, t.lh, ICON_LH),\n multi('text-align', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('readable-font', 'oks-a11y-font', t.font, ICON_FONT),\n toggle('dyslexia-font', 'oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('letter-spacing', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n ${section(t.vis, [\n toggle('contrast', 'oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('grayscale', 'oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('hide-images', 'oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('highlight-links', 'oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n ${section(t.ori, [\n simple('reading-guide', 'guide', t.guide, ICON_GUIDE),\n simple('reading-mask', 'mask', t.mask, ICON_MASK),\n toggle('big-cursor', 'oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('big-targets', 'oks-a11y-bigtargets', t.targets, ICON_TARGETS),\n toggle('pause-anim', 'oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('focus', 'oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&', '<': '<', '>': '>', '\"': '"',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, ''');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-center': return { wrap: 'top: 20px; left: 50%; transform: translateX(-50%);', panel: 'top: 80px; left: 50%; transform: translateX(-50%);' };\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-center': return { wrap: 'top: 50%; left: 50%; transform: translate(-50%, -50%);', panel: 'top: 50%; left: 50%; transform: translate(-50%, -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-center': return { wrap: 'bottom: 20px; left: 50%; transform: translateX(-50%);', panel: 'bottom: 100px; left: 50%; transform: translateX(-50%);' };\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","// 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 /** aria-label de un control multinivel activo: (etiqueta, nivel n, máximo m).\n * Solo se aplica cuando n > 0; en n = 0 el botón usa su etiqueta a secas. */\n level: (label: string, n: number, m: number) => 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.', level: (l, n, m) => `${l}, nivel ${n} de ${m}` },\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.', level: (l, n, m) => `${l}, level ${n} of ${m}` },\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', level: (l, n, m) => `${l}, ${n}/${m}` },\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.', level: (l, n, m) => `${l}, niveau ${n} sur ${m}` },\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.', level: (l, n, m) => `${l}, livello ${n} di ${m}` },\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.', level: (l, n, m) => `${l}, Stufe ${n} von ${m}` },\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.', level: (l, n, m) => `${l}, niveau ${n} van ${m}` },\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.', level: (l, n, m) => `${l}, nivå ${n} av ${m}` },\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","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\nimport { getTranslation } from './translations.js';\nimport {\n ALL_CONTROLS, PRESETS, filterPresetForEnabled, type ControlId, type PresetId,\n} from './controls.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\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n /** Locale para los aria-label dinámicos (nivel de los multinivel). Default en. */\n locale?: string;\n /** Controles que ofrece esta instancia (#1). Default: los 17. Filtra qué\n * flags puede aplicar un perfil. */\n enabled?: Set<ControlId>;\n /** Desplazamiento máximo del usuario para el trigger en px (#5). 0/ausente\n * desactiva el nudge (comportamiento actual). */\n nudgeMax?: number;\n /** Contenedor al que confinar los efectos (`scope=`). Si se pasa, las clases\n * scopables van a este elemento en vez de a `body`, y los efectos no\n * regionalizables (overlays, daltonismo, cursor) no se aplican. */\n scopeEl?: HTMLElement | null;\n}\n\n/** Dispose function with imperative open/close/toggle attached (#2). Calling\n * the value disposes; the methods drive the panel host-side. */\nexport interface PanelController {\n (): void;\n open(): void;\n close(): void;\n toggle(): void;\n}\n\nfunction noopController(): PanelController {\n return Object.assign(() => {}, { open() {}, close() {}, toggle() {} });\n}\n\n/** Deepest focused element, crossing shadow boundaries — so we can restore\n * focus to whatever opened the panel (the host's own button in trigger=\"none\"\n * mode, the floating trigger otherwise). */\nfunction deepActiveElement(): HTMLElement | null {\n let a = document.activeElement as HTMLElement | null;\n while (a?.shadowRoot?.activeElement) a = a.shadowRoot.activeElement as HTMLElement;\n return a;\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 PanelController:\n * invocarlo limpia; sus métodos abren/cierran el panel.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): PanelController {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const t = getTranslation(opts.locale ?? 'en');\n const enabled = opts.enabled ?? new Set(ALL_CONTROLS);\n const nudgeMax = Math.max(0, opts.nudgeMax ?? 0);\n\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 // trigger + wrapper are optional (trigger=\"none\" host-driven mode); the\n // panel itself and its close/reset are required.\n if (!panel || !closeBtn || !resetBtn) {\n return noopController();\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n function applyState(): void {\n // `scopeEl === undefined` → global mode (apply to body). Defined (element or\n // null) → scoped: apply scopable effects to that element, never to body. If\n // the scope element is missing (null), the effects simply no-op rather than\n // leaking to body.\n const scoped = opts.scopeEl !== undefined;\n const fxRoot: HTMLElement | null = scoped ? (opts.scopeEl ?? null) : document.body;\n const rootEl = document.documentElement;\n if (fxRoot) {\n for (const cls of Array.from(fxRoot.classList)) {\n if (cls.startsWith('oks-')) fxRoot.classList.remove(cls);\n }\n }\n if (!scoped) [1, 2, 3].forEach((l) => rootEl.classList.remove(`oks-colorblind-${l}`));\n\n if (fxRoot) {\n if (state.zoom > 0) fxRoot.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) fxRoot.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) fxRoot.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) fxRoot.classList.add(`oks-ls-${state.ls}`);\n if (state.font) fxRoot.classList.add('oks-a11y-font');\n if (state.dyslexia) fxRoot.classList.add('oks-dyslexia');\n if (state.contrast) fxRoot.classList.add('oks-a11y-contrast');\n if (state.hideImages) fxRoot.classList.add('oks-a11y-hide');\n if (state.highlightLinks) fxRoot.classList.add('oks-a11y-links');\n if (state.pauseAnim) fxRoot.classList.add('oks-a11y-pause');\n if (state.focusOutline) fxRoot.classList.add('oks-a11y-focus');\n if (state.bigTargets) fxRoot.classList.add('oks-a11y-bigtargets');\n }\n\n // Non-scopable effects apply only in global mode (auto-excluded when scoped).\n if (!scoped) {\n if (state.colorblind > 0) rootEl.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.bigCursor) document.body.classList.add('oks-big-cursor');\n if (state.readingGuide) document.body.classList.add('oks-a11y-guide');\n if (state.readingMask) document.body.classList.add('oks-a11y-mask');\n ensureOverlay().classList.toggle('is-active', state.grayOverlay);\n }\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 const max = parseInt(btn.getAttribute('data-levels') ?? '0', 10);\n const lbl = btn.querySelector('.oks-label')?.textContent?.trim() ?? '';\n if (lvl > 0 && max > 0) btn.setAttribute('aria-label', t.level(lbl, lvl, max));\n else btn.removeAttribute('aria-label');\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 }\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 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') as PresetId | null;\n // Recompose the preset to the controls this instance still offers (#1):\n // a profile never sets a flag the user can't see or undo here.\n if (id && PRESETS[id]) Object.assign(state, filterPresetForEnabled(id, enabled));\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 // ─── Open / close (also exposed imperatively, #2) ───────────────\n let opener: HTMLElement | null = null;\n // When the host opens us from its own button (trigger=\"none\"), that click\n // keeps bubbling to document, where onDocClick would treat it as an\n // outside-click and close us in the same gesture. Ignore the doc-click for\n // the current event-loop turn after opening.\n let ignoreDocClose = false;\n\n // In scoped mode the dialog anchors to its container (over the pane's top),\n // not to a shared viewport corner — otherwise several scoped panels open in\n // the same spot and read as one. Computed from the scope's box on open and\n // kept in place while open (scroll/resize).\n const positionScopedDialog = (): void => {\n const el = opts.scopeEl;\n if (!el) return;\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return; // not laid out yet\n const pad = 8;\n panel.style.top = `${Math.max(pad, r.top + pad)}px`;\n panel.style.bottom = 'auto';\n panel.style.left = `${r.left + r.width / 2}px`;\n panel.style.right = 'auto';\n panel.style.transform = 'translateX(-50%)';\n };\n\n const openPanel = (): void => {\n if (panel.classList.contains('is-open')) return;\n opener = deepActiveElement();\n panel.classList.add('is-open');\n panel.removeAttribute('inert');\n if (opts.scopeEl) positionScopedDialog();\n trigger?.setAttribute('aria-expanded', 'true');\n ignoreDocClose = true;\n setTimeout(() => { ignoreDocClose = false; }, 0);\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n if (!panel.classList.contains('is-open')) return;\n panel.classList.remove('is-open');\n panel.setAttribute('inert', '');\n trigger?.setAttribute('aria-expanded', 'false');\n // Restore focus to the trigger, or to whatever opened us host-side.\n if (trigger) trigger.focus();\n else if (opener?.isConnected) opener.focus();\n opener = null;\n };\n const togglePanel = (): void => {\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n let suppressClick = false;\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n // A click that ended a drag must not also open the panel.\n if (suppressClick) { suppressClick = false; return; }\n togglePanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (ignoreDocClose) return;\n const path = e.composedPath();\n if (path.includes(panel)) return;\n if (trigger && path.includes(trigger)) return;\n if (wrapper && 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]), 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 // ─── Bounded nudge: user repositions the trigger within limits (#5) ──\n // An accessibility feature in itself — a user with a reduced visual field,\n // a screen magnifier, or left-handed reach can move the launcher out of\n // their way. Bounded so it can never be lost off-screen or buried.\n const NUDGE_KEY = `${storageKey}::pos`;\n const clampMax = (v: number): number => Math.max(-nudgeMax, Math.min(nudgeMax, v));\n let nudge = { x: 0, y: 0 };\n\n const loadNudge = (): void => {\n if (nudgeMax <= 0) return;\n try {\n const raw = localStorage.getItem(NUDGE_KEY);\n if (!raw) return;\n const p = JSON.parse(raw) as { x?: unknown; y?: unknown };\n if (typeof p?.x === 'number' && typeof p?.y === 'number') {\n nudge = { x: clampMax(p.x), y: clampMax(p.y) };\n }\n } catch { /* localStorage blocked / corrupt — ignore */ }\n };\n const saveNudge = (): void => {\n try {\n if (nudge.x === 0 && nudge.y === 0) localStorage.removeItem(NUDGE_KEY);\n else localStorage.setItem(NUDGE_KEY, JSON.stringify(nudge));\n } catch { /* fail silent */ }\n };\n const applyNudge = (): void => {\n // The `translate` property composes with the anchor's `transform`\n // (translateY(-50%) etc.) instead of overwriting it.\n if (wrapper) wrapper.style.translate = `${nudge.x}px ${nudge.y}px`;\n };\n // Clamp a tentative offset to ±max AND to the viewport, so the button never\n // leaves the screen regardless of anchor.\n const clampOffset = (x: number, y: number): { x: number; y: number } => {\n x = clampMax(x); y = clampMax(y);\n if (wrapper) {\n const r = wrapper.getBoundingClientRect();\n const pad = 4;\n const baseLeft = r.left - nudge.x;\n const baseTop = r.top - nudge.y;\n const vw = window.innerWidth || 0;\n const vh = window.innerHeight || 0;\n if (r.width > 0 && vw > 0) x = Math.max(pad - baseLeft, Math.min(vw - pad - r.width - baseLeft, x));\n if (r.height > 0 && vh > 0) y = Math.max(pad - baseTop, Math.min(vh - pad - r.height - baseTop, y));\n }\n return { x, y };\n };\n\n let dragStart: { px: number; py: number; ox: number; oy: number } | null = null;\n let didDrag = false;\n const DRAG_THRESHOLD = 4;\n const onPointerDown = (e: PointerEvent): void => {\n if (nudgeMax <= 0 || e.button !== 0) return;\n dragStart = { px: e.clientX, py: e.clientY, ox: nudge.x, oy: nudge.y };\n didDrag = false;\n trigger?.setPointerCapture?.(e.pointerId);\n };\n const onPointerMove = (e: PointerEvent): void => {\n if (!dragStart) return;\n const dx = e.clientX - dragStart.px;\n const dy = e.clientY - dragStart.py;\n if (!didDrag && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n didDrag = true;\n nudge = clampOffset(dragStart.ox + dx, dragStart.oy + dy);\n applyNudge();\n e.preventDefault();\n };\n const onPointerUp = (): void => {\n if (!dragStart) return;\n dragStart = null;\n if (didDrag) { saveNudge(); suppressClick = true; }\n };\n // Keyboard nudge — the accessible counterpart to drag (never drag-only on an\n // a11y control). Arrows move while the trigger is focused; Shift = fine step.\n const onTriggerKey = (e: KeyboardEvent): void => {\n if (nudgeMax <= 0) return;\n const step = e.shiftKey ? 1 : 10;\n let dx = 0; let dy = 0;\n if (e.key === 'ArrowLeft') dx = -step;\n else if (e.key === 'ArrowRight') dx = step;\n else if (e.key === 'ArrowUp') dy = -step;\n else if (e.key === 'ArrowDown') dy = step;\n else return;\n e.preventDefault();\n nudge = clampOffset(nudge.x + dx, nudge.y + dy);\n applyNudge();\n saveNudge();\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 // Keep the scoped dialog anchored to its pane while open.\n const onReposition = (): void => {\n if (opts.scopeEl && panel.classList.contains('is-open')) positionScopedDialog();\n };\n if (opts.scopeEl !== undefined) {\n window.addEventListener('scroll', onReposition, true);\n window.addEventListener('resize', onReposition);\n }\n\n if (nudgeMax > 0 && trigger) {\n loadNudge();\n applyNudge();\n // Affordance + let the drag own the gesture instead of the page scrolling.\n trigger.style.cursor = 'grab';\n trigger.style.touchAction = 'none';\n trigger.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n trigger.addEventListener('keydown', onTriggerKey);\n }\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n const dispose = (): void => {\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 if (opts.scopeEl !== undefined) {\n window.removeEventListener('scroll', onReposition, true);\n window.removeEventListener('resize', onReposition);\n }\n trigger?.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n trigger?.removeEventListener('keydown', onTriggerKey);\n };\n\n return Object.assign(dispose, { open: openPanel, close: closePanel, toggle: togglePanel });\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/* Porthole preset: a brushed-metal ring framing the standard glyph. The glyph\n itself is untouched (discoverability), only the button gets the frame.\n Hosts wanting a bespoke frame can target ::part(trigger) from light DOM. */\n.oks-access-btn[data-trigger-icon=\"porthole\"] {\n box-shadow: 0 0 0 4px #b0bec5, 0 0 0 7px #546e7a, 0 6px 18px rgba(0,0,0,0.3);\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 (prefers-reduced-motion: reduce) {\n .oks-access-btn, .oks-access-panel, .oks-access-close,\n .oks-preset, .oks-access-opt { transition: none; }\n .oks-access-btn:hover { transform: scale(1); }\n .oks-preset.is-flashing { transform: none; }\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\n/**\n * Scoped-mode effect CSS (#scope). Emits only the controls that can be confined\n * to a container by selector — the same rules as EFFECT_CSS but anchored to the\n * scope element instead of `body`. The non-scopable effects (colour-blind, which\n * is a `filter` on `<html>`; the full-screen overlays grayscale / reading guide /\n * reading mask; and big cursor) are NOT here — a scoped instance auto-excludes\n * those controls, so they never appear in a per-pane panel.\n *\n * Text size scopes as the container's `font-size`, so it scales `em`/inherited\n * text inside the pane but not `rem` (which is always relative to `<html>` —\n * there is no CSS way to anchor rem to a container). Hosts that want per-pane\n * text scaling size that pane's text in `em`.\n *\n * `s` is a host-provided CSS selector (e.g. `#map-pane`), trusted like the\n * effects-exclude value.\n */\nexport function scopedEffectCss(s: string): string {\n return `\n${s}.oks-zoom-1 { font-size: 110% !important; }\n${s}.oks-zoom-2 { font-size: 120% !important; }\n${s}.oks-zoom-3 { font-size: 135% !important; }\n${s}.oks-zoom-4 { font-size: 150% !important; }\n\n${s}.oks-lh-1 * { line-height: 1.6 !important; }\n${s}.oks-lh-2 * { line-height: 1.9 !important; }\n${s}.oks-lh-3 * { line-height: 2.2 !important; }\n\n${s}.oks-a11y-font, ${s}.oks-a11y-font * { font-family: Arial, sans-serif !important; }\n\n${s}.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\n${s}.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\n${s}.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\n${s}.oks-align-1 * { text-align: left !important; }\n${s}.oks-align-2 * { text-align: center !important; }\n${s}.oks-align-3 * { text-align: right !important; }\n\n${s}.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\n${s}.oks-ls-1 * { letter-spacing: 0.05em !important; }\n${s}.oks-ls-2 * { letter-spacing: 0.10em !important; }\n${s}.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\n${s}.oks-a11y-focus a,\n${s}.oks-a11y-focus button,\n${s}.oks-a11y-focus input,\n${s}.oks-a11y-focus select,\n${s}.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\n${s}.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\n${s}.oks-a11y-contrast, ${s}.oks-a11y-contrast * {\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}\n${s}.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\n${s}.oks-a11y-contrast a { color: #0ff !important; text-decoration: underline !important; }\n${s}.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${s}.oks-a11y-bigtargets a,\n${s}.oks-a11y-bigtargets button,\n${s}.oks-a11y-bigtargets [role=\"button\"],\n${s}.oks-a11y-bigtargets input[type=\"checkbox\"],\n${s}.oks-a11y-bigtargets input[type=\"radio\"],\n${s}.oks-a11y-bigtargets summary {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\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, type PanelController } from './behavior.js';\nimport { resolveEnabledControls, scopedControls } from './controls.js';\nimport { PANEL_CSS, EFFECT_CSS, scopedEffectCss } from './styles.js';\nimport { COLORBLIND_FILTERS_SVG } from './icons.js';\nimport { getTranslation } from './translations.js';\nimport type { TriggerIcon } from './icons.js';\n\nconst OBSERVED = [\n 'locale', 'position', 'position-mobile', 'trigger-icon', 'storage-key',\n 'controls', 'exclude', 'trigger', 'effects-exclude', 'nudge', 'presets', 'scope',\n] 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-center', 'top-right',\n 'mid-left', 'mid-center', 'mid-right',\n 'bottom-left', 'bottom-center', 'bottom-right',\n];\nconst VALID_ICONS: readonly TriggerIcon[] = ['vitruvian', 'wheelchair', 'eye', 'universal', 'porthole'];\n\nlet fxSeq = 0;\n\nexport class OksigeniaAccessPanelElement extends HTMLElement {\n static get observedAttributes(): readonly string[] {\n return OBSERVED;\n }\n\n private _controller: PanelController | null = null;\n private readonly _fxId = `oks-access-fx-${++fxSeq}`;\n private readonly _scopeId = `oks-access-scope-${this._fxId.split('-').pop()}`;\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._controller?.();\n this._controller = null;\n if (typeof document !== 'undefined') {\n document.getElementById(this._fxId)?.remove();\n document.getElementById(this._scopeId)?.remove();\n }\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) this.render();\n }\n\n /** Imperative API (#2): open / close / toggle the panel from the host.\n * Useful with `trigger=\"none\"`, where the host drives its own button. */\n open(): void { this._controller?.open(); }\n close(): void { this._controller?.close(); }\n toggle(): void { this._controller?.toggle(); }\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 /** `nudge` (bare) ⇒ default 80px cap; `nudge=\"50\"` ⇒ 50; absent/invalid ⇒ off. */\n private getNudgeMax(): number {\n if (!this.hasAttribute('nudge')) return 0;\n const raw = this.getAttribute('nudge');\n if (raw == null || raw.trim() === '') return 80;\n const n = parseInt(raw, 10);\n return Number.isFinite(n) && n > 0 ? n : 0;\n }\n\n /** Inject the per-instance effects-exclude rule (#4): under high-contrast,\n * drop the destructive filter from selectors the host marks as essential\n * media (video, canvas, scientific imagery). Grayscale is handled by not\n * offering the control (curation), not here. */\n private updateEffectsExclude(base: string): void {\n if (typeof document === 'undefined') return;\n const sel = (this.getAttribute('effects-exclude') ?? '')\n .split(',').map((s) => s.trim()).filter(Boolean);\n const existing = document.getElementById(this._fxId) as HTMLStyleElement | null;\n if (sel.length === 0) { existing?.remove(); return; }\n const style = existing ?? document.createElement('style');\n if (!existing) { style.id = this._fxId; document.head.appendChild(style); }\n const list = sel.join(', ');\n style.textContent =\n `${base}.oks-a11y-contrast :is(${list}), ${base}.oks-a11y-contrast :is(${list}) * { filter: none !important; }`;\n }\n\n /** Inject the per-instance scoped effect CSS (`scope=`): the scopable effects\n * anchored to the host's container instead of `body`, so several panels\n * regionalise their own zone without clobbering each other. */\n private updateScopeStyle(scope: string | null): void {\n if (typeof document === 'undefined') return;\n const existing = document.getElementById(this._scopeId) as HTMLStyleElement | null;\n if (!scope) { existing?.remove(); return; }\n const style = existing ?? document.createElement('style');\n if (!existing) { style.id = this._scopeId; document.head.appendChild(style); }\n style.textContent = scopedEffectCss(scope);\n }\n\n private render(): void {\n const shadow = this.shadowRoot;\n if (!shadow) return;\n this._controller?.();\n\n const position = this.getPosition();\n const positionMobile = this.getPositionMobile();\n const scope = this.getAttribute('scope')?.trim() || null;\n // Scoped instances drop the non-regionalisable controls (overlays, colour-\n // blind root filter, big cursor) — a per-pane panel only offers what it\n // can confine.\n let enabled = resolveEnabledControls(this.getAttribute('controls'), this.getAttribute('exclude'));\n if (scope) enabled = scopedControls(enabled);\n const showTrigger = this.getAttribute('trigger') !== 'none';\n const showPresets = (this.getAttribute('presets') ?? '').trim().toLowerCase() !== 'none';\n\n const html = buildPanelHtml({\n t: getTranslation(this.getLocale()),\n triggerIcon: this.getTriggerIcon(),\n position,\n enabled,\n showTrigger,\n showPresets,\n });\n shadow.innerHTML = `<style>${PANEL_CSS}${positionCss(position, positionMobile)}</style>${html}`;\n // undefined ⇒ global mode; element|null ⇒ scoped (null = scope not found yet,\n // effects no-op rather than leaking to body).\n const scopeEl = scope ? (document.querySelector(scope) as HTMLElement | null) : undefined;\n this._controller = bindPanelBehavior(shadow, {\n storageKey: this.getAttribute('storage-key') ?? undefined,\n locale: this.getLocale(),\n enabled,\n nudgeMax: this.getNudgeMax(),\n scopeEl,\n });\n this.updateScopeStyle(scope);\n this.updateEffectsExclude(scope ?? 'body');\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"]}
|