//! Modelo de **semántica accesible** de un nodo. Es el dato que el runtime //! traduce a un árbol [AccessKit](https://accesskit.dev) por frame para //! alimentar lectores de pantalla (NVDA, VoiceOver, Orca, TalkBack) y otras //! ayudas técnicas — TTS, navegación por voz, switch control. //! //! Este módulo es **pura data**: define los tipos sin acoplarse al crate //! `accesskit`. La conversión a `accesskit::Node` vive en `llimphi-ui::a11y` //! (iter 2 del plan), donde el cableado del adapter winit ya importa la //! librería. Tener acá solo el modelo permite: //! //! - Compilar el compositor con o sin la integración AccessKit habilitada. //! - Testear semántica a nivel "qué declaran los widgets" sin levantar un //! adapter ni un lector real. //! - Mantener la API estable aunque cambien versiones de `accesskit`. //! //! ## Cuándo declarar semántica //! //! - **Siempre** en controles interactivos: botones, inputs, checkboxes, tabs, //! ítems de menú, sliders. Sin rol declarado, el lector no sabe que el nodo //! ES un botón aunque tenga `on_click`. //! - **Para texto significativo** que no es un botón: títulos (`Heading`), //! etiquetas asociadas, valores (`Label` / `Static`). El text de un nodo se //! lee igual aunque no tenga `semantics`, pero un rol explícito mejora la //! navegación por rol de los lectores. //! - **Para grouping**: tabbar, dock, toolbars, listas — `Role::Group` o un //! rol específico (`TabList`, `Menu`, `Toolbar`) ayuda a saltar bloques. //! //! ## Cuándo NO declarar //! //! Decorativo puro (un divider, un fondo con gradiente, una sombra) **no debe** //! declarar semántica — los lectores ya filtran texto vacío, pero un rol //! superfluo (`Role::Group` en cada `View` envoltorio) ensucia la navegación. use std::sync::Arc; /// Rol semántico del nodo. Los nombres y la granularidad siguen los roles de /// AccessKit / ARIA. Subset acotado: agregamos lo que falte cuando aparezca un /// caller real (regla del repo — no diseñamos para lo hipotético). #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum Role { /// Botón clickeable. El lector dice "botón