diff --git a/.gitignore b/.gitignore index 5809a98..e275ca6 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ packages/tokens/src/lib/cunningham.ts # Claude Code CLAUDE.md .claude* + +# OpenSpec +openspec/ diff --git a/openspec/changes/archive/2026-01-26-field-variant-classic/design.md b/openspec/changes/archive/2026-01-26-field-variant-classic/design.md deleted file mode 100644 index 9b11164..0000000 --- a/openspec/changes/archive/2026-01-26-field-variant-classic/design.md +++ /dev/null @@ -1,167 +0,0 @@ -## Context - -Le design system Cunningham utilise actuellement un pattern "floating label" pour tous les champs de formulaire. Ce pattern est implémenté via le composant `LabelledBox` qui est utilisé par Input, TextArea, Select et DatePicker. - -Architecture actuelle : -``` -Field (wrapper: state, text, fullWidth) - └── LabelledBox (gère le label flottant) - └── Composant natif (input, textarea, etc.) -``` - -Le `LabelledBox` gère : -- Le positionnement du label (absolu, avec transition) -- L'état `labelAsPlaceholder` (label en grand = placeholder, label petit = au-dessus) -- Le CSS des transitions - -## Goals / Non-Goals - -**Goals:** -- Ajouter une variante `classic` avec label externe et placeholder natif -- Maintenir la rétrocompatibilité (floating = défaut) -- Supporter la variante classic sur tous les composants concernés -- Avoir un champ plus compact en mode classic - -**Non-Goals:** -- Changer le comportement par défaut des composants existants -- Créer des composants séparés (ClassicInput, etc.) -- Modifier Checkbox, Radio, Switch (déjà label externe) - -## Decisions - -### 1. Type `FieldVariant` partagé - -Créer un type exporté dans `packages/react/src/components/Forms/types.ts` : - -```typescript -export type FieldVariant = "floating" | "classic"; -``` - -**Pourquoi** : Assure la cohérence du typage entre tous les composants. - -### 2. Architecture en mode Classic - -En mode classic, **le label est rendu EN DEHORS du wrapper bordé**, pas à l'intérieur : - -``` -Field (wrapper) - └── label.c__input__label (EN DEHORS - nouveau) - └── div.c__input__wrapper (wrapper bordé) - └── Composant natif (input) -``` - -Vs mode floating (existant) : -``` -Field (wrapper) - └── div.c__input__wrapper (wrapper bordé) - └── LabelledBox (gère le label flottant) - └── Composant natif (input) -``` - -**Pourquoi** : Le label doit être visuellement au-dessus de la bordure du champ, pas à l'intérieur. - -### 3. CSS pour la variante classic - -Chaque composant a sa propre classe label et un modifier `--classic` sur le wrapper : - -```scss -// Label externe -.c__input__label { - display: block; - font-size: var(--c--components--forms-labelledbox--classic-label-font-size); - color: var(--c--components--forms-labelledbox--label-color--small); - margin-bottom: var(--c--components--forms-labelledbox--classic-label-margin-bottom); -} - -// Wrapper en mode classic -.c__input__wrapper--classic { - align-items: center; // Centrage vertical du contenu - height: 2.75rem; // Hauteur réduite (vs 3.5rem en floating) -} -``` - -Classes par composant : -- Input : `.c__input__label`, `.c__input__wrapper--classic` -- TextArea : `.c__textarea__label`, `.c__textarea__wrapper--classic` -- Select : `.c__select__label`, `.c__select--classic` -- DatePicker : `.c__date-picker__label`, `.c__date-picker--classic` - -### 4. Gestion du placeholder par composant - -Chaque composant gère son placeholder selon la variante : - -**Input / TextArea** : -```typescript -// Si variant="classic", passer placeholder au /