@nomosui/react 0.4.0 → 0.5.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.
Files changed (36) hide show
  1. package/README.md +2 -1
  2. package/SKILL.md +42 -0
  3. package/dist/index.js +1361 -143
  4. package/dist/mcp/bin.js +10856 -7346
  5. package/dist/types/components/accordion/accordion.d.ts +14 -0
  6. package/dist/types/components/accordion/manifest.d.ts +7 -0
  7. package/dist/types/components/alert-dialog/alert-dialog.d.ts +26 -0
  8. package/dist/types/components/alert-dialog/manifest.d.ts +7 -0
  9. package/dist/types/components/avatar/avatar.d.ts +17 -0
  10. package/dist/types/components/avatar/manifest.d.ts +6 -0
  11. package/dist/types/components/badge/badge.d.ts +1 -1
  12. package/dist/types/components/button/button.d.ts +1 -1
  13. package/dist/types/components/collapsible/collapsible.d.ts +11 -0
  14. package/dist/types/components/collapsible/manifest.d.ts +7 -0
  15. package/dist/types/components/dialog/dialog.d.ts +30 -0
  16. package/dist/types/components/dialog/manifest.d.ts +7 -0
  17. package/dist/types/{internal → components/dropdown-menu}/dropdown-menu.d.ts +5 -0
  18. package/dist/types/components/dropdown-menu/manifest.d.ts +7 -0
  19. package/dist/types/components/popover/manifest.d.ts +7 -0
  20. package/dist/types/components/popover/popover.d.ts +12 -0
  21. package/dist/types/components/scroll-area/manifest.d.ts +6 -0
  22. package/dist/types/components/scroll-area/scroll-area.d.ts +10 -0
  23. package/dist/types/components/select/manifest.d.ts +7 -0
  24. package/dist/types/{internal → components/select}/select.d.ts +5 -0
  25. package/dist/types/components/sheet/manifest.d.ts +7 -0
  26. package/dist/types/{internal → components/sheet}/sheet.d.ts +23 -0
  27. package/dist/types/components/tabs/manifest.d.ts +6 -0
  28. package/dist/types/components/tabs/tabs.d.ts +12 -0
  29. package/dist/types/components/tooltip/manifest.d.ts +7 -0
  30. package/dist/types/{internal → components/tooltip}/tooltip.d.ts +6 -0
  31. package/dist/types/index.d.ts +26 -3
  32. package/package.json +8 -2
  33. package/tokens/theme.css +205 -0
  34. package/tokens/tokens.generated.css +44 -0
  35. package/tokens/tokens.json +46 -0
  36. package/tokens/tokens.resource.json +22 -0
package/dist/index.js CHANGED
@@ -2,14 +2,20 @@ import { Check, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Circle, Circl
2
2
  import { clsx } from "clsx";
3
3
  import { twMerge } from "tailwind-merge";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
- import { cva } from "class-variance-authority";
6
- import { Slot } from "@radix-ui/react-slot";
7
5
  import * as React from "react";
8
6
  import { Fragment as Fragment$1, createContext, createElement, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
7
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
8
+ import { Slot } from "@radix-ui/react-slot";
9
+ import { cva } from "class-variance-authority";
10
+ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
11
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
12
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
13
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
14
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
9
15
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
16
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
10
17
  import * as SelectPrimitive from "@radix-ui/react-select";
11
18
  import { columnFilteringFeature, columnVisibilityFeature, createFilteredRowModel, createPaginatedRowModel, createSortedRowModel, flexRender, globalFilteringFeature, rowPaginationFeature, rowSortingFeature, sortFn_alphanumeric, sortFn_basic, sortFn_datetime, sortFn_text, tableFeatures, useTable } from "@tanstack/react-table";
12
- import * as SheetPrimitive from "@radix-ui/react-dialog";
13
19
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
14
20
  import * as SeparatorPrimitive from "@radix-ui/react-separator";
15
21
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
@@ -182,6 +188,585 @@ var alertManifest = {
182
188
  }]
183
189
  };
184
190
  //#endregion
191
+ //#region src/components/button/button.tsx
192
+ /**
193
+ * Le bouton du cœur. La config des variantes est exportée à côté de `buttonVariants`,
194
+ * comme celle du Badge : le catalogue la lit pour vérifier que le manifeste ne dérive
195
+ * pas des props réelles (ADR 0005).
196
+ */
197
+ var buttonVariantsConfig = {
198
+ variants: {
199
+ variant: {
200
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
201
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
202
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
203
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
204
+ ghost: "hover:bg-accent hover:text-accent-foreground",
205
+ link: "text-primary underline-offset-4 hover:underline"
206
+ },
207
+ size: {
208
+ default: "h-10 px-4 py-2",
209
+ sm: "h-9 rounded-md px-3",
210
+ lg: "h-11 rounded-md px-8",
211
+ icon: "h-10 w-10"
212
+ }
213
+ },
214
+ defaultVariants: {
215
+ variant: "default",
216
+ size: "default"
217
+ }
218
+ };
219
+ var buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", buttonVariantsConfig);
220
+ function Button({ className, variant, size, asChild = false, ...props }) {
221
+ return /* @__PURE__ */ jsx(asChild ? Slot : "button", {
222
+ className: cn(buttonVariants({
223
+ variant,
224
+ size,
225
+ className
226
+ })),
227
+ ...props
228
+ });
229
+ }
230
+ //#endregion
231
+ //#region src/components/alert-dialog/alert-dialog.tsx
232
+ /**
233
+ * La modale de confirmation : une décision bloquante — confirmer une action destructive —
234
+ * posée sur un voile, avec deux issues (agir, annuler). Présentée en parts importables
235
+ * séparément ; aucun libellé n'est propre au cœur. Le voile et l'empilement viennent des
236
+ * tokens (ADR 0027).
237
+ */
238
+ var AlertDialog = AlertDialogPrimitive.Root;
239
+ var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
240
+ var AlertDialogPortal = AlertDialogPrimitive.Portal;
241
+ var AlertDialogOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(AlertDialogPrimitive.Overlay, {
242
+ className: cn("fixed inset-0 z-overlay bg-scrim data-[state=open]:animate-overlay-in data-[state=closed]:animate-overlay-out", className),
243
+ ...props,
244
+ ref
245
+ }));
246
+ AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
247
+ var AlertDialogContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [/* @__PURE__ */ jsx(AlertDialogOverlay, {}), /* @__PURE__ */ jsx(AlertDialogPrimitive.Content, {
248
+ ref,
249
+ className: cn("fixed left-1/2 top-1/2 z-overlay flex w-full max-w-lg -translate-x-1/2 -translate-y-1/2 flex-col gap-4 rounded-lg border bg-background p-6 text-foreground shadow-lg data-[state=open]:animate-content-in data-[state=closed]:animate-content-out", className),
250
+ ...props
251
+ })] }));
252
+ AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
253
+ var AlertDialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
254
+ className: cn("flex flex-col gap-1.5", className),
255
+ ...props
256
+ });
257
+ AlertDialogHeader.displayName = "AlertDialogHeader";
258
+ var AlertDialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
259
+ className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
260
+ ...props
261
+ });
262
+ AlertDialogFooter.displayName = "AlertDialogFooter";
263
+ var AlertDialogTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(AlertDialogPrimitive.Title, {
264
+ ref,
265
+ className: cn("text-lg font-semibold", className),
266
+ ...props
267
+ }));
268
+ AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
269
+ var AlertDialogDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(AlertDialogPrimitive.Description, {
270
+ ref,
271
+ className: cn("text-sm text-muted-foreground", className),
272
+ ...props
273
+ }));
274
+ AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
275
+ var AlertDialogAction = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(AlertDialogPrimitive.Action, {
276
+ ref,
277
+ className: cn(buttonVariants(), className),
278
+ ...props
279
+ }));
280
+ AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
281
+ var AlertDialogCancel = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(AlertDialogPrimitive.Cancel, {
282
+ ref,
283
+ className: cn(buttonVariants({ variant: "outline" }), className),
284
+ ...props
285
+ }));
286
+ AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
287
+ //#endregion
288
+ //#region src/components/alert-dialog/manifest.ts
289
+ /**
290
+ * Le manifeste de la modale de confirmation (ADR 0005). Le catalogue enregistre la racine
291
+ * `AlertDialog` ; les parts se composent dans l'exemple. Le voile et l'empilement lisent
292
+ * les tokens (ADR 0027).
293
+ */
294
+ var alertDialogManifest = {
295
+ name: "alert-dialog",
296
+ title: "AlertDialog",
297
+ summary: "Une modale de confirmation bloquante : un titre, une description, et deux issues — agir ou annuler. Livrée en parts importables séparément ; tous les libellés viennent de l’app.",
298
+ level: "bloc",
299
+ example: {
300
+ open: true,
301
+ children: createElement(Fragment$1, null, createElement(AlertDialogTrigger, { className: buttonVariants({ variant: "outline" }) }, "Supprimer"), createElement(AlertDialogContent, null, createElement(AlertDialogHeader, null, createElement(AlertDialogTitle, null, "Supprimer ?"), createElement(AlertDialogDescription, null, "Cette action est définitive.")), createElement(AlertDialogFooter, null, createElement(AlertDialogCancel, null, "Annuler"), createElement(AlertDialogAction, null, "Supprimer"))))
302
+ },
303
+ variants: [],
304
+ props: [
305
+ {
306
+ name: "children",
307
+ type: "ReactNode",
308
+ required: true,
309
+ check: "accepted",
310
+ description: "Les parts : un déclencheur, une surface, un en-tête, un pied."
311
+ },
312
+ {
313
+ name: "open",
314
+ type: "boolean",
315
+ required: false,
316
+ check: "accepted",
317
+ description: "L’état d’ouverture contrôlé : il vit dans l’app."
318
+ },
319
+ {
320
+ name: "defaultOpen",
321
+ type: "boolean",
322
+ required: false,
323
+ check: "accepted",
324
+ description: "L’état d’ouverture initial, quand l’app ne le contrôle pas."
325
+ },
326
+ {
327
+ name: "onOpenChange",
328
+ type: "(open: boolean) => void",
329
+ required: false,
330
+ check: "accepted",
331
+ description: "Rappelé quand l’utilisateur demande à ouvrir ou fermer."
332
+ }
333
+ ],
334
+ usages: [{
335
+ when: "confirmer une action destructive ou irréversible",
336
+ use: "<AlertDialog><AlertDialogTrigger>…</AlertDialogTrigger><AlertDialogContent>…</AlertDialogContent></AlertDialog>",
337
+ avoid: "un `Dialog` pour une décision bloquante : l’`AlertDialog` ne se ferme pas au clic hors surface"
338
+ }, {
339
+ when: "deux issues explicites",
340
+ use: "un `AlertDialogCancel` (annuler) et un `AlertDialogAction` (agir) dans le pied",
341
+ avoid: "un seul bouton : une confirmation sans issue neutre piège l’utilisateur"
342
+ }]
343
+ };
344
+ //#endregion
345
+ //#region src/components/avatar/avatar.tsx
346
+ /**
347
+ * L'avatar : une image ronde, avec un repli quand elle manque ou échoue. Le natif suffit
348
+ * (`<img>` + `onError`) — aucune dépendance, pas de Radix (ADR 0002, 0019). Le repli et
349
+ * le texte alternatif viennent de l'app.
350
+ */
351
+ function Avatar({ src, alt, fallback, className }) {
352
+ const [failed, setFailed] = useState(false);
353
+ const showImage = Boolean(src) && !failed;
354
+ return /* @__PURE__ */ jsx("span", {
355
+ className: cn("flex size-10 shrink-0 overflow-hidden rounded-full bg-muted text-xs font-medium text-muted-foreground", className),
356
+ children: showImage ? /* @__PURE__ */ jsx("img", {
357
+ src,
358
+ alt,
359
+ onError: () => setFailed(true),
360
+ className: "aspect-square size-full object-cover"
361
+ }) : /* @__PURE__ */ jsx("span", {
362
+ role: "img",
363
+ "aria-label": alt,
364
+ className: "flex size-full items-center justify-center",
365
+ children: fallback
366
+ })
367
+ });
368
+ }
369
+ //#endregion
370
+ //#region src/components/avatar/manifest.ts
371
+ /**
372
+ * Le manifeste de l'avatar (ADR 0005). Natif `<img>` + repli — **aucune dépendance**
373
+ * (ADR 0002, 0019) : le repli et le texte alternatif viennent de l'app.
374
+ */
375
+ var avatarManifest = {
376
+ name: "avatar",
377
+ title: "Avatar",
378
+ summary: "Une image ronde avec un repli quand elle manque ou échoue. Pas de dépendance : le natif `<img>` et son `onError` suffisent ; le repli et le texte alternatif viennent de l’app.",
379
+ level: "primitive",
380
+ example: {
381
+ alt: "Photo de profil",
382
+ fallback: "PT"
383
+ },
384
+ variants: [],
385
+ props: [
386
+ {
387
+ name: "src",
388
+ type: "string",
389
+ required: false,
390
+ check: "attribute",
391
+ description: "L’URL de l’image ; absente, le repli s’affiche directement."
392
+ },
393
+ {
394
+ name: "alt",
395
+ type: "string",
396
+ required: true,
397
+ check: "accepted",
398
+ description: "Le texte alternatif : il nomme la personne (fourni par l’app)."
399
+ },
400
+ {
401
+ name: "fallback",
402
+ type: "ReactNode",
403
+ required: true,
404
+ check: "rendered",
405
+ description: "Le repli quand il n’y a pas d’image, ou qu’elle échoue : des initiales, une icône."
406
+ },
407
+ {
408
+ name: "className",
409
+ type: "string",
410
+ required: false,
411
+ check: "class",
412
+ description: "Les classes de l’appelant, fusionnées après celles du cœur."
413
+ }
414
+ ],
415
+ usages: [{
416
+ when: "représenter une personne ou une entité par son image",
417
+ use: "un `src` et un `fallback` (initiales) fourni par l’app",
418
+ avoid: "attendre une image qui peut échouer : toujours un `fallback`"
419
+ }, {
420
+ when: "une image décorative sans personne derrière",
421
+ use: "une simple `<img>` de l’app",
422
+ avoid: "un `Avatar` sans `alt` : il nomme une personne, il ne décore pas"
423
+ }]
424
+ };
425
+ //#endregion
426
+ //#region src/components/scroll-area/scroll-area.tsx
427
+ /**
428
+ * La zone défilante : une surface bornée dont le contenu plus grand défile, avec une
429
+ * barre stylée. Purement cosmétique — le cœur ne fait que la parer ; le défilement natif
430
+ * reste. Présentée en parts importables séparément.
431
+ */
432
+ var ScrollArea = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(ScrollAreaPrimitive.Root, {
433
+ ref,
434
+ className: cn("relative overflow-hidden", className),
435
+ ...props,
436
+ children: [
437
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, {
438
+ className: "h-full w-full rounded-[inherit]",
439
+ children
440
+ }),
441
+ /* @__PURE__ */ jsx(ScrollBar, {}),
442
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
443
+ ]
444
+ }));
445
+ ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
446
+ var ScrollBar = React.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaScrollbar, {
447
+ ref,
448
+ orientation,
449
+ className: cn("flex touch-none select-none transition-colors", orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-px", orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-px", className),
450
+ ...props,
451
+ children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
452
+ }));
453
+ ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
454
+ //#endregion
455
+ //#region src/components/scroll-area/manifest.ts
456
+ /**
457
+ * Le manifeste de la zone défilante (ADR 0005). Purement cosmétique : le défilement reste
458
+ * natif, le cœur ne le remplace pas.
459
+ */
460
+ var scrollAreaManifest = {
461
+ name: "scroll-area",
462
+ title: "ScrollArea",
463
+ summary: "Une surface bornée dont le contenu plus grand défile, avec une barre stylée. Cosmétique — le défilement reste natif ; le contenu vient de l’app.",
464
+ level: "primitive",
465
+ example: {
466
+ className: "h-24 w-48 rounded-md border",
467
+ children: "Un contenu plus grand que la surface."
468
+ },
469
+ variants: [],
470
+ props: [
471
+ {
472
+ name: "children",
473
+ type: "ReactNode",
474
+ required: true,
475
+ check: "accepted",
476
+ description: "Le contenu qui défile."
477
+ },
478
+ {
479
+ name: "className",
480
+ type: "string",
481
+ required: false,
482
+ check: "class",
483
+ description: "Les classes de l’appelant, fusionnées après celles du cœur (ici la hauteur et la largeur)."
484
+ },
485
+ {
486
+ name: "type",
487
+ type: "'auto' | 'always' | 'scroll' | 'hover'",
488
+ required: false,
489
+ check: "accepted",
490
+ description: "Quand la barre apparaît. Défaut `hover`."
491
+ }
492
+ ],
493
+ usages: [{
494
+ when: "borner une sous-vue dense (journal, liste de fichiers) dans une hauteur fixe",
495
+ use: "<ScrollArea className=\"h-64\">…</ScrollArea>",
496
+ avoid: "une `ScrollArea` qui prend toute la page : le défilement est celui du document"
497
+ }]
498
+ };
499
+ //#endregion
500
+ //#region src/components/tabs/tabs.tsx
501
+ /**
502
+ * Les onglets : une barre de déclencheurs et les panneaux de contenu correspondants, un
503
+ * seul visible à la fois. Présentés en parts importables séparément ; aucun libellé n'est
504
+ * propre au cœur.
505
+ */
506
+ var Tabs = TabsPrimitive.Root;
507
+ var TabsList = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(TabsPrimitive.List, {
508
+ ref,
509
+ className: cn("inline-flex h-10 items-center justify-center gap-1 rounded-md bg-muted p-1 text-muted-foreground", className),
510
+ ...props
511
+ }));
512
+ TabsList.displayName = TabsPrimitive.List.displayName;
513
+ var TabsTrigger = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(TabsPrimitive.Trigger, {
514
+ ref,
515
+ className: cn("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm", className),
516
+ ...props
517
+ }));
518
+ TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
519
+ var TabsContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(TabsPrimitive.Content, {
520
+ ref,
521
+ className: cn("mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", className),
522
+ ...props
523
+ }));
524
+ TabsContent.displayName = TabsPrimitive.Content.displayName;
525
+ //#endregion
526
+ //#region src/components/tabs/manifest.ts
527
+ /**
528
+ * Le manifeste des onglets (ADR 0005). Le catalogue enregistre la racine `Tabs` ; les
529
+ * parts se composent dans l'exemple. Aucun libellé n'est propre au cœur.
530
+ */
531
+ var tabsManifest = {
532
+ name: "tabs",
533
+ title: "Tabs",
534
+ summary: "Une barre de déclencheurs et les panneaux correspondants, un seul visible à la fois. Livré en parts importables séparément ; les libellés et le contenu viennent de l’app.",
535
+ level: "primitive",
536
+ example: {
537
+ defaultValue: "a",
538
+ children: createElement(Fragment$1, null, createElement(TabsList, null, createElement(TabsTrigger, { value: "a" }, "Onglet A"), createElement(TabsTrigger, { value: "b" }, "Onglet B")), createElement(TabsContent, { value: "a" }, "Le panneau A."), createElement(TabsContent, { value: "b" }, "Le panneau B."))
539
+ },
540
+ variants: [],
541
+ props: [
542
+ {
543
+ name: "children",
544
+ type: "ReactNode",
545
+ required: true,
546
+ check: "accepted",
547
+ description: "Les parts : une barre (`TabsList`), des déclencheurs, des panneaux."
548
+ },
549
+ {
550
+ name: "defaultValue",
551
+ type: "string",
552
+ required: true,
553
+ check: "accepted",
554
+ description: "L’onglet actif au départ, quand l’app ne contrôle pas l’état."
555
+ },
556
+ {
557
+ name: "value",
558
+ type: "string",
559
+ required: false,
560
+ check: "accepted",
561
+ description: "L’onglet actif, contrôlé par l’app."
562
+ },
563
+ {
564
+ name: "onValueChange",
565
+ type: "(value: string) => void",
566
+ required: false,
567
+ check: "accepted",
568
+ description: "Rappelé quand l’utilisateur change d’onglet."
569
+ },
570
+ {
571
+ name: "orientation",
572
+ type: "'horizontal' | 'vertical'",
573
+ required: false,
574
+ check: "accepted",
575
+ description: "L’axe de la barre, qui décide des flèches du clavier. Défaut horizontal."
576
+ }
577
+ ],
578
+ usages: [{
579
+ when: "basculer entre des vues sœurs sans quitter la page",
580
+ use: "<Tabs defaultValue=\"…\"><TabsList><TabsTrigger value=\"…\">…</TabsTrigger></TabsList><TabsContent value=\"…\">…</TabsContent></Tabs>",
581
+ avoid: "des onglets pour une navigation : ce sont des vues sœurs, pas des routes"
582
+ }]
583
+ };
584
+ //#endregion
585
+ //#region src/components/accordion/accordion.tsx
586
+ /**
587
+ * L'accordéon : une pile de sections qu'on ouvre une à une (ou plusieurs), chacune avec
588
+ * son déclencheur et sa zone de contenu. Présenté en parts importables séparément ;
589
+ * aucun libellé n'est propre au cœur. Le repli de hauteur lit le mouvement tokenisé
590
+ * (ADR 0027).
591
+ */
592
+ var Accordion = AccordionPrimitive.Root;
593
+ var AccordionItem = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(AccordionPrimitive.Item, {
594
+ ref,
595
+ className: cn("border-b", className),
596
+ ...props
597
+ }));
598
+ AccordionItem.displayName = "AccordionItem";
599
+ var AccordionHeader = AccordionPrimitive.Header;
600
+ var AccordionTrigger = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(AccordionPrimitive.Header, {
601
+ className: "flex",
602
+ children: /* @__PURE__ */ jsxs(AccordionPrimitive.Trigger, {
603
+ ref,
604
+ className: cn("flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180", className),
605
+ ...props,
606
+ children: [children, /* @__PURE__ */ jsx(ChevronDown, { className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-[var(--nomos-motion-duration-fast)]" })]
607
+ })
608
+ }));
609
+ AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
610
+ var AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(AccordionPrimitive.Content, {
611
+ ref,
612
+ className: cn("overflow-hidden text-sm data-[state=closed]:animate-collapse-up data-[state=open]:animate-collapse-down [--nomos-collapse-height:var(--radix-accordion-content-height)]", className),
613
+ ...props,
614
+ children: /* @__PURE__ */ jsx("div", {
615
+ className: "pb-4 pt-0",
616
+ children
617
+ })
618
+ }));
619
+ AccordionContent.displayName = AccordionPrimitive.Content.displayName;
620
+ //#endregion
621
+ //#region src/components/accordion/manifest.ts
622
+ /**
623
+ * Le manifeste de l'accordéon (ADR 0005). Le catalogue enregistre la racine `Accordion` ;
624
+ * les parts se composent dans l'exemple. `type` (single/multiple) est une variante
625
+ * documentée ; le repli de hauteur lit le mouvement tokenisé (ADR 0027).
626
+ */
627
+ var accordionManifest = {
628
+ name: "accordion",
629
+ title: "Accordion",
630
+ summary: "Une pile de sections repliables, ouvertes une à une (ou plusieurs). Livré en parts importables séparément ; les libellés et le contenu viennent de l’app.",
631
+ level: "primitive",
632
+ example: {
633
+ type: "single",
634
+ defaultValue: "a",
635
+ children: createElement(Fragment$1, null, createElement(AccordionItem, { value: "a" }, createElement(AccordionTrigger, null, "Section A"), createElement(AccordionContent, null, "Le contenu de la section A.")), createElement(AccordionItem, { value: "b" }, createElement(AccordionTrigger, null, "Section B"), createElement(AccordionContent, null, "Le contenu de la section B.")))
636
+ },
637
+ variants: [{
638
+ name: "type",
639
+ values: ["single", "multiple"],
640
+ default: "single",
641
+ description: "Combien de sections peuvent être ouvertes — `single` pour une à la fois, `multiple` pour plusieurs."
642
+ }],
643
+ props: [
644
+ {
645
+ name: "children",
646
+ type: "ReactNode",
647
+ required: true,
648
+ check: "accepted",
649
+ description: "Les sections : des `AccordionItem` avec leur déclencheur et leur contenu."
650
+ },
651
+ {
652
+ name: "defaultValue",
653
+ type: "string | string[]",
654
+ required: false,
655
+ check: "accepted",
656
+ description: "La ou les sections ouvertes au départ, quand l’app ne contrôle pas l’état."
657
+ },
658
+ {
659
+ name: "value",
660
+ type: "string | string[]",
661
+ required: false,
662
+ check: "accepted",
663
+ description: "La ou les sections ouvertes, contrôlées par l’app."
664
+ },
665
+ {
666
+ name: "onValueChange",
667
+ type: "(value: string | string[]) => void",
668
+ required: false,
669
+ check: "accepted",
670
+ description: "Rappelé quand l’utilisateur ouvre ou ferme une section."
671
+ },
672
+ {
673
+ name: "collapsible",
674
+ type: "boolean",
675
+ required: false,
676
+ check: "accepted",
677
+ description: "En `type=\"single\"`, permet de refermer la section ouverte."
678
+ }
679
+ ],
680
+ usages: [{
681
+ when: "des sections repliables dont une seule est ouverte à la fois",
682
+ use: "<Accordion type=\"single\"><AccordionItem value=\"…\">…</AccordionItem></Accordion>",
683
+ avoid: "un `Accordion` pour un seul repli : c’est un `Collapsible`"
684
+ }, {
685
+ when: "comparer plusieurs sections ouvertes",
686
+ use: "type=\"multiple\"",
687
+ avoid: "ouvrir tout par défaut : l’accordéon sert à réduire la hauteur"
688
+ }]
689
+ };
690
+ //#endregion
691
+ //#region src/components/collapsible/collapsible.tsx
692
+ /**
693
+ * Le repli : un déclencheur et une zone de contenu qu'on ouvre et referme. Présenté en
694
+ * parts importables séparément ; aucun libellé n'est propre au cœur. Le repli de hauteur
695
+ * lit le mouvement tokenisé (ADR 0027).
696
+ */
697
+ var Collapsible = CollapsiblePrimitive.Root;
698
+ var CollapsibleTrigger = CollapsiblePrimitive.Trigger;
699
+ var CollapsibleContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(CollapsiblePrimitive.Content, {
700
+ ref,
701
+ className: cn("overflow-hidden data-[state=closed]:animate-collapse-up data-[state=open]:animate-collapse-down [--nomos-collapse-height:var(--radix-collapsible-content-height)]", className),
702
+ ...props
703
+ }));
704
+ CollapsibleContent.displayName = CollapsiblePrimitive.Content.displayName;
705
+ //#endregion
706
+ //#region src/components/collapsible/manifest.ts
707
+ /**
708
+ * Le manifeste du repli (ADR 0005). Le catalogue enregistre la racine `Collapsible` ; les
709
+ * parts se composent dans l'exemple. Le repli de hauteur lit le mouvement tokenisé
710
+ * (ADR 0027).
711
+ */
712
+ var collapsibleManifest = {
713
+ name: "collapsible",
714
+ title: "Collapsible",
715
+ summary: "Une zone de contenu qu’on ouvre et referme derrière un déclencheur. Livré en parts importables séparément ; le libellé du déclencheur et le contenu viennent de l’app.",
716
+ level: "primitive",
717
+ example: {
718
+ defaultOpen: true,
719
+ children: createElement(Fragment$1, null, createElement(CollapsibleTrigger, { className: buttonVariants({ variant: "ghost" }) }, "Détails"), createElement(CollapsibleContent, null, "Le contenu replié."))
720
+ },
721
+ variants: [],
722
+ props: [
723
+ {
724
+ name: "children",
725
+ type: "ReactNode",
726
+ required: true,
727
+ check: "accepted",
728
+ description: "Les parts du repli : un déclencheur, une zone de contenu."
729
+ },
730
+ {
731
+ name: "open",
732
+ type: "boolean",
733
+ required: false,
734
+ check: "accepted",
735
+ description: "L’état d’ouverture contrôlé : il vit dans l’app."
736
+ },
737
+ {
738
+ name: "defaultOpen",
739
+ type: "boolean",
740
+ required: false,
741
+ check: "accepted",
742
+ description: "L’état d’ouverture initial, quand l’app ne le contrôle pas."
743
+ },
744
+ {
745
+ name: "disabled",
746
+ type: "boolean",
747
+ required: false,
748
+ check: "accepted",
749
+ description: "Désactive le repli : ni ouverture, ni fermeture."
750
+ },
751
+ {
752
+ name: "onOpenChange",
753
+ type: "(open: boolean) => void",
754
+ required: false,
755
+ check: "accepted",
756
+ description: "Rappelé quand l’utilisateur demande à ouvrir ou fermer."
757
+ }
758
+ ],
759
+ usages: [{
760
+ when: "révéler un détail à la demande sous un déclencheur",
761
+ use: "<Collapsible><CollapsibleTrigger>…</CollapsibleTrigger><CollapsibleContent>…</CollapsibleContent></Collapsible>",
762
+ avoid: "un `Collapsible` pour des sections mutuellement exclusives : c’est un `Accordion`"
763
+ }, {
764
+ when: "un filtre secondaire dans une barre dense",
765
+ use: "un `Collapsible` discret, fermé par défaut",
766
+ avoid: "ouvrir par défaut un contenu secondaire : il pousse le reste de la vue"
767
+ }]
768
+ };
769
+ //#endregion
185
770
  //#region src/components/badge/badge.tsx
186
771
  /**
187
772
  * La config des variantes est exportée à côté de `badgeVariants` : le catalogue la lit
@@ -262,50 +847,10 @@ var badgeManifest = {
262
847
  {
263
848
  when: "une information à qualifier sans crier (compte, catégorie)",
264
849
  use: "variant=\"outline\"",
265
- avoid: "variant=\"destructive\" pour qualifier sans urgence : le ton doit dire la gravité réelle"
266
- }
267
- ]
268
- };
269
- //#endregion
270
- //#region src/components/button/button.tsx
271
- /**
272
- * Le bouton du cœur. La config des variantes est exportée à côté de `buttonVariants`,
273
- * comme celle du Badge : le catalogue la lit pour vérifier que le manifeste ne dérive
274
- * pas des props réelles (ADR 0005).
275
- */
276
- var buttonVariantsConfig = {
277
- variants: {
278
- variant: {
279
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
280
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
281
- outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
282
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
283
- ghost: "hover:bg-accent hover:text-accent-foreground",
284
- link: "text-primary underline-offset-4 hover:underline"
285
- },
286
- size: {
287
- default: "h-10 px-4 py-2",
288
- sm: "h-9 rounded-md px-3",
289
- lg: "h-11 rounded-md px-8",
290
- icon: "h-10 w-10"
291
- }
292
- },
293
- defaultVariants: {
294
- variant: "default",
295
- size: "default"
296
- }
850
+ avoid: "variant=\"destructive\" pour qualifier sans urgence : le ton doit dire la gravité réelle"
851
+ }
852
+ ]
297
853
  };
298
- var buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", buttonVariantsConfig);
299
- function Button({ className, variant, size, asChild = false, ...props }) {
300
- return /* @__PURE__ */ jsx(asChild ? Slot : "button", {
301
- className: cn(buttonVariants({
302
- variant,
303
- size,
304
- className
305
- })),
306
- ...props
307
- });
308
- }
309
854
  //#endregion
310
855
  //#region src/components/button/manifest.ts
311
856
  /**
@@ -468,6 +1013,312 @@ var cardManifest = {
468
1013
  }]
469
1014
  };
470
1015
  //#endregion
1016
+ //#region src/components/dialog/dialog.tsx
1017
+ function Dialog({ trigger, title, description, body, footer, closeLabel, open, defaultOpen, onOpenChange, className }) {
1018
+ return /* @__PURE__ */ jsxs(DialogPrimitive.Root, {
1019
+ open,
1020
+ defaultOpen,
1021
+ onOpenChange,
1022
+ children: [/* @__PURE__ */ jsx(DialogPrimitive.Trigger, {
1023
+ className: cn(buttonVariants({ variant: "outline" })),
1024
+ children: trigger
1025
+ }), /* @__PURE__ */ jsxs(DialogPrimitive.Portal, { children: [/* @__PURE__ */ jsx(DialogPrimitive.Overlay, { className: "fixed inset-0 z-overlay bg-scrim data-[state=open]:animate-overlay-in data-[state=closed]:animate-overlay-out" }), /* @__PURE__ */ jsxs(DialogPrimitive.Content, {
1026
+ className: cn("fixed left-1/2 top-1/2 z-overlay flex w-full max-w-lg -translate-x-1/2 -translate-y-1/2 flex-col gap-4 rounded-lg border bg-background p-6 text-foreground shadow-lg data-[state=open]:animate-content-in data-[state=closed]:animate-content-out", className),
1027
+ children: [
1028
+ /* @__PURE__ */ jsxs("div", {
1029
+ className: "flex flex-col gap-1.5",
1030
+ children: [/* @__PURE__ */ jsx(DialogPrimitive.Title, {
1031
+ className: "text-lg font-semibold",
1032
+ children: title
1033
+ }), description ? /* @__PURE__ */ jsx(DialogPrimitive.Description, {
1034
+ className: "text-sm text-muted-foreground",
1035
+ children: description
1036
+ }) : null]
1037
+ }),
1038
+ body ? /* @__PURE__ */ jsx("div", {
1039
+ className: "text-sm",
1040
+ children: body
1041
+ }) : null,
1042
+ footer ? /* @__PURE__ */ jsx("div", {
1043
+ className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
1044
+ children: footer
1045
+ }) : null,
1046
+ /* @__PURE__ */ jsx(DialogPrimitive.Close, {
1047
+ "aria-label": closeLabel,
1048
+ className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
1049
+ children: /* @__PURE__ */ jsx(X, {
1050
+ className: "size-4",
1051
+ "aria-hidden": true
1052
+ })
1053
+ })
1054
+ ]
1055
+ })] })]
1056
+ });
1057
+ }
1058
+ //#endregion
1059
+ //#region src/components/dialog/manifest.ts
1060
+ /**
1061
+ * Le manifeste de la modale (ADR 0005, 0019). Le cœur fournit la structure et la couche
1062
+ * flottante issue des tokens (ADR 0027) ; tous les textes — déclencheur, fermeture,
1063
+ * actions — viennent de l'app.
1064
+ */
1065
+ var dialogManifest = {
1066
+ name: "dialog",
1067
+ title: "Dialog",
1068
+ summary: "Une modale centrée sur un voile : un déclencheur, un titre, une description, un corps et un pied. L’empilement, le voile et le mouvement viennent des tokens ; aucun texte n’est propre au cœur.",
1069
+ level: "bloc",
1070
+ example: {
1071
+ trigger: "Ouvrir",
1072
+ title: "Confirmer",
1073
+ description: "Une action difficile à défaire.",
1074
+ body: "Le contenu de la modale.",
1075
+ footer: "Actions",
1076
+ closeLabel: "Fermer",
1077
+ open: true
1078
+ },
1079
+ variants: [],
1080
+ props: [
1081
+ {
1082
+ name: "trigger",
1083
+ type: "ReactNode",
1084
+ required: true,
1085
+ check: "accepted",
1086
+ description: "Le contenu du déclencheur : un mot ou un court libellé, jamais une phrase."
1087
+ },
1088
+ {
1089
+ name: "title",
1090
+ type: "string",
1091
+ required: true,
1092
+ check: "accepted",
1093
+ description: "Le titre de la modale ; il nomme l’action ou la décision."
1094
+ },
1095
+ {
1096
+ name: "description",
1097
+ type: "ReactNode",
1098
+ required: false,
1099
+ check: "accepted",
1100
+ description: "Un sous-titre sous le titre, pour expliquer sans alourdir le corps."
1101
+ },
1102
+ {
1103
+ name: "body",
1104
+ type: "ReactNode",
1105
+ required: false,
1106
+ check: "accepted",
1107
+ description: "Le corps de la modale : le contenu à lire ou à décider."
1108
+ },
1109
+ {
1110
+ name: "footer",
1111
+ type: "ReactNode",
1112
+ required: false,
1113
+ check: "accepted",
1114
+ description: "Les actions, alignées à droite sur grand écran."
1115
+ },
1116
+ {
1117
+ name: "closeLabel",
1118
+ type: "string",
1119
+ required: true,
1120
+ check: "accepted",
1121
+ description: "Le libellé accessible du bouton de fermeture (le cœur n’a pas d’i18n)."
1122
+ },
1123
+ {
1124
+ name: "open",
1125
+ type: "boolean",
1126
+ required: false,
1127
+ check: "accepted",
1128
+ description: "L’état d’ouverture contrôlé : il vit dans l’app."
1129
+ },
1130
+ {
1131
+ name: "defaultOpen",
1132
+ type: "boolean",
1133
+ required: false,
1134
+ check: "accepted",
1135
+ description: "L’état d’ouverture initial, quand l’app ne le contrôle pas."
1136
+ },
1137
+ {
1138
+ name: "onOpenChange",
1139
+ type: "(open: boolean) => void",
1140
+ required: false,
1141
+ check: "accepted",
1142
+ description: "Rappelé quand l’utilisateur demande à ouvrir ou fermer."
1143
+ },
1144
+ {
1145
+ name: "className",
1146
+ type: "string",
1147
+ required: false,
1148
+ check: "class",
1149
+ description: "Les classes de l’appelant, fusionnées après celles du cœur."
1150
+ }
1151
+ ],
1152
+ usages: [
1153
+ {
1154
+ when: "demander une décision ou une saisie dans une surface centrée qui bloque la vue",
1155
+ use: "<Dialog trigger=\"Supprimer\" title=\"Supprimer ?\" closeLabel=\"Fermer\">…</Dialog>",
1156
+ avoid: "un `Dialog` pour une information non bloquante : un `Alert` suffit"
1157
+ },
1158
+ {
1159
+ when: "contrôler l’ouverture depuis l’app (état, navigation)",
1160
+ use: "`open` + `onOpenChange`",
1161
+ avoid: "mélanger `open` et `defaultOpen` : l’un est contrôlé, l’autre non"
1162
+ },
1163
+ {
1164
+ when: "une action destructive dans le pied",
1165
+ use: "un `Button` `variant=\"destructive\"` dans `footer`",
1166
+ avoid: "un texte d’action écrit par le cœur : les libellés viennent de l’app"
1167
+ }
1168
+ ]
1169
+ };
1170
+ //#endregion
1171
+ //#region src/components/dropdown-menu/dropdown-menu.tsx
1172
+ /**
1173
+ * Le menu flottant : un déclencheur et une surface d'items (simples, à cocher, radio, ou
1174
+ * un sous-menu). Présenté en parts importables séparément ; aucun libellé n'est propre au
1175
+ * cœur. La couche flottante (empilement, mouvement) vient des tokens (ADR 0027).
1176
+ */
1177
+ var DropdownMenu = DropdownMenuPrimitive.Root;
1178
+ var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
1179
+ var DropdownMenuGroup = DropdownMenuPrimitive.Group;
1180
+ var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
1181
+ var DropdownMenuSub = DropdownMenuPrimitive.Sub;
1182
+ var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
1183
+ var DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.SubTrigger, {
1184
+ ref,
1185
+ className: cn("flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", inset && "pl-8", className),
1186
+ ...props,
1187
+ children: [children, /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto" })]
1188
+ }));
1189
+ DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
1190
+ var DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.SubContent, {
1191
+ ref,
1192
+ className: cn("z-popover min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-content-in data-[state=closed]:animate-content-out origin-[--radix-dropdown-menu-content-transform-origin]", className),
1193
+ ...props
1194
+ }));
1195
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
1196
+ var DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.Content, {
1197
+ ref,
1198
+ sideOffset,
1199
+ className: cn("z-popover max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-32 overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-content-in data-[state=closed]:animate-content-out origin-[--radix-dropdown-menu-content-transform-origin]", className),
1200
+ ...props
1201
+ }) }));
1202
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
1203
+ var DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Item, {
1204
+ ref,
1205
+ className: cn("relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", inset && "pl-8", className),
1206
+ ...props
1207
+ }));
1208
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
1209
+ var DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.CheckboxItem, {
1210
+ ref,
1211
+ className: cn("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className),
1212
+ checked,
1213
+ ...props,
1214
+ children: [/* @__PURE__ */ jsx("span", {
1215
+ className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center",
1216
+ children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) })
1217
+ }), children]
1218
+ }));
1219
+ DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
1220
+ var DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.RadioItem, {
1221
+ ref,
1222
+ className: cn("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className),
1223
+ ...props,
1224
+ children: [/* @__PURE__ */ jsx("span", {
1225
+ className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center",
1226
+ children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) })
1227
+ }), children]
1228
+ }));
1229
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
1230
+ var DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Label, {
1231
+ ref,
1232
+ className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className),
1233
+ ...props
1234
+ }));
1235
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
1236
+ var DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Separator, {
1237
+ ref,
1238
+ className: cn("-mx-1 my-1 h-px bg-muted", className),
1239
+ ...props
1240
+ }));
1241
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
1242
+ var DropdownMenuShortcut = ({ className, ...props }) => {
1243
+ return /* @__PURE__ */ jsx("span", {
1244
+ className: cn("ml-auto text-xs tracking-widest opacity-60", className),
1245
+ ...props
1246
+ });
1247
+ };
1248
+ DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
1249
+ //#endregion
1250
+ //#region src/components/dropdown-menu/manifest.ts
1251
+ /**
1252
+ * Le manifeste du menu flottant (ADR 0005). Le catalogue enregistre la racine
1253
+ * `DropdownMenu` ; les parts se composent dans l'exemple. Le menu flottant lit le
1254
+ * `z-index` tokenisé (ADR 0027), jamais une valeur d’empilement en dur.
1255
+ */
1256
+ var dropdownMenuManifest = {
1257
+ name: "dropdown-menu",
1258
+ title: "DropdownMenu",
1259
+ summary: "Un menu flottant ouvert par un déclencheur : des items simples, à cocher, radio, ou un sous-menu, séparés par des traits. Livré en parts importables séparément ; l’app fournit les libellés et les actions.",
1260
+ level: "primitive",
1261
+ example: {
1262
+ open: true,
1263
+ children: createElement(Fragment$1, null, createElement(DropdownMenuTrigger, { className: buttonVariants({ variant: "outline" }) }, "Actions"), createElement(DropdownMenuContent, { align: "start" }, createElement(DropdownMenuLabel, null, "Colonnes"), createElement(DropdownMenuItem, null, "Nom"), createElement(DropdownMenuItem, null, "Statut"), createElement(DropdownMenuSeparator, null), createElement(DropdownMenuItem, null, "Réinitialiser")))
1264
+ },
1265
+ variants: [],
1266
+ props: [
1267
+ {
1268
+ name: "children",
1269
+ type: "ReactNode",
1270
+ required: true,
1271
+ check: "accepted",
1272
+ description: "Les parts du menu : un déclencheur, une surface, des items."
1273
+ },
1274
+ {
1275
+ name: "open",
1276
+ type: "boolean",
1277
+ required: false,
1278
+ check: "accepted",
1279
+ description: "L’état d’ouverture contrôlé : il vit dans l’app."
1280
+ },
1281
+ {
1282
+ name: "defaultOpen",
1283
+ type: "boolean",
1284
+ required: false,
1285
+ check: "accepted",
1286
+ description: "L’état d’ouverture initial, quand l’app ne le contrôle pas."
1287
+ },
1288
+ {
1289
+ name: "modal",
1290
+ type: "boolean",
1291
+ required: false,
1292
+ check: "accepted",
1293
+ description: "Blocage du reste de la page et piégeage du focus. Défaut `true` (menu modal)."
1294
+ },
1295
+ {
1296
+ name: "onOpenChange",
1297
+ type: "(open: boolean) => void",
1298
+ required: false,
1299
+ check: "accepted",
1300
+ description: "Rappelé quand l’utilisateur demande à ouvrir ou fermer."
1301
+ }
1302
+ ],
1303
+ usages: [
1304
+ {
1305
+ when: "regrouper des actions derrière un déclencheur compact",
1306
+ use: "<DropdownMenu><DropdownMenuTrigger>…</DropdownMenuTrigger><DropdownMenuContent>…</DropdownMenuContent></DropdownMenu>",
1307
+ avoid: "un `DropdownMenu` pour choisir une valeur de formulaire : c’est un `Select`"
1308
+ },
1309
+ {
1310
+ when: "des options qui se cochent indépendamment",
1311
+ use: "des `DropdownMenuCheckboxItem` dans un `DropdownMenuContent`",
1312
+ avoid: "un `DropdownMenuItem` qui garde l’état : l’item ne le porte pas, l’app si"
1313
+ },
1314
+ {
1315
+ when: "un choix unique parmi quelques options",
1316
+ use: "un `DropdownMenuRadioGroup` de `DropdownMenuRadioItem`",
1317
+ avoid: "mélanger items simples et radios dans le même groupe sans les séparer"
1318
+ }
1319
+ ]
1320
+ };
1321
+ //#endregion
471
1322
  //#region src/components/empty-state/empty-state.tsx
472
1323
  function EmptyState({ icon, title, description, detail, action, wrap = true, className }) {
473
1324
  return /* @__PURE__ */ jsxs(Card, {
@@ -911,6 +1762,96 @@ var numberFieldManifest = {
911
1762
  }]
912
1763
  };
913
1764
  //#endregion
1765
+ //#region src/components/popover/popover.tsx
1766
+ /**
1767
+ * La bulle contextuelle : un déclencheur et une surface flottante de contenu riche,
1768
+ * ouverte au clic. Présentée en parts importables séparément ; aucun contenu n'est propre
1769
+ * au cœur. La couche flottante (empilement, mouvement) vient des tokens (ADR 0027).
1770
+ */
1771
+ var Popover = PopoverPrimitive.Root;
1772
+ var PopoverTrigger = PopoverPrimitive.Trigger;
1773
+ var PopoverAnchor = PopoverPrimitive.Anchor;
1774
+ var PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(PopoverPrimitive.Content, {
1775
+ ref,
1776
+ align,
1777
+ sideOffset,
1778
+ className: cn("z-popover w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-content-in data-[state=closed]:animate-content-out", className),
1779
+ ...props
1780
+ }) }));
1781
+ PopoverContent.displayName = PopoverPrimitive.Content.displayName;
1782
+ //#endregion
1783
+ //#region src/components/popover/manifest.ts
1784
+ /**
1785
+ * Le manifeste de la bulle contextuelle (ADR 0005). Le catalogue enregistre la racine
1786
+ * `Popover` ; les parts se composent dans l'exemple. La surface flottante lit le
1787
+ * `z-index` tokenisé (ADR 0027), jamais une valeur d’empilement en dur.
1788
+ */
1789
+ var popoverManifest = {
1790
+ name: "popover",
1791
+ title: "Popover",
1792
+ summary: "Une surface flottante de contenu riche, ouverte au clic d’un déclencheur. Livrée en parts importables séparément ; le contenu et ses libellés viennent de l’app.",
1793
+ level: "primitive",
1794
+ example: {
1795
+ open: true,
1796
+ children: createElement(Fragment$1, null, createElement(PopoverTrigger, { className: buttonVariants({ variant: "outline" }) }, "Filtres"), createElement(PopoverContent, { align: "start" }, "Le contenu de la bulle."))
1797
+ },
1798
+ variants: [],
1799
+ props: [
1800
+ {
1801
+ name: "children",
1802
+ type: "ReactNode",
1803
+ required: true,
1804
+ check: "accepted",
1805
+ description: "Les parts de la bulle : un déclencheur, une surface, un ancrage."
1806
+ },
1807
+ {
1808
+ name: "open",
1809
+ type: "boolean",
1810
+ required: false,
1811
+ check: "accepted",
1812
+ description: "L’état d’ouverture contrôlé : il vit dans l’app."
1813
+ },
1814
+ {
1815
+ name: "defaultOpen",
1816
+ type: "boolean",
1817
+ required: false,
1818
+ check: "accepted",
1819
+ description: "L’état d’ouverture initial, quand l’app ne le contrôle pas."
1820
+ },
1821
+ {
1822
+ name: "modal",
1823
+ type: "boolean",
1824
+ required: false,
1825
+ check: "accepted",
1826
+ description: "Blocage du reste de la page et piégeage du focus. Défaut `false` (bulle non modale)."
1827
+ },
1828
+ {
1829
+ name: "onOpenChange",
1830
+ type: "(open: boolean) => void",
1831
+ required: false,
1832
+ check: "accepted",
1833
+ description: "Rappelé quand l’utilisateur demande à ouvrir ou fermer."
1834
+ }
1835
+ ],
1836
+ usages: [
1837
+ {
1838
+ when: "un contenu riche ou interactif dans une surface flottante au clic",
1839
+ use: "<Popover><PopoverTrigger>…</PopoverTrigger><PopoverContent>…</PopoverContent></Popover>",
1840
+ avoid: "un `Popover` pour un texte court au survol : c’est une `Tooltip`"
1841
+ },
1842
+ {
1843
+ when: "ancrer la surface sur un autre élément que le déclencheur",
1844
+ use: "un `PopoverAnchor` autour de la cible",
1845
+ avoid: "déplacer la surface par des marges : l’ancrage est le rôle de l’`Anchor`"
1846
+ },
1847
+ {
1848
+ when: "regrouper des actions plutôt qu’un contenu",
1849
+ use: "des `DropdownMenuItem` dans un `PopoverContent`, ou un `DropdownMenu`",
1850
+ avoid: "un `Popover` pour choisir une valeur de formulaire : c’est un `Select`"
1851
+ }
1852
+ ]
1853
+ };
1854
+ //#endregion
914
1855
  //#region src/components/search-field/search-field.tsx
915
1856
  function SearchField({ value, onChange, clearLabel, placeholder, className }) {
916
1857
  return /* @__PURE__ */ jsxs("div", {
@@ -1246,76 +2187,6 @@ var formManifest = {
1246
2187
  }]
1247
2188
  };
1248
2189
  //#endregion
1249
- //#region src/internal/dropdown-menu.tsx
1250
- var DropdownMenu = DropdownMenuPrimitive.Root;
1251
- var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
1252
- var DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.SubTrigger, {
1253
- ref,
1254
- className: cn("flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", inset && "pl-8", className),
1255
- ...props,
1256
- children: [children, /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto" })]
1257
- }));
1258
- DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
1259
- var DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.SubContent, {
1260
- ref,
1261
- className: cn("z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]", className),
1262
- ...props
1263
- }));
1264
- DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
1265
- var DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.Content, {
1266
- ref,
1267
- sideOffset,
1268
- className: cn("z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-32 overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]", className),
1269
- ...props
1270
- }) }));
1271
- DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
1272
- var DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Item, {
1273
- ref,
1274
- className: cn("relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", inset && "pl-8", className),
1275
- ...props
1276
- }));
1277
- DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
1278
- var DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.CheckboxItem, {
1279
- ref,
1280
- className: cn("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className),
1281
- checked,
1282
- ...props,
1283
- children: [/* @__PURE__ */ jsx("span", {
1284
- className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center",
1285
- children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) })
1286
- }), children]
1287
- }));
1288
- DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
1289
- var DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.RadioItem, {
1290
- ref,
1291
- className: cn("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className),
1292
- ...props,
1293
- children: [/* @__PURE__ */ jsx("span", {
1294
- className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center",
1295
- children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) })
1296
- }), children]
1297
- }));
1298
- DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
1299
- var DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Label, {
1300
- ref,
1301
- className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className),
1302
- ...props
1303
- }));
1304
- DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
1305
- var DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Separator, {
1306
- ref,
1307
- className: cn("-mx-1 my-1 h-px bg-muted", className),
1308
- ...props
1309
- }));
1310
- DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
1311
- var DropdownMenuShortcut = ({ className, ...props }) => {
1312
- return /* @__PURE__ */ jsx("span", {
1313
- className: cn("ml-auto text-xs tracking-widest opacity-60", className),
1314
- ...props
1315
- });
1316
- };
1317
- DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
1318
- //#endregion
1319
2190
  //#region src/components/facet-filter/facet-filter.tsx
1320
2191
  function FacetFilter({ label, options, selected, onChange, clearLabel, className }) {
1321
2192
  const toggle = (value) => {
@@ -1671,7 +2542,12 @@ var dataTableToolbarManifest = {
1671
2542
  }]
1672
2543
  };
1673
2544
  //#endregion
1674
- //#region src/internal/select.tsx
2545
+ //#region src/components/select/select.tsx
2546
+ /**
2547
+ * Le sélecteur : un déclencheur et une liste flottante d'options, à choisir unique. Les
2548
+ * libellés viennent de l'app (aucun texte propre au cœur). Présenté en parts importables
2549
+ * séparément ; la couche flottante (empilement, mouvement) vient des tokens (ADR 0027).
2550
+ */
1675
2551
  var Select = SelectPrimitive.Root;
1676
2552
  var SelectGroup = SelectPrimitive.Group;
1677
2553
  var SelectValue = SelectPrimitive.Value;
@@ -1701,7 +2577,7 @@ var SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) =>
1701
2577
  SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
1702
2578
  var SelectContent = React.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(SelectPrimitive.Content, {
1703
2579
  ref,
1704
- className: cn("relative z-50 max-h-[--radix-select-content-available-height] min-w-32 overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
2580
+ className: cn("relative z-popover max-h-[--radix-select-content-available-height] min-w-32 overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-content-in data-[state=closed]:animate-content-out origin-[--radix-select-content-transform-origin]", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
1705
2581
  position,
1706
2582
  ...props,
1707
2583
  children: [
@@ -1975,29 +2851,42 @@ var dataTableFeatures = tableFeatures({
1975
2851
  }
1976
2852
  });
1977
2853
  //#endregion
1978
- //#region src/internal/sheet.tsx
1979
- var Sheet = SheetPrimitive.Root;
1980
- var SheetPortal = SheetPrimitive.Portal;
1981
- var SheetOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(SheetPrimitive.Overlay, {
1982
- className: cn("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", className),
2854
+ //#region src/components/sheet/sheet.tsx
2855
+ /**
2856
+ * Le panneau latéral : un déclencheur, un voile et une surface ancrée à un bord. Les
2857
+ * quatre côtés vivent dans la variante `side` — `side="bottom"` est le **drawer**. La
2858
+ * couche flottante (empilement, voile, mouvement) vient des tokens (ADR 0027), jamais
2859
+ * d'une valeur en dur. Présenté en parts importables séparément.
2860
+ */
2861
+ var Sheet = DialogPrimitive.Root;
2862
+ var SheetTrigger = DialogPrimitive.Trigger;
2863
+ var SheetClose = DialogPrimitive.Close;
2864
+ var SheetPortal = DialogPrimitive.Portal;
2865
+ var SheetOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Overlay, {
2866
+ className: cn("fixed inset-0 z-overlay bg-scrim data-[state=open]:animate-overlay-in data-[state=closed]:animate-overlay-out", className),
1983
2867
  ...props,
1984
2868
  ref
1985
2869
  }));
1986
- SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
1987
- var sheetVariants = cva("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500", {
2870
+ SheetOverlay.displayName = DialogPrimitive.Overlay.displayName;
2871
+ /**
2872
+ * La config des variantes est exportée à côté de `sheetVariants` : le catalogue la lit
2873
+ * pour vérifier que le manifeste ne dérive pas des props réelles (ADR 0005).
2874
+ */
2875
+ var sheetVariantsConfig = {
1988
2876
  variants: { side: {
1989
- top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
1990
- bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
1991
- left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
1992
- right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
2877
+ top: "inset-x-0 top-0 border-b data-[state=closed]:animate-slide-out-top data-[state=open]:animate-slide-in-top",
2878
+ bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:animate-slide-out-bottom data-[state=open]:animate-slide-in-bottom",
2879
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:animate-slide-out-left data-[state=open]:animate-slide-in-left sm:max-w-sm",
2880
+ right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:animate-slide-out-right data-[state=open]:animate-slide-in-right sm:max-w-sm"
1993
2881
  } },
1994
2882
  defaultVariants: { side: "right" }
1995
- });
1996
- var SheetContent = React.forwardRef(({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ jsxs(SheetPortal, { children: [/* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsxs(SheetPrimitive.Content, {
2883
+ };
2884
+ var sheetVariants = cva("fixed z-overlay gap-4 bg-background p-6 shadow-lg", sheetVariantsConfig);
2885
+ var SheetContent = React.forwardRef(({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ jsxs(SheetPortal, { children: [/* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsxs(DialogPrimitive.Content, {
1997
2886
  ref,
1998
2887
  className: cn(sheetVariants({ side }), className),
1999
2888
  ...props,
2000
- children: [children, /* @__PURE__ */ jsxs(SheetPrimitive.Close, {
2889
+ children: [children, /* @__PURE__ */ jsxs(DialogPrimitive.Close, {
2001
2890
  className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",
2002
2891
  children: [/* @__PURE__ */ jsx(X, { className: "h-4 w-4" }), /* @__PURE__ */ jsx("span", {
2003
2892
  className: "sr-only",
@@ -2005,7 +2894,7 @@ var SheetContent = React.forwardRef(({ side = "right", className, children, ...p
2005
2894
  })]
2006
2895
  })]
2007
2896
  })] }));
2008
- SheetContent.displayName = SheetPrimitive.Content.displayName;
2897
+ SheetContent.displayName = DialogPrimitive.Content.displayName;
2009
2898
  var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
2010
2899
  className: cn("flex flex-col space-y-2 text-center sm:text-left", className),
2011
2900
  ...props
@@ -2016,18 +2905,18 @@ var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
2016
2905
  ...props
2017
2906
  });
2018
2907
  SheetFooter.displayName = "SheetFooter";
2019
- var SheetTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(SheetPrimitive.Title, {
2908
+ var SheetTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Title, {
2020
2909
  ref,
2021
2910
  className: cn("text-lg font-semibold text-foreground", className),
2022
2911
  ...props
2023
2912
  }));
2024
- SheetTitle.displayName = SheetPrimitive.Title.displayName;
2025
- var SheetDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(SheetPrimitive.Description, {
2913
+ SheetTitle.displayName = DialogPrimitive.Title.displayName;
2914
+ var SheetDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, {
2026
2915
  ref,
2027
2916
  className: cn("text-sm text-muted-foreground", className),
2028
2917
  ...props
2029
2918
  }));
2030
- SheetDescription.displayName = SheetPrimitive.Description.displayName;
2919
+ SheetDescription.displayName = DialogPrimitive.Description.displayName;
2031
2920
  //#endregion
2032
2921
  //#region src/features/faceted-data-table.tsx
2033
2922
  function resolve$1(updater, previous) {
@@ -2312,16 +3201,255 @@ function FacetedDataTable({ data, renderColumns, facets, globalFilterFn, labels,
2312
3201
  });
2313
3202
  }
2314
3203
  //#endregion
2315
- //#region src/internal/tooltip.tsx
3204
+ //#region src/components/sheet/manifest.ts
3205
+ /**
3206
+ * Le manifeste du panneau latéral (ADR 0005). Le catalogue enregistre la racine `Sheet` ;
3207
+ * les parts se composent dans l'exemple. `side="bottom"` est le **drawer** — une variante
3208
+ * documentée, pas un atome à part.
3209
+ */
3210
+ var sheetManifest = {
3211
+ name: "sheet",
3212
+ title: "Sheet",
3213
+ summary: "Un panneau ancré à un bord de l’écran, sur un voile : un déclencheur, un en-tête (titre, description), un corps et un pied. Livré en parts importables séparément ; `side=\"bottom\"` est le drawer.",
3214
+ level: "bloc",
3215
+ example: {
3216
+ open: true,
3217
+ children: createElement(Fragment$1, null, createElement(SheetTrigger, { className: buttonVariants({ variant: "outline" }) }, "Ouvrir"), createElement(SheetContent, { side: "right" }, createElement(SheetHeader, null, createElement(SheetTitle, null, "Panneau"), createElement(SheetDescription, null, "Une description courte.")), "Le contenu du panneau."))
3218
+ },
3219
+ variants: [{
3220
+ name: "side",
3221
+ values: [
3222
+ "top",
3223
+ "right",
3224
+ "bottom",
3225
+ "left"
3226
+ ],
3227
+ default: "right",
3228
+ description: "Le bord auquel le panneau s’ancre — `bottom` est le drawer ; c’est l’usage qui décide, pas le goût."
3229
+ }],
3230
+ props: [
3231
+ {
3232
+ name: "children",
3233
+ type: "ReactNode",
3234
+ required: true,
3235
+ check: "accepted",
3236
+ description: "Les parts du panneau : un déclencheur, une surface, un en-tête, un pied."
3237
+ },
3238
+ {
3239
+ name: "open",
3240
+ type: "boolean",
3241
+ required: false,
3242
+ check: "accepted",
3243
+ description: "L’état d’ouverture contrôlé : il vit dans l’app."
3244
+ },
3245
+ {
3246
+ name: "defaultOpen",
3247
+ type: "boolean",
3248
+ required: false,
3249
+ check: "accepted",
3250
+ description: "L’état d’ouverture initial, quand l’app ne le contrôle pas."
3251
+ },
3252
+ {
3253
+ name: "modal",
3254
+ type: "boolean",
3255
+ required: false,
3256
+ check: "accepted",
3257
+ description: "Blocage du reste de la page et piégeage du focus. Défaut `true` ; `false` pour un panneau non bloquant."
3258
+ },
3259
+ {
3260
+ name: "onOpenChange",
3261
+ type: "(open: boolean) => void",
3262
+ required: false,
3263
+ check: "accepted",
3264
+ description: "Rappelé quand l’utilisateur demande à ouvrir ou fermer."
3265
+ }
3266
+ ],
3267
+ usages: [
3268
+ {
3269
+ when: "montrer un contenu ancré à un bord sans quitter la vue",
3270
+ use: "<Sheet><SheetTrigger>…</SheetTrigger><SheetContent side=\"right\">…</SheetContent></Sheet>",
3271
+ avoid: "un `Sheet` pour une décision centrée : c’est un `Dialog`"
3272
+ },
3273
+ {
3274
+ when: "un drawer (panneau bas, geste mobile)",
3275
+ use: "side=\"bottom\" sur `SheetContent`",
3276
+ avoid: "un composant `Drawer` à part : c’est le même panneau, un côté différent"
3277
+ },
3278
+ {
3279
+ when: "un panneau non bloquant (inspecteur, aide)",
3280
+ use: "modal={false}",
3281
+ avoid: "un overlay cliquable sur un panneau non modal : l’app décide de la fermeture"
3282
+ }
3283
+ ]
3284
+ };
3285
+ //#endregion
3286
+ //#region src/components/tooltip/tooltip.tsx
3287
+ /**
3288
+ * L'infobulle : un texte d'aide attaché à un déclencheur, au survol et au focus. La
3289
+ * famille se compose — `TooltipProvider` (le délai partagé), `Tooltip` (la racine),
3290
+ * `TooltipTrigger`, `TooltipContent` — ; aucun texte n'est propre au cœur. La couche
3291
+ * flottante (empilement, mouvement) vient des tokens (ADR 0027).
3292
+ */
2316
3293
  var TooltipProvider = TooltipPrimitive.Provider;
3294
+ var Tooltip = TooltipPrimitive.Root;
3295
+ var TooltipTrigger = TooltipPrimitive.Trigger;
2317
3296
  var TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Content, {
2318
3297
  ref,
2319
3298
  sideOffset,
2320
- className: cn("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]", className),
3299
+ className: cn("z-tooltip overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md data-[state=open]:animate-content-in data-[state=closed]:animate-content-out origin-[--radix-tooltip-content-transform-origin]", className),
2321
3300
  ...props
2322
3301
  }));
2323
3302
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
2324
3303
  //#endregion
3304
+ //#region src/components/tooltip/manifest.ts
3305
+ /**
3306
+ * Le manifeste de l'infobulle (ADR 0005). Le catalogue enregistre la famille sur sa
3307
+ * racine obligatoire, `TooltipProvider` ; `Tooltip`, `TooltipTrigger` et `TooltipContent`
3308
+ * se composent dans l'exemple. La bulle lit le `z-index` tokenisé (ADR 0027).
3309
+ */
3310
+ var tooltipManifest = {
3311
+ name: "tooltip",
3312
+ title: "Tooltip",
3313
+ summary: "Un texte d’aide attaché à un déclencheur, au survol et au focus. La famille se compose — Provider (délai partagé), Root, Trigger, Content ; les textes viennent de l’app.",
3314
+ level: "primitive",
3315
+ example: {
3316
+ delayDuration: 200,
3317
+ children: createElement(Fragment$1, null, createElement(Tooltip, { defaultOpen: true }, createElement(TooltipTrigger, null, "Aide"), createElement(TooltipContent, null, "Texte d’aide")))
3318
+ },
3319
+ variants: [],
3320
+ props: [
3321
+ {
3322
+ name: "children",
3323
+ type: "ReactNode",
3324
+ required: true,
3325
+ check: "accepted",
3326
+ description: "La famille : des `Tooltip` (racine), à poser dans le provider."
3327
+ },
3328
+ {
3329
+ name: "delayDuration",
3330
+ type: "number",
3331
+ required: false,
3332
+ check: "accepted",
3333
+ description: "Le délai d’ouverture au survol, en millisecondes. Défaut 700."
3334
+ },
3335
+ {
3336
+ name: "skipDelayDuration",
3337
+ type: "number",
3338
+ required: false,
3339
+ check: "accepted",
3340
+ description: "La fenêtre pendant laquelle une seconde bulle s’ouvre sans attendre."
3341
+ },
3342
+ {
3343
+ name: "disableHoverableContent",
3344
+ type: "boolean",
3345
+ required: false,
3346
+ check: "accepted",
3347
+ description: "Empêche de survoler le contenu ouvert sans qu’il se referme."
3348
+ }
3349
+ ],
3350
+ usages: [{
3351
+ when: "nommer un contrôle iconique, ou glisser une aide courte",
3352
+ use: "<TooltipProvider><Tooltip><TooltipTrigger>…</TooltipTrigger><TooltipContent>…</TooltipContent></Tooltip></TooltipProvider>",
3353
+ avoid: "une `Tooltip` pour une information essentielle : elle n’est ni au clavier seul ni au tactile"
3354
+ }, {
3355
+ when: "plusieurs bulles dans la même vue",
3356
+ use: "un seul `TooltipProvider` autour de leurs `Tooltip`",
3357
+ avoid: "un provider par `Tooltip` : le délai partagé perd son sens"
3358
+ }]
3359
+ };
3360
+ //#endregion
3361
+ //#region src/components/select/manifest.ts
3362
+ /**
3363
+ * Le manifeste du sélecteur (ADR 0005). Le catalogue enregistre la racine `Select` ; les
3364
+ * parts se composent dans l'exemple. La liste flottante lit le `z-index` tokenisé
3365
+ * (ADR 0027), jamais une valeur d’empilement en dur.
3366
+ */
3367
+ var selectManifest = {
3368
+ name: "select",
3369
+ title: "Select",
3370
+ summary: "Un sélecteur à choix unique : un déclencheur et une liste flottante d’options. Livré en parts importables séparément ; les libellés et les valeurs viennent de l’app.",
3371
+ level: "primitive",
3372
+ example: {
3373
+ defaultValue: "open",
3374
+ children: createElement(Fragment$1, null, createElement(SelectTrigger, { className: "w-48" }, createElement(SelectValue, { placeholder: "Statut" })), createElement(SelectContent, null, createElement(SelectItem, { value: "open" }, "Ouverte"), createElement(SelectItem, { value: "closed" }, "Fermée")))
3375
+ },
3376
+ variants: [],
3377
+ props: [
3378
+ {
3379
+ name: "children",
3380
+ type: "ReactNode",
3381
+ required: true,
3382
+ check: "accepted",
3383
+ description: "Les parts du sélecteur : un déclencheur, une valeur, une liste d’items."
3384
+ },
3385
+ {
3386
+ name: "value",
3387
+ type: "string",
3388
+ required: false,
3389
+ check: "accepted",
3390
+ description: "La valeur sélectionnée, contrôlée par l’app."
3391
+ },
3392
+ {
3393
+ name: "defaultValue",
3394
+ type: "string",
3395
+ required: false,
3396
+ check: "accepted",
3397
+ description: "La valeur initiale, quand l’app ne la contrôle pas."
3398
+ },
3399
+ {
3400
+ name: "onValueChange",
3401
+ type: "(value: string) => void",
3402
+ required: false,
3403
+ check: "accepted",
3404
+ description: "Rappelé quand l’utilisateur choisit une option."
3405
+ },
3406
+ {
3407
+ name: "open",
3408
+ type: "boolean",
3409
+ required: false,
3410
+ check: "accepted",
3411
+ description: "L’état d’ouverture contrôlé : il vit dans l’app."
3412
+ },
3413
+ {
3414
+ name: "defaultOpen",
3415
+ type: "boolean",
3416
+ required: false,
3417
+ check: "accepted",
3418
+ description: "L’état d’ouverture initial, quand l’app ne le contrôle pas."
3419
+ },
3420
+ {
3421
+ name: "onOpenChange",
3422
+ type: "(open: boolean) => void",
3423
+ required: false,
3424
+ check: "accepted",
3425
+ description: "Rappelé quand l’utilisateur demande à ouvrir ou fermer."
3426
+ },
3427
+ {
3428
+ name: "disabled",
3429
+ type: "boolean",
3430
+ required: false,
3431
+ check: "accepted",
3432
+ description: "Désactive le sélecteur : ni ouverture, ni changement."
3433
+ },
3434
+ {
3435
+ name: "name",
3436
+ type: "string",
3437
+ required: false,
3438
+ check: "accepted",
3439
+ description: "Le nom du champ, pour la soumission d’un formulaire."
3440
+ }
3441
+ ],
3442
+ usages: [{
3443
+ when: "choisir une valeur unique parmi une liste d’options",
3444
+ use: "<Select><SelectTrigger><SelectValue placeholder=\"…\" /></SelectTrigger><SelectContent>…</SelectContent></Select>",
3445
+ avoid: "un `DropdownMenu` pour une valeur de formulaire : un menu porte des actions, pas une valeur"
3446
+ }, {
3447
+ when: "quelques options seulement, toutes visibles",
3448
+ use: "un `RadioGroup` : les options restent à l’écran",
3449
+ avoid: "un `Select` pour deux ou trois options qu’on veut comparer d’un regard"
3450
+ }]
3451
+ };
3452
+ //#endregion
2325
3453
  //#region src/components/meter/meter.tsx
2326
3454
  /**
2327
3455
  * Le Meter : une barre qui montre où en est une valeur sur une échelle, avec la marque
@@ -3294,7 +4422,7 @@ function ToastProvider({ children, closeLabel, duration = DEFAULT_DURATION }) {
3294
4422
  value: api,
3295
4423
  children: [children, /* @__PURE__ */ jsx("div", {
3296
4424
  "aria-live": "polite",
3297
- className: "pointer-events-none fixed inset-x-0 bottom-0 z-50 flex flex-col items-center gap-2 p-4 sm:items-end",
4425
+ className: "pointer-events-none fixed inset-x-0 bottom-0 z-toast flex flex-col items-center gap-2 p-4 sm:items-end",
3298
4426
  children: items.map((item) => {
3299
4427
  const common = {
3300
4428
  tone: item.tone,
@@ -4052,6 +5180,42 @@ var catalogueEntries = [
4052
5180
  defaultVariants: { tone: "info" }
4053
5181
  } }
4054
5182
  },
5183
+ {
5184
+ manifest: alertDialogManifest,
5185
+ component: AlertDialog,
5186
+ variantsConfig: {}
5187
+ },
5188
+ {
5189
+ manifest: avatarManifest,
5190
+ component: Avatar,
5191
+ variantsConfig: {}
5192
+ },
5193
+ {
5194
+ manifest: scrollAreaManifest,
5195
+ component: ScrollArea,
5196
+ variantsConfig: {}
5197
+ },
5198
+ {
5199
+ manifest: tabsManifest,
5200
+ component: Tabs,
5201
+ variantsConfig: {}
5202
+ },
5203
+ {
5204
+ manifest: accordionManifest,
5205
+ component: Accordion,
5206
+ variantsConfig: { type: {
5207
+ variants: { type: {
5208
+ single: {},
5209
+ multiple: {}
5210
+ } },
5211
+ defaultVariants: { type: "single" }
5212
+ } }
5213
+ },
5214
+ {
5215
+ manifest: collapsibleManifest,
5216
+ component: Collapsible,
5217
+ variantsConfig: {}
5218
+ },
4055
5219
  {
4056
5220
  manifest: badgeManifest,
4057
5221
  component: Badge,
@@ -4070,6 +5234,16 @@ var catalogueEntries = [
4070
5234
  component: Card,
4071
5235
  variantsConfig: {}
4072
5236
  },
5237
+ {
5238
+ manifest: dialogManifest,
5239
+ component: Dialog,
5240
+ variantsConfig: {}
5241
+ },
5242
+ {
5243
+ manifest: dropdownMenuManifest,
5244
+ component: DropdownMenu,
5245
+ variantsConfig: {}
5246
+ },
4073
5247
  {
4074
5248
  manifest: emptyStateManifest,
4075
5249
  component: EmptyState,
@@ -4104,11 +5278,21 @@ var catalogueEntries = [
4104
5278
  component: NumberField,
4105
5279
  variantsConfig: {}
4106
5280
  },
5281
+ {
5282
+ manifest: popoverManifest,
5283
+ component: Popover,
5284
+ variantsConfig: {}
5285
+ },
4107
5286
  {
4108
5287
  manifest: searchFieldManifest,
4109
5288
  component: SearchField,
4110
5289
  variantsConfig: {}
4111
5290
  },
5291
+ {
5292
+ manifest: selectManifest,
5293
+ component: Select,
5294
+ variantsConfig: {}
5295
+ },
4112
5296
  {
4113
5297
  manifest: labelManifest,
4114
5298
  component: Label,
@@ -4154,6 +5338,11 @@ var catalogueEntries = [
4154
5338
  component: Separator,
4155
5339
  variantsConfig: {}
4156
5340
  },
5341
+ {
5342
+ manifest: sheetManifest,
5343
+ component: Sheet,
5344
+ variantsConfig: { side: sheetVariantsConfig }
5345
+ },
4157
5346
  {
4158
5347
  manifest: skeletonManifest,
4159
5348
  component: Skeleton,
@@ -4208,6 +5397,11 @@ var catalogueEntries = [
4208
5397
  defaultVariants: { tone: "info" }
4209
5398
  } }
4210
5399
  },
5400
+ {
5401
+ manifest: tooltipManifest,
5402
+ component: TooltipProvider,
5403
+ variantsConfig: {}
5404
+ },
4211
5405
  {
4212
5406
  manifest: treeManifest,
4213
5407
  component: Tree,
@@ -4353,12 +5547,14 @@ function cssValue(value, type) {
4353
5547
  if (typeof value === "number") return String(value);
4354
5548
  if (Array.isArray(value)) {
4355
5549
  if (type === "fontFamily") return value.map((f) => f.includes(" ") ? `"${f}"` : f).join(", ");
5550
+ if (type === "cubicBezier" && value.length === 4) return `cubic-bezier(${value.join(", ")})`;
4356
5551
  throw new Error(type ? `tokens.json : valeur tableau non rendue pour le type \`${type}\`.` : "tokens.json : une valeur tableau exige le `$type` de son token (aucun reçu).");
4357
5552
  }
4358
5553
  if (value && typeof value === "object") {
4359
5554
  if (value.colorSpace === "hsl") {
4360
- const [h, s, l] = value.components;
4361
- return `${h} ${s}% ${l}%`;
5555
+ const [h, s, l, a] = value.components;
5556
+ const base = `${h} ${s}% ${l}%`;
5557
+ return a === void 0 ? base : `${base} / ${a}`;
4362
5558
  }
4363
5559
  if ("value" in value && "unit" in value) return `${value.value}${value.unit}`;
4364
5560
  }
@@ -4484,6 +5680,7 @@ var tokensResource = {
4484
5680
  "--nomos-color-input": "240 8% 19%",
4485
5681
  "--nomos-color-ring": "174 100% 39%",
4486
5682
  "--nomos-color-brand": "#00c9b1",
5683
+ "--nomos-color-scrim": "0 0% 0% / 0.8",
4487
5684
  "--nomos-color-status-info": "199 89% 48%",
4488
5685
  "--nomos-color-status-info-ink": "198 93% 74%",
4489
5686
  "--nomos-color-status-progress": "258 90% 66%",
@@ -4500,6 +5697,16 @@ var tokensResource = {
4500
5697
  "--nomos-radius-control": "0.625rem",
4501
5698
  "--nomos-radius-field": "0.5rem",
4502
5699
  "--nomos-radius-chip": "0.375rem",
5700
+ "--nomos-z-overlay": "50",
5701
+ "--nomos-z-popover": "60",
5702
+ "--nomos-z-tooltip": "70",
5703
+ "--nomos-z-toast": "80",
5704
+ "--nomos-motion-duration-fast": "150ms",
5705
+ "--nomos-motion-duration-base": "250ms",
5706
+ "--nomos-motion-duration-slow": "400ms",
5707
+ "--nomos-motion-ease-standard": "cubic-bezier(0.4, 0, 0.2, 1)",
5708
+ "--nomos-motion-ease-in": "cubic-bezier(0.4, 0, 1, 1)",
5709
+ "--nomos-motion-ease-out": "cubic-bezier(0, 0, 0.2, 1)",
4503
5710
  "--nomos-space-hairline": "2px",
4504
5711
  "--nomos-space-tight": "4px",
4505
5712
  "--nomos-space-snug": "8px",
@@ -4545,6 +5752,7 @@ var tokensResource = {
4545
5752
  "--nomos-color-input": "240 6% 85%",
4546
5753
  "--nomos-color-ring": "174 100% 35%",
4547
5754
  "--nomos-color-brand": "#00c9b1",
5755
+ "--nomos-color-scrim": "0 0% 0% / 0.8",
4548
5756
  "--nomos-color-status-info": "199 89% 48%",
4549
5757
  "--nomos-color-status-info-ink": "201 96% 32%",
4550
5758
  "--nomos-color-status-progress": "258 90% 66%",
@@ -4561,6 +5769,16 @@ var tokensResource = {
4561
5769
  "--nomos-radius-control": "0.625rem",
4562
5770
  "--nomos-radius-field": "0.5rem",
4563
5771
  "--nomos-radius-chip": "0.375rem",
5772
+ "--nomos-z-overlay": "50",
5773
+ "--nomos-z-popover": "60",
5774
+ "--nomos-z-tooltip": "70",
5775
+ "--nomos-z-toast": "80",
5776
+ "--nomos-motion-duration-fast": "150ms",
5777
+ "--nomos-motion-duration-base": "250ms",
5778
+ "--nomos-motion-duration-slow": "400ms",
5779
+ "--nomos-motion-ease-standard": "cubic-bezier(0.4, 0, 0.2, 1)",
5780
+ "--nomos-motion-ease-in": "cubic-bezier(0.4, 0, 1, 1)",
5781
+ "--nomos-motion-ease-out": "cubic-bezier(0, 0, 0.2, 1)",
4564
5782
  "--nomos-space-hairline": "2px",
4565
5783
  "--nomos-space-tight": "4px",
4566
5784
  "--nomos-space-snug": "8px",
@@ -4588,4 +5806,4 @@ var tokensResource = {
4588
5806
  }
4589
5807
  };
4590
5808
  //#endregion
4591
- export { Alert, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Chip, CompactMeter, Counter, DataTablePagination, DataTableToolbar, EmptyState, FacetFilter, FacetedDataTable, Field, Fieldset, Form, Freshness, Input, Label, Meter, NumberField, ProgressBar, RadioGroup, RadioGroupItem, Rating, SearchField, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, SelectionTree, Separator, SheetDescription, SheetHeader, SheetTitle, Skeleton, Switch, TONES, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Textarea, Timeline, Toast, ToastProvider, Toggle, ToggleGroup, ToggleGroupItem, TooltipProvider, Tree, alertManifest, badgeManifest, badgeVariants, badgeVariantsConfig, buttonManifest, buttonVariants, buttonVariantsConfig, cardManifest, catalogue, checkboxManifest, chipManifest, cn, componentManifestSchema, componentNames, counterManifest, dataTableFeatures, dataTablePaginationManifest, dataTableToolbarManifest, emptyStateManifest, facetFilterManifest, fieldManifest, fieldsetManifest, findComponent, formManifest, freshnessManifest, inputManifest, labelManifest, meterManifest, numberFieldManifest, progressBarManifest, radioManifest, ratingManifest, renderCss, resolveSkin, searchFieldManifest, separatorManifest, skeletonManifest, switchManifest, tableManifest, textareaManifest, timelineManifest, toastManifest, toggleGroupManifest, toggleManifest, toggleVariants, toggleVariantsConfig, tokensResource, toneClasses, treeManifest, useToast, validateCatalogue };
5809
+ export { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Chip, Collapsible, CollapsibleContent, CollapsibleTrigger, CompactMeter, Counter, DataTablePagination, DataTableToolbar, Dialog, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, FacetFilter, FacetedDataTable, Field, Fieldset, Form, Freshness, Input, Label, Meter, NumberField, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, ProgressBar, RadioGroup, RadioGroupItem, Rating, ScrollArea, ScrollBar, SearchField, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectionTree, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Switch, TONES, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Timeline, Toast, ToastProvider, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Tree, accordionManifest, alertDialogManifest, alertManifest, avatarManifest, badgeManifest, badgeVariants, badgeVariantsConfig, buttonManifest, buttonVariants, buttonVariantsConfig, cardManifest, catalogue, checkboxManifest, chipManifest, cn, collapsibleManifest, componentManifestSchema, componentNames, counterManifest, dataTableFeatures, dataTablePaginationManifest, dataTableToolbarManifest, dialogManifest, dropdownMenuManifest, emptyStateManifest, facetFilterManifest, fieldManifest, fieldsetManifest, findComponent, formManifest, freshnessManifest, inputManifest, labelManifest, meterManifest, numberFieldManifest, popoverManifest, progressBarManifest, radioManifest, ratingManifest, renderCss, resolveSkin, scrollAreaManifest, searchFieldManifest, selectManifest, separatorManifest, sheetManifest, skeletonManifest, switchManifest, tableManifest, tabsManifest, textareaManifest, timelineManifest, toastManifest, toggleGroupManifest, toggleManifest, toggleVariants, toggleVariantsConfig, tokensResource, toneClasses, tooltipManifest, treeManifest, useToast, validateCatalogue };