@nomosui/react 0.4.1 → 0.5.1
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/README.md +8 -1
- package/SKILL.md +42 -0
- package/dist/index.js +1361 -143
- package/dist/mcp/bin.js +11225 -7428
- package/dist/types/components/accordion/accordion.d.ts +14 -0
- package/dist/types/components/accordion/manifest.d.ts +7 -0
- package/dist/types/components/alert-dialog/alert-dialog.d.ts +26 -0
- package/dist/types/components/alert-dialog/manifest.d.ts +7 -0
- package/dist/types/components/avatar/avatar.d.ts +17 -0
- package/dist/types/components/avatar/manifest.d.ts +6 -0
- package/dist/types/components/badge/badge.d.ts +1 -1
- package/dist/types/components/button/button.d.ts +1 -1
- package/dist/types/components/collapsible/collapsible.d.ts +11 -0
- package/dist/types/components/collapsible/manifest.d.ts +7 -0
- package/dist/types/components/dialog/dialog.d.ts +30 -0
- package/dist/types/components/dialog/manifest.d.ts +7 -0
- package/dist/types/{internal → components/dropdown-menu}/dropdown-menu.d.ts +5 -0
- package/dist/types/components/dropdown-menu/manifest.d.ts +7 -0
- package/dist/types/components/popover/manifest.d.ts +7 -0
- package/dist/types/components/popover/popover.d.ts +12 -0
- package/dist/types/components/scroll-area/manifest.d.ts +6 -0
- package/dist/types/components/scroll-area/scroll-area.d.ts +10 -0
- package/dist/types/components/select/manifest.d.ts +7 -0
- package/dist/types/{internal → components/select}/select.d.ts +5 -0
- package/dist/types/components/sheet/manifest.d.ts +7 -0
- package/dist/types/{internal → components/sheet}/sheet.d.ts +23 -0
- package/dist/types/components/tabs/manifest.d.ts +6 -0
- package/dist/types/components/tabs/tabs.d.ts +12 -0
- package/dist/types/components/tooltip/manifest.d.ts +7 -0
- package/dist/types/{internal → components/tooltip}/tooltip.d.ts +6 -0
- package/dist/types/index.d.ts +26 -3
- package/package.json +9 -3
- package/tokens/theme.css +205 -0
- package/tokens/tokens.generated.css +44 -0
- package/tokens/tokens.json +46 -0
- 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/
|
|
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-
|
|
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/
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
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 =
|
|
1987
|
-
|
|
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-
|
|
1990
|
-
bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-
|
|
1991
|
-
left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-
|
|
1992
|
-
right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-
|
|
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
|
|
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(
|
|
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 =
|
|
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(
|
|
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 =
|
|
2025
|
-
var SheetDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
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 =
|
|
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/
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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 };
|