@maboussoleaidant/design-system 0.1.33 → 0.1.35

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 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
  ```
@@ -2960,7 +2960,7 @@ button.mba-input-icon__icon:hover {
2960
2960
  .mba-header {
2961
2961
  --mba-header-height: 64px;
2962
2962
  background-color: var(--mba-color-white);
2963
- border-radius: 0 0 var(--mba-radius-md) var(--mba-radius-md);
2963
+ border-radius: 0 0 var(--mba-radius-sm) var(--mba-radius-sm);
2964
2964
  box-shadow: var(--mba-shadow-xs);
2965
2965
  position: relative;
2966
2966
  width: 100%;
@@ -2989,8 +2989,8 @@ button.mba-input-icon__icon:hover {
2989
2989
  display: flex;
2990
2990
  align-items: center;
2991
2991
  justify-content: space-between;
2992
- padding: var(--mba-space-md) var(--mba-space-xl); /* 16px 32px */
2993
- max-width: var(--mba-container-width);
2992
+ padding: var(--mba-space-md) 5rem; /* vertical: md (24px), horizontal: 80px */
2993
+ max-width: 80rem; /* 1280px = 1120px de contenu + 2 x 80px de padding */
2994
2994
  margin: 0 auto;
2995
2995
  }
2996
2996
 
@@ -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
- animation: dropdownFadeIn var(--mba-transition-base);
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
- .mba-header__dropdown--open {
3121
- display: block;
3122
- box-shadow: var(--mba-shadow-xs);
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
- @keyframes dropdownFadeIn {
3126
- from {
3127
- opacity: 0;
3128
- transform: translateY(calc(-1 * var(--mba-space-xs)));
3129
- }
3130
- to {
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 {