Décrire manuellement les composants d'interface utilisateur à Claude Code pour chaque nouvelle fonctionnalité est comme écrire du CSS sans classes : répétitif, incohérent et impossible à adapter à travers les équipes. Les compétences Claude Code pour la construction d'interfaces utilisateur transforment votre système de conception en outils exécutables qui génèrent des composants, des mises en page et des styles avec des paramètres prévisibles et sans code répétitif.
Que Sont les Compétences Claude Code pour la Construction d'Interfaces Utilisateur ?
Les Compétences Claude Code regroupent la logique de génération d'interface utilisateur en outils réutilisables et versionnés que Claude Code peut découvrir et invoquer via le Protocole de Contexte de Modèle (MCP). Au lieu de créer des invites verbeuses comme "Créez un composant de carte réactif avec Tailwind, une image alignée à gauche, du texte aligné à droite et un bouton principal," vous définissez une compétence building-ui une seule fois et l'appelez avec des paramètres concis : component: "card", layout: "image-left".
Chaque compétence est constituée d'un fichier SKILL.md qui définit :
- Nom et description de l'outil : Ce que la compétence fait et quand Claude doit l'utiliser
- Schéma des paramètres : Entrées sécurisées par type avec validation
- Exemples : Modèles d'utilisation concrets pour l'entraînement de Claude
- Implémentation : Le gestionnaire réel qui génère le code
La compétence building-ui du dépôt officiel fournit des modèles pour les composants, les mises en page, les thèmes et les formulaires. Elle transforme la génération d'interface utilisateur ad hoc en un processus systématique et reproductible.

Principaux Avantages Par Rapport aux Prompts Bruts
- Cohérence : La même structure de composant à chaque fois
- Sécurité des types : Claude valide les paramètres avant la génération
- Contrôle de version : Les compétences résident dans Git, traçables et révisables
- Partage d'équipe : Une seule compétence sert toute une organisation d'ingénierie
- Performance : Pas besoin de ré-expliquer les jetons de conception ou les échelles d'espacement
Vous voulez une plateforme intégrée et tout-en-un pour que votre équipe de développeurs puisse travailler ensemble avec une productivité maximale ?
Apidog répond à toutes vos exigences, et remplace Postman à un prix bien plus abordable !
Mise en Place de la Compétence building-ui
Étape 1 : Installer Claude Code et Activer le MCP
Si vous n'avez pas installé l'interface en ligne de commande de Claude Code :
npm install -g @anthropic-ai/claude-code
claude --version # Devrait être >= 2.0.70
Créez le répertoire et le fichier de configuration MCP :
# macOS/Linux
mkdir -p ~/.config/claude-code
touch ~/.config/claude-code/config.json
# Windows
mkdir %APPDATA%\claude-code
echo {} > %APPDATA%\claude-code\config.json

Étape 2 : Cloner et Compiler la Compétence building-ui
git clone https://github.com/anthropics/skills.git
cd skills/skills/building-ui
npm install
npm run build
Ceci compile les gestionnaires TypeScript vers dist/index.js.
Étape 3 : Configurer le MCP pour Charger la Compétence
Modifiez ~/.config/claude-code/config.json :
{
"mcpServers": {
"building-ui": {
"command": "node",
"args": ["/absolute/path/to/skills/building-ui/dist/index.js"],
"env": {
"UI_LIBRARY": "react",
"STYLE_SYSTEM": "tailwind",
"THEME_CONFIG": "~/project/design-tokens.json"
}
}
}
}
Critique :
- Utilisez des chemins absolus pour
args. Les chemins relatifs échouent lorsque Claude lance le processus - Définissez les variables d'environnement pour configurer la compétence globalement :
UI_LIBRARY:react,vue,svelteSTYLE_SYSTEM:tailwind,styled-components,css-modulesTHEME_CONFIG: Chemin vers votre fichier de jetons de conception
Étape 4 : Vérifier l'Installation
claude
Une fois chargé, exécutez :
/list-tools
Vous devriez voir :
Available tools:
- building-ui:generate-component
- building-ui:create-layout
- building-ui:apply-theme
- building-ui:generate-form
Si les outils n'apparaissent pas, vérifiez les journaux :
# macOS/Linux
tail -f ~/.cache/claude-code/logs/mcp.log
# Windows
type %APPDATA%\claude-code\logs\mcp.log
Problèmes courants :
- ENOENT : Mauvais chemin vers
dist/index.js - Variables d'environnement manquantes : La compétence ne parvient pas à charger la configuration du thème
- Incompatibilité de version : La version de Claude Code ne prend pas en charge les fonctionnalités MCP
Modèles Clés de Construction d'Interfaces Utilisateur avec les Compétences
La compétence building-ui exporte quatre outils principaux. Chacun accepte des paramètres structurés et renvoie du code généré.
1. Outil de Génération de Composant
Nom de l'outil : building-ui:generate-component
Cas d'utilisation : Créer des composants d'interface utilisateur réutilisables
Paramètres :
component: Nom du composant (bouton, carte, modale, champ de saisie, liste déroulante)variants: Tableau de variantes de style (primaire, secondaire, contour)size: petit | moyen | grandcustomProps: Enregistrement de propriétés supplémentaireschildren: Booléen (indique si le composant accepte des enfants)
Exemple : Créer un bouton avec des variantes
Utilisez l'outil generate-component pour créer un composant bouton avec les variantes primaire, secondaire et contour, de taille moyenne, et prenant en charge l'état désactivé.
Sortie générée (React + Tailwind) :
// Button.tsx
import React from 'react';
import clsx from 'clsx';
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: 'primary' | 'secondary' | 'outline';
size?: 'small' | 'medium' | 'large';
}
export const Button: React.FC<ButtonProps> = ({
variant = 'primary',
size = 'medium',
disabled,
children,
className,
...props
}) => {
const baseClasses = 'font-semibold rounded-lg transition-colors';
const variantClasses = {
primary: 'bg-blue-600 text-white hover:bg-blue-700',
secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',
outline: 'border-2 border-blue-600 text-blue-600 hover:bg-blue-50'
};
const sizeClasses = {
small: 'px-3 py-1.5 text-sm',
medium: 'px-4 py-2 text-base',
large: 'px-6 py-3 text-lg'
};
return (
<button
disabled={disabled}
className={clsx(
baseClasses,
variantClasses[variant],
sizeClasses[size],
disabled && 'opacity-50 cursor-not-allowed',
className
)}
{...props}
>
{children}
</button>
);
};
La compétence infère les types TypeScript, les attributs d'accessibilité et les classes de style en fonction de vos variables d'environnement.
2. Outil de Création de Mise en Page
Nom de l'outil : building-ui:create-layout
Cas d'utilisation : Générer des mises en page réactives
Paramètres :
type: grille | flex | pile | barre latéralecolumns: Nombre de colonnes (pour la grille)gap: Échelle d'espacement (0, 1, 2, 3, 4, 5, 6, 8, 10, 12)responsive: Objet avec des configurations de points d'arrêtareas: Zones de grille nommées (par exemple, "header header", "sidebar main")
Exemple : Mise en page de tableau de bord avec barre latérale réactive
Utilisez create-layout pour générer une mise en page de tableau de bord réactive avec une barre latérale escamotable, un en-tête, une zone de contenu principal et un pied de page. Utilisez un espacement de 4 et faites en sorte que la barre latérale ait une largeur de 256px sur le bureau, et pleine largeur sur mobile.
Sortie générée :
// DashboardLayout.tsx
import React, { useState } from 'react';
import clsx from 'clsx';
interface DashboardLayoutProps {
header?: React.ReactNode;
sidebar?: React.ReactNode;
main: React.ReactNode;
footer?: React.ReactNode;
}
export const DashboardLayout: React.FC<DashboardLayoutProps> = ({
header,
sidebar,
main,
footer
}) => {
const [sidebarOpen, setSidebarOpen] = useState(false);
return (
<div className="min-h-screen flex flex-col">
{/* Header */}
<header className="bg-white shadow-sm border-b border-gray-200 z-10">
<div className="px-4 sm:px-6 lg:px-8 py-4">
{header}
</div>
</header>
<div className="flex flex-1">
{/* Mobile menu button */}
<button
className="lg:hidden fixed bottom-4 right-4 bg-blue-600 text-white p-3 rounded-full shadow-lg z-20"
onClick={() => setSidebarOpen(!sidebarOpen)}
>
☰
</button>
{/* Sidebar */}
<aside className={clsx(
'bg-gray-50 border-r border-gray-200',
'fixed lg:relative inset-y-0 left-0 z-30',
'w-64 transform transition-transform lg:translate-x-0',
sidebarOpen ? 'translate-x-0' : '-translate-x-full lg:translate-x-0'
)}>
<div className="p-4">
{sidebar}
</div>
</aside>
{/* Main content */}
<main className="flex-1 p-4 sm:p-6 lg:p-8">
{main}
</main>
</div>
{/* Footer */}
{footer && (
<footer className="bg-gray-50 border-t border-gray-200 mt-auto">
<div className="px-4 sm:px-6 lg:px-8 py-4">
{footer}
</div>
</footer>
)}
</div>
);
};
La compétence ajoute automatiquement la logique du menu mobile, les classes adaptées aux points d'arrêt et les attributs d'accessibilité.
3. Outil d'Application de Thème
Nom de l'outil : building-ui:apply-theme
Cas d'utilisation : Appliquer des jetons de conception à travers les composants
Paramètres :
component: Nom du composant ciblecolorScheme: clair | sombre | systèmespacingScale: 0-12 (échelle d'espacement Tailwind)typography: Objet avec tailles de police, graisses, famillescustomTokens: Enregistrement de propriétés CSS personnalisées
Exemple : Appliquer un thème sombre à un composant de carte
Utilisez apply-theme pour configurer un composant Card pour le mode sombre avec une palette de couleurs ardoise, une échelle d'espacement de 4 et la famille de polices Inter.
Sortie générée :
// card-theme.ts
export const cardTheme = {
light: {
background: 'bg-white',
border: 'border-gray-200',
text: 'text-gray-900',
subText: 'text-gray-600'
},
dark: {
background: 'bg-slate-800',
border: 'border-slate-700',
text: 'text-slate-100',
subText: 'text-slate-400'
}
};
// Utilisation dans Card.tsx
import { cardTheme } from './card-theme';
interface CardProps {
variant?: 'light' | 'dark';
children: React.ReactNode;
}
export const Card: React.FC<CardProps> = ({ variant = 'light', children }) => {
const theme = cardTheme[variant];
return (
<div className={clsx(
'rounded-lg p-4 border',
theme.background,
theme.border
)}>
{children}
</div>
);
};
La compétence lit votre fichier THEME_CONFIG et génère des cartes de jetons spécifiques au thème. Si THEME_CONFIG pointe vers un fichier JSON :
{
"colors": {
"primary": "#3B82F6",
"secondary": "#6B7280"
},
"fonts": {
"sans": "Inter",
"mono": "JetBrains Mono"
}
}
Le code généré utilise ces valeurs exactes au lieu des valeurs par défaut de Tailwind.
4. Outil de Génération de Formulaire
Nom de l'outil : building-ui:generate-form
Cas d'utilisation : Créer des formulaires validés à partir de schémas
Paramètres :
fields: Tableau de définitions de champs (nom, type, étiquette, validation)submitAction: Nom de fonction ou point d'accès APIvalidationMode: au flou | au changement | à la soumissionlayout: vertical | horizontal | grille
Exemple : Formulaire d'inscription utilisateur avec validation
Utilisez generate-form pour créer un formulaire d'inscription utilisateur avec les champs : nom (texte, requis), email (email, requis), mot de passe (mot de passe, longueur minimale 8), et acceptTerms (case à cocher). Soumettre à /api/register avec validation au flou.
Sortie générée :
// UserRegistrationForm.tsx
import React, { useState } from 'react';
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';
import { useForm, SubmitHandler } from 'react-hook-form';
const schema = z.object({
name: z.string().min(1, 'Name is required'),
email: z.string().email('Invalid email address'),
password: z.string().min(8, 'Password must be at least 8 characters'),
acceptTerms: z.boolean().refine(val => val === true, {
message: 'You must accept the terms'
})
});
type FormData = z.infer<typeof schema>;
export const UserRegistrationForm: React.FC = () => {
const [isSubmitting, setIsSubmitting] = useState(false);
const {
register,
handleSubmit,
formState: { errors },
trigger
} = useForm<FormData>({
resolver: zodResolver(schema),
mode: 'onBlur'
});
const onSubmit: SubmitHandler<FormData> = async (data) => {
setIsSubmitting(true);
try {
const response = await fetch('/api/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (!response.ok) throw new Error('Registration failed');
// Gérer le succès
console.log('User registered:', await response.json());
} catch (error) {
console.error('Registration error:', error);
} finally {
setIsSubmitting(false);
}
};
return (
<form onSubmit={handleSubmit(onSubmit)} className="space-y-4 max-w-md">
<div>
<label htmlFor="name" className="block text-sm font-medium text-gray-700">
Nom
</label>
<input
id="name"
{...register('name')}
className={clsx(
'mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500',
errors.name && 'border-red-500'
)}
/>
{errors.name && (
<p className="mt-1 text-sm text-red-600">{errors.name.message}</p>
)}
</div>
<div>
<label htmlFor="email" className="block text-sm font-medium text-gray-700">
Email
</label>
<input
id="email"
type="email"
{...register('email')}
className={clsx(
'mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500',
errors.email && 'border-red-500'
)}
/>
{errors.email && (
<p className="mt-1 text-sm text-red-600">{errors.email.message}</p>
)}
</div>
<div>
<label htmlFor="password" className="block text-sm font-medium text-gray-700">
Mot de passe
</label>
<input
id="password"
type="password"
{...register('password')}
className={clsx(
'mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500',
errors.password && 'border-red-500'
)}
/>
{errors.password && (
<p className="mt-1 text-sm text-red-600">{errors.password.message}</p>
)}
</div>
<div className="flex items-center">
<input
id="acceptTerms"
type="checkbox"
{...register('acceptTerms')}
className="h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"
/>
<label htmlFor="acceptTerms" className="ml-2 block text-sm text-gray-900">
J'accepte les termes et conditions
</label>
</div>
{errors.acceptTerms && (
<p className="text-sm text-red-600">{errors.acceptTerms.message}</p>
)}
<button
type="submit"
disabled={isSubmitting}
className="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50"
>
{isSubmitting ? 'Inscription...' : 'S'inscrire'}
</button>
</form>
);
};
La compétence connecte automatiquement react-hook-form, la validation zod, les attributs d'accessibilité et les états de chargement.
Génération Dynamique d'Interfaces Utilisateur à l'aide de Techniques Avancées
Logique de Rendu Conditionnel
Certaines interfaces utilisateur nécessitent des sections conditionnelles basées sur des paramètres. La compétence prend en charge les conditions dans les définitions de champs :
Générez un formulaire de profil utilisateur où le champ "company" n'apparaît que si "accountType" est "business".
Ceci produit un formulaire avec rendu conditionnel :
{accountType === 'business' && (
<div>
<label htmlFor="company">Entreprise</label>
<input id="company" {...register('company')} />
</div>
)}
Composition de Composants
Construisez des interfaces utilisateur complexes en chaînant les appels de compétences :
D'abord, générez un composant DashboardLayout avec une barre latérale et un en-tête. Ensuite, générez un composant StatCard pour les métriques. Enfin, appliquez le thème sombre aux deux.
Claude Code les exécute séquentiellement, en passant le contexte entre les appels. Le composant de mise en page est disponible lors de la génération de la carte, assurant une intégration appropriée.
Changement de Thème à l'Exécution
Configurez la compétence pour qu'elle génère du code sensible au thème :
{
"building-ui": {
"command": "node",
"args": ["dist/index.js"],
"env": {
"UI_LIBRARY": "react",
"STYLE_SYSTEM": "tailwind",
"THEME_CONFIG": "~/project/themes.json",
"SUPPORT_THEME_TOGGLE": "true"
}
}
}
Les composants générés incluent désormais un wrapper ThemeProvider :
// App.tsx
import { ThemeProvider } from './ThemeProvider';
import { DashboardLayout } from './DashboardLayout';
function App() {
return (
<ThemeProvider defaultTheme="light" enableSystem>
<DashboardLayout />
</ThemeProvider>
);
}
Débogage et Itération des Compétences de Construction d'Interfaces Utilisateur
Afficher le Code Généré dans .claude-cache
Claude Code met en cache les sorties des compétences. Inspectez-les :
# macOS/Linux
cat ~/.cache/claude-code/last-skill-output.tsx
# Windows
type %APPDATA%\claude-code\last-skill-output.tsx
Si le code généré ne correspond pas aux attentes, affinez vos paramètres. Ajoutez plus de spécificité :
Au lieu de : "Générer une carte"
Utilisez : "Générer une carte avec un remplissage de 16px, un rayon de bordure de 8px et une ombre subtile"
Outrepasser les Valeurs par Défaut des Compétences par Projet
Créez .claude-ui-config.json à la racine de votre projet :
{
"uiLibrary": "vue",
"styleSystem": "css-modules",
"themeConfig": "./design-tokens.json"
}
Ceci remplace les paramètres MCP globaux pour ce projet uniquement.
Gestion des Versions des Compétences
Lorsque vous mettez à jour la compétence building-ui, étiquetez les versions :
cd skills/building-ui
npm version patch # Ou minor/major
git tag -a v1.1.0 -m "Added support for Vue 3.5"
Mettez à jour la configuration de Claude Code pour épingler les versions :
{
"mcpServers": {
"building-ui": {
"command": "node",
"args": ["/path/to/skills/building-ui-v1.1.0/dist/index.js"]
}
}
}
Ceci empêche les changements disruptifs d'affecter les flux de travail de production.
Conclusion
Les compétences Claude Code pour la construction d'interfaces utilisateur convertissent le langage naturel en composants, mises en page, thèmes et formulaires prêts pour la production avec une précision chirurgicale. En investissant 15 minutes dans la configuration, vous obtenez une boîte à outils réutilisable qui assure la cohérence du design, élimine le code répétitif et accélère le développement de fonctionnalités. Commencez avec les quatre outils principaux – générer un composant, créer une mise en page, appliquer un thème et générer un formulaire – puis étendez-les pour votre système de conception spécifique.
Lorsque vos compétences génèrent des interfaces utilisateur consommant des API, validez ces points de terminaison avec Apidog pour vous assurer que vos interfaces construites par l'IA communiquent avec des backends fiables.
