CommunityImagegithub.com

Layout

Structure et espacement dans l'interface utilisateur produit sur le Web. Définit l'échelle d'espacement, le regroupement, l'alignement, la densité (compact ou confortable), les zones de clic, les shells d'applications (barre latérale, barre d'outils, contenu, inspecteur), les largeurs maximales, la réactivité par conteneur, le dimensionnement des menus déroulants et des popovers, l'espace pour les textes longs et traduits, la stabilité de la mise en page (pas de décalage au chargement) et les éléments collants qui ne doivent pas masquer le focus.

Qu'est-ce que Layout ?

Ce skill de mise en page pour agents IA (compatible avec Claude Code, Cursor, Codex et autres) standardise la structure et l'espacement des interfaces utilisateur produit sur le web. Il définit un processus de décision en huit étapes — de la définition du shell applicatif (barre latérale, barre d'outils, contenu, inspecteur) à la mesure finale des pixels rendus — en passant par la largeur des colonnes, l'espacement via une échelle unique basée sur 4px, l'alignement, la densité, l'adaptation aux données extrêmes, la réactivité par conteneur et la vérification visuelle à 2×. Le skill interdit les valeurs d'espacement arbitraires : seuls les pas prédéfinis de l'échelle (de `--space-xs` à `--space-4xl`) sont autorisés, avec des dérogations limitées (1–2px) pour les ajustements optiques. Il impose des règles strictes : grouper d'abord par l'espace, supprimer les lignes avant d'en ajouter, ordre visuel = ordre DOM, propriétés logiques pour la prise en charge RTL, et stabilité absolue (aucun décalage au survol, à la sélection ou au chargement). Un tableau de paires "avant/après" illustre les erreurs fréquentes (gap unique entre et dans les groupes, valeurs hors échelle, cibles cliquables trop petites, menus à largeur fixe, media queries basées sur l'écran au lieu du conteneur, images sans dimensions, en-têtes collants sans marge de défilement). Le skill fournit également une checklist de validation finale à rechercher dans le diff, ainsi qu'un protocole de mesure : rendu à 2× à 390px et à la largeur maximale du shell, script de vérification, parcours clavier avec chrome collant, et test des chaînes les plus longues.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nkurunziza-saddy/hmm-interfaces/tree/HEAD/layout

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · 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

Que fait Layout ?

Ce skill décide où placer les éléments, à quelle distance les séparer et quelle taille leur donner. Il prend les mêmes décisions dans le même ordre, et vérifie le résultat par rapport aux pixels rendus.

Avant toute décision, appliquez product-ui §1 (le journal de goût et la priorité) et §5 (quel skill possède quoi).

Décider dans cet ordre

  1. Shell. Nommez les régions de l'écran : barre latérale, barre d'outils, contenu, inspecteur. Chaque région est un propriétaire de défilement ou aucun. Détails et largeurs : shell-and-responsive.md. Pourquoi : le shell fixe toutes les largeurs dans lesquelles la mise en page intérieure doit s'inscrire.
  2. Largeur et mesure. Définissez la colonne de contenu en fonction de ce qu'elle contient : formulaire 440px, lecture 720px avec texte plafonné à la mesure type (66ch), données 1200px. Une colonne ne s'étire jamais parce que l'écran est large. Pourquoi : au-delà de 75 caractères, une ligne perd le lecteur, et un formulaire étiré envoie les yeux traverser l'écran.
  3. Espace. Utilisez l'échelle ci-dessous et rien d'autre. Groupez d'abord, avec de l'espace ; ajoutez un fond, puis une ligne, seulement là où l'espace ne peut pas porter. spacing-and-density.md.
  4. Aligner. Choisissez les bords partagés et placez tout sur eux. Un écart de 1 à 4px est un bug. Corrigez optiquement là où la géométrie semble fausse. spacing-and-density.md.
  5. Taille. Choisissez la densité pour la région, puis les zones de clic. spacing-and-density.md.
  6. Données dans le pire cas. Redimensionnez la boîte pour le contenu le plus long, le plus court, manquant, traduit et encore en chargement avant de dire que c'est fini. stability-and-text.md.
  7. Adapter. Faites réagir la structure à son conteneur, pas à l'appareil. shell-and-responsive.md.
  8. Mesurer. Rendez à 2×, mesurez les écarts et les bords, corrigez ce que les pixels montrent. measure.md.

L'échelle

Une seule échelle, base 4px. N'écrivez jamais une valeur d'espacement qui n'est pas un pas. Pourquoi : des valeurs uniques (10px, 14px, 18px) rendent le rythme impossible à voir et impossible à maintenir.

TokenpxUtilisation typique
--space-xs4étiquette par rapport à sa description ; icône par rapport à l'étiquette dans un chip
--space-sm8éléments dans un groupe ; remplissage bloc du contrôle
--space-md12entre contrôles bordés ; remplissage en ligne du contrôle
--space-lg16entre champs ; remplissage carte compacte
--space-2020entre blocs dans une carte
--space-xl24entre groupes ; remplissage carte confortable
--space-2xl32entre sections
--space-3xl48au-dessus du premier titre d'une page
--space-4xl64en dessous du dernier bloc d'une page

Les ajustements de 1 à 2px pour l'alignement optique sont les seules valeurs hors échelle. Nommez-les (--play-nudge: 2px).

Règles qui n'ont besoin d'aucune référence

  • Grouper avec de l'espace. La rupture entre les groupes est d'au moins 2× l'écart à l'intérieur d'un groupe : 8px à l'intérieur signifie 16px ou plus entre. Un espacement égal partout rend le regroupement ambigu, et cette ambiguïté est un bug fonctionnel.
  • Supprimer les lignes avant d'en ajouter. D'abord l'espace, ensuite un fond, enfin un séparateur, et seulement pour les données denses. Pourquoi : chaque ligne coûte de l'attention pour la même information que l'espace donne gratuitement.
  • L'espace au-dessus est égal à l'espace en dessous pour tout ce qui se trouve entre deux choses. Pourquoi : une chose plus proche d'un voisin donne l'impression de lui appartenir.
  • Les contrôles doivent ressembler à des contrôles. Un bouton, un lien ou un interrupteur a une forme, un soulignement ou une position dans la barre d'outils. Le texte statique ne partage jamais ces caractéristiques. Pourquoi : un contrôle stylisé comme du texte se cache, et du texte stylisé comme un contrôle collecte des clics morts.
  • Les actions se trouvent au-dessus des données sur lesquelles elles agissent, jamais en dessous. Un contrôle qui définit quelque chose se trouve à côté.
  • Le contenu principal passe en premier et en tête. L'ordre visuel est égal à l'ordre DOM : jamais order, row-reverse ou placement par grille pour réorganiser le contenu. Pourquoi : l'ordre du clavier et du lecteur d'écran suit le DOM.
  • Propriétés logiques (margin-inline-start, padding-block, inset-inline-end, text-align: start) pour tout ce qui se reflète. Pourquoi : le RTL fonctionne alors sans une deuxième feuille de style.
  • Ne jamais placer de contrôles critiques dans le bord inférieur d'une fenêtre ou d'une barre latérale. Pourquoi : les gens poussent les fenêtres partiellement hors de l'écran.
  • Le défilement montre ce qui est caché. Le contenu passé un bord reçoit un indice visible : un aperçu de 16 à 32px ou un dégradé.
  • Rien ne bouge. Le survol, la sélection et le focus ne changent jamais la taille d'un élément. Les données chargées prennent la boîte que le squelette détenait.

Paires

CasséCorrigéPourquoi
gap: 12px dans le formulaire et gap: 12px entre ses fieldsetgap: 8px à l'intérieur, gap: 24px entreLes groupes ont besoin d'une rupture d'au moins 2×
padding: 10px 14pxpadding: var(--space-sm) var(--space-md)Pas uniquement
Titre à x=24, description à x=26Les deux à x=24Un écart de 1 à 4px est perçu comme une erreur
Bouton icône 16×16 avec padding: 0Glyphe 16px, ::before { inset: -12px } pour une cible de 40pxLa cible de la souris est de 40px
.row + .row { margin-top: 8px } avec survol et clic sur les lignes.row { padding-block: 4px }, pas de margeUn écart entre les lignes est une zone morte et fait vaciller le survol
.menu { width: 200px }width: max-content; min-width: 160px; max-width: 320pxLe menu épouse son étiquette la plus longue
@media (max-width: 768px) sur une carte@container (width < 400px) sur le parent de la carteUne carte dans une barre latérale étroite a besoin de sa propre largeur, pas de celle de l'écran
<img src> sans taille, puis une carte qui sautewidth, height ou aspect-ratio définisLa boîte existe avant les octets
En-tête collant, ancre arrive en dessousscroll-padding-block-start: 56px sur le défileurLe focus et les ancres ne se retrouvent jamais sous le chrome

Avant de terminer

Recherchez ces motifs dans le diff, puis vérifiez.

MotifCorrection
margin, padding ou gap avec une valeur hors de l'échellePas le plus proche
Une seule valeur gap utilisée à l'intérieur et entre les groupesIntérieur ≤ moitié de entre
Bouton uniquement icône de moins de 24px, ou de moins de 40px sans ::beforeÉtendre avec un pseudo-élément
gap ou margin entre des lignes cliquables ou des éléments de menuPadding à l'intérieur de l'élément
width fixe sur un menu, un bouton ou une zone de textemax-content, min-width, max-width ; min-height pour le texte
@media (max-width à l'intérieur d'un composant réutilisable@container sur son parent
height: 100vh pour un shell100dvh
Piste 1fr ou enfant flex contenant du texte longminmax(0, 1fr) ou min-width: 0
margin-left, padding-right, left: 0, text-align: left dans une UI en miroirForme logique
En-tête ou pied de page collant sans scroll-padding-blockDéfinissez-le à la hauteur du chrome
Hauteur de ligne squelette ou largeurs de colonne différentes du chargéFaites-les correspondre
<img> sans dimensions ni aspect-ratioAjoutez-en un

Vérifiez avec measure.md : rendez à 2× à 390px et à la largeur la plus large du shell, exécutez le script, recadrez chaque candidat et comptez les pixels. Ensuite, tabulez à travers l'écran avec le chrome collant en place, et chargez les chaînes les plus longues. Signalez ce que vous n'avez pas pu vérifier comme non vérifié.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

nkurunziza-saddy/break

Stress-tests a piece of UI with worst-case data and every reachable state, then reports what broke with a numbered fix for each. Use it when the user types /break, or asks to "break this", "stress-test", "try the worst case", "what happens with long names", "check the empty and error states" or "find the edge cases" on a component or screen.

nkurunziza-saddy/motion

Builds motion for product UI on the web. It decides whether something should move at all, then why, which tool (CSS transition, WAAPI, Motion, spring), which properties, curve, duration, interruption, exit and reduced-motion path, and it writes the code. Also covers stagger and choreography, gestures (drag, flick, sheets), motion tokens and animation performance.

nkurunziza-saddy/pick-library

Picks the right library for a frontend task from a curated, status-checked list, instead of hand-rolling it or installing an abandoned package. Use it when the user asks "what should I use for…", "is there a library for…", or names a package, and when you are about to build a toast, command menu, drawer, date picker, table, virtual list, drag and drop, chart, OTP input, animated number, theme switch, form validation…

nkurunziza-saddy/surfaces

What product UI is made of on the web. It sets elevation levels with exact shadow recipes for light and dark mode, when to use a shadow and when a border, the transparent border for forced-colours mode, a small radius scale with concentric nesting, image outlines, every interactive state as a surface change (hover, pressed, selected, disabled, focus-visible), icons (one set, currentColor, outline and fill, stroke tha…

Skills associés