Claude-skill-registry figma-to-code
Génère du code à partir d'une sélection Figma en utilisant les composants existants et Code Connect. Utiliser quand l'utilisateur fournit une URL Figma, dit "convertir ce design", "figma to code", "générer depuis figma", ou veut transformer un design en code.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/figma-to-code" ~/.claude/skills/majiayu000-claude-skill-registry-figma-to-code && rm -rf "$T"
skills/data/figma-to-code/SKILL.mdFigma to Code
📥 Contexte à charger
Au démarrage, vérifier l'environnement Figma et les composants existants.
| Contexte | Pattern/Action | Priorité |
|---|---|---|
| Code Connect | | Recommandé |
| Composants existants | | Requis |
| Mappings Figma | | Optionnel |
| Framework | pour react/vue/angular/next | Requis |
| Design tokens | ou | Optionnel |
Instructions de chargement
- Vérifier si Code Connect est configuré (figma.config.json)
- Scanner les composants UI existants pour réutilisation
- Identifier les mappings .figma.tsx existants
- Détecter le framework pour générer le bon code
Activation
Au démarrage :
- Parser l'URL Figma fournie
- Vérifier si Code Connect est configuré
- Détecter le framework du projet
- Identifier les composants mappés disponibles
Rôle & Principes
Rôle : Transformer un design Figma en code fonctionnel en utilisant les composants existants du projet. Privilégier la réutilisation plutôt que la création de nouveaux composants.
Principes :
- Réutilisation first - Utiliser les composants mappés existants
- Tokens first - Utiliser les design tokens du projet
- Clean code - Générer du code lisible et maintenable
- Framework-aware - Respecter les conventions du framework détecté
Règles :
- ⛔ Ne JAMAIS créer de nouveaux composants de base (Button, Input, etc.)
- ⛔ Ne JAMAIS hardcoder des valeurs de style (utiliser les tokens)
- ⛔ Ne JAMAIS ignorer les composants mappés existants
- ✅ Toujours vérifier les mappings avant de générer
- ✅ Toujours utiliser les tokens CSS existants
- ✅ Toujours proposer de créer les mappings manquants
Process
1. Parsing de l'URL Figma
🔗 **Analyse URL Figma** **URL** : [URL fournie] **Extraction** : | Élément | Valeur | |---------|--------| | File Key | [file_key] | | Node ID | [node_id ou "page entière"] | | File Name | [nom si disponible] | **Type de sélection** : - [ ] Composant unique - [ ] Frame / Screen - [ ] Page complète Je récupère les informations du design ?
⏸️ STOP - Validation avant appel API
2. Vérification des mappings existants
🔍 **Mappings Code Connect** **Composants mappés disponibles** : | Composant Figma | Composant Code | Mapping | |-----------------|----------------|---------| | Button | `<Button>` | ✅ | | Input | `<Input>` | ✅ | | Card | `<Card>` | ✅ | | [Autre] | - | ❌ | **Composants dans le design** : [Liste des composants détectés dans la sélection Figma] **Match** : [X/Y] composants ont un mapping existant [Si mappings manquants] ⚠️ [N] composants sans mapping. Options : - [C] Continuer avec composants génériques - [M] Créer les mappings d'abord (`/figma-setup`)
⏸️ STOP - Décision sur les mappings manquants
3. Extraction du design
Utiliser les outils MCP Figma :
📐 **Design extrait** **Structure** :
[Frame Name] ├── Header │ ├── Logo (Image) │ └── Navigation (→ mapped: NavBar) ├── Hero Section │ ├── Title (Text) │ ├── Description (Text) │ └── CTA (→ mapped: Button) └── Content └── Cards Grid ├── Card 1 (→ mapped: Card) ├── Card 2 (→ mapped: Card) └── Card 3 (→ mapped: Card)
**Tokens utilisés** : | Token Figma | Token CSS local | |-------------|-----------------| | Primary/500 | --color-primary-500 | | Spacing/lg | --space-lg | | Radius/md | --radius-md | **Dimensions** : [W] × [H] Je génère le code ?
⏸️ STOP - Validation structure avant génération
4. Génération du code
💻 **Code généré** **Fichier** : `src/components/[name].tsx` ```tsx import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; interface [ComponentName]Props { // Props extraites du design } export function [ComponentName]({ ...props }: [ComponentName]Props) { return ( <div className="[styles utilisant tokens]"> {/* Structure générée depuis Figma */} </div> ); }
Composants utilisés :
(mapped) ✅Button
(mapped) ✅Card
(mapped) ✅Input
Tokens utilisés :
--color-primary-500--space-lg--radius-md
Ce code te convient ?
**⏸️ STOP** - Validation code généré --- ### 5. Proposition de mappings manquants Si des composants Figma n'ont pas de mapping : ```markdown 🔗 **Mappings manquants** Ces composants Figma n'ont pas de mapping Code Connect : | Composant Figma | Composant code suggéré | Action | |-----------------|------------------------|--------| | [FigmaComponent] | `src/components/ui/[name].tsx` | Créer mapping | | [Autre] | `src/components/ui/[name].tsx` | Créer mapping | **Créer les mappings maintenant ?** - [Y] Oui, créer les fichiers .figma.tsx - [N] Non, utiliser les composants génériques - [S] Setup complet (`/figma-setup`)
⏸️ STOP - Décision mappings
Si oui, créer les fichiers .figma.tsx :
// src/components/ui/[name].figma.tsx import figma from "@figma/code-connect"; import { ComponentName } from "./[name]"; figma.connect(ComponentName, "[FIGMA_URL_NODE]", { props: { // Props détectées }, example: (props) => <ComponentName {...props} />, });
6. Écriture du fichier
📝 **Fichier créé** **Path** : `src/components/[path]/[name].tsx` **Contenu** : [résumé du composant] **Imports** : - [X] composants UI mappés - [Y] tokens CSS - [Z] types Le fichier a été créé. Vérifications : - [ ] Pas d'erreurs TypeScript - [ ] Imports corrects - [ ] Tokens utilisés (pas de hardcode)
Écrire le fichier avec Write.
7. Validation & Résumé
## ✅ Code généré depuis Figma **Source** : [URL Figma] **Fichier créé** : `src/components/[name].tsx` **Résumé** : | Métrique | Valeur | |----------|--------| | Composants mappés utilisés | [N] | | Tokens CSS utilisés | [N] | | Lignes de code | [N] | | Props typées | [N] | **Composants réutilisés** : - `Button` ✅ - `Card` ✅ - `Input` ✅ **Nouveaux mappings créés** : [N] (si applicable) --- **Prochaine étape ?** - [A] Générer un autre composant (`/figma-to-code [url]`) - [T] Écrire les tests (`/test-runner`) - [R] Review le code (`/code-reviewer`)
⏸️ STOP - Fin de génération
Détection du framework
React / Next.js
// Imports import { ComponentName } from "@/components/ui/component"; // Styles className="flex gap-4 p-6" // Tailwind si détecté className={styles.container} // CSS Modules si détecté // Props interface Props { title: string; onClick?: () => void; }
Vue
<template> <div class="container"> <ComponentName :prop="value" /> </div> </template> <script setup lang="ts"> import ComponentName from '@/components/ui/ComponentName.vue'; defineProps<{ title: string; }>(); </script>
HTML / Web Components
<div class="container"> <custom-button variant="primary">Click me</custom-button> </div> <style> .container { display: flex; gap: var(--space-md); } </style>
Mapping des styles Figma → Code
Couleurs
| Figma | Tailwind | CSS Variable |
|---|---|---|
| | |
| | |
Spacing
| Figma | Tailwind | CSS Variable |
|---|---|---|
| | |
| | |
| | |
Typography
| Figma | Tailwind | CSS Variable |
|---|---|---|
| | |
| | |
Output Validation
Avant de terminer, valider :
### ✅ Checklist Output Figma to Code | Critère | Status | |---------|--------| | URL Figma parsée correctement | ✅/❌ | | Design extrait | ✅/❌ | | Composants mappés utilisés | ✅/❌ | | Tokens CSS utilisés (pas hardcode) | ✅/❌ | | Code TypeScript valide | ✅/❌ | | Fichier créé | ✅/❌ | **Score : X/6** → Si < 5, corriger avant de terminer
Auto-Chain
Après la génération, proposer :
## 🔗 Prochaine étape ✅ Code généré depuis Figma. **Suggestions :** → 🧪 **`/test-runner`** - Écrire des tests pour le composant → 🔄 **`/code-reviewer`** - Review du code généré → 🖼️ **`/figma-to-code [autre-url]`** - Générer un autre composant --- **[T] Tests** | **[R] Review** | **[F] Autre Figma** | **[X] Terminé**
⏸️ STOP - Attendre choix
Gestion des erreurs
URL invalide
❌ **URL Figma invalide** L'URL fournie ne semble pas être une URL Figma valide. **Format attendu** :
https://figma.com/design/FILE_KEY/FILE_NAME?node-id=NODE_ID https://figma.com/file/FILE_KEY/FILE_NAME?node-id=NODE_ID
**Exemples valides** : - `https://figma.com/design/ABC123/MyDesign?node-id=1:234` - `https://figma.com/file/XYZ789/Components` Fournis une URL Figma valide.
Pas de Code Connect
⚠️ **Code Connect non configuré** Pour une meilleure génération, configure d'abord Code Connect : ```bash /figma-setup
Options :
- [S] Setup Code Connect d'abord (recommandé)
- [C] Continuer sans mappings (génération basique)
### Accès refusé ```markdown ❌ **Accès au fichier Figma refusé** Tu n'as pas accès à ce fichier Figma. **Solutions** : 1. Vérifie que tu es connecté au bon compte Figma 2. Demande l'accès au propriétaire du fichier 3. Vérifie que le lien de partage est activé Re-authentification : ```bash npx figma connect
--- ## Transitions - **Vers test-runner** : "On écrit les tests pour ce composant ?" - **Vers code-reviewer** : "On review le code généré ?" - **Vers figma-setup** : "On configure Code Connect d'abord ?"