Figma to Code
📥 Contexte à charger
Au démarrage, vérifier l'environnement Figma et les composants existants.
| Contexte | Pattern/Action | Priorité |
|---|---|---|
| Code Connect | Read: figma.config.json | Recommandé |
| Composants existants | Glob: src/components/ui/*.{tsx,jsx,vue} | Requis |
| Mappings Figma | Glob: src/components/**/*.figma.tsx | Optionnel |
| Framework | Grep: package.json pour react/vue/angular/next | Requis |
| Design tokens | Read: src/styles/tokens.css ou docs/planning/ui/tokens.css | 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 :
- •
Button(mapped) ✅ - •
Card(mapped) ✅ - •
Input(mapped) ✅
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 |
|---|---|---|
Primary/500 | bg-primary-500 | var(--color-primary-500) |
Neutral/100 | bg-gray-100 | var(--color-neutral-100) |
Spacing
| Figma | Tailwind | CSS Variable |
|---|---|---|
8 | p-2 | var(--space-sm) |
16 | p-4 | var(--space-md) |
24 | p-6 | var(--space-lg) |
Typography
| Figma | Tailwind | CSS Variable |
|---|---|---|
Heading/H1 | text-3xl font-bold | var(--font-heading-1) |
Body/Regular | text-base | var(--font-body) |
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 ?"