{"version":3,"sources":["../src/components/AccessibilityWidget/fabPositioning.ts","../src/components/AccessibilityWidget/AccessibilityFab.tsx","../src/components/AccessibilityWidget/AccessibilityPanel.tsx","../src/components/AccessibilityWidget/AccessibilityToggleRow.tsx","../src/components/AccessibilityWidget/TTSSection.tsx","../src/components/AccessibilityWidget/LibrasFab.tsx","../src/components/AccessibilityWidget/ReadingAid.tsx","../src/components/AccessibilityWidget/ColorBlindFilters.tsx","../src/components/AccessibilityWidget/TTSController.tsx","../src/components/AccessibilityWidget/VLibrasLoader.tsx","../src/components/AccessibilityWidget/AccessibilityWidget.tsx"],"sourcesContent":["/**\n * Constantes de posicionamento compartilhadas entre os FABs do widget\n * (`AccessibilityFab` e `LibrasFab`). Centralizadas aqui para evitar\n * que mudanças de gap/lateral precisem ser replicadas em cada FAB.\n */\n\nexport type FabPosition = 'right' | 'left';\n\n/**\n * Alinhamento vertical do FAB. Quando o widget renderiza só um botão\n * (sem Libras), `center` deixa-o no meio da viewport. Quando há também\n * o LibrasFab empilhado abaixo, o de acessibilidade fica `above-center`\n * e o Libras fica `below-center` — formando um par grudado no meio.\n */\nexport type FabVerticalAlign = 'center' | 'above-center' | 'below-center';\n\nexport const FAB_POSITION_CLASSES: Record<FabPosition, string> = {\n  right: 'right-0 rounded-l-lg',\n  left: 'left-0 rounded-r-lg',\n};\n\nexport const FAB_VERTICAL_ALIGN_CLASSES: Record<FabVerticalAlign, string> = {\n  center: 'top-1/2 -translate-y-1/2',\n  // Pares empilhados (acessibilidade + Libras) com gap mínimo entre si,\n  // como no widget do HandTalk. Cada FAB tem 40px (h-10).\n  'above-center': 'top-[calc(50%-1px)] -translate-y-full',\n  'below-center': 'top-[calc(50%+1px)]',\n};\n\n/** Tooltip aparece do lado oposto à borda em que o FAB está colado. */\nexport const FAB_TOOLTIP_POSITION: Record<FabPosition, 'left' | 'right'> = {\n  right: 'left',\n  left: 'right',\n};\n","import Button from '../Button/Button';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { cn } from '../../utils/utils';\nimport accessibilityIcon from '../../assets/img/accessibility.png';\nimport {\n  FAB_POSITION_CLASSES,\n  FAB_TOOLTIP_POSITION,\n  FAB_VERTICAL_ALIGN_CLASSES,\n  type FabPosition,\n  type FabVerticalAlign,\n} from './fabPositioning';\n\n/** Re-exports mantidos para compatibilidade com a API pública do widget. */\nexport type AccessibilityFabPosition = FabPosition;\nexport type AccessibilityFabVerticalAlign = FabVerticalAlign;\n\nexport interface AccessibilityFabProps {\n  /** Click handler — alterna o painel */\n  onClick: () => void;\n  /** Indica se o painel está aberto (controla aria-expanded) */\n  isOpen?: boolean;\n  /** Lado da viewport onde o botão fica colado */\n  position?: AccessibilityFabPosition;\n  /** Alinhamento vertical (default: `center`) */\n  verticalAlign?: AccessibilityFabVerticalAlign;\n  /** Classes extras */\n  className?: string;\n}\n\n/**\n * Botão flutuante (FAB) que abre o painel de acessibilidade.\n * Inspirado no padrão HandTalk: quadrado azul escuro colado na\n * lateral da viewport (direita por padrão), com o ícone universal\n * de acessibilidade. Verticalmente centralizado.\n */\nexport default function AccessibilityFab({\n  onClick,\n  isOpen = false,\n  position = 'right',\n  verticalAlign = 'center',\n  className,\n}: Readonly<AccessibilityFabProps>) {\n  const label = isOpen\n    ? 'Fechar opções de acessibilidade'\n    : 'Opções de acessibilidade';\n\n  return (\n    <Tooltip\n      content={label}\n      position={FAB_TOOLTIP_POSITION[position]}\n      className={cn(\n        'fixed z-40',\n        FAB_VERTICAL_ALIGN_CLASSES[verticalAlign],\n        FAB_POSITION_CLASSES[position]\n      )}\n    >\n      <Button\n        variant=\"raw\"\n        onClick={onClick}\n        aria-label={label}\n        aria-expanded={isOpen}\n        data-testid=\"accessibility-fab\"\n        className={cn(\n          'a11y-widget-shield',\n          FAB_POSITION_CLASSES[position],\n          'flex h-10 w-10 cursor-pointer items-center justify-center',\n          // `text-text-50` flipa junto com `bg-info-900` (claro no light,\n          // escuro no dark). `text-white` deixaria o ícone branco sumindo\n          // no tema escuro, onde `bg-info-900` resolve pra azul-claro.\n          'bg-info-900 text-text-50 shadow-lg',\n          'transition-all duration-200 hover:scale-110 hover:bg-info-800',\n          'focus:outline-none focus:ring-4 focus:ring-info-300',\n          className\n        )}\n      >\n        <img\n          src={accessibilityIcon}\n          alt=\"\"\n          aria-hidden=\"true\"\n          className=\"h-7 w-7\"\n        />\n      </Button>\n    </Tooltip>\n  );\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport {\n  ArrowCounterClockwiseIcon,\n  CaretDownIcon,\n  EyeIcon,\n  FilmReelIcon,\n  KeyboardIcon,\n  NavigationArrowIcon,\n  SpeakerHighIcon,\n  TextTIcon,\n  XIcon,\n} from '@phosphor-icons/react';\nimport accessibilityIcon from '../../assets/img/accessibility.png';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport IconButton from '../IconButton/IconButton';\nimport AccessibilityToggleRow from './AccessibilityToggleRow';\nimport TTSSection from './TTSSection';\nimport { cn } from '../../utils/utils';\nimport {\n  useAccessibilityStore,\n  type ContrastMode,\n  type SaturationMode,\n  type ReadingAid,\n} from '../../store/accessibilityStore';\nimport type { AccessibilityFabPosition } from './AccessibilityFab';\n\nconst CONTRAST_OPTIONS: { value: ContrastMode; label: string }[] = [\n  { value: 'normal', label: 'Normal' },\n  { value: 'high', label: 'Alto' },\n  { value: 'inverted', label: 'Invertido' },\n];\n\nconst SATURATION_OPTIONS: { value: SaturationMode; label: string }[] = [\n  { value: 'normal', label: 'Normal' },\n  { value: 'low', label: 'Baixa' },\n  { value: 'grayscale', label: 'Tons de cinza' },\n];\n\nconst READING_AID_OPTIONS: { value: ReadingAid; label: string }[] = [\n  { value: 'none', label: 'Nenhum' },\n  { value: 'ruler', label: 'Régua' },\n  { value: 'mask', label: 'Máscara' },\n];\n\nconst LEVEL_LABELS = ['Padrão', 'Pequeno', 'Médio', 'Grande'] as const;\n\n/** Tamanho de fonte do preview \"Aa\" em cada botão (Padrão → Grande). */\nconst FONT_SIZE_PREVIEW_CLASSES = [\n  'text-base', // Padrão\n  'text-lg', // Pequeno (= maior que Padrão, segue a escala incremental do widget)\n  'text-2xl', // Médio\n  'text-4xl', // Grande\n] as const;\n\n/** Letter-spacing do preview \"Aa\" em cada botão. */\nconst LETTER_SPACING_PREVIEW_CLASSES = [\n  'tracking-tighter', // Padrão (junto)\n  'tracking-normal',\n  'tracking-wider',\n  'tracking-widest',\n] as const;\n\n/** Gap vertical entre as 3 barras do preview de espaçamento entre linhas. */\nconst LINE_SPACING_PREVIEW_GAPS = [\n  'gap-0.5', // Padrão (2px) — linhas próximas\n  'gap-1.5', // Pequeno (6px)\n  'gap-2.5', // Médio (10px)\n  'gap-3.5', // Grande (14px)\n] as const;\n\n/**\n * `<dialog open>` aplica `left: 0; right: 0` como user-agent style. Sem\n * resetar o lado oposto para `auto`, o painel acaba grudando no lado\n * errado mesmo com `right-6` ou `left-6` aplicado.\n */\nconst PANEL_EDGE_CLASSES: Record<AccessibilityFabPosition, string> = {\n  right: 'right-10 left-auto',\n  left: 'left-10 right-auto',\n};\n\ninterface AccordionSectionProps {\n  title: string;\n  icon: ReactNode;\n  defaultExpanded?: boolean;\n  testId?: string;\n  children: ReactNode;\n}\n\n/**\n * Item de accordion estilo lista (sem cantos arredondados nem card),\n * com ícone + título à esquerda e caret à direita. Cada item separado\n * do próximo por uma linha fina. Mantém a estrutura visual do design\n * do Figma sem usar o `CardAccordation` da lib (que tem visual de card).\n */\nconst AccordionSection = ({\n  title,\n  icon,\n  defaultExpanded = false,\n  testId,\n  children,\n}: Readonly<AccordionSectionProps>) => {\n  const [expanded, setExpanded] = useState(defaultExpanded);\n  return (\n    <section className=\"border-b border-background-200 last:border-b-0\">\n      <Button\n        variant=\"raw\"\n        aria-expanded={expanded}\n        onClick={() => setExpanded((v) => !v)}\n        data-testid={testId}\n        className={cn(\n          'flex w-full cursor-pointer items-center justify-between gap-2 px-4 py-3',\n          'text-left transition-colors hover:bg-background-50',\n          'focus:outline-none focus-visible:ring-2 focus-visible:ring-info-500 focus-visible:ring-inset'\n        )}\n      >\n        <span className=\"flex items-center gap-2\">\n          <span className=\"text-text-800\" aria-hidden=\"true\">\n            {icon}\n          </span>\n          <Text\n            size=\"md\"\n            weight=\"semibold\"\n            className=\"leading-none text-text-800\"\n          >\n            {title}\n          </Text>\n        </span>\n        <CaretDownIcon\n          size={16}\n          weight=\"bold\"\n          aria-hidden=\"true\"\n          className={cn(\n            'text-text-700 transition-transform duration-200',\n            expanded ? 'rotate-180' : 'rotate-0'\n          )}\n        />\n      </Button>\n      {expanded && (\n        <div className=\"flex flex-col gap-6 px-4 pb-4 pt-2\">{children}</div>\n      )}\n    </section>\n  );\n};\n\ninterface SubControlProps {\n  label: string;\n  children: ReactNode;\n}\n\n/**\n * Wrapper para uma control (segmented/toggle) com título dentro do\n * accordion. Tipografia do label segue o Figma: Roboto 12px/500/100%\n * uppercase, cor `text-text-600` (#737373).\n */\nconst SubControl = ({ label, children }: Readonly<SubControlProps>) => (\n  <div className=\"flex flex-col gap-2\">\n    <Text\n      size=\"xs\"\n      weight=\"medium\"\n      className=\"uppercase leading-none text-text-600\"\n    >\n      {label}\n    </Text>\n    {children}\n  </div>\n);\n\ninterface SegmentedProps<T extends string | number> {\n  value: T;\n  options: { value: T; label: string }[];\n  onChange: (value: T) => void;\n  ariaLabel: string;\n}\n\n/**\n * Estilo de segmented baseado no `SelectionButton` da lib: cada opção é\n * um botão independente com `border` + `bg-background`, e o selecionado\n * ganha `ring-primary-950` (mesma identidade visual do componente da lib,\n * sem o overhead de ícone obrigatório do SelectionButton).\n */\nconst Segmented = <T extends string | number>({\n  value,\n  options,\n  onChange,\n  ariaLabel,\n}: Readonly<SegmentedProps<T>>) => (\n  <div\n    role=\"radiogroup\"\n    aria-label={ariaLabel}\n    className=\"flex flex-wrap gap-2\"\n  >\n    {options.map((opt) => {\n      const isActive = opt.value === value;\n      return (\n        <Button\n          key={String(opt.value)}\n          variant=\"raw\"\n          role=\"radio\"\n          aria-checked={isActive}\n          onClick={() => onChange(opt.value)}\n          className={cn(\n            'flex-1 cursor-pointer rounded-xl border border-border-50 bg-background',\n            // Texto segue spec do Figma: Roboto 14px/700/100%/0.2px, cor\n            // #525252 (text-700). Quando ativo, troca pra primary-950\n            // (azul escuro), mas mantém a mesma typography.\n            'px-4 py-4 text-sm font-bold leading-none tracking-[0.2px] text-text-700',\n            'shadow-soft-shadow-1 transition-all duration-150',\n            'hover:bg-background-100',\n            'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indicator-info',\n            isActive &&\n              'ring-2 ring-primary-950 ring-offset-0 shadow-none text-primary-950'\n          )}\n        >\n          {opt.label}\n        </Button>\n      );\n    })}\n  </div>\n);\n\ninterface PreviewSegmentedOption<T extends string | number> {\n  value: T;\n  label: string;\n  /** Conteúdo visual exibido DENTRO do botão (preview do efeito). */\n  preview: ReactNode;\n}\n\ninterface PreviewSegmentedProps<T extends string | number> {\n  value: T;\n  options: PreviewSegmentedOption<T>[];\n  onChange: (value: T) => void;\n  ariaLabel: string;\n}\n\n/**\n * Variante do Segmented onde o botão mostra um preview visual do efeito\n * (ex.: \"Aa\" em tamanhos diferentes para \"Tamanho da fonte\") e o label\n * textual fica abaixo do botão como legenda.\n */\nconst PreviewSegmented = <T extends string | number>({\n  value,\n  options,\n  onChange,\n  ariaLabel,\n}: Readonly<PreviewSegmentedProps<T>>) => (\n  <div role=\"radiogroup\" aria-label={ariaLabel} className=\"flex gap-2\">\n    {options.map((opt) => {\n      const isActive = opt.value === value;\n      return (\n        <div\n          key={String(opt.value)}\n          className=\"flex flex-1 flex-col items-center gap-2\"\n        >\n          <Button\n            variant=\"raw\"\n            role=\"radio\"\n            aria-checked={isActive}\n            aria-label={opt.label}\n            onClick={() => onChange(opt.value)}\n            className={cn(\n              'flex aspect-square w-full items-center justify-center',\n              'cursor-pointer rounded-xl border border-border-50 bg-background',\n              'text-text-700 shadow-soft-shadow-1 transition-all duration-150',\n              'hover:bg-background-100',\n              'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indicator-info',\n              isActive &&\n                'ring-2 ring-primary-950 ring-offset-0 shadow-none text-primary-950'\n            )}\n          >\n            {opt.preview}\n          </Button>\n          <Text\n            size=\"xs\"\n            weight=\"normal\"\n            className=\"leading-none text-text-700\"\n          >\n            {opt.label}\n          </Text>\n        </div>\n      );\n    })}\n  </div>\n);\n\nexport interface AccessibilityPanelProps {\n  isOpen: boolean;\n  onClose: () => void;\n  /** Lado da viewport onde o painel aparece (default: 'right') */\n  position?: AccessibilityFabPosition;\n  className?: string;\n}\n\n/**\n * Painel lateral com os controles de acessibilidade organizados em\n * accordions colapsáveis (Visão, Leitura, Leitor de texto, Animação,\n * Navegação, Atalho de teclado).\n *\n * O próprio painel fica dentro de `.a11y-widget-shield`, então\n * filtros aplicados no `<html>` (alto contraste, etc.) não afetam\n * sua legibilidade.\n */\nexport default function AccessibilityPanel({\n  isOpen,\n  onClose,\n  position = 'right',\n  className,\n}: Readonly<AccessibilityPanelProps>) {\n  const closeButtonRef = useRef<HTMLButtonElement>(null);\n  const previouslyFocusedRef = useRef<Element | null>(null);\n\n  const {\n    contrastMode,\n    saturationMode,\n    fontSize,\n    letterSpacing,\n    lineSpacing,\n    highlightLinks,\n    pauseAnimations,\n    bigCursor,\n    dyslexiaFont,\n    readingAid,\n    keyboardShortcut,\n    setContrastMode,\n    setSaturationMode,\n    setFontSize,\n    setLetterSpacing,\n    setLineSpacing,\n    setHighlightLinks,\n    setPauseAnimations,\n    setBigCursor,\n    setDyslexiaFont,\n    setReadingAid,\n    setKeyboardShortcut,\n    resetPreferences,\n  } = useAccessibilityStore();\n\n  // Foco e Escape: ao abrir, lembra o elemento anteriormente focado,\n  // move o foco para o botão de fechar e escuta a tecla Esc. Restaura\n  // o foco anterior ao fechar.\n  useEffect(() => {\n    if (!isOpen) return;\n    previouslyFocusedRef.current = document.activeElement;\n    closeButtonRef.current?.focus();\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === 'Escape') {\n        event.stopPropagation();\n        onClose();\n      }\n    };\n    globalThis.addEventListener('keydown', handleKeyDown);\n\n    return () => {\n      globalThis.removeEventListener('keydown', handleKeyDown);\n      const previous = previouslyFocusedRef.current as HTMLElement | null;\n      if (previous && typeof previous.focus === 'function') {\n        previous.focus();\n      }\n    };\n  }, [isOpen, onClose]);\n\n  if (!isOpen) return null;\n\n  const levelOptions = LEVEL_LABELS.map((label, index) => ({\n    value: index as 0 | 1 | 2 | 3,\n    label,\n  }));\n\n  return (\n    <dialog\n      open\n      aria-label=\"Opções de acessibilidade\"\n      data-testid=\"accessibility-panel\"\n      // `<dialog>` não estica automaticamente com `top` + `bottom`, por\n      // isso a altura fica explícita: `100vh - 5rem` (80px de respiro do\n      // topo). Combinado com `bottom-0` no className, o painel encosta\n      // na base da viewport como no Figma.\n      style={{ height: 'calc(100vh - 5rem)' }}\n      className={cn(\n        'a11y-widget-shield',\n        'fixed bottom-0 z-40 m-0',\n        PANEL_EDGE_CLASSES[position],\n        'flex w-[calc(100vw-3rem)] max-w-110 flex-col overflow-hidden rounded-2xl p-0',\n        'border border-background-200 bg-background shadow-2xl',\n        className\n      )}\n    >\n      {/* Header — visual do Figma: bg azul-claro (Paraná) / rosa-claro\n          (Paraíba) usando `primary-50`. Preferido em vez de `map-attention`\n          porque `primary-50` flipa corretamente no dark mode em todos os\n          temas (ex.: Paraná dark = #27344a), enquanto `map-attention`\n          ficou idêntico em light/dark no theme do Paraná, deixando o\n          texto branco invisível sobre o azul-claro no dark. */}\n      <header className=\"flex items-center justify-between gap-3 bg-primary-50 px-4 py-3\">\n        <div className=\"flex min-w-0 items-center gap-3\">\n          <img\n            src={accessibilityIcon}\n            alt=\"\"\n            aria-hidden=\"true\"\n            className=\"h-10 w-10 shrink-0\"\n          />\n          <div className=\"flex min-w-0 flex-col gap-1\">\n            <Text\n              size=\"md\"\n              weight=\"bold\"\n              className=\"leading-none tracking-[0.2px] text-text-950\"\n            >\n              Acessibilidade\n            </Text>\n            <Text\n              size=\"xs\"\n              weight=\"normal\"\n              className=\"leading-none text-text-800\"\n            >\n              Personalize a leitura e navegação\n            </Text>\n          </div>\n        </div>\n        <IconButton\n          ref={closeButtonRef}\n          size=\"sm\"\n          aria-label=\"Fechar opções de acessibilidade\"\n          onClick={onClose}\n          icon={<XIcon size={18} />}\n        />\n      </header>\n\n      <div className=\"flex-1 overflow-y-auto\">\n        <AccordionSection\n          title=\"Visão\"\n          icon={<EyeIcon size={18} />}\n          testId=\"a11y-section-vision\"\n        >\n          <SubControl label=\"Contraste\">\n            <Segmented\n              ariaLabel=\"Modo de contraste\"\n              value={contrastMode}\n              options={CONTRAST_OPTIONS}\n              onChange={setContrastMode}\n            />\n          </SubControl>\n          <SubControl label=\"Saturação\">\n            <Segmented\n              ariaLabel=\"Modo de saturação\"\n              value={saturationMode}\n              options={SATURATION_OPTIONS}\n              onChange={setSaturationMode}\n            />\n          </SubControl>\n          {/* Daltonismo removido por enquanto — store/store actions\n              mantidos para reativação futura sem refactor. */}\n        </AccordionSection>\n\n        <AccordionSection\n          title=\"Leitura\"\n          icon={<TextTIcon size={18} />}\n          testId=\"a11y-section-reading\"\n        >\n          <SubControl label=\"Fonte para dislexia\">\n            <AccessibilityToggleRow\n              ariaLabel=\"Trocar para Comic Sans MS\"\n              rowTestId=\"a11y-toggle-dyslexia-font-row\"\n              switchTestId=\"a11y-toggle-dyslexia-font\"\n              checked={dyslexiaFont}\n              onChange={() => setDyslexiaFont(!dyslexiaFont)}\n              label={\n                <>\n                  Trocar para{' '}\n                  <span style={{ fontFamily: '\"Comic Sans MS\", cursive' }}>\n                    Comic Sans MS\n                  </span>\n                </>\n              }\n            />\n          </SubControl>\n\n          <SubControl label=\"Tamanho da fonte\">\n            <PreviewSegmented\n              ariaLabel=\"Tamanho da fonte\"\n              value={fontSize}\n              options={levelOptions.map((opt) => ({\n                ...opt,\n                preview: (\n                  <span\n                    className={cn(\n                      'font-semibold leading-none',\n                      FONT_SIZE_PREVIEW_CLASSES[opt.value]\n                    )}\n                  >\n                    Aa\n                  </span>\n                ),\n              }))}\n              onChange={setFontSize}\n            />\n          </SubControl>\n\n          <SubControl label=\"Espaçamento entre letras\">\n            <PreviewSegmented\n              ariaLabel=\"Espaçamento entre letras\"\n              value={letterSpacing}\n              options={levelOptions.map((opt) => ({\n                ...opt,\n                preview: (\n                  <span\n                    className={cn(\n                      // Mesmo tamanho do \"Aa\" no botão Padrão de \"Tamanho\n                      // da fonte\" (text-base), pra que essa scale visualize\n                      // só a variação de letter-spacing.\n                      'text-base font-semibold leading-none',\n                      LETTER_SPACING_PREVIEW_CLASSES[opt.value]\n                    )}\n                  >\n                    Aa\n                  </span>\n                ),\n              }))}\n              onChange={setLetterSpacing}\n            />\n          </SubControl>\n\n          <SubControl label=\"Espaçamento entre linhas\">\n            <PreviewSegmented\n              ariaLabel=\"Espaçamento entre linhas\"\n              value={lineSpacing}\n              options={levelOptions.map((opt) => ({\n                ...opt,\n                preview: (\n                  <span\n                    className={cn(\n                      'flex flex-col items-stretch',\n                      LINE_SPACING_PREVIEW_GAPS[opt.value]\n                    )}\n                  >\n                    <span className=\"h-0.5 w-7 rounded-full bg-current\" />\n                    <span className=\"h-0.5 w-7 rounded-full bg-current\" />\n                    <span className=\"h-0.5 w-7 rounded-full bg-current\" />\n                  </span>\n                ),\n              }))}\n              onChange={setLineSpacing}\n            />\n          </SubControl>\n\n          <SubControl label=\"Auxiliar de leitura\">\n            <Segmented\n              ariaLabel=\"Auxiliar de leitura\"\n              value={readingAid}\n              options={READING_AID_OPTIONS}\n              onChange={setReadingAid}\n            />\n          </SubControl>\n        </AccordionSection>\n\n        <AccordionSection\n          title=\"Leitor de texto\"\n          icon={<SpeakerHighIcon size={18} />}\n          testId=\"a11y-section-tts\"\n        >\n          <TTSSection PreviewSegmented={PreviewSegmented} />\n        </AccordionSection>\n\n        <AccordionSection\n          title=\"Animação\"\n          icon={<FilmReelIcon size={18} />}\n          testId=\"a11y-section-animation\"\n        >\n          <AccessibilityToggleRow\n            label=\"Pausar animações para conforto visual\"\n            checked={pauseAnimations}\n            onChange={() => setPauseAnimations(!pauseAnimations)}\n            switchTestId=\"a11y-toggle-pause-animations\"\n          />\n        </AccordionSection>\n\n        <AccordionSection\n          title=\"Navegação\"\n          icon={<NavigationArrowIcon size={18} />}\n          testId=\"a11y-section-navigation\"\n        >\n          <SubControl label=\"Destacar links e botões\">\n            <AccessibilityToggleRow\n              label=\"Adicionar contorno em elementos clicáveis\"\n              checked={highlightLinks}\n              onChange={() => setHighlightLinks(!highlightLinks)}\n              switchTestId=\"a11y-toggle-highlight-links\"\n            />\n          </SubControl>\n          <SubControl label=\"Cursor maior\">\n            <AccessibilityToggleRow\n              label=\"Aumentar e escurecer cursor\"\n              checked={bigCursor}\n              onChange={() => setBigCursor(!bigCursor)}\n              switchTestId=\"a11y-toggle-big-cursor\"\n            />\n          </SubControl>\n        </AccordionSection>\n\n        <AccordionSection\n          title=\"Atalho de teclado\"\n          icon={<KeyboardIcon size={18} />}\n          testId=\"a11y-section-shortcut\"\n        >\n          <AccessibilityToggleRow\n            label=\"Alt+A para abrir o painel\"\n            checked={keyboardShortcut}\n            onChange={() => setKeyboardShortcut(!keyboardShortcut)}\n            switchTestId=\"a11y-toggle-keyboard-shortcut\"\n          />\n        </AccordionSection>\n      </div>\n\n      <footer className=\"border-t border-background-200 px-4 py-3\">\n        <Button\n          variant=\"outline\"\n          action=\"primary\"\n          size=\"medium\"\n          iconLeft={\n            <ArrowCounterClockwiseIcon\n              size={16}\n              weight=\"bold\"\n              aria-hidden=\"true\"\n            />\n          }\n          onClick={resetPreferences}\n          data-testid=\"a11y-reset\"\n          className=\"w-full justify-center\"\n        >\n          Redefinir ajustes\n        </Button>\n      </footer>\n    </dialog>\n  );\n}\n","import type { ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport ToggleSwitch from '../ToggleSwitch/ToggleSwitch';\nimport { cn } from '../../utils/utils';\n\nexport interface AccessibilityToggleRowProps {\n  /** Conteúdo principal da linha (texto ou JSX, ex.: trecho em Comic Sans). */\n  label: ReactNode;\n  /** Aria-label do row quando `label` é JSX e não pode ser usado como texto. */\n  ariaLabel?: string;\n  /** Texto auxiliar abaixo do label. */\n  description?: string;\n  checked: boolean;\n  onChange: () => void;\n  /** Testid no wrapper interativo (toda a linha). */\n  rowTestId?: string;\n  /** Testid no `<ToggleSwitch>` interno — usado pelos testes que ainda\n   *  clicam diretamente no botão de switch. */\n  switchTestId?: string;\n}\n\n/**\n * Linha clicável \"label à esquerda + ToggleSwitch à direita\" usada nos\n * accordions de Animação, Navegação, Atalho, dislexia e leitor de texto.\n *\n * O wrapper inteiro responde a click/Enter/Space; o `ToggleSwitch` interno\n * é apenas decorativo (`tabIndex={-1}`, `aria-hidden`) pra que toda a área\n * vire alvo de clique sem dupla-ativação do switch.\n */\nexport default function AccessibilityToggleRow({\n  label,\n  ariaLabel,\n  description,\n  checked,\n  onChange,\n  rowTestId,\n  switchTestId,\n}: Readonly<AccessibilityToggleRowProps>) {\n  const computedAriaLabel =\n    ariaLabel ?? (typeof label === 'string' ? label : undefined);\n  return (\n    <div\n      role=\"switch\"\n      tabIndex={0}\n      aria-checked={checked}\n      aria-label={computedAriaLabel}\n      data-testid={rowTestId}\n      className={cn(\n        'flex items-center justify-between gap-3 rounded-md py-1.5',\n        'cursor-pointer transition-colors duration-150 hover:bg-background-100',\n        'focus:outline-none focus-visible:ring-2 focus-visible:ring-info-500'\n      )}\n      onClick={onChange}\n      onKeyDown={(e) => {\n        if (e.key === 'Enter' || e.key === ' ') {\n          e.preventDefault();\n          onChange();\n        }\n      }}\n    >\n      <div className=\"flex flex-col\">\n        <Text size=\"sm\" className=\"text-text-900\">\n          {label}\n        </Text>\n        {description && (\n          <Text size=\"2xs\" className=\"text-text-600\">\n            {description}\n          </Text>\n        )}\n      </div>\n      <ToggleSwitch\n        checked={checked}\n        onChange={() => undefined}\n        checkedColor=\"bg-info-600\"\n        data-testid={switchTestId}\n        tabIndex={-1}\n        aria-hidden\n      />\n    </div>\n  );\n}\n","import { useMemo, type ReactElement, type ReactNode } from 'react';\nimport { PauseIcon, PlayIcon, StopIcon } from '@phosphor-icons/react';\nimport Button from '../Button/Button';\nimport Text from '../Text/Text';\nimport Select, {\n  SelectTrigger,\n  SelectContent,\n  SelectItem,\n  SelectValue,\n} from '../Select/Select';\nimport AccessibilityToggleRow from './AccessibilityToggleRow';\nimport { useAccessibilityStore } from '../../store/accessibilityStore';\nimport { useTTS } from '../../hooks/useTTS';\n\n/**\n * Opções de velocidade da fala. O `preview` mostra o valor numérico\n * dentro do botão (1.0, 1.25, etc.) e o `label` aparece como caption\n * abaixo. Valores escolhidos para casarem com o que o Web Speech API\n * aceita (0.5–2.0) — `0.75` foi mantido para \"Lento\" em vez de algo\n * mais agressivo porque vozes nativas ficam ininteligíveis abaixo disso.\n */\nconst RATE_OPTIONS: {\n  value: string;\n  label: string;\n  preview: ReactNode;\n}[] = [\n  { value: '0.75', label: 'Lento', preview: '0.75' },\n  { value: '1', label: 'Normal', preview: '1.0' },\n  { value: '1.25', label: 'Rápido', preview: '1.25' },\n  { value: '2', label: 'Muito rápido', preview: '2.0' },\n];\n\nexport interface TTSSectionProps {\n  /** Componente de segmented com preview visual + label abaixo */\n  PreviewSegmented: <T extends string | number>(props: {\n    value: T;\n    options: { value: T; label: string; preview: ReactNode }[];\n    ariaLabel: string;\n    onChange: (value: T) => void;\n  }) => ReactElement;\n}\n\n/**\n * Bloco de controles do leitor de texto dentro do painel.\n * Estrutura segue o design do Figma:\n *  1. \"Texto para voz\" — toggle que ativa/desativa o modo click-to-read\n *  2. \"Voz\" — seletor de voz\n *  3. \"Velocidade\" — PreviewSegmented com valor numérico\n */\nexport default function TTSSection({\n  PreviewSegmented,\n}: Readonly<TTSSectionProps>) {\n  const ttsMode = useAccessibilityStore((s) => s.ttsMode);\n  const ttsStatus = useAccessibilityStore((s) => s.ttsStatus);\n  const ttsRate = useAccessibilityStore((s) => s.ttsRate);\n  const ttsVoiceId = useAccessibilityStore((s) => s.ttsVoiceId);\n  const setTTSMode = useAccessibilityStore((s) => s.setTTSMode);\n  const setTTSRate = useAccessibilityStore((s) => s.setTTSRate);\n  const setTTSVoiceId = useAccessibilityStore((s) => s.setTTSVoiceId);\n\n  const { isSupported, voices, hasPortugueseVoice, pause, resume, stop } =\n    useTTS();\n\n  // Preferimos vozes em português; demais ficam ao final.\n  const sortedVoices = useMemo(() => {\n    return [...voices].sort((a, b) => {\n      const aPt = a.lang.toLowerCase().startsWith('pt') ? 0 : 1;\n      const bPt = b.lang.toLowerCase().startsWith('pt') ? 0 : 1;\n      if (aPt !== bPt) return aPt - bPt;\n      return a.name.localeCompare(b.name);\n    });\n  }, [voices]);\n\n  if (!isSupported) {\n    return (\n      <Text size=\"2xs\" className=\"text-text-600\">\n        Síntese de voz não está disponível neste navegador.\n      </Text>\n    );\n  }\n\n  const isClickToReadOn = ttsMode === 'click-to-read';\n\n  return (\n    <div className=\"flex flex-col gap-6\">\n      {/* Texto para voz: toggle row */}\n      <div className=\"flex flex-col gap-2\">\n        <Text\n          size=\"xs\"\n          weight=\"medium\"\n          className=\"uppercase leading-none text-text-600\"\n        >\n          Texto para voz\n        </Text>\n        <AccessibilityToggleRow\n          label=\"Ative a leitura e clique no texto para ouvir\"\n          rowTestId=\"a11y-tts-mode-toggle\"\n          checked={isClickToReadOn}\n          onChange={() => setTTSMode(isClickToReadOn ? 'off' : 'click-to-read')}\n        />\n      </div>\n\n      {!hasPortugueseVoice && (\n        <Text size=\"2xs\" className=\"text-warning-700\">\n          Nenhuma voz em português foi encontrada no seu sistema. A leitura será\n          feita com a voz padrão disponível.\n        </Text>\n      )}\n\n      {/* Voz: pill select */}\n      <div className=\"flex flex-col gap-2\">\n        <Text\n          size=\"xs\"\n          weight=\"medium\"\n          className=\"uppercase leading-none text-text-600\"\n        >\n          Voz\n        </Text>\n        <Select\n          size=\"small\"\n          value={ttsVoiceId ?? ''}\n          onValueChange={(value) => setTTSVoiceId(value || null)}\n        >\n          <SelectTrigger\n            variant=\"rounded\"\n            aria-label=\"Voz da síntese de fala\"\n            data-testid=\"a11y-tts-voice-select\"\n          >\n            <SelectValue placeholder=\"Padrão do navegador\" />\n          </SelectTrigger>\n          <SelectContent>\n            <SelectItem value=\"\">Padrão do navegador</SelectItem>\n            {sortedVoices.map((v) => (\n              <SelectItem key={v.id} value={v.id}>\n                {v.name} — {v.lang}\n              </SelectItem>\n            ))}\n          </SelectContent>\n        </Select>\n      </div>\n\n      {/* Velocidade: preview segmented com valor numérico no botão */}\n      <div className=\"flex flex-col gap-2\">\n        <Text\n          size=\"xs\"\n          weight=\"medium\"\n          className=\"uppercase leading-none text-text-600\"\n        >\n          Velocidade\n        </Text>\n        <PreviewSegmented\n          ariaLabel=\"Velocidade da fala\"\n          value={String(ttsRate)}\n          options={RATE_OPTIONS.map((opt) => ({\n            value: opt.value,\n            label: opt.label,\n            preview: (\n              <span className=\"text-base font-bold leading-none\">\n                {opt.preview}\n              </span>\n            ),\n          }))}\n          onChange={(v) => setTTSRate(Number(v))}\n        />\n      </div>\n\n      {/* Ações: pause/resume/stop conforme status — só visíveis durante a fala */}\n      {ttsStatus !== 'idle' && (\n        <div className=\"flex items-center gap-2\">\n          {ttsStatus === 'speaking' && (\n            <Button\n              variant=\"outline\"\n              action=\"secondary\"\n              size=\"small\"\n              iconLeft={\n                <PauseIcon size={14} weight=\"bold\" aria-hidden=\"true\" />\n              }\n              onClick={pause}\n              data-testid=\"a11y-tts-pause\"\n            >\n              Pausar\n            </Button>\n          )}\n\n          {ttsStatus === 'paused' && (\n            <Button\n              variant=\"outline\"\n              action=\"secondary\"\n              size=\"small\"\n              iconLeft={<PlayIcon size={14} weight=\"bold\" aria-hidden=\"true\" />}\n              onClick={resume}\n              data-testid=\"a11y-tts-resume\"\n            >\n              Retomar\n            </Button>\n          )}\n\n          <Button\n            variant=\"outline\"\n            action=\"negative\"\n            size=\"small\"\n            iconLeft={<StopIcon size={14} weight=\"bold\" aria-hidden=\"true\" />}\n            onClick={stop}\n            data-testid=\"a11y-tts-stop\"\n            className=\"ml-auto\"\n          >\n            Parar\n          </Button>\n        </div>\n      )}\n    </div>\n  );\n}\n","import { HandWavingIcon } from '@phosphor-icons/react';\nimport Button from '../Button/Button';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { cn } from '../../utils/utils';\nimport {\n  FAB_POSITION_CLASSES,\n  FAB_TOOLTIP_POSITION,\n  FAB_VERTICAL_ALIGN_CLASSES,\n  type FabPosition,\n  type FabVerticalAlign,\n} from './fabPositioning';\n\ntype AccessibilityFabPosition = FabPosition;\ntype AccessibilityFabVerticalAlign = FabVerticalAlign;\n\nexport interface LibrasFabProps {\n  /** Click handler — alterna o painel do VLibras (abrir/fechar) */\n  onClick: () => void;\n  /** Lado da viewport onde o botão fica colado */\n  position?: AccessibilityFabPosition;\n  /** Alinhamento vertical (default: `below-center`) */\n  verticalAlign?: AccessibilityFabVerticalAlign;\n  /** Classes extras */\n  className?: string;\n}\n\n/**\n * Segundo botão flutuante (FAB), posicionado abaixo do `AccessibilityFab`.\n * Aciona o widget oficial do VLibras (gov.br) que faz tradução automática\n * de português para Libras via avatar 3D.\n *\n * O botão tem visual constante — não mantemos um indicador de estado\n * \"ativo\" porque o painel do VLibras já reflete visualmente se está\n * aberto ou fechado. Cada clique alterna o painel.\n *\n * Mesma identidade visual do FAB principal (azul escuro, quadrado com\n * canto interno arredondado, colado na lateral).\n */\nexport default function LibrasFab({\n  onClick,\n  position = 'right',\n  verticalAlign = 'below-center',\n  className,\n}: Readonly<LibrasFabProps>) {\n  const label = 'Tradução em Libras';\n\n  return (\n    <Tooltip\n      content={label}\n      position={FAB_TOOLTIP_POSITION[position]}\n      className={cn(\n        'fixed z-40',\n        FAB_VERTICAL_ALIGN_CLASSES[verticalAlign],\n        FAB_POSITION_CLASSES[position]\n      )}\n    >\n      <Button\n        variant=\"raw\"\n        onClick={onClick}\n        aria-label={label}\n        data-testid=\"libras-fab\"\n        className={cn(\n          'a11y-widget-shield',\n          FAB_POSITION_CLASSES[position],\n          'flex h-10 w-10 cursor-pointer items-center justify-center',\n          // `text-text-50` flipa junto com `bg-info-900`: claro no light,\n          // escuro no dark. Como o ícone usa `currentColor`, com `text-white`\n          // a mãozinha sumiria no tema escuro (branco em fundo azul-claro).\n          'bg-info-900 text-text-50 shadow-lg',\n          'transition-all duration-200 hover:scale-110 hover:bg-info-800',\n          'focus:outline-none focus:ring-4 focus:ring-info-300',\n          className\n        )}\n      >\n        <HandWavingIcon size={25} weight=\"fill\" aria-hidden=\"true\" />\n      </Button>\n    </Tooltip>\n  );\n}\n","import { useEffect, useState } from 'react';\nimport { useAccessibilityStore } from '../../store/accessibilityStore';\n\nconst RULER_HEIGHT_PX = 32;\nconst MASK_GAP_PX = 80; // metade da altura da janela visível\n\n/**\n * Renderiza auxiliares de leitura (régua ou máscara) que acompanham\n * a posição vertical do mouse. Só monta listener de `mousemove` quando\n * algum auxiliar está ativo, para não pagar custo quando desligado.\n */\nexport default function ReadingAid() {\n  const readingAid = useAccessibilityStore((s) => s.readingAid);\n  const [mouseY, setMouseY] = useState<number | null>(null);\n\n  useEffect(() => {\n    if (readingAid === 'none') {\n      setMouseY(null);\n      return;\n    }\n\n    let frame = 0;\n    const handleMouseMove = (event: MouseEvent) => {\n      cancelAnimationFrame(frame);\n      frame = requestAnimationFrame(() => setMouseY(event.clientY));\n    };\n\n    document.addEventListener('mousemove', handleMouseMove, { passive: true });\n    return () => {\n      cancelAnimationFrame(frame);\n      document.removeEventListener('mousemove', handleMouseMove);\n    };\n  }, [readingAid]);\n\n  if (readingAid === 'none' || mouseY === null) return null;\n\n  if (readingAid === 'ruler') {\n    return (\n      <div\n        aria-hidden=\"true\"\n        data-testid=\"a11y-reading-ruler\"\n        className=\"a11y-widget-shield pointer-events-none fixed left-0 right-0 z-30\"\n        style={{\n          top: mouseY - RULER_HEIGHT_PX / 2,\n          height: RULER_HEIGHT_PX,\n          background: 'rgba(255, 235, 59, 0.25)',\n          borderTop: '2px solid #facc15',\n          borderBottom: '2px solid #facc15',\n        }}\n      />\n    );\n  }\n\n  // Máscara: dois retângulos escurecendo acima e abaixo do cursor\n  return (\n    <>\n      <div\n        aria-hidden=\"true\"\n        data-testid=\"a11y-reading-mask-top\"\n        className=\"a11y-widget-shield pointer-events-none fixed left-0 right-0 top-0 z-30 bg-black/90\"\n        style={{ height: Math.max(0, mouseY - MASK_GAP_PX) }}\n      />\n      <div\n        aria-hidden=\"true\"\n        data-testid=\"a11y-reading-mask-bottom\"\n        className=\"a11y-widget-shield pointer-events-none fixed left-0 right-0 bottom-0 z-30 bg-black/90\"\n        style={{ top: mouseY + MASK_GAP_PX }}\n      />\n    </>\n  );\n}\n","import {\n  ColorBlindMode,\n  getColorBlindFilterId,\n} from '../../store/accessibilityStore';\n\n/**\n * SVG escondido com matrizes `<feColorMatrix>` que simulam/auxiliam\n * cada tipo de daltonismo. As classes em `accessibility.css` aplicam\n * `filter: url(#a11y-cb-...)` no `<html>` para colorir a página.\n *\n * Os IDs dos filters são derivados do enum `ColorBlindMode` via\n * `getColorBlindFilterId` — mesma fonte da verdade que o hook usa\n * para aplicar a classe.\n *\n * Matrizes baseadas em Brettel/Vienot/Mollon — padrão amplamente\n * utilizado em ferramentas de acessibilidade como AXE, Daltonize e\n * widget oficial do HandTalk.\n */\nexport default function ColorBlindFilters() {\n  return (\n    <svg\n      aria-hidden=\"true\"\n      data-testid=\"a11y-colorblind-filters\"\n      style={{\n        position: 'absolute',\n        width: 0,\n        height: 0,\n        overflow: 'hidden',\n      }}\n    >\n      <defs>\n        <filter id={getColorBlindFilterId(ColorBlindMode.Protanopia)}>\n          <feColorMatrix\n            type=\"matrix\"\n            values=\"0.567 0.433 0     0 0\n                    0.558 0.442 0     0 0\n                    0     0.242 0.758 0 0\n                    0     0     0     1 0\"\n          />\n        </filter>\n        <filter id={getColorBlindFilterId(ColorBlindMode.Deuteranopia)}>\n          <feColorMatrix\n            type=\"matrix\"\n            values=\"0.625 0.375 0   0 0\n                    0.700 0.300 0   0 0\n                    0     0.300 0.7 0 0\n                    0     0     0   1 0\"\n          />\n        </filter>\n        <filter id={getColorBlindFilterId(ColorBlindMode.Tritanopia)}>\n          <feColorMatrix\n            type=\"matrix\"\n            values=\"0.95 0.05  0     0 0\n                    0    0.433 0.567 0 0\n                    0    0.475 0.525 0 0\n                    0    0     0     1 0\"\n          />\n        </filter>\n      </defs>\n    </svg>\n  );\n}\n","import { useEffect } from 'react';\nimport { useAccessibilityStore } from '../../store/accessibilityStore';\nimport { useTTS } from '../../hooks/useTTS';\n\nconst HIGHLIGHT_CLASS = 'a11y-tts-target';\n\n/**\n * Controller invisível que conecta o `ttsMode` do store ao DOM:\n * - `click-to-read`: registra um listener global de clique. Ao clicar\n *   em qualquer elemento (exceto o próprio widget), lê seu texto.\n * - `read-selection`: lê o texto atualmente selecionado quando o store\n *   sinaliza (via `pendingReadSelection`). UI/atalho disparam isso.\n *\n * Aplica a classe `.a11y-tts-target` no elemento sendo lido para\n * destaque visual; remove ao terminar/parar.\n */\nexport default function TTSController() {\n  const ttsMode = useAccessibilityStore((s) => s.ttsMode);\n  const ttsStatus = useAccessibilityStore((s) => s.ttsStatus);\n  const { speak, stop, isSupported } = useTTS();\n\n  // Click-to-read: ouve cliques globais enquanto o modo está ativo\n  useEffect(() => {\n    if (!isSupported || ttsMode !== 'click-to-read') return;\n\n    const handler = (event: MouseEvent) => {\n      const initialTarget = event.target as HTMLElement | null;\n      if (!initialTarget) return;\n\n      // Ignora cliques dentro do próprio widget\n      if (initialTarget.closest('.a11y-widget-shield')) return;\n\n      // Sobe pela árvore até achar o ancestral que tem texto legível.\n      // Cobre o caso comum de IconButtons com `<svg>` interno: clicar no\n      // SVG não retorna texto, mas o botão pai tem aria-label.\n      const found = findReadableAncestor(initialTarget);\n      if (!found) return;\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      // Limpa highlight anterior e marca o novo alvo\n      document\n        .querySelectorAll(`.${HIGHLIGHT_CLASS}`)\n        .forEach((el) => el.classList.remove(HIGHLIGHT_CLASS));\n      found.node.classList.add(HIGHLIGHT_CLASS);\n\n      speak(found.text);\n    };\n\n    // capture: true → pegamos o clique antes do handler do app/link\n    document.addEventListener('click', handler, true);\n    return () => {\n      document.removeEventListener('click', handler, true);\n      document\n        .querySelectorAll(`.${HIGHLIGHT_CLASS}`)\n        .forEach((el) => el.classList.remove(HIGHLIGHT_CLASS));\n      // Interrompe qualquer fala em curso ao sair do modo. Sem isso,\n      // desligar o \"Clique para ler\" deixaria a leitura terminando\n      // sozinha, contrariando a expectativa do usuário.\n      stop();\n    };\n  }, [isSupported, ttsMode, speak, stop]);\n\n  // Quando a fala termina (ttsStatus volta a 'idle'), limpa highlight\n  useEffect(() => {\n    if (ttsStatus === 'idle') {\n      document\n        .querySelectorAll(`.${HIGHLIGHT_CLASS}`)\n        .forEach((el) => el.classList.remove(HIGHLIGHT_CLASS));\n    }\n  }, [ttsStatus]);\n\n  // Para qualquer fala em curso quando o componente desmonta\n  useEffect(() => () => stop(), [stop]);\n\n  return null;\n}\n\n/**\n * Extrai texto legível do elemento clicado. Prioriza:\n * 1. `aria-label` se presente\n * 2. `title`\n * 3. `innerText` truncado\n *\n * `innerText` (e não `textContent`) respeita estilos como `display: none`\n * e quebras de linha visuais — leitura mais natural.\n */\nconst extractReadableText = (el: HTMLElement): string => {\n  const aria = el.getAttribute('aria-label')?.trim();\n  if (aria) return aria;\n  const title = el.getAttribute('title')?.trim();\n  if (title) return title;\n  const text = el.innerText?.trim() ?? '';\n  // Limita comprimento para evitar leitura infinita ao clicar em\n  // contêineres grandes (ex.: <main>). 600 chars ≈ 1min de fala.\n  return text.length > 600 ? `${text.slice(0, 600)}...` : text;\n};\n\n/** Quantos níveis de ancestralidade subimos buscando um nó legível. */\nconst MAX_ANCESTOR_LOOKUP = 8;\n\n/**\n * Caminha pela árvore a partir do elemento clicado até achar o ancestral\n * mais próximo que tenha texto legível (`aria-label`, `title` ou\n * `innerText`). Limita a profundidade e nunca retorna o `<body>` para\n * evitar ler a página inteira ao clicar em ícones soltos.\n */\nconst findReadableAncestor = (\n  start: HTMLElement\n): { node: HTMLElement; text: string } | null => {\n  let node: HTMLElement | null = start;\n  let depth = 0;\n  while (node && depth < MAX_ANCESTOR_LOOKUP && node !== document.body) {\n    const text = extractReadableText(node);\n    if (text) return { node, text };\n    node = node.parentElement;\n    depth++;\n  }\n  return null;\n};\n","import { useEffect } from 'react';\nimport { useAccessibilityStore } from '../../store/accessibilityStore';\n\nconst SCRIPT_ID = 'a11y-vlibras-script';\nconst SCRIPT_URL = 'https://vlibras.gov.br/app/vlibras-plugin.js';\nconst APP_URL = 'https://vlibras.gov.br/app';\nconst WRAPPER_ID = 'a11y-vlibras-wrapper';\n\ninterface VLibrasGlobal {\n  Widget: new (appUrl: string) => unknown;\n}\n\n/**\n * Carrega e ativa o widget oficial de Libras do governo brasileiro\n * (gov.br/vlibras) sob demanda. Estratégia:\n *\n * - Quando `librasEnabled === true`:\n *   1. Injeta o esqueleto DOM esperado pelo VLibras (`<div vw>` etc.)\n *      no `<body>` (precisa estar no body, não dentro do React tree).\n *   2. Carrega o script oficial uma única vez (cacheado por id).\n *   3. Instancia `new window.VLibras.Widget(...)` para inicializar o\n *      avatar e os assets 3D.\n *\n * - Quando `librasEnabled === false`:\n *   - Apenas OCULTA o esqueleto DOM (não remove). O plugin do VLibras\n *     registra um listener de `resize` no `window` que ele nunca desanexa;\n *     se removêssemos o wrapper, esse listener rodaria `d(\"[vp]\").closest(...)`\n *     sobre um `null` (nós já removidos) e lançaria\n *     `Cannot read properties of null (reading 'closest')` no próximo resize\n *     (rotação de tela / teclado virtual no mobile). Mantendo o esqueleto\n *     oculto no DOM, `[vp]`/`[vw]` continuam existindo e o handler órfão não\n *     quebra. O script permanece em cache para reativações rápidas.\n *\n * O script é pesado (~MBs de avatares 3D), por isso só carregamos quando\n * o usuário clica para ativar — fluxo opt-in.\n */\nexport default function VLibrasLoader() {\n  const enabled = useAccessibilityStore((s) => s.librasEnabled);\n\n  useEffect(() => {\n    if (typeof document === 'undefined') return;\n\n    if (!enabled) {\n      hideWrapper();\n      return;\n    }\n\n    injectWrapper();\n    loadScript()\n      .then(() => {\n        const VLibras = (globalThis as unknown as { VLibras?: VLibrasGlobal })\n          .VLibras;\n        if (!VLibras?.Widget) return;\n\n        // ATENÇÃO: o construtor do VLibras Widget registra a lógica de\n        // inicialização DENTRO de `window.onload = () => {...}`. Como\n        // nesta integração o widget é ativado depois da página já ter\n        // carregado, o evento `load` já disparou e o handler nunca\n        // executa sozinho. Capturamos o handler que o construtor\n        // instalou e chamamos manualmente para popular o DOM (avatar,\n        // botão de acesso, painel) imediatamente.\n        const previousOnload = globalThis.onload;\n        // A instanciação importa pelos efeitos colaterais: o construtor\n        // do VLibras registra `window.onload` com a lógica de inicialização\n        // do widget. O retorno não é usado e é descartado de propósito.\n        new VLibras.Widget(APP_URL); // NOSONAR — instantiation by side effect\n        const installed = globalThis.onload;\n        if (typeof installed === 'function' && installed !== previousOnload) {\n          // `onload` espera tipo Window — usamos `as` porque o construtor\n          // do VLibras só lê `event.target` (que ignoramos) e não toca em\n          // propriedades específicas do Window.\n          (installed as (this: Window, ev: Event) => unknown).call(\n            globalThis as unknown as Window,\n            new Event('load')\n          );\n        }\n\n        // Após popular o DOM, abre direto o painel do VLibras — caso\n        // contrário o usuário precisaria clicar duas vezes (nosso FAB\n        // + botão de acesso do VLibras). Aguarda um frame para garantir\n        // que o handler de click do botão já foi anexado pelo plugin.\n        requestAnimationFrame(() => {\n          const accessButton =\n            document.querySelector<HTMLElement>('[vw-access-button]');\n          accessButton?.click();\n        });\n      })\n      .catch(() => {\n        // Falha de rede ou bloqueio: desabilita silenciosamente o estado\n        // para o usuário não ficar preso achando que vai funcionar.\n        useAccessibilityStore.getState().setLibrasEnabled(false);\n      });\n\n    return () => {\n      // Não removemos o wrapper aqui: a remoção real fica no ramo\n      // `!enabled` acima. Manter aqui causaria flicker em re-renders.\n    };\n  }, [enabled]);\n\n  return null;\n}\n\nconst injectWrapper = () => {\n  const existing = document.getElementById(WRAPPER_ID);\n  if (existing) {\n    // Wrapper já foi criado numa ativação anterior e apenas ocultado ao\n    // desativar. Basta reexibi-lo em vez de recriar (o que reinjetaria os\n    // nós e recriaria o listener órfão do plugin).\n    existing.style.removeProperty('display');\n    return;\n  }\n\n  const wrapper = document.createElement('div');\n  wrapper.id = WRAPPER_ID;\n  wrapper.setAttribute('vw', '');\n  wrapper.className = 'enabled';\n\n  const accessButton = document.createElement('div');\n  accessButton.setAttribute('vw-access-button', '');\n  accessButton.className = 'active';\n  wrapper.appendChild(accessButton);\n\n  const pluginWrapper = document.createElement('div');\n  pluginWrapper.setAttribute('vw-plugin-wrapper', '');\n  const top = document.createElement('div');\n  top.className = 'vw-plugin-top-wrapper';\n  pluginWrapper.appendChild(top);\n  wrapper.appendChild(pluginWrapper);\n\n  document.body.appendChild(wrapper);\n};\n\nconst hideWrapper = () => {\n  const wrapper = document.getElementById(WRAPPER_ID);\n  if (wrapper) {\n    // Oculta sem remover: preserva os nós [vp]/[vw] que o listener de resize\n    // órfão do plugin do VLibras consulta via `.closest()`.\n    wrapper.style.display = 'none';\n  }\n};\n\nconst loadScript = (): Promise<void> => {\n  return new Promise((resolve, reject) => {\n    if (document.getElementById(SCRIPT_ID)) {\n      resolve();\n      return;\n    }\n\n    const script = document.createElement('script');\n    script.id = SCRIPT_ID;\n    script.src = SCRIPT_URL;\n    script.async = true;\n    script.onload = () => resolve();\n    script.onerror = () =>\n      reject(new Error('Falha ao carregar o script do VLibras'));\n    document.head.appendChild(script);\n  });\n};\n\nexport const __testing = {\n  SCRIPT_ID,\n  SCRIPT_URL,\n  WRAPPER_ID,\n  injectWrapper,\n  hideWrapper,\n};\n","import AccessibilityFab, {\n  type AccessibilityFabPosition,\n} from './AccessibilityFab';\nimport AccessibilityPanel from './AccessibilityPanel';\nimport LibrasFab from './LibrasFab';\nimport ReadingAid from './ReadingAid';\nimport ColorBlindFilters from './ColorBlindFilters';\nimport TTSController from './TTSController';\nimport VLibrasLoader from './VLibrasLoader';\nimport { useAccessibilityStore } from '../../store/accessibilityStore';\nimport { useA11yPreferences } from '../../hooks/useA11yPreferences';\nimport { useA11yKeyboardShortcut } from '../../hooks/useA11yKeyboardShortcut';\nimport './accessibility.css';\n\nexport interface AccessibilityWidgetProps {\n  /** Lado da viewport onde o botão fica colado (default: 'right') */\n  position?: AccessibilityFabPosition;\n  /** Classes extras para o botão flutuante */\n  fabClassName?: string;\n  /** Classes extras para o painel */\n  panelClassName?: string;\n  /**\n   * Mostra o botão de Libras empilhado abaixo do botão de\n   * acessibilidade (default: true). Plataformas que já injetam o\n   * VLibras de forma própria podem desabilitar passando `false`.\n   */\n  showLibras?: boolean;\n}\n\n/**\n * Widget de acessibilidade — botão flutuante que abre um painel\n * com controles de contraste, fonte, espaçamento e outras\n * preferências visuais. As preferências são persistidas em\n * localStorage e aplicadas via classes no `<html>`.\n *\n * Renderize uma única instância no shell da aplicação. Tudo fica\n * dentro de `.a11y-widget-root` para que o próprio widget não\n * sofra com os filtros que aplica na página.\n *\n * @example\n * ```tsx\n * <AccessibilityWidget position=\"left\" />\n * ```\n */\nexport default function AccessibilityWidget({\n  position = 'right',\n  fabClassName,\n  panelClassName,\n  showLibras = true,\n}: Readonly<AccessibilityWidgetProps>) {\n  useA11yPreferences();\n  useA11yKeyboardShortcut();\n\n  const isPanelOpen = useAccessibilityStore((s) => s.isPanelOpen);\n  const togglePanel = useAccessibilityStore((s) => s.togglePanel);\n  const closePanel = useAccessibilityStore((s) => s.closePanel);\n  const librasEnabled = useAccessibilityStore((s) => s.librasEnabled);\n  const setLibrasEnabled = useAccessibilityStore((s) => s.setLibrasEnabled);\n\n  // Quando o Libras é exibido, os dois FABs ficam empilhados\n  // (acessibilidade acima do meio, libras abaixo). Sem Libras,\n  // o de acessibilidade ocupa o centro como antes.\n  const accessibilityVerticalAlign = showLibras ? 'above-center' : 'center';\n\n  /**\n   * Clique no FAB de Libras:\n   * - Primeira vez (não ativado): ativa o widget VLibras (que se\n   *   auto-abre no painel pela primeira vez).\n   * - Demais vezes: dispara o click no botão de acesso nativo do\n   *   VLibras, que abre/fecha o painel sem precisar reinjetar o widget.\n   *   Isso evita o ciclo de remoção/reinjeção que deixava o VLibras\n   *   em estado inconsistente após fechá-lo.\n   */\n  const handleLibrasClick = () => {\n    if (!librasEnabled) {\n      setLibrasEnabled(true);\n      return;\n    }\n    document.querySelector<HTMLElement>('[vw-access-button]')?.click();\n  };\n\n  return (\n    <>\n      {!isPanelOpen && (\n        <AccessibilityFab\n          onClick={togglePanel}\n          isOpen={isPanelOpen}\n          position={position}\n          verticalAlign={accessibilityVerticalAlign}\n          className={fabClassName}\n        />\n      )}\n      {!isPanelOpen && showLibras && (\n        <LibrasFab onClick={handleLibrasClick} position={position} />\n      )}\n      <AccessibilityPanel\n        isOpen={isPanelOpen}\n        onClose={closePanel}\n        position={position}\n        className={panelClassName}\n      />\n      <ReadingAid />\n      <ColorBlindFilters />\n      <TTSController />\n      {showLibras && <VLibrasLoader />}\n    </>\n  );\n}\n"],"mappings":"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","names":["jsx","jsx","jsxs","PreviewSegmented","jsx","jsxs","jsx","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","jsx","jsxs","useEffect","useEffect","useEffect","useEffect","Fragment","jsx","jsxs"]}