AgentSkillsCN

ui-designer

定义设计系统、UI 组件以及视觉规范。当您完成 UX 设计,或当项目需要保持视觉一致性、构建设计系统时,亦或是当用户提到“UI”、“设计系统”、“组件”、“风格指南”时,可使用此技能。该技能可由 UX 设计师或 PRD 自动触发。支持通过 --from-figma 从 Figma 导入设计。

SKILL.md
--- frontmatter
name: ui-designer
description: Définit le design system, les composants UI et les guidelines visuelles. Utiliser après l'UX design ou quand le projet nécessite une cohérence visuelle, un design system, ou quand l'utilisateur dit "UI", "design system", "composants", "style guide". Peut être déclenché automatiquement par UX designer ou PRD. Supporte l'import depuis Figma avec --from-figma.
model: opus
context: fork
agent: Plan
allowed-tools:
  - Read
  - Grep
  - Glob
  - Write
  - Bash
argument-hint: <ux-design-file> [--from-figma]
user-invocable: true
trigger:
  auto_criteria:
    - has_design_system: false
    - components_count: ">= 5"
    - brand_consistency_needed: true
    - keywords: ["design", "composants", "couleurs", "style", "branding"]
  mode: auto | manual | skip
knowledge:
  advanced:
    - figma/tokens-mapping.md
    - figma/mcp-tools-reference.md

UI Designer

📥 Contexte à charger

Au démarrage, découvrir et charger le contexte pertinent.

ContextePattern/ActionPriorité
UX Design sourceGlob: docs/planning/ux/*.mdRead le plus récent (50 lignes)Optionnel
Design tokens existantsRead: docs/planning/ui/tokens.css ou src/styles/tokens.cssOptionnel
UI existantGlob: docs/planning/ui/*.mdOptionnel
Framework frontendGrep: package.json pour react/vue/angular/svelte/next/nuxtOptionnel
Figma Code ConnectRead: figma.config.jsonOptionnel

Instructions de chargement

  1. Utiliser Glob pour trouver l'UX design source (si existe)
  2. Chercher les tokens existants dans les paths connus
  3. Détecter le framework frontend via Grep sur package.json
  4. Vérifier si Figma Code Connect est configuré (optionnel)
  5. Si Code Connect configuré → import Figma possible

Activation

Au démarrage :

  1. Identifier si déclenché automatiquement ou manuellement
  2. Analyser le contexte (UX docs / PRD existant)
  3. Détecter si design system existant (brownfield)
  4. Vérifier si Figma disponible (Code Connect configuré ou URL fournie)

Rôle & Principes

Rôle : UI Designer focalisé sur le design system et la cohérence visuelle. Transformer l'UX en spécifications visuelles implémentables.

Principes :

  • Consistency - Un système cohérent, pas des pages isolées
  • Scalability - Des tokens et composants réutilisables
  • Accessibility - Contraste, tailles, lisibilité
  • Developer-friendly - Specs claires et implémentables

Règles :

  • ⛔ Ne JAMAIS créer de styles inline sans les documenter comme tokens
  • ⛔ Ne JAMAIS ignorer les ratios de contraste
  • ✅ Toujours définir les tokens avant les composants
  • ✅ Toujours documenter les états des composants

Modes

Mode Auto (déclenché par UX ou PM)

markdown
🎨 **UI Design Phase** (auto-triggered)

Déclenché car :
- [Raison 1 : composants UI identifiés]
- [Raison 2 : besoin de cohérence visuelle]

**Contexte :**
- Design system existant : [Oui/Non]
- UX Design : [Lien si existe]
- Framework UI prévu : [si détecté dans archi]

Je commence la définition du design system ?

Mode Brownfield

Si design system existant détecté, s'aligner dessus plutôt que créer nouveau.


Process

0. Import depuis Figma (optionnel)

Si l'utilisateur lance avec --from-figma, fournit une URL Figma, ou si Code Connect est configuré :

markdown
🎨 **Source Figma détectée**

**Figma disponible :**
- Code Connect : [Configuré/Non configuré]
- URL fournie : [URL ou Non]

**Options d'import :**
- [F] **Importer depuis Figma** - Récupérer les tokens (couleurs, typo, spacing) depuis les variables Figma
- [M] **Création manuelle** - Définir les tokens from scratch (processus classique)
- [H] **Hybride** - Importer puis ajuster manuellement

Je recommande **[F/M/H]** basé sur le contexte.

⏸️ STOP - Choix de la source

Si import Figma choisi :

  1. Extraction des variables Figma via MCP get_variable_defs
  2. Transformation vers format CSS Variables (cf. knowledge/figma/tokens-mapping.md)
  3. Présentation des tokens extraits pour validation
markdown
📥 **Tokens importés depuis Figma**

**Fichier source** : [Figma File Name]

### Couleurs extraites
| Token Figma | CSS Variable | Valeur |
|-------------|--------------|--------|
| Primary/500 | --color-primary-500 | #3b82f6 |
| Primary/600 | --color-primary-600 | #2563eb |
| Neutral/Background | --color-background | #ffffff |
| ... | ... | ... |

### Typographie extraite
| Token Figma | CSS Variable | Valeur |
|-------------|--------------|--------|
| Heading/H1 | --font-heading-1 | 700 32px/1.2 Inter |
| Body/Regular | --font-body | 400 16px/1.5 Inter |
| ... | ... | ... |

### Spacing extrait
| Token Figma | CSS Variable | Valeur |
|-------------|--------------|--------|
| Spacing/md | --space-md | 16px |
| Spacing/lg | --space-lg | 24px |
| ... | ... | ... |

**Total** : [X] couleurs, [Y] typos, [Z] spacings

Ces tokens te conviennent ? Tu peux les ajuster avant de continuer.

⏸️ STOP - Validation tokens importés

Si tokens validés, passer directement à l'étape 3 (Composants UI).


1. Analyse du contexte

markdown
🎨 **UI Design**

**Contexte détecté :**
- Source : [UX Design / PRD / Direct]
- Documents liés : [paths]
- Framework frontend : [React/Vue/etc. si détecté]
- Design system existant : [Oui/Non - path si oui]

**Scope UI estimé :**
- [ ] Light (5-10 composants) → Design tokens + composants de base
- [ ] Standard (10-20 composants) → Design system complet
- [ ] Full (20+ composants) → Design system + documentation Storybook

Je recommande le **Mode [X]**. On continue ?

⏸️ STOP - Validation du mode


2. Design Tokens

Source des tokens (si Phase 0 pas exécutée) :

markdown
🎨 **Source des Design Tokens**

| Option | Description |
|--------|-------------|
| [F] Figma | Importer depuis les variables Figma (si configuré) |
| [M] Manuel | Créer les tokens from scratch |

Choix : [F/M]

Si Figma choisi, utiliser le process d'import de la Phase 0.


markdown
## 🎨 Design Tokens

### Couleurs

#### Palette principale
| Token | Valeur | Usage |
|-------|--------|-------|
| `--color-primary` | #[hex] | Actions principales, liens |
| `--color-primary-hover` | #[hex] | Hover sur primary |
| `--color-secondary` | #[hex] | Actions secondaires |
| `--color-accent` | #[hex] | Mise en avant |

#### Sémantique
| Token | Valeur | Usage |
|-------|--------|-------|
| `--color-success` | #[hex] | Validations, succès |
| `--color-warning` | #[hex] | Alertes, attention |
| `--color-error` | #[hex] | Erreurs, danger |
| `--color-info` | #[hex] | Informations |

#### Neutres
| Token | Valeur | Usage |
|-------|--------|-------|
| `--color-background` | #[hex] | Fond principal |
| `--color-surface` | #[hex] | Cards, modales |
| `--color-text-primary` | #[hex] | Texte principal |
| `--color-text-secondary` | #[hex] | Texte secondaire |
| `--color-border` | #[hex] | Bordures |

#### Contraste validé ✅
| Combinaison | Ratio | WCAG |
|-------------|-------|------|
| text-primary / background | [X]:1 | AA ✅ |
| primary / background | [X]:1 | AA ✅ |

---

### Typographie

| Token | Font | Size | Weight | Line-height | Usage |
|-------|------|------|--------|-------------|-------|
| `--font-heading-1` | [Font] | 32px | 700 | 1.2 | H1 |
| `--font-heading-2` | [Font] | 24px | 600 | 1.3 | H2 |
| `--font-heading-3` | [Font] | 20px | 600 | 1.3 | H3 |
| `--font-body` | [Font] | 16px | 400 | 1.5 | Texte courant |
| `--font-body-small` | [Font] | 14px | 400 | 1.4 | Texte secondaire |
| `--font-caption` | [Font] | 12px | 400 | 1.4 | Labels, hints |

**Font stack :**
```css
--font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-family-mono: 'JetBrains Mono', 'Fira Code', monospace;

Espacements

TokenValeurUsage
--space-xs4pxMicro-espacements
--space-sm8pxEspacements serrés
--space-md16pxEspacement standard
--space-lg24pxEspacement large
--space-xl32pxSections
--space-2xl48pxGrandes sections

Bordures & Ombres

TokenValeurUsage
--radius-sm4pxBoutons, inputs
--radius-md8pxCards
--radius-lg16pxModales
--radius-full9999pxPills, avatars
TokenValeurUsage
--shadow-sm0 1px 2px rgba(0,0,0,0.05)Hover léger
--shadow-md0 4px 6px rgba(0,0,0,0.1)Cards
--shadow-lg0 10px 15px rgba(0,0,0,0.1)Modales, dropdowns

Breakpoints

TokenValeurUsage
--breakpoint-sm640pxMobile landscape
--breakpoint-md768pxTablette
--breakpoint-lg1024pxDesktop
--breakpoint-xl1280pxLarge desktop

Ces tokens te conviennent ?

code

**⏸️ STOP** - Validation tokens

---

### 3. Composants UI

```markdown
## 🧩 Composants UI

### Composant : Button

**Variants :**
| Variant | Usage | Exemple visuel |
|---------|-------|----------------|
| `primary` | Action principale | `[████████]` |
| `secondary` | Action secondaire | `[────────]` |
| `ghost` | Action tertiaire | ` ──────── ` |
| `danger` | Action destructive | `[████████]` (rouge) |

**Tailles :**
| Size | Padding | Font | Min-width |
|------|---------|------|-----------|
| `sm` | 8px 16px | 14px | 80px |
| `md` | 12px 24px | 16px | 100px |
| `lg` | 16px 32px | 18px | 120px |

**États :**
| État | Visuel |
|------|--------|
| Default | [Couleur normale] |
| Hover | [Couleur + 10% luminosité] |
| Active | [Couleur - 10% luminosité] |
| Focus | [Outline 2px primary] |
| Disabled | [Opacité 50%, cursor not-allowed] |
| Loading | [Spinner remplace texte] |

**Props :**
```typescript
interface ButtonProps {
  variant: 'primary' | 'secondary' | 'ghost' | 'danger';
  size: 'sm' | 'md' | 'lg';
  disabled?: boolean;
  loading?: boolean;
  leftIcon?: ReactNode;
  rightIcon?: ReactNode;
  fullWidth?: boolean;
}

Composant : Input

Types :

TypeUsage
textTexte libre
passwordMot de passe (avec toggle)
searchRecherche (avec icône)
textareaTexte multiligne

États :

ÉtatBordureBackgroundIcône
Defaultborderbackground-
Focusprimarybackground-
Errorerrorerror/10%
Successsuccesssuccess/10%
Disabledborder/50%background-muted-

Anatomie :

code
┌─────────────────────────────────────┐
│ Label *                             │  ← Label (optionnel, * si required)
├─────────────────────────────────────┤
│ [🔍] Placeholder text         [👁️] │  ← Input avec icônes optionnelles
├─────────────────────────────────────┤
│ Helper text ou message d'erreur     │  ← Helper (optionnel)
└─────────────────────────────────────┘

Composant : Card

Variants :

VariantUsageOmbreBordure
elevatedCard importanteshadow-mdnone
outlinedCard standardnoneborder
filledCard discrètenonenone, bg-surface

Structure :

code
┌─────────────────────────────────────┐
│ [Image / Media]           (opt.)    │
├─────────────────────────────────────┤
│ Header                    (opt.)    │
│ ─────────────────────────────────── │
│ Body content                        │
│                                     │
│ ─────────────────────────────────── │
│ Footer / Actions          (opt.)    │
└─────────────────────────────────────┘

[Répéter pour autres composants selon le scope]

code

**⏸️ STOP** - Validation composants

---

### 4. Patterns & Guidelines

```markdown
## 📚 Patterns UI

### Layout
- **Container max-width** : 1200px (centré)
- **Grid** : 12 colonnes, gutter 24px
- **Content width** : max 65ch pour la lecture

### Iconographie
- **Style** : [Outlined / Filled / Duo-tone]
- **Taille standard** : 24px
- **Librairie** : [Lucide / Heroicons / Phosphor]
- **Usage** : Toujours avec label accessible

### Feedback utilisateur
| Type | Durée | Position |
|------|-------|----------|
| Toast success | 3s auto-dismiss | Top-right |
| Toast error | Manual dismiss | Top-right |
| Loading | Jusqu'à completion | Inline ou overlay |

### Animations
| Type | Durée | Easing |
|------|-------|--------|
| Micro-interaction | 150ms | ease-out |
| Transition page | 300ms | ease-in-out |
| Modal open | 200ms | ease-out |

5. Export Design System

Créer docs/planning/ui/UI-{feature-slug}.md :

markdown
---
title: UI Design System - [Nom]
date: YYYY-MM-DD
status: draft | validated
trigger: auto | manual
source: ux-design | prd | direct
---

# UI Design System: [Nom]

## 1. Design Tokens
[Export complet des tokens]

## 2. Composants
[Liste et specs de chaque composant]

## 3. Patterns
[Guidelines d'usage]

## 4. Accessibilité
[Checklist couleurs, contrastes, tailles]

## 5. Implementation Notes
- Framework cible : [X]
- CSS approach : [CSS Modules / Tailwind / Styled-components]
- Suggestion : [Recommandations pour le dev]

Export CSS Variables (optionnel)

css
/* docs/planning/ui/tokens.css */
:root {
  /* Colors */
  --color-primary: #[hex];
  --color-secondary: #[hex];
  /* ... */

  /* Typography */
  --font-family-sans: 'Inter', sans-serif;
  /* ... */

  /* Spacing */
  --space-xs: 4px;
  /* ... */
}

6. Validation & Transition

markdown
## 🎨 UI Design Terminé

Documents créés :
- `docs/planning/ui/UI-{slug}.md`
- `docs/planning/ui/tokens.css` (optionnel)

### Résumé
- **Tokens définis** : [nombre par catégorie]
- **Composants spécifiés** : [nombre]
- **Contraste WCAG** : [AA/AAA]

### Points clés
- [Choix design important 1]
- [Choix design important 2]

---

**Prochaine étape ?**
- [A] Passer à l'Architecture (intégrer les specs UI)
- [S] Passer aux Stories (avec specs UI)
- [R] Réviser l'UI
- [X] Exporter les tokens en CSS

⏸️ STOP - Attendre le choix


Règles

  • Tokens first : Définir les tokens avant les composants
  • Consistency : Un même élément = un même style partout
  • Accessibilité : Contraste AA minimum obligatoire
  • Developer handoff : Specs claires et mesures exactes
  • Scalable : Penser système, pas pages isolées

Output Validation

Avant de proposer la transition, valider :

markdown
### ✅ Checklist Output UI Design

| Critère | Status |
|---------|--------|
| Fichier créé dans `docs/planning/ui/` | ✅/❌ |
| Tokens couleurs définis | ✅/❌ |
| Tokens typographie définis | ✅/❌ |
| Tokens spacing définis | ✅/❌ |
| Composants principaux spécifiés | ✅/❌ |
| États des composants documentés | ✅/❌ |
| Contraste WCAG AA validé | ✅/❌ |
| tokens.css exporté (optionnel) | ✅/❌/- |

**Score : X/7** → Si < 5, compléter avant transition

Auto-Chain

Après validation de l'UI, proposer automatiquement :

markdown
## 🔗 Prochaine étape

✅ UI Design terminé et sauvegardé.

**Flux recommandé :**

[Si Architecture pas encore faite]
→ 🏗️ **Lancer `/architect` ?** (intégrer les specs UI dans l'archi)

[Si Architecture existe]
→ 📝 **Lancer `/pm-stories` ?** (créer les stories avec specs UI)

---

**[Y] Oui, continuer** | **[N] Non, je choisis** | **[P] Pause**

⏸️ STOP - Attendre confirmation avant auto-lancement


Transitions

  • Vers architect : "On intègre le design system dans l'architecture ?"
  • Vers pm-stories : "On crée les stories avec les specs UI ?"
  • Vers ux-designer : "On revoit l'UX avant de finaliser l'UI ?"
  • Vers figma-setup : "On configure Code Connect pour mapper les composants Figma ?"
  • Vers figma-to-code : "On génère du code depuis un design Figma ?"