@cognitvs/a11y-widget 0.0.0-stage → 1.0.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/README.md +134 -2
- package/dist/a11y-widget.js +1325 -0
- package/dist/a11y-widget.js.map +1 -0
- package/dist/a11y-widget.umd.cjs +2 -0
- package/dist/a11y-widget.umd.cjs.map +1 -0
- package/dist/features/cursor-magnet.d.ts +24 -0
- package/dist/features/dom-effects.d.ts +11 -0
- package/dist/features/scroll-assist.d.ts +10 -0
- package/dist/features/tts.d.ts +11 -0
- package/dist/features/vlibras.d.ts +7 -0
- package/dist/index.d.ts +5 -0
- package/dist/print_01.png +0 -0
- package/dist/state/store.d.ts +38 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/widget.d.ts +25 -0
- package/package.json +46 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y-widget.js","sources":["../src/state/store.ts","../src/features/dom-effects.ts","../src/features/tts.ts","../src/features/cursor-magnet.ts","../src/features/scroll-assist.ts","../src/features/vlibras.ts","../src/widget.ts","../src/index.ts"],"sourcesContent":["import { A11yState, AssistiveProfile, DaltonismMode, MagnetForce, TTSSpeed, TextSpacingLevel } from '../types';\n\ntype Listener = (state: A11yState) => void;\n\nexport class A11yStore {\n private prefix: string;\n private state: A11yState;\n private listeners: Set<Listener> = new Set();\n\n constructor(prefix = 'cognitvs') {\n this.prefix = prefix;\n this.state = this.loadInitialState();\n }\n\n public getState(): A11yState {\n return { ...this.state };\n }\n\n public subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n listener(this.getState());\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n const current = this.getState();\n this.listeners.forEach((fn) => fn(current));\n }\n\n private loadInitialState(): A11yState {\n const getItem = (key: string) => {\n try {\n return localStorage.getItem(`${this.prefix}_${key}`);\n } catch {\n return null;\n }\n };\n\n const fontScale = parseFloat(getItem('font_scale') || '1') || 1;\n const isHighContrast = getItem('high_contrast') === 'true';\n const isReduceMotion = getItem('reduce_motion') === 'true';\n const isBigCursor = getItem('big_cursor') === 'true';\n const isKeyboardFocus = getItem('keyboard_focus') === 'true';\n const isHighlightLinks = getItem('highlight_links') === 'true';\n const isReadingMaskActive = getItem('reading_mask') === 'true';\n const isReadingMaskSmart = getItem('reading_mask_smart') !== 'false';\n const isDyslexiaMode = getItem('dyslexia') === 'true';\n const textSpacingLevel = (parseInt(getItem('text_spacing') || '0', 10) || 0) as TextSpacingLevel;\n const colorBlindMode = (getItem('colorblind') || 'none') as DaltonismMode;\n const isScrollAssistActive = getItem('scroll_assist') === 'true';\n const isCursorMagnetActive = getItem('magnet_cursor') === 'true';\n const cursorMagnetForce = (getItem('magnet_force') || 'suave') as MagnetForce;\n const isVLibrasActive = getItem('vlibras') === 'true';\n const isTTSActive = getItem('tts') === 'true';\n const ttsRate = (parseFloat(getItem('tts_rate') || '1') || 1) as TTSSpeed;\n const hasSeenTour = getItem('seen_tour') === 'true';\n const bannerDismissed = getItem('banner_dismissed') === 'true';\n\n return {\n isExpanded: false,\n activeProfile: 'all',\n fontScale,\n isHighContrast,\n isReadingMaskActive,\n isReadingMaskSmart,\n colorBlindMode,\n isDaltonismMenuOpen: false,\n isTTSActive,\n ttsRate,\n isVLibrasActive,\n isBigCursor,\n isKeyboardFocus,\n isScrollAssistActive,\n isCursorMagnetActive,\n cursorMagnetForce,\n isHighlightLinks,\n isReduceMotion,\n isDyslexiaMode,\n textSpacingLevel,\n showAttentionGrabber: false,\n hasInteracted: hasSeenTour,\n bannerDismissed,\n };\n }\n\n public setStorage(key: string, value: string): void {\n try {\n localStorage.setItem(`${this.prefix}_${key}`, value);\n } catch (e) {\n console.warn('A11yWidget: falha ao salvar no localStorage', e);\n }\n }\n\n public removeStorage(key: string): void {\n try {\n localStorage.removeItem(`${this.prefix}_${key}`);\n } catch (e) {\n console.warn('A11yWidget: falha ao remover do localStorage', e);\n }\n }\n\n public update(partial: Partial<A11yState>): void {\n this.state = { ...this.state, ...partial };\n this.notify();\n }\n\n public toggleExpanded(): void {\n this.update({\n isExpanded: !this.state.isExpanded,\n showAttentionGrabber: false,\n hasInteracted: true,\n });\n this.setStorage('seen_tour', 'true');\n }\n\n public setActiveProfile(profile: AssistiveProfile): void {\n this.update({ activeProfile: profile });\n }\n\n public updateFontScale(delta: number): void {\n const newScale = Math.min(Math.max(parseFloat((this.state.fontScale + delta).toFixed(2)), 0.8), 2.0);\n this.update({ fontScale: newScale });\n this.setStorage('font_scale', newScale.toString());\n }\n\n public toggleHighContrast(): void {\n const val = !this.state.isHighContrast;\n this.update({ isHighContrast: val });\n this.setStorage('high_contrast', val.toString());\n }\n\n public toggleReduceMotion(): void {\n const val = !this.state.isReduceMotion;\n this.update({ isReduceMotion: val });\n this.setStorage('reduce_motion', val.toString());\n }\n\n public toggleBigCursor(): void {\n const val = !this.state.isBigCursor;\n this.update({ isBigCursor: val });\n this.setStorage('big_cursor', val.toString());\n }\n\n public toggleKeyboardFocus(): void {\n const val = !this.state.isKeyboardFocus;\n this.update({ isKeyboardFocus: val });\n this.setStorage('keyboard_focus', val.toString());\n }\n\n public toggleHighlightLinks(): void {\n const val = !this.state.isHighlightLinks;\n this.update({ isHighlightLinks: val });\n this.setStorage('highlight_links', val.toString());\n }\n\n public toggleScrollAssist(): void {\n const val = !this.state.isScrollAssistActive;\n this.update({ isScrollAssistActive: val });\n this.setStorage('scroll_assist', val.toString());\n }\n\n public toggleCursorMagnet(): void {\n const val = !this.state.isCursorMagnetActive;\n this.update({ isCursorMagnetActive: val });\n this.setStorage('magnet_cursor', val.toString());\n }\n\n public setCursorMagnetForce(force: MagnetForce): void {\n this.update({ cursorMagnetForce: force });\n this.setStorage('magnet_force', force);\n }\n\n public toggleReadingMask(): void {\n const val = !this.state.isReadingMaskActive;\n this.update({ isReadingMaskActive: val });\n this.setStorage('reading_mask', val.toString());\n }\n\n public setReadingMaskSmart(smart: boolean): void {\n this.update({ isReadingMaskSmart: smart });\n this.setStorage('reading_mask_smart', smart.toString());\n }\n\n public toggleDyslexia(): void {\n const val = !this.state.isDyslexiaMode;\n this.update({ isDyslexiaMode: val });\n this.setStorage('dyslexia', val.toString());\n }\n\n public setTextSpacing(level: TextSpacingLevel): void {\n this.update({ textSpacingLevel: level });\n this.setStorage('text_spacing', level.toString());\n }\n\n public setColorBlindMode(mode: DaltonismMode): void {\n this.update({ colorBlindMode: mode, isDaltonismMenuOpen: false });\n this.setStorage('colorblind', mode);\n }\n\n public toggleDaltonismMenu(): void {\n this.update({ isDaltonismMenuOpen: !this.state.isDaltonismMenuOpen });\n }\n\n public toggleTTS(): void {\n const val = !this.state.isTTSActive;\n const rate = val ? 1 : this.state.ttsRate;\n this.update({ isTTSActive: val, ttsRate: rate });\n this.setStorage('tts', val.toString());\n if (val) this.setStorage('tts_rate', '1');\n }\n\n public setTTSRate(rate: TTSSpeed): void {\n this.update({ ttsRate: rate });\n this.setStorage('tts_rate', rate.toString());\n }\n\n public toggleVLibras(): void {\n const val = !this.state.isVLibrasActive;\n this.update({ isVLibrasActive: val });\n this.setStorage('vlibras', val.toString());\n }\n\n public dismissBanner(): void {\n this.update({ bannerDismissed: true });\n this.setStorage('banner_dismissed', 'true');\n }\n\n public resetAll(): void {\n const keys = [\n 'font_scale',\n 'high_contrast',\n 'reduce_motion',\n 'big_cursor',\n 'keyboard_focus',\n 'highlight_links',\n 'reading_mask',\n 'reading_mask_smart',\n 'dyslexia',\n 'text_spacing',\n 'colorblind',\n 'vlibras',\n 'magnet_cursor',\n 'magnet_force',\n 'tts',\n 'tts_rate',\n ];\n keys.forEach((k) => this.removeStorage(k));\n\n this.update({\n fontScale: 1,\n isHighContrast: false,\n isReadingMaskActive: false,\n isReadingMaskSmart: true,\n colorBlindMode: 'none',\n isDaltonismMenuOpen: false,\n isTTSActive: false,\n ttsRate: 1,\n isVLibrasActive: false,\n isBigCursor: false,\n isKeyboardFocus: false,\n isScrollAssistActive: false,\n isCursorMagnetActive: false,\n cursorMagnetForce: 'suave',\n isHighlightLinks: false,\n isReduceMotion: false,\n isDyslexiaMode: false,\n textSpacingLevel: 0,\n });\n }\n}\n","import { A11yState } from '../types';\n\nexport class DomEffectsManager {\n private prevClasses: Set<string> = new Set();\n private readingMaskEl: HTMLDivElement | null = null;\n private maskFrameId: number | null = null;\n private boundMouseMove: ((e: MouseEvent) => void) | null = null;\n\n public applyGlobalState(state: A11yState): void {\n const docEl = document.documentElement;\n\n // Escala de Fonte\n docEl.style.setProperty('--font-scale', state.fontScale.toString());\n\n // Classes no elemento raiz\n this.syncClass(docEl, 'high-contrast', state.isHighContrast);\n this.syncClass(docEl, 'reduce-motion', state.isReduceMotion);\n this.syncClass(docEl, 'big-cursor', state.isBigCursor);\n this.syncClass(docEl, 'keyboard-focus', state.isKeyboardFocus);\n this.syncClass(docEl, 'highlight-links', state.isHighlightLinks);\n this.syncClass(docEl, 'scroll-assist-active', state.isScrollAssistActive);\n this.syncClass(docEl, 'cursor-magnet-active', state.isCursorMagnetActive);\n this.syncClass(docEl, 'dyslexia-mode', state.isDyslexiaMode);\n\n // Força do ímã de cursor\n docEl.setAttribute('data-magnet-force', state.cursorMagnetForce);\n\n // Espaçamento de Texto\n docEl.classList.remove('text-spacing-1', 'text-spacing-2');\n if (state.textSpacingLevel > 0) {\n docEl.classList.add(`text-spacing-${state.textSpacingLevel}`);\n }\n\n // Daltonismo\n ['protanopia', 'deuteranopia', 'tritanopia', 'monochromacy'].forEach((m) => {\n docEl.classList.remove(`daltonism-${m}`);\n });\n if (state.colorBlindMode !== 'none') {\n docEl.classList.add(`daltonism-${state.colorBlindMode}`);\n }\n\n // Máscara de Leitura\n this.syncReadingMask(state.isReadingMaskActive, state.isReadingMaskSmart);\n }\n\n private syncClass(el: HTMLElement, className: string, active: boolean): void {\n if (active) {\n el.classList.add(className);\n this.prevClasses.add(className);\n } else {\n el.classList.remove(className);\n this.prevClasses.delete(className);\n }\n }\n\n private syncReadingMask(active: boolean, isSmart: boolean): void {\n if (!active) {\n if (this.readingMaskEl) {\n this.readingMaskEl.remove();\n this.readingMaskEl = null;\n }\n if (this.boundMouseMove) {\n window.removeEventListener('mousemove', this.boundMouseMove);\n this.boundMouseMove = null;\n }\n if (this.maskFrameId) {\n cancelAnimationFrame(this.maskFrameId);\n this.maskFrameId = null;\n }\n return;\n }\n\n if (!this.readingMaskEl) {\n this.readingMaskEl = document.createElement('div');\n this.readingMaskEl.id = 'cognitvs-a11y-reading-mask';\n this.readingMaskEl.setAttribute('aria-hidden', 'true');\n this.readingMaskEl.style.cssText = `\n position: fixed;\n left: 0;\n width: 100vw;\n pointer-events: none;\n z-index: 999998;\n border-top: 2px solid rgba(0, 119, 212, 0.7);\n border-bottom: 2px solid rgba(0, 119, 212, 0.7);\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.7);\n height: var(--mask-height, 140px);\n top: var(--mask-top, calc(50vh - 70px));\n transition: top 0.15s cubic-bezier(0.2, 0, 0, 1), height 0.15s cubic-bezier(0.2, 0, 0, 1);\n `;\n document.body.appendChild(this.readingMaskEl);\n }\n\n let lastTarget: Element | null = null;\n\n if (this.boundMouseMove) {\n window.removeEventListener('mousemove', this.boundMouseMove);\n }\n\n this.boundMouseMove = (e: MouseEvent) => {\n if (this.maskFrameId) cancelAnimationFrame(this.maskFrameId);\n this.maskFrameId = requestAnimationFrame(() => {\n if (isSmart) {\n const target = document.elementFromPoint(e.clientX, e.clientY);\n if (target) {\n const textContainer = target.closest('p, h1, h2, h3, h4, h5, h6, li, blockquote, figcaption, td, th, a, button, label');\n const elToMeasure = textContainer || target;\n const rect = elToMeasure.getBoundingClientRect();\n if (textContainer && rect.height > 10 && rect.height < 500) {\n if (elToMeasure !== lastTarget) {\n lastTarget = elToMeasure;\n const margin = 24;\n const maskHeight = rect.height + margin;\n const topPos = rect.top - margin / 2;\n document.documentElement.style.setProperty('--mask-height', `${maskHeight}px`);\n document.documentElement.style.setProperty('--mask-top', `${topPos}px`);\n }\n return;\n }\n }\n }\n lastTarget = null;\n document.documentElement.style.setProperty('--mask-height', '140px');\n document.documentElement.style.setProperty('--mask-top', `${e.clientY - 70}px`);\n });\n };\n\n window.addEventListener('mousemove', this.boundMouseMove, { passive: true });\n }\n\n public destroy(): void {\n const docEl = document.documentElement;\n this.prevClasses.forEach((c) => docEl.classList.remove(c));\n ['protanopia', 'deuteranopia', 'tritanopia', 'monochromacy', 'text-spacing-1', 'text-spacing-2'].forEach((c) => docEl.classList.remove(c));\n docEl.style.removeProperty('--font-scale');\n docEl.removeAttribute('data-magnet-force');\n this.syncReadingMask(false, false);\n }\n}\n","import { TTSSpeed } from '../types';\n\nexport class TTSController {\n private active = false;\n private rate: TTSSpeed = 1;\n private boundClickHandler: ((e: MouseEvent) => void) | null = null;\n private isWidgetElement: (el: Node) => boolean;\n\n constructor(isWidgetElement: (el: Node) => boolean) {\n this.isWidgetElement = isWidgetElement;\n }\n\n public update(active: boolean, rate: TTSSpeed): void {\n this.active = active;\n this.rate = rate;\n\n if (!active) {\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n window.speechSynthesis.cancel();\n }\n if (this.boundClickHandler) {\n document.removeEventListener('click', this.boundClickHandler, { capture: true });\n this.boundClickHandler = null;\n }\n return;\n }\n\n if (!this.boundClickHandler) {\n this.boundClickHandler = this.handleClick.bind(this);\n document.addEventListener('click', this.boundClickHandler, { capture: true });\n }\n }\n\n private handleClick(e: MouseEvent): void {\n if (!this.active) return;\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n // Não processa se o clique foi dentro do widget de acessibilidade\n if (this.isWidgetElement(target)) return;\n\n // Proteção de Layout: Evita containers gigantes estruturais\n const invalidTags = [\n 'BODY', 'HTML', 'MAIN', 'SECTION', 'ARTICLE', 'HEADER',\n 'FOOTER', 'NAV', 'ASIDE', 'FORM', 'UL', 'OL', 'TABLE', 'TBODY', 'TR'\n ];\n if (invalidTags.includes(target.tagName) || target.id === 'root') return;\n\n const blockTags = [\n 'DIV', 'P', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'UL', 'OL', 'LI',\n 'SECTION', 'ARTICLE', 'IMG', 'PICTURE', 'VIDEO', 'HEADER', 'FOOTER',\n 'NAV', 'ASIDE', 'FORM', 'TABLE', 'TR', 'TD', 'TH', 'MAIN'\n ];\n const hasBlockChildren = Array.from(target.children).some((child) => blockTags.includes(child.tagName));\n if (hasBlockChildren) return;\n\n const rawText = target.innerText || target.textContent || '';\n const text = rawText.replace(/[\\p{Extended_Pictographic}]/gu, '').trim();\n\n if (text.length > 0 && 'speechSynthesis' in window) {\n if (target.closest('a') || target.closest('button')) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n window.speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(text);\n utterance.lang = 'pt-BR';\n utterance.rate = this.rate;\n\n const originalHTML = target.innerHTML;\n const originalOutline = target.style.outline;\n const originalOutlineOffset = target.style.outlineOffset;\n\n // Efeito Karaokê (in-place)\n const tokens = text.split(/(\\s+)/);\n target.innerHTML = '';\n const spanElements: HTMLSpanElement[] = [];\n\n tokens.forEach((token) => {\n const span = document.createElement('span');\n span.textContent = token;\n span.style.transition = 'all 150ms ease-in-out';\n span.style.borderRadius = '2px';\n target.appendChild(span);\n spanElements.push(span);\n });\n\n target.style.outline = '3px solid #f59e0b';\n target.style.outlineOffset = '2px';\n\n utterance.onboundary = (ev) => {\n if (ev.name === 'word') {\n let charCount = 0;\n for (let i = 0; i < spanElements.length; i++) {\n const spanText = spanElements[i].textContent || '';\n const span = spanElements[i];\n\n if (charCount <= ev.charIndex && charCount + spanText.length > ev.charIndex && spanText.trim().length > 0) {\n span.style.backgroundColor = '#fef08a';\n span.style.color = '#0f172a';\n span.style.boxShadow = '0 0 0 2px #fef08a';\n } else {\n span.style.backgroundColor = 'transparent';\n span.style.color = 'inherit';\n span.style.boxShadow = '0 0 0 2px transparent';\n }\n charCount += spanText.length;\n }\n }\n };\n\n const restoreDOM = () => {\n target.style.outline = originalOutline;\n target.style.outlineOffset = originalOutlineOffset;\n target.innerHTML = originalHTML;\n };\n\n utterance.onend = restoreDOM;\n utterance.onerror = restoreDOM;\n\n window.speechSynthesis.speak(utterance);\n }\n }\n\n public destroy(): void {\n if (this.boundClickHandler) {\n document.removeEventListener('click', this.boundClickHandler, { capture: true });\n this.boundClickHandler = null;\n }\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n window.speechSynthesis.cancel();\n }\n }\n}\n","import { MagnetForce } from '../types';\n\nexport class CursorMagnetController {\n private active = false;\n private force: MagnetForce = 'suave';\n private cursorEl: HTMLDivElement | null = null;\n private isMagnetized = false;\n private targetButton: HTMLElement | null = null;\n private cachedButtons: { el: HTMLElement; rect: DOMRect }[] = [];\n private lastCacheTime = 0;\n private isBig = false;\n\n private boundMouseMove: ((e: MouseEvent) => void) | null = null;\n private boundClick: ((e: MouseEvent) => void) | null = null;\n private boundScroll: (() => void) | null = null;\n\n public update(active: boolean, force: MagnetForce, isBig: boolean): void {\n this.active = active;\n this.force = force;\n this.isBig = isBig;\n\n if (!active) {\n this.teardown();\n return;\n }\n\n if (!this.boundMouseMove) {\n this.setup();\n }\n }\n\n private setup(): void {\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundClick = this.handleClick.bind(this);\n this.boundScroll = () => { this.lastCacheTime = 0; };\n\n window.addEventListener('mousemove', this.boundMouseMove, { passive: true });\n window.addEventListener('click', this.boundClick, { capture: true });\n window.addEventListener('scroll', this.boundScroll, { passive: true });\n }\n\n private teardown(): void {\n if (this.boundMouseMove) {\n window.removeEventListener('mousemove', this.boundMouseMove);\n this.boundMouseMove = null;\n }\n if (this.boundClick) {\n window.removeEventListener('click', this.boundClick, { capture: true });\n this.boundClick = null;\n }\n if (this.boundScroll) {\n window.removeEventListener('scroll', this.boundScroll);\n this.boundScroll = null;\n }\n\n document.documentElement.classList.remove('cursor-hidden');\n this.isMagnetized = false;\n this.targetButton = null;\n if (this.cursorEl) {\n this.cursorEl.remove();\n this.cursorEl = null;\n }\n }\n\n private ensureCursorElement(): HTMLDivElement {\n if (!this.cursorEl) {\n this.cursorEl = document.createElement('div');\n this.cursorEl.id = 'cognitvs-a11y-virtual-cursor';\n this.cursorEl.setAttribute('aria-hidden', 'true');\n this.cursorEl.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n transition: transform 75ms ease;\n transform: translate(-5px, -5px);\n filter: drop-shadow(0 0 10px rgba(0, 119, 212, 0.9));\n `;\n document.body.appendChild(this.cursorEl);\n }\n this.cursorEl.innerHTML = this.isBig\n ? `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 32 32\">\n <path fill=\"#ffffff\" stroke=\"#0077d4\" stroke-width=\"3\" stroke-linejoin=\"round\" d=\"M2 2 L2 28 L9 22 L15 31 L19 29 L12 20 L21 20 Z\" />\n </svg>`\n : `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 32 32\">\n <path fill=\"#ffffff\" stroke=\"#0077d4\" stroke-width=\"2.5\" stroke-linejoin=\"round\" d=\"M2 2 L2 28 L9 22 L15 31 L19 29 L12 20 L21 20 Z\" />\n </svg>`;\n return this.cursorEl;\n }\n\n private updateButtonCache(): void {\n const now = Date.now();\n if (now - this.lastCacheTime > 200) {\n const elements = document.querySelectorAll('a, button, [role=\"button\"], input[type=\"submit\"], input[type=\"button\"]');\n this.cachedButtons = Array.from(elements).map((el) => ({\n el: el as HTMLElement,\n rect: el.getBoundingClientRect(),\n }));\n this.lastCacheTime = now;\n }\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.active) return;\n const ATTRACTION_RADIUS = this.force === 'forte' ? 45 : 25;\n const ESCAPE_RADIUS = this.force === 'forte' ? 60 : 40;\n\n this.updateButtonCache();\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n let targetDistance = Infinity;\n let targetCenter = { x: 0, y: 0 };\n let closestDistance = Infinity;\n let closestButton: HTMLElement | null = null;\n let closestCenter = { x: 0, y: 0 };\n\n for (const { el } of this.cachedButtons) {\n const currentRect = el.getBoundingClientRect();\n const centerX = currentRect.left + currentRect.width / 2;\n const centerY = currentRect.top + currentRect.height / 2;\n\n const dxEdge = Math.max(currentRect.left - mouseX, 0, mouseX - currentRect.right);\n const dyEdge = Math.max(currentRect.top - mouseY, 0, mouseY - currentRect.bottom);\n const distanceToEdge = Math.sqrt(dxEdge * dxEdge + dyEdge * dyEdge);\n\n if (distanceToEdge < closestDistance) {\n closestDistance = distanceToEdge;\n closestButton = el;\n closestCenter = { x: centerX, y: centerY };\n }\n\n if (el === this.targetButton) {\n targetDistance = distanceToEdge;\n targetCenter = { x: centerX, y: centerY };\n }\n }\n\n // Histerese Magnética\n if (this.isMagnetized && this.targetButton) {\n if (targetDistance > ESCAPE_RADIUS) {\n this.isMagnetized = false;\n this.targetButton = null;\n document.documentElement.classList.remove('cursor-hidden');\n\n if (closestDistance < ATTRACTION_RADIUS && closestButton) {\n this.isMagnetized = true;\n this.targetButton = closestButton;\n this.setCursorPos(closestCenter.x, closestCenter.y);\n document.documentElement.classList.add('cursor-hidden');\n } else {\n this.hideVirtualCursor();\n }\n } else {\n this.setCursorPos(targetCenter.x, targetCenter.y);\n }\n } else {\n if (closestDistance < ATTRACTION_RADIUS && closestButton) {\n this.isMagnetized = true;\n this.targetButton = closestButton;\n this.setCursorPos(closestCenter.x, closestCenter.y);\n document.documentElement.classList.add('cursor-hidden');\n } else {\n this.hideVirtualCursor();\n }\n }\n }\n\n private setCursorPos(x: number, y: number): void {\n const el = this.ensureCursorElement();\n el.style.display = 'block';\n el.style.left = `${x}px`;\n el.style.top = `${y}px`;\n }\n\n private hideVirtualCursor(): void {\n if (this.cursorEl) {\n this.cursorEl.style.display = 'none';\n }\n document.documentElement.classList.remove('cursor-hidden');\n }\n\n private handleClick(e: MouseEvent): void {\n if (!this.active) return;\n this.lastCacheTime = 0;\n\n if (this.isMagnetized && this.targetButton) {\n if (!this.targetButton.contains(e.target as Node)) {\n e.preventDefault();\n e.stopPropagation();\n this.targetButton.click();\n }\n }\n }\n\n public destroy(): void {\n this.teardown();\n }\n}\n","export class ScrollAssistController {\n private containerEl: HTMLDivElement | null = null;\n private boundScroll: (() => void) | null = null;\n\n public update(active: boolean): void {\n if (!active) {\n this.teardown();\n return;\n }\n if (!this.containerEl) {\n this.setup();\n }\n this.checkScrollLimits();\n }\n\n private setup(): void {\n this.containerEl = document.createElement('div');\n this.containerEl.id = 'cognitvs-a11y-scroll-assist';\n this.containerEl.setAttribute('aria-label', 'Assistente de Rolagem');\n this.containerEl.style.cssText = `\n position: fixed;\n bottom: 24px;\n left: 24px;\n z-index: 999990;\n display: flex;\n flex-direction: column;\n gap: 12px;\n pointer-events: auto;\n `;\n\n const upBtn = document.createElement('button');\n upBtn.id = 'cognitvs-scroll-up';\n upBtn.setAttribute('aria-label', 'Rolar para cima');\n upBtn.title = 'Rolar para cima';\n upBtn.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n `;\n this.styleButton(upBtn, false);\n upBtn.onclick = () => window.scrollBy({ top: -window.innerHeight * 0.7, behavior: 'smooth' });\n\n const downBtn = document.createElement('button');\n downBtn.id = 'cognitvs-scroll-down';\n downBtn.setAttribute('aria-label', 'Rolar para baixo');\n downBtn.title = 'Rolar para baixo';\n downBtn.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n `;\n this.styleButton(downBtn, true);\n downBtn.onclick = () => window.scrollBy({ top: window.innerHeight * 0.7, behavior: 'smooth' });\n\n this.containerEl.appendChild(upBtn);\n this.containerEl.appendChild(downBtn);\n document.body.appendChild(this.containerEl);\n\n this.boundScroll = this.checkScrollLimits.bind(this);\n window.addEventListener('scroll', this.boundScroll, { passive: true });\n }\n\n private styleButton(btn: HTMLButtonElement, isPrimary: boolean): void {\n btn.style.cssText = `\n width: 52px;\n height: 52px;\n border-radius: 16px;\n border: 2px solid ${isPrimary ? '#0077d4' : 'rgba(0, 119, 212, 0.4)'};\n background: ${isPrimary ? '#0077d4' : '#0f172a'};\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 10px 25px rgba(0, 0, 0, 0.35);\n backdrop-filter: blur(8px);\n transition: all 0.2s ease;\n font-weight: bold;\n `;\n btn.onmouseenter = () => {\n btn.style.transform = 'scale(1.08)';\n btn.style.background = isPrimary ? '#0066b8' : '#1e293b';\n };\n btn.onmouseleave = () => {\n btn.style.transform = 'scale(1)';\n btn.style.background = isPrimary ? '#0077d4' : '#0f172a';\n };\n }\n\n private checkScrollLimits(): void {\n if (!this.containerEl) return;\n const isAtTop = window.scrollY < 20;\n const isAtBottom = Math.ceil(window.innerHeight + window.scrollY) >= document.documentElement.scrollHeight - 20;\n\n const upBtn = this.containerEl.querySelector<HTMLButtonElement>('#cognitvs-scroll-up');\n const downBtn = this.containerEl.querySelector<HTMLButtonElement>('#cognitvs-scroll-down');\n\n if (upBtn) upBtn.style.opacity = isAtTop ? '0.4' : '1';\n if (downBtn) downBtn.style.opacity = isAtBottom ? '0.4' : '1';\n }\n\n private teardown(): void {\n if (this.boundScroll) {\n window.removeEventListener('scroll', this.boundScroll);\n this.boundScroll = null;\n }\n if (this.containerEl) {\n this.containerEl.remove();\n this.containerEl = null;\n }\n }\n\n public destroy(): void {\n this.teardown();\n }\n}\n","export class VLibrasController {\n private active = false;\n private scriptLoaded = false;\n\n public update(active: boolean): void {\n this.active = active;\n\n const windowWithLibras = window as unknown as { toggleVLibras?: (active: boolean) => void; VLibras?: unknown };\n\n if (!active) {\n if (typeof windowWithLibras.toggleVLibras === 'function') {\n windowWithLibras.toggleVLibras(false);\n }\n return;\n }\n\n if (this.scriptLoaded && typeof windowWithLibras.toggleVLibras === 'function') {\n windowWithLibras.toggleVLibras(true);\n return;\n }\n\n this.loadVLibras();\n }\n\n private loadVLibras(): void {\n if (document.getElementById('vlibras-plugin-container')) {\n return;\n }\n\n // Criar o container padrão oficial do VLibras\n const div = document.createElement('div');\n div.id = 'vlibras-plugin-container';\n div.innerHTML = `\n <div vw class=\"enabled\">\n <div vw-access-button class=\"active\"></div>\n <div vw-plugin-wrapper>\n <div class=\"vw-plugin-top-wrapper\"></div>\n </div>\n </div>\n `;\n document.body.appendChild(div);\n\n // Carregar o script do VLibras Oficial\n const script = document.createElement('script');\n script.id = 'vlibras-official-script';\n script.src = 'https://vlibras.gov.br/app/vlibras-plugin.js';\n script.async = true;\n script.onload = () => {\n this.scriptLoaded = true;\n const win = window as unknown as { VLibras?: { Widget: new (url: string) => void } };\n if (win.VLibras && win.VLibras.Widget) {\n new win.VLibras.Widget('https://vlibras.gov.br/app');\n }\n };\n document.head.appendChild(script);\n }\n\n public destroy(): void {\n if (this.active) {\n this.update(false);\n }\n }\n}\n","import widgetCss from './styles/widget.css?inline';\nimport globalCss from './styles/global.css?inline';\nimport { A11yStore } from './state/store';\nimport { DomEffectsManager } from './features/dom-effects';\nimport { TTSController } from './features/tts';\nimport { CursorMagnetController } from './features/cursor-magnet';\nimport { ScrollAssistController } from './features/scroll-assist';\nimport { VLibrasController } from './features/vlibras';\nimport { A11yState, AssistiveProfile, DaltonismMode } from './types';\n\n/**\n * Símbolo Universal de Acessibilidade — SVG oficial (Adobe Illustrator export)\n * Preto para a estrutura, #44A5DD para os nós de destaque (azul ciano do ícone original)\n * currentColor = cor primária do contexto (branco no FAB azul, azul no painel)\n */\nconst A11Y_ICON_SVG = (size = 32) => `\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"${size}\" height=\"${size}\" viewBox=\"0 0 539.7 501.1\" aria-hidden=\"true\">\n <!-- Estrutura principal (braços, pernas, arco superior/inferior, texto nós) -->\n <path fill=\"currentColor\" d=\"M268,276.6c-18.8,28.2-37,55.4-55.3,82.7c-14.9,22.3-29.7,44.6-44.8,66.8c-2.1,3-2.4,4.8,0.3,7.9\n c11.2,13,10.9,32.4-0.1,45.5c-11.3,13.4-30.3,16.7-45.3,7.9c-15-8.8-21.5-27-15.5-43.3c6-16.1,22.6-25.7,39.5-22.6\n c2.9,0.5,4.4,0.1,6.1-2.4c32.7-49.1,65.4-98.1,98.2-147.1c0.6-0.9,1.1-1.9,1.9-3.2c-9.2-1.1-18.1-1.8-26.9-3.2\n c-43.2-6.6-84.4-20-124.9-36c-13.8-5.4-27.3-11.4-40.9-17.3c-2.6-1.1-4.4-1-6.8,0.4c-15.2,8.8-34.2,5.3-45.2-8\n c-11-13.2-11-32.3-0.1-45.6c11-13.3,29.8-16.8,44.8-8.5c15.2,8.4,22.1,26.4,16.3,42.9c-0.9,2.7-1.3,4.1,2,5.5\n c45.8,19.7,92.3,37.1,141.3,47.4c38.9,8.2,77.4,6.5,116.1-0.9c48.7-9.3,95.8-24.1,142.4-40.8c3.9-1.4,3.7-2.5,1.9-5.8\n c-10.2-18.2-2.4-41.3,16.5-49.8c19-8.5,41.4,1.1,48.3,20.7c7,19.9-4.5,41.3-24.9,46.5c-5.9,1.5-11.9,1.6-17.8-0.2\n c-3.1-1-5.6-0.7-8.6,0.4c-48.2,18.1-97.1,33.8-147.7,43.8c-18.3,3.6-36.8,6.3-55.4,7.6c-0.9,1.9,0.7,2.8,1.5,3.9\n c32.8,49.2,65.7,98.3,98.4,147.5c1.8,2.7,3.3,3.2,6.4,2.4c17.2-4.2,34.2,4.3,41.2,20.2c7,15.9,1.5,34.5-13,44.1\n c-14.3,9.5-33.3,7.4-45.3-5c-12-12.4-13.4-31.6-3.1-45.9c1.3-1.9,2.8-3.1,0.9-5.9c-33.8-50.3-67.4-100.7-101.1-151.1\n C268.8,278.1,268.6,277.7,268,276.6z\"/>\n <!-- Arco superior -->\n <path fill=\"currentColor\" d=\"M268.9,0c94.9,3.7,167.9,44.9,217.2,126.7c2.1,3.6,1.5,5.1-2,6.5c-3.4,1.4-6.8,4.9-9.7,4.4\n c-3.1-0.5-4.1-5.6-6-8.7C376.9-21.2,158.6-20.3,68.3,130.7c-2.6,4.3-4.2,5.4-8.7,2.3c-8.6-5.8-9-5.7-3.3-14.3\n C101.9,48.4,166.3,8.8,250,1.1C256.3,0.5,262.6,0.3,268.9,0z\"/>\n <!-- Cabeça (anel externo) -->\n <path fill=\"currentColor\" d=\"M200.5,135.2c0.2-39,31.7-70.4,70.8-70.3c38.9,0.1,70.5,31.8,70.4,70.7c-0.1,39.1-31.8,70.7-71,70.5\n C231.8,206,200.3,174.2,200.5,135.2z M325.1,135.4c-0.1-29.9-24.3-54.1-54-54.1c-29.9,0-54.2,24.6-54.1,54.6\n c0.1,29.7,24.6,53.9,54.4,53.7C301.2,189.5,325.2,165.4,325.1,135.4z\"/>\n <!-- Arco lateral esquerdo -->\n <path fill=\"currentColor\" d=\"M35.1,255.4c2,61.5,23.9,114.7,66.9,158.9c3,3.1,3.4,4.6,0.1,7.7c-8.3,7.9-8.2,8.2-15.9-0.2\n C39,370.2,16.7,309.3,18.9,239.4c0.1-3.1,0.7-4.6,4.2-4.2c3.9,0.4,9.1-1.1,11.6,0.8c2.8,2.2,0.2,7.4,0.5,11.4\n C35.3,250.1,35.1,252.7,35.1,255.4z\"/>\n <!-- Arco lateral direito -->\n <path fill=\"currentColor\" d=\"M518.9,252.8c-1.4,66.4-24.6,123.9-70.4,172.2c-2.7,2.8-4.4,3.1-6.9,0.1c-2.4-2.9-7.5-4.8-7.5-8.1\n c0-2.7,4.3-5.4,6.8-8.1c43.4-48.2,63.8-104.7,61.2-169.5c-0.1-3.4,0.4-4.6,4.1-4.5c12.6,0.1,12.6,0,12.7,12.4\n C518.9,249.2,518.9,251,518.9,252.8z\"/>\n <!-- Arco inferior -->\n <path fill=\"currentColor\" d=\"M268.6,501.1c-28.7,0-56.6-4.9-83.7-14.3c-3.5-1.2-5-2.5-2.9-6.2c1.9-3.3,1.7-8.7,4.8-10\n c2.6-1.1,6.8,1.7,10.2,2.8c51.1,16,101.9,15.1,152.3-3.1c3.8-1.4,5.3-0.9,6.7,3c3.9,11,4.1,10.9-6.9,14.7\n C323.3,496.7,296.3,501.1,268.6,501.1z\"/>\n <!-- Nós de destaque (azul ciano — mantido como identidade visual do ícone) -->\n <circle fill=\"#44A5DD\" cx=\"398\" cy=\"456.5\" r=\"19.3\"/>\n <circle fill=\"#44A5DD\" cx=\"505.1\" cy=\"181.9\" r=\"19.3\"/>\n <circle fill=\"#44A5DD\" cx=\"140.6\" cy=\"456.6\" r=\"19.1\"/>\n <circle fill=\"#44A5DD\" cx=\"35.8\" cy=\"181.8\" r=\"19.2\"/>\n <!-- Cabeça (preenchimento interno azul) -->\n <path fill=\"#44A5DD\" d=\"M325.1,135.4c0.1,30-23.9,54.1-53.7,54.3c-29.8,0.1-54.3-24-54.4-53.7c-0.1-30,24.2-54.6,54.1-54.6\n C300.8,81.4,325,105.6,325.1,135.4z\"/>\n </svg>\n`.trim();\n\n\nexport class CognitvsA11yWidget extends HTMLElement {\n private shadow: ShadowRoot;\n private store: A11yStore;\n private domEffects: DomEffectsManager;\n private tts: TTSController;\n private cursorMagnet: CursorMagnetController;\n private scrollAssist: ScrollAssistController;\n private vlibras: VLibrasController;\n private unsubscribe: (() => void) | null = null;\n private tourTimeoutId: number | null = null;\n private resizeRafId: number | null = null;\n\n constructor() {\n super();\n this.shadow = this.attachShadow({ mode: 'open' });\n const prefix = this.getAttribute('storage-prefix') || 'cognitvs';\n this.store = new A11yStore(prefix);\n this.domEffects = new DomEffectsManager();\n this.tts = new TTSController((node) => this.contains(node) || this.shadow.contains(node));\n this.cursorMagnet = new CursorMagnetController();\n this.scrollAssist = new ScrollAssistController();\n this.vlibras = new VLibrasController();\n }\n\n static get observedAttributes(): string[] {\n return ['theme', 'accent-color', 'position', 'storage-prefix', 'show-banner'];\n }\n\n public attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n if (oldValue === newValue) return;\n if (name === 'accent-color' && newValue) {\n this.style.setProperty('--a11y-primary', newValue);\n }\n }\n\n public connectedCallback(): void {\n this.injectGlobalStyles();\n this.renderInitialShadow();\n\n // Listeners para redimensionamento em tempo real e adaptação suave à tela\n window.addEventListener('resize', this.onViewportChange, { passive: true });\n window.addEventListener('scroll', this.onViewportChange, { passive: true });\n\n // Iniciar Attention Grabber após 3.5s se primeira visita\n const state = this.store.getState();\n if (!state.hasInteracted) {\n this.tourTimeoutId = window.setTimeout(() => {\n if (!this.store.getState().isExpanded && !this.store.getState().hasInteracted) {\n this.store.update({ showAttentionGrabber: true });\n }\n }, 3500);\n }\n\n // Assinar mudanças do estado reativo\n this.unsubscribe = this.store.subscribe((currState) => {\n this.domEffects.applyGlobalState(currState);\n this.tts.update(currState.isTTSActive, currState.ttsRate);\n this.cursorMagnet.update(currState.isCursorMagnetActive, currState.cursorMagnetForce, currState.isBigCursor);\n this.scrollAssist.update(currState.isScrollAssistActive);\n this.vlibras.update(currState.isVLibrasActive);\n this.updateShadowUI(currState);\n });\n\n // Ajuste inicial de dimensões e transição suave do topo da página\n requestAnimationFrame(() => this.updatePanelDimensions());\n setTimeout(() => this.updatePanelDimensions(), 50);\n setTimeout(() => this.updatePanelDimensions(), 250);\n }\n\n public disconnectedCallback(): void {\n window.removeEventListener('resize', this.onViewportChange);\n window.removeEventListener('scroll', this.onViewportChange);\n if (this.resizeRafId) {\n cancelAnimationFrame(this.resizeRafId);\n }\n document.body.classList.remove('a11y-banner-active');\n\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n if (this.tourTimeoutId) {\n clearTimeout(this.tourTimeoutId);\n }\n this.domEffects.destroy();\n this.tts.destroy();\n this.cursorMagnet.destroy();\n this.scrollAssist.destroy();\n this.vlibras.destroy();\n }\n\n private injectGlobalStyles(): void {\n const styleId = 'cognitvs-a11y-global-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = globalCss;\n document.head.appendChild(style);\n }\n }\n\n private renderInitialShadow(): void {\n const showBanner = this.getAttribute('show-banner') !== 'false';\n const accent = this.getAttribute('accent-color');\n if (accent) {\n this.style.setProperty('--a11y-primary', accent);\n }\n\n this.shadow.innerHTML = `\n <style>${widgetCss}</style>\n ${showBanner ? `\n <div id=\"a11y-top-banner\" class=\"a11y-top-banner\" role=\"banner\">\n <div class=\"a11y-banner-content\">\n <span class=\"a11y-banner-icon\" aria-hidden=\"true\">\n ${A11Y_ICON_SVG(26)}\n </span>\n <p class=\"a11y-banner-text\">\n <strong>Acessibilidade:</strong> Personalize sua navegação clicando no botão no canto da tela.\n </p>\n </div>\n <button id=\"banner-close-btn\" class=\"a11y-banner-close\" aria-label=\"Dispensar aviso de acessibilidade\">✕</button>\n </div>\n ` : ''}\n\n <div class=\"a11y-widget-root\">\n <!-- Painel Expansível -->\n <div id=\"a11y-panel\" class=\"a11y-panel closed\" role=\"region\" aria-label=\"Painel de Ferramentas de Acessibilidade\">\n <div class=\"a11y-panel-header\">\n <div class=\"a11y-panel-title\">\n ${A11Y_ICON_SVG(18)}\n ACESSIBILIDADE\n </div>\n <button id=\"panel-close-btn\" class=\"a11y-btn-mini\" style=\"flex:0; width:28px; padding:4px;\" aria-label=\"Fechar painel\">✕</button>\n </div>\n\n <div>\n <label class=\"a11y-section-title\" for=\"profile-select\">Perfil Assistivo</label>\n <select id=\"profile-select\" class=\"a11y-profile-select\">\n <option value=\"all\">Ver Todos os Recursos</option>\n <option value=\"vision\">👁️ Visão Reduzida</option>\n <option value=\"hearing\">🧏 Audição / Surdez</option>\n <option value=\"motor\">🎯 Dificuldade Motora</option>\n <option value=\"cognitive\">🧠 TDAH e Foco</option>\n </select>\n </div>\n\n <div id=\"a11y-feature-container\"></div>\n\n <button id=\"reset-btn\" class=\"a11y-reset-btn\">Resetar Preferências</button>\n </div>\n\n <!-- Botão Flutuante e Dica -->\n <div class=\"a11y-fab-wrapper\">\n <div id=\"tour-bubble\" class=\"a11y-tour-bubble\" style=\"display: none;\">\n <span style=\"font-size: 20px;\">👋</span>\n <p style=\"font-size: 11px; font-weight: bold; line-height: 1.3;\">Dificuldade para navegar? Clique aqui!</p>\n </div>\n <div id=\"ping-ring\" class=\"a11y-ping-ring\" style=\"display: none;\"></div>\n\n <button id=\"fab-btn\" class=\"a11y-fab\" aria-label=\"Abrir recursos de acessibilidade\" aria-haspopup=\"true\">\n ${A11Y_ICON_SVG(34)}\n </button>\n </div>\n </div>\n `;\n\n this.bindEvents();\n }\n\n private bindEvents(): void {\n const fabBtn = this.shadow.querySelector('#fab-btn');\n const panelCloseBtn = this.shadow.querySelector('#panel-close-btn');\n const bannerCloseBtn = this.shadow.querySelector('#banner-close-btn');\n const tourBubble = this.shadow.querySelector('#tour-bubble');\n const resetBtn = this.shadow.querySelector('#reset-btn');\n const profileSelect = this.shadow.querySelector<HTMLSelectElement>('#profile-select');\n\n fabBtn?.addEventListener('click', () => this.store.toggleExpanded());\n panelCloseBtn?.addEventListener('click', () => this.store.toggleExpanded());\n tourBubble?.addEventListener('click', () => this.store.toggleExpanded());\n bannerCloseBtn?.addEventListener('click', () => this.store.dismissBanner());\n resetBtn?.addEventListener('click', () => this.store.resetAll());\n profileSelect?.addEventListener('change', (e) => {\n const val = (e.target as HTMLSelectElement).value as AssistiveProfile;\n this.store.setActiveProfile(val);\n });\n }\n\n private updateShadowUI(state: A11yState): void {\n // Banner Superior\n const banner = this.shadow.querySelector('#a11y-top-banner');\n if (banner) {\n if (state.bannerDismissed) {\n banner.classList.add('hidden');\n document.body.classList.remove('a11y-banner-active');\n document.documentElement.style.setProperty('--a11y-top-banner-height', '0px');\n } else {\n banner.classList.remove('hidden');\n document.body.classList.add('a11y-banner-active');\n }\n }\n\n // Painel e FAB\n const panel = this.shadow.querySelector('#a11y-panel');\n const fab = this.shadow.querySelector('#fab-btn');\n if (panel) {\n if (state.isExpanded) {\n panel.classList.remove('closed');\n } else {\n panel.classList.add('closed');\n }\n }\n if (fab) {\n fab.innerHTML = state.isExpanded\n ? `<span style=\"font-size:24px; font-weight:900;\">✕</span>`\n : A11Y_ICON_SVG(34);\n }\n\n // Tour / Attention Grabber\n const tourBubble = this.shadow.querySelector<HTMLElement>('#tour-bubble');\n const pingRing = this.shadow.querySelector<HTMLElement>('#ping-ring');\n if (tourBubble) tourBubble.style.display = state.showAttentionGrabber ? 'flex' : 'none';\n if (pingRing) pingRing.style.display = state.showAttentionGrabber ? 'block' : 'none';\n\n // Perfil Ativo\n const profileSelect = this.shadow.querySelector<HTMLSelectElement>('#profile-select');\n if (profileSelect && profileSelect.value !== state.activeProfile) {\n profileSelect.value = state.activeProfile;\n }\n\n // Renderizar Blocos Dinâmicos de Funcionalidades\n this.renderFeatureButtons(state);\n\n // Recalcular dimensões seguras do painel imediatamente\n this.updatePanelDimensions();\n }\n\n private onViewportChange = (): void => {\n if (this.resizeRafId) {\n cancelAnimationFrame(this.resizeRafId);\n }\n this.resizeRafId = requestAnimationFrame(() => {\n this.updatePanelDimensions();\n });\n };\n\n private updatePanelDimensions(): void {\n const panel = this.shadow.querySelector<HTMLElement>('#a11y-panel');\n const banner = this.shadow.querySelector<HTMLElement>('#a11y-top-banner');\n const root = this.shadow.querySelector<HTMLElement>('.a11y-widget-root');\n if (!panel || !root) return;\n\n // 1. Altura do banner superior (se visível e não dispensado)\n let bannerHeight = 0;\n const isBannerDismissed = this.store.getState().bannerDismissed;\n if (banner && !isBannerDismissed) {\n bannerHeight = banner.getBoundingClientRect().height || banner.offsetHeight || 0;\n }\n document.documentElement.style.setProperty('--a11y-top-banner-height', `${bannerHeight}px`);\n if (bannerHeight > 0) {\n document.body.classList.add('a11y-banner-active');\n } else {\n document.body.classList.remove('a11y-banner-active');\n }\n\n // 2. Detecção automática de cabeçalho / navbar fixo ou sticky no topo do site hospedeiro\n let hostHeaderBottom = 0;\n const customHeaderH = parseFloat(\n getComputedStyle(document.documentElement).getPropertyValue('--a11y-header-height') || '0'\n );\n if (customHeaderH > 0) {\n hostHeaderBottom = customHeaderH;\n } else {\n const candidates = document.querySelectorAll<HTMLElement>(\n 'header, nav, [role=\"banner\"], .header, .site-header, .navbar, .top-bar'\n );\n for (const el of candidates) {\n const style = window.getComputedStyle(el);\n if (style.position === 'fixed' || style.position === 'sticky') {\n const rect = el.getBoundingClientRect();\n if (rect.top <= 10 && rect.bottom > hostHeaderBottom && rect.bottom < window.innerHeight * 0.45) {\n hostHeaderBottom = rect.bottom;\n }\n }\n }\n }\n\n // 3. Altura ocupada pelo FAB e espaçamento inferior\n const rootRect = root.getBoundingClientRect();\n const bottomDist = Math.max(0, window.innerHeight - rootRect.bottom);\n const fabWrapper = this.shadow.querySelector<HTMLElement>('.a11y-fab-wrapper');\n const fabHeight = fabWrapper ? fabWrapper.offsetHeight : 56;\n const gap = 12; // gap entre o painel e o FAB\n\n // 4. Margem de segurança de respiro abaixo do banner/header (evita encostar ou passar por trás)\n const PANEL_TOP_MARGIN = 24;\n\n // 5. Obstáculo superior total: o maior entre banner e header + respiro\n const topObstacle = Math.max(bannerHeight, hostHeaderBottom);\n const totalTopReserved = topObstacle + PANEL_TOP_MARGIN;\n\n // 6. Max-height disponível para o painel respeitando a tela e o topo\n const availableHeight = window.innerHeight\n - totalTopReserved\n - bottomDist\n - fabHeight\n - gap;\n\n const finalMaxHeight = Math.max(160, Math.floor(availableHeight));\n\n panel.style.setProperty('--fab-panel-max-height', `${finalMaxHeight}px`);\n if (this.store.getState().isExpanded) {\n panel.style.maxHeight = `${finalMaxHeight}px`;\n } else {\n panel.style.maxHeight = '0px';\n }\n }\n\n private renderFeatureButtons(state: A11yState): void {\n const container = this.shadow.querySelector('#a11y-feature-container');\n if (!container) return;\n\n const p = state.activeProfile;\n let html = '';\n\n // AJUSTES VISUAIS\n if (['all', 'vision', 'cognitive'].includes(p)) {\n html += `<div class=\"a11y-section-title\">Ajustes Visuais</div>`;\n html += `\n <div class=\"a11y-scale-box\">\n <button id=\"btn-scale-down\" class=\"a11y-scale-btn\" aria-label=\"Diminuir texto\">A-</button>\n <span class=\"a11y-scale-val\">${Math.round(state.fontScale * 100)}%</span>\n <button id=\"btn-scale-up\" class=\"a11y-scale-btn\" aria-label=\"Aumentar texto\">A+</button>\n </div>\n `;\n html += `\n <button id=\"btn-contrast\" class=\"a11y-btn ${state.isHighContrast ? 'active' : ''}\">\n <span>${state.isHighContrast ? '☀️' : '👁️'}</span>\n <span>${state.isHighContrast ? 'Contraste Ativo' : 'Alto Contraste'}</span>\n </button>\n `;\n html += `\n <div style=\"display:flex; flex-direction:column; gap:4px; margin-top:4px;\">\n <button id=\"btn-mask\" class=\"a11y-btn ${state.isReadingMaskActive ? 'active' : ''}\">\n <span>${state.isReadingMaskActive ? '📖' : '📏'}</span>\n <span>${state.isReadingMaskActive ? 'Máscara Ativa' : 'Máscara de Leitura'}</span>\n </button>\n ${state.isReadingMaskActive ? `\n <div class=\"a11y-btn-group\" style=\"padding-left:4px;\">\n <button id=\"mask-mode-smart\" class=\"a11y-btn-mini ${state.isReadingMaskSmart ? 'active' : ''}\">🧠 Inteligente</button>\n <button id=\"mask-mode-free\" class=\"a11y-btn-mini ${!state.isReadingMaskSmart ? 'active' : ''}\">🆓 Livre</button>\n </div>\n ` : ''}\n </div>\n `;\n html += `\n <div style=\"display:flex; flex-direction:column; gap:4px; margin-top:4px;\">\n <label class=\"a11y-section-title\" style=\"margin:0;\">Filtros de Daltonismo</label>\n <select id=\"select-daltonism\" class=\"a11y-profile-select\">\n <option value=\"none\" ${state.colorBlindMode === 'none' ? 'selected' : ''}>Padrão (Desativado)</option>\n <option value=\"protanopia\" ${state.colorBlindMode === 'protanopia' ? 'selected' : ''}>Protanopia</option>\n <option value=\"deuteranopia\" ${state.colorBlindMode === 'deuteranopia' ? 'selected' : ''}>Deuteranopia</option>\n <option value=\"tritanopia\" ${state.colorBlindMode === 'tritanopia' ? 'selected' : ''}>Tritanopia</option>\n <option value=\"monochromacy\" ${state.colorBlindMode === 'monochromacy' ? 'selected' : ''}>Monocromia</option>\n </select>\n </div>\n `;\n }\n\n // AUDIÇÃO E LEITURA\n if (['all', 'hearing', 'cognitive'].includes(p)) {\n html += `<div class=\"a11y-section-title\">Audição e Leitura</div>`;\n html += `\n <div style=\"display:flex; flex-direction:column; gap:4px;\">\n <button id=\"btn-tts\" class=\"a11y-btn ${state.isTTSActive ? 'active' : ''}\">\n <span>${state.isTTSActive ? '🔊' : '🔈'}</span>\n <span>${state.isTTSActive ? 'Leitor Ativo (Clique no Texto)' : 'Leitor de Tela'}</span>\n </button>\n ${state.isTTSActive ? `\n <div class=\"a11y-btn-group\">\n <button id=\"tts-rate-05\" class=\"a11y-btn-mini ${state.ttsRate === 0.5 ? 'active' : ''}\">🐢 0.5x</button>\n <button id=\"tts-rate-1\" class=\"a11y-btn-mini ${state.ttsRate === 1 ? 'active' : ''}\">🚶 1.0x</button>\n <button id=\"tts-rate-15\" class=\"a11y-btn-mini ${state.ttsRate === 1.5 ? 'active' : ''}\">🐇 1.5x</button>\n </div>\n ` : ''}\n </div>\n `;\n html += `\n <button id=\"btn-vlibras\" class=\"a11y-btn ${state.isVLibrasActive ? 'active' : ''}\">\n <span>${state.isVLibrasActive ? '🤟' : '👐'}</span>\n <span>${state.isVLibrasActive ? 'LIBRAS Ativo' : 'Tradutor LIBRAS'}</span>\n </button>\n `;\n }\n\n // AJUSTES DE INTERAÇÃO\n if (['all', 'motor', 'vision'].includes(p)) {\n html += `<div class=\"a11y-section-title\">Interação e Mobilidade</div>`;\n html += `\n <button id=\"btn-big-cursor\" class=\"a11y-btn ${state.isBigCursor ? 'active' : ''}\">\n <span>${state.isBigCursor ? '↖️' : '🖱️'}</span>\n <span>${state.isBigCursor ? 'Ponteiro Gigante Ativo' : 'Ponteiro Gigante'}</span>\n </button>\n `;\n html += `\n <button id=\"btn-keyboard-focus\" class=\"a11y-btn ${state.isKeyboardFocus ? 'active' : ''}\">\n <span>${state.isKeyboardFocus ? '🎯' : '⌨️'}</span>\n <span>${state.isKeyboardFocus ? 'Foco Teclado Ativo' : 'Foco por Teclado'}</span>\n </button>\n `;\n html += `\n <button id=\"btn-scroll-assist\" class=\"a11y-btn ${state.isScrollAssistActive ? 'active' : ''}\">\n <span>${state.isScrollAssistActive ? '↕️' : '🖱️'}</span>\n <span>${state.isScrollAssistActive ? 'Rolagem Assistida Ativa' : 'Rolagem Assistida'}</span>\n </button>\n `;\n html += `\n <div style=\"display:flex; flex-direction:column; gap:4px;\">\n <button id=\"btn-cursor-magnet\" class=\"a11y-btn ${state.isCursorMagnetActive ? 'active' : ''}\">\n <span>🧲</span>\n <span>${state.isCursorMagnetActive ? 'Ímã de Cursor Ativo' : 'Ímã de Cursor'}</span>\n </button>\n ${state.isCursorMagnetActive ? `\n <div class=\"a11y-btn-group\">\n <button id=\"magnet-force-suave\" class=\"a11y-btn-mini ${state.cursorMagnetForce === 'suave' ? 'active' : ''}\">🪶 Suave</button>\n <button id=\"magnet-force-forte\" class=\"a11y-btn-mini ${state.cursorMagnetForce === 'forte' ? 'active' : ''}\">🧲 Forte</button>\n </div>\n ` : ''}\n </div>\n `;\n html += `\n <button id=\"btn-highlight-links\" class=\"a11y-btn ${state.isHighlightLinks ? 'active' : ''}\">\n <span>🔗</span>\n <span>${state.isHighlightLinks ? 'Links Destacados' : 'Destacar Links'}</span>\n </button>\n `;\n }\n\n // AJUSTES COGNITIVOS\n if (['all', 'cognitive'].includes(p)) {\n html += `<div class=\"a11y-section-title\">Ajustes Cognitivos</div>`;\n html += `\n <button id=\"btn-reduce-motion\" class=\"a11y-btn ${state.isReduceMotion ? 'active' : ''}\">\n <span>${state.isReduceMotion ? '⏸️' : '✨'}</span>\n <span>${state.isReduceMotion ? 'Animações Pausadas' : 'Pausar Animações'}</span>\n </button>\n `;\n html += `\n <button id=\"btn-dyslexia\" class=\"a11y-btn ${state.isDyslexiaMode ? 'active' : ''}\">\n <span>${state.isDyslexiaMode ? '📖' : '🅰️'}</span>\n <span>${state.isDyslexiaMode ? 'Fonte Dislexia Ativa' : 'Ajuste para Dislexia'}</span>\n </button>\n `;\n html += `\n <div style=\"display:flex; flex-direction:column; gap:4px;\">\n <label class=\"a11y-section-title\" style=\"margin:0;\">Espaçamento de Texto</label>\n <div class=\"a11y-btn-group\">\n <button id=\"spacing-0\" class=\"a11y-btn-mini ${state.textSpacingLevel === 0 ? 'active' : ''}\">Padrão</button>\n <button id=\"spacing-1\" class=\"a11y-btn-mini ${state.textSpacingLevel === 1 ? 'active' : ''}\">Espaçado</button>\n <button id=\"spacing-2\" class=\"a11y-btn-mini ${state.textSpacingLevel === 2 ? 'active' : ''}\">Largo</button>\n </div>\n </div>\n `;\n }\n\n container.innerHTML = html;\n this.bindFeatureButtons();\n }\n\n private bindFeatureButtons(): void {\n const bind = (id: string, fn: () => void) => {\n this.shadow.querySelector(`#${id}`)?.addEventListener('click', fn);\n };\n\n bind('btn-scale-down', () => this.store.updateFontScale(-0.1));\n bind('btn-scale-up', () => this.store.updateFontScale(0.1));\n bind('btn-contrast', () => this.store.toggleHighContrast());\n bind('btn-mask', () => this.store.toggleReadingMask());\n bind('mask-mode-smart', () => this.store.setReadingMaskSmart(true));\n bind('mask-mode-free', () => this.store.setReadingMaskSmart(false));\n bind('btn-tts', () => this.store.toggleTTS());\n bind('tts-rate-05', () => this.store.setTTSRate(0.5));\n bind('tts-rate-1', () => this.store.setTTSRate(1));\n bind('tts-rate-15', () => this.store.setTTSRate(1.5));\n bind('btn-vlibras', () => this.store.toggleVLibras());\n bind('btn-big-cursor', () => this.store.toggleBigCursor());\n bind('btn-keyboard-focus', () => this.store.toggleKeyboardFocus());\n bind('btn-scroll-assist', () => this.store.toggleScrollAssist());\n bind('btn-cursor-magnet', () => this.store.toggleCursorMagnet());\n bind('magnet-force-suave', () => this.store.setCursorMagnetForce('suave'));\n bind('magnet-force-forte', () => this.store.setCursorMagnetForce('forte'));\n bind('btn-highlight-links', () => this.store.toggleHighlightLinks());\n bind('btn-reduce-motion', () => this.store.toggleReduceMotion());\n bind('btn-dyslexia', () => this.store.toggleDyslexia());\n bind('spacing-0', () => this.store.setTextSpacing(0));\n bind('spacing-1', () => this.store.setTextSpacing(1));\n bind('spacing-2', () => this.store.setTextSpacing(2));\n\n this.shadow.querySelector('#select-daltonism')?.addEventListener('change', (e) => {\n const val = (e.target as HTMLSelectElement).value as DaltonismMode;\n this.store.setColorBlindMode(val);\n });\n }\n}\n","import { CognitvsA11yWidget } from './widget';\n\nexport { CognitvsA11yWidget };\nexport * from './types';\nexport * from './state/store';\n\n// Auto-registro do Custom Element\nif (typeof window !== 'undefined' && !customElements.get('cognitvs-a11y')) {\n customElements.define('cognitvs-a11y', CognitvsA11yWidget);\n}\n\nexport default CognitvsA11yWidget;\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).CognitvsA11yWidget={})}(this,function(t){"use strict";var e=Object.defineProperty,i=(t,i,s)=>((t,i,s)=>i in t?e(t,i,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[i]=s)(t,"symbol"!=typeof i?i+"":i,s);class s{constructor(t="cognitvs"){i(this,"prefix"),i(this,"state"),i(this,"listeners",new Set),this.prefix=t,this.state=this.loadInitialState()}getState(){return{...this.state}}subscribe(t){return this.listeners.add(t),t(this.getState()),()=>this.listeners.delete(t)}notify(){const t=this.getState();this.listeners.forEach(e=>e(t))}loadInitialState(){const t=t=>{try{return localStorage.getItem(`${this.prefix}_${t}`)}catch{return null}},e=parseFloat(t("font_scale")||"1")||1,i="true"===t("high_contrast"),s="true"===t("reduce_motion"),n="true"===t("big_cursor"),o="true"===t("keyboard_focus"),a="true"===t("highlight_links"),r="true"===t("reading_mask"),l="false"!==t("reading_mask_smart"),c="true"===t("dyslexia"),d=parseInt(t("text_spacing")||"0",10)||0,h=t("colorblind")||"none",u="true"===t("scroll_assist"),p="true"===t("magnet_cursor"),g=t("magnet_force")||"suave",b="true"===t("vlibras");return{isExpanded:!1,activeProfile:"all",fontScale:e,isHighContrast:i,isReadingMaskActive:r,isReadingMaskSmart:l,colorBlindMode:h,isDaltonismMenuOpen:!1,isTTSActive:"true"===t("tts"),ttsRate:parseFloat(t("tts_rate")||"1")||1,isVLibrasActive:b,isBigCursor:n,isKeyboardFocus:o,isScrollAssistActive:u,isCursorMagnetActive:p,cursorMagnetForce:g,isHighlightLinks:a,isReduceMotion:s,isDyslexiaMode:c,textSpacingLevel:d,showAttentionGrabber:!1,hasInteracted:"true"===t("seen_tour"),bannerDismissed:"true"===t("banner_dismissed")}}setStorage(t,e){try{localStorage.setItem(`${this.prefix}_${t}`,e)}catch(i){console.warn("A11yWidget: falha ao salvar no localStorage",i)}}removeStorage(t){try{localStorage.removeItem(`${this.prefix}_${t}`)}catch(e){console.warn("A11yWidget: falha ao remover do localStorage",e)}}update(t){this.state={...this.state,...t},this.notify()}toggleExpanded(){this.update({isExpanded:!this.state.isExpanded,showAttentionGrabber:!1,hasInteracted:!0}),this.setStorage("seen_tour","true")}setActiveProfile(t){this.update({activeProfile:t})}updateFontScale(t){const e=Math.min(Math.max(parseFloat((this.state.fontScale+t).toFixed(2)),.8),2);this.update({fontScale:e}),this.setStorage("font_scale",e.toString())}toggleHighContrast(){const t=!this.state.isHighContrast;this.update({isHighContrast:t}),this.setStorage("high_contrast",t.toString())}toggleReduceMotion(){const t=!this.state.isReduceMotion;this.update({isReduceMotion:t}),this.setStorage("reduce_motion",t.toString())}toggleBigCursor(){const t=!this.state.isBigCursor;this.update({isBigCursor:t}),this.setStorage("big_cursor",t.toString())}toggleKeyboardFocus(){const t=!this.state.isKeyboardFocus;this.update({isKeyboardFocus:t}),this.setStorage("keyboard_focus",t.toString())}toggleHighlightLinks(){const t=!this.state.isHighlightLinks;this.update({isHighlightLinks:t}),this.setStorage("highlight_links",t.toString())}toggleScrollAssist(){const t=!this.state.isScrollAssistActive;this.update({isScrollAssistActive:t}),this.setStorage("scroll_assist",t.toString())}toggleCursorMagnet(){const t=!this.state.isCursorMagnetActive;this.update({isCursorMagnetActive:t}),this.setStorage("magnet_cursor",t.toString())}setCursorMagnetForce(t){this.update({cursorMagnetForce:t}),this.setStorage("magnet_force",t)}toggleReadingMask(){const t=!this.state.isReadingMaskActive;this.update({isReadingMaskActive:t}),this.setStorage("reading_mask",t.toString())}setReadingMaskSmart(t){this.update({isReadingMaskSmart:t}),this.setStorage("reading_mask_smart",t.toString())}toggleDyslexia(){const t=!this.state.isDyslexiaMode;this.update({isDyslexiaMode:t}),this.setStorage("dyslexia",t.toString())}setTextSpacing(t){this.update({textSpacingLevel:t}),this.setStorage("text_spacing",t.toString())}setColorBlindMode(t){this.update({colorBlindMode:t,isDaltonismMenuOpen:!1}),this.setStorage("colorblind",t)}toggleDaltonismMenu(){this.update({isDaltonismMenuOpen:!this.state.isDaltonismMenuOpen})}toggleTTS(){const t=!this.state.isTTSActive,e=t?1:this.state.ttsRate;this.update({isTTSActive:t,ttsRate:e}),this.setStorage("tts",t.toString()),t&&this.setStorage("tts_rate","1")}setTTSRate(t){this.update({ttsRate:t}),this.setStorage("tts_rate",t.toString())}toggleVLibras(){const t=!this.state.isVLibrasActive;this.update({isVLibrasActive:t}),this.setStorage("vlibras",t.toString())}dismissBanner(){this.update({bannerDismissed:!0}),this.setStorage("banner_dismissed","true")}resetAll(){["font_scale","high_contrast","reduce_motion","big_cursor","keyboard_focus","highlight_links","reading_mask","reading_mask_smart","dyslexia","text_spacing","colorblind","vlibras","magnet_cursor","magnet_force","tts","tts_rate"].forEach(t=>this.removeStorage(t)),this.update({fontScale:1,isHighContrast:!1,isReadingMaskActive:!1,isReadingMaskSmart:!0,colorBlindMode:"none",isDaltonismMenuOpen:!1,isTTSActive:!1,ttsRate:1,isVLibrasActive:!1,isBigCursor:!1,isKeyboardFocus:!1,isScrollAssistActive:!1,isCursorMagnetActive:!1,cursorMagnetForce:"suave",isHighlightLinks:!1,isReduceMotion:!1,isDyslexiaMode:!1,textSpacingLevel:0})}}class n{constructor(){i(this,"prevClasses",new Set),i(this,"readingMaskEl",null),i(this,"maskFrameId",null),i(this,"boundMouseMove",null)}applyGlobalState(t){const e=document.documentElement;e.style.setProperty("--font-scale",t.fontScale.toString()),this.syncClass(e,"high-contrast",t.isHighContrast),this.syncClass(e,"reduce-motion",t.isReduceMotion),this.syncClass(e,"big-cursor",t.isBigCursor),this.syncClass(e,"keyboard-focus",t.isKeyboardFocus),this.syncClass(e,"highlight-links",t.isHighlightLinks),this.syncClass(e,"scroll-assist-active",t.isScrollAssistActive),this.syncClass(e,"cursor-magnet-active",t.isCursorMagnetActive),this.syncClass(e,"dyslexia-mode",t.isDyslexiaMode),e.setAttribute("data-magnet-force",t.cursorMagnetForce),e.classList.remove("text-spacing-1","text-spacing-2"),t.textSpacingLevel>0&&e.classList.add(`text-spacing-${t.textSpacingLevel}`),["protanopia","deuteranopia","tritanopia","monochromacy"].forEach(t=>{e.classList.remove(`daltonism-${t}`)}),"none"!==t.colorBlindMode&&e.classList.add(`daltonism-${t.colorBlindMode}`),this.syncReadingMask(t.isReadingMaskActive,t.isReadingMaskSmart)}syncClass(t,e,i){i?(t.classList.add(e),this.prevClasses.add(e)):(t.classList.remove(e),this.prevClasses.delete(e))}syncReadingMask(t,e){if(!t)return this.readingMaskEl&&(this.readingMaskEl.remove(),this.readingMaskEl=null),this.boundMouseMove&&(window.removeEventListener("mousemove",this.boundMouseMove),this.boundMouseMove=null),void(this.maskFrameId&&(cancelAnimationFrame(this.maskFrameId),this.maskFrameId=null));this.readingMaskEl||(this.readingMaskEl=document.createElement("div"),this.readingMaskEl.id="cognitvs-a11y-reading-mask",this.readingMaskEl.setAttribute("aria-hidden","true"),this.readingMaskEl.style.cssText="\n position: fixed;\n left: 0;\n width: 100vw;\n pointer-events: none;\n z-index: 999998;\n border-top: 2px solid rgba(0, 119, 212, 0.7);\n border-bottom: 2px solid rgba(0, 119, 212, 0.7);\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.7);\n height: var(--mask-height, 140px);\n top: var(--mask-top, calc(50vh - 70px));\n transition: top 0.15s cubic-bezier(0.2, 0, 0, 1), height 0.15s cubic-bezier(0.2, 0, 0, 1);\n ",document.body.appendChild(this.readingMaskEl));let i=null;this.boundMouseMove&&window.removeEventListener("mousemove",this.boundMouseMove),this.boundMouseMove=t=>{this.maskFrameId&&cancelAnimationFrame(this.maskFrameId),this.maskFrameId=requestAnimationFrame(()=>{if(e){const e=document.elementFromPoint(t.clientX,t.clientY);if(e){const t=e.closest("p, h1, h2, h3, h4, h5, h6, li, blockquote, figcaption, td, th, a, button, label"),s=t||e,n=s.getBoundingClientRect();if(t&&n.height>10&&n.height<500){if(s!==i){i=s;const t=24,e=n.height+t,o=n.top-t/2;document.documentElement.style.setProperty("--mask-height",`${e}px`),document.documentElement.style.setProperty("--mask-top",`${o}px`)}return}}}i=null,document.documentElement.style.setProperty("--mask-height","140px"),document.documentElement.style.setProperty("--mask-top",t.clientY-70+"px")})},window.addEventListener("mousemove",this.boundMouseMove,{passive:!0})}destroy(){const t=document.documentElement;this.prevClasses.forEach(e=>t.classList.remove(e)),["protanopia","deuteranopia","tritanopia","monochromacy","text-spacing-1","text-spacing-2"].forEach(e=>t.classList.remove(e)),t.style.removeProperty("--font-scale"),t.removeAttribute("data-magnet-force"),this.syncReadingMask(!1,!1)}}class o{constructor(t){i(this,"active",!1),i(this,"rate",1),i(this,"boundClickHandler",null),i(this,"isWidgetElement"),this.isWidgetElement=t}update(t,e){if(this.active=t,this.rate=e,!t)return"undefined"!=typeof window&&"speechSynthesis"in window&&window.speechSynthesis.cancel(),void(this.boundClickHandler&&(document.removeEventListener("click",this.boundClickHandler,{capture:!0}),this.boundClickHandler=null));this.boundClickHandler||(this.boundClickHandler=this.handleClick.bind(this),document.addEventListener("click",this.boundClickHandler,{capture:!0}))}handleClick(t){if(!this.active)return;const e=t.target;if(!e)return;if(this.isWidgetElement(e))return;if(["BODY","HTML","MAIN","SECTION","ARTICLE","HEADER","FOOTER","NAV","ASIDE","FORM","UL","OL","TABLE","TBODY","TR"].includes(e.tagName)||"root"===e.id)return;const i=["DIV","P","H1","H2","H3","H4","H5","H6","UL","OL","LI","SECTION","ARTICLE","IMG","PICTURE","VIDEO","HEADER","FOOTER","NAV","ASIDE","FORM","TABLE","TR","TD","TH","MAIN"];if(Array.from(e.children).some(t=>i.includes(t.tagName)))return;const s=(e.innerText||e.textContent||"").replace(/[\p{Extended_Pictographic}]/gu,"").trim();if(s.length>0&&"speechSynthesis"in window){(e.closest("a")||e.closest("button"))&&(t.preventDefault(),t.stopPropagation()),window.speechSynthesis.cancel();const i=new SpeechSynthesisUtterance(s);i.lang="pt-BR",i.rate=this.rate;const n=e.innerHTML,o=e.style.outline,a=e.style.outlineOffset,r=s.split(/(\s+)/);e.innerHTML="";const l=[];r.forEach(t=>{const i=document.createElement("span");i.textContent=t,i.style.transition="all 150ms ease-in-out",i.style.borderRadius="2px",e.appendChild(i),l.push(i)}),e.style.outline="3px solid #f59e0b",e.style.outlineOffset="2px",i.onboundary=t=>{if("word"===t.name){let e=0;for(let i=0;i<l.length;i++){const s=l[i].textContent||"",n=l[i];e<=t.charIndex&&e+s.length>t.charIndex&&s.trim().length>0?(n.style.backgroundColor="#fef08a",n.style.color="#0f172a",n.style.boxShadow="0 0 0 2px #fef08a"):(n.style.backgroundColor="transparent",n.style.color="inherit",n.style.boxShadow="0 0 0 2px transparent"),e+=s.length}}};const c=()=>{e.style.outline=o,e.style.outlineOffset=a,e.innerHTML=n};i.onend=c,i.onerror=c,window.speechSynthesis.speak(i)}}destroy(){this.boundClickHandler&&(document.removeEventListener("click",this.boundClickHandler,{capture:!0}),this.boundClickHandler=null),"undefined"!=typeof window&&"speechSynthesis"in window&&window.speechSynthesis.cancel()}}class a{constructor(){i(this,"active",!1),i(this,"force","suave"),i(this,"cursorEl",null),i(this,"isMagnetized",!1),i(this,"targetButton",null),i(this,"cachedButtons",[]),i(this,"lastCacheTime",0),i(this,"isBig",!1),i(this,"boundMouseMove",null),i(this,"boundClick",null),i(this,"boundScroll",null)}update(t,e,i){this.active=t,this.force=e,this.isBig=i,t?this.boundMouseMove||this.setup():this.teardown()}setup(){this.boundMouseMove=this.handleMouseMove.bind(this),this.boundClick=this.handleClick.bind(this),this.boundScroll=()=>{this.lastCacheTime=0},window.addEventListener("mousemove",this.boundMouseMove,{passive:!0}),window.addEventListener("click",this.boundClick,{capture:!0}),window.addEventListener("scroll",this.boundScroll,{passive:!0})}teardown(){this.boundMouseMove&&(window.removeEventListener("mousemove",this.boundMouseMove),this.boundMouseMove=null),this.boundClick&&(window.removeEventListener("click",this.boundClick,{capture:!0}),this.boundClick=null),this.boundScroll&&(window.removeEventListener("scroll",this.boundScroll),this.boundScroll=null),document.documentElement.classList.remove("cursor-hidden"),this.isMagnetized=!1,this.targetButton=null,this.cursorEl&&(this.cursorEl.remove(),this.cursorEl=null)}ensureCursorElement(){return this.cursorEl||(this.cursorEl=document.createElement("div"),this.cursorEl.id="cognitvs-a11y-virtual-cursor",this.cursorEl.setAttribute("aria-hidden","true"),this.cursorEl.style.cssText="\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n transition: transform 75ms ease;\n transform: translate(-5px, -5px);\n filter: drop-shadow(0 0 10px rgba(0, 119, 212, 0.9));\n ",document.body.appendChild(this.cursorEl)),this.cursorEl.innerHTML=this.isBig?'<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 32 32">\n <path fill="#ffffff" stroke="#0077d4" stroke-width="3" stroke-linejoin="round" d="M2 2 L2 28 L9 22 L15 31 L19 29 L12 20 L21 20 Z" />\n </svg>':'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 32 32">\n <path fill="#ffffff" stroke="#0077d4" stroke-width="2.5" stroke-linejoin="round" d="M2 2 L2 28 L9 22 L15 31 L19 29 L12 20 L21 20 Z" />\n </svg>',this.cursorEl}updateButtonCache(){const t=Date.now();if(t-this.lastCacheTime>200){const e=document.querySelectorAll('a, button, [role="button"], input[type="submit"], input[type="button"]');this.cachedButtons=Array.from(e).map(t=>({el:t,rect:t.getBoundingClientRect()})),this.lastCacheTime=t}}handleMouseMove(t){if(!this.active)return;const e="forte"===this.force?45:25,i="forte"===this.force?60:40;this.updateButtonCache();const s=t.clientX,n=t.clientY;let o=1/0,a={x:0,y:0},r=1/0,l=null,c={x:0,y:0};for(const{el:d}of this.cachedButtons){const t=d.getBoundingClientRect(),e=t.left+t.width/2,i=t.top+t.height/2,h=Math.max(t.left-s,0,s-t.right),u=Math.max(t.top-n,0,n-t.bottom),p=Math.sqrt(h*h+u*u);p<r&&(r=p,l=d,c={x:e,y:i}),d===this.targetButton&&(o=p,a={x:e,y:i})}this.isMagnetized&&this.targetButton?o>i?(this.isMagnetized=!1,this.targetButton=null,document.documentElement.classList.remove("cursor-hidden"),r<e&&l?(this.isMagnetized=!0,this.targetButton=l,this.setCursorPos(c.x,c.y),document.documentElement.classList.add("cursor-hidden")):this.hideVirtualCursor()):this.setCursorPos(a.x,a.y):r<e&&l?(this.isMagnetized=!0,this.targetButton=l,this.setCursorPos(c.x,c.y),document.documentElement.classList.add("cursor-hidden")):this.hideVirtualCursor()}setCursorPos(t,e){const i=this.ensureCursorElement();i.style.display="block",i.style.left=`${t}px`,i.style.top=`${e}px`}hideVirtualCursor(){this.cursorEl&&(this.cursorEl.style.display="none"),document.documentElement.classList.remove("cursor-hidden")}handleClick(t){this.active&&(this.lastCacheTime=0,this.isMagnetized&&this.targetButton&&(this.targetButton.contains(t.target)||(t.preventDefault(),t.stopPropagation(),this.targetButton.click())))}destroy(){this.teardown()}}class r{constructor(){i(this,"containerEl",null),i(this,"boundScroll",null)}update(t){t?(this.containerEl||this.setup(),this.checkScrollLimits()):this.teardown()}setup(){this.containerEl=document.createElement("div"),this.containerEl.id="cognitvs-a11y-scroll-assist",this.containerEl.setAttribute("aria-label","Assistente de Rolagem"),this.containerEl.style.cssText="\n position: fixed;\n bottom: 24px;\n left: 24px;\n z-index: 999990;\n display: flex;\n flex-direction: column;\n gap: 12px;\n pointer-events: auto;\n ";const t=document.createElement("button");t.id="cognitvs-scroll-up",t.setAttribute("aria-label","Rolar para cima"),t.title="Rolar para cima",t.innerHTML='\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">\n <polyline points="18 15 12 9 6 15"></polyline>\n </svg>\n ',this.styleButton(t,!1),t.onclick=()=>window.scrollBy({top:.7*-window.innerHeight,behavior:"smooth"});const e=document.createElement("button");e.id="cognitvs-scroll-down",e.setAttribute("aria-label","Rolar para baixo"),e.title="Rolar para baixo",e.innerHTML='\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">\n <polyline points="6 9 12 15 18 9"></polyline>\n </svg>\n ',this.styleButton(e,!0),e.onclick=()=>window.scrollBy({top:.7*window.innerHeight,behavior:"smooth"}),this.containerEl.appendChild(t),this.containerEl.appendChild(e),document.body.appendChild(this.containerEl),this.boundScroll=this.checkScrollLimits.bind(this),window.addEventListener("scroll",this.boundScroll,{passive:!0})}styleButton(t,e){t.style.cssText=`\n width: 52px;\n height: 52px;\n border-radius: 16px;\n border: 2px solid ${e?"#0077d4":"rgba(0, 119, 212, 0.4)"};\n background: ${e?"#0077d4":"#0f172a"};\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 10px 25px rgba(0, 0, 0, 0.35);\n backdrop-filter: blur(8px);\n transition: all 0.2s ease;\n font-weight: bold;\n `,t.onmouseenter=()=>{t.style.transform="scale(1.08)",t.style.background=e?"#0066b8":"#1e293b"},t.onmouseleave=()=>{t.style.transform="scale(1)",t.style.background=e?"#0077d4":"#0f172a"}}checkScrollLimits(){if(!this.containerEl)return;const t=window.scrollY<20,e=Math.ceil(window.innerHeight+window.scrollY)>=document.documentElement.scrollHeight-20,i=this.containerEl.querySelector("#cognitvs-scroll-up"),s=this.containerEl.querySelector("#cognitvs-scroll-down");i&&(i.style.opacity=t?"0.4":"1"),s&&(s.style.opacity=e?"0.4":"1")}teardown(){this.boundScroll&&(window.removeEventListener("scroll",this.boundScroll),this.boundScroll=null),this.containerEl&&(this.containerEl.remove(),this.containerEl=null)}destroy(){this.teardown()}}class l{constructor(){i(this,"active",!1),i(this,"scriptLoaded",!1)}update(t){this.active=t;const e=window;t?this.scriptLoaded&&"function"==typeof e.toggleVLibras?e.toggleVLibras(!0):this.loadVLibras():"function"==typeof e.toggleVLibras&&e.toggleVLibras(!1)}loadVLibras(){if(document.getElementById("vlibras-plugin-container"))return;const t=document.createElement("div");t.id="vlibras-plugin-container",t.innerHTML='\n <div vw class="enabled">\n <div vw-access-button class="active"></div>\n <div vw-plugin-wrapper>\n <div class="vw-plugin-top-wrapper"></div>\n </div>\n </div>\n ',document.body.appendChild(t);const e=document.createElement("script");e.id="vlibras-official-script",e.src="https://vlibras.gov.br/app/vlibras-plugin.js",e.async=!0,e.onload=()=>{this.scriptLoaded=!0;const t=window;t.VLibras&&t.VLibras.Widget&&new t.VLibras.Widget("https://vlibras.gov.br/app")},document.head.appendChild(e)}destroy(){this.active&&this.update(!1)}}const c=(t=32)=>`\n <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"\n width="${t}" height="${t}" viewBox="0 0 539.7 501.1" aria-hidden="true">\n \x3c!-- Estrutura principal (braços, pernas, arco superior/inferior, texto nós) --\x3e\n <path fill="currentColor" d="M268,276.6c-18.8,28.2-37,55.4-55.3,82.7c-14.9,22.3-29.7,44.6-44.8,66.8c-2.1,3-2.4,4.8,0.3,7.9\n c11.2,13,10.9,32.4-0.1,45.5c-11.3,13.4-30.3,16.7-45.3,7.9c-15-8.8-21.5-27-15.5-43.3c6-16.1,22.6-25.7,39.5-22.6\n c2.9,0.5,4.4,0.1,6.1-2.4c32.7-49.1,65.4-98.1,98.2-147.1c0.6-0.9,1.1-1.9,1.9-3.2c-9.2-1.1-18.1-1.8-26.9-3.2\n c-43.2-6.6-84.4-20-124.9-36c-13.8-5.4-27.3-11.4-40.9-17.3c-2.6-1.1-4.4-1-6.8,0.4c-15.2,8.8-34.2,5.3-45.2-8\n c-11-13.2-11-32.3-0.1-45.6c11-13.3,29.8-16.8,44.8-8.5c15.2,8.4,22.1,26.4,16.3,42.9c-0.9,2.7-1.3,4.1,2,5.5\n c45.8,19.7,92.3,37.1,141.3,47.4c38.9,8.2,77.4,6.5,116.1-0.9c48.7-9.3,95.8-24.1,142.4-40.8c3.9-1.4,3.7-2.5,1.9-5.8\n c-10.2-18.2-2.4-41.3,16.5-49.8c19-8.5,41.4,1.1,48.3,20.7c7,19.9-4.5,41.3-24.9,46.5c-5.9,1.5-11.9,1.6-17.8-0.2\n c-3.1-1-5.6-0.7-8.6,0.4c-48.2,18.1-97.1,33.8-147.7,43.8c-18.3,3.6-36.8,6.3-55.4,7.6c-0.9,1.9,0.7,2.8,1.5,3.9\n c32.8,49.2,65.7,98.3,98.4,147.5c1.8,2.7,3.3,3.2,6.4,2.4c17.2-4.2,34.2,4.3,41.2,20.2c7,15.9,1.5,34.5-13,44.1\n c-14.3,9.5-33.3,7.4-45.3-5c-12-12.4-13.4-31.6-3.1-45.9c1.3-1.9,2.8-3.1,0.9-5.9c-33.8-50.3-67.4-100.7-101.1-151.1\n C268.8,278.1,268.6,277.7,268,276.6z"/>\n \x3c!-- Arco superior --\x3e\n <path fill="currentColor" d="M268.9,0c94.9,3.7,167.9,44.9,217.2,126.7c2.1,3.6,1.5,5.1-2,6.5c-3.4,1.4-6.8,4.9-9.7,4.4\n c-3.1-0.5-4.1-5.6-6-8.7C376.9-21.2,158.6-20.3,68.3,130.7c-2.6,4.3-4.2,5.4-8.7,2.3c-8.6-5.8-9-5.7-3.3-14.3\n C101.9,48.4,166.3,8.8,250,1.1C256.3,0.5,262.6,0.3,268.9,0z"/>\n \x3c!-- Cabeça (anel externo) --\x3e\n <path fill="currentColor" d="M200.5,135.2c0.2-39,31.7-70.4,70.8-70.3c38.9,0.1,70.5,31.8,70.4,70.7c-0.1,39.1-31.8,70.7-71,70.5\n C231.8,206,200.3,174.2,200.5,135.2z M325.1,135.4c-0.1-29.9-24.3-54.1-54-54.1c-29.9,0-54.2,24.6-54.1,54.6\n c0.1,29.7,24.6,53.9,54.4,53.7C301.2,189.5,325.2,165.4,325.1,135.4z"/>\n \x3c!-- Arco lateral esquerdo --\x3e\n <path fill="currentColor" d="M35.1,255.4c2,61.5,23.9,114.7,66.9,158.9c3,3.1,3.4,4.6,0.1,7.7c-8.3,7.9-8.2,8.2-15.9-0.2\n C39,370.2,16.7,309.3,18.9,239.4c0.1-3.1,0.7-4.6,4.2-4.2c3.9,0.4,9.1-1.1,11.6,0.8c2.8,2.2,0.2,7.4,0.5,11.4\n C35.3,250.1,35.1,252.7,35.1,255.4z"/>\n \x3c!-- Arco lateral direito --\x3e\n <path fill="currentColor" d="M518.9,252.8c-1.4,66.4-24.6,123.9-70.4,172.2c-2.7,2.8-4.4,3.1-6.9,0.1c-2.4-2.9-7.5-4.8-7.5-8.1\n c0-2.7,4.3-5.4,6.8-8.1c43.4-48.2,63.8-104.7,61.2-169.5c-0.1-3.4,0.4-4.6,4.1-4.5c12.6,0.1,12.6,0,12.7,12.4\n C518.9,249.2,518.9,251,518.9,252.8z"/>\n \x3c!-- Arco inferior --\x3e\n <path fill="currentColor" d="M268.6,501.1c-28.7,0-56.6-4.9-83.7-14.3c-3.5-1.2-5-2.5-2.9-6.2c1.9-3.3,1.7-8.7,4.8-10\n c2.6-1.1,6.8,1.7,10.2,2.8c51.1,16,101.9,15.1,152.3-3.1c3.8-1.4,5.3-0.9,6.7,3c3.9,11,4.1,10.9-6.9,14.7\n C323.3,496.7,296.3,501.1,268.6,501.1z"/>\n \x3c!-- Nós de destaque (azul ciano — mantido como identidade visual do ícone) --\x3e\n <circle fill="#44A5DD" cx="398" cy="456.5" r="19.3"/>\n <circle fill="#44A5DD" cx="505.1" cy="181.9" r="19.3"/>\n <circle fill="#44A5DD" cx="140.6" cy="456.6" r="19.1"/>\n <circle fill="#44A5DD" cx="35.8" cy="181.8" r="19.2"/>\n \x3c!-- Cabeça (preenchimento interno azul) --\x3e\n <path fill="#44A5DD" d="M325.1,135.4c0.1,30-23.9,54.1-53.7,54.3c-29.8,0.1-54.3-24-54.4-53.7c-0.1-30,24.2-54.6,54.1-54.6\n C300.8,81.4,325,105.6,325.1,135.4z"/>\n </svg>\n`.trim();class d extends HTMLElement{constructor(){super(),i(this,"shadow"),i(this,"store"),i(this,"domEffects"),i(this,"tts"),i(this,"cursorMagnet"),i(this,"scrollAssist"),i(this,"vlibras"),i(this,"unsubscribe",null),i(this,"tourTimeoutId",null),i(this,"resizeRafId",null),i(this,"onViewportChange",()=>{this.resizeRafId&&cancelAnimationFrame(this.resizeRafId),this.resizeRafId=requestAnimationFrame(()=>{this.updatePanelDimensions()})}),this.shadow=this.attachShadow({mode:"open"});const t=this.getAttribute("storage-prefix")||"cognitvs";this.store=new s(t),this.domEffects=new n,this.tts=new o(t=>this.contains(t)||this.shadow.contains(t)),this.cursorMagnet=new a,this.scrollAssist=new r,this.vlibras=new l}static get observedAttributes(){return["theme","accent-color","position","storage-prefix","show-banner"]}attributeChangedCallback(t,e,i){e!==i&&"accent-color"===t&&i&&this.style.setProperty("--a11y-primary",i)}connectedCallback(){this.injectGlobalStyles(),this.renderInitialShadow(),window.addEventListener("resize",this.onViewportChange,{passive:!0}),window.addEventListener("scroll",this.onViewportChange,{passive:!0});this.store.getState().hasInteracted||(this.tourTimeoutId=window.setTimeout(()=>{this.store.getState().isExpanded||this.store.getState().hasInteracted||this.store.update({showAttentionGrabber:!0})},3500)),this.unsubscribe=this.store.subscribe(t=>{this.domEffects.applyGlobalState(t),this.tts.update(t.isTTSActive,t.ttsRate),this.cursorMagnet.update(t.isCursorMagnetActive,t.cursorMagnetForce,t.isBigCursor),this.scrollAssist.update(t.isScrollAssistActive),this.vlibras.update(t.isVLibrasActive),this.updateShadowUI(t)}),requestAnimationFrame(()=>this.updatePanelDimensions()),setTimeout(()=>this.updatePanelDimensions(),50),setTimeout(()=>this.updatePanelDimensions(),250)}disconnectedCallback(){window.removeEventListener("resize",this.onViewportChange),window.removeEventListener("scroll",this.onViewportChange),this.resizeRafId&&cancelAnimationFrame(this.resizeRafId),document.body.classList.remove("a11y-banner-active"),this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null),this.tourTimeoutId&&clearTimeout(this.tourTimeoutId),this.domEffects.destroy(),this.tts.destroy(),this.cursorMagnet.destroy(),this.scrollAssist.destroy(),this.vlibras.destroy()}injectGlobalStyles(){const t="cognitvs-a11y-global-styles";if(!document.getElementById(t)){const e=document.createElement("style");e.id=t,e.textContent='html.high-contrast{filter:contrast(160%)!important}html.high-contrast *{border-color:#facc15!important}html.reduce-motion *,html.reduce-motion *:before,html.reduce-motion *:after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}body{transition:padding-top .35s cubic-bezier(.16,1,.3,1)!important}body.a11y-banner-active{padding-top:var(--a11y-top-banner-height, 46px)!important}html.big-cursor,html.big-cursor *{cursor:url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 32 32"><path fill="%23ffffff" stroke="%230077d4" stroke-width="3" stroke-linejoin="round" d="M2 2 L2 28 L9 22 L15 31 L19 29 L12 20 L21 20 Z"/></svg>\'),auto!important}html.cursor-hidden,html.cursor-hidden *{cursor:none!important}html.keyboard-focus *:focus,html.keyboard-focus *:focus-visible{outline:4px solid #0077d4!important;outline-offset:3px!important}html.highlight-links a,html.highlight-links button,html.highlight-links [role=button],html.highlight-links input[type=submit],html.highlight-links input[type=button]{outline:2px dashed #0077d4!important;outline-offset:2px!important;background-color:#0077d41f!important}html.dyslexia-mode,html.dyslexia-mode *{font-family:Comic Sans MS,OpenDyslexic,Arial,sans-serif!important;letter-spacing:.08em!important;word-spacing:.16em!important;line-height:1.8!important}html.text-spacing-1 *{letter-spacing:.12em!important;word-spacing:.16em!important;line-height:1.8!important}html.text-spacing-2 *{letter-spacing:.2em!important;word-spacing:.28em!important;line-height:2.2!important}html.daltonism-protanopia{filter:url(\'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><filter id="f"><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></svg>#f\')!important}html.daltonism-deuteranopia{filter:url(\'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><filter id="f"><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></svg>#f\')!important}html.daltonism-tritanopia{filter:url(\'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><filter id="f"><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></svg>#f\')!important}html.daltonism-monochromacy{filter:grayscale(100%)!important}:root{--font-scale: 1}body{font-size:calc(1rem * var(--font-scale, 1))!important}',document.head.appendChild(e)}}renderInitialShadow(){const t="false"!==this.getAttribute("show-banner"),e=this.getAttribute("accent-color");e&&this.style.setProperty("--a11y-primary",e),this.shadow.innerHTML=`\n <style>:host{--a11y-primary: #0077d4;--a11y-primary-hover: #0066b8;--a11y-primary-light: #eff6ff;--a11y-bg: #ffffff;--a11y-text: #0f172a;--a11y-text-muted: #64748b;--a11y-border: #e2e8f0;--a11y-card-bg: #f8fafc;--a11y-card-hover: #f1f5f9;--a11y-shadow: 0 20px 40px -15px rgba(0, 0, 0, .25);--a11y-radius: 20px;font-family:Segoe UI,-apple-system,BlinkMacSystemFont,Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.5;box-sizing:border-box}:host([theme="dark"]){--a11y-bg: #0f172a;--a11y-text: #f8fafc;--a11y-text-muted: #94a3b8;--a11y-border: #1e293b;--a11y-card-bg: #1e293b;--a11y-card-hover: #334155;--a11y-shadow: 0 25px 50px -12px rgba(0, 0, 0, .6)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}.a11y-top-banner{position:fixed;top:0;left:0;width:100%;z-index:999995;background-color:#0b192c;color:#fff;border-bottom:2px solid var(--a11y-primary);box-shadow:0 10px 25px #0006;padding:10px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;font-size:14px;transition:opacity .35s cubic-bezier(.16,1,.3,1),transform .35s cubic-bezier(.16,1,.3,1)}.a11y-top-banner.hidden{opacity:0;pointer-events:none;transform:translateY(-100%)}.a11y-banner-content{display:flex;align-items:center;gap:12px}.a11y-banner-icon{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--a11y-primary)}.a11y-banner-icon svg{width:100%;height:100%}.a11y-banner-text strong{color:var(--a11y-cyan, #44a5dd)}.a11y-banner-close{background:#ffffff1a;border:none;color:#cbd5e1;width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;font-size:16px;font-weight:700}.a11y-banner-close:hover{background:#ef4444;color:#fff;transform:scale(1.1)}.a11y-widget-root{position:fixed;bottom:20px;right:20px;z-index:999990;display:flex;flex-direction:column;align-items:flex-end;gap:12px;max-width:calc(100vw - 32px);pointer-events:auto}:host([position="bottom-left"]) .a11y-widget-root{right:auto;left:20px;align-items:flex-start}.a11y-panel{background:var(--a11y-bg);color:var(--a11y-text);border:2px solid var(--a11y-primary);border-radius:var(--a11y-radius);box-shadow:var(--a11y-shadow);width:310px;max-height:var(--fab-panel-max-height, calc(100vh - 160px) );overflow-y:auto;overflow-x:hidden;padding:20px;transition:max-height .25s cubic-bezier(.16,1,.3,1),opacity .25s ease,transform .25s ease,padding .25s ease;display:flex;flex-direction:column;gap:18px}.a11y-panel.closed{max-height:0!important;padding-top:0!important;padding-bottom:0!important;border-width:0!important;opacity:0;pointer-events:none;transform:translateY(15px) scale(.95)}.a11y-panel-header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--a11y-border);padding-bottom:12px}.a11y-panel-title{font-size:12px;font-weight:900;letter-spacing:.1em;text-transform:uppercase;color:var(--a11y-primary);display:flex;align-items:center;gap:8px}.a11y-panel-title svg{color:var(--a11y-primary);flex-shrink:0}.a11y-profile-select{width:100%;padding:10px 12px;border-radius:12px;border:2px solid var(--a11y-border);background:var(--a11y-card-bg);color:var(--a11y-text);font-weight:700;font-size:13px;cursor:pointer;outline:none;transition:border-color .2s}.a11y-profile-select:focus{border-color:var(--a11y-primary)}.a11y-section-title{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--a11y-text-muted);margin-top:8px;margin-bottom:6px}.a11y-btn{width:100%;padding:12px 14px;border-radius:14px;font-size:13px;font-weight:800;cursor:pointer;border:2px solid transparent;background:var(--a11y-card-bg);color:var(--a11y-text);display:flex;align-items:center;justify-content:flex-start;gap:10px;transition:all .2s ease;-webkit-user-select:none;user-select:none}.a11y-btn:hover{background:var(--a11y-card-hover);border-color:#0077d44d}.a11y-btn.active{background:var(--a11y-primary);color:#fff;border-color:var(--a11y-primary);box-shadow:0 4px 14px #0077d459}.a11y-btn-group{display:flex;align-items:center;gap:6px}.a11y-btn-mini{flex:1;padding:8px;border-radius:10px;font-size:12px;font-weight:700;text-align:center;border:1px solid var(--a11y-border);background:var(--a11y-card-bg);color:var(--a11y-text);cursor:pointer;transition:all .15s}.a11y-btn-mini:hover{background:var(--a11y-card-hover)}.a11y-btn-mini.active{background:var(--a11y-primary);color:#fff;border-color:var(--a11y-primary)}.a11y-scale-box{display:flex;align-items:center;gap:8px;background:var(--a11y-card-bg);padding:6px;border-radius:14px;border:1px solid var(--a11y-border)}.a11y-scale-btn{flex:1;padding:8px 12px;font-size:15px;font-weight:900;background:var(--a11y-bg);border:1px solid var(--a11y-border);border-radius:10px;color:var(--a11y-primary);cursor:pointer;transition:all .2s}.a11y-scale-btn:hover{background:var(--a11y-primary);color:#fff}.a11y-scale-val{min-width:48px;text-align:center;font-weight:900;color:var(--a11y-text);font-size:14px}.a11y-reset-btn{background:transparent;border:none;color:var(--a11y-text-muted);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;text-decoration:underline;text-decoration-style:dashed;cursor:pointer;padding:8px 0;text-align:center;width:100%;margin-top:6px;transition:color .2s}.a11y-reset-btn:hover{color:#ef4444}.a11y-fab-wrapper{position:relative;display:flex;align-items:center;justify-content:flex-end}.a11y-fab{width:58px;height:58px;border-radius:50%;border:2px solid var(--a11y-primary);background:var(--a11y-primary);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 10px 25px #0077d473;transition:all .25s cubic-bezier(.175,.885,.32,1.275)}.a11y-fab:hover{transform:scale(1.1);box-shadow:0 15px 30px #0077d499}.a11y-fab:active{transform:scale(.95)}.a11y-fab svg{width:34px;height:34px;color:#fff;flex-shrink:0}.a11y-tour-bubble{position:absolute;right:74px;top:50%;transform:translateY(-50%);width:220px;background:#0f172a;border:2px solid var(--a11y-primary);color:#fff;padding:12px 14px;border-radius:16px;box-shadow:0 15px 35px #00000080;display:flex;align-items:center;gap:10px;cursor:pointer;animation:a11yFadeIn .3s ease-out;z-index:100}.a11y-tour-bubble:after{content:"";position:absolute;right:-8px;top:50%;transform:translateY(-50%);border-top:8px solid transparent;border-bottom:8px solid transparent;border-left:8px solid var(--a11y-primary)}.a11y-ping-ring{position:absolute;right:0;width:58px;height:58px;border-radius:50%;background-color:var(--a11y-primary);animation:a11yPing 2s cubic-bezier(0,0,.2,1) infinite;pointer-events:none;opacity:.6}@keyframes a11yPing{75%,to{transform:scale(1.7);opacity:0}}@keyframes a11yFadeIn{0%{opacity:0;transform:translateY(-50%) scale(.9)}to{opacity:1;transform:translateY(-50%) scale(1)}}</style>\n ${t?`\n <div id="a11y-top-banner" class="a11y-top-banner" role="banner">\n <div class="a11y-banner-content">\n <span class="a11y-banner-icon" aria-hidden="true">\n ${c(26)}\n </span>\n <p class="a11y-banner-text">\n <strong>Acessibilidade:</strong> Personalize sua navegação clicando no botão no canto da tela.\n </p>\n </div>\n <button id="banner-close-btn" class="a11y-banner-close" aria-label="Dispensar aviso de acessibilidade">✕</button>\n </div>\n `:""}\n\n <div class="a11y-widget-root">\n \x3c!-- Painel Expansível --\x3e\n <div id="a11y-panel" class="a11y-panel closed" role="region" aria-label="Painel de Ferramentas de Acessibilidade">\n <div class="a11y-panel-header">\n <div class="a11y-panel-title">\n ${c(18)}\n ACESSIBILIDADE\n </div>\n <button id="panel-close-btn" class="a11y-btn-mini" style="flex:0; width:28px; padding:4px;" aria-label="Fechar painel">✕</button>\n </div>\n\n <div>\n <label class="a11y-section-title" for="profile-select">Perfil Assistivo</label>\n <select id="profile-select" class="a11y-profile-select">\n <option value="all">Ver Todos os Recursos</option>\n <option value="vision">👁️ Visão Reduzida</option>\n <option value="hearing">🧏 Audição / Surdez</option>\n <option value="motor">🎯 Dificuldade Motora</option>\n <option value="cognitive">🧠 TDAH e Foco</option>\n </select>\n </div>\n\n <div id="a11y-feature-container"></div>\n\n <button id="reset-btn" class="a11y-reset-btn">Resetar Preferências</button>\n </div>\n\n \x3c!-- Botão Flutuante e Dica --\x3e\n <div class="a11y-fab-wrapper">\n <div id="tour-bubble" class="a11y-tour-bubble" style="display: none;">\n <span style="font-size: 20px;">👋</span>\n <p style="font-size: 11px; font-weight: bold; line-height: 1.3;">Dificuldade para navegar? Clique aqui!</p>\n </div>\n <div id="ping-ring" class="a11y-ping-ring" style="display: none;"></div>\n\n <button id="fab-btn" class="a11y-fab" aria-label="Abrir recursos de acessibilidade" aria-haspopup="true">\n ${c(34)}\n </button>\n </div>\n </div>\n `,this.bindEvents()}bindEvents(){const t=this.shadow.querySelector("#fab-btn"),e=this.shadow.querySelector("#panel-close-btn"),i=this.shadow.querySelector("#banner-close-btn"),s=this.shadow.querySelector("#tour-bubble"),n=this.shadow.querySelector("#reset-btn"),o=this.shadow.querySelector("#profile-select");null==t||t.addEventListener("click",()=>this.store.toggleExpanded()),null==e||e.addEventListener("click",()=>this.store.toggleExpanded()),null==s||s.addEventListener("click",()=>this.store.toggleExpanded()),null==i||i.addEventListener("click",()=>this.store.dismissBanner()),null==n||n.addEventListener("click",()=>this.store.resetAll()),null==o||o.addEventListener("change",t=>{const e=t.target.value;this.store.setActiveProfile(e)})}updateShadowUI(t){const e=this.shadow.querySelector("#a11y-top-banner");e&&(t.bannerDismissed?(e.classList.add("hidden"),document.body.classList.remove("a11y-banner-active"),document.documentElement.style.setProperty("--a11y-top-banner-height","0px")):(e.classList.remove("hidden"),document.body.classList.add("a11y-banner-active")));const i=this.shadow.querySelector("#a11y-panel"),s=this.shadow.querySelector("#fab-btn");i&&(t.isExpanded?i.classList.remove("closed"):i.classList.add("closed")),s&&(s.innerHTML=t.isExpanded?'<span style="font-size:24px; font-weight:900;">✕</span>':c(34));const n=this.shadow.querySelector("#tour-bubble"),o=this.shadow.querySelector("#ping-ring");n&&(n.style.display=t.showAttentionGrabber?"flex":"none"),o&&(o.style.display=t.showAttentionGrabber?"block":"none");const a=this.shadow.querySelector("#profile-select");a&&a.value!==t.activeProfile&&(a.value=t.activeProfile),this.renderFeatureButtons(t),this.updatePanelDimensions()}updatePanelDimensions(){const t=this.shadow.querySelector("#a11y-panel"),e=this.shadow.querySelector("#a11y-top-banner"),i=this.shadow.querySelector(".a11y-widget-root");if(!t||!i)return;let s=0;const n=this.store.getState().bannerDismissed;e&&!n&&(s=e.getBoundingClientRect().height||e.offsetHeight||0),document.documentElement.style.setProperty("--a11y-top-banner-height",`${s}px`),s>0?document.body.classList.add("a11y-banner-active"):document.body.classList.remove("a11y-banner-active");let o=0;const a=parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--a11y-header-height")||"0");if(a>0)o=a;else{const t=document.querySelectorAll('header, nav, [role="banner"], .header, .site-header, .navbar, .top-bar');for(const e of t){const t=window.getComputedStyle(e);if("fixed"===t.position||"sticky"===t.position){const t=e.getBoundingClientRect();t.top<=10&&t.bottom>o&&t.bottom<.45*window.innerHeight&&(o=t.bottom)}}}const r=i.getBoundingClientRect(),l=Math.max(0,window.innerHeight-r.bottom),c=this.shadow.querySelector(".a11y-fab-wrapper"),d=c?c.offsetHeight:56,h=Math.max(s,o)+24,u=window.innerHeight-h-l-d-12,p=Math.max(160,Math.floor(u));t.style.setProperty("--fab-panel-max-height",`${p}px`),this.store.getState().isExpanded?t.style.maxHeight=`${p}px`:t.style.maxHeight="0px"}renderFeatureButtons(t){const e=this.shadow.querySelector("#a11y-feature-container");if(!e)return;const i=t.activeProfile;let s="";["all","vision","cognitive"].includes(i)&&(s+='<div class="a11y-section-title">Ajustes Visuais</div>',s+=`\n <div class="a11y-scale-box">\n <button id="btn-scale-down" class="a11y-scale-btn" aria-label="Diminuir texto">A-</button>\n <span class="a11y-scale-val">${Math.round(100*t.fontScale)}%</span>\n <button id="btn-scale-up" class="a11y-scale-btn" aria-label="Aumentar texto">A+</button>\n </div>\n `,s+=`\n <button id="btn-contrast" class="a11y-btn ${t.isHighContrast?"active":""}">\n <span>${t.isHighContrast?"☀️":"👁️"}</span>\n <span>${t.isHighContrast?"Contraste Ativo":"Alto Contraste"}</span>\n </button>\n `,s+=`\n <div style="display:flex; flex-direction:column; gap:4px; margin-top:4px;">\n <button id="btn-mask" class="a11y-btn ${t.isReadingMaskActive?"active":""}">\n <span>${t.isReadingMaskActive?"📖":"📏"}</span>\n <span>${t.isReadingMaskActive?"Máscara Ativa":"Máscara de Leitura"}</span>\n </button>\n ${t.isReadingMaskActive?`\n <div class="a11y-btn-group" style="padding-left:4px;">\n <button id="mask-mode-smart" class="a11y-btn-mini ${t.isReadingMaskSmart?"active":""}">🧠 Inteligente</button>\n <button id="mask-mode-free" class="a11y-btn-mini ${t.isReadingMaskSmart?"":"active"}">🆓 Livre</button>\n </div>\n `:""}\n </div>\n `,s+=`\n <div style="display:flex; flex-direction:column; gap:4px; margin-top:4px;">\n <label class="a11y-section-title" style="margin:0;">Filtros de Daltonismo</label>\n <select id="select-daltonism" class="a11y-profile-select">\n <option value="none" ${"none"===t.colorBlindMode?"selected":""}>Padrão (Desativado)</option>\n <option value="protanopia" ${"protanopia"===t.colorBlindMode?"selected":""}>Protanopia</option>\n <option value="deuteranopia" ${"deuteranopia"===t.colorBlindMode?"selected":""}>Deuteranopia</option>\n <option value="tritanopia" ${"tritanopia"===t.colorBlindMode?"selected":""}>Tritanopia</option>\n <option value="monochromacy" ${"monochromacy"===t.colorBlindMode?"selected":""}>Monocromia</option>\n </select>\n </div>\n `),["all","hearing","cognitive"].includes(i)&&(s+='<div class="a11y-section-title">Audição e Leitura</div>',s+=`\n <div style="display:flex; flex-direction:column; gap:4px;">\n <button id="btn-tts" class="a11y-btn ${t.isTTSActive?"active":""}">\n <span>${t.isTTSActive?"🔊":"🔈"}</span>\n <span>${t.isTTSActive?"Leitor Ativo (Clique no Texto)":"Leitor de Tela"}</span>\n </button>\n ${t.isTTSActive?`\n <div class="a11y-btn-group">\n <button id="tts-rate-05" class="a11y-btn-mini ${.5===t.ttsRate?"active":""}">🐢 0.5x</button>\n <button id="tts-rate-1" class="a11y-btn-mini ${1===t.ttsRate?"active":""}">🚶 1.0x</button>\n <button id="tts-rate-15" class="a11y-btn-mini ${1.5===t.ttsRate?"active":""}">🐇 1.5x</button>\n </div>\n `:""}\n </div>\n `,s+=`\n <button id="btn-vlibras" class="a11y-btn ${t.isVLibrasActive?"active":""}">\n <span>${t.isVLibrasActive?"🤟":"👐"}</span>\n <span>${t.isVLibrasActive?"LIBRAS Ativo":"Tradutor LIBRAS"}</span>\n </button>\n `),["all","motor","vision"].includes(i)&&(s+='<div class="a11y-section-title">Interação e Mobilidade</div>',s+=`\n <button id="btn-big-cursor" class="a11y-btn ${t.isBigCursor?"active":""}">\n <span>${t.isBigCursor?"↖️":"🖱️"}</span>\n <span>${t.isBigCursor?"Ponteiro Gigante Ativo":"Ponteiro Gigante"}</span>\n </button>\n `,s+=`\n <button id="btn-keyboard-focus" class="a11y-btn ${t.isKeyboardFocus?"active":""}">\n <span>${t.isKeyboardFocus?"🎯":"⌨️"}</span>\n <span>${t.isKeyboardFocus?"Foco Teclado Ativo":"Foco por Teclado"}</span>\n </button>\n `,s+=`\n <button id="btn-scroll-assist" class="a11y-btn ${t.isScrollAssistActive?"active":""}">\n <span>${t.isScrollAssistActive?"↕️":"🖱️"}</span>\n <span>${t.isScrollAssistActive?"Rolagem Assistida Ativa":"Rolagem Assistida"}</span>\n </button>\n `,s+=`\n <div style="display:flex; flex-direction:column; gap:4px;">\n <button id="btn-cursor-magnet" class="a11y-btn ${t.isCursorMagnetActive?"active":""}">\n <span>🧲</span>\n <span>${t.isCursorMagnetActive?"Ímã de Cursor Ativo":"Ímã de Cursor"}</span>\n </button>\n ${t.isCursorMagnetActive?`\n <div class="a11y-btn-group">\n <button id="magnet-force-suave" class="a11y-btn-mini ${"suave"===t.cursorMagnetForce?"active":""}">🪶 Suave</button>\n <button id="magnet-force-forte" class="a11y-btn-mini ${"forte"===t.cursorMagnetForce?"active":""}">🧲 Forte</button>\n </div>\n `:""}\n </div>\n `,s+=`\n <button id="btn-highlight-links" class="a11y-btn ${t.isHighlightLinks?"active":""}">\n <span>🔗</span>\n <span>${t.isHighlightLinks?"Links Destacados":"Destacar Links"}</span>\n </button>\n `),["all","cognitive"].includes(i)&&(s+='<div class="a11y-section-title">Ajustes Cognitivos</div>',s+=`\n <button id="btn-reduce-motion" class="a11y-btn ${t.isReduceMotion?"active":""}">\n <span>${t.isReduceMotion?"⏸️":"✨"}</span>\n <span>${t.isReduceMotion?"Animações Pausadas":"Pausar Animações"}</span>\n </button>\n `,s+=`\n <button id="btn-dyslexia" class="a11y-btn ${t.isDyslexiaMode?"active":""}">\n <span>${t.isDyslexiaMode?"📖":"🅰️"}</span>\n <span>${t.isDyslexiaMode?"Fonte Dislexia Ativa":"Ajuste para Dislexia"}</span>\n </button>\n `,s+=`\n <div style="display:flex; flex-direction:column; gap:4px;">\n <label class="a11y-section-title" style="margin:0;">Espaçamento de Texto</label>\n <div class="a11y-btn-group">\n <button id="spacing-0" class="a11y-btn-mini ${0===t.textSpacingLevel?"active":""}">Padrão</button>\n <button id="spacing-1" class="a11y-btn-mini ${1===t.textSpacingLevel?"active":""}">Espaçado</button>\n <button id="spacing-2" class="a11y-btn-mini ${2===t.textSpacingLevel?"active":""}">Largo</button>\n </div>\n </div>\n `),e.innerHTML=s,this.bindFeatureButtons()}bindFeatureButtons(){var t;const e=(t,e)=>{var i;null==(i=this.shadow.querySelector(`#${t}`))||i.addEventListener("click",e)};e("btn-scale-down",()=>this.store.updateFontScale(-.1)),e("btn-scale-up",()=>this.store.updateFontScale(.1)),e("btn-contrast",()=>this.store.toggleHighContrast()),e("btn-mask",()=>this.store.toggleReadingMask()),e("mask-mode-smart",()=>this.store.setReadingMaskSmart(!0)),e("mask-mode-free",()=>this.store.setReadingMaskSmart(!1)),e("btn-tts",()=>this.store.toggleTTS()),e("tts-rate-05",()=>this.store.setTTSRate(.5)),e("tts-rate-1",()=>this.store.setTTSRate(1)),e("tts-rate-15",()=>this.store.setTTSRate(1.5)),e("btn-vlibras",()=>this.store.toggleVLibras()),e("btn-big-cursor",()=>this.store.toggleBigCursor()),e("btn-keyboard-focus",()=>this.store.toggleKeyboardFocus()),e("btn-scroll-assist",()=>this.store.toggleScrollAssist()),e("btn-cursor-magnet",()=>this.store.toggleCursorMagnet()),e("magnet-force-suave",()=>this.store.setCursorMagnetForce("suave")),e("magnet-force-forte",()=>this.store.setCursorMagnetForce("forte")),e("btn-highlight-links",()=>this.store.toggleHighlightLinks()),e("btn-reduce-motion",()=>this.store.toggleReduceMotion()),e("btn-dyslexia",()=>this.store.toggleDyslexia()),e("spacing-0",()=>this.store.setTextSpacing(0)),e("spacing-1",()=>this.store.setTextSpacing(1)),e("spacing-2",()=>this.store.setTextSpacing(2)),null==(t=this.shadow.querySelector("#select-daltonism"))||t.addEventListener("change",t=>{const e=t.target.value;this.store.setColorBlindMode(e)})}}"undefined"==typeof window||customElements.get("cognitvs-a11y")||customElements.define("cognitvs-a11y",d),t.A11yStore=s,t.CognitvsA11yWidget=d,t.default=d,Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
2
|
+
//# sourceMappingURL=a11y-widget.umd.cjs.map
|