@maboussoleaidant/design-system 0.1.33 → 0.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +286 -0
- package/README.md +82 -0
- package/dist/mba-design-system.css +21 -14
- package/dist/mba-design-system.css.map +1 -1
- package/dist/mba-design-system.min.css +1 -1
- package/dist/mba-tailwind.css +69 -13
- package/dist/mba-tailwind.css.map +1 -1
- package/dist/mba-tailwind.min.css +1 -1
- package/package.json +5 -2
package/AGENTS.md
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# MBA Design System — Instructions pour assistants IA (Claude, Cursor, Copilot, Codex)
|
|
2
|
+
|
|
3
|
+
Ce fichier est destiné aux **assistants IA** (LLM agents, IDE copilots) qui écrivent ou modifient du code consommant le Design System `@maboussoleaidant/design-system`. Il décrit l'architecture en couches, la règle d'or pour utiliser Tailwind correctement, et fournit la table de référence complète des tokens. Si vous êtes un humain, lisez plutôt le `README.md` et la doc Storybook.
|
|
4
|
+
|
|
5
|
+
> Pourquoi ce fichier existe : sans guidage, les LLM tombent sur les variables CSS brutes (`--mba-*`) avant de découvrir le preset Tailwind, et écrivent `class="text-[var(--mba-color-primary-900)]"` au lieu de `class="text-primary-900"`. Ce contournement duplique la couche d'abstraction et casse en silence si un token est renommé. Ce document élimine cette ambiguïté.
|
|
6
|
+
|
|
7
|
+
> **Lu depuis une app consommatrice ?** Les outils IA lisent `AGENTS.md` à la racine du repo courant, pas dans `node_modules/`. Pour activer ces instructions dans une app cliente, copiez le snippet d'activation depuis le [README du DS](./README.md#activation-dans-une-app-consommatrice) dans le `CLAUDE.md` / `AGENTS.md` à la racine de votre app.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Architecture en 3 couches
|
|
12
|
+
|
|
13
|
+
Le Design System expose **trois couches**, à utiliser dans l'ordre :
|
|
14
|
+
|
|
15
|
+
1. **Tokens** — `src/tokens/` exporte des CSS Custom Properties `--mba-*` (couleurs, espacements, typo, ombres, radius, etc.). Source de vérité, mais **pas faits pour être consommés directement** dans des classes utilitaires.
|
|
16
|
+
2. **Components** — `src/components/` fournit des classes pré-stylées `.mba-btn`, `.mba-header__nav`, `.mba-article-card`, `.mba-icon`, `.mba-wave`, etc. Elles consomment les tokens en interne et sont prêtes à l'emploi.
|
|
17
|
+
3. **Tailwind preset** — `src/tailwind-preset.css` mappe **chaque** token MBA vers une variable de thème Tailwind via `@theme {}`. C'est ce qui permet à Tailwind v4 (JIT) de générer des classes utilitaires comme `text-primary-900`, `bg-pastel-bleuet`, `p-md`, `rounded-md`, `shadow-md`. **C'est cette couche qu'il faut viser pour tout le styling ad-hoc.**
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Règle d'or pour Tailwind
|
|
22
|
+
|
|
23
|
+
> **N'utilisez jamais `[var(--mba-*)]` en valeur arbitraire Tailwind.** Utilisez systématiquement la classe utilitaire générée par le preset.
|
|
24
|
+
|
|
25
|
+
Le preset existe précisément pour ça. Le contourner :
|
|
26
|
+
|
|
27
|
+
- **duplique l'abstraction** (vous re-mappez à la main ce qui est déjà mappé)
|
|
28
|
+
- **casse silencieusement** si un token MBA est renommé ou réorganisé (le preset suit, votre `[var(--mba-...)]` non)
|
|
29
|
+
- **ignore le cache du JIT** et la déduplication CSS de Tailwind
|
|
30
|
+
- **rend le code illisible** pour les humains qui relisent
|
|
31
|
+
|
|
32
|
+
Si une utilité semble manquer, elle a presque toujours un équivalent dans la table des tokens plus bas. Si elle manque vraiment, ouvrez une issue sur le DS — n'écrivez pas un workaround `[var(...)]`.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## DO / DON'T
|
|
37
|
+
|
|
38
|
+
| ✅ DO | ❌ DON'T |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| `class="text-primary-900"` | `class="text-[var(--mba-color-primary-900)]"` |
|
|
41
|
+
| `class="bg-pastel-bleuet"` | `class="bg-[var(--mba-color-pastel-bleuet)]"` |
|
|
42
|
+
| `class="p-md"` | `class="p-[var(--mba-space-md)]"` |
|
|
43
|
+
| `class="rounded-md"` | `class="rounded-[var(--mba-radius-md)]"` |
|
|
44
|
+
| `class="shadow-md"` | `class="shadow-[var(--mba-shadow-md)]"` |
|
|
45
|
+
| `class="hidden"` | `class="[display:none]"` |
|
|
46
|
+
| `class="h-64"` (16rem) | `class="h-[295px]"` (valeur en pixels figée) |
|
|
47
|
+
| `class="font-heading"` | `class="font-[var(--mba-font-family-heading)]"` |
|
|
48
|
+
|
|
49
|
+
Règle dérivée : **avant** d'écrire une valeur arbitraire `[...]`, regardez la table de référence des tokens. Si elle est listée, utilisez la classe utilitaire correspondante.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Pattern d'import recommandé
|
|
54
|
+
|
|
55
|
+
Dans le fichier CSS d'entrée de votre app (par ex. `src/styles/global.css` pour Astro, `src/styles.css` pour Angular) :
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
@import "@maboussoleaidant/design-system";
|
|
59
|
+
@import "tailwindcss";
|
|
60
|
+
@import "@maboussoleaidant/design-system/preset";
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
L'**ordre est important** :
|
|
64
|
+
|
|
65
|
+
1. `@maboussoleaidant/design-system` — charge les tokens (`--mba-*`) et les composants (`.mba-*`). **Premier**, car le preset en dépend (les `var(--mba-*)` du preset doivent résoudre).
|
|
66
|
+
2. `tailwindcss` — initialise Tailwind v4 et son JIT.
|
|
67
|
+
3. `@maboussoleaidant/design-system/preset` — charge le mapping `@theme {}` qui rend les tokens MBA disponibles comme classes utilitaires Tailwind. **Doit venir après** Tailwind pour que le `@theme` soit pris en compte.
|
|
68
|
+
|
|
69
|
+
Inverser ces lignes casse silencieusement la résolution des classes (`text-primary-900` redevient inconnu).
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Référence complète des tokens
|
|
74
|
+
|
|
75
|
+
<!-- AUTO-GENERATED:tokens-mapping START -->
|
|
76
|
+
|
|
77
|
+
_Auto-generated from `src/tailwind-preset.css` — do not edit by hand. Run `npm run docs:agents` to regenerate._
|
|
78
|
+
|
|
79
|
+
### Colors
|
|
80
|
+
|
|
81
|
+
Chaque couleur est utilisable comme `bg-{name}`, `text-{name}`, `border-{name}`, `ring-{name}`, `fill-{name}`, `stroke-{name}`.
|
|
82
|
+
|
|
83
|
+
| MBA CSS variable | Tailwind name |
|
|
84
|
+
| --- | --- |
|
|
85
|
+
| `--mba-color-white` | `white` |
|
|
86
|
+
| `--mba-color-black` | `black` |
|
|
87
|
+
| `--mba-color-grey-50` | `grey-50` |
|
|
88
|
+
| `--mba-color-grey-100` | `grey-100` |
|
|
89
|
+
| `--mba-color-grey-300` | `grey-300` |
|
|
90
|
+
| `--mba-color-grey-400` | `grey-400` |
|
|
91
|
+
| `--mba-color-grey-800` | `grey-800` |
|
|
92
|
+
| `--mba-color-primary-50` | `primary-50` |
|
|
93
|
+
| `--mba-color-primary-100` | `primary-100` |
|
|
94
|
+
| `--mba-color-primary-400` | `primary-400` |
|
|
95
|
+
| `--mba-color-primary-500` | `primary-500` |
|
|
96
|
+
| `--mba-color-primary-800` | `primary-800` |
|
|
97
|
+
| `--mba-color-primary-900` | `primary-900` |
|
|
98
|
+
| `--mba-color-secondary-500` | `secondary-500` |
|
|
99
|
+
| `--mba-color-primary-pro-50` | `primary-pro-50` |
|
|
100
|
+
| `--mba-color-primary-pro-100` | `primary-pro-100` |
|
|
101
|
+
| `--mba-color-primary-pro-400` | `primary-pro-400` |
|
|
102
|
+
| `--mba-color-primary-pro-500` | `primary-pro-500` |
|
|
103
|
+
| `--mba-color-primary-pro-800` | `primary-pro-800` |
|
|
104
|
+
| `--mba-color-error-100` | `error-100` |
|
|
105
|
+
| `--mba-color-error-300` | `error-300` |
|
|
106
|
+
| `--mba-color-error-400` | `error-400` |
|
|
107
|
+
| `--mba-color-error-500` | `error-500` |
|
|
108
|
+
| `--mba-color-error-800` | `error-800` |
|
|
109
|
+
| `--mba-color-success-100` | `success-100` |
|
|
110
|
+
| `--mba-color-success-300` | `success-300` |
|
|
111
|
+
| `--mba-color-success-400` | `success-400` |
|
|
112
|
+
| `--mba-color-success-500` | `success-500` |
|
|
113
|
+
| `--mba-color-success-800` | `success-800` |
|
|
114
|
+
| `--mba-color-warning-50` | `warning-50` |
|
|
115
|
+
| `--mba-color-warning-100` | `warning-100` |
|
|
116
|
+
| `--mba-color-warning-300` | `warning-300` |
|
|
117
|
+
| `--mba-color-warning-400` | `warning-400` |
|
|
118
|
+
| `--mba-color-warning-500` | `warning-500` |
|
|
119
|
+
| `--mba-color-warning-800` | `warning-800` |
|
|
120
|
+
| `--mba-color-info-50` | `info-50` |
|
|
121
|
+
| `--mba-color-info-100` | `info-100` |
|
|
122
|
+
| `--mba-color-info-300` | `info-300` |
|
|
123
|
+
| `--mba-color-info-400` | `info-400` |
|
|
124
|
+
| `--mba-color-info-500` | `info-500` |
|
|
125
|
+
| `--mba-color-info-800` | `info-800` |
|
|
126
|
+
| `--mba-color-brick-light` | `brick-light` |
|
|
127
|
+
| `--mba-color-brick` | `brick` |
|
|
128
|
+
| `--mba-color-forest-light` | `forest-light` |
|
|
129
|
+
| `--mba-color-forest` | `forest` |
|
|
130
|
+
| `--mba-color-rose-light` | `rose-light` |
|
|
131
|
+
| `--mba-color-rose` | `rose` |
|
|
132
|
+
| `--mba-color-pastel-bleuet` | `pastel-bleuet` |
|
|
133
|
+
| `--mba-color-pastel-lavender` | `pastel-lavender` |
|
|
134
|
+
| `--mba-color-pastel-narcisse` | `pastel-narcisse` |
|
|
135
|
+
| `--mba-color-pastel-oranger` | `pastel-oranger` |
|
|
136
|
+
| `--mba-color-beige` | `beige` |
|
|
137
|
+
|
|
138
|
+
### Fonts (font-family)
|
|
139
|
+
|
|
140
|
+
Utiliser comme `font-{name}` (ex. `font-heading`).
|
|
141
|
+
|
|
142
|
+
| MBA CSS variable | Tailwind name |
|
|
143
|
+
| --- | --- |
|
|
144
|
+
| `--mba-font-family-text` | `sans` |
|
|
145
|
+
| `--mba-font-family-heading` | `heading` |
|
|
146
|
+
| `--mba-font-family-mono` | `mono` |
|
|
147
|
+
|
|
148
|
+
### Font sizes
|
|
149
|
+
|
|
150
|
+
Utiliser comme `text-{name}` (ex. `text-md`).
|
|
151
|
+
|
|
152
|
+
| MBA CSS variable | Tailwind name |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| `--mba-font-size-xxs` | `xxs` |
|
|
155
|
+
| `--mba-font-size-xs` | `xs` |
|
|
156
|
+
| `--mba-font-size-sm` | `sm` |
|
|
157
|
+
| `--mba-font-size-md` | `md` |
|
|
158
|
+
| `--mba-font-size-xl` | `xl` |
|
|
159
|
+
| `--mba-font-size-xxl` | `xxl` |
|
|
160
|
+
|
|
161
|
+
### Spacing — semantic scale
|
|
162
|
+
|
|
163
|
+
Utiliser comme `p-{name}`, `m-{name}`, `gap-{name}`, `w-{name}`, `h-{name}`, `space-x-{name}`, `space-y-{name}`, `size-{name}`, `inset-{name}`, etc.
|
|
164
|
+
|
|
165
|
+
| MBA CSS variable | Tailwind name |
|
|
166
|
+
| --- | --- |
|
|
167
|
+
| `--mba-space-0` | `0` |
|
|
168
|
+
| `--mba-space-px` | `px` |
|
|
169
|
+
| `--mba-space-xxs` | `xxs` |
|
|
170
|
+
| `--mba-space-xs` | `xs` |
|
|
171
|
+
| `--mba-space-sm` | `sm` |
|
|
172
|
+
| `--mba-space-md` | `md` |
|
|
173
|
+
| `--mba-space-lg` | `lg` |
|
|
174
|
+
| `--mba-space-xl` | `xl` |
|
|
175
|
+
| `--mba-space-xxl` | `xxl` |
|
|
176
|
+
|
|
177
|
+
### Spacing — numeric scale
|
|
178
|
+
|
|
179
|
+
Tailwind's numeric spacing scale is mapped 1:1 to rem values (no `--mba-*` indirection). Use them anywhere a Tailwind spacing utility is expected (`p-*`, `m-*`, `w-*`, `h-*`, `gap-*`, `space-x-*`, `space-y-*`, `size-*`, `min-w-*`, `inset-*`, etc.).
|
|
180
|
+
|
|
181
|
+
| Tailwind tokens | rem range |
|
|
182
|
+
| --- | --- |
|
|
183
|
+
| `1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 96` | `0.25rem` → `24rem` |
|
|
184
|
+
|
|
185
|
+
### Max-width
|
|
186
|
+
|
|
187
|
+
Utiliser comme `max-w-{name}`.
|
|
188
|
+
|
|
189
|
+
| MBA CSS variable | Tailwind name |
|
|
190
|
+
| --- | --- |
|
|
191
|
+
| _(literal: `20rem`)_ | `xs` |
|
|
192
|
+
| _(literal: `24rem`)_ | `sm` |
|
|
193
|
+
| _(literal: `28rem`)_ | `md` |
|
|
194
|
+
| _(literal: `32rem`)_ | `lg` |
|
|
195
|
+
| _(literal: `36rem`)_ | `xl` |
|
|
196
|
+
| _(literal: `42rem`)_ | `2xl` |
|
|
197
|
+
| _(literal: `48rem`)_ | `3xl` |
|
|
198
|
+
| _(literal: `56rem`)_ | `4xl` |
|
|
199
|
+
| _(literal: `64rem`)_ | `5xl` |
|
|
200
|
+
| _(literal: `72rem`)_ | `6xl` |
|
|
201
|
+
| _(literal: `80rem`)_ | `7xl` |
|
|
202
|
+
| _(literal: `100%`)_ | `full` |
|
|
203
|
+
| _(literal: `none`)_ | `none` |
|
|
204
|
+
|
|
205
|
+
### Border radius
|
|
206
|
+
|
|
207
|
+
Utiliser comme `rounded-{name}`.
|
|
208
|
+
|
|
209
|
+
| MBA CSS variable | Tailwind name |
|
|
210
|
+
| --- | --- |
|
|
211
|
+
| `--mba-radius-none` | `none` |
|
|
212
|
+
| `--mba-radius-2xs` | `2xs` |
|
|
213
|
+
| `--mba-radius-xs` | `xs` |
|
|
214
|
+
| `--mba-radius-sm` | `sm` |
|
|
215
|
+
| `--mba-radius-md` | `md` |
|
|
216
|
+
| `--mba-radius-lg` | `lg` |
|
|
217
|
+
| `--mba-radius-xl` | `xl` |
|
|
218
|
+
| `--mba-radius-xxl` | `xxl` |
|
|
219
|
+
| `--mba-radius-full` | `full` |
|
|
220
|
+
|
|
221
|
+
### Shadows
|
|
222
|
+
|
|
223
|
+
Utiliser comme `shadow-{name}`.
|
|
224
|
+
|
|
225
|
+
| MBA CSS variable | Tailwind name |
|
|
226
|
+
| --- | --- |
|
|
227
|
+
| `--mba-shadow-none` | `none` |
|
|
228
|
+
| `--mba-shadow-xxs` | `xxs` |
|
|
229
|
+
| `--mba-shadow-xs` | `xs` |
|
|
230
|
+
| `--mba-shadow-sm` | `sm` |
|
|
231
|
+
| `--mba-shadow-md` | `md` |
|
|
232
|
+
| `--mba-shadow-inner` | `inner` |
|
|
233
|
+
|
|
234
|
+
<!-- AUTO-GENERATED:tokens-mapping END -->
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Composants `.mba-*`
|
|
239
|
+
|
|
240
|
+
Le DS fournit des **composants pré-stylés** qu'il vaut mieux utiliser plutôt que de recomposer en utilitaires Tailwind.
|
|
241
|
+
|
|
242
|
+
<!-- AUTO-GENERATED:components-list START -->
|
|
243
|
+
|
|
244
|
+
_Auto-generated from `src/components/` and `src/base/_icons.css` — do not edit by hand. Run `npm run docs:agents` to regenerate._
|
|
245
|
+
|
|
246
|
+
Liste des classes racines (les sous-éléments BEM `__*` sont internes et ne sont pas listés). Voir Storybook pour les variantes, états et exemples.
|
|
247
|
+
|
|
248
|
+
- **Icônes** : `.mba-icon`, `.mba-icon--error`, `.mba-icon--fill`, `.mba-icon--info`, `.mba-icon--muted`, `.mba-icon--primary`, `.mba-icon--sm`, `.mba-icon--success`, `.mba-icon--warning`, `.mba-icon--xs`
|
|
249
|
+
- **Boutons** : `.mba-btn`, `.mba-btn-annuaire`, `.mba-btn-block`, `.mba-btn-icon-only`, `.mba-btn-inline`, `.mba-btn-light`, `.mba-btn-pin`, `.mba-btn-secondary`, `.mba-btn-sm`, `.mba-btn-tertiary`
|
|
250
|
+
- **Header** : `.mba-header`, `.mba-header--fixed`, `.mba-header--partenaire`, `.mba-header--sticky`, `.mba-header--transparent`
|
|
251
|
+
- **Footer** : `.mba-footer`, `.mba-footer--pro`
|
|
252
|
+
- **Sections** : `.mba-section`, `.mba-section--after-header`, `.mba-section--beige`, `.mba-section--bleuet`, `.mba-section--lavender`, `.mba-section--narcisse`, `.mba-section--oranger`, `.mba-section--primary-50`, `.mba-section--wave-beige`, `.mba-section--wave-bleuet`, `.mba-section--wave-both`, `.mba-section--wave-bottom`, `.mba-section--wave-inset`, `.mba-section--wave-lavender`, `.mba-section--wave-narcisse`, `.mba-section--wave-oranger`, `.mba-section--wave-primary-50`, `.mba-section--wave-sm`, `.mba-section--wave-top`, `.mba-section--white`
|
|
253
|
+
- **Wave (autonome)** : `.mba-wave`, `.mba-wave--beige`, `.mba-wave--bleuet`, `.mba-wave--bottom`, `.mba-wave--lavender`, `.mba-wave--narcisse`, `.mba-wave--oranger`, `.mba-wave--sm`, `.mba-wave--top`, `.mba-wave--white`
|
|
254
|
+
- **Cartes** : `.mba-article-card`, `.mba-article-card-grid`, `.mba-card`, `.mba-card--sm`, `.mba-card--static`, `.mba-card--white`, `.mba-card-grid`, `.mba-carousel-card`, `.mba-stats-card`, `.mba-stats-grid`
|
|
255
|
+
- **Formulaires (input, textarea, dropdown, …)** : `.mba-dropdown`, `.mba-dropdown--error`, `.mba-dropdown--open`, `.mba-dropdown--pro`, `.mba-dropdown--valid`, `.mba-feedback`, `.mba-feedback--error`, `.mba-feedback--valid`, `.mba-form-group`, `.mba-input`, `.mba-input--error`, `.mba-input--valid`, `.mba-input-group`, `.mba-input-icon`, `.mba-input-icon--disabled`, `.mba-input-icon--error`, `.mba-label`, `.mba-textarea`, `.mba-textarea--error`, `.mba-textarea--valid`, `.mba-toggle`
|
|
256
|
+
- **Radio / Checkbox** : `.mba-checkbox`, `.mba-checkbox--pro`, `.mba-checkbox-label`, `.mba-radio`, `.mba-radio--pro`, `.mba-radio-label`
|
|
257
|
+
- **Accordéons** : `.mba-accordion`, `.mba-accordion--full-width`, `.mba-accordion--line`, `.mba-accordion--open`, `.mba-accordion--partenaire`, `.mba-accordion-group`
|
|
258
|
+
- **Pagination** : `.mba-dot`, `.mba-dots`, `.mba-pagination`, `.mba-pagination-arrow`, `.mba-pagination-ellipsis`, `.mba-pagination-item`
|
|
259
|
+
- **Liens** : `.mba-link`
|
|
260
|
+
- **Flèches / Décorations** : `.mba-arrow`
|
|
261
|
+
<!-- AUTO-GENERATED:components-list END -->
|
|
262
|
+
|
|
263
|
+
**Règle** : si un composant `.mba-*` existe pour ce que vous construisez, utilisez-le. Ajoutez des utilitaires Tailwind seulement pour la mise en page (positionnement, marges, container).
|
|
264
|
+
|
|
265
|
+
Pour la liste complète et les variantes : Storybook (`npm run storybook` dans le repo DS).
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Pièges connus
|
|
270
|
+
|
|
271
|
+
Comportements observés en vrai dans le code consommateur — à éviter :
|
|
272
|
+
|
|
273
|
+
- **Bypass via `[var(--mba-...)]`** : voir la règle d'or. Le preset existe, utilisez-le.
|
|
274
|
+
- **`[display:none]` au lieu de `hidden`** : `hidden` est une utilité Tailwind native, équivalente, et idiomatique.
|
|
275
|
+
- **Pixels figés** (`h-[295px]`, `w-[420px]`) : préférez l'échelle de spacing (`h-72` = 18rem, `w-96` = 24rem). Si la valeur exacte est imposée par un visuel, c'est probablement un problème de design — discutez-en avant.
|
|
276
|
+
- **Erreur de mapping `--mba-*` → Tailwind** : la variable `--mba-color-primary-900` devient `primary-900` dans Tailwind (préfixe `--mba-color-` retiré), donc `text-primary-900` — **pas** `text-mba-color-primary-900` et **pas** `text-mba-primary-900`.
|
|
277
|
+
- **Oublier les 3 imports** : si le preset n'est pas importé, `text-primary-900` n'existe simplement pas et Tailwind tombe en silence sur la valeur par défaut. Vérifier le fichier d'entrée CSS de l'app.
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Pour les humains
|
|
282
|
+
|
|
283
|
+
- `README.md` — installation, options d'import, structure du package
|
|
284
|
+
- Storybook — catalogue interactif des composants (`npm run storybook` dans le repo DS, ou docs déployées)
|
|
285
|
+
- `src/tokens/` — source des CSS variables `--mba-*`
|
|
286
|
+
- `src/tailwind-preset.css` — source du mapping `@theme {}` (la table ci-dessus en est dérivée automatiquement)
|
package/README.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
Design System pour l'écosystème Ma Boussole Aidant.
|
|
4
4
|
|
|
5
|
+
## Pour les LLM / AI Assistants
|
|
6
|
+
|
|
7
|
+
Si vous êtes un assistant IA (Claude, Cursor, Copilot, Codex, etc.) qui édite du code consommant ce Design System, **lisez d'abord [`AGENTS.md`](./AGENTS.md)**. Il décrit l'architecture en couches, la règle d'or pour Tailwind v4, et la table de référence complète des tokens.
|
|
8
|
+
|
|
9
|
+
**Règle d'or, en une phrase** : utilisez toujours les classes utilitaires générées par le preset Tailwind (`text-primary-900`, `p-md`, `rounded-md`, `shadow-md`) — n'écrivez jamais `[var(--mba-...)]` en valeur arbitraire, le preset existe précisément pour éviter ce contournement.
|
|
10
|
+
|
|
11
|
+
### Activation dans une app consommatrice
|
|
12
|
+
|
|
13
|
+
Les outils IA (Claude Code, Cursor, Codex…) lisent `AGENTS.md` / `CLAUDE.md` **à la racine du repo courant**, pas dans `node_modules/`. Pour activer les instructions de ce DS dans une app cliente, copiez ce bloc dans le `CLAUDE.md` (ou `AGENTS.md`) à la racine de votre app :
|
|
14
|
+
|
|
15
|
+
```md
|
|
16
|
+
## Design System : @maboussoleaidant/design-system
|
|
17
|
+
|
|
18
|
+
Cette app consomme `@maboussoleaidant/design-system`. Avant d'écrire du HTML/template avec des classes Tailwind ou MBA, lis les instructions complètes :
|
|
19
|
+
|
|
20
|
+
📄 `node_modules/@maboussoleaidant/design-system/AGENTS.md`
|
|
21
|
+
|
|
22
|
+
**Règle d'or** : utilise les utilitaires Tailwind générés par le preset (`text-primary-900`, `p-md`, `rounded-md`, `shadow-md`, `font-heading`), **jamais** `class="*-[var(--mba-...)]"`. Le preset existe pour éviter ce contournement.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Le fichier `AGENTS.md` est inclus dans le tarball npm — il sera disponible dès `npm install`.
|
|
26
|
+
|
|
5
27
|
## Installation
|
|
6
28
|
|
|
7
29
|
```bash
|
|
@@ -77,6 +99,66 @@ npm run build
|
|
|
77
99
|
npm run dev
|
|
78
100
|
```
|
|
79
101
|
|
|
102
|
+
### Ajouter un composant
|
|
103
|
+
|
|
104
|
+
Quand tu crées un nouveau `src/components/_mon-composant.css` :
|
|
105
|
+
|
|
106
|
+
1. **Importer** dans `src/components/index.css` :
|
|
107
|
+
```css
|
|
108
|
+
@import './_mon-composant.css';
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
2. **Référencer dans `AGENTS.md`** — ajouter une entrée dans `COMPONENT_FILES` au début de [`scripts/build-agents-md.mjs`](./scripts/build-agents-md.mjs) :
|
|
112
|
+
```js
|
|
113
|
+
{ path: 'src/components/_mon-composant.css', label: 'Mon composant', prefixes: ['mba-mon-composant'] },
|
|
114
|
+
```
|
|
115
|
+
Puis régénérer :
|
|
116
|
+
```bash
|
|
117
|
+
npm run docs:agents
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
> Si tu oublies cette étape, `npm run docs:agents` plante avec un message clair, et `npm publish` est bloqué via `prepublishOnly`. C'est volontaire — ça force le composant à apparaître dans AGENTS.md pour que les LLM le découvrent.
|
|
121
|
+
|
|
122
|
+
3. **Builder et créer la story Storybook** comme d'habitude.
|
|
123
|
+
|
|
124
|
+
### Publier une nouvelle version
|
|
125
|
+
|
|
126
|
+
Une fois ta PR mergée sur `development` (ou `main`) :
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
git checkout development
|
|
130
|
+
git pull
|
|
131
|
+
npm version patch # ou minor / major selon la nature du changement
|
|
132
|
+
npm publish
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### Ce qui se passe sous le capot
|
|
136
|
+
|
|
137
|
+
`npm publish` déclenche `prepublishOnly`, qui exécute dans l'ordre :
|
|
138
|
+
|
|
139
|
+
1. **`npm run docs:agents:check`** — régénère `AGENTS.md` depuis le preset + les composants, puis `git diff --exit-code AGENTS.md`.
|
|
140
|
+
- ✅ Aucun diff → on continue.
|
|
141
|
+
- ❌ Diff → **publish avorté**. Lance `npm run docs:agents`, commit le résultat, push, retry.
|
|
142
|
+
2. **`npm run build`** — build standard (assets, CSS, tailwind, minification).
|
|
143
|
+
3. **`npm publish`** uploade le tarball avec `dist/`, `assets/`, `src/tokens/`, `src/tailwind-preset.css`, **`AGENTS.md`**, `README.md`, `LICENSE`.
|
|
144
|
+
|
|
145
|
+
#### Cas d'échec possibles
|
|
146
|
+
|
|
147
|
+
| Situation | Symptôme | Fix |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| Token ajouté au preset sans régénérer | `docs:agents:check` exit 1, diff visible | `npm run docs:agents` + commit |
|
|
150
|
+
| `src/components/_xxx.css` ajouté sans mapper dans `COMPONENT_FILES` | Script plante avec un message pointant vers le fichier non mappé | Ajouter l'entrée (voir [§ Ajouter un composant](#ajouter-un-composant)) |
|
|
151
|
+
| Tailwind v4 a sorti un nouveau type de token (`--ease-*`, `--breakpoint-*`) | `console.warn` au regen + section "Autres" auto-ajoutée dans AGENTS.md | Pas bloquant ; mettre à jour `categorize()` dans `scripts/build-agents-md.mjs` quand possible |
|
|
152
|
+
|
|
153
|
+
#### Pré-vérifications locales (optionnel)
|
|
154
|
+
|
|
155
|
+
Avant de toucher `npm version`, tu peux simuler :
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
npm pack --dry-run # liste exactement ce qui partira (confirme la présence d'AGENTS.md)
|
|
159
|
+
npm run docs:agents:check # valide que la doc est synchrone avec les sources
|
|
160
|
+
```
|
|
161
|
+
|
|
80
162
|
## Structure
|
|
81
163
|
|
|
82
164
|
```
|
|
@@ -3112,25 +3112,32 @@ button.mba-input-icon__icon:hover {
|
|
|
3112
3112
|
border-radius: var(--mba-radius-sm);
|
|
3113
3113
|
box-shadow: var(--mba-shadow-sm);
|
|
3114
3114
|
padding: var(--mba-space-sm);
|
|
3115
|
-
display: none;
|
|
3116
3115
|
z-index: 1000;
|
|
3117
|
-
|
|
3116
|
+
opacity: 0;
|
|
3117
|
+
visibility: hidden;
|
|
3118
|
+
transform: translateY(calc(-1 * var(--mba-space-xs)));
|
|
3119
|
+
pointer-events: none;
|
|
3120
|
+
transition: opacity var(--mba-transition-base),
|
|
3121
|
+
transform var(--mba-transition-base),
|
|
3122
|
+
visibility var(--mba-transition-base);
|
|
3118
3123
|
}
|
|
3119
3124
|
|
|
3120
|
-
|
|
3121
|
-
|
|
3122
|
-
|
|
3125
|
+
/* Zone invisible au-dessus du dropdown pour combler le gap avec le trigger */
|
|
3126
|
+
.mba-header__dropdown::before {
|
|
3127
|
+
content: "";
|
|
3128
|
+
position: absolute;
|
|
3129
|
+
top: calc(-1 * var(--mba-space-lg));
|
|
3130
|
+
left: 0;
|
|
3131
|
+
right: 0;
|
|
3132
|
+
height: var(--mba-space-lg);
|
|
3123
3133
|
}
|
|
3124
3134
|
|
|
3125
|
-
|
|
3126
|
-
|
|
3127
|
-
|
|
3128
|
-
|
|
3129
|
-
|
|
3130
|
-
|
|
3131
|
-
opacity: 1;
|
|
3132
|
-
transform: translateY(0);
|
|
3133
|
-
}
|
|
3135
|
+
.mba-header__dropdown--open {
|
|
3136
|
+
opacity: 1;
|
|
3137
|
+
visibility: visible;
|
|
3138
|
+
transform: translateY(0);
|
|
3139
|
+
box-shadow: var(--mba-shadow-xs);
|
|
3140
|
+
pointer-events: auto;
|
|
3134
3141
|
}
|
|
3135
3142
|
|
|
3136
3143
|
.mba-header__dropdown-title {
|