Modèles d'interface Astro et bibliothèque de composants portabl…

Implémentez des modèles d'interaction Astro tels que la navigation, les dialogues, les onglets, les filtres, les cartes et le changement de thème. Réutilisez les primitives du framework tout en préservant le contrat de comportement de chaque modèle.

Qu'est-ce que Modèles d'interface Astro et bibliothèque de composants portabl… ?

Ce guide définit un catalogue standardisé de composants d'interface portables et prêts à l'emploi pour les sites Astro. Les exemples autonomes utilisent le modèle de composant portable : zéro dépendance npm externe, zéro runtime de framework client (pas de React/Vue), jetons CSS avec espaces de noms et valeurs de repli intégrées, et amélioration progressive. Pour les projets utilisant un framework, il s'agit de conserver les exigences sémantiques et d'interaction tout en adaptant la composition et le style au contrat sélectionné. La vérification de l'accessibilité est à effectuer dans le projet rendu ; un modèle seul ne garantit pas la conformité WCAG. Parmi les 17 composants catalogués, on trouve un sélecteur de thème, un tiroir de navigation mobile, une barre de recherche, des filtres à puces, une modale accessible, un accordéon, des onglets, un carrousel, un curseur infini, un compteur de statistiques, un lien d'ajout au calendrier, une carte, et un composant parent cliquable. Chaque composant possède son propre fichier de spécifications détaillant son contrat de comportement. Pour les composants interactifs non catalogués, l'agent doit s'arrêter et présenter trois options au propriétaire du projet : créer un composant vanilla personnalisé (sans dépendance), une ligne de base HTML statique, ou adapter un modèle existant. En cas de création, un contrat de repli spécifique s'applique, exigeant HTML sémantique, zéro dépendance externe, BEM avec espaces de noms, et amélioration progressive sans JavaScript.

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

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Modèles d'interface Astro et bibliothèque de composants portables

Ce guide définit le catalogue standardisé de composants d'interface portables et prêts à l'emploi pour les sites Astro.

Les exemples autonomes utilisent le Modèle de composant portable : zéro dépendance npm externe, zéro runtime de framework client (pas de React/Vue), jetons CSS avec espaces de noms et valeurs de repli intégrées, et amélioration progressive. Dans les projets avec framework, conservez les exigences sémantiques et d'interaction tout en adaptant la composition et le style au contrat sélectionné. Vérifiez l'accessibilité dans le projet rendu ; un modèle seul ne garantit pas la conformité WCAG.


Contrats de comportement et composition du framework

Pour un composant dans l'index ci-dessous, utilisez son contrat sémantique et d'interaction : prise en charge du clavier, gestion du focus, éléments natifs, noms accessibles, mises à jour d'état et amélioration progressive. Le contrat du projet/framework sélectionné régit le style, les jetons, les importations et la composition du composant. Les instructions de l'utilisateur restent faisant autorité.

Les exemples utilisent le modèle de composant portable autonome ci-dessous. Utilisez-le lors de l'ajout d'un composant indépendant sans contrat de composition de framework. Lorsqu'un projet possède une bibliothèque établie, adaptez le comportement en utilisant ses primitives appropriées au lieu de dupliquer ses boutons, titres ou contrôles de formulaire. Préservez la sémantique et le comportement requis tout en adaptant les conteneurs et les classes de l'exemple.

Pour un projet construit sur un framework de composants (Lumos, par exemple), utilisez la composition et le style de ce framework ; ses primitives peuvent être importées. La règle d'importation zéro du site autonome et les jetons de repli avec espace de noms ne remplacent pas le contrat propre du framework sélectionné.


Le Modèle de composant portable

Pour les composants portables autonomes, utilisez ces cinq règles. Sur un framework sélectionné, préservez les exigences comportementales et suivez son contrat de composition/style comme décrit ci-dessus :

  1. Zéro Importation Externe/Site : Le fichier du composant ne doit PAS importer de mises en page, boutons ou bibliothèques d'interface client tierces du site. La seule exception cataloguée est SelfHostedMap, qui nécessite un moteur de rendu cartographique et un lecteur de tuiles ; sa spécification liste les paquets, et ils ne sont installés qu'avec l'approbation du propriétaire.
  2. Variables CSS avec espace de noms et valeurs de repli : Ne faites jamais directement référence aux jetons hôtes (ex. var(--color-brand)) dans la feuille de style du composant. Écrivez toujours var(--comp-propriete, <repli>).
  3. BEM avec espace de noms et propriétés logiques CSS : Utilisez la dénomination de classe BEM (.c-bascule-theme, .c-accordion__summary) et les propriétés logiques (inline-size, block-size, padding-inline, margin-block).
  4. Amélioration progressive vanilla idempotente : Les scripts doivent s'exécuter au chargement et se rattacher proprement si les transitions de vue Astro sont actives (document.addEventListener('astro:after-swap', init)).
  5. Cibles tactiles et ARIA : Les boutons et contrôles interactifs doivent avoir des cibles tactiles minimales de 44px (2.75rem) ou 48px (3rem), des états ARIA appropriés (aria-expanded, aria-selected, aria-pressed, aria-controls), et des anneaux de focus clavier.

Index des composants

ComposantFichier de spécificationObjectifContrat clé
1. ThemeTogglecomponents/theme-toggle.mdSélecteur de thème Clair/Sombre sans FOUC et avec morphing SVGScript <head> en ligne + mappage de jetons OKLCH
2. MobileNavDrawercomponents/mobile-nav-drawer.mdTiroir de navigation accessible coulissant avec hamburger animéCibles tactiles 48px, fermeture avec Échap, pas de flou GPU
3. SearchBarcomponents/search-bar.mdChamp de recherche côté client avec bouton d'effacement et annonceur en directrAF debouncing (INP optimal), aria-live, coordinateur d'événements personnalisé
4. FilterChipscomponents/filter-chips.mdBarre de filtres à puces multi-catégories avec états pressés accessiblesrole="group", aria-pressed, coordinateur d'événements personnalisé
5. SearchFilterBarcomponents/search-filter-bar.mdModèle composé combinant SearchBar et FilterChipsBarre d'outils empilée pré-composée, dispositions flex multi-colonnes, portée partagée
6. AccessibleModalcomponents/accessible-modal.mdSuperposition de dialogue accessible utilisant le <dialog> HTML5 natifCalque supérieur natif, clic en arrière-plan, touche Échap, restauration du focus
7. AccessibleAccordioncomponents/accessible-accordion.mdFAQ/Accordéon natif avec expansion de grille CSS fluide<details name="..."> natif, 0 Ko JavaScript
8. AccessibleTabscomponents/accessible-tabs.mdSélecteur d'onglets WAI-ARIA pour niveaux de prix ou vues multi-panneauxNavigation clavier par flèches (Gauche/Droite/Début/Fin)
9. SocialSharecomponents/social-share.mdBarre de partage social respectueuse de la vie privée avec API Web Share100 % conforme RGPD, 0 traqueurs, URL d'intention statiques
10. TableOfContentscomponents/table-of-contents.mdTable des matières pour articles longs avec scrollspySuivi des titres par IntersectionObserver, s'associe à une mise en page d'article
11. AccessibleCarouselcomponents/accessible-carousel.mdCurseur à défilement CSS natif pour avis, cartes ou logosGlissement tactile natif (0 Ko JS), boutons Précédent/Suivant accessibles
12. InfiniteTickercomponents/infinite-ticker.mdBandeau infini CSS pur pour logo/texte avec pause au survol/focusConforme WCAG 2.2.2, piste dupliquée masquée avec aria-hidden
13. StatsCountercomponents/stats-counter.mdBarre de compteur de métriques priorisant HTML avec animation de défilement ease-out0 CLS, repli HTML statique, IntersectionObserver
14. AddToCalendarcomponents/add-to-calendar.mdLien "Ajouter au calendrier" vers un fichier iCalendar généré à la construction.ics statique de même origine + <a download>, RFC 5545 valide, 0 Ko JS
15. SelfHostedMapcomponents/self-hosted-map.mdCarte des lieux d'une liste à partir d'un extrait PMTiles auto-hébergé ; marqueurs numérotés correspondent à la listeMapLibre paresseux, route de tuiles HTTP 206, carte aria-hidden avec équivalents textuels, suit le thème. Nécessite des paquets npm (approbation du propriétaire)
16. ClickableParentcomponents/clickable-parent.mdCarte/ligne entière cliquable via un seul lien ou bouton réelZone de hit étirée ::after, contrôles secondaires relevés, anneau de focus sur le conteneur, 0 Ko JS
17. Cardcomponents/card.mdCarte de contenu avec média, métadonnées, corps et actions secondairesDOM avec titre en premier, prop headingLevel, mise en page par requête de conteneur, contrat ClickableParent lorsqu'elle est liée

Porte de décision pour les composants non catalogués (point de décision humain)

Lorsqu'une exigence de projet ou un design nécessite un composant d'interface interactif qui n'est pas l'un des 17 composants catalogués ci-dessus (par exemple : un curseur de comparaison d'images Avant/Après, un sélecteur de date, un sélecteur de plage, un assistant d'étapes, ou un lecteur multimédia personnalisé) :

[!IMPORTANT] ARRÊTEZ ET DEMANDEZ : L'agent NE doit JAMAIS installer silencieusement des bibliothèques de framework client (React, Vue, Svelte), importer des paquets npm tiers non vérifiés, ou laisser des blocs d'espace réservé de texte temporaire (ex. <div class="c-placeholder">).

L'agent DOIT faire une pause et présenter au propriétaire du projet trois choix distincts :

  1. Option A : Composant vanilla personnalisé (Recommandé) : Créer un composant .astro sur mesure sans dépendance, conforme au Contrat de repli pour composant sur mesure ci-dessous.
  2. Option B : Ligne de base HTML statique : Implémenter une mise en page sémantique purement statique (par exemple, images côte à côte ou cartes empilées standard) avec 0 Ko JavaScript, en omettant entièrement l'amélioration interactive.
  3. Option C : Adaptation d'un modèle du catalogue : Évaluer si un modèle existant du catalogue peut satisfaire l'exigence (par exemple, adapter AccessibleModal en visionneuse d'images, ou AccessibleTabs en vue à panneaux étagés).

Le Contrat de repli pour composant sur mesure

Lorsque le propriétaire du projet approuve la construction d'un composant non catalogué (Option A), l'implémentation doit satisfaire ces six règles ; pour les adaptations de framework, utilisez les règles de composition, de dénomination de classes et de jetons du framework pour les points 3–4 :

  1. HTML sémantique d'abord : Ancrez l'interface sur des éléments HTML standards avant d'écrire du JavaScript (ex. <input type="range"> pour les curseurs, <details> pour la divulgation, <dialog> pour les superpositions).
  2. Zéro dépendance d'exécution externe : Zéro runtime de framework client (pas de React/Vue) et zéro paquet de widgets d'interface tiers. Écrivez du vanilla TypeScript/JavaScript uniquement lorsqu'une interaction navigateur est réellement nécessaire.
  3. BEM avec espace de noms et propriétés logiques CSS : Utilisez la dénomination BEM standard (.c-bloc, .c-bloc__element) et les propriétés de mise en page relatives au flux (inline-size, block-size, padding-block, margin-inline, inset).
  4. Jetons avec espace de noms et valeurs de repli : Ne codez jamais en dur des valeurs hexadécimales. Utilisez des jetons sémantiques hôtes ou des propriétés personnalisées avec espace de noms avec des valeurs de repli sensées (var(--comp-couleur, var(--color-primary))).
  5. Amélioration progressive sans JavaScript : Le composant doit rester lisible, accessible et utilisable lorsque le JavaScript client est désactivé. Utilisez @media (scripting: none) ou des mises en page de repli CSS natives (par exemple, vues côte à côte ou empilées) afin qu'aucun contenu ne soit masqué.
  6. Conformité WCAG 2.2 AA : Maintenez des cibles tactiles minimales de 44px (2.75rem), des anneaux :focus-visible visibles à contraste élevé, des noms accessibles clairs (aria-label, <label>), et assurez 0 violation axe-core.

Conseils de chargement sélectif pour les agents

Lorsque l'utilisateur demande d'implémenter ou de modifier l'un des composants ci-dessus, ne lisez pas l'intégralité du catalogue. Lisez plutôt uniquement le fichier du composant spécifique nécessaire (par exemple components/accessible-carousel.md).


Vérification de l'intégration

Vérifiez la spécification sélectionnée sur la sortie construite/déployée : sémantique et noms, comportement clavier/focus, transitions d'état, traitement sans JavaScript, initialisation répétée et mappage des jetons hôtes. Les règles d'empaquetage autonome s'appliquent uniquement aux composants autonomes ; les frameworks réutilisent leurs primitives. Exécutez la vérification/construction/tests configurés du projet et divulguez les vérifications non disponibles ou les lacunes de couverture. 44px est la convention de taille de cible de cette bibliothèque, pas le seuil WCAG AA lui-même.

Les popups de sélection natifs restent l'interface du navigateur/OS à moins que le propriétaire n'approuve les compromis d'une boîte combinée personnalisée.

Skills associés