CommunityProgramación y desarrollogithub.com

Patrones de UI para Astro

Implementa patrones de interacción para Astro como navegación, diálogos, pestañas, filtros, tarjetas y cambio de tema. Reutiliza primitivas del framework mientras preservas el contrato de comportamiento de cada patrón.

¿Qué es Patrones de UI para Astro?

Esta guía define un catálogo estandarizado de componentes de interfaz portátiles y listos para usar en sitios Astro. Los ejemplos independientes siguen el **Modelo de Componente Portátil**, que no requiere dependencias npm externas, ni runtimes de frameworks de cliente (React/Vue), usa tokens CSS con nombres de espacio y fallbacks incorporados, y mejora progresivamente. En proyectos con un framework, se deben conservar los requisitos semánticos y de interacción, adaptando la composición y el estilo al contrato seleccionado. El catálogo incluye 17 componentes, desde un conmutador de tema claro/oscuro hasta un mapa autogestionado, cada uno con su propio archivo de especificaciones que detalla su comportamiento y requisitos de accesibilidad. La guía también establece un proceso de decisión para componentes no catalogados, obligando al agente a consultar al propietario del proyecto antes de instalar librerías de terceros o dejar marcadores de posición, y define un contrato de respaldo para componentes a medida que garantiza semántica HTML, cero dependencias externas, mejora progresiva y cumplimiento con WCAG 2.2 AA.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/gdcrosbie/agent-skills/tree/HEAD/skills/astro-ui-patterns

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Patrones de UI para Astro y Biblioteca de Componentes Portátiles

Esta guía define el catálogo estandarizado de componentes portátiles y listos para usar para sitios Astro.

Los ejemplos independientes usan el Modelo de Componente Portátil: cero dependencias npm externas, cero runtimes de frameworks de cliente (sin React/Vue), tokens CSS con nombres de espacio y fallbacks incorporados, y mejora progresiva. En proyectos con framework, conserva los requisitos semánticos y de interacción mientras adaptas la composición y el estilo al contrato seleccionado. Verifica la accesibilidad en el proyecto renderizado; una plantilla por sí sola no establece la conformidad con WCAG.


Contratos de comportamiento y composición con el framework

Para un componente en el índice siguiente, utiliza su contrato semántico y de interacción: soporte de teclado, gestión de foco, elementos nativos, nombres accesibles, actualizaciones de estado y mejora progresiva. El proyecto/framework seleccionado gobierna el estilo, los tokens, las importaciones y la composición del componente. Las instrucciones del usuario son la autoridad final.

Los ejemplos usan el modelo de componente portátil independiente a continuación. Úsalo al añadir un componente independiente sin un contrato de composición de framework. Cuando un proyecto tenga una biblioteca establecida, adapta el comportamiento usando sus primitivas apropiadas en lugar de duplicar sus botones, encabezados o controles de formulario. Preserva la semántica y el comportamiento requeridos mientras adaptas los envoltorios y las clases del ejemplo.

Para un proyecto construido sobre un framework de componentes (Lumos, por ejemplo), usa la composición y el estilo de ese framework; sus primitivas pueden importarse. La regla de importación cero independiente y los tokens de respaldo con nombres de espacio no anulan el contrato propio de un framework seleccionado.


El Modelo de Componente Portátil

Para componentes portátiles independientes, usa estas cinco reglas. En un framework seleccionado, preserva los requisitos de comportamiento y sigue su contrato de composición/estilo como se describe arriba:

  1. Cero Importaciones Externas/del Sitio: El archivo del componente NO debe importar diseños del sitio, botones ni bibliotecas de UI de terceros para el cliente. La única excepción catalogada es SelfHostedMap, que necesita un renderizador de mapas y un lector de teselas; su especificación lista los paquetes, y se instalan solo con la aprobación del propietario.
  2. Variables CSS con Nombres de Espacio y Fallbacks: Nunca hagas referencia directa a tokens del anfitrión (ej. var(--color-brand)) dentro de la hoja de estilo del componente. Siempre escribe var(--comp-propiedad, <fallback>).
  3. BEM con Ámbito y Propiedades CSS Lógicas: Usa nomenclatura de clases BEM (.c-theme-toggle, .c-accordion__summary) y propiedades lógicas (inline-size, block-size, padding-inline, margin-block).
  4. Mejora Progresiva Vainilla Idempotente: Los scripts deben ejecutarse al cargar y volverse a enlazar limpiamente si las Transiciones de Vista de Astro están activas (document.addEventListener('astro:after-swap', init)).
  5. Objetivos Táctiles y ARIA: Los botones y controles interactivos deben tener un tamaño mínimo de 44px (2.75rem) o 48px (3rem) para objetivos táctiles, estados ARIA adecuados (aria-expanded, aria-selected, aria-pressed, aria-controls), y anillos de foco de teclado.

Índice de Componentes

ComponenteArchivo de EspecificaciónPropósitoContrato Clave
1. ThemeTogglecomponents/theme-toggle.mdConmutador de tema claro/oscuro sin FOUC y con morphing SVGScript <head> en línea + mapeo de tokens OKLCH
2. MobileNavDrawercomponents/mobile-nav-drawer.mdCajón de navegación deslizable accesible con hamburguesa animadaObjetivos táctiles de 48px, cierre con tecla Escape, sin retraso de desenfoque GPU
3. SearchBarcomponents/search-bar.mdCampo de búsqueda del lado del cliente con botón de borrado y locutor en vivorAF debouncing (INP óptimo), aria-live, coordinador de eventos personalizado
4. FilterChipscomponents/filter-chips.mdBarra de filtros de múltiples categorías con estados presionados accesiblesrole="group", aria-pressed, coordinador de eventos personalizado
5. SearchFilterBarcomponents/search-filter-bar.mdPatrón compuesto que combina SearchBar y FilterChipsBarra de herramientas apilada precompuesta, diseños flex de múltiples columnas, ámbito compartido
6. AccessibleModalcomponents/accessible-modal.mdSuperposición de diálogo accesible usando <dialog> nativo de HTML5Capa superior nativa, clic en fondo, tecla Escape, restauración de foco
7. AccessibleAccordioncomponents/accessible-accordion.mdAcordeón/Preguntas Frecuentes nativo con expansión suave mediante CSS Grid<details name="..."> nativo, 0 KB JavaScript
8. AccessibleTabscomponents/accessible-tabs.mdConmutador de pestañas WAI-ARIA para niveles de precios o vistas de múltiples panelesNavegación con teclas de flecha (Izquierda/Derecha/Inicio/Fin)
9. SocialSharecomponents/social-share.mdBarra de compartir en redes sociales priorizando la privacidad con Web Share API100% seguro para GDPR, 0 rastreadores, URLs de intención estáticas
10. TableOfContentscomponents/table-of-contents.mdTabla de contenidos para artículos extensos con scrollspySeguimiento de encabezados con IntersectionObserver, se empareja con un diseño de artículo
11. AccessibleCarouselcomponents/accessible-carousel.mdDeslizador CSS nativo con scroll-snap para reseñas, tarjetas o logotiposDeslizamiento táctil nativo (0 KB JS), botones accesibles Anterior/Siguiente
12. InfiniteTickercomponents/infinite-ticker.mdMarquesina infinita de logotipos/texto con pausa al pasar el ratón/enfocarCumple con WCAG 2.2.2, pista duplicada oculta con aria-hidden
13. StatsCountercomponents/stats-counter.mdBarra de contador de métricas basada en HTML con animación de desplazamiento ease-out0 CLS, fallback HTML estático, IntersectionObserver
14. AddToCalendarcomponents/add-to-calendar.mdEnlace "Guardar la fecha" a un archivo iCalendar generado en tiempo de compilación.ics estático del mismo origen + <a download>, RFC 5545 válido, 0 KB JS
15. SelfHostedMapcomponents/self-hosted-map.mdMapa de los lugares de una lista a partir de un extracto PMTiles autogestionado; marcadores numerados coinciden con la listaMapLibre perezoso, ruta de teselas HTTP 206, mapa con aria-hidden y equivalentes de texto, sigue el tema. Necesita paquetes npm (aprobación del propietario)
16. ClickableParentcomponents/clickable-parent.mdTarjeta/fila completa clickeable a través de un enlace o botón realÁrea de impacto extendida con ::after, controles secundarios elevados, anillo de foco en el contenedor, 0 KB JS
17. Cardcomponents/card.mdTarjeta de contenido con medios, metadatos, cuerpo y acciones secundariasDOM con encabezado primero, prop headingLevel, diseño con consultas de contenedor, contrato ClickableParent cuando está enlazada

Puerta de Decisión para Componentes No Catalogados (Punto de Decisión Humano)

Cuando un requisito del proyecto o diseño solicite un componente de UI interactivo que no sea uno de los 17 componentes catalogados arriba (por ejemplo: un deslizador de comparación de imágenes Antes/Después, selector de fecha, selector de rango, asistente de pasos o reproductor multimedia personalizado):

[!IMPORTANTE] DETENTE Y PREGUNTA: El agente NUNCA debe instalar silenciosamente librerías de framework del lado del cliente (React, Vue, Svelte), importar paquetes npm de terceros no verificados, ni dejar bloques marcadores de posición de texto temporales (ej. <div class="c-placeholder">).

El agente DEBE pausar y presentar al propietario del proyecto tres opciones distintas:

  1. Opción A: Componente Vainilla Personalizado (Recomendado): Crear un componente .astro a medida y sin dependencias que cumpla con el Contrato de Respaldo para Componentes a Medida a continuación.
  2. Opción B: Línea Base HTML Estática: Implementar un diseño semántico puramente estático (ej. imágenes lado a lado o tarjetas apiladas estándar) con 0 KB JavaScript, omitiendo por completo la mejora interactiva.
  3. Opción C: Adaptación de un Patrón del Catálogo: Evaluar si un patrón existente del catálogo puede satisfacer el requisito (ej. adaptar AccessibleModal en un lightbox de imágenes, o AccessibleTabs en una vista de paneles escalonados).

Contrato de Respaldo para Componentes a Medida

Cuando el propietario del proyecto apruebe la construcción de un componente no catalogado (Opción A), la implementación debe cumplir estas seis reglas; para adaptaciones con framework, usa las reglas de composición, nomenclatura de clases y tokens del framework para los puntos 3–4:

  1. HTML Semántico Primero: Anclar la interfaz a elementos HTML estándar antes de escribir JavaScript (ej. <input type="range"> para deslizadores, <details> para divulgación, <dialog> para superposiciones).
  2. Cero Dependencias de Tiempo de Ejecución Externas: Cero runtimes de frameworks de cliente (sin React/Vue) y cero paquetes de widgets de UI de terceros. Escribe solo TypeScript/JavaScript vainilla cuando la interacción del navegador sea realmente necesaria.
  3. BEM con Ámbito y Propiedades CSS Lógicas: Usa nomenclatura BEM estándar (.c-bloque, .c-bloque__elemento) y propiedades de diseño relativas al flujo (inline-size, block-size, padding-block, margin-inline, inset).
  4. Tokens con Nombres de Espacio y Fallbacks: Nunca codifiques valores hexadecimales. Consume tokens semánticos del anfitrión o propiedades personalizadas con nombres de espacio y fallbacks sensatos (var(--comp-color, var(--color-primary))).
  5. Mejora Progresiva Sin JavaScript: El componente debe permanecer legible, accesible y operativo cuando el JavaScript del cliente esté deshabilitado. Usa @media (scripting: none) o diseños de respaldo CSS nativos (ej. vistas lado a lado o apiladas) para que ningún contenido quede oculto.
  6. Cumplimiento con WCAG 2.2 AA: Mantén objetivos táctiles mínimos de 44px (2.75rem), anillos :focus-visible visibles de alto contraste, nombres accesibles claros (aria-label, <label>), y asegura 0 violaciones de axe-core.

Guía de Carga Selectiva para Agentes

Cuando el usuario solicite implementar o editar uno de los componentes anteriores, no leas todo el catálogo. En su lugar, lee solo el archivo de especificaciones del componente específico necesario (ej. components/accessible-carousel.md).


Verificación de Integración

Verifica la especificación seleccionada en la salida construida/desplegada: semántica y nombres, comportamiento de teclado/foco, transiciones de estado, tratamiento sin JS, inicialización repetida y mapeo de tokens del anfitrión. Las reglas de empaquetado independiente solo se aplican a componentes independientes; los frameworks reutilizan sus primitivas. Ejecuta las comprobaciones/construcción/pruebas configuradas del proyecto y divulga las comprobaciones no disponibles o las brechas de cobertura. 44px es la convención de tamaño objetivo de esta biblioteca, no el umbral de WCAG AA en sí mismo.

Los popups de selección nativos siguen siendo la interfaz de usuario del navegador/SO a menos que el propietario apruebe las compensaciones de un combobox personalizado.

Skills relacionados