Accesibilidad
@lh-ui/react comparte con el resto de bibliotecas de la familia el mismo contrato de accesibilidad: etiquetas semánticas, atributos ARIA e interacción de teclado están definidos en @lh-ui/share/core, y todas las plataformas los implementan de forma idéntica. Esta biblioteca garantiza además que no aparezcan las trampas de a11y habituales del ecosistema React.
Semántica y ARIA
LhSwitchrenderiza<div role="switch" aria-checked>, y no un checkbox disfrazado visualmenteLhSelectel activador esrole="combobox", el panel desplegado esrole="listbox", las opciones sonrole="option", y el resaltado de teclado se sincroniza conaria-activedescendantLhDialogesrole="dialog" aria-modal; el título ofrece a la vez un respaldo dearia-labely la asociación precisa dearia-labelledbyLhTooltipvincula la sugerencia al activador conaria-describedbyLhTag, cuando es clicable, pasa arole="button"y responde a Enter / SpaceLhFormItemrenderiza el mensaje de error comorole="alert"cuando falla la validación, y establecearia-invalid
Interacción de teclado
| Componente | Teclas |
|---|---|
LhButton / LhTag | Enter / Space disparan el clic |
LhSwitch | Enter / Space conmutan |
LhSelect | ArrowUp / ArrowDown resaltan opciones, Enter selecciona, Escape cierra |
LhDialog | Escape cierra (solo responde la capa superior de la pila) |
LhTooltip | Escape cierra |
Cuando se superponen varias capas emergentes, useLhOverlayStack mantiene una pila del orden de apertura y Escape solo cierra la capa superior, evitando que una sola pulsación cierre todas las capas.
Gestión del foco
LhDialog, al abrirse, usauseLhFocusTrappara mantener el foco dentro del diálogo (Tab / Shift+Tab no escapan); al cerrarse, el foco vuelve al activadorLhFormItem, al hacer clic en la label, enfoca el primer elemento enfocable del área de contenido (focusControl), porque el comportamiento nativo de envolver con una label no es fiable en controles compuestos
Iconos decorativos
LhIcon es decorative por defecto: emite aria-hidden="true" y permanece invisible para los lectores de pantalla. Cuando se necesita semántica, se pasa decorative={false} + ariaLabel:
<LhIcon name="search" decorative={false} ariaLabel="Buscar" />
En ese caso se renderiza <svg role="img" aria-label="Buscar">.
Seguridad en StrictMode
Todos los componentes son seguros bajo React StrictMode: la limpieza de los efectos y el montaje repetido se tratan de forma idempotente (registro / desmontaje de la pila de capas, comprobación del titular del bloqueo de desplazamiento, liberación del focus trap).
Coherencia de la familia
El comportamiento de accesibilidad está registrado en docs/设计语言基线.md y constituye el contrato unificado de ambas líneas de sangre (web / nativa). Todas las plataformas lo implementan a partir de la misma lógica de @lh-ui/share/core, con atributos aria y semántica de teclas idénticos.