Padrões de Interface Astro & Biblioteca de Componentes Portáteis

Implemente padrões de interação do Astro, como navegação, diálogos, abas, filtros, cartões e alternância de temas. Reutilize primitivas do framework preservando o contrato comportamental de cada padrão.

O que é Padrões de Interface Astro & Biblioteca de Componentes Portáteis?

Esta habilidade fornece um catálogo padronizado de 17 componentes de interface portáteis e prontos para uso, projetados para sites construídos com Astro. Cada componente segue um contrato comportamental rigoroso, garantindo acessibilidade, desempenho e progressão gradual, sem depender de bibliotecas de terceiros ou runtimes de frameworks cliente (como React ou Vue). A abordagem principal é o Modelo de Componente Portátil, que exige zero dependências externas de npm, uso de variáveis CSS com fallback, nomenclatura BEM com escopo e aprimoramento progressivo com JavaScript vanilla. O guia também oferece um processo de decisão para componentes não catalogados, onde o agente deve parar e consultar o proprietário do projeto, oferecendo três opções: criar um componente personalizado sem dependências, implementar uma linha de base HTML estática ou adaptar um padrão existente do catálogo. A habilidade é útil para desenvolvedores que desejam construir interfaces consistentes e acessíveis no Astro sem adicionar complexidade desnecessária.

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

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que Padrões de Interface Astro & Biblioteca de Componentes Portáteis faz?

Este guia define o catálogo padronizado de componentes de interface portáteis e prontos para uso para sites Astro.

Os exemplos independentes usam o Modelo de Componente Portátil: zero dependências externas de npm, zero runtimes de frameworks cliente (sem React/Vue), tokens CSS com namespace e fallbacks embutidos, e aprimoramento progressivo. Em projetos com framework, mantenha os requisitos semânticos e de interação enquanto adapta a composição e o estilo ao contrato selecionado. Verifique a acessibilidade no projeto renderizado; um modelo sozinho não estabelece conformidade com as WCAG.


Contratos comportamentais e composição do framework

Para um componente listado no índice abaixo, use seu contrato semântico e de interação: suporte a teclado, gerenciamento de foco, elementos nativos, nomes acessíveis, atualizações de estado e aprimoramento progressivo. O contrato do projeto/framework selecionado governa a estilização, tokens, importações e composição do componente. As instruções do usuário permanecem autoritativas.

Os exemplos usam o modelo de componente portátil independente abaixo. Use-o ao adicionar um componente independente sem um contrato de composição de framework. Quando um projeto tem uma biblioteca estabelecida, adapte o comportamento usando suas primitivas apropriadas em vez de duplicar seus botões, cabeçalhos ou controles de formulário. Preserve a semântica e o comportamento necessários enquanto adapta os wrappers e classes do exemplo.

Para um projeto construído sobre um framework de componentes (Lumos, por exemplo), use a composição e estilização desse framework; suas primitivas podem ser importadas. A regra independente de zero importações do site e os tokens de fallback com namespace não substituem o contrato do framework selecionado.


O Modelo de Componente Portátil

Para componentes portáteis independentes, use estas cinco regras. Em um framework selecionado, preserve os requisitos comportamentais e siga seu contrato de composição/estilização conforme descrito acima:

  1. Zero Importações Externas/do Site: O arquivo do componente NÃO deve importar layouts, botões ou bibliotecas de interface de terceiros do site. A única exceção catalogada é SelfHostedMap, que precisa de um renderizador de mapa e leitor de tiles; sua especificação lista os pacotes, e eles são instalados apenas com a aprovação do proprietário.
  2. Variáveis CSS com Namespace e Fallback: Nunca faça referência direta a tokens do host (ex: var(--color-brand)) dentro da folha de estilo do componente. Sempre escreva var(--comp-property, <fallback>).
  3. BEM com Escopo e Propriedades CSS Lógicas: Use nomenclatura BEM (.c-theme-toggle, .c-accordion__summary) e propriedades lógicas (inline-size, block-size, padding-inline, margin-block).
  4. Aprimoramento Progressivo Vanilla Idempotente: Os scripts devem executar no carregamento e se religar corretamente se as Transições de Visualização do Astro estiverem ativas (document.addEventListener('astro:after-swap', init)).
  5. Alvos de Toque e ARIA: Botões e controles interativos devem ter alvos de toque mínimos de 44px (2.75rem) ou 48px (3rem), estados ARIA adequados (aria-expanded, aria-selected, aria-pressed, aria-controls) e anéis de foco de teclado.

Índice de Componentes

ComponenteArquivo de EspecificaçãoPropósitoContrato Principal
1. ThemeTogglecomponents/theme-toggle.mdAlternador de tema Claro/Escuro sem FOUC e com morfismo SVGScript inline no <head> + mapeamento de tokens OKLCH
2. MobileNavDrawercomponents/mobile-nav-drawer.mdGaveta de navegação acessível com animação de hambúrguerAlvos de toque de 48px, fechamento com tecla Esc, sem lag de desfoque GPU
3. SearchBarcomponents/search-bar.mdCampo de busca no lado do cliente com botão limpar e anunciador ao vivoDebounce com rAF (INP ideal), aria-live, coordenador de eventos personalizado
4. FilterChipscomponents/filter-chips.mdBarra de filtros por chips de múltiplas categorias com estados pressionados acessíveisrole="group", aria-pressed, coordenador de eventos personalizado
5. SearchFilterBarcomponents/search-filter-bar.mdPadrão composto combinando SearchBar e FilterChipsBarra de ferramentas empilhada pré-composta, layouts flex de múltiplas colunas, escopo compartilhado
6. AccessibleModalcomponents/accessible-modal.mdSobreposição de diálogo acessível usando <dialog> nativo do HTML5Camada superior nativa, clique no fundo, tecla Esc, restauração de foco
7. AccessibleAccordioncomponents/accessible-accordion.mdAcordeão/FAQ nativo com expansão suave em grid CSS<details name="..."> nativo, 0 KB de JavaScript
8. AccessibleTabscomponents/accessible-tabs.mdAlternador de abas WAI-ARIA para níveis de preço ou visões de múltiplos painéisNavegação por setas do teclado (Esquerda/Direita/Home/End)
9. SocialSharecomponents/social-share.mdBarra de compartilhamento social com foco em privacidade usando Web Share API100% seguro para GDPR, 0 rastreadores, URLs de intenção estáticas
10. TableOfContentscomponents/table-of-contents.mdSumário para artigos longos com scrollspyRastreamento de cabeçalhos com IntersectionObserver, emparelhado com layout de artigo
11. AccessibleCarouselcomponents/accessible-carousel.mdCarrossel com scroll snap CSS nativo para avaliações, cartões ou logotiposDeslize toque nativo (0 KB JS), botões Anterior/Próximo acessíveis
12. InfiniteTickercomponents/infinite-ticker.mdMarquee infinito de texto/logotipo em CSS puro com pausa ao passar o mouse/focoConforme WCAG 2.2.2, faixa duplicada oculta com aria-hidden
13. StatsCountercomponents/stats-counter.mdBarra de contadores de métricas com animação de rolagem com saída suave0 CLS, fallback HTML estático, IntersectionObserver
14. AddToCalendarcomponents/add-to-calendar.mdLink "Salvar a data" para um arquivo iCalendar gerado em tempo de construção.ics estático de mesma origem + <a download>, válido RFC 5545, 0 KB JS
15. SelfHostedMapcomponents/self-hosted-map.mdMapa dos locais de uma lista a partir de um extracto PMTiles auto-hospedado; pinos numerados correspondem à listaMapLibre lazy, rota de tile HTTP 206, mapa com aria-hidden e equivalentes textuais, segue o tema. Requer pacotes npm (aprovação do proprietário)
16. ClickableParentcomponents/clickable-parent.mdCartão/linha inteiro clicável através de um único link ou botão realÁrea de clique esticada com ::after, controles secundários elevados, anel de foco no contêiner, 0 KB JS
17. Cardcomponents/card.mdCartão de conteúdo com mídia, metadados, corpo e ações secundáriasDOM com cabeçalho primeiro, prop headingLevel, layout baseado em consulta de contêiner, contrato ClickableParent quando vinculado

Portão de Decisão para Componentes Não Catalogados (Ponto de Decisão Humano)

Quando um requisito ou design de projeto exigir um componente de interface interativo que não seja um dos 17 componentes catalogados acima (por exemplo: um slider de comparação Antes/Depois, seletor de data, seletor de intervalo, assistente passo a passo ou player de mídia personalizado):

[!IMPORTANT] PARE E PERGUNTE: O agente NUNCA deve instalar silenciosamente bibliotecas de framework cliente (React, Vue, Svelte), importar pacotes npm de terceiros não verificados ou deixar blocos temporários de texto placeholder (ex: <div class="c-placeholder">).

O agente DEVE pausar e apresentar ao proprietário do projeto três opções distintas:

  1. Opção A: Componente Vanilla Personalizado (Recomendado): Criar um componente .astro personalizado, sem dependências, em conformidade com o Contrato de Fallback para Componente Sob Medida abaixo.
  2. Opção B: Linha de Base HTML Estática: Implementar um layout semântico puramente estático (ex: imagens lado a lado ou cartões empilhados padrão) com 0 KB de JavaScript, omitindo totalmente o aprimoramento interativo.
  3. Opção C: Adaptação de Padrão do Catálogo: Avaliar se um padrão existente do catálogo pode atender ao requisito (ex: adaptar AccessibleModal para uma lightbox de imagens, ou AccessibleTabs para uma visão de painéis em etapas).

O Contrato de Fallback para Componente Sob Medida

Quando o proprietário do projeto aprovar a construção de um componente não catalogado (Opção A), a implementação deve satisfazer estas seis regras; para adaptações de framework, use as regras de composição, nomenclatura de classes e tokens do framework para os itens 3–4:

  1. HTML Semântico Primeiro: Baseie a interface em elementos HTML padrão antes de escrever JavaScript (ex: <input type="range"> para sliders, <details> para divulgação, <dialog> para sobreposições).
  2. Zero Dependências de Runtime Externas: Zero runtimes de framework cliente (sem React/Vue) e zero pacotes de widget de interface de terceiros. Escreva apenas TypeScript/JavaScript vanilla puro quando a interação do navegador for realmente necessária.
  3. BEM com Escopo e Propriedades CSS Lógicas: Use nomenclatura BEM padrão (.c-block, .c-block__element) e propriedades de layout relativas ao fluxo (inline-size, block-size, padding-block, margin-inline, inset).
  4. Tokens com Namespace e Fallback: Nunca codifique valores hexadecimais. Consuma tokens semânticos do host ou propriedades personalizadas com namespace com fallbacks sensatos (var(--comp-color, var(--color-primary))).
  5. Aprimoramento Progressivo Sem JavaScript: O componente deve permanecer legível, acessível e operável quando o JavaScript do cliente estiver desabilitado. Use @media (scripting: none) ou layouts de fallback CSS nativos (ex: visões lado a lado ou empilhadas) para que nenhum conteúdo seja ocultado.
  6. Conformidade WCAG 2.2 AA: Mantenha alvos de toque mínimos de 44px (2.75rem), anéis :focus-visible visíveis de alto contraste, nomes acessíveis claros (aria-label, <label>) e garanta 0 violações do axe-core.

Orientação de Carregamento Seletivo para Agentes

Quando o usuário solicitar a implementação ou edição de um dos componentes acima, não leia o catálogo inteiro. Em vez disso, leia apenas o arquivo do componente específico necessário (ex: components/accessible-carousel.md).


Verificação de Integração

Verifique a especificação selecionada na saída construída/implantada: semântica e nomes, comportamento de teclado/foco, transições de estado, tratamento sem JavaScript, inicialização repetida e mapeamento de tokens do host. As regras de empacotamento independente aplicam-se apenas a componentes independentes; frameworks reutilizam suas primitivas. Execute os comandos de verificação/build/testes configurados do projeto e divulgue verificações indisponíveis ou lacunas de cobertura. 44px é a convenção de tamanho de alvo desta biblioteca, não o limite da WCAG AA em si.

Popups de seleção nativos permanecem como interface do navegador/SO, a menos que o proprietário aprove as compensações de uma combobox personalizada.

Habilidades Relacionadas