Communitygithub.com

surfaces

Ce skill définit l'apparence des surfaces UI : remplissage, bordure, ombre, rayon, états et icônes. Il établit des recettes précises pour les ombres en mode clair et sombre, et spécifie quand utiliser une ombre ou une bordure.

Qu'est-ce que surfaces ?

Le skill **surfaces** fournit un système de décision pour les surfaces d'interface utilisateur, couvrant le remplissage (fill), les bords, les ombres, les rayons de bordure, les états interactifs et les icônes. Son objectif est de garantir la cohérence visuelle : deux écrans n'auront jamais deux cartes différentes. Il s'applique à tout projet web et peut être intégré à des agents comme Claude Code ou Cursor. La logique de décision suit huit étapes : déterminer si une surface est nécessaire, choisir un niveau d'élévation (page, raised, floating, overlay), opter pour une ombre ou une bordure, appliquer le bon rayon (concentrique), définir les états (hover, pressed, selected, disabled, focus-visible), choisir le traitement des icônes (currentColor, stroke adapté), n'utiliser un matériau flou que pour des éléments flottants, et gérer les bords du défilement. Des tableaux de tokens détaillent les ombres pour chaque niveau en mode clair et sombre, avec des règles strictes comme l'utilisation d'un anneau (ring) + drop tight (flou ≤ 8px, décalage ≤ 6px) et une bordure transparente de 1px pour le mode forced-colours. Les paires 'Broken / Fixed' illustrent les erreurs courantes et leurs corrections (ex: remplacer une bordure d'ombre par un ring + transparent border, utiliser `outline` pour le focus à la place de `outline: none`). Les vérifications finales incluent le rendu en light/dark, les états interactifs et le mode forced-colours.

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

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 surfaces ?

Ce skill détermine la composition de chaque élément : son remplissage, son bord, son ombre, son rayon, ses états et ses icônes. Il sélectionne parmi une courte liste de recettes, si bien que deux écrans n'auront jamais deux cartes différentes.

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

Décider dans cet ordre

  1. Une surface est-elle nécessaire ? Supprimez avant d'ajouter. Un titre avec de l'espace autour n'a pas besoin de carte. Ne nichez jamais une carte dans une carte. Pourquoi : chaque conteneur ajoute un bord que l'œil doit lire.
  2. Quel niveau ? Page, raised (surélevé), floating (flottant) ou overlay (superposé). Un niveau par élément, choisi pour ce qu'il fait, non pour son impact visuel. elevation.md.
  3. Qu'est-ce qui dessine le bord ? L'élévation utilise un anneau d'ombre. La structure utilise une bordure. Jamais les deux sur un même bord. elevation.md.
  4. Quel rayon ? Prenez le jeton correspondant au rôle de l'élément, puis rendez les rayons imbriqués concentriques. elevation.md.
  5. Quels états ? Concevez les états hover, pressed, selected, disabled et focus-visible comme des modifications de la surface, avant de peaufiner l'état par défaut. states-and-icons.md.
  6. Quel traitement des icônes ? Un seul ensemble, currentColor, un trait adapté au texte. states-and-icons.md.
  7. Un matériau est-il autorisé ? Uniquement un chrome flottant au-dessus du contenu défilant. materials-and-edges.md.
  8. Bords du défilement. Séparateurs, dégradés, overscroll. materials-and-edges.md.

Les quatre niveaux

NiveauPourLumineuxSombre
PageLe fondRemplissage de fond, pas d'ombreRemplissage le plus foncé, pas d'ombre
RaisedCartes, contrôles, option choisieBlanc, anneau + 1px drop + 3px tight dropUn cran plus clair, anneau blanc, tight black drop
FloatingMenus, popovers, info-bulles, toastsBlanc, anneau + 1px drop + 4px tight dropDeux crans plus clair, anneau blanc, tight black drop
OverlayBoîtes de dialogue, panneaux, palette de commandes (avec un scrim)Blanc, anneau + 1px drop + 6px tight dropTrois crans plus clair, anneau blanc, tight black drop

Les jetons exacts se trouvent dans elevation.md. Les règles qui les sous-tendent :

  • Un anneau plus un tight drop. Flou ≤ 8px, décalage ≤ 6px, drops avec un spread négatif. Pourquoi : les grands flous doux sont lus comme une lueur, salissent la page et semblent générés.
  • Le mode sombre s'élève en s'éclaircissant. Les ombres sont à peine visibles sur fond sombre, donc la clarté porte la hauteur et un anneau blanc à faible alpha porte le bord.
  • Les ombres sont translucides et monochromes. Les gris opaques laissent un halo. Les drops sombres restent noirs.
  • Les éléments frères partagent un même niveau. Les cartes d'une rangée ont une ombre, un rayon, un espacement identiques.
  • Le survol modifie le remplissage, pas l'ombre.

Règles sans référence nécessaire

  • Les bordures montrent la structure, les ombres montrent l'élévation. Les séparateurs, les champs de saisie, les cellules de tableau et les états sélectionnés conservent des bordures. Une carte dont la bordure n'existe que pour la soulever reçoit un anneau à la place.
  • Gardez border: 1px solid transparent sous un anneau d'ombre. Pourquoi : le mode forced-colours supprime les ombres, et la bordure dessine quand même un bord.
  • Les images reçoivent un contour interne de 1px : outline: 1px solid noir à 10 % (blanc à 10 % en mode sombre), outline-offset: -1px. Jamais de couleur teintée, qui apparaît comme une frange. Ignorez les logos et les œuvres transparentes.
  • Rayon concentrique. Extérieur = intérieur + espacement (+ bordure), jusqu'à 24 px d'espacement. Au-delà, ce sont des surfaces distinctes.
  • Le focus est un anneau, jamais rien. :focus-visible affiche un contour de 2 px de couleur d'accent avec un décalage de 2 px ; les champs le reçoivent à fleur, comme un bord d'accent de 2 px sans espace. outline: none sans remplacement est un bogue. L'anneau ne prend pas d'espace de disposition.
  • Les contrôles désactivés n'ont pas de survol, d'enfoncement ni de mise à l'échelle.
  • Icônes : un seul ensemble par surface, currentColor, contour par défaut et rempli lorsqu'actif. Le trait suit le poids de la police voisine, 1,5 px pour 400 jusqu'à 2 px pour 600.
  • Flou d'arrière-plan uniquement sur le chrome flottant. Jamais sur le contenu, les cartes ou les tableaux.
  • Les superpositions défilables (boîtes de dialogue, tiroirs, menus) reçoivent overscroll-behavior: contain.

Paires

CasséCorrigéPourquoi
border: 1px solid #e5e5e5 sur une cartebox-shadow: var(--elev-raised); border: 1px solid transparentUne bordure de profondeur devient un anneau ; les couleurs forcées dessinent toujours un bord
box-shadow: 0 10px 40px rgba(0,0,0,.2)0 0 0 1px a.08, 0 1px 2px a.12, 0 4px 8px -4px a.16Précis et net vaut mieux que grand et flou
Carte sombre avec 0 8px 24px #000Remplissage plus clair plus 0 0 0 1px oklch(1 0 0 / .08)Les ombres disparaissent sur fond sombre ; la clarté montre la hauteur
Rayon de carte 8, rayon d'image intérieure 8, espacement 8Intérieur 8, extérieur 16Les coins concentriques conservent un espacement uniforme
<img> fondue dans une carte blancheoutline: 1px solid oklch(0 0 0 / .1); outline-offset: -1pxLe bord se lit sans bordure
button:focus { outline: none }button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px }Les utilisateurs de clavier gardent leur repère
Trait d'icône 1,5 px à côté d'une étiquette en poids 600Trait de 2 pxL'épaisseur du trait correspond au poids de la tige
Icônes remplies dans chaque emplacement de barre d'outilsContour par défaut, rempli pour l'élément actifLe remplissage est le signal d'état
backdrop-filter: blur(20px) sur une carteUne surface opaqueLe flou appartient au chrome flottant au-dessus du contenu défilant

Avant de terminer

MotifCorrection
box-shadow avec flou > 8 px ou alpha > .2 sur une interface claireUtilisez un jeton de niveau
border et box-shadow faisant le même travailAnneau plus bordure transparente uniquement
Anneau d'ombre sans border: 1px solid transparentAjoutez-le
Même border-radius sur un parent et son enfant avec espacementinterne + espacement pour le parent
outline: none ou outline: 0 sans remplacement par :focus-visibleAjoutez l'anneau
:focus (pas :focus-visible) stylisant un anneauPassez à :focus-visible
border-width changeant dans un étatCouleur, remplissage ou bordure transparente de même largeur
fill="#…" ou stroke="#…" codé en dur dans une icônecurrentColor
Deux bibliothèques d'icônes importées sur un même écranUne seule
backdrop-filter en dehors d'une barre collante, d'une barre latérale ou d'un menu flottantSupprimez-le
Liste superposée sans overscroll-behavior: containAjoutez-le
Coupure franche au bord d'un défileur, ou ombre coupée par overflow: hiddenDégradé du bord ; ajoutez un espacement au défileur

Vérifiez en rendant les modes clair et sombre à 2× et en recadrant un bord de chaque niveau. Survolez, appuyez, tabulez pour le focus, sélectionnez et désactivez chaque contrôle et comparez la taille de la boîte avant et après. Activez les couleurs forcées (devtools de Chrome, émulation de rendu) et confirmez que chaque carte a toujours un bord.

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/layout

Structure and space in product UI on the web. It sets the spacing scale, grouping, alignment, density (compact or comfortable), hit areas, app shells (sidebar, toolbar, content, inspector), max widths, container-query responsiveness, dropdown and popover sizing, room for long and translated text, layout stability (no shift on load) and sticky elements that must not cover focus.

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…

Skills associés