@nomosui/react 0.5.3 → 0.7.0

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/SKILL.md CHANGED
@@ -27,17 +27,24 @@ pour expliquer une brique, elle appartient à l'app, pas au cœur.
27
27
  - **Recueillir ou montrer une note** → `Rating` : interactif seulement si l'app fournit
28
28
  `onValueChange`, sinon un affichage.
29
29
  - **Lister des événements datés** → `Timeline` (frise, présentation seule ; le format de
30
- la date vient de l'app).
30
+ la date vient de l'app). Un point porte un état — `done` (défaut) ou `past` (grisé) —
31
+ et un `past` exige un `stateLabel` fourni par l'app : la couleur seule ne suffit pas.
31
32
  - **Nommer un contrôle iconique, glisser une aide courte** → `Tooltip` en famille (un
32
33
  `TooltipProvider` autour de plusieurs, `Tooltip`, `TooltipTrigger`, `TooltipContent`).
33
34
  Jamais pour une information essentielle : elle n'est ni au clavier seul ni au tactile.
34
35
  - **Représenter une personne par son image** → `Avatar` (le texte alternatif et le repli
35
36
  viennent de l'app ; natif `<img>` + `onError`, sans dépendance).
37
+ - **Coiffer un titre d'une accroche courte** → `Kicker` (un libellé en majuscules, un point
38
+ de ton optionnel via `dot` ; le texte est injecté par l'appelant).
36
39
 
37
40
  ### Agir, saisir
38
41
 
39
42
  - **Agir** → `Button` (`variant` = le ton, `size` = la densité ; `asChild` pour poser le
40
43
  style sur un lien).
44
+ - **Naviguer vers une URL** → `Link` (un `<a>` ; `href` et libellé injectés, le cœur ne
45
+ porte aucun routing ; `asChild` pour poser le style sur un composant de routing de l'app).
46
+ - **Copier un texte** → `CopyButton` (`value` à copier, `label`/`copiedLabel` et `icon`
47
+ injectés ; le libellé transitoire revient seul après ~2 s).
41
48
  - **Saisir une ligne** → `Input` ; **un nombre borné** → `NumberField` (`step`, `min`,
42
49
  `max` du natif) ; **chercher avec icône et effacement** → `SearchField` ; **plusieurs
43
50
  lignes** → `Textarea`.
@@ -52,8 +59,13 @@ pour expliquer une brique, elle appartient à l'app, pas au cœur.
52
59
  ### Structurer
53
60
 
54
61
  - **Une surface** (titre, corps, pied) → les parts de `Card`.
62
+ - **L'en-tête d'un site** (marque, navigation, actions) → `Navbar` : une barre sticky en
63
+ haut, bordure basse, fond du cœur. Les slots `brand`, `nav` et `actions` sont injectés
64
+ par l'app — aucun `href` ni mot produit dans le cœur (ADR 0030).
55
65
  - **Un état vide, ou une panne à nommer** → `EmptyState` (la carte centrée ; le `detail`
56
66
  brut nomme la vraie panne, plutôt qu'un zéro silencieux).
67
+ - **Un pied de page** (marque, rangée de liens, ligne légale) → `Footer` : des emplacements
68
+ injectés (`brand`, `links`, `legal`), sans routing ni libellé propre au cœur.
57
69
  - **Une information inline** qui demande l'attention sans bloquer → `Alert` (le ton vient
58
70
  du cœur ; `onClose` va avec `closeLabel`).
59
71
  - **Séparer deux contenus** → `Separator` ; **tenir la place d'un contenu qui charge** →
@@ -86,6 +98,18 @@ pour expliquer une brique, elle appartient à l'app, pas au cœur.
86
98
  (sélection multiple) ; ouverture et sélection sont contrôlées par props, le focus
87
99
  clavier (rôle `tree`, flèches) est interne.
88
100
 
101
+ ### Écrire
102
+
103
+ - **Titrer une section** → `Heading` : `level` choisit la balise `h1`..`h6` **et** la taille
104
+ sémantique (display, title, lead, body, caption, micro). La hiérarchie du document se
105
+ décide par le niveau, jamais par la taille.
106
+ - **Écrire le texte courant** → `Text` : `size` lit l'échelle sémantique (`lead`, `body`,
107
+ `caption`, `micro`), `as` choisit `p` (défaut) ou `span` pour un texte inline. Les tailles
108
+ viennent des tokens, jamais d'un utilitaire ad-hoc.
109
+ - **Montrer un extrait de code** → `Code` (inline, dans une phrase) ou `CodeBlock` (bloc
110
+ scrollable avec bouton de copie ; `code` est le texte copié, `children` le rendu, les
111
+ libellés sont injectés). La coloration syntaxique reste à l'app.
112
+
89
113
  ### Formulaire
90
114
 
91
115
  - **Mettre en page** → `Form` (grille de champs + zone d'actions, `columns` pour deux
@@ -132,7 +156,10 @@ button
132
156
  card
133
157
  checkbox
134
158
  chip
159
+ code
160
+ code-block
135
161
  collapsible
162
+ copy-button
136
163
  counter
137
164
  data-table-pagination
138
165
  data-table-toolbar
@@ -142,11 +169,16 @@ empty-state
142
169
  facet-filter
143
170
  field
144
171
  fieldset
172
+ footer
145
173
  form
146
174
  freshness
175
+ heading
147
176
  input
177
+ kicker
148
178
  label
179
+ link
149
180
  meter
181
+ navbar
150
182
  number-field
151
183
  popover
152
184
  progress-bar
@@ -161,6 +193,7 @@ skeleton
161
193
  switch
162
194
  table
163
195
  tabs
196
+ text
164
197
  textarea
165
198
  timeline
166
199
  toast
@@ -193,7 +226,10 @@ aplati par mode) et `nomos://component/<nom>` (le manifeste).
193
226
  Au-delà du manifeste, chaque brique a une **vue** servie en `ui://nomos/<nom>` — un
194
227
  document auto-suffisant (`text/html;profile=mcp-app`) que l'hôte rend dans un iframe
195
228
  sandboxé. Une **scène composite** (`ui://nomos/composite/<nom>`) assemble plusieurs
196
- briques en un écran qui a du sens (un formulaire, une carte de statut).
229
+ briques en un écran qui a du sens (un formulaire, une carte de statut). Les scènes
230
+ sont aussi exportées sur la surface publique JS (`composites`, `compositeNames`,
231
+ `findComposite`, ADR 0031) : le serveur MCP et le site rendent la **même** source,
232
+ et leur copie par défaut est neutre — elle s'injecte par props.
197
233
 
198
234
  La vue **émet des intentions** (`ready`, `select`, `change`, `error`) et ne mute jamais
199
235
  l'état : l'hôte décide. Il lui pousse l'apparence (`set-view` : thème, densité) et les