@oksigenia/access-panel 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/translations.ts","../src/icons.ts","../src/controls.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts"],"names":[],"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmPlB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkLnB,SAAS,gBAAgB,CAAA,EAAmB;AACjD,EAAA,OAAO;AAAA,EACP,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,mBAAmB,CAAC,CAAA;;AAAA,EAErB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAOD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,EAID,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAMD,CAAC,uBAAuB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA,EAKD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAOH","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 /** aria-label de un control multinivel activo: (etiqueta, nivel n, máximo m).\n * Solo se aplica cuando n > 0; en n = 0 el botón usa su etiqueta a secas. */\n level: (label: string, n: number, m: number) => string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.', level: (l, n, m) => `${l}, nivel ${n} de ${m}` },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.', level: (l, n, m) => `${l}, level ${n} of ${m}` },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy', level: (l, n, m) => `${l}, ${n}/${m}` },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.', level: (l, n, m) => `${l}, niveau ${n} sur ${m}` },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.', level: (l, n, m) => `${l}, livello ${n} di ${m}` },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.', level: (l, n, m) => `${l}, Stufe ${n} von ${m}` },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.', level: (l, n, m) => `${l}, niveau ${n} van ${m}` },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.', level: (l, n, m) => `${l}, nivå ${n} av ${m}` },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></svg>';\n\n// Iconos del botón flotante. `porthole` reutiliza el glifo universal de\n// accesibilidad (persona) y le añade un aro de ojo de buey por CSS — el glifo\n// estándar NUNCA se sustituye, solo se enmarca (a11y: preserva la\n// descubribilidad por convención).\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal' | 'porthole';\n\nconst UNIVERSAL_GLYPH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: UNIVERSAL_GLYPH,\n porthole: UNIVERSAL_GLYPH,\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","// Single source of truth for the panel's control catalogue.\n//\n// Each atomic control has a stable, human-readable id (the value the host\n// passes in `controls=` / `exclude=`). Render, behavior and the web component\n// all resolve curation against this registry so the three never drift.\n//\n// The ids are part of the public API — they are documented and used by hosts —\n// so treat renames as breaking.\n\nimport type { PanelState } from './state.js';\n\nexport type ControlId =\n | 'text-size'\n | 'line-height'\n | 'text-align'\n | 'readable-font'\n | 'dyslexia-font'\n | 'letter-spacing'\n | 'contrast'\n | 'grayscale'\n | 'hide-images'\n | 'highlight-links'\n | 'colorblind'\n | 'reading-guide'\n | 'reading-mask'\n | 'big-cursor'\n | 'big-targets'\n | 'pause-anim'\n | 'focus';\n\n/** Render order (also the order `exclude=`/`controls=` are validated against). */\nexport const ALL_CONTROLS: readonly ControlId[] = [\n 'text-size', 'line-height', 'text-align', 'readable-font', 'dyslexia-font', 'letter-spacing',\n 'contrast', 'grayscale', 'hide-images', 'highlight-links', 'colorblind',\n 'reading-guide', 'reading-mask', 'big-cursor', 'big-targets', 'pause-anim', 'focus',\n];\n\n/** Control id → the PanelState field it drives. */\nexport const CONTROL_STATE_KEY: Readonly<Record<ControlId, keyof PanelState>> = {\n 'text-size': 'zoom',\n 'line-height': 'lh',\n 'text-align': 'align',\n 'readable-font': 'font',\n 'dyslexia-font': 'dyslexia',\n 'letter-spacing': 'ls',\n 'contrast': 'contrast',\n 'grayscale': 'grayOverlay',\n 'hide-images': 'hideImages',\n 'highlight-links': 'highlightLinks',\n 'colorblind': 'colorblind',\n 'reading-guide': 'readingGuide',\n 'reading-mask': 'readingMask',\n 'big-cursor': 'bigCursor',\n 'big-targets': 'bigTargets',\n 'pause-anim': 'pauseAnim',\n 'focus': 'focusOutline',\n};\n\n/** Reverse of CONTROL_STATE_KEY, for mapping a preset's flags back to controls. */\nconst STATE_KEY_CONTROL = Object.fromEntries(\n Object.entries(CONTROL_STATE_KEY).map(([control, key]) => [key, control as ControlId]),\n) as Record<keyof PanelState, ControlId>;\n\nexport type PresetId = 'lowvision' | 'dyslexia' | 'motor' | 'calm';\n\n/** Preset profiles: set the listed flags, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nexport const PRESETS: Readonly<Record<PresetId, Partial<PanelState>>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\n};\n\nexport const PRESET_IDS: readonly PresetId[] = ['lowvision', 'dyslexia', 'motor', 'calm'];\n\n/** Control ids a preset touches (used to hide/recompose it under curation). */\nexport function presetControlIds(id: PresetId): ControlId[] {\n return Object.keys(PRESETS[id]).map((k) => STATE_KEY_CONTROL[k as keyof PanelState]);\n}\n\n/**\n * Resolve which controls an instance offers from its `controls=` (whitelist)\n * and `exclude=` (blacklist) attributes. Both optional; unknown ids ignored.\n * No attributes ⇒ all 17 (current behavior).\n */\nexport function resolveEnabledControls(\n controlsAttr?: string | null,\n excludeAttr?: string | null,\n): Set<ControlId> {\n const valid = new Set(ALL_CONTROLS);\n const parse = (raw: string | null | undefined): ControlId[] =>\n (raw ?? '')\n .split(',')\n .map((s) => s.trim().toLowerCase() as ControlId)\n .filter((s) => valid.has(s));\n\n const whitelist = controlsAttr != null ? parse(controlsAttr) : null;\n let enabled = whitelist && whitelist.length > 0 ? new Set(whitelist) : new Set(ALL_CONTROLS);\n\n if (excludeAttr != null) {\n for (const id of parse(excludeAttr)) enabled.delete(id);\n }\n return enabled;\n}\n\n/**\n * Controls that cannot be confined to a container (`scope=`): the full-screen\n * overlays (grayscale, reading guide, reading mask), the colour-blind root\n * `filter` on `<html>`, and the window-level big cursor. A scoped instance\n * auto-excludes these — a per-pane panel only offers what it can regionalise.\n */\nexport const NON_SCOPABLE_CONTROLS: readonly ControlId[] = [\n 'grayscale', 'reading-guide', 'reading-mask', 'big-cursor', 'colorblind',\n];\n\n/** Remove the non-scopable controls from an enabled set (scoped mode). */\nexport function scopedControls(enabled: Set<ControlId>): Set<ControlId> {\n const out = new Set(enabled);\n for (const id of NON_SCOPABLE_CONTROLS) out.delete(id);\n return out;\n}\n\n/**\n * Recompose a preset for a curated instance: keep only the flags whose control\n * is still offered. The open design point Bentos flagged — a preset in a window\n * that excludes its controls (e.g. \"dyslexia\" where the dyslexia font and\n * reading guide are gone) collapses to whatever it can still legitimately set,\n * and is hidden entirely (see `presetIsAvailable`) when nothing remains.\n */\nexport function filterPresetForEnabled(\n id: PresetId,\n enabled: Set<ControlId>,\n): Partial<PanelState> {\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(PRESETS[id]) as Array<[keyof PanelState, never]>) {\n if (enabled.has(STATE_KEY_CONTROL[k])) out[k] = v;\n }\n return out;\n}\n\n/**\n * A preset shows only if it still bundles **two or more** controls after\n * curation. A profile is a combination — one that collapses to a single\n * control is redundant with that control's own button, so it is hidden.\n */\nexport function presetIsAvailable(id: PresetId, enabled: Set<ControlId>): boolean {\n return presetControlIds(id).filter((c) => enabled.has(c)).length >= 2;\n}\n","import type { Translation } from './translations.js';\nimport {\n ALL_CONTROLS, PRESET_IDS, presetIsAvailable,\n type ControlId, type PresetId,\n} from './controls.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_MASK, ICON_TARGETS,\n ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position =\n | 'top-left' | 'top-center' | 'top-right'\n | 'mid-left' | 'mid-center' | 'mid-right'\n | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n /** Controls offered by this instance. Defaults to all 17. */\n enabled?: Set<ControlId>;\n /** Render the floating trigger button. `false` for host-driven mode\n * (`trigger=\"none\"`): the panel renders without its launcher and the host\n * opens it via `.open()`. Defaults to true. */\n showTrigger?: boolean;\n /** Render the profile presets row. `false` (`presets=\"none\"`) drops it\n * entirely. Defaults to true; individual presets still self-hide under the\n * ≥2-control rule. */\n showPresets?: boolean;\n}\n\nconst PRESET_ICON: Record<PresetId, string> = {\n lowvision: ICON_CONTRAST,\n dyslexia: ICON_DYSLEXIA,\n motor: ICON_CURSOR,\n calm: ICON_HIDE,\n};\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const enabled = opts.enabled ?? new Set(ALL_CONTROLS);\n const showTrigger = opts.showTrigger ?? true;\n const showPresets = opts.showPresets ?? true;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n // Each control helper emits its button only when the instance offers it\n // (#1 curation). A control id is stamped as data-control so behavior and\n // tests can resolve it back to the registry.\n const multi = (id: ControlId, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n if (!enabled.has(id)) return '';\n const action = id === 'colorblind' ? 'colorblind' : 'multi';\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-control=\"${id}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (id: ControlId, klass: string, label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const overlay = (id: ControlId, target: string, label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"overlay\" data-target=\"${target}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const simple = (id: ControlId, action: 'guide' | 'mask', label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"${action}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const preset = (id: PresetId, label: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" type=\"button\"><span class=\"oks-icon\">${PRESET_ICON[id]}</span><span class=\"oks-label\">${label}</span></button>`;\n\n // A section renders its heading only when it has at least one control —\n // otherwise a curated instance leaves orphan \"TEXT\" / \"VISUAL\" titles.\n const section = (title: string, rows: string[]): string => {\n const kept = rows.filter(Boolean);\n if (kept.length === 0) return '';\n return `<h4 class=\"oks-access-title\">${escapeHtml(title)}</h4><div class=\"oks-access-grid\">${kept.join('')}</div>`;\n };\n\n const presetLabels: Record<PresetId, string> = {\n lowvision: t.pLow, dyslexia: t.pDys, motor: t.pMot, calm: t.pCalm,\n };\n const presetButtons = showPresets\n ? PRESET_IDS.filter((id) => presetIsAvailable(id, enabled)).map((id) => preset(id, presetLabels[id]))\n : [];\n const presetsBlock = presetButtons.length\n ? `<h4 class=\"oks-access-title\">${escapeHtml(t.presets)}</h4><div class=\"oks-access-presets\">${presetButtons.join('')}</div>`\n : '';\n\n const triggerBlock = showTrigger ? `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" part=\"trigger\" data-trigger-icon=\"${triggerIcon}\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>` : '';\n\n return `${triggerBlock}\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" inert>\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n ${presetsBlock}\n ${section(t.txt, [\n multi('text-size', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('line-height', 'oks-lh', 3, t.lh, ICON_LH),\n multi('text-align', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('readable-font', 'oks-a11y-font', t.font, ICON_FONT),\n toggle('dyslexia-font', 'oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('letter-spacing', 'oks-ls', 3, t.ls, ICON_LS),\n ])}\n ${section(t.vis, [\n toggle('contrast', 'oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('grayscale', 'oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('hide-images', 'oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('highlight-links', 'oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, true),\n ])}\n ${section(t.ori, [\n simple('reading-guide', 'guide', t.guide, ICON_GUIDE),\n simple('reading-mask', 'mask', t.mask, ICON_MASK),\n toggle('big-cursor', 'oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('big-targets', 'oks-a11y-bigtargets', t.targets, ICON_TARGETS),\n toggle('pause-anim', 'oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('focus', 'oks-a11y-focus', t.focus, ICON_FOCUS),\n ])}\n </div>\n <div class=\"oks-access-footer\">\n <button class=\"oks-access-reset\" id=\"oks-reset\" type=\"button\">${escapeHtml(t.reset)}</button>\n <div class=\"oks-access-branding\">${escapeHtml(t.dev)} <a href=\"https://oksigenia.com\" target=\"_blank\" rel=\"noopener noreferrer\">Oksigenia</a></div>\n </div>\n</div>\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({\n '&': '&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-center': return { wrap: 'top: 20px; left: 50%; transform: translateX(-50%);', panel: 'top: 80px; left: 50%; transform: translateX(-50%);' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-center': return { wrap: 'top: 50%; left: 50%; transform: translate(-50%, -50%);', panel: 'top: 50%; left: 50%; transform: translate(-50%, -50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-center': return { wrap: 'bottom: 20px; left: 50%; transform: translateX(-50%);', panel: 'bottom: 100px; left: 50%; transform: translateX(-50%);' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n readingMask: false,\n bigTargets: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide &&\n !state.readingMask &&\n !state.bigTargets\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\nimport { getTranslation } from './translations.js';\nimport {\n ALL_CONTROLS, PRESETS, filterPresetForEnabled, type ControlId, type PresetId,\n} from './controls.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n 'oks-a11y-bigtargets': 'bigTargets',\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n /** Locale para los aria-label dinámicos (nivel de los multinivel). Default en. */\n locale?: string;\n /** Controles que ofrece esta instancia (#1). Default: los 17. Filtra qué\n * flags puede aplicar un perfil. */\n enabled?: Set<ControlId>;\n /** Desplazamiento máximo del usuario para el trigger en px (#5). 0/ausente\n * desactiva el nudge (comportamiento actual). */\n nudgeMax?: number;\n /** Contenedor al que confinar los efectos (`scope=`). Si se pasa, las clases\n * scopables van a este elemento en vez de a `body`, y los efectos no\n * regionalizables (overlays, daltonismo, cursor) no se aplican. */\n scopeEl?: HTMLElement | null;\n}\n\n/** Dispose function with imperative open/close/toggle attached (#2). Calling\n * the value disposes; the methods drive the panel host-side. */\nexport interface PanelController {\n (): void;\n open(): void;\n close(): void;\n toggle(): void;\n}\n\nfunction noopController(): PanelController {\n return Object.assign(() => {}, { open() {}, close() {}, toggle() {} });\n}\n\n/** Deepest focused element, crossing shadow boundaries — so we can restore\n * focus to whatever opened the panel (the host's own button in trigger=\"none\"\n * mode, the floating trigger otherwise). */\nfunction deepActiveElement(): HTMLElement | null {\n let a = document.activeElement as HTMLElement | null;\n while (a?.shadowRoot?.activeElement) a = a.shadowRoot.activeElement as HTMLElement;\n return a;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un PanelController:\n * invocarlo limpia; sus métodos abren/cierran el panel.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): PanelController {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const t = getTranslation(opts.locale ?? 'en');\n const enabled = opts.enabled ?? new Set(ALL_CONTROLS);\n const nudgeMax = Math.max(0, opts.nudgeMax ?? 0);\n\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt, .oks-preset'));\n\n // trigger + wrapper are optional (trigger=\"none\" host-driven mode); the\n // panel itself and its close/reset are required.\n if (!panel || !closeBtn || !resetBtn) {\n return noopController();\n }\n\n let state: PanelState = loadState(storageKey);\n\n // ─── Render-from-state ──────────────────────────────────────────\n function applyState(): void {\n // `scopeEl === undefined` → global mode (apply to body). Defined (element or\n // null) → scoped: apply scopable effects to that element, never to body. If\n // the scope element is missing (null), the effects simply no-op rather than\n // leaking to body.\n const scoped = opts.scopeEl !== undefined;\n const fxRoot: HTMLElement | null = scoped ? (opts.scopeEl ?? null) : document.body;\n const rootEl = document.documentElement;\n if (fxRoot) {\n for (const cls of Array.from(fxRoot.classList)) {\n if (cls.startsWith('oks-')) fxRoot.classList.remove(cls);\n }\n }\n if (!scoped) [1, 2, 3].forEach((l) => rootEl.classList.remove(`oks-colorblind-${l}`));\n\n if (fxRoot) {\n if (state.zoom > 0) fxRoot.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) fxRoot.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) fxRoot.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) fxRoot.classList.add(`oks-ls-${state.ls}`);\n if (state.font) fxRoot.classList.add('oks-a11y-font');\n if (state.dyslexia) fxRoot.classList.add('oks-dyslexia');\n if (state.contrast) fxRoot.classList.add('oks-a11y-contrast');\n if (state.hideImages) fxRoot.classList.add('oks-a11y-hide');\n if (state.highlightLinks) fxRoot.classList.add('oks-a11y-links');\n if (state.pauseAnim) fxRoot.classList.add('oks-a11y-pause');\n if (state.focusOutline) fxRoot.classList.add('oks-a11y-focus');\n if (state.bigTargets) fxRoot.classList.add('oks-a11y-bigtargets');\n }\n\n // Non-scopable effects apply only in global mode (auto-excluded when scoped).\n if (!scoped) {\n if (state.colorblind > 0) rootEl.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.bigCursor) document.body.classList.add('oks-big-cursor');\n if (state.readingGuide) document.body.classList.add('oks-a11y-guide');\n if (state.readingMask) document.body.classList.add('oks-a11y-mask');\n ensureOverlay().classList.toggle('is-active', state.grayOverlay);\n }\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n const max = parseInt(btn.getAttribute('data-levels') ?? '0', 10);\n const lbl = btn.querySelector('.oks-label')?.textContent?.trim() ?? '';\n if (lvl > 0 && max > 0) btn.setAttribute('aria-label', t.level(lbl, lvl, max));\n else btn.removeAttribute('aria-label');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') as PresetId | null;\n // Recompose the preset to the controls this instance still offers (#1):\n // a profile never sets a flag the user can't see or undo here.\n if (id && PRESETS[id]) Object.assign(state, filterPresetForEnabled(id, enabled));\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n };\n\n // ─── Open / close (also exposed imperatively, #2) ───────────────\n let opener: HTMLElement | null = null;\n // When the host opens us from its own button (trigger=\"none\"), that click\n // keeps bubbling to document, where onDocClick would treat it as an\n // outside-click and close us in the same gesture. Ignore the doc-click for\n // the current event-loop turn after opening.\n let ignoreDocClose = false;\n\n // In scoped mode the dialog anchors to its container (over the pane's top),\n // not to a shared viewport corner — otherwise several scoped panels open in\n // the same spot and read as one. Computed from the scope's box on open and\n // kept in place while open (scroll/resize).\n const positionScopedDialog = (): void => {\n const el = opts.scopeEl;\n if (!el) return;\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return; // not laid out yet\n const pad = 8;\n panel.style.top = `${Math.max(pad, r.top + pad)}px`;\n panel.style.bottom = 'auto';\n panel.style.left = `${r.left + r.width / 2}px`;\n panel.style.right = 'auto';\n panel.style.transform = 'translateX(-50%)';\n };\n\n const openPanel = (): void => {\n if (panel.classList.contains('is-open')) return;\n opener = deepActiveElement();\n panel.classList.add('is-open');\n panel.removeAttribute('inert');\n if (opts.scopeEl) positionScopedDialog();\n trigger?.setAttribute('aria-expanded', 'true');\n ignoreDocClose = true;\n setTimeout(() => { ignoreDocClose = false; }, 0);\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n if (!panel.classList.contains('is-open')) return;\n panel.classList.remove('is-open');\n panel.setAttribute('inert', '');\n trigger?.setAttribute('aria-expanded', 'false');\n // Restore focus to the trigger, or to whatever opened us host-side.\n if (trigger) trigger.focus();\n else if (opener?.isConnected) opener.focus();\n opener = null;\n };\n const togglePanel = (): void => {\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n let suppressClick = false;\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n // A click that ended a drag must not also open the panel.\n if (suppressClick) { suppressClick = false; return; }\n togglePanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (ignoreDocClose) return;\n const path = e.composedPath();\n if (path.includes(panel)) return;\n if (trigger && path.includes(trigger)) return;\n if (wrapper && path.includes(wrapper)) return;\n closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled]), a[href]'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Bounded nudge: user repositions the trigger within limits (#5) ──\n // An accessibility feature in itself — a user with a reduced visual field,\n // a screen magnifier, or left-handed reach can move the launcher out of\n // their way. Bounded so it can never be lost off-screen or buried.\n const NUDGE_KEY = `${storageKey}::pos`;\n const clampMax = (v: number): number => Math.max(-nudgeMax, Math.min(nudgeMax, v));\n let nudge = { x: 0, y: 0 };\n\n const loadNudge = (): void => {\n if (nudgeMax <= 0) return;\n try {\n const raw = localStorage.getItem(NUDGE_KEY);\n if (!raw) return;\n const p = JSON.parse(raw) as { x?: unknown; y?: unknown };\n if (typeof p?.x === 'number' && typeof p?.y === 'number') {\n nudge = { x: clampMax(p.x), y: clampMax(p.y) };\n }\n } catch { /* localStorage blocked / corrupt — ignore */ }\n };\n const saveNudge = (): void => {\n try {\n if (nudge.x === 0 && nudge.y === 0) localStorage.removeItem(NUDGE_KEY);\n else localStorage.setItem(NUDGE_KEY, JSON.stringify(nudge));\n } catch { /* fail silent */ }\n };\n const applyNudge = (): void => {\n // The `translate` property composes with the anchor's `transform`\n // (translateY(-50%) etc.) instead of overwriting it.\n if (wrapper) wrapper.style.translate = `${nudge.x}px ${nudge.y}px`;\n };\n // Clamp a tentative offset to ±max AND to the viewport, so the button never\n // leaves the screen regardless of anchor.\n const clampOffset = (x: number, y: number): { x: number; y: number } => {\n x = clampMax(x); y = clampMax(y);\n if (wrapper) {\n const r = wrapper.getBoundingClientRect();\n const pad = 4;\n const baseLeft = r.left - nudge.x;\n const baseTop = r.top - nudge.y;\n const vw = window.innerWidth || 0;\n const vh = window.innerHeight || 0;\n if (r.width > 0 && vw > 0) x = Math.max(pad - baseLeft, Math.min(vw - pad - r.width - baseLeft, x));\n if (r.height > 0 && vh > 0) y = Math.max(pad - baseTop, Math.min(vh - pad - r.height - baseTop, y));\n }\n return { x, y };\n };\n\n let dragStart: { px: number; py: number; ox: number; oy: number } | null = null;\n let didDrag = false;\n const DRAG_THRESHOLD = 4;\n const onPointerDown = (e: PointerEvent): void => {\n if (nudgeMax <= 0 || e.button !== 0) return;\n dragStart = { px: e.clientX, py: e.clientY, ox: nudge.x, oy: nudge.y };\n didDrag = false;\n trigger?.setPointerCapture?.(e.pointerId);\n };\n const onPointerMove = (e: PointerEvent): void => {\n if (!dragStart) return;\n const dx = e.clientX - dragStart.px;\n const dy = e.clientY - dragStart.py;\n if (!didDrag && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n didDrag = true;\n nudge = clampOffset(dragStart.ox + dx, dragStart.oy + dy);\n applyNudge();\n e.preventDefault();\n };\n const onPointerUp = (): void => {\n if (!dragStart) return;\n dragStart = null;\n if (didDrag) { saveNudge(); suppressClick = true; }\n };\n // Keyboard nudge — the accessible counterpart to drag (never drag-only on an\n // a11y control). Arrows move while the trigger is focused; Shift = fine step.\n const onTriggerKey = (e: KeyboardEvent): void => {\n if (nudgeMax <= 0) return;\n const step = e.shiftKey ? 1 : 10;\n let dx = 0; let dy = 0;\n if (e.key === 'ArrowLeft') dx = -step;\n else if (e.key === 'ArrowRight') dx = step;\n else if (e.key === 'ArrowUp') dy = -step;\n else if (e.key === 'ArrowDown') dy = step;\n else return;\n e.preventDefault();\n nudge = clampOffset(nudge.x + dx, nudge.y + dy);\n applyNudge();\n saveNudge();\n };\n\n // ─── Reading guide + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n if (!state.readingGuide && !state.readingMask) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (state.readingGuide) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (state.readingMask) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger?.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Keep the scoped dialog anchored to its pane while open.\n const onReposition = (): void => {\n if (opts.scopeEl && panel.classList.contains('is-open')) positionScopedDialog();\n };\n if (opts.scopeEl !== undefined) {\n window.addEventListener('scroll', onReposition, true);\n window.addEventListener('resize', onReposition);\n }\n\n if (nudgeMax > 0 && trigger) {\n loadNudge();\n applyNudge();\n // Affordance + let the drag own the gesture instead of the page scrolling.\n trigger.style.cursor = 'grab';\n trigger.style.touchAction = 'none';\n trigger.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n trigger.addEventListener('keydown', onTriggerKey);\n }\n\n // Aplicar el estado guardado al cargar.\n applyState();\n\n const dispose = (): void => {\n trigger?.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n if (opts.scopeEl !== undefined) {\n window.removeEventListener('scroll', onReposition, true);\n window.removeEventListener('resize', onReposition);\n }\n trigger?.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n trigger?.removeEventListener('keydown', onTriggerKey);\n };\n\n return Object.assign(dispose, { open: openPanel, close: closePanel, toggle: togglePanel });\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n/* Porthole preset: a brushed-metal ring framing the standard glyph. The glyph\n itself is untouched (discoverability), only the button gets the frame.\n Hosts wanting a bespoke frame can target ::part(trigger) from light DOM. */\n.oks-access-btn[data-trigger-icon=\"porthole\"] {\n box-shadow: 0 0 0 4px #b0bec5, 0 0 0 7px #546e7a, 0 6px 18px rgba(0,0,0,0.3);\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (prefers-reduced-motion: reduce) {\n .oks-access-btn, .oks-access-panel, .oks-access-close,\n .oks-preset, .oks-access-opt { transition: none; }\n .oks-access-btn:hover { transform: scale(1); }\n .oks-preset.is-flashing { transform: none; }\n}\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\n/* Focus highlight colour is themeable via --oks-focus-color (default #005fcc):\n set it on :root for a dark theme so the highlight stays visible. The\n persistent \"all interactive\" dashed derives a 45% tint from it; the glow can\n be overridden on its own with --oks-focus-glow. */\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 color-mix(in srgb, var(--oks-focus-color, #005fcc) 45%, transparent) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid var(--oks-focus-color, #005fcc) !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px var(--oks-focus-glow, color-mix(in srgb, var(--oks-focus-color, #005fcc) 25%, transparent)) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n\n/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n\n/**\n * Scoped-mode effect CSS (#scope). Emits only the controls that can be confined\n * to a container by selector — the same rules as EFFECT_CSS but anchored to the\n * scope element instead of `body`. The non-scopable effects (colour-blind, which\n * is a `filter` on `<html>`; the full-screen overlays grayscale / reading guide /\n * reading mask; and big cursor) are NOT here — a scoped instance auto-excludes\n * those controls, so they never appear in a per-pane panel.\n *\n * Text size scopes as the container's `font-size`, so it scales `em`/inherited\n * text inside the pane but not `rem` (which is always relative to `<html>` —\n * there is no CSS way to anchor rem to a container). Hosts that want per-pane\n * text scaling size that pane's text in `em`.\n *\n * `s` is a host-provided CSS selector (e.g. `#map-pane`), trusted like the\n * effects-exclude value.\n */\nexport function scopedEffectCss(s: string): string {\n return `\n${s}.oks-zoom-1 { font-size: 110% !important; }\n${s}.oks-zoom-2 { font-size: 120% !important; }\n${s}.oks-zoom-3 { font-size: 135% !important; }\n${s}.oks-zoom-4 { font-size: 150% !important; }\n\n${s}.oks-lh-1 * { line-height: 1.6 !important; }\n${s}.oks-lh-2 * { line-height: 1.9 !important; }\n${s}.oks-lh-3 * { line-height: 2.2 !important; }\n\n${s}.oks-a11y-font, ${s}.oks-a11y-font * { font-family: Arial, sans-serif !important; }\n\n${s}.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\n${s}.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\n${s}.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\n${s}.oks-align-1 * { text-align: left !important; }\n${s}.oks-align-2 * { text-align: center !important; }\n${s}.oks-align-3 * { text-align: right !important; }\n\n${s}.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\n${s}.oks-ls-1 * { letter-spacing: 0.05em !important; }\n${s}.oks-ls-2 * { letter-spacing: 0.10em !important; }\n${s}.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\n${s}.oks-a11y-focus a,\n${s}.oks-a11y-focus button,\n${s}.oks-a11y-focus input,\n${s}.oks-a11y-focus select,\n${s}.oks-a11y-focus textarea {\n outline: 2px dashed color-mix(in srgb, var(--oks-focus-color, #005fcc) 45%, transparent) !important;\n outline-offset: 2px !important;\n}\n${s}.oks-a11y-focus *:focus-visible {\n outline: 3px solid var(--oks-focus-color, #005fcc) !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px var(--oks-focus-glow, color-mix(in srgb, var(--oks-focus-color, #005fcc) 25%, transparent)) !important;\n}\n\n${s}.oks-a11y-contrast, ${s}.oks-a11y-contrast * {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\n${s}.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\n${s}.oks-a11y-contrast a { color: #0ff !important; text-decoration: underline !important; }\n${s}.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n${s}.oks-a11y-bigtargets a,\n${s}.oks-a11y-bigtargets button,\n${s}.oks-a11y-bigtargets [role=\"button\"],\n${s}.oks-a11y-bigtargets input[type=\"checkbox\"],\n${s}.oks-a11y-bigtargets input[type=\"radio\"],\n${s}.oks-a11y-bigtargets summary {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n}\n"]}
1
+ {"version":3,"sources":["../src/translations.ts","../src/icons.ts","../src/controls.ts","../src/render.ts","../src/state.ts","../src/behavior.ts","../src/styles.ts"],"names":[],"mappings":";AA2CA,IAAM,IAAA,GAAkD;AAAA,EACtD,EAAA,EAAI,EAAE,KAAA,EAAO,eAAA,EAAiB,OAAO,QAAA,EAAU,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,WAAA,EAAU,EAAA,EAAI,cAAA,EAAgB,KAAA,EAAO,iBAAc,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,iBAAA,EAAmB,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,MAAM,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,SAAS,GAAA,EAAK,gBAAA,EAAe,KAAA,EAAO,SAAA,EAAQ,MAAM,YAAA,EAAW,OAAA,EAAS,kBAAA,EAAiB,MAAA,EAAQ,eAAA,EAAiB,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,oBAAoB,GAAA,EAAK,kBAAA,EAAoB,EAAA,EAAI,WAAA,EAAa,IAAI,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,YAAY,IAAA,EAAM,gBAAA,EAAe,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAC,CAAA,QAAA,EAAW,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAG;AAAA,EACrnB,EAAA,EAAI,EAAE,KAAA,EAAO,eAAA,EAAiB,OAAO,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,aAAA,EAAe,KAAA,EAAO,SAAS,IAAA,EAAM,eAAA,EAAiB,QAAA,EAAU,eAAA,EAAiB,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,MAAM,WAAA,EAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,mBAAmB,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,eAAA,EAAiB,MAAM,cAAA,EAAgB,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAa,GAAA,EAAK,cAAA,EAAgB,EAAA,EAAI,gBAAA,EAAkB,IAAI,aAAA,EAAe,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,YAAY,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAC,CAAA,QAAA,EAAW,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAG;AAAA,EAC7nB,EAAA,EAAI,EAAE,KAAA,EAAO,wBAAA,EAA0B,OAAO,OAAA,EAAS,GAAA,EAAK,qBAAA,EAAY,IAAA,EAAM,WAAA,EAAa,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,WAAW,IAAA,EAAM,eAAA,EAAc,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,MAAM,oBAAA,EAAY,IAAA,EAAM,mBAAA,EAAkB,KAAA,EAAO,WAAW,GAAA,EAAK,YAAA,EAAW,KAAA,EAAO,cAAA,EAAa,MAAM,aAAA,EAAY,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,WAAW,GAAA,EAAK,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,IAAI,QAAA,EAAU,KAAA,EAAO,WAAA,EAAU,OAAA,EAAS,aAAU,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,iBAAA,EAAc,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAG;AAAA,EACllB,EAAA,EAAI,EAAE,KAAA,EAAO,kBAAA,EAAiB,OAAO,QAAA,EAAU,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,cAAc,IAAA,EAAM,gBAAA,EAAkB,QAAA,EAAU,iBAAA,EAAmB,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,MAAM,cAAA,EAAgB,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,SAAS,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,eAAA,EAAiB,MAAM,gBAAA,EAAkB,OAAA,EAAS,gBAAA,EAAkB,MAAA,EAAQ,eAAA,EAAiB,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,oBAAiB,GAAA,EAAK,qBAAA,EAAiB,EAAA,EAAI,YAAA,EAAc,IAAI,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,WAAW,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,eAAA,EAAiB,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAC,CAAA,SAAA,EAAY,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAG;AAAA,EAC/oB,EAAA,EAAI,EAAE,KAAA,EAAO,kBAAA,EAAiB,OAAO,QAAA,EAAU,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,gBAAgB,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,gBAAA,EAAkB,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,MAAM,aAAA,EAAe,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,QAAQ,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,OAAA,EAAS,MAAM,UAAA,EAAY,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,gBAAA,EAAkB,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAa,GAAA,EAAK,eAAA,EAAiB,EAAA,EAAI,YAAA,EAAc,IAAI,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,WAAW,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAC,CAAA,UAAA,EAAa,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAG;AAAA,EACznB,EAAA,EAAI,EAAE,KAAA,EAAO,kBAAA,EAAoB,OAAO,cAAA,EAAa,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,aAAA,EAAS,EAAA,EAAI,eAAA,EAAc,KAAA,EAAO,eAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,MAAM,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,SAAS,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,WAAA,EAAa,MAAM,WAAA,EAAa,OAAA,EAAS,gBAAA,EAAe,MAAA,EAAQ,kBAAA,EAAiB,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,mBAAgB,GAAA,EAAK,gBAAA,EAAkB,EAAA,EAAI,cAAA,EAAgB,IAAI,eAAA,EAAiB,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,WAAW,IAAA,EAAM,gBAAA,EAAe,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAC,CAAA,QAAA,EAAW,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAG;AAAA,EAC1nB,EAAA,EAAI,EAAE,KAAA,EAAO,kBAAA,EAAoB,OAAO,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,aAAA,EAAe,KAAA,EAAO,cAAc,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,MAAM,aAAA,EAAe,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,SAAS,GAAA,EAAK,eAAA,EAAc,KAAA,EAAO,UAAA,EAAY,MAAM,YAAA,EAAc,OAAA,EAAS,cAAA,EAAgB,MAAA,EAAQ,cAAA,EAAgB,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,YAAY,GAAA,EAAK,iBAAA,EAAmB,EAAA,EAAI,cAAA,EAAgB,IAAI,cAAA,EAAgB,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,aAAa,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAC,CAAA,SAAA,EAAY,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,EAAG;AAAA,EAC9nB,EAAA,EAAI,EAAE,KAAA,EAAO,mBAAA,EAAkB,OAAO,UAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,YAAA,EAAW,KAAA,EAAO,aAAa,IAAA,EAAM,WAAA,EAAU,QAAA,EAAU,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,MAAM,aAAA,EAAY,IAAA,EAAM,gBAAA,EAAe,KAAA,EAAO,aAAU,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,cAAA,EAAa,MAAM,YAAA,EAAW,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ,gBAAA,EAAe,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,mBAAa,GAAA,EAAK,cAAA,EAAgB,EAAA,EAAI,eAAA,EAAiB,IAAI,iBAAA,EAAgB,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,YAAY,IAAA,EAAM,gBAAA,EAAe,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,eAAA,EAAiB,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,GAAG,CAAC,CAAA,UAAA,EAAU,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA;AACnmB,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;;;AC5DO,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;AAQ5B,IAAM,eAAA,GAAkB,qJAAA;AAEjB,IAAM,aAAA,GAA6C;AAAA,EACxD,SAAA,EAAW,u5BAAA;AAAA,EACX,UAAA,EAAY,0eAAA;AAAA,EACZ,GAAA,EAAK,kRAAA;AAAA,EACL,SAAA,EAAW,eAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,UAAA,GAAa,6MAAA;AAGnB,IAAM,sBAAA,GAAyB;;;ACX/B,IAAM,YAAA,GAAqC;AAAA,EAChD,WAAA;AAAA,EAAa,aAAA;AAAA,EAAe,YAAA;AAAA,EAAc,eAAA;AAAA,EAAiB,eAAA;AAAA,EAAiB,gBAAA;AAAA,EAC5E,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa,aAAA;AAAA,EAAe,iBAAA;AAAA,EAAmB,YAAA;AAAA,EAC3D,eAAA;AAAA,EAAiB,cAAA;AAAA,EAAgB,YAAA;AAAA,EAAc,aAAA;AAAA,EAAe,YAAA;AAAA,EAAc;AAC9E;AAGO,IAAM,iBAAA,GAAmE;AAAA,EAC9E,WAAA,EAAa,MAAA;AAAA,EACb,aAAA,EAAe,IAAA;AAAA,EACf,YAAA,EAAc,OAAA;AAAA,EACd,eAAA,EAAiB,MAAA;AAAA,EACjB,eAAA,EAAiB,UAAA;AAAA,EACjB,gBAAA,EAAkB,IAAA;AAAA,EAClB,UAAA,EAAY,UAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,YAAA;AAAA,EACf,iBAAA,EAAmB,gBAAA;AAAA,EACnB,YAAA,EAAc,YAAA;AAAA,EACd,eAAA,EAAiB,cAAA;AAAA,EACjB,cAAA,EAAgB,aAAA;AAAA,EAChB,YAAA,EAAc,WAAA;AAAA,EACd,aAAA,EAAe,YAAA;AAAA,EACf,YAAA,EAAc,WAAA;AAAA,EACd,OAAA,EAAS;AACX,CAAA;AAGA,IAAM,oBAAoB,MAAA,CAAO,WAAA;AAAA,EAC/B,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,OAAA,EAAS,GAAG,CAAA,KAAM,CAAC,GAAA,EAAK,OAAoB,CAAC;AACvF,CAAA;AAMO,IAAM,OAAA,GAA2D;AAAA,EACtE,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;AAEO,IAAM,UAAA,GAAkC,CAAC,WAAA,EAAa,UAAA,EAAY,SAAS,MAAM;AAGjF,SAAS,iBAAiB,EAAA,EAA2B;AAC1D,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAqB,CAAC,CAAA;AACrF;AAOO,SAAS,sBAAA,CACd,cACA,WAAA,EACgB;AAChB,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,YAAY,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAA,CACZ,GAAA,IAAO,IACL,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAK,CAAE,WAAA,EAA0B,CAAA,CAC9C,MAAA,CAAO,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AAE/B,EAAA,MAAM,SAAA,GAAY,YAAA,IAAgB,IAAA,GAAO,KAAA,CAAM,YAAY,CAAA,GAAI,IAAA;AAC/D,EAAA,IAAI,OAAA,GAAU,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,IAAI,GAAA,CAAI,SAAS,CAAA,GAAI,IAAI,GAAA,CAAI,YAAY,CAAA;AAE3F,EAAA,IAAI,eAAe,IAAA,EAAM;AACvB,IAAA,KAAA,MAAW,MAAM,KAAA,CAAM,WAAW,CAAA,EAAG,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,OAAA;AACT;AAQO,IAAM,qBAAA,GAA8C,CAAC,WAAA,EAAa,YAAY;AAS9E,IAAM,yBAAA,GAAkD;AAAA,EAC7D,YAAA;AAAA,EAAc,eAAA;AAAA,EAAiB;AACjC;AAGO,SAAS,eAAe,OAAA,EAAyC;AACtE,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAO,CAAA;AAC3B,EAAA,KAAA,MAAW,EAAA,IAAM,qBAAA,EAAuB,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AACrD,EAAA,OAAO,GAAA;AACT;AASO,SAAS,sBAAA,CACd,IACA,OAAA,EACqB;AACrB,EAAA,MAAM,MAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAC,CAAA,EAAuC;AACpF,IAAA,IAAI,OAAA,CAAQ,IAAI,iBAAA,CAAkB,CAAC,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,GAAA;AACT;AAOO,SAAS,iBAAA,CAAkB,IAAc,OAAA,EAAkC;AAChF,EAAA,OAAO,gBAAA,CAAiB,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA;AACtE;;;ACvHA,IAAM,WAAA,GAAwC;AAAA,EAC5C,SAAA,EAAW,aAAA;AAAA,EACX,QAAA,EAAU,aAAA;AAAA,EACV,KAAA,EAAO,WAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAMO,SAAS,eAAe,IAAA,EAA6B;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAG,WAAA,EAAY,GAAI,IAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,IAAI,IAAI,YAAY,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,IAAA;AACxC,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,IAAA;AACxC,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,KAAA;AACtC,EAAA,MAAM,IAAA,GAAO,cAAc,WAAW,CAAA;AAKtC,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,EAAe,MAAA,EAAgB,QAAgB,KAAA,EAAe,IAAA,EAAc,OAAO,KAAA,KAAkB;AAClH,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,GAAG,OAAO,EAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,EAAA,KAAO,YAAA,GAAe,YAAA,GAAe,OAAA;AACpD,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,gBAAA,EAAmB,EAAE,kBAAkB,MAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,4DAAA,EAA+D,IAAI,CAAA,+BAAA,EAAkC,KAAK,kCAAkC,IAAI,CAAA,eAAA,CAAA;AAAA,EAC1S,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAe,KAAA,EAAe,OAAe,IAAA,KAAyB;AACpF,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,GAAG,OAAO,EAAA;AAC7B,IAAA,OAAO,gDAAgD,EAAE,CAAA,mCAAA,EAAsC,KAAK,CAAA,4DAAA,EAA+D,IAAI,kCAAkC,KAAK,CAAA,gBAAA,CAAA;AAAA,EAChN,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAe,MAAA,EAAgB,OAAe,IAAA,KAAyB;AACtF,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,GAAG,OAAO,EAAA;AAC7B,IAAA,OAAO,gDAAgD,EAAE,CAAA,qCAAA,EAAwC,MAAM,CAAA,4DAAA,EAA+D,IAAI,kCAAkC,KAAK,CAAA,gBAAA,CAAA;AAAA,EACnN,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAe,MAAA,EAA0B,OAAe,IAAA,KAAyB;AAC/F,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,GAAG,OAAO,EAAA;AAC7B,IAAA,OAAO,gDAAgD,EAAE,CAAA,eAAA,EAAkB,MAAM,CAAA,4DAAA,EAA+D,IAAI,kCAAkC,KAAK,CAAA,gBAAA,CAAA;AAAA,EAC7L,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAc,KAAA,KAC5B,CAAA,6DAAA,EAAgE,EAAE,CAAA,uCAAA,EAA0C,WAAA,CAAY,EAAE,CAAC,CAAA,+BAAA,EAAkC,KAAK,CAAA,gBAAA,CAAA;AAIpK,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAe,IAAA,KAA2B;AACzD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAChC,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC9B,IAAA,OAAO,CAAA,6BAAA,EAAgC,WAAW,KAAK,CAAC,qCAAqC,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,EAC5G,CAAA;AAEA,EAAA,MAAM,YAAA,GAAyC;AAAA,IAC7C,WAAW,CAAA,CAAE,IAAA;AAAA,IAAM,UAAU,CAAA,CAAE,IAAA;AAAA,IAAM,OAAO,CAAA,CAAE,IAAA;AAAA,IAAM,MAAM,CAAA,CAAE;AAAA,GAC9D;AACA,EAAA,MAAM,aAAA,GAAgB,cAClB,UAAA,CAAW,MAAA,CAAO,CAAC,EAAA,KAAO,iBAAA,CAAkB,IAAI,OAAO,CAAC,EAAE,GAAA,CAAI,CAAC,OAAO,MAAA,CAAO,EAAA,EAAI,aAAa,EAAE,CAAC,CAAC,CAAA,GAClG,EAAC;AACL,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,MAAA,GAC/B,CAAA,6BAAA,EAAgC,UAAA,CAAW,CAAA,CAAE,OAAO,CAAC,CAAA,qCAAA,EAAwC,aAAA,CAAc,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA,GACnH,EAAA;AAKJ,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,MAAM,WAAA,EAAa,UAAA,EAAY,CAAA,EAAG,CAAA,CAAE,MAAM,QAAQ,CAAA;AAAA,IAClD,MAAM,aAAA,EAAe,QAAA,EAAU,CAAA,EAAG,CAAA,CAAE,IAAI,OAAO,CAAA;AAAA,IAC/C,MAAM,YAAA,EAAc,WAAA,EAAa,CAAA,EAAG,CAAA,CAAE,OAAO,UAAU,CAAA;AAAA,IACvD,MAAA,CAAO,eAAA,EAAiB,eAAA,EAAiB,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,IAC1D,MAAA,CAAO,eAAA,EAAiB,cAAA,EAAgB,CAAA,CAAE,UAAU,aAAa,CAAA;AAAA,IACjE,MAAM,gBAAA,EAAkB,QAAA,EAAU,CAAA,EAAG,CAAA,CAAE,IAAI,OAAO;AAAA,GACpD;AACA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,MAAA,CAAO,UAAA,EAAY,mBAAA,EAAqB,CAAA,CAAE,UAAU,aAAa,CAAA;AAAA,IACjE,OAAA,CAAQ,WAAA,EAAa,kBAAA,EAAoB,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,IAC1D,MAAA,CAAO,aAAA,EAAe,eAAA,EAAiB,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,IACxD,MAAA,CAAO,iBAAA,EAAmB,gBAAA,EAAkB,CAAA,CAAE,OAAO,SAAS,CAAA;AAAA,IAC9D,KAAA,CAAM,cAAc,gBAAA,EAAkB,CAAA,EAAG,EAAE,EAAA,EAAI,eAAA,EAAiB,CAAC,UAAU;AAAA,GAC7E;AACA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,MAAA,CAAO,eAAA,EAAiB,OAAA,EAAS,CAAA,CAAE,OAAO,UAAU,CAAA;AAAA,IACpD,MAAA,CAAO,cAAA,EAAgB,MAAA,EAAQ,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,IAChD,MAAA,CAAO,YAAA,EAAc,gBAAA,EAAkB,CAAA,CAAE,QAAQ,WAAW,CAAA;AAAA,IAC5D,MAAA,CAAO,aAAA,EAAe,qBAAA,EAAuB,CAAA,CAAE,SAAS,YAAY,CAAA;AAAA,IACpE,MAAA,CAAO,YAAA,EAAc,gBAAA,EAAkB,CAAA,CAAE,OAAO,UAAU,CAAA;AAAA,IAC1D,MAAA,CAAO,OAAA,EAAS,gBAAA,EAAkB,CAAA,CAAE,OAAO,UAAU;AAAA,GACvD;AAEA,EAAA,MAAM,eAAe,CAAC,GAAA,KACpB,GAAA,CAAI,OAAA,CAAQ,yBAAyB,kCAAkC,CAAA;AAIzE,EAAA,MAAM,cAAc,MAAc;AAChC,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,EAAE,OAAO,CAAA,CAAE,GAAA,EAAK,OAAO,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,MAChD,EAAE,OAAO,CAAA,CAAE,GAAA,EAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,MAC/C,EAAE,OAAO,CAAA,CAAE,GAAA,EAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAAE,MAC/C,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAC3D,IAAA,IAAI,KAAA,GAAQ,CAAA,KAAM,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AACxC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAE,CAAA;AAAA,IACrF;AACA,IAAA,MAAM,QAAQ,MAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,yCAAA,EAA4C,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,KAAA,EAAQ,CAAA,CAAE,MAAM,IAAA,CAAK,EAAE,CAAC,CAAA,CAAE,CAAA,CACpG,KAAK,EAAE,CAAA;AACV,IAAA,OAAO,yCAAyC,KAAK,CAAA,MAAA,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,MAAM,eAAe,UAAA,GACjB,WAAA,EAAY,GACZ,OAAA,CAAQ,EAAE,GAAA,EAAK,QAAQ,CAAA,GAAI,OAAA,CAAQ,EAAE,GAAA,EAAK,OAAO,IAAI,OAAA,CAAQ,CAAA,CAAE,KAAK,OAAO,CAAA;AAE/E,EAAA,MAAM,eAAe,WAAA,GAAc;AAAA,gEAAA,EAC6B,KAAK,QAAQ,CAAA;AAAA,oFAAA,EACO,WAAW,CAAA,cAAA,EAAiB,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAAA,EAC/H,IAAI;AAAA;AAAA;AAAA,MAAA,CAAA,GAGA,EAAA;AAER,EAAA,OAAO,GAAG,YAAY;AAAA;AAAA;AAAA,6BAAA,EAGO,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,gEAAA,EACgB,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,mBAAmB,UAAU,CAAA;AAAA;AAAA;AAAA,IAAA,EAG5G,YAAY;AAAA,IAAA,EACZ,YAAY;AAAA;AAAA;AAAA,kEAAA,EAGkD,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;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,wBAAA,EAA0B,KAAA,EAAO,wBAAA,EAAyB;AAAA,IAC/F,KAAK,YAAA;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,oDAAA,EAAsD,KAAA,EAAO,oDAAA,EAAqD;AAAA,IACvJ,KAAK,WAAA;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,yBAAA,EAA2B,KAAA,EAAO,yBAAA,EAA0B;AAAA,IACjG,KAAK,UAAA;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,oDAAA,EAAsD,KAAA,EAAO,oDAAA,EAAqD;AAAA,IACvJ,KAAK,YAAA;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,wDAAA,EAA0D,KAAA,EAAO,wDAAA,EAAyD;AAAA,IAC/J,KAAK,WAAA;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,qDAAA,EAAuD,KAAA,EAAO,qDAAA,EAAsD;AAAA,IACzJ,KAAK,aAAA;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,2BAAA,EAA6B,KAAA,EAAO,4BAAA,EAA6B;AAAA,IACtG,KAAK,eAAA;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,uDAAA,EAAyD,KAAA,EAAO,wDAAA,EAAyD;AAAA,IAC9J,KAAK,cAAA;AAAiB,MAAA,OAAO,EAAE,IAAA,EAAM,4BAAA,EAA8B,KAAA,EAAO,6BAAA,EAA8B;AAAA;AAE5G;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;;;AC3LO,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;;;ACtGA,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;AA4BA,SAAS,cAAA,GAAkC;AACzC,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM;AAAA,EAAC,CAAA,EAAG,EAAE,IAAA,GAAO;AAAA,EAAC,GAAG,KAAA,GAAQ;AAAA,EAAC,GAAG,MAAA,GAAS;AAAA,EAAC,GAAG,CAAA;AACvE;AAKA,SAAS,iBAAA,GAAwC;AAC/C,EAAA,IAAI,IAAI,QAAA,CAAS,aAAA;AACjB,EAAA,OAAO,CAAA,EAAG,UAAA,EAAY,aAAA,EAAe,CAAA,GAAI,EAAE,UAAA,CAAW,aAAA;AACtD,EAAA,OAAO,CAAA;AACT;AAOO,SAAS,iBAAA,CAAkB,IAAA,EAAkB,IAAA,GAAwB,EAAC,EAAoB;AAC/F,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,gBAAA;AACtC,EAAA,MAAM,CAAA,GAAI,cAAA,CAAe,IAAA,CAAK,MAAA,IAAU,IAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,IAAI,IAAI,YAAY,CAAA;AACpD,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,YAAY,CAAC,CAAA;AAE/C,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;AAIjG,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AACpC,IAAA,OAAO,cAAA,EAAe;AAAA,EACxB;AAEA,EAAA,IAAI,KAAA,GAAoB,UAAU,UAAU,CAAA;AAG5C,EAAA,MAAM,MAAA,GAAS,KAAK,OAAA,KAAY,MAAA;AAUhC,EAAA,MAAM,UAAA,GAAa,gBAAA;AAEnB,EAAA,MAAM,UAAA,GAAwG;AAAA,IAC5G,EAAE,IAAA,EAAM,WAAA,EAAa,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,YAAY,CAAA,KAAM,gBAAA,EAAiB;AAAA,IAC5G,EAAE,IAAA,EAAM,cAAA,EAAgB,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,aAAa,CAAA,KAAM,OAAA,EAAQ;AAAA,IACvG,EAAE,IAAA,EAAM,aAAA,EAAe,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,aAAa,CAAA,KAAM,MAAA;AAAO,GACtG;AACA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAyB,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA;AACrF,EAAA,MAAM,aAAa,MAAmB;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,aAAa,OAAA,CAAQ,UAAU,KAAK,IAAI,CAAA;AAC7D,MAAA,OAAO,EAAE,SAAA,EAAW,CAAC,CAAC,EAAE,SAAA,EAAW,YAAA,EAAc,CAAC,CAAC,EAAE,YAAA,EAAc,WAAA,EAAa,CAAC,CAAC,EAAE,WAAA,EAAY;AAAA,IAClG,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,aAAa,KAAA,EAAM;AAAA,IAAG;AAAA,EAClF,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAyB;AAC3C,IAAA,IAAI;AACF,MAAA,IAAI,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,WAAA,EAAa,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,WACjG,YAAA,CAAa,WAAW,UAAU,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AAAA,IAAoB;AAAA,EAC9B,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAyB;AAC5C,IAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,EAAE,SAAS,CAAA;AAC5D,IAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,EAAE,YAAY,CAAA;AAC/D,IAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,eAAA,EAAiB,EAAE,WAAW,CAAA;AAC7D,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,MAAA,MAAM,CAAA,GAAI,kBAAkB,GAAG,CAAA;AAC/B,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,UAAU,MAAA,CAAO,WAAA,EAAa,CAAA,CAAE,CAAA,CAAE,IAAI,CAAC,CAAA;AAC3C,MAAA,GAAA,CAAI,aAAa,cAAA,EAAgB,CAAA,CAAE,EAAE,IAAI,CAAA,GAAI,SAAS,OAAO,CAAA;AAAA,IAC/D;AAAA,EACF,CAAA;AACA,EAAA,MAAM,gBAAgB,MAAY;AAAE,IAAA,IAAI,MAAA,EAAQ,WAAA,CAAY,UAAA,EAAY,CAAA;AAAA,EAAG,CAAA;AAG3E,EAAA,MAAM,sBAAsB,MAAY;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,IAAI,UAAA,EAAW;AACrB,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,MAAM,SAAA,EAAW;AAAE,MAAA,CAAA,CAAE,SAAA,GAAY,IAAA;AAAM,MAAA,KAAA,CAAM,SAAA,GAAY,KAAA;AAAO,MAAA,OAAA,GAAU,IAAA;AAAA,IAAM;AACpF,IAAA,IAAI,MAAM,YAAA,EAAc;AAAE,MAAA,CAAA,CAAE,YAAA,GAAe,IAAA;AAAM,MAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AAAO,MAAA,OAAA,GAAU,IAAA;AAAA,IAAM;AAC7F,IAAA,IAAI,MAAM,WAAA,EAAa;AAAE,MAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAAM,MAAA,KAAA,CAAM,WAAA,GAAc,KAAA;AAAO,MAAA,OAAA,GAAU,IAAA;AAAA,IAAM;AAC1F,IAAA,IAAI,OAAA,EAAS;AAAE,MAAA,UAAA,CAAW,CAAC,CAAA;AAAG,MAAA,WAAA,CAAY,CAAC,CAAA;AAAG,MAAA,QAAA,CAAS,aAAA,CAAc,IAAI,WAAA,CAAY,qBAAqB,CAAC,CAAA;AAAA,IAAG;AAAA,EAChH,CAAA;AAGA,EAAA,SAAS,UAAA,GAAmB;AAC1B,IAAA,MAAM,MAAA,GAA6B,MAAA,GAAU,IAAA,CAAK,OAAA,IAAW,OAAQ,QAAA,CAAS,IAAA;AAC9E,IAAA,MAAM,SAAS,QAAA,CAAS,eAAA;AACxB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC9C,QAAA,IAAI,IAAI,UAAA,CAAW,MAAM,GAAG,MAAA,CAAO,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,MACzD;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,OAAO,SAAA,CAAU,MAAA,CAAO,CAAA,eAAA,EAAkB,CAAC,EAAE,CAAC,CAAA;AAEpF,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG,MAAA,CAAO,UAAU,GAAA,CAAI,CAAA,SAAA,EAAY,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACjE,MAAA,IAAI,KAAA,CAAM,KAAK,CAAA,EAAG,MAAA,CAAO,UAAU,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,CAAE,CAAA;AAC3D,MAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,EAAG,MAAA,CAAO,UAAU,GAAA,CAAI,CAAA,UAAA,EAAa,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACpE,MAAA,IAAI,KAAA,CAAM,KAAK,CAAA,EAAG,MAAA,CAAO,UAAU,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,CAAE,CAAA;AAC3D,MAAA,IAAI,KAAA,CAAM,IAAA,EAAM,MAAA,CAAO,SAAA,CAAU,IAAI,eAAe,CAAA;AACpD,MAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,IAAI,cAAc,CAAA;AACvD,MAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,IAAI,mBAAmB,CAAA;AAC5D,MAAA,IAAI,KAAA,CAAM,UAAA,EAAY,MAAA,CAAO,SAAA,CAAU,IAAI,eAAe,CAAA;AAC1D,MAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,MAAA,CAAO,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAC/D,MAAA,IAAI,KAAA,CAAM,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAC1D,MAAA,IAAI,KAAA,CAAM,YAAA,EAAc,MAAA,CAAO,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAC7D,MAAA,IAAI,KAAA,CAAM,UAAA,EAAY,MAAA,CAAO,SAAA,CAAU,IAAI,qBAAqB,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG,MAAA,CAAO,UAAU,GAAA,CAAI,CAAA,eAAA,EAAkB,KAAA,CAAM,UAAU,CAAA,CAAE,CAAA;AACnF,MAAA,IAAI,MAAM,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,gBAAgB,CAAA;AACjE,MAAA,IAAI,MAAM,YAAA,EAAc,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,gBAAgB,CAAA;AACpE,MAAA,IAAI,MAAM,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,eAAe,CAAA;AAClE,MAAA,aAAA,EAAc,CAAE,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,MAAM,WAAW,CAAA;AAAA,IACjE;AAEA,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;AAGvB,MAAA,IAAI,MAAA,IAAU,iBAAA,CAAkB,GAAG,CAAA,EAAG;AACtC,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;AAC3D,QAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,aAAa,aAAa,CAAA,IAAK,KAAK,EAAE,CAAA;AAC/D,QAAA,MAAM,MAAM,GAAA,CAAI,aAAA,CAAc,YAAY,CAAA,EAAG,WAAA,EAAa,MAAK,IAAK,EAAA;AACpE,QAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,CAAA,EAAG,GAAA,CAAI,YAAA,CAAa,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,aACxE,GAAA,CAAI,gBAAgB,YAAY,CAAA;AAAA,MACvC,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,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,IAAA,MAAM,MAAM,CAAA,CAAE,aAAA;AAGd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,EAAA,GAAK,kBAAkB,GAAG,CAAA;AAChC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,IAAI,UAAA,EAAW;AACrB,QAAA,CAAA,CAAE,GAAG,IAAI,CAAA,GAAI,CAAC,CAAA,CAAE,GAAG,IAAI,CAAA;AACvB,QAAA,UAAA,CAAW,CAAC,CAAA;AACZ,QAAA,WAAA,CAAY,CAAC,CAAA;AACb,QAAA,QAAA,CAAS,aAAA,CAAc,IAAI,WAAA,CAAY,qBAAqB,CAAC,CAAA;AAC7D,QAAA;AAAA,MACF;AAAA,IACF;AACA,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;AACrC,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;AAGzC,MAAA,IAAI,EAAA,IAAM,OAAA,CAAQ,EAAE,CAAA,EAAG,MAAA,CAAO,OAAO,KAAA,EAAO,sBAAA,CAAuB,EAAA,EAAI,OAAO,CAAC,CAAA;AAC/E,MAAA,GAAA,CAAI,SAAA,CAAU,IAAI,aAAa,CAAA;AAC/B,MAAA,UAAA,CAAW,MAAM,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,aAAa,GAAG,GAAG,CAAA;AACzD,MAAA,mBAAA,EAAoB;AAAA,IACtB;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;AAG3B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,UAAuB,EAAE,SAAA,EAAW,OAAO,YAAA,EAAc,KAAA,EAAO,aAAa,KAAA,EAAM;AACzF,MAAA,UAAA,CAAW,OAAO,CAAA;AAClB,MAAA,WAAA,CAAY,OAAO,CAAA;AACnB,MAAA,QAAA,CAAS,aAAA,CAAc,IAAI,WAAA,CAAY,qBAAqB,CAAC,CAAA;AAAA,IAC/D;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,MAAA,GAA6B,IAAA;AAKjC,EAAA,IAAI,cAAA,GAAiB,KAAA;AAMrB,EAAA,MAAM,uBAAuB,MAAY;AACvC,IAAA,MAAM,KAAK,IAAA,CAAK,OAAA;AAChB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,IAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACrC,IAAA,MAAM,GAAA,GAAM,CAAA;AACZ,IAAA,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAK,CAAA,CAAE,GAAA,GAAM,GAAG,CAAC,CAAA,EAAA,CAAA;AAC/C,IAAA,KAAA,CAAM,MAAM,MAAA,GAAS,MAAA;AACrB,IAAA,KAAA,CAAM,MAAM,IAAA,GAAO,CAAA,EAAG,EAAE,IAAA,GAAO,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAA,CAAA;AAC1C,IAAA,KAAA,CAAM,MAAM,KAAA,GAAQ,MAAA;AACpB,IAAA,KAAA,CAAM,MAAM,SAAA,GAAY,kBAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACzC,IAAA,MAAA,GAAS,iBAAA,EAAkB;AAC3B,IAAA,KAAA,CAAM,SAAA,CAAU,IAAI,SAAS,CAAA;AAC7B,IAAA,KAAA,CAAM,gBAAgB,OAAO,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,SAAS,oBAAA,EAAqB;AACvC,IAAA,OAAA,EAAS,YAAA,CAAa,iBAAiB,MAAM,CAAA;AAC7C,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,UAAA,CAAW,MAAM;AAAE,MAAA,cAAA,GAAiB,KAAA;AAAA,IAAO,GAAG,CAAC,CAAA;AAC/C,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,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1C,IAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,IAAA,KAAA,CAAM,YAAA,CAAa,SAAS,EAAE,CAAA;AAC9B,IAAA,OAAA,EAAS,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAE9C,IAAA,IAAI,OAAA,UAAiB,KAAA,EAAM;AAAA,SAAA,IAClB,MAAA,EAAQ,WAAA,EAAa,MAAA,CAAO,KAAA,EAAM;AAC3C,IAAA,MAAA,GAAS,IAAA;AAAA,EACX,CAAA;AACA,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,SAAS,GAAG,UAAA,EAAW;AAAA,SAC/C,SAAA,EAAU;AAAA,EACjB,CAAA;AAEA,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,IAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,IAAA,IAAI,aAAA,EAAe;AAAE,MAAA,aAAA,GAAgB,KAAA;AAAO,MAAA;AAAA,IAAQ;AACpD,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1C,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAa;AAC5B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1B,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,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,iCAAiC,CAAC,CAAA;AACnG,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;AAMA,EAAA,MAAM,SAAA,GAAY,GAAG,UAAU,CAAA,KAAA,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAsB,IAAA,CAAK,GAAA,CAAI,CAAC,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,CAAC,CAAC,CAAA;AACjF,EAAA,IAAI,KAAA,GAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAEzB,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,IAAI,YAAY,CAAA,EAAG;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAC1C,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACxB,MAAA,IAAI,OAAO,CAAA,EAAG,CAAA,KAAM,YAAY,OAAO,CAAA,EAAG,MAAM,QAAA,EAAU;AACxD,QAAA,KAAA,GAAQ,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,CAAE,CAAC,GAAG,CAAA,EAAG,QAAA,CAAS,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,MAC/C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAgD;AAAA,EAC1D,CAAA;AACA,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,KAAA,CAAM,MAAM,CAAA,EAAG,YAAA,CAAa,WAAW,SAAS,CAAA;AAAA,wBACnD,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IAC5D,CAAA,CAAA,MAAQ;AAAA,IAAoB;AAAA,EAC9B,CAAA;AACA,EAAA,MAAM,aAAa,MAAY;AAG7B,IAAA,IAAI,OAAA,UAAiB,KAAA,CAAM,SAAA,GAAY,GAAG,KAAA,CAAM,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAA,CAAA;AAAA,EAChE,CAAA;AAGA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,EAAW,CAAA,KAAwC;AACtE,IAAA,CAAA,GAAI,SAAS,CAAC,CAAA;AAAG,IAAA,CAAA,GAAI,SAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,CAAA,GAAI,QAAQ,qBAAA,EAAsB;AACxC,MAAA,MAAM,GAAA,GAAM,CAAA;AACZ,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,IAAA,GAAO,KAAA,CAAM,CAAA;AAChC,MAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,GAAM,KAAA,CAAM,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,OAAO,UAAA,IAAc,CAAA;AAChC,MAAA,MAAM,EAAA,GAAK,OAAO,WAAA,IAAe,CAAA;AACjC,MAAA,IAAI,EAAE,KAAA,GAAQ,CAAA,IAAK,KAAK,CAAA,EAAG,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,GAAM,QAAA,EAAU,IAAA,CAAK,IAAI,EAAA,GAAK,GAAA,GAAM,EAAE,KAAA,GAAQ,QAAA,EAAU,CAAC,CAAC,CAAA;AAClG,MAAA,IAAI,EAAE,MAAA,GAAS,CAAA,IAAK,KAAK,CAAA,EAAG,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,GAAM,OAAA,EAAS,IAAA,CAAK,IAAI,EAAA,GAAK,GAAA,GAAM,EAAE,MAAA,GAAS,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,IACpG;AACA,IAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,EAChB,CAAA;AAEA,EAAA,IAAI,SAAA,GAAuE,IAAA;AAC3E,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,cAAA,GAAiB,CAAA;AACvB,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA0B;AAC/C,IAAA,IAAI,QAAA,IAAY,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACrC,IAAA,SAAA,GAAY,EAAE,EAAA,EAAI,CAAA,CAAE,OAAA,EAAS,EAAA,EAAI,CAAA,CAAE,OAAA,EAAS,EAAA,EAAI,KAAA,CAAM,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,CAAA,EAAE;AACrE,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,OAAA,EAAS,iBAAA,GAAoB,EAAE,SAAS,CAAA;AAAA,EAC1C,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA0B;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,SAAA,CAAU,EAAA;AACjC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,SAAA,CAAU,EAAA;AACjC,IAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,MAAM,EAAA,EAAI,EAAE,IAAI,cAAA,EAAgB;AACrD,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,KAAA,GAAQ,YAAY,SAAA,CAAU,EAAA,GAAK,EAAA,EAAI,SAAA,CAAU,KAAK,EAAE,CAAA;AACxD,IAAA,UAAA,EAAW;AACX,IAAA,CAAA,CAAE,cAAA,EAAe;AAAA,EACnB,CAAA;AACA,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,IAAI,OAAA,EAAS;AAAE,MAAA,SAAA,EAAU;AAAG,MAAA,aAAA,GAAgB,IAAA;AAAA,IAAM;AAAA,EACpD,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2B;AAC/C,IAAA,IAAI,YAAY,CAAA,EAAG;AACnB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,GAAW,CAAA,GAAI,EAAA;AAC9B,IAAA,IAAI,EAAA,GAAK,CAAA;AAAG,IAAA,IAAI,EAAA,GAAK,CAAA;AACrB,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa,EAAA,GAAK,CAAC,IAAA;AAAA,SAAA,IACxB,CAAA,CAAE,GAAA,KAAQ,YAAA,EAAc,EAAA,GAAK,IAAA;AAAA,SAAA,IAC7B,CAAA,CAAE,GAAA,KAAQ,SAAA,EAAW,EAAA,GAAK,CAAC,IAAA;AAAA,SAAA,IAC3B,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa,EAAA,GAAK,IAAA;AAAA,SAChC;AACL,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,KAAA,GAAQ,YAAY,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,KAAA,CAAM,IAAI,EAAE,CAAA;AAC9C,IAAA,UAAA,EAAW;AACX,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA;AAGA,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAqC;AAGnD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,SAAS,gBAAgB,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,SAAS,eAAe,CAAA;AAC/D,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAK,CAAA,CAAiB,OAAA,GAAU,CAAC,CAAA,EAAG,WAAY,CAAA,CAAiB,OAAA;AACvE,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAC3B,IAAA,IAAI,OAAA,EAAS;AACX,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,MAAA,EAAQ;AACV,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,EAAS,gBAAA,CAAiB,SAAS,cAAc,CAAA;AACjD,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,MAAM,eAAe,MAAY;AAC/B,IAAA,IAAI,KAAK,OAAA,IAAW,KAAA,CAAM,UAAU,QAAA,CAAS,SAAS,GAAG,oBAAA,EAAqB;AAAA,EAChF,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,MAAY,aAAA,EAAc;AACjD,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAA0B;AAAE,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,UAAA,EAAY,aAAA,EAAc;AAAA,EAAG,CAAA;AAC1F,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,YAAA,EAAc,IAAI,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC9C,IAAA,QAAA,CAAS,gBAAA,CAAiB,uBAAuB,cAAc,CAAA;AAC/D,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,QAAA,GAAW,KAAK,OAAA,EAAS;AAC3B,IAAA,SAAA,EAAU;AACV,IAAA,UAAA,EAAW;AAEX,IAAA,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AACvB,IAAA,OAAA,CAAQ,MAAM,WAAA,GAAc,MAAA;AAC5B,IAAA,OAAA,CAAQ,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACrD,IAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACtD,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAClD,IAAA,OAAA,CAAQ,gBAAA,CAAiB,WAAW,YAAY,CAAA;AAAA,EAClD;AAGA,EAAA,UAAA,EAAW;AACX,EAAA,aAAA,EAAc;AAEd,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,OAAA,EAAS,mBAAA,CAAoB,SAAS,cAAc,CAAA;AACpD,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;AAChD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAA,EAAc,IAAI,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,YAAY,CAAA;AACjD,MAAA,QAAA,CAAS,mBAAA,CAAoB,uBAAuB,cAAc,CAAA;AAClE,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACjD;AACA,IAAA,OAAA,EAAS,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACzD,IAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACzD,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACrD,IAAA,OAAA,EAAS,mBAAA,CAAoB,WAAW,YAAY,CAAA;AAAA,EACtD,CAAA;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,EAAE,IAAA,EAAM,WAAW,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,WAAA,EAAa,CAAA;AAC3F;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;;;AC5iBO,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;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgQlB,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;AAAA;AAAA;AAAA;AAAA;AAkLnB,SAAS,gBAAgB,CAAA,EAAmB;AACjD,EAAA,OAAO;AAAA,EACP,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,mBAAmB,CAAC,CAAA;;AAAA,EAErB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAOD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;;AAAA,EAED,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,EAID,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAMD,CAAC,uBAAuB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA,EAKD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA,EACD,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAOH","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 /** aria-label de un control multinivel activo: (etiqueta, nivel n, máximo m).\n * Solo se aplica cuando n > 0; en n = 0 el botón usa su etiqueta a secas. */\n level: (label: string, n: number, m: number) => string;\n}\n\nconst DICT: Readonly<Record<LocaleCode, Translation>> = {\n es: { title: 'Accesibilidad', close: 'Cerrar', txt: 'Texto', size: 'Tamaño', lh: 'Interlineado', align: 'Alineación', font: 'Legible', dyslexia: 'Fuente Dislexia', vis: 'Visual', contrast: 'Contraste', gray: 'Grises', hide: 'Ocultar Img', links: 'Links', ori: 'Orientación', guide: 'Guía', mask: 'Máscara', targets: 'Áreas Grandes', cursor: 'Cursor Grande', pause: 'Parar Animac.', reset: 'Restablecer Todo', dev: 'Desarrollado por', ls: 'Espaciado', cb: 'Daltonismo', focus: 'Foco', presets: 'Perfiles', pLow: 'Baja Visión', pDys: 'Dislexia', pMot: 'Motor', pCalm: 'Sin Distrac.', level: (l, n, m) => `${l}, nivel ${n} de ${m}` },\n en: { title: 'Accessibility', close: 'Close', txt: 'Text', size: 'Size', lh: 'Line Height', align: 'Align', font: 'Readable Font', dyslexia: 'Dyslexia Font', vis: 'Visual', contrast: 'Contrast', gray: 'Grayscale', hide: 'Hide Images', links: 'Highlight Links', ori: 'Orientation', guide: 'Reading Guide', mask: 'Reading Mask', targets: 'Big Targets', cursor: 'Big Cursor', pause: 'Pause Anim.', reset: 'Reset All', dev: 'Developed by', ls: 'Letter Spacing', cb: 'Color Blind', focus: 'Focus', presets: 'Profiles', pLow: 'Low Vision', pDys: 'Dyslexia', pMot: 'Motor', pCalm: 'No Distract.', level: (l, n, m) => `${l}, level ${n} of ${m}` },\n gn: { title: 'Oikeha (Accesibilidad)', close: 'Mboty', txt: \"Moñe'ẽrã\", size: 'Tuichakue', lh: 'Jei', align: 'Mbojoja', font: 'Letra Porã', dyslexia: 'Dislexia', vis: 'Hechapy', contrast: \"Sa'y\", gray: 'Hũ ha Tĩ', hide: \"Mokañy Ta'anga\", links: 'Joajuha', ori: 'Sãmbyhy', guide: 'Sãmbyhyha', mask: \"Mbohovái\", targets: 'Tenda Guasu', cursor: 'Cursor Guasu', pause: 'Mboopyta', reset: 'Mbojevy', dev: 'Apojare', ls: 'Rapykue', cb: \"Sa'yvy\", focus: 'Ñemoha', presets: 'Tekorã', pLow: 'Hechapy Vai', pDys: 'Dislexia', pMot: 'Po-rehegua', pCalm: 'Pyʼa Guapy', level: (l, n, m) => `${l}, ${n}/${m}` },\n fr: { title: 'Accessibilité', close: 'Fermer', txt: 'Texte', size: 'Taille', lh: 'Interligne', align: 'Alignement', font: 'Police Lisible', dyslexia: 'Police Dyslexie', vis: 'Visuel', contrast: 'Contraste', gray: 'Niveaux Gris', hide: 'Masquer Img', links: 'Liens', ori: 'Orientation', guide: 'Guide Lecture', mask: 'Masque Lecture', targets: 'Grandes Cibles', cursor: 'Grand Curseur', pause: 'Pause Anim.', reset: 'Réinitialiser', dev: 'Développé par', ls: 'Espacement', cb: 'Daltonisme', focus: 'Focus', presets: 'Profils', pLow: 'Basse Vision', pDys: 'Dyslexie', pMot: 'Moteur', pCalm: 'Sans Distrac.', level: (l, n, m) => `${l}, niveau ${n} sur ${m}` },\n it: { title: 'Accessibilità', close: 'Chiudi', txt: 'Testo', size: 'Dimensione', lh: 'Interlinea', align: 'Allineamento', font: 'Leggibile', dyslexia: 'Font Dislessia', vis: 'Visivo', contrast: 'Contrasto', gray: 'Scala Grig.', hide: 'Nascondi Img', links: 'Link', ori: 'Orientamento', guide: 'Guida', mask: 'Maschera', targets: 'Aree Grandi', cursor: 'Cursore Grande', pause: 'Pausa Anim.', reset: 'Reimposta', dev: 'Sviluppato da', ls: 'Spaziatura', cb: 'Daltonismo', focus: 'Focus', presets: 'Profili', pLow: 'Ipovisione', pDys: 'Dislessia', pMot: 'Motorio', pCalm: 'No Distraz.', level: (l, n, m) => `${l}, livello ${n} di ${m}` },\n de: { title: 'Barrierefreiheit', close: 'Schließen', txt: 'Text', size: 'Größe', lh: 'Zeilenhöhe', align: 'Ausrichtung', font: 'Lesbar', dyslexia: 'Dyslexie', vis: 'Visuell', contrast: 'Kontrast', gray: 'Graustufen', hide: 'Bilder Aus', links: 'Links', ori: 'Orientierung', guide: 'Lesehilfe', mask: 'Lesemaske', targets: 'Große Ziele', cursor: 'Großer Cursor', pause: 'Anim. Stopp', reset: 'Zurücksetzen', dev: 'Entwickelt von', ls: 'Buchst.abst.', cb: 'Farbblindheit', focus: 'Fokus', presets: 'Profile', pLow: 'Sehschwäche', pDys: 'Dyslexie', pMot: 'Motorik', pCalm: 'Ohne Ablenk.', level: (l, n, m) => `${l}, Stufe ${n} von ${m}` },\n nl: { title: 'Toegankelijkheid', close: 'Sluiten', txt: 'Tekst', size: 'Grootte', lh: 'Regelhoogte', align: 'Uitlijning', font: 'Leesbaar', dyslexia: 'Dyslexie', vis: 'Visueel', contrast: 'Contrast', gray: 'Grijstinten', hide: 'Verberg Afb.', links: 'Links', ori: 'Oriëntatie', guide: 'Leesgids', mask: 'Leesmasker', targets: 'Grote Doelen', cursor: 'Grote Cursor', pause: 'Anim. Pauze', reset: 'Resetten', dev: 'Ontwikkeld door', ls: 'Letterspatie', cb: 'Kleurenblind', focus: 'Focus', presets: 'Profielen', pLow: 'Slechtziend', pDys: 'Dyslexie', pMot: 'Motoriek', pCalm: 'Geen Afleid.', level: (l, n, m) => `${l}, niveau ${n} van ${m}` },\n sv: { title: 'Tillgänglighet', close: 'Stäng', txt: 'Text', size: 'Storlek', lh: 'Radhöjd', align: 'Justering', font: 'Läsbar', dyslexia: 'Dyslexi', vis: 'Visuell', contrast: 'Kontrast', gray: 'Gråskala', hide: 'Dölj Bilder', links: 'Länkar', ori: 'Orientering', guide: 'Läslinjal', mask: 'Läsmask', targets: 'Stora Ytor', cursor: 'Stor Markör', pause: 'Pausa Anim.', reset: 'Återställ', dev: 'Utvecklad av', ls: 'Bokstavsavst.', cb: 'Färgblindhet', focus: 'Fokus', presets: 'Profiler', pLow: 'Synnedsätt.', pDys: 'Dyslexi', pMot: 'Motorik', pCalm: 'Inga Distrak.', level: (l, n, m) => `${l}, nivå ${n} av ${m}` },\n};\n\nexport function getTranslation(locale: string): Translation {\n const lc = locale.toLowerCase();\n if (lc === 'gn' || lc.startsWith('gn-') || lc.startsWith('gn_')) return DICT.gn;\n const base = lc.split(/[-_]/)[0] as LocaleCode;\n return DICT[base] ?? DICT.en;\n}\n\nexport function supportedLocales(): readonly LocaleCode[] {\n return Object.keys(DICT) as LocaleCode[];\n}\n","// SVGs heredados del plugin WP oksigenia-access v16.9.\n// Todos viewBox 0 0 24 24, fill=currentColor.\n\nexport const ICON_TXT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z\"/></svg>';\nexport const ICON_LH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6,7h2.5L5,3.5L1.5,7H4v10H1.5L5,20.5L8.5,17H6V7z M10,5v2h12V5H10z M10,19h12v-2H10V19z M10,13h12v-2H10V13z\"/></svg>';\nexport const ICON_ALIGN = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3,21h18v-2H3V21z M3,17h12v-2H3V17z M3,13h18v-2H3V13z M3,9h12V7H3V9z M3,3v2h18V3H3z\"/></svg>';\nexport const ICON_FONT = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9.93,13.5h4.14L12,7.98L9.93,13.5z M5,18l2.25-6h9.5L19,18h3L14.75,3h-5.5L2,18H5z\"/></svg>';\nexport const ICON_DYSLEXIA = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5,18 L7.5,12 L16.5,12 L19,18 L22,18 L13.5,3 L10.5,3 L2,18 L5,18 Z M12,5.5 L15.5,10 L8.5,10 L12,5.5 Z\"/></svg>';\nexport const ICON_CONTRAST = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12,2C6.48,2,2,6.48,2,12s4.48,10,10,10s10-4.48,10-10S17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 S16.41,20,12,20z\"/></svg>';\nexport const ICON_GRAY = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18L2 12C2 6.48 6.48 2 12 2v18z\"/></svg>';\nexport const ICON_HIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75C21.27 10.61 17 7.5 12 7.5c-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></svg>';\nexport const ICON_LINK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\nexport const ICON_GUIDE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 13h18v-2H3v2zm-2 4h22v-2H1v2zM1 7v2h22V7H1z\"/></svg>';\nexport const ICON_CURSOR = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5.5 3.21V20.8l4.51-4.52 2.13 5.2h2.29l-2.14-5.2H17L5.5 3.21z\"/></svg>';\nexport const ICON_PAUSE = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>';\nexport const ICON_LS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 5v14h2V5H5zm4 0v14h2V5H9zm4 4v6h2V9h-2zm4-4v14h2V5h-2z\"/></svg>';\nexport const ICON_COLORBLIND = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></svg>';\nexport const ICON_FOCUS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 7V3h4v2H5v2H3zm14-4h4v4h-2V5h-2V3zm4 14v4h-4v-2h2v-2h2zM7 21H3v-4h2v2h2v2z\"/></svg>';\n// Banda horizontal iluminada sobre fondo oscurecido (alegoría de la máscara).\nexport const ICON_MASK = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2 4h20v6H2zm0 10h20v6H2zm2-9v4h16V5zm0 10v4h16v-4z\" opacity=\".55\"/><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\"/></svg>';\n// Cuadrado punteado con diana en el centro (área de hit ampliada).\nexport const ICON_TARGETS = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 3h4v2H5v2H3zm14 0h4v4h-2V5h-2zm0 18v-2h2v-2h2v4zM3 21v-4h2v2h2v2zM12 8a4 4 0 100 8 4 4 0 000-8zm0 2a2 2 0 110 4 2 2 0 010-4z\"/></svg>';\n\n// Iconos del botón flotante. `porthole` reutiliza el glifo universal de\n// accesibilidad (persona) y le añade un aro de ojo de buey por CSS — el glifo\n// estándar NUNCA se sustituye, solo se enmarca (a11y: preserva la\n// descubribilidad por convención).\nexport type TriggerIcon = 'vitruvian' | 'wheelchair' | 'eye' | 'universal' | 'porthole';\n\nconst UNIVERSAL_GLYPH = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"/></svg>';\n\nexport const TRIGGER_ICONS: Record<TriggerIcon, string> = {\n vitruvian: '<svg viewBox=\"0 0 122.88 122.88\" fill=\"currentColor\"><path d=\"M61.44,0A61.46,61.46,0,1,1,18,18,61.21,61.21,0,0,1,61.44,0Zm-.39,74.18L52.1,98.91a4.94,4.94,0,0,1-2.58,2.83A5,5,0,0,1,42.7,95.5l6.24-17.28a26.3,26.3,0,0,0,1.17-4,40.64,40.64,0,0,0,.54-4.18c.24-2.53.41-5.27.54-7.9s.22-5.18.29-7.29c.09-2.63-.62-2.8-2.73-3.3l-.44-.1-18-3.39A5,5,0,0,1,27.08,46a5,5,0,0,1,5.05-7.74l19.34,3.63c.77.07,1.52.16,2.31.25a57.64,57.64,0,0,0,7.18.53A81.13,81.13,0,0,0,69.9,42c.9-.1,1.75-.21,2.6-.29l18.25-3.42A5,5,0,0,1,94.5,39a5,5,0,0,1,1.3,7,5,5,0,0,1-3.21,2.09L75.15,51.37c-.58.13-1.1.22-1.56.29-1.82.31-2.72.47-2.61,3.06.08,1.89.31,4.15.61,6.51.35,2.77.81,5.71,1.29,8.4.31,1.77.6,3.19,1,4.55s.79,2.75,1.39,4.42l6.11,16.9a5,5,0,0,1-6.82,6.24,4.94,4.94,0,0,1-2.58-2.83L63,74.23,62,72.4l-1,1.78Zm.39-53.52a8.83,8.83,0,1,1-6.24,2.59,8.79,8.79,0,0,1,6.24-2.59Zm36.35,4.43a51.42,51.42,0,1,0,15,36.35,51.27,51.27,0,0,0-15-36.35Z\"/></svg>',\n wheelchair: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></svg>',\n eye: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></svg>',\n universal: UNIVERSAL_GLYPH,\n porthole: UNIVERSAL_GLYPH,\n};\n\nexport const ICON_CLOSE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n// Filtros SVG aplicados al <html> para simular daltonismo.\nexport const COLORBLIND_FILTERS_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"position:absolute;width:0;height:0;overflow:hidden;\" aria-hidden=\"true\"><defs><filter id=\"oks-filter-protanopia\"><feColorMatrix type=\"matrix\" values=\"0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-deuteranopia\"><feColorMatrix type=\"matrix\" values=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0\"/></filter><filter id=\"oks-filter-tritanopia\"><feColorMatrix type=\"matrix\" values=\"0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0\"/></filter></defs></svg>';\n","// Single source of truth for the panel's control catalogue.\n//\n// Each atomic control has a stable, human-readable id (the value the host\n// passes in `controls=` / `exclude=`). Render, behavior and the web component\n// all resolve curation against this registry so the three never drift.\n//\n// The ids are part of the public API — they are documented and used by hosts —\n// so treat renames as breaking.\n\nimport type { PanelState } from './state.js';\n\nexport type ControlId =\n | 'text-size'\n | 'line-height'\n | 'text-align'\n | 'readable-font'\n | 'dyslexia-font'\n | 'letter-spacing'\n | 'contrast'\n | 'grayscale'\n | 'hide-images'\n | 'highlight-links'\n | 'colorblind'\n | 'reading-guide'\n | 'reading-mask'\n | 'big-cursor'\n | 'big-targets'\n | 'pause-anim'\n | 'focus';\n\n/** Render order (also the order `exclude=`/`controls=` are validated against). */\nexport const ALL_CONTROLS: readonly ControlId[] = [\n 'text-size', 'line-height', 'text-align', 'readable-font', 'dyslexia-font', 'letter-spacing',\n 'contrast', 'grayscale', 'hide-images', 'highlight-links', 'colorblind',\n 'reading-guide', 'reading-mask', 'big-cursor', 'big-targets', 'pause-anim', 'focus',\n];\n\n/** Control id → the PanelState field it drives. */\nexport const CONTROL_STATE_KEY: Readonly<Record<ControlId, keyof PanelState>> = {\n 'text-size': 'zoom',\n 'line-height': 'lh',\n 'text-align': 'align',\n 'readable-font': 'font',\n 'dyslexia-font': 'dyslexia',\n 'letter-spacing': 'ls',\n 'contrast': 'contrast',\n 'grayscale': 'grayOverlay',\n 'hide-images': 'hideImages',\n 'highlight-links': 'highlightLinks',\n 'colorblind': 'colorblind',\n 'reading-guide': 'readingGuide',\n 'reading-mask': 'readingMask',\n 'big-cursor': 'bigCursor',\n 'big-targets': 'bigTargets',\n 'pause-anim': 'pauseAnim',\n 'focus': 'focusOutline',\n};\n\n/** Reverse of CONTROL_STATE_KEY, for mapping a preset's flags back to controls. */\nconst STATE_KEY_CONTROL = Object.fromEntries(\n Object.entries(CONTROL_STATE_KEY).map(([control, key]) => [key, control as ControlId]),\n) as Record<keyof PanelState, ControlId>;\n\nexport type PresetId = 'lowvision' | 'dyslexia' | 'motor' | 'calm';\n\n/** Preset profiles: set the listed flags, leave the rest as-is.\n * Apply is additive — pressing two presets unions their flags. */\nexport const PRESETS: Readonly<Record<PresetId, Partial<PanelState>>> = {\n lowvision: { zoom: 2, contrast: true, highlightLinks: true, bigCursor: true, focusOutline: true },\n dyslexia: { dyslexia: true, lh: 2, ls: 2, readingGuide: true },\n motor: { bigCursor: true, bigTargets: true, focusOutline: true },\n calm: { hideImages: true, pauseAnim: true },\n};\n\nexport const PRESET_IDS: readonly PresetId[] = ['lowvision', 'dyslexia', 'motor', 'calm'];\n\n/** Control ids a preset touches (used to hide/recompose it under curation). */\nexport function presetControlIds(id: PresetId): ControlId[] {\n return Object.keys(PRESETS[id]).map((k) => STATE_KEY_CONTROL[k as keyof PanelState]);\n}\n\n/**\n * Resolve which controls an instance offers from its `controls=` (whitelist)\n * and `exclude=` (blacklist) attributes. Both optional; unknown ids ignored.\n * No attributes ⇒ all 17 (current behavior).\n */\nexport function resolveEnabledControls(\n controlsAttr?: string | null,\n excludeAttr?: string | null,\n): Set<ControlId> {\n const valid = new Set(ALL_CONTROLS);\n const parse = (raw: string | null | undefined): ControlId[] =>\n (raw ?? '')\n .split(',')\n .map((s) => s.trim().toLowerCase() as ControlId)\n .filter((s) => valid.has(s));\n\n const whitelist = controlsAttr != null ? parse(controlsAttr) : null;\n let enabled = whitelist && whitelist.length > 0 ? new Set(whitelist) : new Set(ALL_CONTROLS);\n\n if (excludeAttr != null) {\n for (const id of parse(excludeAttr)) enabled.delete(id);\n }\n return enabled;\n}\n\n/**\n * Controls that can't be confined to a container AND shouldn't even be offered\n * in a scoped panel: grayscale (a full-screen overlay that destroys colour\n * data) and the colour-blind root `filter` (destroys data + the open\n * simulation-vs-correction question). A scoped instance drops these entirely.\n */\nexport const NON_SCOPABLE_CONTROLS: readonly ControlId[] = ['grayscale', 'colorblind'];\n\n/**\n * Controls that can't be *scoped* but ARE benign window-level aids, so a scoped\n * panel still offers them and applies them globally (to the whole window) with\n * a shared, cross-instance state: big cursor and the reading guide / mask.\n * Toggling from any pane affects the whole window and every pane's button\n * reflects it. (Unlike grayscale/colour-blind, these don't falsify data.)\n */\nexport const GLOBAL_OFFERABLE_CONTROLS: readonly ControlId[] = [\n 'big-cursor', 'reading-guide', 'reading-mask',\n];\n\n/** Remove the controls a scoped instance doesn't offer at all (grayscale, colour-blind). */\nexport function scopedControls(enabled: Set<ControlId>): Set<ControlId> {\n const out = new Set(enabled);\n for (const id of NON_SCOPABLE_CONTROLS) out.delete(id);\n return out;\n}\n\n/**\n * Recompose a preset for a curated instance: keep only the flags whose control\n * is still offered. The open design point Bentos flagged — a preset in a window\n * that excludes its controls (e.g. \"dyslexia\" where the dyslexia font and\n * reading guide are gone) collapses to whatever it can still legitimately set,\n * and is hidden entirely (see `presetIsAvailable`) when nothing remains.\n */\nexport function filterPresetForEnabled(\n id: PresetId,\n enabled: Set<ControlId>,\n): Partial<PanelState> {\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(PRESETS[id]) as Array<[keyof PanelState, never]>) {\n if (enabled.has(STATE_KEY_CONTROL[k])) out[k] = v;\n }\n return out;\n}\n\n/**\n * A preset shows only if it still bundles **two or more** controls after\n * curation. A profile is a combination — one that collapses to a single\n * control is redundant with that control's own button, so it is hidden.\n */\nexport function presetIsAvailable(id: PresetId, enabled: Set<ControlId>): boolean {\n return presetControlIds(id).filter((c) => enabled.has(c)).length >= 2;\n}\n","import type { Translation } from './translations.js';\nimport {\n ALL_CONTROLS, PRESET_IDS, presetIsAvailable,\n type ControlId, type PresetId,\n} from './controls.js';\nimport {\n ICON_TXT, ICON_LH, ICON_ALIGN, ICON_FONT, ICON_DYSLEXIA, ICON_LS,\n ICON_CONTRAST, ICON_GRAY, ICON_HIDE, ICON_LINK, ICON_COLORBLIND,\n ICON_GUIDE, ICON_MASK, ICON_TARGETS,\n ICON_CURSOR, ICON_PAUSE, ICON_FOCUS, ICON_CLOSE,\n TRIGGER_ICONS, type TriggerIcon,\n} from './icons.js';\n\nexport type Position =\n | 'top-left' | 'top-center' | 'top-right'\n | 'mid-left' | 'mid-center' | 'mid-right'\n | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\nexport interface RenderOptions {\n t: Translation;\n triggerIcon: TriggerIcon;\n position: Position;\n /** Controls offered by this instance. Defaults to all 17. */\n enabled?: Set<ControlId>;\n /** Render the floating trigger button. `false` for host-driven mode\n * (`trigger=\"none\"`): the panel renders without its launcher and the host\n * opens it via `.open()`. Defaults to true. */\n showTrigger?: boolean;\n /** Render the profile presets row. `false` (`presets=\"none\"`) drops it\n * entirely. Defaults to true; individual presets still self-hide under the\n * ≥2-control rule. */\n showPresets?: boolean;\n /** Flat layout: one grid with screen-reader-only category headings instead of\n * visible per-category sections. Used in scoped mode, where heavily-curated\n * panels look sparse with category breaks. Defaults to false (classic). */\n flatLayout?: boolean;\n}\n\nconst PRESET_ICON: Record<PresetId, string> = {\n lowvision: ICON_CONTRAST,\n dyslexia: ICON_DYSLEXIA,\n motor: ICON_CURSOR,\n calm: ICON_HIDE,\n};\n\n/**\n * HTML del panel completo (trigger + dialog). Pensado para inyectarse\n * dentro del Shadow DOM del custom element.\n */\nexport function buildPanelHtml(opts: RenderOptions): string {\n const { t, triggerIcon } = opts;\n const enabled = opts.enabled ?? new Set(ALL_CONTROLS);\n const showTrigger = opts.showTrigger ?? true;\n const showPresets = opts.showPresets ?? true;\n const flatLayout = opts.flatLayout ?? false;\n const trig = TRIGGER_ICONS[triggerIcon];\n\n // Each control helper emits its button only when the instance offers it\n // (#1 curation). A control id is stamped as data-control so behavior and\n // tests can resolve it back to the registry.\n const multi = (id: ControlId, prefix: string, levels: number, label: string, icon: string, full = false): string => {\n if (!enabled.has(id)) return '';\n const action = id === 'colorblind' ? 'colorblind' : 'multi';\n const fullClass = full ? ' full-width' : '';\n const dots = Array.from({ length: levels }, () => '<span></span>').join('');\n return `<button class=\"oks-access-opt multi-step${fullClass}\" data-control=\"${id}\" data-action=\"${action}\" data-prefix=\"${prefix}\" data-levels=\"${levels}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span><div class=\"oks-levels\">${dots}</div></button>`;\n };\n const toggle = (id: ControlId, klass: string, label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"toggle\" data-class=\"${klass}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const overlay = (id: ControlId, target: string, label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"overlay\" data-target=\"${target}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const simple = (id: ControlId, action: 'guide' | 'mask', label: string, icon: string): string => {\n if (!enabled.has(id)) return '';\n return `<button class=\"oks-access-opt\" data-control=\"${id}\" data-action=\"${action}\" aria-pressed=\"false\" type=\"button\"><span class=\"oks-icon\">${icon}</span><span class=\"oks-label\">${label}</span></button>`;\n };\n const preset = (id: PresetId, label: string): string =>\n `<button class=\"oks-preset\" data-action=\"preset\" data-preset=\"${id}\" type=\"button\"><span class=\"oks-icon\">${PRESET_ICON[id]}</span><span class=\"oks-label\">${label}</span></button>`;\n\n // A section renders its heading only when it has at least one control —\n // otherwise a curated instance leaves orphan \"TEXT\" / \"VISUAL\" titles.\n const section = (title: string, rows: string[]): string => {\n const kept = rows.filter(Boolean);\n if (kept.length === 0) return '';\n return `<h4 class=\"oks-access-title\">${escapeHtml(title)}</h4><div class=\"oks-access-grid\">${kept.join('')}</div>`;\n };\n\n const presetLabels: Record<PresetId, string> = {\n lowvision: t.pLow, dyslexia: t.pDys, motor: t.pMot, calm: t.pCalm,\n };\n const presetButtons = showPresets\n ? PRESET_IDS.filter((id) => presetIsAvailable(id, enabled)).map((id) => preset(id, presetLabels[id]))\n : [];\n const presetsBlock = presetButtons.length\n ? `<h4 class=\"oks-access-title\">${escapeHtml(t.presets)}</h4><div class=\"oks-access-presets\">${presetButtons.join('')}</div>`\n : '';\n\n // Atomic control buttons grouped by category. Colour-blind spans full width\n // only in the classic categorised layout; in flat mode the trailing-odd rule\n // (below) fills any gap instead.\n const textBtns = [\n multi('text-size', 'oks-zoom', 4, t.size, ICON_TXT),\n multi('line-height', 'oks-lh', 3, t.lh, ICON_LH),\n multi('text-align', 'oks-align', 3, t.align, ICON_ALIGN),\n toggle('readable-font', 'oks-a11y-font', t.font, ICON_FONT),\n toggle('dyslexia-font', 'oks-dyslexia', t.dyslexia, ICON_DYSLEXIA),\n multi('letter-spacing', 'oks-ls', 3, t.ls, ICON_LS),\n ];\n const visBtns = [\n toggle('contrast', 'oks-a11y-contrast', t.contrast, ICON_CONTRAST),\n overlay('grayscale', 'oks-overlay-gray', t.gray, ICON_GRAY),\n toggle('hide-images', 'oks-a11y-hide', t.hide, ICON_HIDE),\n toggle('highlight-links', 'oks-a11y-links', t.links, ICON_LINK),\n multi('colorblind', 'oks-colorblind', 3, t.cb, ICON_COLORBLIND, !flatLayout),\n ];\n const oriBtns = [\n simple('reading-guide', 'guide', t.guide, ICON_GUIDE),\n simple('reading-mask', 'mask', t.mask, ICON_MASK),\n toggle('big-cursor', 'oks-big-cursor', t.cursor, ICON_CURSOR),\n toggle('big-targets', 'oks-a11y-bigtargets', t.targets, ICON_TARGETS),\n toggle('pause-anim', 'oks-a11y-pause', t.pause, ICON_PAUSE),\n toggle('focus', 'oks-a11y-focus', t.focus, ICON_FOCUS),\n ];\n\n const addFullWidth = (btn: string): string =>\n btn.replace('class=\"oks-access-opt', 'class=\"oks-access-opt full-width');\n\n // Flat layout (scoped): one grid, screen-reader-only headings, and the\n // trailing button widened when the total is odd so there is no ragged gap.\n const flatContent = (): string => {\n const groups = [\n { title: t.txt, items: textBtns.filter(Boolean) },\n { title: t.vis, items: visBtns.filter(Boolean) },\n { title: t.ori, items: oriBtns.filter(Boolean) },\n ].filter((g) => g.items.length > 0);\n const total = groups.reduce((n, g) => n + g.items.length, 0);\n if (total % 2 === 1 && groups.length > 0) {\n const last = groups[groups.length - 1]!;\n last.items[last.items.length - 1] = addFullWidth(last.items[last.items.length - 1]!);\n }\n const inner = groups\n .map((g) => `<h4 class=\"oks-access-title oks-sr-only\">${escapeHtml(g.title)}</h4>${g.items.join('')}`)\n .join('');\n return `<div class=\"oks-access-grid oks-flat\">${inner}</div>`;\n };\n\n const controlsHtml = flatLayout\n ? flatContent()\n : section(t.txt, textBtns) + section(t.vis, visBtns) + section(t.ori, oriBtns);\n\n const triggerBlock = showTrigger ? `\n<div class=\"oks-access-wrapper\" id=\"oks-wrapper\" data-position=\"${opts.position}\">\n <button class=\"oks-access-btn\" id=\"oks-trigger\" part=\"trigger\" data-trigger-icon=\"${triggerIcon}\" aria-label=\"${escapeAttr(t.title)}\" aria-expanded=\"false\" aria-controls=\"oks-panel\" type=\"button\">\n ${trig}\n </button>\n <span class=\"oks-active-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>` : '';\n\n return `${triggerBlock}\n<div class=\"oks-access-panel\" id=\"oks-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"oks-panel-title\" inert>\n <div class=\"oks-access-header\">\n <h3 id=\"oks-panel-title\">${escapeHtml(t.title)}</h3>\n <button class=\"oks-access-close\" id=\"oks-close\" aria-label=\"${escapeAttr(t.close)}\" type=\"button\">${ICON_CLOSE}</button>\n </div>\n <div class=\"oks-access-content\">\n ${presetsBlock}\n ${controlsHtml}\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-center': return { wrap: 'top: 20px; left: 50%; transform: translateX(-50%);', panel: 'top: 80px; left: 50%; transform: translateX(-50%);' };\n case 'top-right': return { wrap: 'top: 20px; right: 20px;', panel: 'top: 80px; right: 20px;' };\n case 'mid-left': return { wrap: 'top: 50%; left: 20px; transform: translateY(-50%);', panel: 'top: 50%; left: 90px; transform: translateY(-50%);' };\n case 'mid-center': return { wrap: 'top: 50%; left: 50%; transform: translate(-50%, -50%);', panel: 'top: 50%; left: 50%; transform: translate(-50%, -50%);' };\n case 'mid-right': return { wrap: 'top: 50%; right: 20px; transform: translateY(-50%);', panel: 'top: 50%; right: 90px; transform: translateY(-50%);' };\n case 'bottom-left': return { wrap: 'bottom: 20px; left: 20px;', panel: 'bottom: 100px; left: 20px;' };\n case 'bottom-center': return { wrap: 'bottom: 20px; left: 50%; transform: translateX(-50%);', panel: 'bottom: 100px; left: 50%; transform: translateX(-50%);' };\n case 'bottom-right': return { wrap: 'bottom: 20px; right: 20px;', panel: 'bottom: 100px; right: 20px;' };\n }\n}\n\n/** Mapea Position a CSS para wrapper y panel. Inyectado en el Shadow DOM.\n * `mobile` opcional aplica una posición distinta del wrapper en viewport ≤768px. */\nexport function positionCss(position: Position, mobile?: Position): string {\n const d = positionRules(position);\n // El wrapper (trigger) se posiciona siempre con la regla desktop.\n // El panel solo recibe estas reglas en desktop: en móvil PANEL_CSS lo pone\n // fullscreen y este override sobrescribiría top/left/transform dejándolo\n // desplazado fuera del viewport.\n let css = `.oks-access-wrapper { ${d.wrap} }`;\n css += `@media (min-width: 769px) { .oks-access-panel { ${d.panel} } }`;\n if (mobile && mobile !== position) {\n const m = positionRules(mobile);\n css += `@media (max-width: 768px) { .oks-access-wrapper { top: auto; right: auto; bottom: auto; left: auto; transform: none; ${m.wrap} } }`;\n }\n return css;\n}\n","// Estado interno del panel y persistencia en localStorage.\n// Compatible con el formato del plugin WP oksigenia-access v16.9\n// para preservar la preferencia del usuario entre sitios (mismo\n// storage key por defecto).\n\nexport interface PanelState {\n /** Niveles 1..4 → 0 desactivado. */\n zoom: number;\n /** Niveles 1..3 → 0 desactivado. */\n lh: number;\n /** Niveles 1..3 → 0 desactivado. */\n align: number;\n /** Niveles 1..3 → 0 desactivado. */\n ls: number;\n /** Niveles 1..3 (1=protanopia, 2=deuteranopia, 3=tritanopia). 0 desactivado. */\n colorblind: number;\n /** Toggles. */\n font: boolean;\n dyslexia: boolean;\n contrast: boolean;\n hideImages: boolean;\n highlightLinks: boolean;\n bigCursor: boolean;\n pauseAnim: boolean;\n focusOutline: boolean;\n /** Overlay escala de grises (excluyente con contrast). */\n grayOverlay: boolean;\n /** Guía horizontal de lectura. */\n readingGuide: boolean;\n /** Máscara de lectura: oscurece todo menos una banda alrededor del cursor. */\n readingMask: boolean;\n /** Aumenta el hit-area de interactivos a 44×44 mínimo (WCAG 2.5.5/2.5.8). */\n bigTargets: boolean;\n}\n\nexport const DEFAULT_STATE: Readonly<PanelState> = Object.freeze({\n zoom: 0,\n lh: 0,\n align: 0,\n ls: 0,\n colorblind: 0,\n font: false,\n dyslexia: false,\n contrast: false,\n hideImages: false,\n highlightLinks: false,\n bigCursor: false,\n pauseAnim: false,\n focusOutline: false,\n grayOverlay: false,\n readingGuide: false,\n readingMask: false,\n bigTargets: false,\n});\n\nexport function loadState(key: string): PanelState {\n if (typeof localStorage === 'undefined') return { ...DEFAULT_STATE };\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return { ...DEFAULT_STATE };\n const parsed = JSON.parse(raw) as Partial<PanelState> | null;\n if (!parsed || typeof parsed !== 'object') return { ...DEFAULT_STATE };\n return { ...DEFAULT_STATE, ...parsed };\n } catch {\n return { ...DEFAULT_STATE };\n }\n}\n\nexport function saveState(key: string, state: PanelState): void {\n if (typeof localStorage === 'undefined') return;\n try {\n // Solo serializamos lo que esté activo, igual que el plugin WP.\n const out: Partial<PanelState> = {};\n for (const [k, v] of Object.entries(state) as Array<[keyof PanelState, unknown]>) {\n if (typeof v === 'number' && v > 0) (out as Record<string, unknown>)[k] = v;\n else if (typeof v === 'boolean' && v) (out as Record<string, unknown>)[k] = v;\n }\n if (Object.keys(out).length === 0) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(out));\n }\n } catch {\n // Fail silent — localStorage puede estar bloqueado en algunos\n // navegadores (modo privado de Safari, por ejemplo).\n }\n}\n\nexport function isStateEmpty(state: PanelState): boolean {\n return (\n state.zoom === 0 &&\n state.lh === 0 &&\n state.align === 0 &&\n state.ls === 0 &&\n state.colorblind === 0 &&\n !state.font &&\n !state.dyslexia &&\n !state.contrast &&\n !state.hideImages &&\n !state.highlightLinks &&\n !state.bigCursor &&\n !state.pauseAnim &&\n !state.focusOutline &&\n !state.grayOverlay &&\n !state.readingGuide &&\n !state.readingMask &&\n !state.bigTargets\n );\n}\n","import { type PanelState, loadState, saveState, DEFAULT_STATE, isStateEmpty } from './state.js';\nimport { getTranslation } from './translations.js';\nimport {\n ALL_CONTROLS, PRESETS, filterPresetForEnabled, type ControlId, type PresetId,\n} from './controls.js';\n\nconst MULTI_KEYS: Record<string, keyof PanelState> = {\n 'oks-zoom': 'zoom',\n 'oks-lh': 'lh',\n 'oks-align': 'align',\n 'oks-ls': 'ls',\n 'oks-colorblind': 'colorblind',\n};\n\nconst MULTI_LEVELS: Record<string, number> = {\n 'oks-zoom': 4,\n 'oks-lh': 3,\n 'oks-align': 3,\n 'oks-ls': 3,\n 'oks-colorblind': 3,\n};\n\nconst TOGGLE_KEYS: Record<string, keyof PanelState> = {\n 'oks-a11y-font': 'font',\n 'oks-dyslexia': 'dyslexia',\n 'oks-a11y-contrast': 'contrast',\n 'oks-a11y-hide': 'hideImages',\n 'oks-a11y-links': 'highlightLinks',\n 'oks-big-cursor': 'bigCursor',\n 'oks-a11y-pause': 'pauseAnim',\n 'oks-a11y-focus': 'focusOutline',\n 'oks-a11y-bigtargets': 'bigTargets',\n};\n\nexport interface BehaviorOptions {\n /** Llave localStorage. Default oksiacSettings. */\n storageKey?: string;\n /** Locale para los aria-label dinámicos (nivel de los multinivel). Default en. */\n locale?: string;\n /** Controles que ofrece esta instancia (#1). Default: los 17. Filtra qué\n * flags puede aplicar un perfil. */\n enabled?: Set<ControlId>;\n /** Desplazamiento máximo del usuario para el trigger en px (#5). 0/ausente\n * desactiva el nudge (comportamiento actual). */\n nudgeMax?: number;\n /** Contenedor al que confinar los efectos (`scope=`). Si se pasa, las clases\n * scopables van a este elemento en vez de a `body`, y los efectos no\n * regionalizables (overlays, daltonismo, cursor) no se aplican. */\n scopeEl?: HTMLElement | null;\n}\n\n/** Dispose function with imperative open/close/toggle attached (#2). Calling\n * the value disposes; the methods drive the panel host-side. */\nexport interface PanelController {\n (): void;\n open(): void;\n close(): void;\n toggle(): void;\n}\n\nfunction noopController(): PanelController {\n return Object.assign(() => {}, { open() {}, close() {}, toggle() {} });\n}\n\n/** Deepest focused element, crossing shadow boundaries — so we can restore\n * focus to whatever opened the panel (the host's own button in trigger=\"none\"\n * mode, the floating trigger otherwise). */\nfunction deepActiveElement(): HTMLElement | null {\n let a = document.activeElement as HTMLElement | null;\n while (a?.shadowRoot?.activeElement) a = a.shadowRoot.activeElement as HTMLElement;\n return a;\n}\n\n/**\n * Engancha toda la lógica al panel ya renderizado dentro de `root`\n * (que es el shadowRoot del custom element). Devuelve un PanelController:\n * invocarlo limpia; sus métodos abren/cierran el panel.\n */\nexport function bindPanelBehavior(root: ShadowRoot, opts: BehaviorOptions = {}): PanelController {\n const storageKey = opts.storageKey ?? 'oksiacSettings';\n const t = getTranslation(opts.locale ?? 'en');\n const enabled = opts.enabled ?? new Set(ALL_CONTROLS);\n const nudgeMax = Math.max(0, opts.nudgeMax ?? 0);\n\n const trigger = root.getElementById('oks-trigger') as HTMLButtonElement | null;\n const panel = root.getElementById('oks-panel') as HTMLDivElement | null;\n const closeBtn = root.getElementById('oks-close') as HTMLButtonElement | null;\n const resetBtn = root.getElementById('oks-reset') as HTMLButtonElement | null;\n const wrapper = root.getElementById('oks-wrapper') as HTMLDivElement | null;\n const opts$ = Array.from(root.querySelectorAll<HTMLButtonElement>('.oks-access-opt, .oks-preset'));\n\n // trigger + wrapper are optional (trigger=\"none\" host-driven mode); the\n // panel itself and its close/reset are required.\n if (!panel || !closeBtn || !resetBtn) {\n return noopController();\n }\n\n let state: PanelState = loadState(storageKey);\n\n // `scopeEl === undefined` → global mode (apply to body). Defined → scoped.\n const scoped = opts.scopeEl !== undefined;\n\n // ─── Global-offerable controls in scoped mode ───────────────────\n // big cursor + reading guide/mask can't be confined to a container, but they\n // are benign window-level aids, so a scoped panel still offers them and\n // applies them GLOBALLY (to body) with a single shared state across every\n // instance/window — persisted under a fixed key (not the per-pane\n // storage-key). Toggle from any pane → whole window + every pane's button\n // reflects it. Synced same-document via a custom event and cross-window via\n // the `storage` event.\n const GLOBAL_KEY = 'oksiac::global';\n type GlobalState = { bigCursor: boolean; readingGuide: boolean; readingMask: boolean };\n const GLOBAL_MAP: Array<{ flag: keyof GlobalState; cls: string; match: (b: HTMLButtonElement) => boolean }> = [\n { flag: 'bigCursor', cls: 'oks-big-cursor', match: (b) => b.getAttribute('data-class') === 'oks-big-cursor' },\n { flag: 'readingGuide', cls: 'oks-a11y-guide', match: (b) => b.getAttribute('data-action') === 'guide' },\n { flag: 'readingMask', cls: 'oks-a11y-mask', match: (b) => b.getAttribute('data-action') === 'mask' },\n ];\n const globalOfferableOf = (b: HTMLButtonElement) => GLOBAL_MAP.find((x) => x.match(b));\n const loadGlobal = (): GlobalState => {\n try {\n const r = JSON.parse(localStorage.getItem(GLOBAL_KEY) ?? '{}') as Partial<GlobalState>;\n return { bigCursor: !!r.bigCursor, readingGuide: !!r.readingGuide, readingMask: !!r.readingMask };\n } catch { return { bigCursor: false, readingGuide: false, readingMask: false }; }\n };\n const saveGlobal = (g: GlobalState): void => {\n try {\n if (g.bigCursor || g.readingGuide || g.readingMask) localStorage.setItem(GLOBAL_KEY, JSON.stringify(g));\n else localStorage.removeItem(GLOBAL_KEY);\n } catch { /* fail silent */ }\n };\n const applyGlobal = (g: GlobalState): void => {\n document.body.classList.toggle('oks-big-cursor', g.bigCursor);\n document.body.classList.toggle('oks-a11y-guide', g.readingGuide);\n document.body.classList.toggle('oks-a11y-mask', g.readingMask);\n for (const btn of opts$) {\n const m = globalOfferableOf(btn);\n if (!m) continue;\n btn.classList.toggle('is-active', g[m.flag]);\n btn.setAttribute('aria-pressed', g[m.flag] ? 'true' : 'false');\n }\n };\n const refreshGlobal = (): void => { if (scoped) applyGlobal(loadGlobal()); };\n // A preset applied in scoped mode may set global-offerable flags on `state`;\n // route them to the shared global state instead of the per-pane state.\n const syncGlobalFromState = (): void => {\n if (!scoped) return;\n const g = loadGlobal();\n let changed = false;\n if (state.bigCursor) { g.bigCursor = true; state.bigCursor = false; changed = true; }\n if (state.readingGuide) { g.readingGuide = true; state.readingGuide = false; changed = true; }\n if (state.readingMask) { g.readingMask = true; state.readingMask = false; changed = true; }\n if (changed) { saveGlobal(g); applyGlobal(g); document.dispatchEvent(new CustomEvent('oksiac:globalchange')); }\n };\n\n // ─── Render-from-state ──────────────────────────────────────────\n function applyState(): void {\n const fxRoot: HTMLElement | null = scoped ? (opts.scopeEl ?? null) : document.body;\n const rootEl = document.documentElement;\n if (fxRoot) {\n for (const cls of Array.from(fxRoot.classList)) {\n if (cls.startsWith('oks-')) fxRoot.classList.remove(cls);\n }\n }\n if (!scoped) [1, 2, 3].forEach((l) => rootEl.classList.remove(`oks-colorblind-${l}`));\n\n if (fxRoot) {\n if (state.zoom > 0) fxRoot.classList.add(`oks-zoom-${state.zoom}`);\n if (state.lh > 0) fxRoot.classList.add(`oks-lh-${state.lh}`);\n if (state.align > 0) fxRoot.classList.add(`oks-align-${state.align}`);\n if (state.ls > 0) fxRoot.classList.add(`oks-ls-${state.ls}`);\n if (state.font) fxRoot.classList.add('oks-a11y-font');\n if (state.dyslexia) fxRoot.classList.add('oks-dyslexia');\n if (state.contrast) fxRoot.classList.add('oks-a11y-contrast');\n if (state.hideImages) fxRoot.classList.add('oks-a11y-hide');\n if (state.highlightLinks) fxRoot.classList.add('oks-a11y-links');\n if (state.pauseAnim) fxRoot.classList.add('oks-a11y-pause');\n if (state.focusOutline) fxRoot.classList.add('oks-a11y-focus');\n if (state.bigTargets) fxRoot.classList.add('oks-a11y-bigtargets');\n }\n\n // Non-scopable effects apply only in global mode (auto-excluded when scoped).\n if (!scoped) {\n if (state.colorblind > 0) rootEl.classList.add(`oks-colorblind-${state.colorblind}`);\n if (state.bigCursor) document.body.classList.add('oks-big-cursor');\n if (state.readingGuide) document.body.classList.add('oks-a11y-guide');\n if (state.readingMask) document.body.classList.add('oks-a11y-mask');\n ensureOverlay().classList.toggle('is-active', state.grayOverlay);\n }\n\n syncButtonsFromState();\n wrapper?.classList.toggle('has-active', !isStateEmpty(state));\n }\n\n function syncButtonsFromState(): void {\n for (const btn of opts$) {\n // Global-offerable buttons (scoped mode) are driven by applyGlobal, not\n // by the per-pane state — leave them alone here.\n if (scoped && globalOfferableOf(btn)) continue;\n const action = btn.getAttribute('data-action');\n if (action === 'multi' || action === 'colorblind') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n if (!key) continue;\n const lvl = state[key] as number;\n btn.setAttribute('data-level', String(lvl));\n btn.classList.toggle('is-active', lvl > 0);\n btn.setAttribute('aria-pressed', lvl > 0 ? 'true' : 'false');\n const max = parseInt(btn.getAttribute('data-levels') ?? '0', 10);\n const lbl = btn.querySelector('.oks-label')?.textContent?.trim() ?? '';\n if (lvl > 0 && max > 0) btn.setAttribute('aria-label', t.level(lbl, lvl, max));\n else btn.removeAttribute('aria-label');\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) continue;\n const val = state[key] as boolean;\n btn.classList.toggle('is-active', val);\n btn.setAttribute('aria-pressed', val ? 'true' : 'false');\n } else if (action === 'overlay') {\n btn.classList.toggle('is-active', state.grayOverlay);\n btn.setAttribute('aria-pressed', state.grayOverlay ? 'true' : 'false');\n } else if (action === 'guide') {\n btn.classList.toggle('is-active', state.readingGuide);\n btn.setAttribute('aria-pressed', state.readingGuide ? 'true' : 'false');\n } else if (action === 'mask') {\n btn.classList.toggle('is-active', state.readingMask);\n btn.setAttribute('aria-pressed', state.readingMask ? 'true' : 'false');\n }\n }\n }\n\n // ─── Click handlers ─────────────────────────────────────────────\n const onOptClick = (e: MouseEvent): void => {\n const btn = e.currentTarget as HTMLButtonElement;\n // Global-offerable controls in scoped mode toggle the shared window state,\n // apply globally, and broadcast — not the per-pane state.\n if (scoped) {\n const go = globalOfferableOf(btn);\n if (go) {\n const g = loadGlobal();\n g[go.flag] = !g[go.flag];\n saveGlobal(g);\n applyGlobal(g);\n document.dispatchEvent(new CustomEvent('oksiac:globalchange'));\n return;\n }\n }\n const action = btn.getAttribute('data-action');\n if (action === 'multi') {\n const prefix = btn.getAttribute('data-prefix') ?? '';\n const key = MULTI_KEYS[prefix];\n const max = MULTI_LEVELS[prefix] ?? 0;\n if (!key) return;\n const lvl = ((state[key] as number) + 1) % (max + 1);\n (state[key] as number) = lvl;\n } else if (action === 'colorblind') {\n state.colorblind = (state.colorblind + 1) % 4;\n } else if (action === 'toggle') {\n const klass = btn.getAttribute('data-class') ?? '';\n const key = TOGGLE_KEYS[klass];\n if (!key) return;\n (state[key] as boolean) = !(state[key] as boolean);\n if (klass === 'oks-a11y-contrast' && state.contrast) state.grayOverlay = false;\n } else if (action === 'overlay') {\n state.grayOverlay = !state.grayOverlay;\n if (state.grayOverlay) state.contrast = false;\n } else if (action === 'guide') {\n state.readingGuide = !state.readingGuide;\n } else if (action === 'mask') {\n state.readingMask = !state.readingMask;\n } else if (action === 'preset') {\n const id = btn.getAttribute('data-preset') as PresetId | null;\n // Recompose the preset to the controls this instance still offers (#1):\n // a profile never sets a flag the user can't see or undo here.\n if (id && PRESETS[id]) Object.assign(state, filterPresetForEnabled(id, enabled));\n btn.classList.add('is-flashing');\n setTimeout(() => btn.classList.remove('is-flashing'), 250);\n syncGlobalFromState(); // route any global-offerable flags to window state\n }\n applyState();\n saveState(storageKey, state);\n };\n\n const onReset = (): void => {\n state = { ...DEFAULT_STATE };\n applyState();\n saveState(storageKey, state);\n // The global-offerable controls (big cursor, reading guide/mask) live in the\n // shared window state, not this pane's — clear them too and tell every pane.\n if (scoped) {\n const cleared: GlobalState = { bigCursor: false, readingGuide: false, readingMask: false };\n saveGlobal(cleared);\n applyGlobal(cleared);\n document.dispatchEvent(new CustomEvent('oksiac:globalchange'));\n }\n };\n\n // ─── Open / close (also exposed imperatively, #2) ───────────────\n let opener: HTMLElement | null = null;\n // When the host opens us from its own button (trigger=\"none\"), that click\n // keeps bubbling to document, where onDocClick would treat it as an\n // outside-click and close us in the same gesture. Ignore the doc-click for\n // the current event-loop turn after opening.\n let ignoreDocClose = false;\n\n // In scoped mode the dialog anchors to its container (over the pane's top),\n // not to a shared viewport corner — otherwise several scoped panels open in\n // the same spot and read as one. Computed from the scope's box on open and\n // kept in place while open (scroll/resize).\n const positionScopedDialog = (): void => {\n const el = opts.scopeEl;\n if (!el) return;\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return; // not laid out yet\n const pad = 8;\n panel.style.top = `${Math.max(pad, r.top + pad)}px`;\n panel.style.bottom = 'auto';\n panel.style.left = `${r.left + r.width / 2}px`;\n panel.style.right = 'auto';\n panel.style.transform = 'translateX(-50%)';\n };\n\n const openPanel = (): void => {\n if (panel.classList.contains('is-open')) return;\n opener = deepActiveElement();\n panel.classList.add('is-open');\n panel.removeAttribute('inert');\n if (opts.scopeEl) positionScopedDialog();\n trigger?.setAttribute('aria-expanded', 'true');\n ignoreDocClose = true;\n setTimeout(() => { ignoreDocClose = false; }, 0);\n const first = panel.querySelector<HTMLElement>('button:not([disabled])');\n first?.focus();\n };\n const closePanel = (): void => {\n if (!panel.classList.contains('is-open')) return;\n panel.classList.remove('is-open');\n panel.setAttribute('inert', '');\n trigger?.setAttribute('aria-expanded', 'false');\n // Restore focus to the trigger, or to whatever opened us host-side.\n if (trigger) trigger.focus();\n else if (opener?.isConnected) opener.focus();\n opener = null;\n };\n const togglePanel = (): void => {\n if (panel.classList.contains('is-open')) closePanel();\n else openPanel();\n };\n\n let suppressClick = false;\n const onTriggerClick = (e: MouseEvent): void => {\n e.stopPropagation();\n // A click that ended a drag must not also open the panel.\n if (suppressClick) { suppressClick = false; return; }\n togglePanel();\n };\n\n const onDocClick = (e: MouseEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (ignoreDocClose) return;\n const path = e.composedPath();\n if (path.includes(panel)) return;\n if (trigger && path.includes(trigger)) return;\n if (wrapper && path.includes(wrapper)) return;\n closePanel();\n };\n\n const onKeyDown = (e: KeyboardEvent): void => {\n if (!panel.classList.contains('is-open')) return;\n if (e.key === 'Escape') { closePanel(); return; }\n if (e.key !== 'Tab') return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>('button:not([disabled]), a[href]'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = root.activeElement as HTMLElement | null;\n if (e.shiftKey) {\n if (active === first) { e.preventDefault(); last.focus(); }\n } else {\n if (active === last) { e.preventDefault(); first.focus(); }\n }\n };\n\n // ─── Bounded nudge: user repositions the trigger within limits (#5) ──\n // An accessibility feature in itself — a user with a reduced visual field,\n // a screen magnifier, or left-handed reach can move the launcher out of\n // their way. Bounded so it can never be lost off-screen or buried.\n const NUDGE_KEY = `${storageKey}::pos`;\n const clampMax = (v: number): number => Math.max(-nudgeMax, Math.min(nudgeMax, v));\n let nudge = { x: 0, y: 0 };\n\n const loadNudge = (): void => {\n if (nudgeMax <= 0) return;\n try {\n const raw = localStorage.getItem(NUDGE_KEY);\n if (!raw) return;\n const p = JSON.parse(raw) as { x?: unknown; y?: unknown };\n if (typeof p?.x === 'number' && typeof p?.y === 'number') {\n nudge = { x: clampMax(p.x), y: clampMax(p.y) };\n }\n } catch { /* localStorage blocked / corrupt — ignore */ }\n };\n const saveNudge = (): void => {\n try {\n if (nudge.x === 0 && nudge.y === 0) localStorage.removeItem(NUDGE_KEY);\n else localStorage.setItem(NUDGE_KEY, JSON.stringify(nudge));\n } catch { /* fail silent */ }\n };\n const applyNudge = (): void => {\n // The `translate` property composes with the anchor's `transform`\n // (translateY(-50%) etc.) instead of overwriting it.\n if (wrapper) wrapper.style.translate = `${nudge.x}px ${nudge.y}px`;\n };\n // Clamp a tentative offset to ±max AND to the viewport, so the button never\n // leaves the screen regardless of anchor.\n const clampOffset = (x: number, y: number): { x: number; y: number } => {\n x = clampMax(x); y = clampMax(y);\n if (wrapper) {\n const r = wrapper.getBoundingClientRect();\n const pad = 4;\n const baseLeft = r.left - nudge.x;\n const baseTop = r.top - nudge.y;\n const vw = window.innerWidth || 0;\n const vh = window.innerHeight || 0;\n if (r.width > 0 && vw > 0) x = Math.max(pad - baseLeft, Math.min(vw - pad - r.width - baseLeft, x));\n if (r.height > 0 && vh > 0) y = Math.max(pad - baseTop, Math.min(vh - pad - r.height - baseTop, y));\n }\n return { x, y };\n };\n\n let dragStart: { px: number; py: number; ox: number; oy: number } | null = null;\n let didDrag = false;\n const DRAG_THRESHOLD = 4;\n const onPointerDown = (e: PointerEvent): void => {\n if (nudgeMax <= 0 || e.button !== 0) return;\n dragStart = { px: e.clientX, py: e.clientY, ox: nudge.x, oy: nudge.y };\n didDrag = false;\n trigger?.setPointerCapture?.(e.pointerId);\n };\n const onPointerMove = (e: PointerEvent): void => {\n if (!dragStart) return;\n const dx = e.clientX - dragStart.px;\n const dy = e.clientY - dragStart.py;\n if (!didDrag && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n didDrag = true;\n nudge = clampOffset(dragStart.ox + dx, dragStart.oy + dy);\n applyNudge();\n e.preventDefault();\n };\n const onPointerUp = (): void => {\n if (!dragStart) return;\n dragStart = null;\n if (didDrag) { saveNudge(); suppressClick = true; }\n };\n // Keyboard nudge — the accessible counterpart to drag (never drag-only on an\n // a11y control). Arrows move while the trigger is focused; Shift = fine step.\n const onTriggerKey = (e: KeyboardEvent): void => {\n if (nudgeMax <= 0) return;\n const step = e.shiftKey ? 1 : 10;\n let dx = 0; let dy = 0;\n if (e.key === 'ArrowLeft') dx = -step;\n else if (e.key === 'ArrowRight') dx = step;\n else if (e.key === 'ArrowUp') dy = -step;\n else if (e.key === 'ArrowDown') dy = step;\n else return;\n e.preventDefault();\n nudge = clampOffset(nudge.x + dx, nudge.y + dy);\n applyNudge();\n saveNudge();\n };\n\n // ─── Reading guide + mask follow the pointer ────────────────────\n const onMove = (e: MouseEvent | TouchEvent): void => {\n // Read the body classes (not local state) so guide/mask follow the cursor\n // whether they were set per-instance (global mode) or window-wide (scoped).\n const guideOn = document.body.classList.contains('oks-a11y-guide');\n const maskOn = document.body.classList.contains('oks-a11y-mask');\n if (!guideOn && !maskOn) return;\n const y = (e as TouchEvent).touches?.[0]?.clientY ?? (e as MouseEvent).clientY;\n if (typeof y !== 'number') return;\n if (guideOn) {\n const guide = document.getElementById('oks-reading-guide');\n if (guide) guide.style.top = `${y}px`;\n }\n if (maskOn) {\n const mask = document.getElementById('oks-reading-mask');\n if (mask) mask.style.setProperty('--oks-mask-y', `${y}px`);\n }\n };\n\n // ─── Bind ───────────────────────────────────────────────────────\n trigger?.addEventListener('click', onTriggerClick);\n closeBtn.addEventListener('click', closePanel);\n resetBtn.addEventListener('click', onReset);\n for (const btn of opts$) btn.addEventListener('click', onOptClick);\n document.addEventListener('click', onDocClick);\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('touchmove', onMove, { passive: true });\n\n // Keep the scoped dialog anchored to its pane while open.\n const onReposition = (): void => {\n if (opts.scopeEl && panel.classList.contains('is-open')) positionScopedDialog();\n };\n // Sync the window-level global-offerable controls: same-document via our\n // custom event, cross-window/detached via the localStorage `storage` event.\n const onGlobalChange = (): void => refreshGlobal();\n const onStorage = (e: StorageEvent): void => { if (e.key === GLOBAL_KEY) refreshGlobal(); };\n if (scoped) {\n window.addEventListener('scroll', onReposition, true);\n window.addEventListener('resize', onReposition);\n document.addEventListener('oksiac:globalchange', onGlobalChange);\n window.addEventListener('storage', onStorage);\n }\n\n if (nudgeMax > 0 && trigger) {\n loadNudge();\n applyNudge();\n // Affordance + let the drag own the gesture instead of the page scrolling.\n trigger.style.cursor = 'grab';\n trigger.style.touchAction = 'none';\n trigger.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n trigger.addEventListener('keydown', onTriggerKey);\n }\n\n // Aplicar el estado guardado al cargar.\n applyState();\n refreshGlobal(); // pick up the shared window-level controls (scoped only)\n\n const dispose = (): void => {\n trigger?.removeEventListener('click', onTriggerClick);\n closeBtn.removeEventListener('click', closePanel);\n resetBtn.removeEventListener('click', onReset);\n for (const btn of opts$) btn.removeEventListener('click', onOptClick);\n document.removeEventListener('click', onDocClick);\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchmove', onMove);\n if (scoped) {\n window.removeEventListener('scroll', onReposition, true);\n window.removeEventListener('resize', onReposition);\n document.removeEventListener('oksiac:globalchange', onGlobalChange);\n window.removeEventListener('storage', onStorage);\n }\n trigger?.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n trigger?.removeEventListener('keydown', onTriggerKey);\n };\n\n return Object.assign(dispose, { open: openPanel, close: closePanel, toggle: togglePanel });\n}\n\nfunction ensureOverlay(): HTMLElement {\n let el = document.getElementById('oks-overlay-gray');\n if (!el) {\n el = document.createElement('div');\n el.id = 'oks-overlay-gray';\n el.className = 'oks-overlay-effect';\n document.body.appendChild(el);\n }\n return el;\n}\n","// CSS heredado del plugin WP oksigenia-access v16.9.\n// Separado en dos bloques:\n// · PANEL_CSS — estilos del panel + botón trigger. Van al Shadow DOM\n// del custom element, no contaminan el host site.\n// · EFFECT_CSS — estilos de las clases que afectan al `body`/`html`\n// (zoom, contraste, dyslexia, etc.). Inyectados en `document.head`\n// porque tienen que cruzar el boundary del Shadow DOM.\n\nexport const PANEL_CSS = `\n:host {\n --oks-btn-size: 55px;\n --oks-bg: #000;\n --oks-icon: #fff;\n --oks-h-bg: #fff;\n --oks-h-icon: #000;\n --oks-z: 9999999;\n}\n.oks-access-wrapper {\n position: fixed;\n z-index: var(--oks-z);\n line-height: 1;\n}\n.oks-access-btn {\n width: var(--oks-btn-size);\n height: var(--oks-btn-size);\n border-radius: 50%;\n background: var(--oks-bg);\n color: var(--oks-icon);\n border: 2px solid #fff;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-btn:hover {\n background: var(--oks-h-bg);\n color: var(--oks-h-icon);\n transform: scale(1.1);\n}\n.oks-access-btn svg {\n fill: currentColor;\n display: block;\n margin: 0 auto;\n width: 60%;\n height: 60%;\n}\n/* Porthole preset: a brushed-metal ring framing the standard glyph. The glyph\n itself is untouched (discoverability), only the button gets the frame.\n Hosts wanting a bespoke frame can target ::part(trigger) from light DOM. */\n.oks-access-btn[data-trigger-icon=\"porthole\"] {\n box-shadow: 0 0 0 4px #b0bec5, 0 0 0 7px #546e7a, 0 6px 18px rgba(0,0,0,0.3);\n}\n.oks-active-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 20px;\n height: 20px;\n background: #25D366;\n border-radius: 50%;\n border: 2px solid #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0;\n pointer-events: none;\n}\n.oks-active-badge svg { width: 12px; height: 12px; }\n.oks-access-wrapper.has-active .oks-active-badge { opacity: 1; }\n\n.oks-access-panel {\n position: fixed;\n width: 340px;\n max-height: 90vh;\n background: #fff;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n z-index: var(--oks-z);\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: 0.2s;\n border: 1px solid rgba(0,0,0,0.1);\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #333;\n}\n.oks-access-panel.is-open { opacity: 1; pointer-events: all; }\n.oks-access-header {\n padding: 15px 20px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.oks-access-header h3 { margin: 0; font-size: 18px; color: #000; }\n.oks-access-close {\n background: #f0f0f0;\n color: #333;\n border: 1px solid #ddd;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.2s;\n padding: 0;\n}\n.oks-access-close:hover { background: #e0e0e0; border-color: #ccc; }\n.oks-access-close svg { width: 24px; height: 24px; stroke-width: 2.5px; }\n.oks-access-content { padding: 0 20px 20px; overflow-y: auto; }\n.oks-access-title {\n margin: 10px 0 5px;\n font-size: 11px;\n font-weight: 800;\n text-transform: uppercase;\n color: #888;\n}\n/* Screen-reader-only: keeps the category headings in the accessibility tree\n (flat scoped layout) while taking them out of the grid flow so they don't\n force a visual row break or occupy a cell. */\n.oks-sr-only {\n position: absolute !important;\n width: 1px; height: 1px;\n margin: 0; padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n.oks-access-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.oks-access-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\n.oks-preset {\n background: #f0f4f8;\n border: 2px solid transparent;\n border-radius: 8px;\n padding: 8px 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n font: inherit;\n color: #333;\n min-width: 0;\n transition: 0.15s;\n}\n.oks-preset:hover { background: #000; color: #fff; }\n.oks-preset:focus-visible { outline: 2px solid #000; outline-offset: 2px; }\n/* Click feedback: a 250 ms flip + slight squeeze. Pure transient — the\n button does not carry persistent active state because a preset is a\n trigger, not a mode. */\n.oks-preset.is-flashing {\n background: #000;\n color: #fff;\n transform: scale(0.96);\n}\n.oks-preset .oks-icon { font-size: 22px; margin-bottom: 4px; }\n.oks-preset .oks-icon svg { width: 20px; height: 20px; }\n.oks-preset .oks-label {\n font-size: 10px; font-weight: 700; text-transform: uppercase;\n text-align: center; line-height: 1.15;\n overflow-wrap: anywhere; word-break: break-word;\n /* Reserve room for 2 lines so 1-line labels (DISLEXIA, MOTOR) and\n 2-line labels (BAJA VISIÓN, SIN DISTRAC.) end up the same height,\n centred. Without this the row looks ragged. */\n min-height: 2.3em;\n display: flex; align-items: center; justify-content: center;\n}\n.oks-access-opt {\n background: #f9f9f9;\n border: 2px solid #eee;\n border-radius: 10px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n min-width: 0;\n min-height: 70px;\n color: #333;\n transition: 0.2s;\n font: inherit;\n}\n.oks-access-opt.full-width { grid-column: span 2; }\n.oks-access-opt.is-active {\n border-color: #000;\n background: #fff;\n box-shadow: 0 0 0 1px #000;\n}\n.oks-access-opt:hover { background: #000; color: #fff; border-color: #000; }\n.oks-icon { font-size: 28px; margin-bottom: 3px; display: block; line-height: 1; }\n.oks-icon svg { width: 24px; height: 24px; fill: currentColor; }\n.oks-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n text-align: center;\n line-height: 1.2;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n.oks-levels { display: flex; gap: 3px; height: 5px; width: 50%; margin-top: 5px; }\n.oks-levels span { flex: 1; background: #ddd; border-radius: 3px; }\n.oks-access-opt[data-level=\"1\"] .oks-levels span:nth-child(1),\n.oks-access-opt[data-level=\"2\"] .oks-levels span:nth-child(-n+2),\n.oks-access-opt[data-level=\"3\"] .oks-levels span:nth-child(-n+3),\n.oks-access-opt[data-level=\"4\"] .oks-levels span:nth-child(-n+4) { background: #000; }\n.oks-access-opt:hover .oks-levels span { background: #555; }\n.oks-access-footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n text-align: center;\n}\n.oks-access-reset {\n width: 100%;\n padding: 8px;\n border: 2px solid #000;\n color: #000;\n background: transparent;\n font-weight: 700;\n cursor: pointer;\n border-radius: 6px;\n font-size: 12px;\n}\n.oks-access-reset:hover { background: #000; color: #fff; }\n.oks-access-branding { margin-top: 12px; font-size: 12px; color: #000; font-weight: 700; }\n.oks-access-branding a { color: #000; text-decoration: none; border-bottom: 1px dotted #000; }\n\n@media (prefers-reduced-motion: reduce) {\n .oks-access-btn, .oks-access-panel, .oks-access-close,\n .oks-preset, .oks-access-opt { transition: none; }\n .oks-access-btn:hover { transform: scale(1); }\n .oks-preset.is-flashing { transform: none; }\n}\n@media (max-width: 768px) {\n .oks-access-panel {\n width: 100%; height: 100%; max-height: 100%;\n top: 0; left: 0; right: 0; bottom: 0;\n border-radius: 0;\n }\n .oks-access-opt { min-height: 72px; padding: 10px 8px; }\n .oks-icon svg { width: 26px; height: 26px; }\n .oks-label { font-size: 12px; line-height: 1.25; }\n .oks-access-grid { gap: 8px; }\n .oks-access-content { padding: 0 14px 20px; }\n .oks-access-title { font-size: 11px; margin: 10px 0 4px; }\n /* Cursor grande no aplica en táctil: oculto y dejo el último botón\n de la sección ocupando 2 columnas para no romper la grilla par. */\n .oks-access-opt[data-class=\"oks-big-cursor\"] { display: none; }\n .oks-access-opt[data-class=\"oks-a11y-focus\"] { grid-column: span 2; }\n .oks-access-reset { padding: 14px; font-size: 14px; }\n}\n`;\n\n// Estilos globales aplicados al document. NO van al Shadow DOM porque\n// tienen que afectar al body del host site.\nexport const EFFECT_CSS = `\nhtml.oks-colorblind-1 { filter: url('#oks-filter-protanopia'); }\nhtml.oks-colorblind-2 { filter: url('#oks-filter-deuteranopia'); }\nhtml.oks-colorblind-3 { filter: url('#oks-filter-tritanopia'); }\n\n/* Text-size levels.\n Applied to <html> via :has(), not to <body>. rem is anchored to the root\n element, so a site whose CSS sizes things in rem (most modern Astro / Tailwind\n builds) needs the root font-size to change for the scale to take effect.\n A previous version applied this to body with %, which only moved descendants\n that inherited font-size from body — anything sized in rem stayed locked to\n the 16px default of <html>. An even earlier version used the universal\n selector with em and compounded the factor at every nesting level.\n :has(body.oks-zoom-N) is the right anchor: one change at the root, rem\n descendants scale exactly once. Hard-coded px is intentionally left alone;\n browser zoom covers that case. */\nhtml:has(body.oks-zoom-1) { font-size: 110% !important; }\nhtml:has(body.oks-zoom-2) { font-size: 120% !important; }\nhtml:has(body.oks-zoom-3) { font-size: 135% !important; }\nhtml:has(body.oks-zoom-4) { font-size: 150% !important; }\n\nbody.oks-lh-1 * { line-height: 1.6 !important; }\nbody.oks-lh-2 * { line-height: 1.9 !important; }\nbody.oks-lh-3 * { line-height: 2.2 !important; }\n\nbody.oks-a11y-font { font-family: Arial, sans-serif !important; }\n\nbody.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\nbody.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\nbody.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\nbody.oks-align-1 * { text-align: left !important; }\nbody.oks-align-2 * { text-align: center !important; }\nbody.oks-align-3 * { text-align: right !important; }\n\nbody.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\nbody.oks-ls-1 * { letter-spacing: 0.05em !important; }\nbody.oks-ls-2 * { letter-spacing: 0.10em !important; }\nbody.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\n/* Focus highlight colour is themeable via --oks-focus-color (default #005fcc):\n set it on :root for a dark theme so the highlight stays visible. The\n persistent \"all interactive\" dashed derives a 45% tint from it; the glow can\n be overridden on its own with --oks-focus-glow. */\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 color-mix(in srgb, var(--oks-focus-color, #005fcc) 45%, transparent) !important;\n outline-offset: 2px !important;\n}\nbody.oks-a11y-focus *:focus-visible {\n outline: 3px solid var(--oks-focus-color, #005fcc) !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px var(--oks-focus-glow, color-mix(in srgb, var(--oks-focus-color, #005fcc) 25%, transparent)) !important;\n}\n\nbody.oks-a11y-contrast.oks-a11y-focus *:focus,\nbody.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n@media (pointer: fine) {\n body.oks-big-cursor, body.oks-big-cursor a, body.oks-big-cursor button {\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24'%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' stroke='white' stroke-width='4' stroke-linejoin='round' fill='white'/%3E%3Cpath d='M4 2L4 18L8 14L11 21L14 19.5L11 13L15.5 13Z' fill='black'/%3E%3C/svg%3E\") 8 4, auto !important;\n }\n}\n\nbody.oks-a11y-contrast,\nbody.oks-a11y-contrast *:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\nbody.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\nbody.oks-a11y-contrast a:not(oksigenia-access-panel *) { color: #0ff !important; text-decoration: underline !important; }\n\n/* High-contrast applies background:#000 to every descendant of body to flip\n the page to inverted colours. That selector also catches our own overlays\n (.oks-reading-guide, .oks-overlay-effect), which would then paint a solid\n black band on top of the text and defeat their purpose. Restore the\n overlay-specific values here so they keep working in high-contrast mode. */\nbody.oks-a11y-contrast .oks-reading-guide {\n background-color: rgba(255, 255, 0, 0.25) !important;\n border-top-color: #ff0 !important;\n border-bottom-color: #ff0 !important;\n}\nbody.oks-a11y-contrast .oks-overlay-effect {\n background-color: transparent !important;\n}\n\n.oks-overlay-effect {\n position: fixed; top: 0; left: 0;\n width: 100%; height: 100%;\n pointer-events: none;\n z-index: 999990;\n display: none;\n backdrop-filter: grayscale(100%);\n}\n.oks-overlay-effect.is-active { display: block; }\n\n.oks-reading-guide {\n position: fixed; left: 0;\n width: 100%; height: 50px;\n background: rgba(255, 255, 0, 0.2);\n border-top: 3px solid red;\n border-bottom: 3px solid red;\n pointer-events: none;\n z-index: 2147483647;\n display: none;\n transform: translateY(-50%);\n}\nbody.oks-a11y-guide .oks-reading-guide { display: block; }\n\n/* Reading mask: dark overlay leaving a horizontal band lit around the cursor.\n --oks-mask-y is updated from JS on mousemove; band is ±90px around it. */\n.oks-reading-mask {\n position: fixed; top: 0; left: 0;\n width: 100vw; height: 100vh;\n pointer-events: none;\n z-index: 2147483646;\n background: rgba(0, 0, 0, 0.75);\n display: none;\n clip-path: polygon(\n 0 0, 100% 0,\n 100% calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) - 90px),\n 0 calc(var(--oks-mask-y, 50vh) + 90px),\n 100% calc(var(--oks-mask-y, 50vh) + 90px),\n 100% 100%, 0 100%\n );\n}\nbody.oks-a11y-mask .oks-reading-mask { display: block; }\nbody.oks-a11y-contrast .oks-reading-mask { background-color: rgba(0, 0, 0, 0.85) !important; }\n\n/* Big targets: bump interactive hit-areas to WCAG 2.5.5 (44×44 minimum).\n Only adjusts padding + min-* — never display, so layouts that rely on\n inline flow or grid placement survive. Exempts our own shadow-DOM host. */\nbody.oks-a11y-bigtargets a:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets button:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets [role=\"button\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"checkbox\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets input[type=\"radio\"]:not(oksigenia-access-panel):not(oksigenia-access-panel *),\nbody.oks-a11y-bigtargets summary:not(oksigenia-access-panel):not(oksigenia-access-panel *) {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n\n/**\n * Scoped-mode effect CSS (#scope). Emits only the controls that can be confined\n * to a container by selector — the same rules as EFFECT_CSS but anchored to the\n * scope element instead of `body`. The non-scopable effects (colour-blind, which\n * is a `filter` on `<html>`; the full-screen overlays grayscale / reading guide /\n * reading mask; and big cursor) are NOT here — a scoped instance auto-excludes\n * those controls, so they never appear in a per-pane panel.\n *\n * Text size scopes as the container's `font-size`, so it scales `em`/inherited\n * text inside the pane but not `rem` (which is always relative to `<html>` —\n * there is no CSS way to anchor rem to a container). Hosts that want per-pane\n * text scaling size that pane's text in `em`.\n *\n * `s` is a host-provided CSS selector (e.g. `#map-pane`), trusted like the\n * effects-exclude value.\n */\nexport function scopedEffectCss(s: string): string {\n return `\n${s}.oks-zoom-1 { font-size: 110% !important; }\n${s}.oks-zoom-2 { font-size: 120% !important; }\n${s}.oks-zoom-3 { font-size: 135% !important; }\n${s}.oks-zoom-4 { font-size: 150% !important; }\n\n${s}.oks-lh-1 * { line-height: 1.6 !important; }\n${s}.oks-lh-2 * { line-height: 1.9 !important; }\n${s}.oks-lh-3 * { line-height: 2.2 !important; }\n\n${s}.oks-a11y-font, ${s}.oks-a11y-font * { font-family: Arial, sans-serif !important; }\n\n${s}.oks-dyslexia * {\n font-family: 'Comic Sans MS', 'Verdana', sans-serif !important;\n letter-spacing: 0.05em !important;\n word-spacing: 0.1em !important;\n line-height: 1.6 !important;\n}\n\n${s}.oks-a11y-hide img { opacity: 0 !important; visibility: hidden !important; }\n${s}.oks-a11y-links a { text-decoration: underline !important; background: #ff0 !important; color: #000 !important; }\n\n${s}.oks-align-1 * { text-align: left !important; }\n${s}.oks-align-2 * { text-align: center !important; }\n${s}.oks-align-3 * { text-align: right !important; }\n\n${s}.oks-a11y-pause * { animation: none !important; transition: none !important; }\n\n${s}.oks-ls-1 * { letter-spacing: 0.05em !important; }\n${s}.oks-ls-2 * { letter-spacing: 0.10em !important; }\n${s}.oks-ls-3 * { letter-spacing: 0.16em !important; }\n\n${s}.oks-a11y-focus a,\n${s}.oks-a11y-focus button,\n${s}.oks-a11y-focus input,\n${s}.oks-a11y-focus select,\n${s}.oks-a11y-focus textarea {\n outline: 2px dashed color-mix(in srgb, var(--oks-focus-color, #005fcc) 45%, transparent) !important;\n outline-offset: 2px !important;\n}\n${s}.oks-a11y-focus *:focus-visible {\n outline: 3px solid var(--oks-focus-color, #005fcc) !important;\n outline-offset: 3px !important;\n box-shadow: 0 0 0 6px var(--oks-focus-glow, color-mix(in srgb, var(--oks-focus-color, #005fcc) 25%, transparent)) !important;\n}\n\n${s}.oks-a11y-contrast, ${s}.oks-a11y-contrast * {\n background-color: #000 !important;\n color: #ff0 !important;\n border-color: #ff0 !important;\n text-shadow: none !important;\n box-shadow: none !important;\n}\n${s}.oks-a11y-contrast img { filter: grayscale(100%) contrast(120%) !important; }\n${s}.oks-a11y-contrast a { color: #0ff !important; text-decoration: underline !important; }\n${s}.oks-a11y-contrast.oks-a11y-focus *:focus-visible {\n outline-color: #0ff !important;\n box-shadow: 0 0 0 6px rgba(0, 255, 255, 0.3) !important;\n}\n\n${s}.oks-a11y-bigtargets a,\n${s}.oks-a11y-bigtargets button,\n${s}.oks-a11y-bigtargets [role=\"button\"],\n${s}.oks-a11y-bigtargets input[type=\"checkbox\"],\n${s}.oks-a11y-bigtargets input[type=\"radio\"],\n${s}.oks-a11y-bigtargets summary {\n min-height: 44px !important;\n min-width: 44px !important;\n padding: 8px 12px !important;\n box-sizing: border-box !important;\n}\n`;\n}\n"]}