@oksigenia/access-panel 0.4.0 → 0.4.2

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 ADDED
@@ -0,0 +1,120 @@
1
+ # @oksigenia/access-panel
2
+
3
+ ## 0.4.2
4
+
5
+ ### Patch Changes
6
+
7
+ Fix `aria-hidden-focus` (axe / Lighthouse, severity *serious*): while closed, `#oks-panel` kept `aria-hidden="true"` but still held ~24 focusable controls (buttons, inputs, `[tabindex]`). An `aria-hidden` element with focusable descendants is a violation — a keyboard or screen-reader user can land "inside" something hidden from assistive tech — and it contradicted the `aria-modal="true"` on the same element.
8
+
9
+ The closed state now uses the `inert` attribute instead of `aria-hidden`. `inert` removes the panel from both the tab order and the accessibility tree, so its controls are genuinely unreachable while closed, and the `aria-modal`/`aria-hidden` contradiction is gone. On open we `removeAttribute('inert')`; on close we `setAttribute('inert', '')` before returning focus to the trigger. The dialog pattern (focus moves in on open, Esc closes, focus returns to the trigger, Tab is trapped while open) was already in place and is unchanged.
10
+
11
+ `inert` is supported in Chrome/Edge 102+, Firefox 112+ and Safari 15.5+. No API change.
12
+
13
+ ## 0.4.1
14
+
15
+ ### Patch Changes
16
+
17
+ Include `CHANGELOG.md` in the published npm tarball. The `files` array in
18
+ `package.json` was an allow-list that excluded the changelog, so consumers
19
+ using `npm view` or reading their installed `node_modules` had no
20
+ visibility into release notes. Pure packaging fix — no runtime change.
21
+
22
+ ## 0.4.0
23
+
24
+ ### Minor Changes
25
+
26
+ - 8d395a3: Add **reading mask** (dark overlay that follows the cursor with a lit reading band, complementary to the existing reading guide), **big targets** (boosts interactive hit-area to 44×44 minimum per WCAG 2.5.5/2.5.8 with `padding` + `min-*` only, no layout-breaking `display` changes), and **4 additive profile presets** (low vision, dyslexia, motor, no distractions) that bundle related toggles in one click. Presets are triggers, not modes — they apply flags and let the user adjust afterwards; a 250 ms flash gives click feedback without a persistent active state.
27
+
28
+ Also fixes a latent Shadow DOM event-target bug in the document-level "click outside the panel" handler. `panel.contains(e.target)` returned `false` for any click originating inside the panel because the target is retargeted to the host element when the event crosses the shadow boundary. Replaced with `e.composedPath()` which is shadow-aware, so the panel no longer closes spuriously on its own button clicks.
29
+
30
+ New fields in `PanelState` (`readingMask`, `bigTargets`), new translation keys for all 8 locales (`mask`, `targets`, `presets`, `pLow`, `pDys`, `pMot`, `pCalm`), and two new SVG icons (`ICON_MASK`, `ICON_TARGETS`).
31
+
32
+ ## 0.3.8
33
+
34
+ ### Patch Changes
35
+
36
+ Mobile panel densified and big-cursor option hidden on touch devices. The WP plugin already did this; the web component lagged behind. Three concrete changes inside the `@media (max-width: 768px)` block:
37
+
38
+ - `.oks-access-opt[data-class="oks-big-cursor"] { display: none; }` — the option only makes sense with a mouse; `pointer: coarse` devices never see it.
39
+ - `.oks-access-opt[data-class="oks-a11y-focus"] { grid-column: span 2; }` — fills the gap left by the hidden cursor button so the grid stays even.
40
+ - Compacted spacing: `min-height` 88 → 72 px (still well above the 44×44 minimum from WCAG 2.5.5), padding 14/8 → 10/8, gap 10 → 8, icons 30 → 26, content padding 16/24 → 14/20, section titles 14/6 → 10/4. Result: all 14 controls fit one screen on common mobile viewports (~640-844 px high) without scrolling.
41
+
42
+ ## 0.3.7
43
+
44
+ ### Patch Changes
45
+
46
+ Real fix for the mobile panel overflow reported on granjaoga.com. The grid `minmax(0, 1fr)` change in 0.3.6 was a red herring — the actual cause was in `positionCss()`. Dynamic position rules (`top: 50%; left: 90px; transform: translateY(-50%)` for `position="mid-left"`, etc.) were injected into the Shadow DOM **after** the mobile `@media (max-width: 768px)` block that puts the panel fullscreen. The dynamic rules sat at the bottom of the stylesheet, so they overrode `top`, `left`, `transform` on mobile too, leaving the panel `width: 100%` but anchored at `left: 90px` — clipping its right side by 90px on narrow viewports. Position rules for `.oks-access-panel` now live inside `@media (min-width: 769px)` so they only apply on desktop. Wrapper (trigger button) rules are unaffected.
47
+
48
+ ## 0.3.6
49
+
50
+ ### Patch Changes
51
+
52
+ Mobile responsive fix: the option grid (`.oks-access-grid`) used `grid-template-columns: 1fr 1fr`, which lets each column grow to its min-content. On narrow viewports, long labels (FUENTE DISLEXIA, LINKS DESTACADOS, INTERLINEADO) pushed the second column off-screen — the right half of the panel was clipped on mobile. Switched to `minmax(0, 1fr) minmax(0, 1fr)`, added `min-width: 0` on `.oks-access-opt` and `overflow-wrap: anywhere; word-break: break-word;` on `.oks-label`. The panel now fits the viewport on every device.
53
+
54
+ ## 0.3.5
55
+
56
+ ### Patch Changes
57
+
58
+ First release published via **npm Trusted Publishing (GitHub Actions OIDC)** instead of a long-lived publish token. Same code as 0.3.4 — this bump exists to validate the OIDC-based publish workflow. The published tarball ships with an [npm provenance attestation](https://docs.npmjs.com/generating-provenance-statements) that links the package back to the exact commit + workflow run that produced it (verifiable in the [sigstore transparency log](https://search.sigstore.dev/)).
59
+
60
+ ## 0.3.4
61
+
62
+ ### Patch Changes
63
+
64
+ - Fix: text-size levels had no visible effect on sites whose CSS sizes things in `rem` (anchored to `<html>`).
65
+
66
+ The 0.3.3 fix moved `oks-zoom-*` from the universal selector to `<body>` with percent values, which only moves descendants that inherit `font-size` from `<body>`. Sites whose CSS uses `rem` (anchored to `<html>`) saw no change at all.
67
+
68
+ Anchor the change at `<html>` via `:has(body.oks-zoom-N)` so the root font-size updates once and every `rem` descendant scales cleanly. No compounding, no missed descendants, hard-coded `px` intentionally left alone.
69
+
70
+ `:has()` is supported in Chrome 105+, Safari 15.4+ and Firefox 121+.
71
+
72
+ ## 0.3.3
73
+
74
+ ### Patch Changes
75
+
76
+ Re-publish of the same content shipped as 0.3.2 below — the 0.3.2 tarball on
77
+ the npm registry went out without the `dist/` directory because the local
78
+ build had errored just before `npm pack` (a stray backtick inside a template
79
+ literal made `tsup` fail) and the publish proceeded anyway. **Do not use
80
+ 0.3.2** — it is missing all compiled output. Use 0.3.3.
81
+
82
+ ## 0.3.2 (broken — DO NOT USE)
83
+
84
+ ### Patch Changes
85
+
86
+ - Fix: Text-size levels (`oks-zoom-1` through `oks-zoom-4`) blew up the layout exponentially.
87
+
88
+ The previous rules applied `font-size: 1.20em !important` to every descendant of `<body>` via `*`. Since `em` is relative to the parent, doing that at every nesting level compounded the factor — a heading three levels deep ended up at `1.20³ = 1.73×` its intended size, which is why headings spilled out of the viewport at level 3 and the page became unusable at level 4.
89
+
90
+ New rules target the `<body>` only with percentage values (10 / 20 / 35 / 50%). `font-size` inherits natively, so descendants using `em` or `rem` scale exactly once. Hard-coded `px` values are intentionally left alone — that's what the browser's own zoom is for.
91
+
92
+ No new API. No behavioural change when the controls are off.
93
+
94
+ ## 0.3.1
95
+
96
+ ### Patch Changes
97
+
98
+ - Fix: reading guide painted a solid black band on top of the text when **High contrast** was also active.
99
+
100
+ The high-contrast mode flips every descendant of `<body>` to `background-color: #000 !important; color: #ff0`. That selector was also catching the reading-guide overlay (`.oks-reading-guide`), overriding its semi-transparent yellow with an opaque black, which defeated the purpose of the feature.
101
+
102
+ Two corrective rules added right after the high-contrast block: the reading guide keeps its translucent yellow background and gets `#ff0` borders (visible on the new black page), and `.oks-overlay-effect` is forced back to `transparent` for the same reason.
103
+
104
+ No behavioural change when high-contrast is off. No new API.
105
+
106
+ ## 0.3.0
107
+
108
+ ### Minor Changes
109
+
110
+ - Expose `--oks-z` CSS custom property to control the trigger and panel z-index from outside the Shadow DOM.
111
+
112
+ Default unchanged (`9999999`). Consumers can lower it to sit below specific modals, or raise it to outrank other floating widgets:
113
+
114
+ ```css
115
+ oksigenia-access-panel {
116
+ --oks-z: 99999;
117
+ }
118
+ ```
119
+
120
+ This makes the z-index deterministic across browsers — previously, attempts to control the trigger's stacking from outside via the host element's z-index were best-effort because the trigger is `position: fixed` inside the Shadow DOM and creates its own stacking context.
package/README.md CHANGED
@@ -107,6 +107,30 @@ If you need to brand the panel itself, fork the package and customize
107
107
  <oksigenia-access-panel locale="es-PY"></oksigenia-access-panel>
108
108
  ```
109
109
 
110
+ ## Use it in Ghost (CMS)
111
+
112
+ Ghost has no plugin system for frontend components, but Code Injection
113
+ covers this case in one snippet. In the admin, go to **Settings → Code
114
+ injection → Site Footer** and paste:
115
+
116
+ ```html
117
+ <oksigenia-access-panel locale="en" position="bottom-left"></oksigenia-access-panel>
118
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@oksigenia/access-panel/dist/web-component.js"></script>
119
+ ```
120
+
121
+ Save. Reload any page on the site — the floating trigger appears.
122
+ Same attributes as above (`locale`, `position`, `trigger-icon`, etc.)
123
+ work as inline attributes on the tag.
124
+
125
+ The snippet above loads the bundle from jsDelivr, which logs requests
126
+ like any third-party CDN. To keep everything first-party, download
127
+ `dist/web-component.js` from npm or GitHub, upload it as a theme asset
128
+ (`assets/access-panel.js` in your active Ghost theme), and point the
129
+ `<script src=…>` at your own domain. Same component, no third-party hop.
130
+
131
+ Discussion on the Ghost forum (questions, issues, feedback):
132
+ <https://forum.ghost.org/t/accessibility-panel-for-ghost-via-code-injection-web-component-45-kb-no-tracking/62940>.
133
+
110
134
  ## Low-level building blocks
111
135
 
112
136
  If you want to render the panel manually or write your own behavior
package/dist/index.js CHANGED
@@ -68,7 +68,7 @@ function buildPanelHtml(opts) {
68
68
  </button>
69
69
  <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>
70
70
  </div>
71
- <div class="oks-access-panel" id="oks-panel" role="dialog" aria-modal="true" aria-labelledby="oks-panel-title" aria-hidden="true">
71
+ <div class="oks-access-panel" id="oks-panel" role="dialog" aria-modal="true" aria-labelledby="oks-panel-title" inert>
72
72
  <div class="oks-access-header">
73
73
  <h3 id="oks-panel-title">${escapeHtml(t.title)}</h3>
74
74
  <button class="oks-access-close" id="oks-close" aria-label="${escapeAttr(t.close)}" type="button">${ICON_CLOSE}</button>
@@ -348,14 +348,14 @@ function bindPanelBehavior(root, opts = {}) {
348
348
  };
349
349
  const openPanel = () => {
350
350
  panel.classList.add("is-open");
351
- panel.setAttribute("aria-hidden", "false");
351
+ panel.removeAttribute("inert");
352
352
  trigger.setAttribute("aria-expanded", "true");
353
353
  const first = panel.querySelector("button:not([disabled])");
354
354
  first?.focus();
355
355
  };
356
356
  const closePanel = () => {
357
357
  panel.classList.remove("is-open");
358
- panel.setAttribute("aria-hidden", "true");
358
+ panel.setAttribute("inert", "");
359
359
  trigger.setAttribute("aria-expanded", "false");
360
360
  trigger.focus();
361
361
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/translations.ts","../src/icons.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts"],"names":["root"],"mappings":";AAwCA,IAAM,IAAA,GAAkD;AAAA,EACtD,EAAA,EAAI,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,WAAA,EAAU,EAAA,EAAI,cAAA,EAAgB,KAAA,EAAO,eAAA,EAAc,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,iBAAA,EAAmB,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,gBAAA,EAAe,KAAA,EAAO,SAAA,EAAQ,IAAA,EAAM,YAAA,EAAW,OAAA,EAAS,kBAAA,EAAiB,MAAA,EAAQ,eAAA,EAAiB,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,kBAAA,EAAoB,GAAA,EAAK,kBAAA,EAAoB,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,gBAAA,EAAe,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,cAAA,EAAe;AAAA,EACrkB,EAAA,EAAI,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,aAAA,EAAe,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,eAAA,EAAiB,QAAA,EAAU,eAAA,EAAiB,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,iBAAA,EAAmB,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,WAAA,EAAa,GAAA,EAAK,cAAA,EAAgB,EAAA,EAAI,gBAAA,EAAkB,EAAA,EAAI,aAAA,EAAe,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,cAAA,EAAe;AAAA,EAC7kB,EAAA,EAAI,EAAE,KAAA,EAAO,wBAAA,EAA0B,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,qBAAA,EAAY,IAAA,EAAM,WAAA,EAAa,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,eAAA,EAAc,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,oBAAA,EAAY,IAAA,EAAM,mBAAA,EAAkB,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,YAAA,EAAW,KAAA,EAAO,cAAA,EAAa,IAAA,EAAM,aAAA,EAAY,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,WAAA,EAAU,OAAA,EAAS,WAAA,EAAU,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,iBAAA,EAAa;AAAA,EAC3iB,EAAA,EAAI,EAAE,KAAA,EAAO,kBAAA,EAAiB,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,gBAAA,EAAkB,QAAA,EAAU,iBAAA,EAAmB,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,gBAAA,EAAkB,MAAA,EAAQ,eAAA,EAAiB,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,kBAAA,EAAiB,GAAA,EAAK,qBAAA,EAAiB,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,eAAA,EAAgB;AAAA,EAC7lB,EAAA,EAAI,EAAE,KAAA,EAAO,kBAAA,EAAiB,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,cAAA,EAAgB,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,gBAAA,EAAkB,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,gBAAA,EAAkB,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,WAAA,EAAa,GAAA,EAAK,eAAA,EAAiB,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,aAAA,EAAc;AAAA,EACvkB,EAAA,EAAI,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,cAAA,EAAa,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,aAAA,EAAS,EAAA,EAAI,eAAA,EAAc,KAAA,EAAO,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,gBAAA,EAAe,MAAA,EAAQ,kBAAA,EAAiB,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,iBAAA,EAAgB,GAAA,EAAK,gBAAA,EAAkB,EAAA,EAAI,cAAA,EAAgB,EAAA,EAAI,eAAA,EAAiB,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,gBAAA,EAAe,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,cAAA,EAAe;AAAA,EACzkB,EAAA,EAAI,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,aAAA,EAAe,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,eAAA,EAAc,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,cAAA,EAAgB,MAAA,EAAQ,cAAA,EAAgB,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,iBAAA,EAAmB,EAAA,EAAI,cAAA,EAAgB,EAAA,EAAI,cAAA,EAAgB,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,cAAA,EAAe;AAAA,EAC5kB,EAAA,EAAI,EAAE,KAAA,EAAO,mBAAA,EAAkB,KAAA,EAAO,UAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,YAAA,EAAW,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,WAAA,EAAU,QAAA,EAAU,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,aAAA,EAAY,IAAA,EAAM,gBAAA,EAAe,KAAA,EAAO,WAAA,EAAU,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,cAAA,EAAa,IAAA,EAAM,YAAA,EAAW,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ,gBAAA,EAAe,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,iBAAA,EAAa,GAAA,EAAK,cAAA,EAAgB,EAAA,EAAI,eAAA,EAAiB,EAAA,EAAI,iBAAA,EAAgB,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,gBAAA,EAAe,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,eAAA;AACviB,CAAA;AAEO,SAAS,eAAe,MAAA,EAA6B;AAC1D,EAAA,MAAM,EAAA,GAAK,OAAO,WAAA,EAAY;AAC9B,EAAA,IAAI,EAAA,KAAO,IAAA,IAAQ,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,IAAA,CAAK,EAAA;AAC7E,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,MAAM,EAAE,CAAC,CAAA;AAC/B,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,EAAA;AAC5B;AAEO,SAAS,gBAAA,GAA0C;AACxD,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;;;ACzDO,IAAM,QAAA,GAAW,sHAAA;AACjB,IAAM,OAAA,GAAU,0KAAA;AAChB,IAAM,UAAA,GAAa,oJAAA;AACnB,IAAM,SAAA,GAAY,iJAAA;AAClB,IAAM,aAAA,GAAgB,sKAAA;AACtB,IAAM,aAAA,GAAgB,+KAAA;AACtB,IAAM,SAAA,GAAY,oKAAA;AAClB,IAAM,SAAA,GAAY,8jBAAA;AAClB,IAAM,SAAA,GAAY,oRAAA;AAClB,IAAM,UAAA,GAAa,+GAAA;AACnB,IAAM,WAAA,GAAc,8HAAA;AACpB,IAAM,UAAA,GAAa,gGAAA;AACnB,IAAM,OAAA,GAAU,0HAAA;AAChB,IAAM,eAAA,GAAkB,qgBAAA;AACxB,IAAM,UAAA,GAAa,8IAAA;AAEnB,IAAM,SAAA,GAAY,4KAAA;AAElB,IAAM,YAAA,GAAe,gMAAA;AAKrB,IAAM,aAAA,GAA6C;AAAA,EACxD,SAAA,EAAW,u5BAAA;AAAA,EACX,UAAA,EAAY,0eAAA;AAAA,EACZ,GAAA,EAAK,kRAAA;AAAA,EACL,SAAA,EAAW;AACb,CAAA;AAEO,IAAM,UAAA,GAAa,6MAAA;AAGnB,IAAM,sBAAA,GAAyB;;;ACf/B,SAAS,eAAe,IAAA,EAA6B;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAG,WAAA,EAAY,GAAI,IAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,cAAc,WAAW,CAAA;AAEtC,EAAA,MAAM,OAAO,CAAC,IAAA,KACZ,gCAAgC,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA;AAE/C,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAgB,MAAA,EAAgB,QAAgB,KAAA,EAAe,IAAA,EAAc,OAAO,KAAA,KAAkB;AACnH,IAAA,MAAM,SAAA,GAAY,OAAO,aAAA,GAAgB,EAAA;AACzC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAG,MAAM,eAAe,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAC1E,IAAA,OAAO,CAAA,wCAAA,EAA2C,SAAS,CAAA,eAAA,EAAkB,MAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,4DAAA,EAA+D,IAAI,CAAA,+BAAA,EAAkC,KAAK,kCAAkC,IAAI,CAAA,eAAA,CAAA;AAAA,EACrR,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAe,KAAA,EAAe,IAAA,KAC5C,mEAAmE,KAAK,CAAA,4DAAA,EAA+D,IAAI,CAAA,+BAAA,EAAkC,KAAK,CAAA,gBAAA,CAAA;AACpL,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAY,KAAA,EAAe,IAAA,KAC1C,qEAAqE,EAAE,CAAA,4DAAA,EAA+D,IAAI,CAAA,+BAAA,EAAkC,KAAK,CAAA,gBAAA,CAAA;AACnL,EAAA,MAAM,QAAQ,CAAC,KAAA,EAAe,SAC5B,CAAA,6GAAA,EAAgH,IAAI,kCAAkC,KAAK,CAAA,gBAAA,CAAA;AAC7J,EAAA,MAAM,OAAO,CAAC,KAAA,EAAe,SAC3B,CAAA,4GAAA,EAA+G,IAAI,kCAAkC,KAAK,CAAA,gBAAA,CAAA;AAC5J,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAY,KAAA,EAAe,IAAA,KACzC,gEAAgE,EAAE,CAAA,uCAAA,EAA0C,IAAI,CAAA,+BAAA,EAAkC,KAAK,CAAA,gBAAA,CAAA;AAEzJ,EAAA,OAAO;AAAA,gEAAA,EACyD,KAAK,QAAQ,CAAA;AAAA,8DAAA,EACf,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAAA,EAC7E,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAMqB,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,gEAAA,EACgB,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,mBAAmB,UAAU,CAAA;AAAA;AAAA;AAAA,iCAAA,EAG/E,UAAA,CAAW,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA;AAAA,MAAA,EAEhD,MAAA,CAAO,WAAA,EAAa,CAAA,CAAE,IAAA,EAAM,aAAa,CAAC;AAAA,MAAA,EAC1C,MAAA,CAAO,UAAA,EAAa,CAAA,CAAE,IAAA,EAAM,aAAa,CAAC;AAAA,MAAA,EAC1C,MAAA,CAAO,OAAA,EAAa,CAAA,CAAE,IAAA,EAAM,WAAW,CAAC;AAAA,MAAA,EACxC,MAAA,CAAO,MAAA,EAAa,CAAA,CAAE,KAAA,EAAO,SAAS,CAAC;AAAA;AAAA,iCAAA,EAEZ,UAAA,CAAW,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,IAAA,EAC9C,IAAA,CAAK;AAAA,IACL,MAAM,OAAA,EAAS,UAAA,EAAY,CAAA,EAAG,CAAA,CAAE,MAAM,QAAQ,CAAA;AAAA,IAC9C,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAG,CAAA,CAAE,IAAI,OAAO,CAAA;AAAA,IACzC,MAAM,OAAA,EAAS,WAAA,EAAa,CAAA,EAAG,CAAA,CAAE,OAAO,UAAU,CAAA;AAAA,IAClD,MAAA,CAAO,eAAA,EAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAAA,IACzC,MAAA,CAAO,cAAA,EAAgB,CAAA,CAAE,QAAA,EAAU,aAAa,CAAA;AAAA,IAChD,MAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAG,CAAA,CAAE,IAAI,OAAO;AAAA,GAC1C,CAAC;AAAA,iCAAA,EAC6B,UAAA,CAAW,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,IAAA,EAC9C,IAAA,CAAK;AAAA,IACL,MAAA,CAAO,mBAAA,EAAqB,CAAA,CAAE,QAAA,EAAU,aAAa,CAAA;AAAA,IACrD,OAAA,CAAQ,kBAAA,EAAoB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAAA,IAC7C,MAAA,CAAO,eAAA,EAAiB,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAAA,IACzC,MAAA,CAAO,gBAAA,EAAkB,CAAA,CAAE,KAAA,EAAO,SAAS,CAAA;AAAA,IAC3C,MAAM,YAAA,EAAc,gBAAA,EAAkB,GAAG,CAAA,CAAE,EAAA,EAAI,iBAAiB,IAAI;AAAA,GACrE,CAAC;AAAA,iCAAA,EAC6B,UAAA,CAAW,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,IAAA,EAC9C,IAAA,CAAK;AAAA,IACL,KAAA,CAAM,CAAA,CAAE,KAAA,EAAO,UAAU,CAAA;AAAA,IACzB,IAAA,CAAK,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA;AAAA,IACtB,MAAA,CAAO,gBAAA,EAAkB,CAAA,CAAE,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC9C,MAAA,CAAO,qBAAA,EAAuB,CAAA,CAAE,OAAA,EAAS,YAAY,CAAA;AAAA,IACrD,MAAA,CAAO,gBAAA,EAAkB,CAAA,CAAE,KAAA,EAAO,UAAU,CAAA;AAAA,IAC5C,MAAA,CAAO,gBAAA,EAAkB,CAAA,CAAE,KAAA,EAAO,UAAU;AAAA,GAC7C,CAAC;AAAA;AAAA;AAAA,kEAAA,EAG8D,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,qCAAA,EAChD,UAAA,CAAW,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA;AAIxD;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA,KAAA,CAAO;AAAA,IAClC,GAAA,EAAK,OAAA;AAAA,IAAS,GAAA,EAAK,MAAA;AAAA,IAAQ,GAAA,EAAK,MAAA;AAAA,IAAQ,GAAA,EAAK;AAAA,GAC/C,EAAE,CAAC,CAAA,IAAK,CAAE,CAAA;AACZ;AACA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,UAAA,CAAW,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC5C;AAOA,SAAS,cAAc,QAAA,EAAmC;AACxD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,UAAA;AAAgB,MAAA,OAAO,EAAE,IAAA,EAAM,wBAAA,EAA0B,KAAA,EAAO,wBAAA,EAAyB;AAAA,IAC9F,KAAK,WAAA;AAAgB,MAAA,OAAO,EAAE,IAAA,EAAM,yBAAA,EAA2B,KAAA,EAAO,yBAAA,EAA0B;AAAA,IAChG,KAAK,UAAA;AAAgB,MAAA,OAAO,EAAE,IAAA,EAAM,oDAAA,EAAsD,KAAA,EAAO,oDAAA,EAAqD;AAAA,IACtJ,KAAK,WAAA;AAAgB,MAAA,OAAO,EAAE,IAAA,EAAM,qDAAA,EAAuD,KAAA,EAAO,qDAAA,EAAsD;AAAA,IACxJ,KAAK,aAAA;AAAgB,MAAA,OAAO,EAAE,IAAA,EAAM,2BAAA,EAA6B,KAAA,EAAO,4BAAA,EAA6B;AAAA,IACrG,KAAK,cAAA;AAAgB,MAAA,OAAO,EAAE,IAAA,EAAM,4BAAA,EAA8B,KAAA,EAAO,6BAAA,EAA8B;AAAA;AAE3G;AAIO,SAAS,WAAA,CAAY,UAAoB,MAAA,EAA2B;AACzE,EAAA,MAAM,CAAA,GAAI,cAAc,QAAQ,CAAA;AAKhC,EAAA,IAAI,GAAA,GAAM,CAAA,sBAAA,EAAyB,CAAA,CAAE,IAAI,CAAA,EAAA,CAAA;AACzC,EAAA,GAAA,IAAO,CAAA,gDAAA,EAAmD,EAAE,KAAK,CAAA,IAAA,CAAA;AACjE,EAAA,IAAI,MAAA,IAAU,WAAW,QAAA,EAAU;AACjC,IAAA,MAAM,CAAA,GAAI,cAAc,MAAM,CAAA;AAC9B,IAAA,GAAA,IAAO,CAAA,qHAAA,EAAwH,EAAE,IAAI,CAAA,IAAA,CAAA;AAAA,EACvI;AACA,EAAA,OAAO,GAAA;AACT;;;ACxGO,IAAM,aAAA,GAAsC,OAAO,MAAA,CAAO;AAAA,EAC/D,IAAA,EAAM,CAAA;AAAA,EACN,EAAA,EAAI,CAAA;AAAA,EACJ,KAAA,EAAO,CAAA;AAAA,EACP,EAAA,EAAI,CAAA;AAAA,EACJ,UAAA,EAAY,CAAA;AAAA,EACZ,IAAA,EAAM,KAAA;AAAA,EACN,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,UAAA,EAAY,KAAA;AAAA,EACZ,cAAA,EAAgB,KAAA;AAAA,EAChB,SAAA,EAAW,KAAA;AAAA,EACX,SAAA,EAAW,KAAA;AAAA,EACX,YAAA,EAAc,KAAA;AAAA,EACd,WAAA,EAAa,KAAA;AAAA,EACb,YAAA,EAAc,KAAA;AAAA,EACd,WAAA,EAAa,KAAA;AAAA,EACb,UAAA,EAAY;AACd,CAAC;AAEM,SAAS,UAAU,GAAA,EAAyB;AACjD,EAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,EAAE,GAAG,aAAA,EAAc;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,GAAG,aAAA,EAAc;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,UAAU,OAAO,EAAE,GAAG,aAAA,EAAc;AACrE,IAAA,OAAO,EAAE,GAAG,aAAA,EAAe,GAAG,MAAA,EAAO;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,GAAG,aAAA,EAAc;AAAA,EAC5B;AACF;AAEO,SAAS,SAAA,CAAU,KAAa,KAAA,EAAyB;AAC9D,EAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACzC,EAAA,IAAI;AAEF,IAAA,MAAM,MAA2B,EAAC;AAClC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAyC;AAChF,MAAA,IAAI,OAAO,MAAM,QAAA,IAAY,CAAA,GAAI,GAAI,GAAA,CAAgC,CAAC,CAAA,GAAI,CAAA;AAAA,WAAA,IACjE,OAAO,CAAA,KAAM,SAAA,IAAa,GAAI,GAAA,CAAgC,CAAC,CAAA,GAAI,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,WAAW,CAAA,EAAG;AACjC,MAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAGR;AACF;AAEO,SAAS,aAAa,KAAA,EAA4B;AACvD,EAAA,OACE,KAAA,CAAM,SAAS,CAAA,IACf,KAAA,CAAM,OAAO,CAAA,IACb,KAAA,CAAM,KAAA,KAAU,CAAA,IAChB,KAAA,CAAM,EAAA,KAAO,KACb,KAAA,CAAM,UAAA,KAAe,KACrB,CAAC,KAAA,CAAM,QACP,CAAC,KAAA,CAAM,QAAA,IACP,CAAC,KAAA,CAAM,QAAA,IACP,CAAC,KAAA,CAAM,UAAA,IACP,CAAC,KAAA,CAAM,cAAA,IACP,CAAC,KAAA,CAAM,SAAA,IACP,CAAC,KAAA,CAAM,SAAA,IACP,CAAC,MAAM,YAAA,IACP,CAAC,KAAA,CAAM,WAAA,IACP,CAAC,KAAA,CAAM,gBACP,CAAC,KAAA,CAAM,WAAA,IACP,CAAC,KAAA,CAAM,UAAA;AAEX;;;AC1GA,IAAM,UAAA,GAA+C;AAAA,EACnD,UAAA,EAAY,MAAA;AAAA,EACZ,QAAA,EAAU,IAAA;AAAA,EACV,WAAA,EAAa,OAAA;AAAA,EACb,QAAA,EAAU,IAAA;AAAA,EACV,gBAAA,EAAkB;AACpB,CAAA;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU,CAAA;AAAA,EACV,WAAA,EAAa,CAAA;AAAA,EACb,QAAA,EAAU,CAAA;AAAA,EACV,gBAAA,EAAkB;AACpB,CAAA;AAEA,IAAM,WAAA,GAAgD;AAAA,EACpD,eAAA,EAAiB,MAAA;AAAA,EACjB,cAAA,EAAgB,UAAA;AAAA,EAChB,mBAAA,EAAqB,UAAA;AAAA,EACrB,eAAA,EAAiB,YAAA;AAAA,EACjB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,gBAAA,EAAkB,WAAA;AAAA,EAClB,gBAAA,EAAkB,WAAA;AAAA,EAClB,gBAAA,EAAkB,cAAA;AAAA,EAClB,qBAAA,EAAuB;AACzB,CAAA;AAIA,IAAM,OAAA,GAA+C;AAAA,EACnD,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,YAAA,EAAc,IAAA,EAAK;AAAA,EAChG,QAAA,EAAW,EAAE,QAAA,EAAU,IAAA,EAAM,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,YAAA,EAAc,IAAA,EAAK;AAAA,EAC9D,OAAW,EAAE,SAAA,EAAW,MAAM,UAAA,EAAY,IAAA,EAAM,cAAc,IAAA,EAAK;AAAA,EACnE,IAAA,EAAW,EAAE,UAAA,EAAY,IAAA,EAAM,WAAW,IAAA;AAC5C,CAAA;AAYO,SAAS,iBAAA,CAAkB,IAAA,EAAkB,IAAA,GAAwB,EAAC,EAAe;AAC1F,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,gBAAA;AACtC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,aAAa,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,aAAa,CAAA;AACjD,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAoC,8BAA8B,CAAC,CAAA;AAEjG,EAAA,IAAI,CAAC,WAAW,CAAC,KAAA,IAAS,CAAC,QAAA,IAAY,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS;AAC5D,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,KAAA,GAAoB,UAAU,UAAU,CAAA;AAI5C,EAAA,SAAS,UAAA,GAAmB;AAC1B,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,IAAA,MAAMA,QAAO,QAAA,CAAS,eAAA;AAEtB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,uBAAA,EAAyB,EAAE,EAAE,IAAA,EAAK;AAC1E,IAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAMA,KAAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAA,eAAA,EAAkB,CAAC,EAAE,CAAC,CAAA;AAErE,IAAA,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG,IAAA,CAAK,UAAU,GAAA,CAAI,CAAA,SAAA,EAAY,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC/D,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,UAAU,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,EAAG,IAAA,CAAK,UAAU,GAAA,CAAI,CAAA,UAAA,EAAa,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAClE,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,UAAU,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,KAAA,CAAM,UAAA,GAAa,CAAA,EAAGA,KAAAA,CAAK,UAAU,GAAA,CAAI,CAAA,eAAA,EAAkB,KAAA,CAAM,UAAU,CAAA,CAAE,CAAA;AACjF,IAAA,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,eAAe,CAAA;AAClD,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAI,cAAc,CAAA;AACrD,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAI,mBAAmB,CAAA;AAC1D,IAAA,IAAI,KAAA,CAAM,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,IAAI,eAAe,CAAA;AACxD,IAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,IAAA,CAAK,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAC7D,IAAA,IAAI,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAI,gBAAgB,CAAA;AACxD,IAAA,IAAI,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAI,gBAAgB,CAAA;AACxD,IAAA,IAAI,KAAA,CAAM,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,IAAI,eAAe,CAAA;AACzD,IAAA,IAAI,KAAA,CAAM,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,IAAI,qBAAqB,CAAA;AAE9D,IAAA,MAAM,UAAU,aAAA,EAAc;AAC9B,IAAA,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,KAAA,CAAM,WAAW,CAAA;AAEvD,IAAA,oBAAA,EAAqB;AACrB,IAAA,OAAA,EAAS,UAAU,MAAA,CAAO,YAAA,EAAc,CAAC,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,SAAS,oBAAA,GAA6B;AACpC,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,aAAa,CAAA;AAC7C,MAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,YAAA,EAAc;AACjD,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,aAAa,CAAA,IAAK,EAAA;AAClD,QAAA,MAAM,GAAA,GAAM,WAAW,MAAM,CAAA;AAC7B,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACrB,QAAA,GAAA,CAAI,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,GAAG,CAAC,CAAA;AAC1C,QAAA,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,GAAA,GAAM,CAAC,CAAA;AACzC,QAAA,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,GAAA,GAAM,CAAA,GAAI,SAAS,OAAO,CAAA;AAAA,MAC7D,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,YAAY,CAAA,IAAK,EAAA;AAChD,QAAA,MAAM,GAAA,GAAM,YAAY,KAAK,CAAA;AAC7B,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACrB,QAAA,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,GAAG,CAAA;AACrC,QAAA,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,GAAA,GAAM,MAAA,GAAS,OAAO,CAAA;AAAA,MACzD,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,QAAA,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,KAAA,CAAM,WAAW,CAAA;AACnD,QAAA,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,KAAA,CAAM,WAAA,GAAc,SAAS,OAAO,CAAA;AAAA,MACvE,CAAA,MAAA,IAAW,WAAW,OAAA,EAAS;AAC7B,QAAA,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,KAAA,CAAM,YAAY,CAAA;AACpD,QAAA,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,KAAA,CAAM,YAAA,GAAe,SAAS,OAAO,CAAA;AAAA,MACxE,CAAA,MAAA,IAAW,WAAW,MAAA,EAAQ;AAC5B,QAAA,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,KAAA,CAAM,WAAW,CAAA;AACnD,QAAA,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,KAAA,CAAM,WAAA,GAAc,SAAS,OAAO,CAAA;AAAA,MACvE;AAAA,IAGF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,IAAA,MAAM,MAAM,CAAA,CAAE,aAAA;AACd,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,aAAa,CAAA;AAC7C,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,aAAa,CAAA,IAAK,EAAA;AAClD,MAAA,MAAM,GAAA,GAAM,WAAW,MAAM,CAAA;AAC7B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,MAAM,CAAA,IAAK,CAAA;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,GAAA,GAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,GAAe,MAAM,GAAA,GAAM,CAAA,CAAA;AAClD,MAAC,KAAA,CAAM,GAAG,CAAA,GAAe,GAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,WAAW,YAAA,EAAc;AAClC,MAAA,KAAA,CAAM,UAAA,GAAA,CAAc,KAAA,CAAM,UAAA,GAAa,CAAA,IAAK,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,YAAY,CAAA,IAAK,EAAA;AAChD,MAAA,MAAM,GAAA,GAAM,YAAY,KAAK,CAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAC,KAAA,CAAM,GAAG,CAAA,GAAgB,CAAE,MAAM,GAAG,CAAA;AAErC,MAAA,IAAI,KAAA,KAAU,mBAAA,IAAuB,KAAA,CAAM,QAAA,QAAgB,WAAA,GAAc,KAAA;AAAA,IAC3E,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,MAAA,KAAA,CAAM,WAAA,GAAc,CAAC,KAAA,CAAM,WAAA;AAC3B,MAAA,IAAI,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,QAAA,GAAW,KAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,WAAW,OAAA,EAAS;AAC7B,MAAA,KAAA,CAAM,YAAA,GAAe,CAAC,KAAA,CAAM,YAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,WAAW,MAAA,EAAQ;AAC5B,MAAA,KAAA,CAAM,WAAA,GAAc,CAAC,KAAA,CAAM,WAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,YAAA,CAAa,aAAa,CAAA,IAAK,EAAA;AAC9C,MAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA;AAEvC,MAAA,GAAA,CAAI,SAAA,CAAU,IAAI,aAAa,CAAA;AAC/B,MAAA,UAAA,CAAW,MAAM,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,aAAa,GAAG,GAAG,CAAA;AAAA,IAC3D;AACA,IAAA,UAAA,EAAW;AACX,IAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,KAAA,GAAQ,EAAE,GAAG,aAAA,EAAc;AAC3B,IAAA,UAAA,EAAW;AACX,IAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,KAAA,CAAM,SAAA,CAAU,IAAI,SAAS,CAAA;AAC7B,IAAA,KAAA,CAAM,YAAA,CAAa,eAAe,OAAO,CAAA;AACzC,IAAA,OAAA,CAAQ,YAAA,CAAa,iBAAiB,MAAM,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,CAA2B,wBAAwB,CAAA;AACvE,IAAA,KAAA,EAAO,KAAA,EAAM;AAAA,EACf,CAAA;AACA,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,IAAA,KAAA,CAAM,YAAA,CAAa,eAAe,MAAM,CAAA;AACxC,IAAA,OAAA,CAAQ,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAC7C,IAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,EAChB,CAAA;AACA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,SAAS,GAAG,UAAA,EAAW;AAAA,SAC/C,SAAA,EAAU;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AAM1C,IAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAa;AAC5B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9E,IAAA,UAAA,EAAW;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAA2B;AAC5C,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1C,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,MAAA,UAAA,EAAW;AAAG,MAAA;AAAA,IAAQ;AAChD,IAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACrB,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,gBAAA,CAA8B,wBAAwB,CAAC,CAAA;AAC1F,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC3C,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA;AACpB,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,IAAI,WAAW,KAAA,EAAO;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MAAG;AAAA,IAC5D,CAAA,MAAO;AACL,MAAA,IAAI,WAAW,IAAA,EAAM;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MAAG;AAAA,IAC5D;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAqC;AACnD,IAAA,IAAI,CAAC,KAAA,CAAM,YAAA,IAAgB,CAAC,MAAM,WAAA,EAAa;AAC/C,IAAA,MAAM,IAAK,CAAA,CAAiB,OAAA,GAAU,CAAC,CAAA,EAAG,WAAY,CAAA,CAAiB,OAAA;AACvE,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAC3B,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,cAAA,CAAe,mBAAmB,CAAA;AACzD,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACnC;AACA,IAAA,IAAI,MAAM,WAAA,EAAa;AACrB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,cAAA,CAAe,kBAAkB,CAAA;AACvD,MAAA,IAAI,MAAM,IAAA,CAAK,KAAA,CAAM,YAAY,cAAA,EAAgB,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA;AAGA,EAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,cAAc,CAAA;AAChD,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,UAAU,CAAA;AAC7C,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAC1C,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,EAAO,GAAA,CAAI,gBAAA,CAAiB,SAAS,UAAU,CAAA;AACjE,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,UAAU,CAAA;AAC7C,EAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,EAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,MAAM,CAAA;AAC7C,EAAA,QAAA,CAAS,iBAAiB,WAAA,EAAa,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAGhE,EAAA,UAAA,EAAW;AAEX,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,mBAAA,CAAoB,SAAS,cAAc,CAAA;AACnD,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAS,UAAU,CAAA;AAChD,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC7C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAA,EAAO,GAAA,CAAI,mBAAA,CAAoB,SAAS,UAAU,CAAA;AACpE,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAS,UAAU,CAAA;AAChD,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AACjD,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,MAAM,CAAA;AAChD,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,MAAM,CAAA;AAAA,EAClD,CAAA;AACF;AAEA,SAAS,aAAA,GAA6B;AACpC,EAAA,IAAI,EAAA,GAAK,QAAA,CAAS,cAAA,CAAe,kBAAkB,CAAA;AACnD,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,EAAA,GAAK,QAAA,CAAS,cAAc,KAAK,CAAA;AACjC,IAAA,EAAA,CAAG,EAAA,GAAK,kBAAA;AACR,IAAA,EAAA,CAAG,SAAA,GAAY,oBAAA;AACf,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,EAAA;AACT;;;ACvQO,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuOlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","file":"index.js","sourcesContent":["// Heredado del plugin WP oksigenia-access v16.9.\n// 8 locales: español PY (con Guaraní separado como lengua oficial PY),\n// inglés, francés, italiano, alemán, neerlandés, sueco.\n\nexport type LocaleCode = 'es' | 'gn' | 'en' | 'fr' | 'it' | 'de' | 'nl' | 'sv';\n\nexport interface Translation {\n title: string;\n close: string;\n txt: string;\n size: string;\n lh: string;\n align: string;\n font: string;\n dyslexia: string;\n vis: string;\n contrast: string;\n gray: string;\n hide: string;\n links: string;\n ori: string;\n guide: string;\n mask: string;\n targets: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n /** Section title for the preset row. */\n presets: string;\n /** Preset labels. */\n pLow: string;\n pDys: string;\n pMot: string;\n pCalm: string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.' },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.' },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy' },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.' },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.' },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.' },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.' },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.' },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></svg>';\n\n// 4 iconos del botón flotante.\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>',\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","import type { Translation } from './translations.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_MASK, ICON_TARGETS,\n ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position = 'top-left' | 'top-right' | 'mid-left' | 'mid-right' | 'bottom-left' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n}\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n const grid = (rows: string[]): string =>\n `<div class=\"oks-access-grid\">${rows.join('')}</div>`;\n\n const multi = (action: string, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (klass: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const overlay = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"overlay\" data-target=\"${id}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const guide = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"guide\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const mask = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"mask\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const preset = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n\n return `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" aria-hidden=\"true\">\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n <h4 class=\"oks-access-title\">${escapeHtml(t.presets)}</h4>\n <div class=\"oks-access-presets\">\n ${preset('lowvision', t.pLow, ICON_CONTRAST)}\n ${preset('dyslexia', t.pDys, ICON_DYSLEXIA)}\n ${preset('motor', t.pMot, ICON_CURSOR)}\n ${preset('calm', t.pCalm, ICON_HIDE)}\n </div>\n <h4 class=\"oks-access-title\">${escapeHtml(t.txt)}</h4>\n ${grid([\n multi('multi', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('multi', 'oks-lh', 3, t.lh, ICON_LH),\n multi('multi', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('oks-a11y-font', t.font, ICON_FONT),\n toggle('oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('multi', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.vis)}</h4>\n ${grid([\n toggle('oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.ori)}</h4>\n ${grid([\n guide(t.guide, ICON_GUIDE),\n mask(t.mask, ICON_MASK),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-bigtargets', t.targets, ICON_TARGETS),\n toggle('oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, '&#39;');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n readingMask: false,\n bigTargets: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide &&\n !state.readingMask &&\n !state.bigTargets\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n 'oks-a11y-bigtargets': 'bigTargets',\n};\n\n/** Preset profiles: set the listed flags to true, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nconst PRESETS: Record<string, Partial<PanelState>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un dispose para\n * limpiar.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): () => void {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt, .oks-preset'));\n\n if (!trigger || !panel || !closeBtn || !resetBtn || !wrapper) {\n return () => {};\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n // Aplica `state` al DOM (clases en body/html + estado de los botones).\n function applyState(): void {\n const body = document.body;\n const root = document.documentElement;\n // Limpiar todo lo nuestro antes de re-aplicar.\n body.className = body.className.replace(/\\boks-\\w+(?:-\\d+)?\\b/g, '').trim();\n [1, 2, 3].forEach((l) => root.classList.remove(`oks-colorblind-${l}`));\n\n if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) body.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) body.classList.add(`oks-ls-${state.ls}`);\n if (state.colorblind > 0) root.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.font) body.classList.add('oks-a11y-font');\n if (state.dyslexia) body.classList.add('oks-dyslexia');\n if (state.contrast) body.classList.add('oks-a11y-contrast');\n if (state.hideImages) body.classList.add('oks-a11y-hide');\n if (state.highlightLinks) body.classList.add('oks-a11y-links');\n if (state.bigCursor) body.classList.add('oks-big-cursor');\n if (state.pauseAnim) body.classList.add('oks-a11y-pause');\n if (state.focusOutline) body.classList.add('oks-a11y-focus');\n if (state.readingGuide) body.classList.add('oks-a11y-guide');\n if (state.readingMask) body.classList.add('oks-a11y-mask');\n if (state.bigTargets) body.classList.add('oks-a11y-bigtargets');\n\n const overlay = ensureOverlay();\n overlay.classList.toggle('is-active', state.grayOverlay);\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n // Preset buttons don't carry persistent active state — they apply\n // a bundle of flags and let the user adjust afterwards.\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n // Contrast y grayOverlay son mutuamente excluyentes.\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') ?? '';\n const preset = PRESETS[id];\n if (preset) Object.assign(state, preset);\n // Transient click feedback — see styles.ts .oks-preset.is-flashing.\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n const openPanel = (): void => {\n panel.classList.add('is-open');\n panel.setAttribute('aria-hidden', 'false');\n trigger.setAttribute('aria-expanded', 'true');\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n panel.classList.remove('is-open');\n panel.setAttribute('aria-hidden', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n };\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n // Clicks that originate inside our Shadow DOM are retargeted to the\n // host element when they bubble to `document`, so `panel.contains(t)`\n // returns false even though the user clicked something *inside* the\n // panel. composedPath() preserves the full path across shadow\n // boundaries — use that to detect \"click stayed within the widget\".\n const path = e.composedPath();\n if (path.includes(panel) || path.includes(trigger) || path.includes(wrapper)) return;\n closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Reading guide + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n return () => {\n trigger.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n };\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n\n/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n"]}
1
+ {"version":3,"sources":["../src/translations.ts","../src/icons.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts"],"names":["root"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuOlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","file":"index.js","sourcesContent":["// Heredado del plugin WP oksigenia-access v16.9.\n// 8 locales: español PY (con Guaraní separado como lengua oficial PY),\n// inglés, francés, italiano, alemán, neerlandés, sueco.\n\nexport type LocaleCode = 'es' | 'gn' | 'en' | 'fr' | 'it' | 'de' | 'nl' | 'sv';\n\nexport interface Translation {\n title: string;\n close: string;\n txt: string;\n size: string;\n lh: string;\n align: string;\n font: string;\n dyslexia: string;\n vis: string;\n contrast: string;\n gray: string;\n hide: string;\n links: string;\n ori: string;\n guide: string;\n mask: string;\n targets: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n /** Section title for the preset row. */\n presets: string;\n /** Preset labels. */\n pLow: string;\n pDys: string;\n pMot: string;\n pCalm: string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.' },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.' },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy' },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.' },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.' },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.' },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.' },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.' },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></svg>';\n\n// 4 iconos del botón flotante.\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>',\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","import type { Translation } from './translations.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_MASK, ICON_TARGETS,\n ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position = 'top-left' | 'top-right' | 'mid-left' | 'mid-right' | 'bottom-left' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n}\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n const grid = (rows: string[]): string =>\n `<div class=\"oks-access-grid\">${rows.join('')}</div>`;\n\n const multi = (action: string, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (klass: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const overlay = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"overlay\" data-target=\"${id}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const guide = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"guide\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const mask = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"mask\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const preset = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n\n return `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" inert>\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n <h4 class=\"oks-access-title\">${escapeHtml(t.presets)}</h4>\n <div class=\"oks-access-presets\">\n ${preset('lowvision', t.pLow, ICON_CONTRAST)}\n ${preset('dyslexia', t.pDys, ICON_DYSLEXIA)}\n ${preset('motor', t.pMot, ICON_CURSOR)}\n ${preset('calm', t.pCalm, ICON_HIDE)}\n </div>\n <h4 class=\"oks-access-title\">${escapeHtml(t.txt)}</h4>\n ${grid([\n multi('multi', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('multi', 'oks-lh', 3, t.lh, ICON_LH),\n multi('multi', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('oks-a11y-font', t.font, ICON_FONT),\n toggle('oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('multi', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.vis)}</h4>\n ${grid([\n toggle('oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.ori)}</h4>\n ${grid([\n guide(t.guide, ICON_GUIDE),\n mask(t.mask, ICON_MASK),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-bigtargets', t.targets, ICON_TARGETS),\n toggle('oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, '&#39;');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n readingMask: false,\n bigTargets: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide &&\n !state.readingMask &&\n !state.bigTargets\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n 'oks-a11y-bigtargets': 'bigTargets',\n};\n\n/** Preset profiles: set the listed flags to true, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nconst PRESETS: Record<string, Partial<PanelState>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un dispose para\n * limpiar.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): () => void {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt, .oks-preset'));\n\n if (!trigger || !panel || !closeBtn || !resetBtn || !wrapper) {\n return () => {};\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n // Aplica `state` al DOM (clases en body/html + estado de los botones).\n function applyState(): void {\n const body = document.body;\n const root = document.documentElement;\n // Limpiar todo lo nuestro antes de re-aplicar.\n body.className = body.className.replace(/\\boks-\\w+(?:-\\d+)?\\b/g, '').trim();\n [1, 2, 3].forEach((l) => root.classList.remove(`oks-colorblind-${l}`));\n\n if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) body.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) body.classList.add(`oks-ls-${state.ls}`);\n if (state.colorblind > 0) root.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.font) body.classList.add('oks-a11y-font');\n if (state.dyslexia) body.classList.add('oks-dyslexia');\n if (state.contrast) body.classList.add('oks-a11y-contrast');\n if (state.hideImages) body.classList.add('oks-a11y-hide');\n if (state.highlightLinks) body.classList.add('oks-a11y-links');\n if (state.bigCursor) body.classList.add('oks-big-cursor');\n if (state.pauseAnim) body.classList.add('oks-a11y-pause');\n if (state.focusOutline) body.classList.add('oks-a11y-focus');\n if (state.readingGuide) body.classList.add('oks-a11y-guide');\n if (state.readingMask) body.classList.add('oks-a11y-mask');\n if (state.bigTargets) body.classList.add('oks-a11y-bigtargets');\n\n const overlay = ensureOverlay();\n overlay.classList.toggle('is-active', state.grayOverlay);\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n // Preset buttons don't carry persistent active state — they apply\n // a bundle of flags and let the user adjust afterwards.\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n // Contrast y grayOverlay son mutuamente excluyentes.\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') ?? '';\n const preset = PRESETS[id];\n if (preset) Object.assign(state, preset);\n // Transient click feedback — see styles.ts .oks-preset.is-flashing.\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n const openPanel = (): void => {\n panel.classList.add('is-open');\n panel.removeAttribute('inert');\n trigger.setAttribute('aria-expanded', 'true');\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n panel.classList.remove('is-open');\n // inert (not aria-hidden) while closed: its focusable controls leave the\n // tab order and the accessibility tree, fixing the aria-hidden-focus\n // violation. inert also blurs any focus held inside before we restore it.\n panel.setAttribute('inert', '');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n };\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n // Clicks that originate inside our Shadow DOM are retargeted to the\n // host element when they bubble to `document`, so `panel.contains(t)`\n // returns false even though the user clicked something *inside* the\n // panel. composedPath() preserves the full path across shadow\n // boundaries — use that to detect \"click stayed within the widget\".\n const path = e.composedPath();\n if (path.includes(panel) || path.includes(trigger) || path.includes(wrapper)) return;\n closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Reading guide + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n return () => {\n trigger.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n };\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n\n/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n"]}
@@ -47,7 +47,7 @@ function buildPanelHtml(opts) {
47
47
  </button>
48
48
  <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>
49
49
  </div>
50
- <div class="oks-access-panel" id="oks-panel" role="dialog" aria-modal="true" aria-labelledby="oks-panel-title" aria-hidden="true">
50
+ <div class="oks-access-panel" id="oks-panel" role="dialog" aria-modal="true" aria-labelledby="oks-panel-title" inert>
51
51
  <div class="oks-access-header">
52
52
  <h3 id="oks-panel-title">${escapeHtml(t.title)}</h3>
53
53
  <button class="oks-access-close" id="oks-close" aria-label="${escapeAttr(t.close)}" type="button">${ICON_CLOSE}</button>
@@ -327,14 +327,14 @@ function bindPanelBehavior(root, opts = {}) {
327
327
  };
328
328
  const openPanel = () => {
329
329
  panel.classList.add("is-open");
330
- panel.setAttribute("aria-hidden", "false");
330
+ panel.removeAttribute("inert");
331
331
  trigger.setAttribute("aria-expanded", "true");
332
332
  const first = panel.querySelector("button:not([disabled])");
333
333
  first?.focus();
334
334
  };
335
335
  const closePanel = () => {
336
336
  panel.classList.remove("is-open");
337
- panel.setAttribute("aria-hidden", "true");
337
+ panel.setAttribute("inert", "");
338
338
  trigger.setAttribute("aria-expanded", "false");
339
339
  trigger.focus();
340
340
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/icons.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts","../src/translations.ts","../src/web-component.ts"],"names":["root"],"mappings":"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A;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuOlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA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","file":"web-component.js","sourcesContent":["// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></svg>';\n\n// 4 iconos del botón flotante.\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>',\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","import type { Translation } from './translations.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_MASK, ICON_TARGETS,\n ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position = 'top-left' | 'top-right' | 'mid-left' | 'mid-right' | 'bottom-left' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n}\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n const grid = (rows: string[]): string =>\n `<div class=\"oks-access-grid\">${rows.join('')}</div>`;\n\n const multi = (action: string, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (klass: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const overlay = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"overlay\" data-target=\"${id}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const guide = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"guide\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const mask = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"mask\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const preset = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n\n return `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" aria-hidden=\"true\">\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n <h4 class=\"oks-access-title\">${escapeHtml(t.presets)}</h4>\n <div class=\"oks-access-presets\">\n ${preset('lowvision', t.pLow, ICON_CONTRAST)}\n ${preset('dyslexia', t.pDys, ICON_DYSLEXIA)}\n ${preset('motor', t.pMot, ICON_CURSOR)}\n ${preset('calm', t.pCalm, ICON_HIDE)}\n </div>\n <h4 class=\"oks-access-title\">${escapeHtml(t.txt)}</h4>\n ${grid([\n multi('multi', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('multi', 'oks-lh', 3, t.lh, ICON_LH),\n multi('multi', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('oks-a11y-font', t.font, ICON_FONT),\n toggle('oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('multi', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.vis)}</h4>\n ${grid([\n toggle('oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.ori)}</h4>\n ${grid([\n guide(t.guide, ICON_GUIDE),\n mask(t.mask, ICON_MASK),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-bigtargets', t.targets, ICON_TARGETS),\n toggle('oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, '&#39;');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n readingMask: false,\n bigTargets: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide &&\n !state.readingMask &&\n !state.bigTargets\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n 'oks-a11y-bigtargets': 'bigTargets',\n};\n\n/** Preset profiles: set the listed flags to true, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nconst PRESETS: Record<string, Partial<PanelState>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un dispose para\n * limpiar.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): () => void {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt, .oks-preset'));\n\n if (!trigger || !panel || !closeBtn || !resetBtn || !wrapper) {\n return () => {};\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n // Aplica `state` al DOM (clases en body/html + estado de los botones).\n function applyState(): void {\n const body = document.body;\n const root = document.documentElement;\n // Limpiar todo lo nuestro antes de re-aplicar.\n body.className = body.className.replace(/\\boks-\\w+(?:-\\d+)?\\b/g, '').trim();\n [1, 2, 3].forEach((l) => root.classList.remove(`oks-colorblind-${l}`));\n\n if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) body.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) body.classList.add(`oks-ls-${state.ls}`);\n if (state.colorblind > 0) root.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.font) body.classList.add('oks-a11y-font');\n if (state.dyslexia) body.classList.add('oks-dyslexia');\n if (state.contrast) body.classList.add('oks-a11y-contrast');\n if (state.hideImages) body.classList.add('oks-a11y-hide');\n if (state.highlightLinks) body.classList.add('oks-a11y-links');\n if (state.bigCursor) body.classList.add('oks-big-cursor');\n if (state.pauseAnim) body.classList.add('oks-a11y-pause');\n if (state.focusOutline) body.classList.add('oks-a11y-focus');\n if (state.readingGuide) body.classList.add('oks-a11y-guide');\n if (state.readingMask) body.classList.add('oks-a11y-mask');\n if (state.bigTargets) body.classList.add('oks-a11y-bigtargets');\n\n const overlay = ensureOverlay();\n overlay.classList.toggle('is-active', state.grayOverlay);\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n // Preset buttons don't carry persistent active state — they apply\n // a bundle of flags and let the user adjust afterwards.\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n // Contrast y grayOverlay son mutuamente excluyentes.\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') ?? '';\n const preset = PRESETS[id];\n if (preset) Object.assign(state, preset);\n // Transient click feedback — see styles.ts .oks-preset.is-flashing.\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n const openPanel = (): void => {\n panel.classList.add('is-open');\n panel.setAttribute('aria-hidden', 'false');\n trigger.setAttribute('aria-expanded', 'true');\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n panel.classList.remove('is-open');\n panel.setAttribute('aria-hidden', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n };\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n // Clicks that originate inside our Shadow DOM are retargeted to the\n // host element when they bubble to `document`, so `panel.contains(t)`\n // returns false even though the user clicked something *inside* the\n // panel. composedPath() preserves the full path across shadow\n // boundaries — use that to detect \"click stayed within the widget\".\n const path = e.composedPath();\n if (path.includes(panel) || path.includes(trigger) || path.includes(wrapper)) return;\n closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Reading guide + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n return () => {\n trigger.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n };\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n\n/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n","// Heredado del plugin WP oksigenia-access v16.9.\n// 8 locales: español PY (con Guaraní separado como lengua oficial PY),\n// inglés, francés, italiano, alemán, neerlandés, sueco.\n\nexport type LocaleCode = 'es' | 'gn' | 'en' | 'fr' | 'it' | 'de' | 'nl' | 'sv';\n\nexport interface Translation {\n title: string;\n close: string;\n txt: string;\n size: string;\n lh: string;\n align: string;\n font: string;\n dyslexia: string;\n vis: string;\n contrast: string;\n gray: string;\n hide: string;\n links: string;\n ori: string;\n guide: string;\n mask: string;\n targets: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n /** Section title for the preset row. */\n presets: string;\n /** Preset labels. */\n pLow: string;\n pDys: string;\n pMot: string;\n pCalm: string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.' },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.' },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy' },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.' },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.' },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.' },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.' },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.' },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// Web component <oksigenia-access-panel>. Importar este módulo\n// registra el custom element y monta el panel + sus efectos globales.\n\nimport { buildPanelHtml, positionCss, type Position } from './render.js';\nimport { bindPanelBehavior } from './behavior.js';\nimport { PANEL_CSS, EFFECT_CSS } from './styles.js';\nimport { COLORBLIND_FILTERS_SVG } from './icons.js';\nimport { getTranslation } from './translations.js';\nimport type { TriggerIcon } from './icons.js';\n\nconst OBSERVED = ['locale', 'position', 'position-mobile', 'trigger-icon', 'storage-key'] as const;\nconst STYLE_ID = 'oksigenia-access-effects';\nconst FILTERS_ID = 'oksigenia-access-filters';\nconst GUIDE_ID = 'oks-reading-guide';\nconst MASK_ID = 'oks-reading-mask';\n\nfunction ensureGlobalStyles(): void {\n if (typeof document === 'undefined') return;\n if (!document.getElementById(STYLE_ID)) {\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = EFFECT_CSS;\n document.head.appendChild(style);\n }\n if (!document.getElementById(FILTERS_ID)) {\n const wrap = document.createElement('div');\n wrap.id = FILTERS_ID;\n wrap.style.cssText = 'position:absolute;width:0;height:0;overflow:hidden;';\n wrap.innerHTML = COLORBLIND_FILTERS_SVG;\n document.body.appendChild(wrap);\n }\n if (!document.getElementById(GUIDE_ID)) {\n const guide = document.createElement('div');\n guide.id = GUIDE_ID;\n guide.className = 'oks-reading-guide';\n document.body.appendChild(guide);\n }\n if (!document.getElementById(MASK_ID)) {\n const mask = document.createElement('div');\n mask.id = MASK_ID;\n mask.className = 'oks-reading-mask';\n document.body.appendChild(mask);\n }\n}\n\nconst VALID_POSITIONS: readonly Position[] = [\n 'top-left', 'top-right', 'mid-left', 'mid-right', 'bottom-left', 'bottom-right',\n];\nconst VALID_ICONS: readonly TriggerIcon[] = ['vitruvian', 'wheelchair', 'eye', 'universal'];\n\nexport class OksigeniaAccessPanelElement extends HTMLElement {\n static get observedAttributes(): readonly string[] {\n return OBSERVED;\n }\n\n private _dispose: (() => void) | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback(): void {\n ensureGlobalStyles();\n this.render();\n }\n\n disconnectedCallback(): void {\n this._dispose?.();\n this._dispose = null;\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) this.render();\n }\n\n private getPosition(): Position {\n const attr = (this.getAttribute('position') ?? 'mid-left') as Position;\n return VALID_POSITIONS.includes(attr) ? attr : 'mid-left';\n }\n\n private getPositionMobile(): Position | undefined {\n const attr = this.getAttribute('position-mobile') as Position | null;\n return attr && VALID_POSITIONS.includes(attr) ? attr : undefined;\n }\n\n private getTriggerIcon(): TriggerIcon {\n const attr = (this.getAttribute('trigger-icon') ?? 'vitruvian') as TriggerIcon;\n return VALID_ICONS.includes(attr) ? attr : 'vitruvian';\n }\n\n private getLocale(): string {\n return this.getAttribute('locale')\n ?? (typeof navigator !== 'undefined' ? navigator.language : 'en');\n }\n\n private render(): void {\n const shadow = this.shadowRoot;\n if (!shadow) return;\n this._dispose?.();\n\n const position = this.getPosition();\n const positionMobile = this.getPositionMobile();\n const html = buildPanelHtml({\n t: getTranslation(this.getLocale()),\n triggerIcon: this.getTriggerIcon(),\n position,\n });\n shadow.innerHTML = `<style>${PANEL_CSS}${positionCss(position, positionMobile)}</style>${html}`;\n this._dispose = bindPanelBehavior(shadow, {\n storageKey: this.getAttribute('storage-key') ?? undefined,\n });\n }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('oksigenia-access-panel')) {\n customElements.define('oksigenia-access-panel', OksigeniaAccessPanelElement);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'oksigenia-access-panel': OksigeniaAccessPanelElement;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/icons.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts","../src/translations.ts","../src/web-component.ts"],"names":["root"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuOlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"web-component.js","sourcesContent":["// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></svg>';\n\n// 4 iconos del botón flotante.\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>',\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","import type { Translation } from './translations.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_MASK, ICON_TARGETS,\n ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position = 'top-left' | 'top-right' | 'mid-left' | 'mid-right' | 'bottom-left' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n}\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n const grid = (rows: string[]): string =>\n `<div class=\"oks-access-grid\">${rows.join('')}</div>`;\n\n const multi = (action: string, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (klass: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const overlay = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"overlay\" data-target=\"${id}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const guide = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"guide\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const mask = (label: string, icon: string): string =>\n `<button class=\"oks-access-opt\" data-action=\"mask\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n const preset = (id: string, label: string, icon: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n\n return `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" inert>\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n <h4 class=\"oks-access-title\">${escapeHtml(t.presets)}</h4>\n <div class=\"oks-access-presets\">\n ${preset('lowvision', t.pLow, ICON_CONTRAST)}\n ${preset('dyslexia', t.pDys, ICON_DYSLEXIA)}\n ${preset('motor', t.pMot, ICON_CURSOR)}\n ${preset('calm', t.pCalm, ICON_HIDE)}\n </div>\n <h4 class=\"oks-access-title\">${escapeHtml(t.txt)}</h4>\n ${grid([\n multi('multi', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('multi', 'oks-lh', 3, t.lh, ICON_LH),\n multi('multi', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('oks-a11y-font', t.font, ICON_FONT),\n toggle('oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('multi', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.vis)}</h4>\n ${grid([\n toggle('oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n <h4 class=\"oks-access-title\">${escapeHtml(t.ori)}</h4>\n ${grid([\n guide(t.guide, ICON_GUIDE),\n mask(t.mask, ICON_MASK),\n toggle('oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('oks-a11y-bigtargets', t.targets, ICON_TARGETS),\n toggle('oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\n }[c] ?? c));\n}\nfunction escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, '&#39;');\n}\n\ninterface PositionRules {\n wrap: string;\n panel: string;\n}\n\nfunction positionRules(position: Position): PositionRules {\n switch (position) {\n case 'top-left': return { wrap: 'top: 20px; left: 20px;', panel: 'top: 80px; left: 20px;' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n readingMask: false,\n bigTargets: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide &&\n !state.readingMask &&\n !state.bigTargets\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n 'oks-a11y-bigtargets': 'bigTargets',\n};\n\n/** Preset profiles: set the listed flags to true, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nconst PRESETS: Record<string, Partial<PanelState>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un dispose para\n * limpiar.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): () => void {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt, .oks-preset'));\n\n if (!trigger || !panel || !closeBtn || !resetBtn || !wrapper) {\n return () => {};\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n // Aplica `state` al DOM (clases en body/html + estado de los botones).\n function applyState(): void {\n const body = document.body;\n const root = document.documentElement;\n // Limpiar todo lo nuestro antes de re-aplicar.\n body.className = body.className.replace(/\\boks-\\w+(?:-\\d+)?\\b/g, '').trim();\n [1, 2, 3].forEach((l) => root.classList.remove(`oks-colorblind-${l}`));\n\n if (state.zoom > 0) body.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) body.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) body.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) body.classList.add(`oks-ls-${state.ls}`);\n if (state.colorblind > 0) root.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.font) body.classList.add('oks-a11y-font');\n if (state.dyslexia) body.classList.add('oks-dyslexia');\n if (state.contrast) body.classList.add('oks-a11y-contrast');\n if (state.hideImages) body.classList.add('oks-a11y-hide');\n if (state.highlightLinks) body.classList.add('oks-a11y-links');\n if (state.bigCursor) body.classList.add('oks-big-cursor');\n if (state.pauseAnim) body.classList.add('oks-a11y-pause');\n if (state.focusOutline) body.classList.add('oks-a11y-focus');\n if (state.readingGuide) body.classList.add('oks-a11y-guide');\n if (state.readingMask) body.classList.add('oks-a11y-mask');\n if (state.bigTargets) body.classList.add('oks-a11y-bigtargets');\n\n const overlay = ensureOverlay();\n overlay.classList.toggle('is-active', state.grayOverlay);\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n // Preset buttons don't carry persistent active state — they apply\n // a bundle of flags and let the user adjust afterwards.\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n // Contrast y grayOverlay son mutuamente excluyentes.\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') ?? '';\n const preset = PRESETS[id];\n if (preset) Object.assign(state, preset);\n // Transient click feedback — see styles.ts .oks-preset.is-flashing.\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n const openPanel = (): void => {\n panel.classList.add('is-open');\n panel.removeAttribute('inert');\n trigger.setAttribute('aria-expanded', 'true');\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n panel.classList.remove('is-open');\n // inert (not aria-hidden) while closed: its focusable controls leave the\n // tab order and the accessibility tree, fixing the aria-hidden-focus\n // violation. inert also blurs any focus held inside before we restore it.\n panel.setAttribute('inert', '');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n };\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n // Clicks that originate inside our Shadow DOM are retargeted to the\n // host element when they bubble to `document`, so `panel.contains(t)`\n // returns false even though the user clicked something *inside* the\n // panel. composedPath() preserves the full path across shadow\n // boundaries — use that to detect \"click stayed within the widget\".\n const path = e.composedPath();\n if (path.includes(panel) || path.includes(trigger) || path.includes(wrapper)) return;\n closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Reading guide + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n return () => {\n trigger.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n };\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\nbody.oks-a11y-focus a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-focus input,\nbody.oks-a11y-focus select,\nbody.oks-a11y-focus textarea {\n outline: 2px dashed rgba(0, 95, 204, 0.45) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid #005fcc !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px rgba(0, 95, 204, 0.25) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n\n/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n","// Heredado del plugin WP oksigenia-access v16.9.\n// 8 locales: español PY (con Guaraní separado como lengua oficial PY),\n// inglés, francés, italiano, alemán, neerlandés, sueco.\n\nexport type LocaleCode = 'es' | 'gn' | 'en' | 'fr' | 'it' | 'de' | 'nl' | 'sv';\n\nexport interface Translation {\n title: string;\n close: string;\n txt: string;\n size: string;\n lh: string;\n align: string;\n font: string;\n dyslexia: string;\n vis: string;\n contrast: string;\n gray: string;\n hide: string;\n links: string;\n ori: string;\n guide: string;\n mask: string;\n targets: string;\n cursor: string;\n pause: string;\n reset: string;\n dev: string;\n ls: string;\n cb: string;\n focus: string;\n /** Section title for the preset row. */\n presets: string;\n /** Preset labels. */\n pLow: string;\n pDys: string;\n pMot: string;\n pCalm: string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.' },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.' },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy' },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.' },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.' },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.' },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.' },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.' },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// Web component <oksigenia-access-panel>. Importar este módulo\n// registra el custom element y monta el panel + sus efectos globales.\n\nimport { buildPanelHtml, positionCss, type Position } from './render.js';\nimport { bindPanelBehavior } from './behavior.js';\nimport { PANEL_CSS, EFFECT_CSS } from './styles.js';\nimport { COLORBLIND_FILTERS_SVG } from './icons.js';\nimport { getTranslation } from './translations.js';\nimport type { TriggerIcon } from './icons.js';\n\nconst OBSERVED = ['locale', 'position', 'position-mobile', 'trigger-icon', 'storage-key'] as const;\nconst STYLE_ID = 'oksigenia-access-effects';\nconst FILTERS_ID = 'oksigenia-access-filters';\nconst GUIDE_ID = 'oks-reading-guide';\nconst MASK_ID = 'oks-reading-mask';\n\nfunction ensureGlobalStyles(): void {\n if (typeof document === 'undefined') return;\n if (!document.getElementById(STYLE_ID)) {\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = EFFECT_CSS;\n document.head.appendChild(style);\n }\n if (!document.getElementById(FILTERS_ID)) {\n const wrap = document.createElement('div');\n wrap.id = FILTERS_ID;\n wrap.style.cssText = 'position:absolute;width:0;height:0;overflow:hidden;';\n wrap.innerHTML = COLORBLIND_FILTERS_SVG;\n document.body.appendChild(wrap);\n }\n if (!document.getElementById(GUIDE_ID)) {\n const guide = document.createElement('div');\n guide.id = GUIDE_ID;\n guide.className = 'oks-reading-guide';\n document.body.appendChild(guide);\n }\n if (!document.getElementById(MASK_ID)) {\n const mask = document.createElement('div');\n mask.id = MASK_ID;\n mask.className = 'oks-reading-mask';\n document.body.appendChild(mask);\n }\n}\n\nconst VALID_POSITIONS: readonly Position[] = [\n 'top-left', 'top-right', 'mid-left', 'mid-right', 'bottom-left', 'bottom-right',\n];\nconst VALID_ICONS: readonly TriggerIcon[] = ['vitruvian', 'wheelchair', 'eye', 'universal'];\n\nexport class OksigeniaAccessPanelElement extends HTMLElement {\n static get observedAttributes(): readonly string[] {\n return OBSERVED;\n }\n\n private _dispose: (() => void) | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback(): void {\n ensureGlobalStyles();\n this.render();\n }\n\n disconnectedCallback(): void {\n this._dispose?.();\n this._dispose = null;\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) this.render();\n }\n\n private getPosition(): Position {\n const attr = (this.getAttribute('position') ?? 'mid-left') as Position;\n return VALID_POSITIONS.includes(attr) ? attr : 'mid-left';\n }\n\n private getPositionMobile(): Position | undefined {\n const attr = this.getAttribute('position-mobile') as Position | null;\n return attr && VALID_POSITIONS.includes(attr) ? attr : undefined;\n }\n\n private getTriggerIcon(): TriggerIcon {\n const attr = (this.getAttribute('trigger-icon') ?? 'vitruvian') as TriggerIcon;\n return VALID_ICONS.includes(attr) ? attr : 'vitruvian';\n }\n\n private getLocale(): string {\n return this.getAttribute('locale')\n ?? (typeof navigator !== 'undefined' ? navigator.language : 'en');\n }\n\n private render(): void {\n const shadow = this.shadowRoot;\n if (!shadow) return;\n this._dispose?.();\n\n const position = this.getPosition();\n const positionMobile = this.getPositionMobile();\n const html = buildPanelHtml({\n t: getTranslation(this.getLocale()),\n triggerIcon: this.getTriggerIcon(),\n position,\n });\n shadow.innerHTML = `<style>${PANEL_CSS}${positionCss(position, positionMobile)}</style>${html}`;\n this._dispose = bindPanelBehavior(shadow, {\n storageKey: this.getAttribute('storage-key') ?? undefined,\n });\n }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('oksigenia-access-panel')) {\n customElements.define('oksigenia-access-panel', OksigeniaAccessPanelElement);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'oksigenia-access-panel': OksigeniaAccessPanelElement;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oksigenia/access-panel",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Accessibility panel as a web component. 17 controls (text size, line height, dyslexia font, contrast, colorblind, reading guide, reading mask, big cursor, big targets, pause animations, focus, …) + 4 profile presets (low vision, dyslexia, motor, no distractions), across 8 locales (incl. Guaraní). Zero deps, no tracking.",
5
5
  "keywords": [
6
6
  "accessibility",
@@ -42,6 +42,7 @@
42
42
  },
43
43
  "files": [
44
44
  "dist",
45
+ "CHANGELOG.md",
45
46
  "LICENSE",
46
47
  "NOTICE.md"
47
48
  ],