Communitygithub.com

Adamparishspok/skills

Consolider plusieurs applications ou prototypes en une bibliothèque de composants partagée sans aplatir leurs apparences. Cela couvre la recherche de composants locaux dupliqués (boutons, selects, champs, modales, pagers, toasts), la création de composants partagés basés sur des tokens pour que chaque suite ou application définisse ses propres mesures, le mappage des noms de variantes, la décision de ce qui reste spécifique à l'application, et les pièges de tailwind-merge qui brisent silencieusement les tokens personnalisés.

Qu'est-ce que skills ?

Cette compétence est conçue pour les développeurs qui maintiennent plusieurs applications partagant des éléments d'interface utilisateur redondants comme des boutons, des selects ou des modales. Elle fournit une méthode systématique pour consolider ces composants dans une bibliothèque partagée tout en préservant l'identité visuelle de chaque application grâce à des tokens de thème. Elle couvre l'inventaire des composants dupliqués, la tokenisation des mesures (hauteurs, espacements, rayons), le mappage des noms de variantes, la décision de ce qui reste spécifique à l'application, et les pièges de tailwind-merge avec les tokens personnalisés. La compétence inclut des exemples de code concrets, des stratégies de test par régression visuelle et des astuces pour gérer la validation et le focus des champs de formulaire. Elle s'applique à toute stack utilisant Tailwind CSS, shadcn/ui, et une fonction utilitaire `cn()` basée sur tailwind-merge.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Adamparishspok/skills/tree/HEAD/skills/multi-app-design-system

Demander à votre IA préférée

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

Documentation

Plusieurs applications, un seul système

L'échec habituel : une bibliothèque est construite pour l'application A, les boutons de l'application B sont 4 pixels plus hauts et 2 pixels plus arrondis, donc B fork le bouton "juste pour cette fois". Cinq applications plus tard, il y a six boutons, huit selects et trois modales, qui font tous le même travail.

Rendez le composant partagé basé sur des tokens : il comporte le comportement, le balisage et les états, et chaque thème fournit ses mesures. Consolidez ensuite application par application.

Composants basés sur des tokens

Lisez chaque mesure qui diffère entre les applications depuis un token de thème :

@theme {
  --spacing-btn-sm: 1.75rem;  --spacing-btn-px-sm: 0.625rem;
  --spacing-btn-md: 2.25rem;  --spacing-btn-px-md: 0.875rem;
  --spacing-field: 2.125rem;  /* hauteur input / select */
  --text-label: 0.8125rem;
}
md: "h-btn-md px-btn-px-md text-sm",
icon: "size-btn-md",

Ensuite :

  • Une suite surcharge les tokens une fois dans son thème, et chaque application de la suite obtient son propre contrôle mesuré.
  • Le rayon, les remplissages et les ombres sont déjà des tokens (rounded-field, bg-accent, --shadow-card).
  • Peignez les remplissages comme une couleur plus une classe décorative, par exemple bg-accent accent-fill. Un thème qui ne définit que la décoration (un lustre) ne rendra alors jamais un bouton transparent.

Voir references/button.tsx.

Passe de consolidation, par application

  1. Inventaire des copies locales. Grep chaque application pour export function (Btn|Button|IconBtn|Select|Field|Input|Modal|Dialog|Sheet|Badge|Empty|Pager|Toast|Stat|Status|Spinner). Comptez les sites d'appel.

  2. Remplacez et supprimez là où le composant partagé correspond après thémage. Mappez les noms de variantes explicitement et écrivez le mappage :

    Nom localVariante partagée
    primary, navyaccent
    secondaryoutline
    quiet, softsubtle
    danger (plein)danger-solid
  3. Gardez les éléments spécifiques à l'application comme spécifiques :

    • widgets de domaine, graphiques et chrome d'application ;
    • contrôles dont la forme est la marque (plaques iOS, contrôles plats Carbon, CTA pilulaires de 48px) ;
    • contrôles avec un comportement manquant dans le composant partagé (case à cocher tri-état, chips supprimables, un élément de réinitialisation "Tout", filtres multi-sélection).

    Un wrapper fin est acceptable lorsqu'il ajoute une chose. Notez pourquoi dans un commentaire.

  4. Remplacez les <select> natifs et les selects basés sur menu par un seul Select.

    • Radix Select réserve "" comme "aucune valeur" : utilisez un sentinelle comme "all" et mappez-le en retour.
    • Transmettez aria-labelledby et aria-describedby.
    • Les scripts de parcours qui appellent selectOption() doivent cliquer sur le combobox, puis sur l'option.
  5. Vérifiez chaque application par rapport à ses propres captures d'écran (voir visual-regression-pass). Les différences réelles sont généralement intentionnelles : tailles, lustre, échelle de pression.

Pièges de tailwind-merge (cn())

tailwind-merge ne connaît que l'échelle intégrée de Tailwind. Les tokens personnalisés le brisent de trois manières silencieuses :

  • Tokens d'espacement inconnus. cn("h-btn-md", "h-10") garde les deux, car il ne sait pas que h-btn-md est une hauteur, et l'ordre de la feuille de style détermine le gagnant. Un h-10 appelant perdu au profit du token et un bouton de 40px rendu à 36px. Enregistrez les tokens : extendTailwindMerge({ extend: { theme: { spacing: ["btn-sm","btn-md","field", …] } } }).
  • Tailles de texte inconnues. cn("text-meta", "text-ink") traite text-meta comme une couleur et la supprime. Enregistrez les tailles : theme: { text: ["meta","micro","label"] }.
  • Ombres et couleurs personnalisées. text-14 à côté de text-t3, ou arbitraire shadow-[var(--x)] à côté d'une ombre nommée : le même problème. Lorsqu'une base de code a une échelle personnalisée fermée partout, utilisez clsx brut.

Voir references/cn.ts.

Focus et validation

  • Un style aria-invalid:ring-* l'emporte sur focus-visible:ring-* et cache l'anneau de focus sur un champ non valide focalisé. Écrivez aria-invalid:not-focus-visible:ring-….
  • Les <button> nus dans les formulaires les soumettent. Si le bouton partagé ne définit pas par défaut type="button", chaque site d'appel converti qui ne soumet pas doit le définir.

Individual skills in this repo

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

Adamparishspok/skills

Make a website, web app or online store ready for AI agents. Scan it with Cloudflare's Agent Readiness checks, decide which checks apply to this kind of site, ship the discovery files and headers in priority order, and add the AI-first basics the scanner does not score (server-rendered content, JSON-LD, llms.txt). Covers robots.txt AI rules, Content Signals, sitemap, Markdown for Agents (Accept text/markdown), Link headers, API catalog, OAuth discovery, auth.md, MCP server card, A2A agent card, agent skills index, WebMCP, and commerce protocols (ACP, UCP, AP2, MPP, x402). Use when making a site AI-ready, agent-ready or AI-first, or fixing an isitagentready.com or Cloudflare Agent Readiness report. Triggers on: AI ready, agent ready, AI-first, agent readiness, isitagentready, AI Crawl Control, Markdown for Agents, text/markdown, llms.txt, GPTBot, ClaudeBot, AI crawlers, Content-Signal, ai-train, api-catalog, .well-known, oauth-protected-resource, auth.md, MCP server card, agent card, agent skills, WebMCP, a...

Adamparishspok/skills

Install a complete, lean favicon set on any website or web app — the five files modern browsers, iOS and Android actually use, one block of head markup added once in the root layout, and a check that every file resolves. Covers finding the public folder per framework, generating the set from one SVG (or from a RealFaviconGenerator package), dark-mode SVG icons, maskable manifest icons, cache busting and verification. Use when adding, replacing or auditing a favicon, app icon, apple-touch-icon or web manifest. Triggers on: favicon, favicon.ico, favicon.svg, apple-touch-icon, site.webmanifest, manifest.json, app icon, PWA icon, maskable icon, tab icon, RealFaviconGenerator.

Adamparishspok/skills

Give an interface one shared tempo and a small vocabulary of hover and state micro-interactions: duration tiers (tap/pop/hover/card/layout) for CSS and Motion, swap hand-offs, rows whose highlight grows in, trailing arrows, chevron nudges, card lifts without translate, scroll-edge fades, and icon/label swaps for copy and toggle buttons. Use when animations feel inconsistent, durations are scattered magic numbers, hovers only change colour, or a product feels flat or unfinished. Triggers on: animation duration, transition timing, hover state, micro-interaction, polish, copy button feedback, menu icon to close, back arrow, card hover, scroll fade, motion tokens, Framer Motion durations.

Adamparishspok/skills

Build or migrate a UI's neutral palette (grounds, surfaces, lines, ink/text) as an OKLCH formula driven by a few inputs instead of dozens of hand-picked hex values, with light and dark themes, per-step ladder overrides, a fit script that reproduces existing colours, and a browser contrast audit. Use when creating a theme, adding dark mode, retinting a product, auditing text contrast, or consolidating several apps' palettes. Triggers on: palette, neutrals, grey ramp, dark mode, theme tokens, oklch, retint, hue, contrast audit, design tokens, Tailwind @theme colours.

Skills associés