@sia-ui/react-web 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,58 +1,618 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { ReactNode, Key, RefObject, ReactElement, HTMLAttributes, ImgHTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, ForwardRefExoticComponent, RefAttributes, SVGProps, CSSProperties, PropsWithChildren } from 'react';
4
- import * as _sia_ui_headless from '@sia-ui/headless';
5
- import { PermissionRule, Placement, TableQuery, SliderValue, FormAdapter, FormValidator, FormSubmitResult, TableQueryStorage, TableQueryState, TableParamsMapping, SessionStore, SessionState, ToastPlacement, ToastId, ToastOptions } from '@sia-ui/headless';
6
- export { SliderValue, ToastId, ToastOptions, ToastPlacement, ToastTone, toast, toastStore } from '@sia-ui/headless';
3
+ import { ReactNode, ImgHTMLAttributes, HTMLAttributes, RefObject, ReactElement, InputHTMLAttributes, ButtonHTMLAttributes, CSSProperties, Key, ForwardRefExoticComponent, RefAttributes, SVGAttributes, TextareaHTMLAttributes, SVGProps, PropsWithChildren } from 'react';
7
4
  import { ComponentTone, ComponentSize } from '@sia-ui/tokens';
5
+ import * as _sia_ui_headless from '@sia-ui/headless';
6
+ import { Placement, PermissionRule, TableQuery, ActivityLogMessages, SliderValue, AsyncFieldValidator, FormAdapter, FormValidator, FormSubmitResult, ResourceMessages, TableQueryStorage, TableQueryState, TableParamsMapping, CalendarEventInput, EventCalendarMessages, CalendarView, DayEvent, EventManagerMessages, SessionStore, SessionState, ToastPlacement, ToastId, ToastOptions } from '@sia-ui/headless';
7
+ export { CalendarView, SliderValue, ToastId, ToastOptions, ToastPlacement, ToastTone, eventDays, toast, toastStore } from '@sia-ui/headless';
8
8
  import { Rule } from '@sia-ui/utils/validation';
9
9
 
10
- interface AccordionItem {
11
- key: string;
10
+ interface AccordionItem {
11
+ key: string;
12
+ title: ReactNode;
13
+ content: ReactNode;
14
+ /** Une ligne sous le titre, visible même replié. */
15
+ description?: ReactNode;
16
+ icon?: ReactNode;
17
+ /** À droite du titre : un compteur, un badge, un statut. */
18
+ meta?: ReactNode;
19
+ disabled?: boolean;
20
+ }
21
+ interface AccordionProps {
22
+ items: AccordionItem[];
23
+ /** `single` referme la section précédente, `multiple` les cumule. */
24
+ type?: "single" | "multiple";
25
+ value?: string[];
26
+ defaultValue?: string[];
27
+ onValueChange?: (value: string[]) => void;
28
+ /** En `single`, autorise à tout refermer. */
29
+ collapsible?: boolean;
30
+ variant?: "bordered" | "separated" | "plain";
31
+ className?: string;
32
+ }
33
+ /**
34
+ * Des sections dépliables.
35
+ *
36
+ * La hauteur s'anime sans être mesurée : le panneau est une grille dont la
37
+ * ligne passe de `0fr` à `1fr`. Pas de `scrollHeight`, pas de recalcul au
38
+ * redimensionnement, et un contenu qui change de taille suit tout seul.
39
+ */
40
+ declare function Accordion({ items, type, value, defaultValue, onValueChange, collapsible, variant, className, }: AccordionProps): react_jsx_runtime.JSX.Element;
41
+ interface CollapseProps {
42
+ title: ReactNode;
43
+ children: ReactNode;
44
+ description?: ReactNode;
45
+ meta?: ReactNode;
46
+ icon?: ReactNode;
47
+ open?: boolean;
48
+ defaultOpen?: boolean;
49
+ onOpenChange?: (open: boolean) => void;
50
+ variant?: AccordionProps["variant"];
51
+ disabled?: boolean;
52
+ className?: string;
53
+ }
54
+ /** Une section seule. Le même rendu, pour le cas le plus courant. */
55
+ declare function Collapse({ title, children, description, meta, icon, open, defaultOpen, onOpenChange, variant, disabled, className, }: CollapseProps): react_jsx_runtime.JSX.Element;
56
+
57
+ type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
58
+ type AvatarShape = "circle" | "rounded" | "square";
59
+ type AvatarVariant = "soft" | "solid" | "outline";
60
+ /**
61
+ * La présence d'une personne.
62
+ *
63
+ * Quatre états et pas davantage : au-delà, la pastille devient un code que
64
+ * personne ne retient, et il faut une légende pour la lire.
65
+ */
66
+ type AvatarStatus = "online" | "offline" | "busy" | "away";
67
+ /**
68
+ * Les teintes dérivées du nom.
69
+ *
70
+ * Deux personnes aux mêmes initiales doivent se distinguer : dans une liste
71
+ * de participants, six pastilles identiques ne valent pas mieux qu'aucune.
72
+ * La couleur est donc déterministe — la même personne garde la sienne d'un
73
+ * écran à l'autre, d'une session à l'autre.
74
+ */
75
+ declare const TEINTES: readonly ["primary", "info", "success", "warning", "danger", "secondary"];
76
+ type AvatarTint = (typeof TEINTES)[number];
77
+ declare function tintForName(name: string): AvatarTint;
78
+ declare function initialsOf(name: string, count?: number): string;
79
+ interface AvatarProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, "children" | "width" | "height"> {
80
+ /** Le nom de la personne : il sert au repli, à la couleur et à l'annonce. */
81
+ name: string;
82
+ size?: AvatarSize;
83
+ shape?: AvatarShape;
84
+ variant?: AvatarVariant;
85
+ /** Force la teinte au lieu de la dériver du nom. */
86
+ tint?: AvatarTint;
87
+ /** Remplace les initiales — une icône, un emoji, deux lettres à soi. */
88
+ fallback?: ReactNode;
89
+ /** Nombre d'initiales quand le repli est automatique. */
90
+ initials?: 1 | 2;
91
+ status?: AvatarStatus;
92
+ /** Le libellé du statut, pour les lecteurs d'écran. Par défaut, celui de la locale. */
93
+ statusLabel?: string;
94
+ /** Un liseré qui détache l'avatar de son fond. */
95
+ ring?: boolean;
96
+ /** Rend l'avatar actionnable — un menu de compte, par exemple. */
97
+ onPress?: () => void;
98
+ }
99
+ /**
100
+ * Le portrait d'une personne, ou ce qui le remplace.
101
+ *
102
+ * Une image met du temps à arriver, échoue parfois, et manque souvent. Les
103
+ * trois cas sont traités sans que la mise en page bouge : l'espace est réservé
104
+ * d'emblée, le repli est peint dessous, et l'image se fond par-dessus quand
105
+ * elle arrive.
106
+ */
107
+ declare function Avatar({ name, size, shape, variant, tint, fallback, initials, status, statusLabel, ring, onPress, className, src, alt, onError, onLoad, style, ...props }: AvatarProps): react_jsx_runtime.JSX.Element;
108
+ interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {
109
+ children: ReactNode;
110
+ /**
111
+ * Au-delà, les suivants sont résumés par un compteur.
112
+ *
113
+ * Sans limite, une réunion de quarante personnes déborde de sa ligne et
114
+ * n'apprend plus rien : au-delà de cinq visages, on ne lit plus des gens,
115
+ * on lit une foule.
116
+ */
117
+ max?: number;
118
+ size?: AvatarSize;
119
+ shape?: AvatarShape;
120
+ variant?: AvatarVariant;
121
+ /** Le chevauchement, de 0 (côte à côte) à 1 (fortement empilés). */
122
+ overlap?: number;
123
+ /** Écarte les avatars au survol, pour les distinguer. */
124
+ spreadOnHover?: boolean;
125
+ /** Ce qu'affiche le compteur. Par défaut `+N`. */
126
+ renderOverflow?: (count: number) => ReactNode;
127
+ }
128
+ /**
129
+ * Plusieurs personnes, sur une ligne.
130
+ *
131
+ * Les avatars se chevauchent — c'est ce qui dit « un groupe » plutôt qu'« une
132
+ * liste ». Chacun porte un liseré de la couleur du fond, sans quoi la pile
133
+ * devient une bouillie dès que deux teintes se ressemblent.
134
+ */
135
+ declare function AvatarGroup({ children, max, size, shape, variant, overlap, spreadOnHover, renderOverflow, className, style, ...props }: AvatarGroupProps): react_jsx_runtime.JSX.Element;
136
+
137
+ interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {
138
+ label?: string;
139
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
140
+ variant?: "dots" | "ring" | "double-ring";
141
+ tone?: ComponentTone | "current";
142
+ }
143
+ /**
144
+ * Une attente sans durée connue.
145
+ *
146
+ * Quand la durée est connue, une barre de progression en dit plus. Le ton
147
+ * `current` reprend la couleur du texte environnant : un indicateur posé
148
+ * dans un bouton doit suivre la couleur du bouton, pas celle du thème.
149
+ */
150
+ declare function Spinner({ label: labelProp, size: sizeProp, variant: variantProp, tone: toneProp, className, ...props }: SpinnerProps): react_jsx_runtime.JSX.Element;
151
+
152
+ interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
153
+ tone?: ComponentTone;
154
+ variant?: "soft" | "solid" | "outline";
155
+ left?: ReactNode;
156
+ right?: ReactNode;
157
+ loading?: boolean;
158
+ loadingLabel?: string;
159
+ spinnerProps?: Omit<SpinnerProps, "label">;
160
+ }
161
+ /**
162
+ * Une étiquette d'état, courte et dense.
163
+ *
164
+ * Elle porte un ton, jamais une action : un badge cliquable se confond avec
165
+ * un bouton petit, et l'on découvre qu'il ne l'était pas en cliquant. Ce
166
+ * qui agit est un bouton.
167
+ */
168
+ declare function Badge({ tone: toneProp, variant: variantProp, left, right, loading, loadingLabel: loadingLabelProp, spinnerProps, className, children, ...props }: BadgeProps): react_jsx_runtime.JSX.Element;
169
+ /**
170
+ * Le ton d'une valeur, lu dans une table de correspondance.
171
+ *
172
+ * Un statut, une action de journal, un environnement : chaque écran tenait
173
+ * sa propre table et sa propre fonction pour la lire. Celle-ci est la seule.
174
+ *
175
+ * ```ts
176
+ * const TONS = { payee: "success", attente: "warning", annulee: "danger" };
177
+ * toneOf(TONS, facture.statut); // "success" | … | "neutral"
178
+ * ```
179
+ */
180
+ declare function toneOf(tones: Readonly<Record<string, ComponentTone>> | undefined, value: unknown, fallback?: ComponentTone): ComponentTone;
181
+ interface StatusBadgeProps extends Omit<BadgeProps, "tone" | "children"> {
182
+ /** La valeur brute : `"payee"`, `"prod"`, `"delete"`. */
183
+ value: string | number | null | undefined;
184
+ /** Le ton de chaque valeur. */
185
+ tones?: Readonly<Record<string, ComponentTone>>;
186
+ /** Le libellé de chaque valeur. À défaut, la valeur elle-même. */
187
+ labels?: Readonly<Record<string, ReactNode>>;
188
+ /** Le ton d'une valeur absente de `tones`. `neutral` par défaut. */
189
+ fallbackTone?: ComponentTone;
190
+ /** Ce qui s'affiche sans valeur. Rien par défaut. */
191
+ empty?: ReactNode;
192
+ }
193
+ /**
194
+ * Une valeur rendue en pastille, ton et libellé tirés de deux tables.
195
+ *
196
+ * Déclarées une fois par domaine — les statuts de facture, les actions du
197
+ * journal — puis passées partout où la valeur s'affiche : colonne libre,
198
+ * détail, carte. Une valeur inconnue garde une pastille neutre plutôt que de
199
+ * disparaître.
200
+ */
201
+ declare function StatusBadge({ value, tones, labels, fallbackTone, empty, ...props }: StatusBadgeProps): react_jsx_runtime.JSX.Element;
202
+
203
+ /**
204
+ * Les douze placements du moteur de géométrie.
205
+ *
206
+ * Ce composant n'en exposait que quatre — haut et bas — parce qu'il calculait
207
+ * lui-même sa position, en vertical seulement. Le calcul vit dans
208
+ * `@sia-ui/headless`, sait basculer et recadrer dans les deux axes, et sert
209
+ * déjà le natif : le refaire ici privait tous les flottants des côtés.
210
+ */
211
+ type OverlayPlacement = Placement;
212
+ interface OverlayProps {
213
+ open: boolean;
214
+ anchorRef: RefObject<HTMLElement | null>;
215
+ onOpenChange: (open: boolean) => void;
216
+ children: ReactNode;
217
+ placement?: OverlayPlacement;
218
+ offset?: number;
219
+ matchAnchorWidth?: boolean;
220
+ viewportPadding?: number;
221
+ className?: string;
222
+ id?: string;
223
+ role?: string;
224
+ }
225
+ /**
226
+ * Ce qui flotte à côté d'un élément.
227
+ *
228
+ * Le socle des menus, des listes déroulantes et des infobulles. Il place le
229
+ * panneau parmi douze positions, le retourne quand le bord de la fenêtre
230
+ * approche, et le ramène dans la vue plutôt que de le laisser déborder.
231
+ *
232
+ * Le calcul vit dans `@sia-ui/headless` : il ne dépend d'aucun rendu, et
233
+ * sert donc aussi à ce qui n'est pas le DOM.
234
+ */
235
+ declare function Overlay({ open, anchorRef, onOpenChange, children, placement, offset, matchAnchorWidth, viewportPadding, className, ...props }: OverlayProps): react.ReactPortal | null;
236
+
237
+ interface MenuItem {
238
+ key: string;
239
+ label: ReactNode;
240
+ icon?: ReactNode;
241
+ /** Un raccourci affiché à droite. Purement indicatif : rien n'est écouté. */
242
+ shortcut?: string;
243
+ disabled?: boolean;
244
+ danger?: boolean;
245
+ /** Affiche une coche. `undefined` : l'entrée n'est pas cochable. */
246
+ checked?: boolean;
247
+ description?: ReactNode;
248
+ onSelect?: () => void;
249
+ }
250
+ interface MenuSeparator {
251
+ key: string;
252
+ type: "separator";
253
+ }
254
+ interface MenuLabel {
255
+ key: string;
256
+ type: "label";
257
+ label: ReactNode;
258
+ }
259
+ /**
260
+ * Un en-tête à contenu libre : le profil d'un menu de compte, un résumé.
261
+ *
262
+ * `label` est un titre de section — petit, en capitales, sur une ligne — et
263
+ * n'a pas vocation à porter un avatar, un nom, une adresse et un rôle.
264
+ * L'en-tête ne se sélectionne pas et le clavier le saute.
265
+ */
266
+ interface MenuHeader {
267
+ key: string;
268
+ type: "header";
269
+ content: ReactNode;
270
+ }
271
+ type MenuEntry = MenuItem | MenuSeparator | MenuLabel | MenuHeader;
272
+ /** Ce qu'on règle de l'`Overlay` d'un menu : tout sauf ce que le menu pilote. */
273
+ type MenuOverlayProps = Partial<Omit<OverlayProps, "open" | "anchorRef" | "onOpenChange" | "children">>;
274
+ interface MenuListProps {
275
+ items: MenuEntry[];
276
+ onSelect: (item: MenuItem) => void;
277
+ onClose: () => void;
278
+ /** Index actif, piloté par le parent pour que le clavier suive. */
279
+ activeIndex: number;
280
+ onActiveIndexChange: (index: number) => void;
281
+ id?: string | undefined;
282
+ className?: string | undefined;
283
+ }
284
+ /**
285
+ * Le panneau seul, sans déclencheur.
286
+ *
287
+ * Extrait parce que `DropdownMenu` et `ContextMenu` n'ont en commun que lui :
288
+ * tout le reste — l'ancrage, le geste d'ouverture — diffère.
289
+ */
290
+ declare function MenuList({ items, onSelect, onClose, activeIndex, onActiveIndexChange, id, className, }: MenuListProps): react_jsx_runtime.JSX.Element;
291
+ interface DropdownMenuProps {
292
+ items: MenuEntry[];
293
+ children: ReactElement<{
294
+ onClick?: () => void;
295
+ "aria-expanded"?: boolean;
296
+ }>;
297
+ onSelect?: (item: MenuItem) => void;
298
+ open?: boolean;
299
+ defaultOpen?: boolean;
300
+ onOpenChange?: (open: boolean) => void;
301
+ placement?: OverlayPlacement;
302
+ matchTriggerWidth?: boolean;
303
+ /** Le positionnement du panneau : décalage, marge au bord de l'écran, id. */
304
+ overlayProps?: MenuOverlayProps;
305
+ className?: string;
306
+ }
307
+ /**
308
+ * Un menu accroché à un bouton.
309
+ *
310
+ * Il repose sur `Overlay` : le repositionnement quand la place manque en bas,
311
+ * la fermeture au clic extérieur et à Échap sont déjà là et ne sont pas
312
+ * réécrites ici.
313
+ */
314
+ declare function DropdownMenu({ items, children, onSelect, open: openProp, defaultOpen, onOpenChange, placement, matchTriggerWidth, overlayProps, className, }: DropdownMenuProps): react_jsx_runtime.JSX.Element;
315
+ interface ContextMenuProps {
316
+ items: MenuEntry[];
317
+ children: ReactNode;
318
+ onSelect?: (item: MenuItem) => void;
319
+ /** Le positionnement du panneau, comme pour `DropdownMenu`. */
320
+ overlayProps?: MenuOverlayProps;
321
+ className?: string;
322
+ }
323
+ /**
324
+ * Le même menu, ouvert au clic droit sur une zone.
325
+ *
326
+ * L'ancre est un point, pas un élément : un repère de taille nulle est posé
327
+ * aux coordonnées du pointeur et confié à `Overlay`, qui ne voit pas la
328
+ * différence. C'est ce qui évite un second moteur de placement.
329
+ */
330
+ declare function ContextMenu({ items, children, onSelect, overlayProps, className, }: ContextMenuProps): react_jsx_runtime.JSX.Element;
331
+
332
+ interface AccountMenuProps {
333
+ /** Le nom de la personne connectée : avatar, en-tête et libellé du bouton. */
334
+ name: string;
335
+ email?: ReactNode;
336
+ /** Le rôle, en pastille sous le nom : « Administrateur ». */
337
+ role?: ReactNode;
338
+ /** La photo. À défaut, les initiales de `name`. */
339
+ avatarSrc?: string;
340
+ /** Les entrées sous l'en-tête : profil, préférences, déconnexion. */
341
+ items: MenuEntry[];
342
+ onSelect?: (item: MenuItem) => void;
343
+ /** Le nom accessible du déclencheur. Par défaut, celui de la locale, `accountMenu.trigger` (« Compte de {name} »). */
344
+ triggerLabel?: string;
345
+ /** L'avatar du déclencheur — taille, forme, variante. */
346
+ avatarProps?: Partial<Omit<AvatarProps, "name">>;
347
+ /** L'avatar de l'en-tête du menu. */
348
+ headerAvatarProps?: Partial<Omit<AvatarProps, "name">>;
349
+ /** La pastille du rôle — ton, variante. */
350
+ roleBadgeProps?: Partial<Omit<BadgeProps, "children">>;
351
+ /** Le menu lui-même, hors entrées et déclencheur qu'il reçoit d'ici. */
352
+ dropdownMenuProps?: Partial<Omit<DropdownMenuProps, "items" | "children" | "onSelect">>;
353
+ className?: string;
354
+ }
355
+ /**
356
+ * Le menu du compte connecté : un avatar qui ouvre un menu à en-tête de profil.
357
+ *
358
+ * Chaque application le recomposait — avatar dans un bouton qui lui
359
+ * ajoutait un cadre, en-tête forcé dans un titre de section en capitales.
360
+ * Ici, le déclencheur est l'avatar seul, rond et sans fond, et l'en-tête une
361
+ * entrée `header` à contenu libre du `DropdownMenu`.
362
+ */
363
+ declare function AccountMenu({ name, email, role, avatarSrc, items, onSelect, triggerLabel, avatarProps, headerAvatarProps, roleBadgeProps, dropdownMenuProps, className, }: AccountMenuProps): react_jsx_runtime.JSX.Element;
364
+
365
+ interface SearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "onChange"> {
366
+ value?: string;
367
+ defaultValue?: string;
368
+ onValueChange?: (value: string) => void;
369
+ /** Appelé à la validation, et après le délai si `searchDelay` est posé. */
370
+ onSearch?: (value: string) => void;
371
+ /**
372
+ * Millisecondes d'inactivité avant de déclencher `onSearch`.
373
+ *
374
+ * `0` — le défaut — ne déclenche qu'à la validation. Au-delà, la recherche
375
+ * part quand la frappe s'arrête : c'est ce que chaque projet réécrivait
376
+ * autour de ce champ.
377
+ */
378
+ searchDelay?: number;
379
+ clearable?: boolean;
380
+ /** Le nom du champ. Par défaut, `search` de la locale. */
381
+ searchLabel?: string;
382
+ /** Le bouton qui vide le champ. Par défaut, `searchInput.clear` de la locale. */
383
+ clearLabel?: string;
384
+ }
385
+ /**
386
+ * Une recherche, avec son délai.
387
+ *
388
+ * `searchDelay` vaut zéro par défaut : la recherche ne part qu'à la
389
+ * validation. C'est le réglage sûr — une requête à chaque frappe se paie en
390
+ * appels serveur, et le défaut ne doit pas engager ce coût sans qu'on l'ait
391
+ * demandé.
392
+ */
393
+ declare const SearchInput: react.ForwardRefExoticComponent<SearchInputProps & react.RefAttributes<HTMLInputElement>>;
394
+
395
+ interface EmptyStateProps {
396
+ icon?: ReactNode;
397
+ title: ReactNode;
398
+ description?: ReactNode;
399
+ action?: ReactNode;
400
+ compact?: boolean;
401
+ className?: string;
402
+ }
403
+ /**
404
+ * Ce qu'on montre quand il n'y a rien.
405
+ *
406
+ * Une liste vide sans explication ressemble à un chargement bloqué. Elle
407
+ * porte donc une action : le vide initial est le meilleur moment pour
408
+ * proposer de créer le premier élément.
409
+ */
410
+ declare function EmptyState({ icon, title, description, action, compact, className }: EmptyStateProps): react_jsx_runtime.JSX.Element;
411
+
412
+ type TooltipVariant = "solid" | "outline";
413
+ interface TooltipProps extends Omit<HTMLAttributes<HTMLSpanElement>, "content"> {
414
+ content?: ReactNode;
415
+ children: ReactNode;
416
+ tone?: ComponentTone;
417
+ /** Seules `sm`, `md` et `lg` sont dessinées — voir `styles.css`. */
418
+ size?: ComponentSize;
419
+ placement?: Placement;
420
+ variant?: TooltipVariant;
421
+ /** Délai avant apparition, en millisecondes. */
422
+ delay?: number;
423
+ disabled?: boolean;
424
+ }
425
+ /** Alias historique, conservé pour les composants venus du registre. */
426
+ type ITooltipProps = TooltipProps;
427
+ type ITooltipVariant = TooltipVariant;
428
+ /**
429
+ * Bulle d'aide positionnée hors du flux.
430
+ *
431
+ * Le contenu passe par un portail plutôt que par un `position: absolute` dans
432
+ * le flux : un tooltip posé dans une `Card` ou une cellule de `DataTable` —
433
+ * toutes deux en `overflow: hidden` — serait sinon rogné.
434
+ */
435
+ declare function Tooltip({ content, children, placement, variant, tone, size, delay, disabled, className, ...props }: TooltipProps): react_jsx_runtime.JSX.Element;
436
+
437
+ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
438
+ variant?: "solid" | "outline" | "ghost";
439
+ /**
440
+ * Le ton sémantique de l'action.
441
+ *
442
+ * `.sia-button--danger` existait dans la feuille de style sans qu'aucune
443
+ * prop ne permette de l'atteindre : une action de suppression ne pouvait pas
444
+ * être rouge sans `className` manuel.
445
+ */
446
+ tone?: ComponentTone;
447
+ size?: "sm" | "md" | "lg";
448
+ radius?: "default" | "none" | "sm" | "lg" | "full";
449
+ loading?: boolean;
450
+ loadingLabel?: string;
451
+ spinnerProps?: Omit<SpinnerProps, "label">;
452
+ tooltip?: Omit<TooltipProps, "children">;
453
+ leftIcon?: ReactNode;
454
+ rightIcon?: ReactNode;
455
+ }
456
+ /**
457
+ * L'action, sous toutes ses formes.
458
+ *
459
+ * Le chargement y est un état et non un remplacement : le bouton garde sa
460
+ * taille et son libellé pendant l'appel. Un bouton qui devient un rond
461
+ * tournant fait bouger la mise en page, et le clic suivant tombe à côté.
462
+ */
463
+ declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
464
+
465
+ interface ErrorStateProps {
466
+ title?: ReactNode;
467
+ description?: ReactNode;
468
+ error?: unknown;
469
+ action?: ReactNode;
470
+ onRetry?: () => void;
471
+ retryLabel?: string;
472
+ compact?: boolean;
473
+ className?: string;
474
+ /**
475
+ * Les props du bouton « Réessayer » — variante, taille, icône. Sans
476
+ * `onClick`, branché sur `onRetry`, ni `children` : le libellé passe par
477
+ * `retryLabel`.
478
+ */
479
+ retryButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children">>;
480
+ }
481
+ /**
482
+ * Un échec, et de quoi en sortir.
483
+ *
484
+ * `error` accepte n'importe quoi : une `Error`, une réponse HTTP, une
485
+ * chaîne. Ce qui arrive d'un appel réseau n'a pas de forme garantie, et
486
+ * exiger un type ferait écrire un `try` autour de chaque affichage
487
+ * d'erreur.
488
+ */
489
+ declare function ErrorState({ title: titleProp, description, error, action, onRetry, retryLabel: retryLabelProp, compact, className, retryButtonProps }: ErrorStateProps): react_jsx_runtime.JSX.Element;
490
+
491
+ interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {
492
+ width?: CSSProperties["width"];
493
+ height?: CSSProperties["height"];
494
+ radius?: CSSProperties["borderRadius"];
495
+ circle?: boolean;
496
+ }
497
+ /**
498
+ * La forme de ce qui n'est pas encore là.
499
+ *
500
+ * Aux dimensions du contenu attendu, et non d'une taille générique : c'est
501
+ * ce qui évite le sursaut de mise en page à l'arrivée des données, lequel
502
+ * fait cliquer à côté.
503
+ */
504
+ declare function Skeleton({ className, width, height, radius, circle, style, ...props }: SkeletonProps): react_jsx_runtime.JSX.Element;
505
+
506
+ type CheckboxValue = string | number;
507
+ interface CheckboxGroupProps {
508
+ value?: CheckboxValue[];
509
+ defaultValue?: CheckboxValue[];
510
+ onValueChange?: (value: CheckboxValue[]) => void;
511
+ disabled?: boolean;
512
+ variant?: "default" | "button";
513
+ orientation?: "horizontal" | "vertical";
514
+ size?: "sm" | "md" | "lg";
515
+ tone?: ComponentTone;
516
+ className?: string;
517
+ children: ReactNode;
518
+ }
519
+ /**
520
+ * Une case, ou un groupe de cases.
521
+ *
522
+ * `CheckboxGroup` gère la liste des valeurs cochées; la case seule gère la
523
+ * sienne. L'état indéterminé est une troisième valeur, pas un entre-deux
524
+ * visuel : il dit « certains enfants sont cochés », ce qu'aucun booléen ne
525
+ * sait exprimer.
526
+ */
527
+ declare function CheckboxGroup({ value, defaultValue, onValueChange, disabled, variant, orientation, size, tone, className, children, }: CheckboxGroupProps): react_jsx_runtime.JSX.Element;
528
+ interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "size"> {
529
+ value?: CheckboxValue;
530
+ label?: ReactNode;
531
+ children?: ReactNode;
532
+ description?: ReactNode;
533
+ indeterminate?: boolean;
534
+ onValueChange?: (checked: boolean) => void;
535
+ size?: "sm" | "md" | "lg";
536
+ tone?: ComponentTone;
537
+ }
538
+ declare const Checkbox: react.ForwardRefExoticComponent<CheckboxProps & react.RefAttributes<HTMLInputElement>>;
539
+
540
+ interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
541
+ label: string;
542
+ icon: ReactNode;
543
+ variant?: "solid" | "outline" | "ghost";
544
+ size?: "sm" | "md" | "lg";
545
+ radius?: "default" | "none" | "sm" | "lg" | "full";
546
+ tooltip?: Omit<TooltipProps, "children">;
547
+ }
548
+ /**
549
+ * Une action réduite à son icône.
550
+ *
551
+ * `label` est obligatoire : une icône seule n'a pas de nom, et un lecteur
552
+ * d'écran annoncerait « bouton » sans dire lequel. Le libellé sert aussi
553
+ * d'infobulle — ce que l'icône signifie doit rester atteignable à la
554
+ * souris comme au clavier.
555
+ */
556
+ declare const IconButton: react.ForwardRefExoticComponent<IconButtonProps & react.RefAttributes<HTMLButtonElement>>;
557
+
558
+ interface ModalProps {
559
+ open: boolean;
560
+ onOpenChange: (open: boolean) => void;
12
561
  title: ReactNode;
13
- content: ReactNode;
14
- /** Une ligne sous le titre, visible même replié. */
15
562
  description?: ReactNode;
16
- icon?: ReactNode;
17
- /** À droite du titre : un compteur, un badge, un statut. */
18
- meta?: ReactNode;
19
- disabled?: boolean;
20
- }
21
- interface AccordionProps {
22
- items: AccordionItem[];
23
- /** `single` referme la section précédente, `multiple` les cumule. */
24
- type?: "single" | "multiple";
25
- value?: string[];
26
- defaultValue?: string[];
27
- onValueChange?: (value: string[]) => void;
28
- /** En `single`, autorise à tout refermer. */
29
- collapsible?: boolean;
30
- variant?: "bordered" | "separated" | "plain";
563
+ children?: ReactNode;
564
+ footer?: ReactNode;
565
+ closeOnBackdrop?: boolean;
566
+ closeLabel?: string;
31
567
  className?: string;
32
568
  }
33
569
  /**
34
- * Des sections dépliables.
570
+ * Une boîte qui interrompt.
35
571
  *
36
- * La hauteur s'anime sans être mesurée : le panneau est une grille dont la
37
- * ligne passe de `0fr` à `1fr`. Pas de `scrollHeight`, pas de recalcul au
38
- * redimensionnement, et un contenu qui change de taille suit tout seul.
572
+ * Elle enferme le focus et bloque le défilement de la page : sans cela, la
573
+ * tabulation continue derrière le voile, et l'on remplit un formulaire
574
+ * qu'on ne voit pas. L'échappement la referme toujours — c'est la sortie
575
+ * que tout le monde essaie en premier.
39
576
  */
40
- declare function Accordion({ items, type, value, defaultValue, onValueChange, collapsible, variant, className, }: AccordionProps): react_jsx_runtime.JSX.Element;
41
- interface CollapseProps {
577
+ declare function Modal({ open, onOpenChange, title, description, children, footer, closeOnBackdrop, closeLabel: closeLabelProp, className }: ModalProps): react.ReactPortal | null;
578
+
579
+ interface ConfirmDialogProps {
580
+ open: boolean;
581
+ onOpenChange: (open: boolean) => void;
42
582
  title: ReactNode;
43
- children: ReactNode;
44
583
  description?: ReactNode;
45
- meta?: ReactNode;
46
- icon?: ReactNode;
47
- open?: boolean;
48
- defaultOpen?: boolean;
49
- onOpenChange?: (open: boolean) => void;
50
- variant?: AccordionProps["variant"];
51
- disabled?: boolean;
52
- className?: string;
584
+ confirmLabel?: string;
585
+ cancelLabel?: string;
586
+ tone?: Extract<ComponentTone, "primary" | "danger">;
587
+ loading?: boolean;
588
+ onConfirm: () => void | Promise<void>;
589
+ /**
590
+ * Les props de la `Modal`. Sans `open`, `onOpenChange`, `children` ni
591
+ * `footer`, que la boîte de confirmation tient elle-même. Pendant
592
+ * `loading`, un clic sur le voile ne ferme jamais, quel que soit
593
+ * `closeOnBackdrop` : ce serait abandonner un appel encore en vol.
594
+ */
595
+ modalProps?: Partial<Omit<ModalProps, "open" | "onOpenChange" | "children" | "footer">>;
596
+ /**
597
+ * Les props du bouton de confirmation. Sans `onClick` ni `loading`,
598
+ * branchés sur `onConfirm` et `loading` ; le libellé passe par
599
+ * `confirmLabel`.
600
+ */
601
+ confirmButtonProps?: Partial<Omit<ButtonProps, "onClick" | "loading" | "children">>;
602
+ /**
603
+ * Les props du bouton d'annulation. Sans `onClick`, qui referme la boîte ;
604
+ * `disabled` s'ajoute à `loading` au lieu de le remplacer.
605
+ */
606
+ cancelButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children">>;
53
607
  }
54
- /** Une section seule. Le même rendu, pour le cas le plus courant. */
55
- declare function Collapse({ title, children, description, meta, icon, open, defaultOpen, onOpenChange, variant, disabled, className, }: CollapseProps): react_jsx_runtime.JSX.Element;
608
+ /**
609
+ * La question qu'on pose avant de détruire.
610
+ *
611
+ * `onConfirm` peut rendre une promesse : le bouton reste occupé tant qu'elle
612
+ * n'a pas abouti. Sans cela, la boîte se referme sur un appel encore en
613
+ * vol, et l'on ignore si la suppression a eu lieu.
614
+ */
615
+ declare function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel: confirmLabelProp, cancelLabel: cancelLabelProp, tone, loading, onConfirm, modalProps, confirmButtonProps, cancelButtonProps }: ConfirmDialogProps): react_jsx_runtime.JSX.Element;
56
616
 
57
617
  /** Liste dense, ou grille de cartes. */
58
618
  type DataTableView = "table" | "cards";
@@ -145,6 +705,13 @@ interface DataTableProps<T> {
145
705
  * lettre ; Entrée et l'effacement déclenchent sans attendre.
146
706
  */
147
707
  searchDelay?: number;
708
+ /**
709
+ * Le champ de recherche : placeholder, libellés, `clearable`, classe.
710
+ *
711
+ * La valeur et les rappels restent au tableau — c'est lui qui filtre et
712
+ * qui temporise ; les déléguer ici ferait deux recherches concurrentes.
713
+ */
714
+ searchInputProps?: Partial<Omit<SearchInputProps, "value" | "defaultValue" | "onValueChange" | "onSearch" | "searchDelay">>;
148
715
  layout?: "auto" | "fixed";
149
716
  /** Hauteur du corps. Sans elle, `stickyHeader` n'a rien où se coller. */
150
717
  maxHeight?: string;
@@ -159,6 +726,32 @@ interface DataTableProps<T> {
159
726
  actionsHeader?: ReactNode;
160
727
  /** `icon` garde la colonne étroite sur un tableau déjà large. */
161
728
  actionsDisplay?: "icon" | "label";
729
+ /**
730
+ * Les boutons d'action à libellé : variante, taille, classe.
731
+ *
732
+ * Le clic, le libellé et l'état désactivé viennent de chaque `RowAction`.
733
+ */
734
+ rowActionButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children" | "disabled">>;
735
+ /**
736
+ * Les boutons d'action réduits à l'icône, déclencheur du menu « autres
737
+ * actions » compris. Une `tooltip` passée ici se fusionne avec celle de
738
+ * l'action, qui garde son libellé.
739
+ */
740
+ rowActionIconButtonProps?: Partial<Omit<IconButtonProps, "onClick" | "label" | "icon" | "disabled">>;
741
+ /**
742
+ * Le menu des actions qui ne tiennent pas en ligne : placement, décalage.
743
+ *
744
+ * Ni `open` ni `defaultOpen` : partagés par toutes les lignes, ils
745
+ * ouvriraient tous les menus à la fois.
746
+ */
747
+ rowActionsMenuProps?: Partial<Omit<DropdownMenuProps, "items" | "children" | "onSelect" | "open" | "defaultOpen">>;
748
+ /**
749
+ * La confirmation d'une action : libellés par défaut, `loading`.
750
+ *
751
+ * Ce que déclare `confirm` sur l'action l'emporte ; le ton suit
752
+ * `confirm.destructive`, l'ouverture et la validation restent au tableau.
753
+ */
754
+ confirmDialogProps?: Partial<Omit<ConfirmDialogProps, "open" | "onOpenChange" | "onConfirm" | "title" | "tone">>;
162
755
  /** Évalue les règles de permission des actions. */
163
756
  can?: (rule: PermissionRule) => boolean;
164
757
  view?: DataTableView;
@@ -176,13 +769,28 @@ interface DataTableProps<T> {
176
769
  loading?: boolean;
177
770
  /** Lignes fantômes pendant le premier chargement. */
178
771
  skeletonRows?: number;
772
+ /** Les blocs fantômes : rayon, classe, style. Leurs tailles ne sont que des défauts. */
773
+ skeletonProps?: Partial<SkeletonProps>;
179
774
  error?: ReactNode;
180
775
  onRetry?: () => void;
776
+ /**
777
+ * L'état d'erreur : titre, libellé du bouton, action, `compact`.
778
+ *
779
+ * Le message vient de `error` ; `onRetry` du tableau l'emporte s'il est
780
+ * fourni.
781
+ */
782
+ errorStateProps?: Partial<Omit<ErrorStateProps, "description" | "error">>;
181
783
  empty?: {
182
784
  title?: ReactNode;
183
785
  description?: ReactNode;
184
786
  action?: ReactNode;
787
+ icon?: ReactNode;
185
788
  };
789
+ /**
790
+ * L'état vide au complet : icône, `compact`, classe. Ce que déclare `empty`
791
+ * l'emporte sur les mêmes clés.
792
+ */
793
+ emptyStateProps?: Partial<EmptyStateProps>;
186
794
  /**
187
795
  * Ajoute une colonne de cases à cocher.
188
796
  *
@@ -195,6 +803,13 @@ interface DataTableProps<T> {
195
803
  defaultSelectedKeys?: Key[];
196
804
  onSelectionChange?: (keys: Key[], rows: T[]) => void;
197
805
  isRowSelectable?: (row: T, index: number) => boolean;
806
+ /**
807
+ * Les cases de sélection, en-tête comprise : taille, ton, classe.
808
+ *
809
+ * L'état coché, l'indétermination et le rappel sont calculés par le
810
+ * tableau ; le clic reste retenu pour ne pas déclencher `onRowClick`.
811
+ */
812
+ checkboxProps?: Partial<Omit<CheckboxProps, "checked" | "defaultChecked" | "indeterminate" | "onValueChange" | "onChange" | "onClick" | "disabled" | "value">>;
198
813
  /** Barre affichée dès qu'une ligne est cochée. */
199
814
  selectionActions?: (context: {
200
815
  keys: Key[];
@@ -212,39 +827,53 @@ interface DataTableProps<T> {
212
827
  className?: string;
213
828
  }
214
829
 
830
+ interface FiltersBarProps {
831
+ search?: ReactNode;
832
+ filters?: ReactNode;
833
+ actions?: ReactNode;
834
+ activeCount?: number;
835
+ onReset?: () => void;
836
+ resetLabel?: string;
837
+ /**
838
+ * La largeur de chaque filtre — `12rem` par défaut. Les filtres se placent
839
+ * côte à côte à cette largeur, et passent à la ligne quand elle manque.
840
+ */
841
+ filterWidth?: string;
842
+ className?: string;
843
+ }
215
844
  /**
216
- * Les douze placements du moteur de géométrie.
845
+ * La barre au-dessus d'une liste : recherche, filtres, actions.
217
846
  *
218
- * Ce composant n'en exposait que quatre — haut et bas — parce qu'il calculait
219
- * lui-même sa position, en vertical seulement. Le calcul vit dans
220
- * `@sia-ui/headless`, sait basculer et recadrer dans les deux axes, et sert
221
- * déjà le natif : le refaire ici privait tous les flottants des côtés.
847
+ * `activeCount` affiche combien de filtres sont en vigueur. Sans ce compte,
848
+ * une liste filtrée ressemble à une liste vide, et l'on cherche la panne
849
+ * avant de penser au filtre posé la veille.
222
850
  */
223
- type OverlayPlacement = Placement;
224
- interface OverlayProps {
225
- open: boolean;
226
- anchorRef: RefObject<HTMLElement | null>;
227
- onOpenChange: (open: boolean) => void;
228
- children: ReactNode;
229
- placement?: OverlayPlacement;
230
- offset?: number;
231
- matchAnchorWidth?: boolean;
232
- viewportPadding?: number;
851
+ declare function FiltersBar({ search, filters, actions, activeCount, onReset, resetLabel: resetLabelProp, filterWidth, className }: FiltersBarProps): react_jsx_runtime.JSX.Element;
852
+
853
+ interface PageHeaderProps {
854
+ title: ReactNode;
855
+ description?: ReactNode;
856
+ eyebrow?: ReactNode;
857
+ actions?: ReactNode;
858
+ /**
859
+ * Le niveau du titre. `1` — le défaut — pour l'en-tête d'un écran.
860
+ *
861
+ * `2` ou `3` pour une section dans un écran qui a déjà son `<h1>` : la
862
+ * liste des environnements dans la fiche d'un projet. Le titre y est plus
863
+ * petit et l'espace sous l'en-tête plus court.
864
+ */
865
+ level?: 1 | 2 | 3;
233
866
  className?: string;
234
- id?: string;
235
- role?: string;
236
867
  }
237
868
  /**
238
- * Ce qui flotte à côté d'un élément.
239
- *
240
- * Le socle des menus, des listes déroulantes et des infobulles. Il place le
241
- * panneau parmi douze positions, le retourne quand le bord de la fenêtre
242
- * approche, et le ramène dans la vue plutôt que de le laisser déborder.
869
+ * Le titre d'un écran, et ses actions.
243
870
  *
244
- * Le calcul vit dans `@sia-ui/headless` : il ne dépend d'aucun rendu, et
245
- * sert donc aussi à ce qui n'est pas le DOM.
871
+ * Un seul `<h1>` par page, rendu ici : la hiérarchie des titres est ce qui
872
+ * permet de parcourir un écran au lecteur d'écran, et deux `<h1>` la
873
+ * cassent sans que rien ne se voie. Une section imbriquée passe donc
874
+ * `level={2}`.
246
875
  */
247
- declare function Overlay({ open, anchorRef, onOpenChange, children, placement, offset, matchAnchorWidth, viewportPadding, className, ...props }: OverlayProps): react.ReactPortal | null;
876
+ declare function PageHeader({ title, description, eyebrow, actions, level, className, }: PageHeaderProps): react_jsx_runtime.JSX.Element;
248
877
 
249
878
  interface SelectOption {
250
879
  value: string;
@@ -262,13 +891,18 @@ interface SelectProps {
262
891
  value?: string;
263
892
  defaultValue?: string;
264
893
  onValueChange?: (value: string, option?: SelectOption) => void;
894
+ /** Le texte du champ vide. Par défaut, `select` de la locale. */
265
895
  placeholder?: string;
266
896
  searchable?: boolean;
897
+ /** Le texte indicatif de la recherche. Par défaut, `searchPlaceholder` de la locale. */
267
898
  searchPlaceholder?: string;
268
899
  fetcher?: (query: string, signal?: AbortSignal) => Promise<SelectOption[]>;
269
900
  debounce?: number;
901
+ /** Pendant le chargement distant. Par défaut, `selectField.loadingOptions` de la locale. */
270
902
  loadingText?: ReactNode;
903
+ /** Quand rien ne correspond. Par défaut, `noResults` de la locale. */
271
904
  emptyText?: ReactNode;
905
+ /** Quand le chargement échoue. Par défaut, `selectField.loadError` de la locale. */
272
906
  errorText?: ReactNode;
273
907
  clearable?: boolean;
274
908
  disabled?: boolean;
@@ -276,37 +910,110 @@ interface SelectProps {
276
910
  required?: boolean;
277
911
  placement?: OverlayPlacement;
278
912
  /**
279
- * Ce que montre le déclencheur. Par défaut, le libellé de l'option.
280
- *
281
- * La liste garde ses libellés complets — « 🇨🇲 Cameroun (+237) » — pendant
282
- * que le champ fermé n'affiche que ce qui tient : « 🇨🇲 +237 ».
913
+ * Réglages du panneau de la liste — décalage, marge au bord, classe.
914
+ * `matchAnchorWidth: false` le laisse prendre la largeur de ses options.
915
+ */
916
+ overlayProps?: Partial<Omit<OverlayProps, "open" | "anchorRef" | "onOpenChange" | "children">>;
917
+ /** Réglages de l'indicateur de chargement des options distantes. */
918
+ spinnerProps?: Partial<SpinnerProps>;
919
+ /**
920
+ * Ce que montre le déclencheur. Par défaut, le libellé de l'option.
921
+ *
922
+ * La liste garde ses libellés complets — « 🇨🇲 Cameroun (+237) » — pendant
923
+ * que le champ fermé n'affiche que ce qui tient : « 🇨🇲 +237 ».
924
+ */
925
+ renderValue?: (option: SelectOption | undefined) => ReactNode;
926
+ /**
927
+ * `embedded` retire bordure, fond et largeur pleine du déclencheur : le
928
+ * `Select` se loge alors dans un autre contrôle — l'indicatif d'un
929
+ * `PhoneInput`, la taille de page d'une `Pagination`.
930
+ */
931
+ variant?: "default" | "embedded";
932
+ className?: string;
933
+ "aria-label"?: string;
934
+ "aria-describedby"?: string;
935
+ "aria-labelledby"?: string;
936
+ "aria-invalid"?: boolean;
937
+ "aria-required"?: boolean;
938
+ }
939
+ /**
940
+ * Un choix parmi une liste.
941
+ *
942
+ * Le champ n'est pas un `<select>` natif : celui-ci ne sait ni chercher, ni
943
+ * afficher une description sous chaque option, ni charger ses choix à la
944
+ * demande. Le comportement clavier du natif, lui, est reproduit — flèches,
945
+ * première lettre, échappement.
946
+ *
947
+ * `fetcher` sert les listes qu'on ne peut pas descendre en entier : la
948
+ * requête part après la frappe et s'annule si l'on continue à taper.
949
+ */
950
+ declare const Select: react.ForwardRefExoticComponent<SelectProps & react.RefAttributes<HTMLButtonElement>>;
951
+
952
+ interface PaginationProps {
953
+ page: number;
954
+ totalPages: number;
955
+ onPageChange: (page: number) => void;
956
+ siblingCount?: number;
957
+ previousLabel?: string;
958
+ nextLabel?: string;
959
+ /**
960
+ * Ajoute un champ pour sauter directement à une page.
961
+ *
962
+ * Sur quarante pages, atteindre la vingt-septième demande sinon de cliquer
963
+ * dans les ellipses jusqu'à ce qu'elle apparaisse.
964
+ */
965
+ jumpTo?: boolean;
966
+ /** Affiche « Page 3 sur 40 » à côté des numéros. */
967
+ showTotal?: boolean;
968
+ /** Masque les libellés et ne garde que les flèches. */
969
+ compact?: boolean;
970
+ /** Le nombre de lignes par page en vigueur. */
971
+ pageSize?: number;
972
+ /**
973
+ * Fourni avec `pageSize`, ajoute le choix du nombre de lignes par page.
974
+ *
975
+ * Seul le nouveau nombre est remonté : revenir en page 1 est l'affaire de
976
+ * qui tient l'état — `setPerPage` de `useTableQuery` le fait déjà.
977
+ */
978
+ onPageSizeChange?: (pageSize: number) => void;
979
+ /**
980
+ * Les tailles proposées. Par défaut `10, 20, 50, 100`. Une taille en
981
+ * vigueur absente de la liste y est ajoutée, pour que le champ ne paraisse
982
+ * jamais vide.
283
983
  */
284
- renderValue?: (option: SelectOption | undefined) => ReactNode;
984
+ pageSizeOptions?: number[];
985
+ /** Le libellé du choix. Par défaut `locale.perPage` — « Par page ». */
986
+ pageSizeLabel?: string;
285
987
  /**
286
- * `embedded` retire bordure, fond et largeur pleine du déclencheur : le
287
- * `Select` se loge alors dans un autre contrôle — l'indicatif d'un
288
- * `PhoneInput`, la taille de page d'une `Pagination`.
988
+ * Remplace entièrement le contrôle — des boutons segmentés, un champ libre.
989
+ * Le choix des tailles et leur tri sont déjà faits.
289
990
  */
290
- variant?: "default" | "embedded";
991
+ renderPageSize?: (context: PageSizeContext) => ReactNode;
992
+ /**
993
+ * Le `Select` de taille de page : placement, variante, classe.
994
+ *
995
+ * La valeur, les options et le rappel restent calculés ici — on les règle
996
+ * par `pageSize`, `pageSizeOptions` et `onPageSizeChange`.
997
+ */
998
+ pageSizeSelectProps?: Partial<Omit<SelectProps, "value" | "defaultValue" | "options" | "children" | "onValueChange">>;
999
+ ariaLabel?: string;
291
1000
  className?: string;
292
- "aria-label"?: string;
293
- "aria-describedby"?: string;
294
- "aria-labelledby"?: string;
295
- "aria-invalid"?: boolean;
296
- "aria-required"?: boolean;
297
1001
  }
1002
+ /** Ce que reçoit `renderPageSize`. */
1003
+ interface PageSizeContext {
1004
+ pageSize: number;
1005
+ options: number[];
1006
+ onChange: (pageSize: number) => void;
1007
+ label: string;
1008
+ }
1009
+ declare const DEFAULT_PAGE_SIZE_OPTIONS: number[];
298
1010
  /**
299
- * Un choix parmi une liste.
300
- *
301
- * Le champ n'est pas un `<select>` natif : celui-ci ne sait ni chercher, ni
302
- * afficher une description sous chaque option, ni charger ses choix à la
303
- * demande. Le comportement clavier du natif, lui, est reproduit — flèches,
304
- * première lettre, échappement.
1011
+ * La navigation entre les pages.
305
1012
  *
306
- * `fetcher` sert les listes qu'on ne peut pas descendre en entier : la
307
- * requête part après la frappe et s'annule si l'on continue à taper.
1013
+ * Le calcul des numéros et des ellipses vient de `@sia-ui/headless` :
1014
+ * `usePagination` et ce composant appliquent la même règle, écrite une fois.
308
1015
  */
309
- declare const Select: react.ForwardRefExoticComponent<SelectProps & react.RefAttributes<HTMLButtonElement>>;
1016
+ declare function Pagination({ page, totalPages, onPageChange, siblingCount, previousLabel: previousLabelProp, nextLabel: nextLabelProp, jumpTo, showTotal, compact, pageSize, onPageSizeChange, pageSizeOptions, pageSizeLabel, renderPageSize, pageSizeSelectProps, ariaLabel, className, }: PaginationProps): react_jsx_runtime.JSX.Element | null;
310
1017
 
311
1018
  /** Une entrée de journal, dans sa forme la plus courante. */
312
1019
  interface ActivityEntry {
@@ -362,11 +1069,52 @@ interface ActivityLogProps<T = ActivityEntry> {
362
1069
  onRetry?: () => void;
363
1070
  empty?: DataTableProps<T>["empty"];
364
1071
  className?: string;
1072
+ /** Les props du `PageHeader`, rendu quand `title` est fourni. */
1073
+ pageHeaderProps?: Partial<PageHeaderProps>;
1074
+ /**
1075
+ * Les props de la `FiltersBar` — des actions, un autre libellé de
1076
+ * réinitialisation. Sans `search`, `filters`, `activeCount` ni `onReset`,
1077
+ * que le journal compose à partir de la requête.
1078
+ */
1079
+ filtersBarProps?: Partial<Omit<FiltersBarProps, "search" | "filters" | "activeCount" | "onReset">>;
1080
+ /**
1081
+ * Les props du champ de recherche. Sans `value`, `defaultValue`,
1082
+ * `onValueChange` ni `onSearch` : la recherche en vigueur vit dans la
1083
+ * requête.
1084
+ */
1085
+ searchInputProps?: Partial<Omit<SearchInputProps, "value" | "defaultValue" | "onValueChange" | "onSearch">>;
1086
+ /**
1087
+ * Les props communes aux `Select` des filtres. Sans `value`,
1088
+ * `onValueChange` ni `options`, propres à chaque filtre et branchés sur la
1089
+ * requête.
1090
+ */
1091
+ filterSelectProps?: Partial<Omit<SelectProps, "value" | "onValueChange" | "options">>;
1092
+ /**
1093
+ * Les props du `StatusBadge` de la colonne « Action » par défaut. Sans
1094
+ * `value`, lue sur l'entrée. Sans effet quand `columns` est fourni.
1095
+ */
1096
+ actionBadgeProps?: Partial<Omit<StatusBadgeProps, "value">>;
1097
+ /**
1098
+ * Les props du `DataTable` — densité, mode cartes, sélection. Sans
1099
+ * `columns` ni `data`, qui ont leurs props ici.
1100
+ */
1101
+ tableProps?: Partial<Omit<DataTableProps<T>, "columns" | "data">>;
1102
+ /**
1103
+ * Les props de la `Pagination` — `jumpTo`, `pageSizeOptions`. Sans la page
1104
+ * et la taille de page ni leurs changements, branchés sur la requête.
1105
+ */
1106
+ paginationProps?: Partial<Omit<PaginationProps, "page" | "totalPages" | "onPageChange" | "pageSize" | "onPageSizeChange">>;
365
1107
  }
366
1108
  /** Les colonnes d'une `ActivityEntry` : quand, qui, quoi, sur quoi. */
367
1109
  declare function activityColumns(options?: {
368
1110
  actionTones?: Record<string, ComponentTone> | undefined;
369
1111
  actionLabels?: Record<string, ReactNode> | undefined;
1112
+ /** Les props du `StatusBadge` de la colonne « Action », sans `value`. */
1113
+ actionBadgeProps?: Partial<Omit<StatusBadgeProps, "value">> | undefined;
1114
+ /** Les en-têtes : le groupe `activityLog` de la locale. Français par défaut. */
1115
+ messages?: ActivityLogMessages | undefined;
1116
+ /** La langue des dates. Par défaut, `fr-FR`. */
1117
+ language?: string | undefined;
370
1118
  }): Array<DataTableColumn<ActivityEntry>>;
371
1119
  /**
372
1120
  * Un journal d'activité, filtrable et paginé par le serveur.
@@ -376,7 +1124,7 @@ declare function activityColumns(options?: {
376
1124
  * Filtres déclarés, recherche temporisée, pagination et taille de page : tout
377
1125
  * passe par la requête, rien n'est filtré dans le navigateur.
378
1126
  */
379
- declare function ActivityLog<T = ActivityEntry>({ entries, query, totalPages, filters, searchPlaceholder, columns, getRowKey, actionTones, actionLabels, title, description, headingLevel, loading, error, onRetry, empty, className, }: ActivityLogProps<T>): react_jsx_runtime.JSX.Element;
1127
+ declare function ActivityLog<T = ActivityEntry>({ entries, query, totalPages, filters, searchPlaceholder, columns, getRowKey, actionTones, actionLabels, title, description, headingLevel, loading, error, onRetry, empty, className, pageHeaderProps, filtersBarProps, searchInputProps, filterSelectProps, actionBadgeProps, tableProps, paginationProps, }: ActivityLogProps<T>): react_jsx_runtime.JSX.Element;
380
1128
 
381
1129
  interface AlertProps {
382
1130
  tone?: ComponentTone;
@@ -398,7 +1146,7 @@ declare function Alert({ tone, title, children, action, dismissLabel: dismissLab
398
1146
 
399
1147
  interface AmountDisplayProps {
400
1148
  value: number;
401
- currency?: string;
1149
+ currency?: string; /** La langue du format. Par défaut, celle de la locale SIA. */
402
1150
  locale?: string;
403
1151
  label?: ReactNode;
404
1152
  secondary?: ReactNode;
@@ -414,7 +1162,57 @@ interface AmountDisplayProps {
414
1162
  * rouge seul. La couleur peut manquer — un daltonien, une impression en
415
1163
  * noir et blanc — le signe, lui, reste.
416
1164
  */
417
- declare function AmountDisplay({ value, currency, locale, label, secondary, sign, tone, className }: AmountDisplayProps): react_jsx_runtime.JSX.Element;
1165
+ declare function AmountDisplay({ value, currency, locale: localeProp, label, secondary, sign, tone, className }: AmountDisplayProps): react_jsx_runtime.JSX.Element;
1166
+
1167
+ /** Ce que la réf impérative expose — ouvrir un tiroir depuis l'extérieur. */
1168
+ type DrawerRef = {
1169
+ open: () => void;
1170
+ close: () => void;
1171
+ toggle: () => void;
1172
+ isOpen: () => boolean;
1173
+ };
1174
+ type DrawerPosition = "left" | "right" | "top" | "bottom";
1175
+ type DrawerSize = "sm" | "md" | "lg" | "xl";
1176
+ interface DrawerProps extends React.HTMLAttributes<HTMLDivElement> {
1177
+ open?: boolean;
1178
+ defaultOpen?: boolean;
1179
+ onOpenChange?: (open: boolean) => void;
1180
+ position?: DrawerPosition;
1181
+ size?: DrawerSize;
1182
+ closeOnOutsideClick?: boolean;
1183
+ closeOnEsc?: boolean;
1184
+ }
1185
+ /** Alias historique, attendu par les composants venus du registre. */
1186
+ type IDrawerProps = DrawerProps;
1187
+ type DrawerComponent = ForwardRefExoticComponent<IDrawerProps & RefAttributes<DrawerRef>> & {
1188
+ Header: typeof DrawerHeader;
1189
+ Body: typeof DrawerBody;
1190
+ Footer: typeof DrawerFooter;
1191
+ Title: typeof DrawerTitle;
1192
+ Close: typeof DrawerClose;
1193
+ };
1194
+ /**
1195
+ * Un panneau qui entre par un bord.
1196
+ *
1197
+ * Il sert là où une boîte modale serait trop : un filtre qu'on ajuste en
1198
+ * regardant la liste derrière, un formulaire qu'on remplit sans perdre sa
1199
+ * place. Le focus y est enfermé tant qu'il est ouvert, comme dans un
1200
+ * modal — sans quoi la tabulation continue dans la page cachée.
1201
+ */
1202
+ declare const Drawer: DrawerComponent;
1203
+ declare function DrawerHeader({ children }: {
1204
+ children: React.ReactNode;
1205
+ }): react_jsx_runtime.JSX.Element;
1206
+ declare function DrawerTitle({ children }: {
1207
+ children: React.ReactNode;
1208
+ }): react_jsx_runtime.JSX.Element;
1209
+ declare function DrawerBody({ children }: {
1210
+ children: React.ReactNode;
1211
+ }): react_jsx_runtime.JSX.Element;
1212
+ declare function DrawerFooter({ children }: {
1213
+ children: React.ReactNode;
1214
+ }): react_jsx_runtime.JSX.Element;
1215
+ declare function DrawerClose(): react_jsx_runtime.JSX.Element | null;
418
1216
 
419
1217
  interface SidebarItem {
420
1218
  key: string;
@@ -490,6 +1288,14 @@ interface SidebarProps {
490
1288
  collapsed?: boolean;
491
1289
  /** De quel côté sortent les volets du rail. */
492
1290
  side?: "left" | "right";
1291
+ /**
1292
+ * Réglages des volets du rail — placement, décalage, classe.
1293
+ *
1294
+ * L'objet descend jusqu'aux nœuds mémoïsés : le passer stable (constante,
1295
+ * `useMemo`) plutôt qu'en littéral, sans quoi l'arbre se redessine à
1296
+ * chaque rendu du parent.
1297
+ */
1298
+ overlayProps?: Partial<Omit<OverlayProps, "open" | "anchorRef" | "onOpenChange" | "children">>;
493
1299
  variant?: "default" | "filled" | "floating";
494
1300
  size?: "sm" | "md" | "lg";
495
1301
  tone?: ComponentTone;
@@ -520,7 +1326,7 @@ interface SidebarProps {
520
1326
  * profond que l'arborescence du produit, elle se réduit sans enfermer ses
521
1327
  * sous-menus, et elle ne montre que ce que la session a le droit de voir.
522
1328
  */
523
- declare function Sidebar({ items, activeKey, collapsed, side, variant, size, tone, can, openKeys, defaultOpenKeys, onOpenKeysChange, accordion, renderLink, header, footer, onNavigate, ariaLabel, className, }: SidebarProps): react_jsx_runtime.JSX.Element;
1329
+ declare function Sidebar({ items, activeKey, collapsed, side, overlayProps, variant, size, tone, can, openKeys, defaultOpenKeys, onOpenKeysChange, accordion, renderLink, header, footer, onNavigate, ariaLabel, className, }: SidebarProps): react_jsx_runtime.JSX.Element;
524
1330
 
525
1331
  interface BottomTabsProps {
526
1332
  /** Attendu déjà filtré : la coquille a fait le tri une seule fois. */
@@ -539,6 +1345,7 @@ interface BottomTabsProps {
539
1345
  /** Le bouton qui ouvre l'arborescence complète. */
540
1346
  more?: ReactNode;
541
1347
  onMore?: () => void;
1348
+ /** Le libellé de « Plus ». Par défaut, celui de la locale. */
542
1349
  moreLabel?: string;
543
1350
  className?: string;
544
1351
  }
@@ -692,6 +1499,18 @@ interface AppShellProps {
692
1499
  mobileNav?: AppShellMobileNav;
693
1500
  /** Sous cette largeur, la barre latérale cède la place. */
694
1501
  mobileBreakpoint?: number;
1502
+ /**
1503
+ * Réglages de la barre latérale — taille, ton, accordéon, branches
1504
+ * ouvertes, volets du rail.
1505
+ *
1506
+ * Ce que la coquille décide seule en est retiré : les entrées filtrées,
1507
+ * l'entrée active, l'état réduit, les liens, l'en-tête et le pied, le côté
1508
+ * et la variante — tous déjà réglables ici, et qui doivent rester
1509
+ * d'accord avec la mise en page de la coquille.
1510
+ */
1511
+ sidebarProps?: Partial<Omit<SidebarProps, "items" | "can" | "activeKey" | "collapsed" | "side" | "variant" | "renderLink" | "onNavigate" | "header" | "footer" | "ariaLabel">>;
1512
+ /** Réglages du tiroir mobile — taille, fermeture au clic extérieur, classe. */
1513
+ drawerProps?: Partial<Omit<DrawerProps, "open" | "defaultOpen" | "onOpenChange" | "children">>;
695
1514
  ariaLabel?: string;
696
1515
  className?: string;
697
1516
  }
@@ -703,7 +1522,7 @@ interface AppShellProps {
703
1522
  * l'assemblage — trois états de barre, une bascule mobile, et une seule
704
1523
  * source de vérité pour ce qui est visible et pour ce qui est actif.
705
1524
  */
706
- declare function AppShell({ nav, children, activeKey, currentPath, renderLink, onNavigate, can, brand, sidebarFooter, header, page, footer, contentWidth, side, variant, stickyHeader, sidebarState, defaultSidebarState, onSidebarStateChange, collapsible, sidebarWidth, sidebarCollapsedWidth, mobileNav, mobileBreakpoint, ariaLabel, className, }: AppShellProps): react_jsx_runtime.JSX.Element;
1525
+ declare function AppShell({ nav, children, activeKey, currentPath, renderLink, onNavigate, can, brand, sidebarFooter, header, page, footer, contentWidth, side, variant, stickyHeader, sidebarState, defaultSidebarState, onSidebarStateChange, collapsible, sidebarWidth, sidebarCollapsedWidth, mobileNav, mobileBreakpoint, sidebarProps, drawerProps, ariaLabel, className, }: AppShellProps): react_jsx_runtime.JSX.Element;
707
1526
 
708
1527
  interface AspectRatioProps {
709
1528
  /** Le rapport largeur / hauteur. `16 / 9`, `1`, `4 / 3`. */
@@ -729,226 +1548,136 @@ interface AsyncStateProps {
729
1548
  emptyDescription?: ReactNode;
730
1549
  onRetry?: () => void;
731
1550
  children: ReactNode;
1551
+ /**
1552
+ * Les props de l'`Alert` d'erreur — un autre titre, un autre ton. Sans
1553
+ * `children` : le message est `error`.
1554
+ */
1555
+ alertProps?: Partial<Omit<AlertProps, "children">>;
1556
+ /**
1557
+ * Les props du bouton « Réessayer ». Sans `onClick`, branché sur
1558
+ * `onRetry` : un bouton de reprise qui ne reprend rien serait pire que
1559
+ * pas de bouton.
1560
+ */
1561
+ retryButtonProps?: Partial<Omit<ButtonProps, "onClick">>;
1562
+ /** Les props de l'`EmptyState` — une icône, une action, la taille. */
1563
+ emptyStateProps?: Partial<EmptyStateProps>;
1564
+ /** Le témoin de chargement. Son libellé vient de la locale. */
1565
+ spinnerProps?: Partial<Omit<SpinnerProps, "label">>;
732
1566
  }
733
1567
  /**
734
1568
  * Les trois états d'un chargement, au même endroit.
735
1569
  *
736
1570
  * En attente, en erreur, ou vide : ce sont les mêmes trois cas à chaque
737
1571
  * écran, et les écrire à la main en oublie toujours un — le plus souvent le
738
- * vide, qui ressemble à un chargement qui n'en finit pas.
739
- */
740
- declare function AsyncState({ loading, error, empty, emptyTitle, emptyDescription, onRetry, children }: AsyncStateProps): react_jsx_runtime.JSX.Element;
741
-
742
- interface AuditEvent {
743
- label: ReactNode;
744
- at: Date | string | number;
745
- by?: ReactNode;
746
- detail?: ReactNode;
747
- }
748
- interface AuditMetaProps {
749
- events: AuditEvent[];
750
- locale?: string;
751
- title?: ReactNode;
752
- emptyLabel?: ReactNode;
753
- className?: string;
754
- }
755
- /**
756
- * Qui a fait quoi, et quand.
757
- *
758
- * Une liste d'événements plutôt qu'un dernier état : savoir qu'une facture
759
- * a été validée n'apprend rien si l'on ignore qu'elle avait été rejetée la
760
- * veille. Les dates sont relatives — « il y a deux jours » se compare sans
761
- * calcul mental.
762
- */
763
- declare function AuditMeta({ events, locale, title, emptyLabel, className }: AuditMetaProps): react_jsx_runtime.JSX.Element;
764
-
765
- interface AuthLayoutProps {
766
- title: ReactNode;
767
- description?: ReactNode;
768
- logo?: ReactNode;
769
- aside?: ReactNode;
770
- children: ReactNode;
771
- footer?: ReactNode;
772
- className?: string;
773
- }
774
- /**
775
- * La page qui précède l'application : connexion, inscription, mot de passe
776
- * oublié.
777
- *
778
- * Elle n'a ni navigation ni coquille, et c'est délibéré : tout ce qui mène
779
- * ailleurs est hors de portée de quelqu'un qui n'est pas encore entré.
780
- */
781
- declare function AuthLayout({ title, description, logo, aside, children, footer, className, }: AuthLayoutProps): react_jsx_runtime.JSX.Element;
782
-
783
- interface AutocompleteProps {
784
- id?: string;
785
- options: SelectOption[];
786
- value?: string;
787
- defaultValue?: string;
788
- onValueChange?: (value: string, option?: SelectOption) => void;
789
- placeholder?: string;
790
- allowCustomValue?: boolean;
791
- disabled?: boolean;
792
- className?: string;
793
- "aria-describedby"?: string;
794
- "aria-labelledby"?: string;
795
- "aria-invalid"?: boolean;
796
- "aria-required"?: boolean;
797
- }
798
- /**
799
- * Un champ qui propose, sans imposer.
800
- *
801
- * `allowCustomValue` est vrai par défaut : la liste aide à trouver, elle ne
802
- * dit pas ce qui existe. Un nom de client absent du référentiel reste
803
- * saisissable, quitte à être créé ensuite.
804
- */
805
- declare function Autocomplete({ id, options, value, defaultValue, onValueChange, placeholder: placeholderProp, allowCustomValue, disabled, className, ...ariaProps }: AutocompleteProps): react_jsx_runtime.JSX.Element;
806
-
807
- type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
808
- type AvatarShape = "circle" | "rounded" | "square";
809
- type AvatarVariant = "soft" | "solid" | "outline";
810
- /**
811
- * La présence d'une personne.
812
- *
813
- * Quatre états et pas davantage : au-delà, la pastille devient un code que
814
- * personne ne retient, et il faut une légende pour la lire.
815
- */
816
- type AvatarStatus = "online" | "offline" | "busy" | "away";
817
- /**
818
- * Les teintes dérivées du nom.
819
- *
820
- * Deux personnes aux mêmes initiales doivent se distinguer : dans une liste
821
- * de participants, six pastilles identiques ne valent pas mieux qu'aucune.
822
- * La couleur est donc déterministe — la même personne garde la sienne d'un
823
- * écran à l'autre, d'une session à l'autre.
824
- */
825
- declare const TEINTES: readonly ["primary", "info", "success", "warning", "danger", "secondary"];
826
- type AvatarTint = (typeof TEINTES)[number];
827
- declare function tintForName(name: string): AvatarTint;
828
- declare function initialsOf(name: string, count?: number): string;
829
- interface AvatarProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, "children" | "width" | "height"> {
830
- /** Le nom de la personne : il sert au repli, à la couleur et à l'annonce. */
831
- name: string;
832
- size?: AvatarSize;
833
- shape?: AvatarShape;
834
- variant?: AvatarVariant;
835
- /** Force la teinte au lieu de la dériver du nom. */
836
- tint?: AvatarTint;
837
- /** Remplace les initiales — une icône, un emoji, deux lettres à soi. */
838
- fallback?: ReactNode;
839
- /** Nombre d'initiales quand le repli est automatique. */
840
- initials?: 1 | 2;
841
- status?: AvatarStatus;
842
- /** Le libellé du statut, pour les lecteurs d'écran. */
843
- statusLabel?: string;
844
- /** Un liseré qui détache l'avatar de son fond. */
845
- ring?: boolean;
846
- /** Rend l'avatar actionnable — un menu de compte, par exemple. */
847
- onPress?: () => void;
848
- }
849
- /**
850
- * Le portrait d'une personne, ou ce qui le remplace.
851
- *
852
- * Une image met du temps à arriver, échoue parfois, et manque souvent. Les
853
- * trois cas sont traités sans que la mise en page bouge : l'espace est réservé
854
- * d'emblée, le repli est peint dessous, et l'image se fond par-dessus quand
855
- * elle arrive.
856
- */
857
- declare function Avatar({ name, size, shape, variant, tint, fallback, initials, status, statusLabel, ring, onPress, className, src, alt, onError, onLoad, style, ...props }: AvatarProps): react_jsx_runtime.JSX.Element;
858
- interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {
859
- children: ReactNode;
860
- /**
861
- * Au-delà, les suivants sont résumés par un compteur.
862
- *
863
- * Sans limite, une réunion de quarante personnes déborde de sa ligne et
864
- * n'apprend plus rien : au-delà de cinq visages, on ne lit plus des gens,
865
- * on lit une foule.
866
- */
867
- max?: number;
868
- size?: AvatarSize;
869
- shape?: AvatarShape;
870
- variant?: AvatarVariant;
871
- /** Le chevauchement, de 0 (côte à côte) à 1 (fortement empilés). */
872
- overlap?: number;
873
- /** Écarte les avatars au survol, pour les distinguer. */
874
- spreadOnHover?: boolean;
875
- /** Ce qu'affiche le compteur. Par défaut `+N`. */
876
- renderOverflow?: (count: number) => ReactNode;
1572
+ * vide, qui ressemble à un chargement qui n'en finit pas.
1573
+ */
1574
+ declare function AsyncState({ loading, error, empty, emptyTitle, emptyDescription, onRetry, children, alertProps, retryButtonProps, emptyStateProps, spinnerProps }: AsyncStateProps): react_jsx_runtime.JSX.Element;
1575
+
1576
+ interface AuditEvent {
1577
+ label: ReactNode;
1578
+ at: Date | string | number;
1579
+ by?: ReactNode;
1580
+ detail?: ReactNode;
1581
+ }
1582
+ interface AuditMetaProps {
1583
+ events: AuditEvent[];
1584
+ /** La langue des dates. Par défaut, celle de la locale SIA. */
1585
+ locale?: string;
1586
+ /** Par défaut, « Historique » de la locale SIA. */
1587
+ title?: ReactNode;
1588
+ /** Par défaut, « Aucune activité » de la locale SIA. */
1589
+ emptyLabel?: ReactNode;
1590
+ className?: string;
877
1591
  }
878
1592
  /**
879
- * Plusieurs personnes, sur une ligne.
1593
+ * Qui a fait quoi, et quand.
880
1594
  *
881
- * Les avatars se chevauchent — c'est ce qui dit « un groupe » plutôt qu'« une
882
- * liste ». Chacun porte un liseré de la couleur du fond, sans quoi la pile
883
- * devient une bouillie dès que deux teintes se ressemblent.
1595
+ * Une liste d'événements plutôt qu'un dernier état : savoir qu'une facture
1596
+ * a été validée n'apprend rien si l'on ignore qu'elle avait été rejetée la
1597
+ * veille. Les dates sont relatives — « il y a deux jours » se compare sans
1598
+ * calcul mental.
884
1599
  */
885
- declare function AvatarGroup({ children, max, size, shape, variant, overlap, spreadOnHover, renderOverflow, className, style, ...props }: AvatarGroupProps): react_jsx_runtime.JSX.Element;
1600
+ declare function AuditMeta({ events, locale: localeProp, title: titleProp, emptyLabel: emptyLabelProp, className }: AuditMetaProps): react_jsx_runtime.JSX.Element;
886
1601
 
887
- interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {
888
- label?: string;
889
- size?: "xs" | "sm" | "md" | "lg" | "xl";
890
- variant?: "dots" | "ring" | "double-ring";
891
- tone?: ComponentTone | "current";
1602
+ interface AuthLayoutProps {
1603
+ title: ReactNode;
1604
+ description?: ReactNode;
1605
+ logo?: ReactNode;
1606
+ aside?: ReactNode;
1607
+ children: ReactNode;
1608
+ footer?: ReactNode;
1609
+ className?: string;
892
1610
  }
893
1611
  /**
894
- * Une attente sans durée connue.
1612
+ * La page qui précède l'application : connexion, inscription, mot de passe
1613
+ * oublié.
895
1614
  *
896
- * Quand la durée est connue, une barre de progression en dit plus. Le ton
897
- * `current` reprend la couleur du texte environnant : un indicateur posé
898
- * dans un bouton doit suivre la couleur du bouton, pas celle du thème.
1615
+ * Elle n'a ni navigation ni coquille, et c'est délibéré : tout ce qui mène
1616
+ * ailleurs est hors de portée de quelqu'un qui n'est pas encore entré.
899
1617
  */
900
- declare function Spinner({ label: labelProp, size: sizeProp, variant: variantProp, tone: toneProp, className, ...props }: SpinnerProps): react_jsx_runtime.JSX.Element;
1618
+ declare function AuthLayout({ title, description, logo, aside, children, footer, className, }: AuthLayoutProps): react_jsx_runtime.JSX.Element;
901
1619
 
902
- interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
903
- tone?: ComponentTone;
904
- variant?: "soft" | "solid" | "outline";
905
- left?: ReactNode;
906
- right?: ReactNode;
907
- loading?: boolean;
908
- loadingLabel?: string;
909
- spinnerProps?: Omit<SpinnerProps, "label">;
1620
+ interface AutocompleteProps {
1621
+ id?: string;
1622
+ options: SelectOption[];
1623
+ value?: string;
1624
+ defaultValue?: string;
1625
+ onValueChange?: (value: string, option?: SelectOption) => void;
1626
+ placeholder?: string;
1627
+ allowCustomValue?: boolean;
1628
+ disabled?: boolean;
1629
+ className?: string;
1630
+ "aria-describedby"?: string;
1631
+ "aria-labelledby"?: string;
1632
+ "aria-invalid"?: boolean;
1633
+ "aria-required"?: boolean;
910
1634
  }
911
1635
  /**
912
- * Une étiquette d'état, courte et dense.
1636
+ * Un champ qui propose, sans imposer.
913
1637
  *
914
- * Elle porte un ton, jamais une action : un badge cliquable se confond avec
915
- * un bouton petit, et l'on découvre qu'il ne l'était pas en cliquant. Ce
916
- * qui agit est un bouton.
1638
+ * `allowCustomValue` est vrai par défaut : la liste aide à trouver, elle ne
1639
+ * dit pas ce qui existe. Un nom de client absent du référentiel reste
1640
+ * saisissable, quitte à être créé ensuite.
917
1641
  */
918
- declare function Badge({ tone: toneProp, variant: variantProp, left, right, loading, loadingLabel: loadingLabelProp, spinnerProps, className, children, ...props }: BadgeProps): react_jsx_runtime.JSX.Element;
1642
+ declare function Autocomplete({ id, options, value, defaultValue, onValueChange, placeholder: placeholderProp, allowCustomValue, disabled, className, ...ariaProps }: AutocompleteProps): react_jsx_runtime.JSX.Element;
1643
+
919
1644
  /**
920
- * Le ton d'une valeur, lu dans une table de correspondance.
921
- *
922
- * Un statut, une action de journal, un environnement : chaque écran tenait
923
- * sa propre table et sa propre fonction pour la lire. Celle-ci est la seule.
924
- *
925
- * ```ts
926
- * const TONS = { payee: "success", attente: "warning", annulee: "danger" };
927
- * toneOf(TONS, facture.statut); // "success" | … | "neutral"
928
- * ```
1645
+ * Une icône de marque, dans la forme d'un objet `simple-icons` : `path` est
1646
+ * le tracé d'un SVG 24×24, `hex` la couleur de la marque, sans dièse.
929
1647
  */
930
- declare function toneOf(tones: Readonly<Record<string, ComponentTone>> | undefined, value: unknown, fallback?: ComponentTone): ComponentTone;
931
- interface StatusBadgeProps extends Omit<BadgeProps, "tone" | "children"> {
932
- /** La valeur brute : `"payee"`, `"prod"`, `"delete"`. */
933
- value: string | number | null | undefined;
934
- /** Le ton de chaque valeur. */
935
- tones?: Readonly<Record<string, ComponentTone>>;
936
- /** Le libellé de chaque valeur. À défaut, la valeur elle-même. */
937
- labels?: Readonly<Record<string, ReactNode>>;
938
- /** Le ton d'une valeur absente de `tones`. `neutral` par défaut. */
939
- fallbackTone?: ComponentTone;
940
- /** Ce qui s'affiche sans valeur. Rien par défaut. */
941
- empty?: ReactNode;
1648
+ interface BrandIconData {
1649
+ title: string;
1650
+ path: string;
1651
+ hex: string;
1652
+ }
1653
+ interface BrandIconProps extends Omit<SVGAttributes<SVGSVGElement>, "children" | "title"> {
1654
+ icon: BrandIconData;
1655
+ /** La taille du carré. `1em` par défaut : l'icône suit le texte. */
1656
+ size?: number | string;
1657
+ /** La couleur de la marque (défaut), ou `currentColor` quand il vaut `false`. */
1658
+ colored?: boolean;
1659
+ /** Le nom accessible. Par défaut, `icon.title`. */
1660
+ title?: string;
1661
+ /** Masquée des lecteurs d'écran : l'icône accompagne un texte qui la nomme déjà. */
1662
+ decorative?: boolean;
942
1663
  }
943
1664
  /**
944
- * Une valeur rendue en pastille, ton et libellé tirés de deux tables.
1665
+ * Le logo d'un service tiers — Vercel, Supabase, GitHub — sans dépendance.
945
1666
  *
946
- * Déclarées une fois par domaine — les statuts de facture, les actions du
947
- * journal — puis passées partout où la valeur s'affiche : colonne libre,
948
- * détail, carte. Une valeur inconnue garde une pastille neutre plutôt que de
949
- * disparaître.
1667
+ * Le système ne livre aucun logo : il prend l'objet d'icône que le projet
1668
+ * importe lui-même, et ne dépend donc ni d'un paquet d'icônes ni de sa
1669
+ * version.
1670
+ *
1671
+ * ```tsx
1672
+ * import { siVercel } from "simple-icons";
1673
+ * <BrandIcon icon={siVercel} />
1674
+ * ```
1675
+ *
1676
+ * Une marque quasi noire (Vercel, GitHub) disparaîtrait sur un fond sombre,
1677
+ * une marque quasi blanche sur un fond clair : sur le thème où elle serait
1678
+ * illisible, elle prend la couleur du texte plutôt que la sienne.
950
1679
  */
951
- declare function StatusBadge({ value, tones, labels, fallbackTone, empty, ...props }: StatusBadgeProps): react_jsx_runtime.JSX.Element;
1680
+ declare function BrandIcon({ icon, size, colored, title, decorative, className, style, ...props }: BrandIconProps): react_jsx_runtime.JSX.Element;
952
1681
 
953
1682
  interface BreadcrumbItem {
954
1683
  key?: string;
@@ -968,6 +1697,11 @@ interface BreadcrumbProps {
968
1697
  separator?: ReactNode;
969
1698
  ariaLabel?: string;
970
1699
  className?: string;
1700
+ /**
1701
+ * Le menu des niveaux repliés : placement, décalage, classe. Ses entrées
1702
+ * et son déclencheur viennent de `items`.
1703
+ */
1704
+ dropdownMenuProps?: Partial<Omit<DropdownMenuProps, "items" | "children" | "onSelect">>;
971
1705
  }
972
1706
  /**
973
1707
  * Le chemin parcouru.
@@ -975,60 +1709,7 @@ interface BreadcrumbProps {
975
1709
  * Le dernier élément n'est jamais un lien : c'est la page courante, et un
976
1710
  * lien vers l'endroit où l'on se trouve déjà n'existe pas.
977
1711
  */
978
- declare function Breadcrumb({ items, maxVisible, separator, ariaLabel, className, }: BreadcrumbProps): react_jsx_runtime.JSX.Element;
979
-
980
- type TooltipVariant = "solid" | "outline";
981
- interface TooltipProps extends Omit<HTMLAttributes<HTMLSpanElement>, "content"> {
982
- content?: ReactNode;
983
- children: ReactNode;
984
- tone?: ComponentTone;
985
- /** Seules `sm`, `md` et `lg` sont dessinées — voir `styles.css`. */
986
- size?: ComponentSize;
987
- placement?: Placement;
988
- variant?: TooltipVariant;
989
- /** Délai avant apparition, en millisecondes. */
990
- delay?: number;
991
- disabled?: boolean;
992
- }
993
- /** Alias historique, conservé pour les composants venus du registre. */
994
- type ITooltipProps = TooltipProps;
995
- type ITooltipVariant = TooltipVariant;
996
- /**
997
- * Bulle d'aide positionnée hors du flux.
998
- *
999
- * Le contenu passe par un portail plutôt que par un `position: absolute` dans
1000
- * le flux : un tooltip posé dans une `Card` ou une cellule de `DataTable` —
1001
- * toutes deux en `overflow: hidden` — serait sinon rogné.
1002
- */
1003
- declare function Tooltip({ content, children, placement, variant, tone, size, delay, disabled, className, ...props }: TooltipProps): react_jsx_runtime.JSX.Element;
1004
-
1005
- interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1006
- variant?: "solid" | "outline" | "ghost";
1007
- /**
1008
- * Le ton sémantique de l'action.
1009
- *
1010
- * `.sia-button--danger` existait dans la feuille de style sans qu'aucune
1011
- * prop ne permette de l'atteindre : une action de suppression ne pouvait pas
1012
- * être rouge sans `className` manuel.
1013
- */
1014
- tone?: ComponentTone;
1015
- size?: "sm" | "md" | "lg";
1016
- radius?: "default" | "none" | "sm" | "lg" | "full";
1017
- loading?: boolean;
1018
- loadingLabel?: string;
1019
- spinnerProps?: Omit<SpinnerProps, "label">;
1020
- tooltip?: Omit<TooltipProps, "children">;
1021
- leftIcon?: ReactNode;
1022
- rightIcon?: ReactNode;
1023
- }
1024
- /**
1025
- * L'action, sous toutes ses formes.
1026
- *
1027
- * Le chargement y est un état et non un remplacement : le bouton garde sa
1028
- * taille et son libellé pendant l'appel. Un bouton qui devient un rond
1029
- * tournant fait bouger la mise en page, et le clic suivant tombe à côté.
1030
- */
1031
- declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
1712
+ declare function Breadcrumb({ items, maxVisible, separator, ariaLabel, className, dropdownMenuProps, }: BreadcrumbProps): react_jsx_runtime.JSX.Element;
1032
1713
 
1033
1714
  interface CalendarDay {
1034
1715
  date: string;
@@ -1071,6 +1752,7 @@ interface CalendarProps {
1071
1752
  onModeChange: (mode: CalendarMode) => void;
1072
1753
  }) => ReactNode;
1073
1754
  renderExtraFooter?: () => ReactNode;
1755
+ /** La langue des jours et des mois. Par défaut, celle de la locale SIA. */
1074
1756
  locale?: string;
1075
1757
  firstDayOfWeek?: 0 | 1;
1076
1758
  showWeek?: boolean;
@@ -1089,8 +1771,12 @@ interface CalendarProps {
1089
1771
  * `Date` porte une heure et un fuseau dont une date de facture n'a que
1090
1772
  * faire, et qui la décalent d'un jour une fois sur deux.
1091
1773
  */
1092
- declare function Calendar({ value, defaultValue, range, defaultRange, selectionMode, month, defaultMonth, mode, defaultMode, onValueChange, onRangeChange, onSelect, onMonthChange, onPanelChange, disabledDate, validRange, renderDay, cellRender, headerRender, renderExtraFooter, locale, firstDayOfWeek, showWeek, fullscreen, tone, className, }: CalendarProps): react_jsx_runtime.JSX.Element;
1774
+ declare function Calendar({ value, defaultValue, range, defaultRange, selectionMode, month, defaultMonth, mode, defaultMode, onValueChange, onRangeChange, onSelect, onMonthChange, onPanelChange, disabledDate, validRange, renderDay, cellRender, headerRender, renderExtraFooter, locale: localeProp, firstDayOfWeek, showWeek, fullscreen, tone, className, }: CalendarProps): react_jsx_runtime.JSX.Element;
1093
1775
 
1776
+ type CardProps = HTMLAttributes<HTMLDivElement>;
1777
+ type CardHeaderProps = HTMLAttributes<HTMLDivElement>;
1778
+ type CardBodyProps = HTMLAttributes<HTMLDivElement>;
1779
+ type CardFooterProps = HTMLAttributes<HTMLDivElement>;
1094
1780
  /**
1095
1781
  * Une surface qui regroupe ce qui va ensemble.
1096
1782
  *
@@ -1099,10 +1785,10 @@ declare function Calendar({ value, defaultValue, range, defaultRange, selectionM
1099
1785
  * deux boutons et une pastille, une prop ne suffit plus, et l'on se retrouve
1100
1786
  * à passer du JSX à travers une chaîne.
1101
1787
  */
1102
- declare function Card({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1103
- declare function CardHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1104
- declare function CardBody({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1105
- declare function CardFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1788
+ declare function Card({ className, ...props }: CardProps): react_jsx_runtime.JSX.Element;
1789
+ declare function CardHeader({ className, ...props }: CardHeaderProps): react_jsx_runtime.JSX.Element;
1790
+ declare function CardBody({ className, ...props }: CardBodyProps): react_jsx_runtime.JSX.Element;
1791
+ declare function CardFooter({ className, ...props }: CardFooterProps): react_jsx_runtime.JSX.Element;
1106
1792
 
1107
1793
  interface ChartSeries {
1108
1794
  key: string;
@@ -1158,40 +1844,6 @@ interface SparklineProps {
1158
1844
  */
1159
1845
  declare function Sparkline({ values, tone, color, width, height, filled, className, }: SparklineProps): react_jsx_runtime.JSX.Element;
1160
1846
 
1161
- type CheckboxValue = string | number;
1162
- interface CheckboxGroupProps {
1163
- value?: CheckboxValue[];
1164
- defaultValue?: CheckboxValue[];
1165
- onValueChange?: (value: CheckboxValue[]) => void;
1166
- disabled?: boolean;
1167
- variant?: "default" | "button";
1168
- orientation?: "horizontal" | "vertical";
1169
- size?: "sm" | "md" | "lg";
1170
- tone?: ComponentTone;
1171
- className?: string;
1172
- children: ReactNode;
1173
- }
1174
- /**
1175
- * Une case, ou un groupe de cases.
1176
- *
1177
- * `CheckboxGroup` gère la liste des valeurs cochées; la case seule gère la
1178
- * sienne. L'état indéterminé est une troisième valeur, pas un entre-deux
1179
- * visuel : il dit « certains enfants sont cochés », ce qu'aucun booléen ne
1180
- * sait exprimer.
1181
- */
1182
- declare function CheckboxGroup({ value, defaultValue, onValueChange, disabled, variant, orientation, size, tone, className, children, }: CheckboxGroupProps): react_jsx_runtime.JSX.Element;
1183
- interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "size"> {
1184
- value?: CheckboxValue;
1185
- label?: ReactNode;
1186
- children?: ReactNode;
1187
- description?: ReactNode;
1188
- indeterminate?: boolean;
1189
- onValueChange?: (checked: boolean) => void;
1190
- size?: "sm" | "md" | "lg";
1191
- tone?: ComponentTone;
1192
- }
1193
- declare const Checkbox: react.ForwardRefExoticComponent<CheckboxProps & react.RefAttributes<HTMLInputElement>>;
1194
-
1195
1847
  interface ColorPickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "onChange"> {
1196
1848
  onValueChange?: (value: string) => void;
1197
1849
  showValue?: boolean;
@@ -1217,8 +1869,8 @@ interface CommandItem {
1217
1869
  interface CommandPaletteProps {
1218
1870
  open: boolean;
1219
1871
  onOpenChange: (open: boolean) => void;
1220
- items: CommandItem[];
1221
- placeholder?: string;
1872
+ items: CommandItem[]; /** Par défaut, celui de la locale. */
1873
+ placeholder?: string; /** Par défaut, celui de la locale. */
1222
1874
  emptyLabel?: string;
1223
1875
  className?: string;
1224
1876
  }
@@ -1229,27 +1881,23 @@ interface CommandPaletteProps {
1229
1881
  * « facture » doit trouver « Nouvelle vente » sans avoir appris comment
1230
1882
  * l'action s'appelle ici.
1231
1883
  */
1232
- declare function CommandPalette({ open, onOpenChange, items, placeholder, emptyLabel, className }: CommandPaletteProps): react_jsx_runtime.JSX.Element | null;
1884
+ declare function CommandPalette({ open, onOpenChange, items, placeholder: placeholderProp, emptyLabel: emptyLabelProp, className }: CommandPaletteProps): react_jsx_runtime.JSX.Element | null;
1233
1885
 
1234
- interface ConfirmDialogProps {
1235
- open: boolean;
1236
- onOpenChange: (open: boolean) => void;
1237
- title: ReactNode;
1238
- description?: ReactNode;
1239
- confirmLabel?: string;
1240
- cancelLabel?: string;
1241
- tone?: Extract<ComponentTone, "primary" | "danger">;
1242
- loading?: boolean;
1243
- onConfirm: () => void | Promise<void>;
1886
+ interface ColorModeToggleProps extends Partial<Omit<IconButtonProps, "icon" | "onClick" | "aria-pressed">> {
1887
+ /** Le nom du bouton en mode clair. Par défaut, celui de la locale. */
1888
+ darkLabel?: string;
1889
+ /** Le nom du bouton en mode sombre. Par défaut, celui de la locale. */
1890
+ lightLabel?: string;
1244
1891
  }
1245
1892
  /**
1246
- * La question qu'on pose avant de détruire.
1893
+ * Le bouton de bascule clair / sombre.
1247
1894
  *
1248
- * `onConfirm` peut rendre une promesse : le bouton reste occupé tant qu'elle
1249
- * n'a pas abouti. Sans cela, la boîte se referme sur un appel encore en
1250
- * vol, et l'on ignore si la suppression a eu lieu.
1895
+ * Il lit et écrit le mode de `SiaProvider` — persistance et script
1896
+ * anti-clignotement compris — plutôt que de tenir le sien. L'icône montre le
1897
+ * mode vers lequel on part, comme le libellé : le soleil en mode sombre.
1898
+ * Toutes les props d'`IconButton` passent, sauf ce qu'il pilote.
1251
1899
  */
1252
- declare function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel: confirmLabelProp, cancelLabel: cancelLabelProp, tone, loading, onConfirm }: ConfirmDialogProps): react_jsx_runtime.JSX.Element;
1900
+ declare function ColorModeToggle({ darkLabel: darkLabelProp, lightLabel: lightLabelProp, variant, ...props }: ColorModeToggleProps): react_jsx_runtime.JSX.Element;
1253
1901
 
1254
1902
  /**
1255
1903
  * La largeur de lecture, et l'espacement vertical.
@@ -1336,7 +1984,7 @@ declare const Textarea: react.ForwardRefExoticComponent<TextareaProps & react.Re
1336
1984
  interface CurrencyInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "value" | "defaultValue" | "onChange" | "inputMode"> {
1337
1985
  value?: number | null;
1338
1986
  defaultValue?: number | null;
1339
- currency?: string;
1987
+ currency?: string; /** La langue du format et de la saisie. Par défaut, celle de la locale SIA. */
1340
1988
  locale?: string;
1341
1989
  onValueChange?: (value: number | null) => void;
1342
1990
  invalid?: boolean;
@@ -1360,12 +2008,15 @@ interface DatePickerProps extends Pick<CalendarProps, "locale" | "firstDayOfWeek
1360
2008
  onValueChange?: (value: string) => void;
1361
2009
  onOpenChange?: (open: boolean) => void;
1362
2010
  open?: boolean;
2011
+ /** Par défaut, « Sélectionner une date » de la locale SIA. */
1363
2012
  placeholder?: string;
1364
2013
  formatValue?: (value: string, locale: string) => ReactNode;
1365
2014
  allowClear?: boolean;
1366
2015
  showToday?: boolean;
1367
2016
  renderExtraFooter?: () => ReactNode;
1368
2017
  placement?: OverlayPlacement;
2018
+ /** Réglages du panneau flottant — décalage, marge au bord, classe. */
2019
+ overlayProps?: Partial<Omit<OverlayProps, "open" | "anchorRef" | "onOpenChange" | "children">>;
1369
2020
  tone?: ComponentTone;
1370
2021
  invalid?: boolean;
1371
2022
  disabled?: boolean;
@@ -1399,6 +2050,7 @@ interface TimePickerProps {
1399
2050
  hourFormat?: 12 | 24;
1400
2051
  needConfirm?: boolean;
1401
2052
  allowClear?: boolean;
2053
+ /** Par défaut, « Sélectionner une heure » de la locale SIA. */
1402
2054
  placeholder?: string;
1403
2055
  disabledTime?: (value: TimeParts) => boolean;
1404
2056
  renderExtraFooter?: () => ReactNode;
@@ -1406,6 +2058,8 @@ interface TimePickerProps {
1406
2058
  onOpenChange?: (open: boolean) => void;
1407
2059
  open?: boolean;
1408
2060
  placement?: OverlayPlacement;
2061
+ /** Réglages du panneau flottant — décalage, marge au bord, classe. */
2062
+ overlayProps?: Partial<Omit<OverlayProps, "open" | "anchorRef" | "onOpenChange" | "children">>;
1409
2063
  tone?: ComponentTone;
1410
2064
  invalid?: boolean;
1411
2065
  disabled?: boolean;
@@ -1463,7 +2117,10 @@ interface MultiSelectProps {
1463
2117
  value?: string[];
1464
2118
  defaultValue?: string[];
1465
2119
  onValueChange?: (value: string[]) => void;
2120
+ /** Le texte du champ vide. Par défaut, `select` de la locale. */
1466
2121
  placeholder?: string;
2122
+ /** Le texte indicatif de la recherche. Par défaut, `searchPlaceholder` de la locale. */
2123
+ searchPlaceholder?: string;
1467
2124
  searchable?: boolean;
1468
2125
  disabled?: boolean;
1469
2126
  className?: string;
@@ -1479,7 +2136,7 @@ interface MultiSelectProps {
1479
2136
  * un compte seul — « 3 sélectionnés » — oblige à rouvrir la liste pour
1480
2137
  * savoir lesquels.
1481
2138
  */
1482
- declare function MultiSelect({ id, options, value, defaultValue, onValueChange, placeholder, searchable, disabled, className, ...ariaProps }: MultiSelectProps): react_jsx_runtime.JSX.Element;
2139
+ declare function MultiSelect({ id, options, value, defaultValue, onValueChange, placeholder: placeholderProp, searchPlaceholder: searchPlaceholderProp, searchable, disabled, className, ...ariaProps }: MultiSelectProps): react_jsx_runtime.JSX.Element;
1483
2140
 
1484
2141
  type RadioValue = string | number;
1485
2142
  interface RadioGroupProps {
@@ -1538,8 +2195,12 @@ interface SwitchProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onC
1538
2195
  declare const Switch: react.ForwardRefExoticComponent<SwitchProps & react.RefAttributes<HTMLButtonElement>>;
1539
2196
 
1540
2197
  interface FileUploadProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "onChange"> {
2198
+ /** Le titre de la zone. Par défaut, celui de la locale (`fileUpload.title`). */
1541
2199
  label?: string;
2200
+ /** La phrase d'aide. Par défaut, celle de la locale (`fileUpload.description`). */
1542
2201
  description?: string;
2202
+ /** Le bouton qui ouvre le sélecteur. Par défaut, celui de la locale (`fileUpload.browse`). */
2203
+ browseLabel?: string;
1543
2204
  onFilesChange?: (files: File[]) => void;
1544
2205
  }
1545
2206
  /**
@@ -1549,13 +2210,22 @@ interface FileUploadProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "t
1549
2210
  * ignore le geste que tout le monde essaie d'abord. Les deux mènent au même
1550
2211
  * champ natif.
1551
2212
  */
1552
- declare function FileUpload({ label, description, onFilesChange, className, multiple, accept, disabled, ...props }: FileUploadProps): react_jsx_runtime.JSX.Element;
2213
+ declare function FileUpload({ label: labelProp, description: descriptionProp, browseLabel: browseLabelProp, onFilesChange, className, multiple, accept, disabled, ...props }: FileUploadProps): react_jsx_runtime.JSX.Element;
1553
2214
 
2215
+ /**
2216
+ * Les props de `FileUpload`, transmises telles quelles au dépôt : libellé,
2217
+ * description, désactivation. `onFilesChange` cède la place à
2218
+ * `onValueChange`, qui porte l'aperçu, et `multiple` est forcé à `false` —
2219
+ * un aperçu ne montre qu'une image.
2220
+ */
1554
2221
  interface ImageUploadProps extends Omit<FileUploadProps, "accept" | "onFilesChange"> {
1555
2222
  accept?: string;
1556
2223
  value?: string;
1557
2224
  onValueChange?: (file: File | null, previewUrl?: string) => void;
2225
+ /** Le texte alternatif de l'aperçu. Par défaut, celui de la locale (`imageUpload.previewAlt`). */
1558
2226
  previewAlt?: string;
2227
+ /** Le bouton qui retire l'image. Par défaut, `delete` de la locale. */
2228
+ removeLabel?: string;
1559
2229
  }
1560
2230
  /**
1561
2231
  * Un dépôt de fichier qui montre ce qu'on vient de choisir.
@@ -1564,7 +2234,7 @@ interface ImageUploadProps extends Omit<FileUploadProps, "accept" | "onFilesChan
1564
2234
  * serveur pour afficher l'image laisse un carré vide au moment précis où
1565
2235
  * l'on veut vérifier qu'on n'a pas pris la mauvaise.
1566
2236
  */
1567
- declare function ImageUpload({ accept, value, onValueChange, previewAlt, className, ...props }: ImageUploadProps): react_jsx_runtime.JSX.Element;
2237
+ declare function ImageUpload({ accept, value, onValueChange, previewAlt: previewAltProp, removeLabel: removeLabelProp, className, ...props }: ImageUploadProps): react_jsx_runtime.JSX.Element;
1568
2238
 
1569
2239
  type SliderRangeValue = [number, number];
1570
2240
  interface SliderProps {
@@ -1590,12 +2260,20 @@ interface SliderProps {
1590
2260
  showValue?: boolean | undefined;
1591
2261
  /** Rendu de la valeur affichée — devise, unité, arrondi. */
1592
2262
  formatValue?: ((value: number) => string) | undefined;
1593
- /** Libellé de la poignée basse, annoncé aux lecteurs d'écran. */
2263
+ /**
2264
+ * Libellé de la poignée basse, annoncé aux lecteurs d'écran. Par défaut,
2265
+ * `slider.thumb` de la locale.
2266
+ */
1594
2267
  startLabel?: string | undefined;
1595
2268
  /** Libellé de la poignée haute, en mode plage. */
1596
2269
  endLabel?: string | undefined;
1597
2270
  disabled?: boolean | undefined;
1598
2271
  className?: string | undefined;
2272
+ /**
2273
+ * Réglages de la bulle qui affiche la valeur au-dessus de chaque poignée —
2274
+ * placement, ton, délai. Son contenu reste la valeur formatée.
2275
+ */
2276
+ tooltipProps?: Partial<Omit<TooltipProps, "content" | "children">> | undefined;
1599
2277
  }
1600
2278
 
1601
2279
  /**
@@ -1605,7 +2283,7 @@ interface SliderProps {
1605
2283
  * non-croisement — vit dans `useSliderState`. Ce fichier ne garde que ce qui
1606
2284
  * est propre au web : la mesure de la piste, les événements souris et le JSX.
1607
2285
  */
1608
- declare function Slider({ name, value, defaultValue, min, max, step, range, minDistance, showValue, formatValue, startLabel, endLabel, onChange, onValueChange, disabled, className, }: SliderProps): react_jsx_runtime.JSX.Element;
2286
+ declare function Slider({ name, value, defaultValue, min, max, step, range, minDistance, showValue, formatValue, startLabel, endLabel, onChange, onValueChange, disabled, className, tooltipProps, }: SliderProps): react_jsx_runtime.JSX.Element;
1609
2287
 
1610
2288
  interface RatingProps {
1611
2289
  id?: string;
@@ -1617,6 +2295,7 @@ interface RatingProps {
1617
2295
  allowHalf?: boolean;
1618
2296
  allowClear?: boolean;
1619
2297
  disabled?: boolean;
2298
+ /** Le nom du groupe d'étoiles. Par défaut, celui de la locale. */
1620
2299
  label?: string;
1621
2300
  className?: string;
1622
2301
  "aria-describedby"?: string;
@@ -1630,7 +2309,7 @@ interface RatingProps {
1630
2309
  * `allowClear` rend la note réversible : sans lui, cliquer une étoile par
1631
2310
  * erreur est définitif, puisqu'aucune étoile ne vaut « aucune note ».
1632
2311
  */
1633
- declare function Rating({ id, value, defaultValue, onValueChange, max, allowHalf, allowClear, disabled, label, className, ...ariaProps }: RatingProps): react_jsx_runtime.JSX.Element;
2312
+ declare function Rating({ id, value, defaultValue, onValueChange, max, allowHalf, allowClear, disabled, label: labelProp, className, ...ariaProps }: RatingProps): react_jsx_runtime.JSX.Element;
1634
2313
 
1635
2314
  interface RichTextEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
1636
2315
  value?: string;
@@ -1646,13 +2325,18 @@ interface RichTextEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, "onCh
1646
2325
  * renvoie et s'affiche partout ailleurs sans qu'un convertisseur soit
1647
2326
  * nécessaire.
1648
2327
  */
1649
- declare function RichTextEditor({ value, defaultValue, onValueChange, placeholder, disabled, className, ...props }: RichTextEditorProps): react_jsx_runtime.JSX.Element;
2328
+ declare function RichTextEditor({ value, defaultValue, onValueChange, placeholder: placeholderProp, disabled, className, ...props }: RichTextEditorProps): react_jsx_runtime.JSX.Element;
1650
2329
 
1651
2330
  interface MarkdownEditorProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "value" | "defaultValue" | "onChange"> {
1652
2331
  value?: string;
1653
2332
  defaultValue?: string;
1654
2333
  onValueChange?: (value: string) => void;
1655
2334
  preview?: (value: string) => ReactNode;
2335
+ /**
2336
+ * La zone de saisie elle-même : `resize`, `invalid`, classe. La valeur et
2337
+ * la saisie restent à l'éditeur, qui les partage avec l'aperçu.
2338
+ */
2339
+ textareaProps?: Partial<Omit<TextareaProps, "value" | "defaultValue" | "onChange">>;
1656
2340
  }
1657
2341
  /**
1658
2342
  * Une saisie Markdown, avec son aperçu.
@@ -1661,13 +2345,20 @@ interface MarkdownEditorProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaEl
1661
2345
  * veut. Embarquer un moteur Markdown imposerait le nôtre à un projet qui a
1662
2346
  * déjà le sien — et ferait grossir le paquet pour tous les autres.
1663
2347
  */
1664
- declare function MarkdownEditor({ value, defaultValue, onValueChange, preview, className, ...props }: MarkdownEditorProps): react_jsx_runtime.JSX.Element;
2348
+ declare function MarkdownEditor({ value, defaultValue, onValueChange, preview, className, textareaProps, ...props }: MarkdownEditorProps): react_jsx_runtime.JSX.Element;
1665
2349
 
1666
2350
  interface JsonEditorProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "value" | "defaultValue" | "onChange"> {
1667
2351
  value?: string;
1668
2352
  defaultValue?: string;
1669
2353
  onValueChange?: (value: string, parsed: unknown | undefined) => void;
1670
2354
  formatOnBlur?: boolean;
2355
+ /**
2356
+ * La zone de saisie elle-même : `resize`, classe, correcteur.
2357
+ *
2358
+ * La valeur, la saisie et `invalid` suivent l'analyse du JSON ; `onBlur`
2359
+ * se passe au composant, qui l'enchaîne après le formatage.
2360
+ */
2361
+ textareaProps?: Partial<Omit<TextareaProps, "value" | "defaultValue" | "onChange" | "invalid" | "onBlur">>;
1671
2362
  }
1672
2363
  /**
1673
2364
  * Une zone de saisie qui connaît la forme de ce qu'on y écrit.
@@ -1676,7 +2367,7 @@ interface JsonEditorProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElemen
1676
2367
  * analysé à côté du texte : l'appelant reçoit donc les deux, et n'a pas à
1677
2368
  * refaire un `JSON.parse` dans un `try`.
1678
2369
  */
1679
- declare function JsonEditor({ value, defaultValue, onValueChange, formatOnBlur, className, ...props }: JsonEditorProps): react_jsx_runtime.JSX.Element;
2370
+ declare function JsonEditor({ value, defaultValue, onValueChange, formatOnBlur, className, textareaProps, ...props }: JsonEditorProps): react_jsx_runtime.JSX.Element;
1680
2371
 
1681
2372
  interface OtpInputProps {
1682
2373
  id?: string;
@@ -1724,11 +2415,16 @@ interface TagsInputProps {
1724
2415
  * que ce sont les deux touches que l'on presse sans y penser après avoir
1725
2416
  * tapé un mot.
1726
2417
  */
1727
- declare function TagsInput({ id, value, defaultValue, onValueChange, placeholder, separators, maxTags, disabled, className, ...ariaProps }: TagsInputProps): react_jsx_runtime.JSX.Element;
2418
+ declare function TagsInput({ id, value, defaultValue, onValueChange, placeholder: placeholderProp, separators, maxTags, disabled, className, ...ariaProps }: TagsInputProps): react_jsx_runtime.JSX.Element;
1728
2419
 
1729
2420
  interface ReferenceOption extends SelectOption {
1730
2421
  description?: ReactNode;
1731
2422
  }
2423
+ /**
2424
+ * Les props d'`Autocomplete`, transmises telles quelles : le composant n'est
2425
+ * qu'une mise en forme de ses options. Seules `options` changent de forme,
2426
+ * pour porter une description.
2427
+ */
1732
2428
  interface ReferenceSelectProps extends Omit<AutocompleteProps, "options"> {
1733
2429
  options: ReferenceOption[];
1734
2430
  }
@@ -1751,7 +2447,21 @@ type FieldControlProps = {
1751
2447
  "aria-required"?: boolean;
1752
2448
  };
1753
2449
  type FieldValue = string | number | SliderRangeValue | boolean | string[] | DateTimeValue | File[] | File | null | undefined;
1754
- type ControlProps = Partial<InputProps & TextareaProps & CurrencyInputProps & DatePickerProps & TimePickerProps & DateTimePickerProps & SelectProps & MultiSelectProps & RadioGroupProps & CheckboxProps & SwitchProps & FileUploadProps & ImageUploadProps & SliderProps & RatingProps & ColorPickerProps & RichTextEditorProps & MarkdownEditorProps & JsonEditorProps & OtpInputProps & TagsInputProps & AutocompleteProps & ReferenceSelectProps>;
2450
+ /**
2451
+ * Ce que le champ décide seul pour son contrôle, quel qu'il soit.
2452
+ *
2453
+ * La valeur et son changement viennent de `value`/`onValueChange` ou du
2454
+ * branchement `field` ; le nom, l'identifiant, les options, le texte
2455
+ * indicatif et la désactivation ont chacun leur prop sur `Field`. Les
2456
+ * laisser passer aussi par `controlProps` donnerait deux sources pour la
2457
+ * même chose, dont l'une serait silencieusement écrasée.
2458
+ */
2459
+ type FieldPilotedKey = "value" | "defaultValue" | "onChange" | "onValueChange" | "onCheckedChange" | "onFilesChange" | "checked" | "defaultChecked" | "name" | "id" | "options" | "placeholder" | "disabled" | "children";
2460
+ /**
2461
+ * Distributif : un `Omit` posé sur l'union entière n'en garderait que les
2462
+ * clés communes, et `searchable` ou `maxLength` disparaîtraient.
2463
+ */
2464
+ type FieldControlSlot<P> = P extends unknown ? Partial<Omit<P, FieldPilotedKey>> : never;
1755
2465
  /**
1756
2466
  * Un branchement de formulaire, quel que soit le type exact de sa valeur.
1757
2467
  *
@@ -1797,6 +2507,7 @@ interface FieldProps {
1797
2507
  success?: ReactNode;
1798
2508
  required?: boolean;
1799
2509
  optional?: boolean;
2510
+ /** La mention des champs facultatifs. Par défaut, `optional` de la locale. */
1800
2511
  optionalLabel?: ReactNode;
1801
2512
  htmlFor?: string;
1802
2513
  orientation?: "vertical" | "horizontal";
@@ -1810,9 +2521,20 @@ interface FieldProps {
1810
2521
  controlLabel?: ReactNode;
1811
2522
  placeholder?: string;
1812
2523
  disabled?: boolean;
1813
- controlProps?: ControlProps;
2524
+ /**
2525
+ * Réglages du contrôle que `type` choisit — `searchable` d'un `Select`,
2526
+ * `maxLength` d'un `Input`, `accept` d'un `FileUpload`. Pour `radio`, ils
2527
+ * vont au `RadioGroup`.
2528
+ *
2529
+ * Appliqués sous ce que le champ pilote : valeur, changement, nom,
2530
+ * identifiant, options, texte indicatif et désactivation gardent leurs
2531
+ * props dédiées. Ignorés quand le contrôle est fourni en `children`.
2532
+ */
2533
+ controlProps?: FieldControlSlot<InputProps | TextareaProps | CurrencyInputProps | DatePickerProps | TimePickerProps | DateTimePickerProps | SelectProps | MultiSelectProps | RadioGroupProps | CheckboxProps | SwitchProps | FileUploadProps | ImageUploadProps | SliderProps | RatingProps | ColorPickerProps | RichTextEditorProps | MarkdownEditorProps | JsonEditorProps | OtpInputProps | TagsInputProps | AutocompleteProps | ReferenceSelectProps>;
1814
2534
  children?: ReactElement<FieldControlProps>;
1815
2535
  }
2536
+ /** Les réglages qu'accepte `controlProps`, pour les composer hors du JSX. */
2537
+ type FieldControlOverrides = NonNullable<FieldProps["controlProps"]>;
1816
2538
  /**
1817
2539
  * Le champ, et tout ce qui l'entoure.
1818
2540
  *
@@ -1834,6 +2556,17 @@ interface FormFieldConfig extends Omit<FieldProps, "field" | "name"> {
1834
2556
  /** Nombre de colonnes occupées. Ignoré sur une seule colonne. */
1835
2557
  colSpan?: number;
1836
2558
  rowSpan?: number;
2559
+ /**
2560
+ * Une vérification qui demande le serveur — un identifiant libre, un nom
2561
+ * de domaine disponible. Rend le message d'erreur, ou rien.
2562
+ *
2563
+ * Relancée après la frappe (`asyncValidationDelay`), annulée à la frappe
2564
+ * suivante par son `signal`. Pendant la vérification le champ l'annonce,
2565
+ * et l'envoi attend ; une valeur refusée bloque l'envoi.
2566
+ */
2567
+ validateAsync?: AsyncFieldValidator<FieldValue>;
2568
+ /** Affiché sous le champ quand `validateAsync` accepte la valeur. */
2569
+ validText?: ReactNode;
1837
2570
  }
1838
2571
  /** Un groupe de champs, avec son titre et sa propre grille. */
1839
2572
  interface FormFieldGroup {
@@ -1875,10 +2608,18 @@ interface FormProps<TValues extends FormShape = FormShape> {
1875
2608
  */
1876
2609
  onSubmit?: (values: TValues) => FormSubmitResult<TValues> | Promise<FormSubmitResult<TValues>>;
1877
2610
  columns?: number;
2611
+ /** Le texte du bouton d'envoi. Par défaut, `save` de la locale. */
1878
2612
  submitText?: ReactNode;
2613
+ /** Le texte du bouton de remise à zéro. Par défaut, `reset` de la locale. */
1879
2614
  clearText?: ReactNode;
1880
2615
  showClear?: boolean;
2616
+ /**
2617
+ * Les props du bouton d'envoi. `disabled` s'ajoute aux conditions du
2618
+ * formulaire au lieu d'être remplacé par elles.
2619
+ */
1881
2620
  submitProps?: ButtonProps;
2621
+ /** Millisecondes sans frappe avant une vérification `validateAsync`. 400 par défaut. */
2622
+ asyncValidationDelay?: number;
1882
2623
  /** Remplace entièrement la barre de boutons. */
1883
2624
  actions?: ReactNode;
1884
2625
  loading?: boolean;
@@ -1887,6 +2628,26 @@ interface FormProps<TValues extends FormShape = FormShape> {
1887
2628
  /** Désactive l'envoi tant qu'une erreur est en vigueur. */
1888
2629
  requireValid?: boolean;
1889
2630
  className?: string;
2631
+ /**
2632
+ * Les props communes à tous les champs — orientation, libellé
2633
+ * « facultatif », `controlProps`. Chaque champ déclaré dans `fields`
2634
+ * l'emporte sur elles.
2635
+ *
2636
+ * Sans ce que le formulaire branche lui-même : le nom, la valeur, le
2637
+ * changement et la sortie de champ (`field`), ni les messages d'erreur et
2638
+ * de validation, qui sont propres à chaque champ.
2639
+ */
2640
+ fieldProps?: Partial<Omit<FieldProps, "field" | "name" | "value" | "defaultValue" | "onValueChange" | "onBlur" | "error" | "success" | "message">>;
2641
+ /**
2642
+ * Les props de l'`Alert` qui annonce un échec d'envoi. Sans `children`, le
2643
+ * message d'échec, ni `onDismiss`, qui l'efface.
2644
+ */
2645
+ alertProps?: Partial<Omit<AlertProps, "children" | "onDismiss">>;
2646
+ /**
2647
+ * Les props du `Spinner` d'une vérification `validateAsync` en cours.
2648
+ * Sans `label`, repris de la locale comme le texte qui l'accompagne.
2649
+ */
2650
+ spinnerProps?: Partial<Omit<SpinnerProps, "label">>;
1890
2651
  }
1891
2652
  /**
1892
2653
  * Un formulaire décrit par ses champs.
@@ -1908,7 +2669,7 @@ interface FormProps<TValues extends FormShape = FormShape> {
1908
2669
  * />
1909
2670
  * ```
1910
2671
  */
1911
- declare function Form<TValues extends FormShape = FormShape>({ fields, form: adapter, defaultValues, validate, onSubmit, columns, submitText, clearText, showClear, submitProps, actions, loading, requireDirty, requireValid, className, }: FormProps<TValues>): react_jsx_runtime.JSX.Element;
2672
+ declare function Form<TValues extends FormShape = FormShape>({ fields, form: adapter, defaultValues, validate, onSubmit, columns, submitText, clearText, showClear, submitProps, actions, loading, requireDirty, requireValid, asyncValidationDelay, className, fieldProps, alertProps, spinnerProps, }: FormProps<TValues>): react_jsx_runtime.JSX.Element;
1912
2673
 
1913
2674
  /**
1914
2675
  * La description d'un objet métier, écrite une seule fois.
@@ -1998,6 +2759,13 @@ interface ResourceField<T = unknown> {
1998
2759
  tones?: Record<string, ComponentTone>;
1999
2760
  /** Le rendu en tableau et en détail. Écrase celui déduit du type. */
2000
2761
  render?: (row: T, index: number) => ReactNode;
2762
+ /**
2763
+ * Les props du contrôle de saisie, transmises telles quelles par le
2764
+ * formulaire : `{ searchable: true }` pour un `select` long, `{ maxLength }`
2765
+ * pour un texte. Sans elles, régler le contrôle obligeait à redéclarer tous
2766
+ * les champs dans la page.
2767
+ */
2768
+ controlProps?: FieldControlOverrides;
2001
2769
  /**
2002
2770
  * Une valeur calculée plutôt que lue sur la ligne.
2003
2771
  *
@@ -2087,8 +2855,12 @@ declare function resourceFormFields<T>(resource: ResourceDefinition<T>, mode?: R
2087
2855
  *
2088
2856
  * Un champ `email` valide une adresse sans qu'on le demande : le type le dit
2089
2857
  * déjà. Les règles déclarées s'y ajoutent, elles ne les remplacent pas.
2858
+ *
2859
+ * `messages` — `locale.resource`, lu avec `useSiaLocale()` — donne leurs
2860
+ * textes aux règles imposées ; `CrudPage` le passe. À défaut, les messages
2861
+ * par défaut de `@sia-ui/utils/validation`.
2090
2862
  */
2091
- declare function resourceValidator<T>(resource: ResourceDefinition<T>, mode?: ResourceFormMode): FormValidator<FormShape> | undefined;
2863
+ declare function resourceValidator<T>(resource: ResourceDefinition<T>, mode?: ResourceFormMode, messages?: ResourceMessages): FormValidator<FormShape> | undefined;
2092
2864
  /** Les clés que la recherche locale parcourt. */
2093
2865
  declare function resourceSearchKeys<T>(resource: ResourceDefinition<T>): string[];
2094
2866
  /** Les valeurs de départ d'une création : les champs du mode `create`. */
@@ -2109,6 +2881,28 @@ declare function resourcePermissions<T>(resource: ResourceDefinition<T>): {
2109
2881
  delete?: PermissionRule;
2110
2882
  };
2111
2883
 
2884
+ interface DescriptionItem {
2885
+ key: string;
2886
+ label: ReactNode;
2887
+ value: ReactNode;
2888
+ span?: 1 | 2 | 3;
2889
+ }
2890
+ interface DescriptionsProps {
2891
+ items: DescriptionItem[];
2892
+ title?: ReactNode;
2893
+ columns?: 1 | 2 | 3;
2894
+ bordered?: boolean;
2895
+ className?: string;
2896
+ }
2897
+ /**
2898
+ * Des paires libellé / valeur, en colonnes.
2899
+ *
2900
+ * C'est la forme d'une fiche en lecture — ce qu'un formulaire montre quand
2901
+ * il n'y a rien à saisir. `span` laisse une valeur longue occuper toute la
2902
+ * ligne plutôt que d'être coupée dans une colonne étroite.
2903
+ */
2904
+ declare function Descriptions({ items, title, columns, bordered, className }: DescriptionsProps): react_jsx_runtime.JSX.Element;
2905
+
2112
2906
  /** Laquelle des trois boîtes est ouverte, et sur quelle ligne. */
2113
2907
  interface CrudDialogState<T> {
2114
2908
  mode: "create" | "edit" | "view";
@@ -2129,6 +2923,26 @@ interface CrudDialogOptions {
2129
2923
  /** Colonnes de la vue de détail. */
2130
2924
  detailColumns?: 1 | 2 | 3;
2131
2925
  }
2926
+ /**
2927
+ * Les props des deux `Modal` — formulaire et détail — qu'on peut régler.
2928
+ *
2929
+ * Sans `open` ni `onOpenChange`, qui suivent l'état des boîtes, ni
2930
+ * `children`. Sans `title` ni `description` non plus : ils diffèrent d'une
2931
+ * boîte à l'autre et se règlent par `dialog`. `className` s'ajoute à celui
2932
+ * des boîtes.
2933
+ */
2934
+ type CrudModalProps = Partial<Omit<ModalProps, "open" | "onOpenChange" | "children" | "title" | "description">>;
2935
+ /**
2936
+ * Les props du `Form` de création et de modification qu'on peut régler —
2937
+ * `showClear`, `submitProps`, `fieldProps`.
2938
+ *
2939
+ * Sans ce que la boîte branche elle-même : les champs, les valeurs de
2940
+ * départ, la validation et l'envoi, qui ont leurs props sur la page ; ni
2941
+ * l'adaptateur `form`, qui couperait la boîte de ses propres valeurs.
2942
+ */
2943
+ type CrudFormProps = Partial<Omit<FormProps, "fields" | "defaultValues" | "validate" | "onSubmit" | "form">>;
2944
+ /** Les props de la vue de détail par défaut. Sans `items`, tirés des colonnes. */
2945
+ type CrudDescriptionsProps = Partial<Omit<DescriptionsProps, "items">>;
2132
2946
  interface CrudDialogsProps<T> {
2133
2947
  state: CrudDialogState<T> | null;
2134
2948
  onClose: () => void;
@@ -2152,6 +2966,12 @@ interface CrudDialogsProps<T> {
2152
2966
  renderDetail?: ((row: T, index: number) => ReactNode) | undefined;
2153
2967
  getRowKey?: ((row: T, index: number) => Key) | undefined;
2154
2968
  dialog?: CrudDialogOptions | undefined;
2969
+ /** Voir `CrudModalProps`. */
2970
+ modalProps?: CrudModalProps | undefined;
2971
+ /** Voir `CrudFormProps`. */
2972
+ formProps?: CrudFormProps | undefined;
2973
+ /** Voir `CrudDescriptionsProps`. */
2974
+ descriptionsProps?: CrudDescriptionsProps | undefined;
2155
2975
  }
2156
2976
  /**
2157
2977
  * Les boîtes du CRUD : créer, modifier, consulter.
@@ -2161,7 +2981,7 @@ interface CrudDialogsProps<T> {
2161
2981
  * laquelle ouvrir, avec quelles valeurs, et de refermer une fois l'envoi
2162
2982
  * passé.
2163
2983
  */
2164
- declare function CrudDialogs<T>({ state, onClose, columns, fields: champsCreation, validate: validationCreation, editFields, editValidate, onSubmit, createDefaults, toFormValues, renderDetail, getRowKey, dialog, }: CrudDialogsProps<T>): react_jsx_runtime.JSX.Element;
2984
+ declare function CrudDialogs<T>({ state, onClose, columns, fields: champsCreation, validate: validationCreation, editFields, editValidate, onSubmit, createDefaults, toFormValues, renderDetail, getRowKey, dialog, modalProps, formProps, descriptionsProps, }: CrudDialogsProps<T>): react_jsx_runtime.JSX.Element;
2165
2985
 
2166
2986
  /**
2167
2987
  * La personnalisation d'une action standard.
@@ -2312,7 +3132,32 @@ interface CrudPageBase<T> {
2312
3132
  * est là pour que TypeScript exige l'une ou l'autre — une page sans colonnes
2313
3133
  * ni ressource ne montrerait rien, et le dirait à l'exécution.
2314
3134
  */
2315
- type CrudPageProps<T> = CrudPageBase<T> & ({
3135
+ type CrudPageProps<T> = CrudPageBase<T> & {
3136
+ /**
3137
+ * Les props du `PageHeader`. Sans `actions`, composées de
3138
+ * `headerActions` et du bouton de création. `className` s'ajoute.
3139
+ */
3140
+ pageHeaderProps?: Partial<Omit<PageHeaderProps, "actions">>;
3141
+ /**
3142
+ * Les props du bouton de création. Sans `onClick`, qui ouvre le
3143
+ * formulaire, ni `children` : le libellé passe par
3144
+ * `operations.create.label`.
3145
+ */
3146
+ createButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children">>;
3147
+ /** Les props du bouton de suppression groupée. Sans `onClick`. */
3148
+ bulkDeleteButtonProps?: Partial<Omit<ButtonProps, "onClick">>;
3149
+ /**
3150
+ * Les props de la `Pagination` — `jumpTo`, `compact`, `siblingCount`.
3151
+ * Sans `page`, `totalPages` ni `onPageChange`, qui ont leurs props ici.
3152
+ */
3153
+ paginationProps?: Partial<Omit<PaginationProps, "page" | "totalPages" | "onPageChange">>;
3154
+ /** Les props des `Modal` de formulaire et de détail — voir `CrudModalProps`. */
3155
+ modalProps?: CrudModalProps;
3156
+ /** Les props du `Form` des boîtes — voir `CrudFormProps`. */
3157
+ formProps?: CrudFormProps;
3158
+ /** Les props de la vue de détail par défaut — voir `CrudDescriptionsProps`. */
3159
+ descriptionsProps?: CrudDescriptionsProps;
3160
+ } & ({
2316
3161
  /**
2317
3162
  * La ressource, déclarée une fois avec `defineResource`.
2318
3163
  *
@@ -2336,7 +3181,7 @@ type CrudPageProps<T> = CrudPageBase<T> & ({
2336
3181
  *
2337
3182
  * Ici, fournir le gestionnaire suffit. Ne pas le fournir retire l'action.
2338
3183
  */
2339
- declare function CrudPage<T>({ resource, title, description, eyebrow, headingLevel, columns: colonnesFournies, data, getRowKey: cleFournie, onCreate, onView, onEdit, onDelete, fields: champsFournis, onSubmit, validate: validationFournie, createDefaults, toFormValues, detail, dialog, operations, extraRowActions, onBulkDelete, can, headerActions, toolbar, searchKeys: clesDeRecherche, searchPlaceholder, onSearch, searchDelay, loading, error, onRetry, empty, page, totalPages, onPageChange, pageSize, onPageSizeChange, pageSizeOptions, table, children, className, }: CrudPageProps<T>): react_jsx_runtime.JSX.Element;
3184
+ declare function CrudPage<T>({ resource, title, description, eyebrow, headingLevel, columns: colonnesFournies, data, getRowKey: cleFournie, onCreate, onView, onEdit, onDelete, fields: champsFournis, onSubmit, validate: validationFournie, createDefaults, toFormValues, detail, dialog, operations, extraRowActions, onBulkDelete, can, headerActions, toolbar, searchKeys: clesDeRecherche, searchPlaceholder, onSearch, searchDelay, loading, error, onRetry, empty, page, totalPages, onPageChange, pageSize, onPageSizeChange, pageSizeOptions, table, children, className, pageHeaderProps, createButtonProps, bulkDeleteButtonProps, paginationProps, modalProps, formProps, descriptionsProps, }: CrudPageProps<T>): react_jsx_runtime.JSX.Element;
2340
3185
 
2341
3186
  /**
2342
3187
  * L'état du tableau dans la barre d'adresse.
@@ -2425,7 +3270,7 @@ declare function useDataTableQuery(options?: UseDataTableQueryOptions): TableQue
2425
3270
  * elle filtre les lignes déjà chargées — ce qui suffit tant que tout tient
2426
3271
  * sur une page.
2427
3272
  */
2428
- declare function DataTable<T>({ columns, data, getRowKey, title, description, toolbar, actions, searchKeys, searchPlaceholder, onSearch, searchDelay, layout, maxHeight, stickyHeader, density, striped, bordered, rowActions, inlineActionsLimit, actionsHeader, actionsDisplay, can, view: viewProp, defaultView, onViewChange, showViewToggle, responsive, cardsBreakpoint, renderCard, loading, skeletonRows, error, onRetry, empty, selectable, selectedKeys: selectedProp, defaultSelectedKeys, onSelectionChange, isRowSelectable, selectionActions, sort, onSortChange, onRowClick, rowClassName, caption, className, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
3273
+ declare function DataTable<T>({ columns, data, getRowKey, title, description, toolbar, actions, searchKeys, searchPlaceholder, onSearch, searchDelay, searchInputProps, layout, maxHeight, stickyHeader, density, striped, bordered, rowActions, inlineActionsLimit, actionsHeader, actionsDisplay, rowActionButtonProps, rowActionIconButtonProps, rowActionsMenuProps, confirmDialogProps, can, view: viewProp, defaultView, onViewChange, showViewToggle, responsive, cardsBreakpoint, renderCard, loading, skeletonRows, skeletonProps, error, onRetry, errorStateProps, empty, emptyStateProps, selectable, selectedKeys: selectedProp, defaultSelectedKeys, onSelectionChange, isRowSelectable, checkboxProps, selectionActions, sort, onSortChange, onRowClick, rowClassName, caption, className, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
2429
3274
 
2430
3275
  type DateRangeValue = CalendarRangeValue;
2431
3276
  interface DateRangePickerProps extends Pick<CalendarProps, "locale" | "firstDayOfWeek" | "disabledDate" | "cellRender" | "showWeek"> {
@@ -2434,10 +3279,14 @@ interface DateRangePickerProps extends Pick<CalendarProps, "locale" | "firstDayO
2434
3279
  onValueChange?: (value: DateRangeValue) => void;
2435
3280
  min?: string;
2436
3281
  max?: string;
3282
+ /** Par défaut, « Date de début » de la locale SIA. */
2437
3283
  startLabel?: string;
3284
+ /** Par défaut, « Date de fin » de la locale SIA. */
2438
3285
  endLabel?: string;
2439
3286
  allowClear?: boolean;
2440
3287
  placement?: OverlayPlacement;
3288
+ /** Réglages du panneau flottant — décalage, marge au bord, classe. */
3289
+ overlayProps?: Partial<Omit<OverlayProps, "open" | "anchorRef" | "onOpenChange" | "children">>;
2441
3290
  tone?: ComponentTone;
2442
3291
  invalid?: boolean;
2443
3292
  disabled?: boolean;
@@ -2450,7 +3299,7 @@ interface DateRangePickerProps extends Pick<CalendarProps, "locale" | "firstDayO
2450
3299
  * faut alors décider lequel des deux avait tort. Ici les deux bornes sont
2451
3300
  * une seule valeur, et le calendrier les tient dans l'ordre.
2452
3301
  */
2453
- declare function DateRangePicker({ value, defaultValue, onValueChange, min, max, startLabel, endLabel, allowClear, placement, tone, invalid, disabled, locale, firstDayOfWeek, disabledDate, cellRender, showWeek, className }: DateRangePickerProps): react_jsx_runtime.JSX.Element;
3302
+ declare function DateRangePicker({ value, defaultValue, onValueChange, min, max, startLabel: startLabelProp, endLabel: endLabelProp, allowClear, placement, overlayProps, tone, invalid, disabled, locale: localeProp, firstDayOfWeek, disabledDate, cellRender, showWeek, className }: DateRangePickerProps): react_jsx_runtime.JSX.Element;
2454
3303
 
2455
3304
  interface DateRangePreset {
2456
3305
  label: ReactNode;
@@ -2461,6 +3310,8 @@ interface DateRangeFilterProps {
2461
3310
  onValueChange: (value: DateRangeValue) => void;
2462
3311
  presets?: DateRangePreset[];
2463
3312
  onClear?: () => void;
3313
+ /** Réglages du sélecteur de période — bornes, libellés, jours désactivés. */
3314
+ dateRangePickerProps?: Partial<Omit<DateRangePickerProps, "value" | "defaultValue" | "onValueChange">>;
2464
3315
  className?: string;
2465
3316
  }
2466
3317
  /**
@@ -2470,29 +3321,7 @@ interface DateRangeFilterProps {
2470
3321
  * l'exercice — et les proposer évite de saisir deux dates pour la question
2471
3322
  * que tout le monde pose en premier.
2472
3323
  */
2473
- declare function DateRangeFilter({ value, onValueChange, presets, onClear, className }: DateRangeFilterProps): react_jsx_runtime.JSX.Element;
2474
-
2475
- interface DescriptionItem {
2476
- key: string;
2477
- label: ReactNode;
2478
- value: ReactNode;
2479
- span?: 1 | 2 | 3;
2480
- }
2481
- interface DescriptionsProps {
2482
- items: DescriptionItem[];
2483
- title?: ReactNode;
2484
- columns?: 1 | 2 | 3;
2485
- bordered?: boolean;
2486
- className?: string;
2487
- }
2488
- /**
2489
- * Des paires libellé / valeur, en colonnes.
2490
- *
2491
- * C'est la forme d'une fiche en lecture — ce qu'un formulaire montre quand
2492
- * il n'y a rien à saisir. `span` laisse une valeur longue occuper toute la
2493
- * ligne plutôt que d'être coupée dans une colonne étroite.
2494
- */
2495
- declare function Descriptions({ items, title, columns, bordered, className }: DescriptionsProps): react_jsx_runtime.JSX.Element;
3324
+ declare function DateRangeFilter({ value, onValueChange, presets, onClear, dateRangePickerProps, className }: DateRangeFilterProps): react_jsx_runtime.JSX.Element;
2496
3325
 
2497
3326
  interface DividerProps extends HTMLAttributes<HTMLDivElement> {
2498
3327
  orientation?: "horizontal" | "vertical";
@@ -2507,135 +3336,8 @@ interface DividerProps extends HTMLAttributes<HTMLDivElement> {
2507
3336
  */
2508
3337
  declare function Divider({ orientation, decorative, className, ...props }: DividerProps): react_jsx_runtime.JSX.Element;
2509
3338
 
2510
- /** Ce que la réf impérative expose — ouvrir un tiroir depuis l'extérieur. */
2511
- type DrawerRef = {
2512
- open: () => void;
2513
- close: () => void;
2514
- toggle: () => void;
2515
- isOpen: () => boolean;
2516
- };
2517
- type DrawerPosition = "left" | "right" | "top" | "bottom";
2518
- type DrawerSize = "sm" | "md" | "lg" | "xl";
2519
- interface DrawerProps extends React.HTMLAttributes<HTMLDivElement> {
2520
- open?: boolean;
2521
- defaultOpen?: boolean;
2522
- onOpenChange?: (open: boolean) => void;
2523
- position?: DrawerPosition;
2524
- size?: DrawerSize;
2525
- closeOnOutsideClick?: boolean;
2526
- closeOnEsc?: boolean;
2527
- }
2528
- /** Alias historique, attendu par les composants venus du registre. */
2529
- type IDrawerProps = DrawerProps;
2530
- type DrawerComponent = ForwardRefExoticComponent<IDrawerProps & RefAttributes<DrawerRef>> & {
2531
- Header: typeof DrawerHeader;
2532
- Body: typeof DrawerBody;
2533
- Footer: typeof DrawerFooter;
2534
- Title: typeof DrawerTitle;
2535
- Close: typeof DrawerClose;
2536
- };
2537
- /**
2538
- * Un panneau qui entre par un bord.
2539
- *
2540
- * Il sert là où une boîte modale serait trop : un filtre qu'on ajuste en
2541
- * regardant la liste derrière, un formulaire qu'on remplit sans perdre sa
2542
- * place. Le focus y est enfermé tant qu'il est ouvert, comme dans un
2543
- * modal — sans quoi la tabulation continue dans la page cachée.
2544
- */
2545
- declare const Drawer: DrawerComponent;
2546
- declare function DrawerHeader({ children }: {
2547
- children: React.ReactNode;
2548
- }): react_jsx_runtime.JSX.Element;
2549
- declare function DrawerTitle({ children }: {
2550
- children: React.ReactNode;
2551
- }): react_jsx_runtime.JSX.Element;
2552
- declare function DrawerBody({ children }: {
2553
- children: React.ReactNode;
2554
- }): react_jsx_runtime.JSX.Element;
2555
- declare function DrawerFooter({ children }: {
2556
- children: React.ReactNode;
2557
- }): react_jsx_runtime.JSX.Element;
2558
- declare function DrawerClose(): react_jsx_runtime.JSX.Element | null;
2559
-
2560
- interface MenuItem {
2561
- key: string;
2562
- label: ReactNode;
2563
- icon?: ReactNode;
2564
- /** Un raccourci affiché à droite. Purement indicatif : rien n'est écouté. */
2565
- shortcut?: string;
2566
- disabled?: boolean;
2567
- danger?: boolean;
2568
- /** Affiche une coche. `undefined` : l'entrée n'est pas cochable. */
2569
- checked?: boolean;
2570
- description?: ReactNode;
2571
- onSelect?: () => void;
2572
- }
2573
- interface MenuSeparator {
2574
- key: string;
2575
- type: "separator";
2576
- }
2577
- interface MenuLabel {
2578
- key: string;
2579
- type: "label";
2580
- label: ReactNode;
2581
- }
2582
- type MenuEntry = MenuItem | MenuSeparator | MenuLabel;
2583
- interface MenuListProps {
2584
- items: MenuEntry[];
2585
- onSelect: (item: MenuItem) => void;
2586
- onClose: () => void;
2587
- /** Index actif, piloté par le parent pour que le clavier suive. */
2588
- activeIndex: number;
2589
- onActiveIndexChange: (index: number) => void;
2590
- id?: string | undefined;
2591
- className?: string | undefined;
2592
- }
2593
- /**
2594
- * Le panneau seul, sans déclencheur.
2595
- *
2596
- * Extrait parce que `DropdownMenu` et `ContextMenu` n'ont en commun que lui :
2597
- * tout le reste — l'ancrage, le geste d'ouverture — diffère.
2598
- */
2599
- declare function MenuList({ items, onSelect, onClose, activeIndex, onActiveIndexChange, id, className, }: MenuListProps): react_jsx_runtime.JSX.Element;
2600
- interface DropdownMenuProps {
2601
- items: MenuEntry[];
2602
- children: ReactElement<{
2603
- onClick?: () => void;
2604
- "aria-expanded"?: boolean;
2605
- }>;
2606
- onSelect?: (item: MenuItem) => void;
2607
- open?: boolean;
2608
- defaultOpen?: boolean;
2609
- onOpenChange?: (open: boolean) => void;
2610
- placement?: OverlayPlacement;
2611
- matchTriggerWidth?: boolean;
2612
- className?: string;
2613
- }
2614
- /**
2615
- * Un menu accroché à un bouton.
2616
- *
2617
- * Il repose sur `Overlay` : le repositionnement quand la place manque en bas,
2618
- * la fermeture au clic extérieur et à Échap sont déjà là et ne sont pas
2619
- * réécrites ici.
2620
- */
2621
- declare function DropdownMenu({ items, children, onSelect, open: openProp, defaultOpen, onOpenChange, placement, matchTriggerWidth, className, }: DropdownMenuProps): react_jsx_runtime.JSX.Element;
2622
- interface ContextMenuProps {
2623
- items: MenuEntry[];
2624
- children: ReactNode;
2625
- onSelect?: (item: MenuItem) => void;
2626
- className?: string;
2627
- }
2628
- /**
2629
- * Le même menu, ouvert au clic droit sur une zone.
2630
- *
2631
- * L'ancre est un point, pas un élément : un repère de taille nulle est posé
2632
- * aux coordonnées du pointeur et confié à `Overlay`, qui ne voit pas la
2633
- * différence. C'est ce qui évite un second moteur de placement.
2634
- */
2635
- declare function ContextMenu({ items, children, onSelect, className, }: ContextMenuProps): react_jsx_runtime.JSX.Element;
2636
-
2637
3339
  interface DurationDisplayProps {
2638
- milliseconds: number;
3340
+ milliseconds: number; /** La langue des nombres et des unités. Par défaut, celle de la locale SIA. */
2639
3341
  locale?: string;
2640
3342
  style?: "short" | "long" | "clock";
2641
3343
  className?: string;
@@ -2646,24 +3348,7 @@ interface DurationDisplayProps {
2646
3348
  * Trois styles pour trois usages : `clock` pour un chronomètre qu'on lit en
2647
3349
  * continu, `short` pour une colonne de tableau, `long` pour une phrase.
2648
3350
  */
2649
- declare function DurationDisplay({ milliseconds, locale, style, className }: DurationDisplayProps): react_jsx_runtime.JSX.Element;
2650
-
2651
- interface EmptyStateProps {
2652
- icon?: ReactNode;
2653
- title: ReactNode;
2654
- description?: ReactNode;
2655
- action?: ReactNode;
2656
- compact?: boolean;
2657
- className?: string;
2658
- }
2659
- /**
2660
- * Ce qu'on montre quand il n'y a rien.
2661
- *
2662
- * Une liste vide sans explication ressemble à un chargement bloqué. Elle
2663
- * porte donc une action : le vide initial est le meilleur moment pour
2664
- * proposer de créer le premier élément.
2665
- */
2666
- declare function EmptyState({ icon, title, description, action, compact, className }: EmptyStateProps): react_jsx_runtime.JSX.Element;
3351
+ declare function DurationDisplay({ milliseconds, locale: localeProp, style, className }: DurationDisplayProps): react_jsx_runtime.JSX.Element;
2667
3352
 
2668
3353
  interface EntityMetaProps {
2669
3354
  createdAt?: Date | string | number;
@@ -2672,6 +3357,7 @@ interface EntityMetaProps {
2672
3357
  updatedBy?: ReactNode;
2673
3358
  identifier?: string;
2674
3359
  status?: ReactNode;
3360
+ /** La langue des dates. Par défaut, celle de la locale SIA. */
2675
3361
  locale?: string;
2676
3362
  className?: string;
2677
3363
  }
@@ -2682,65 +3368,208 @@ interface EntityMetaProps {
2682
3368
  * c'est la première chose qu'on demande à un client, et une chaîne de
2683
3369
  * trente-six caractères ne se dicte pas.
2684
3370
  */
2685
- declare function EntityMeta({ createdAt, updatedAt, createdBy, updatedBy, identifier, status, locale, className }: EntityMetaProps): react_jsx_runtime.JSX.Element;
3371
+ declare function EntityMeta({ createdAt, updatedAt, createdBy, updatedBy, identifier, status, locale: localeProp, className }: EntityMetaProps): react_jsx_runtime.JSX.Element;
2686
3372
 
2687
- interface ErrorStateProps {
3373
+ interface PopoverProps {
3374
+ content: ReactNode;
2688
3375
  title?: ReactNode;
2689
- description?: ReactNode;
2690
- error?: unknown;
2691
- action?: ReactNode;
2692
- onRetry?: () => void;
2693
- retryLabel?: string;
2694
- compact?: boolean;
3376
+ children: ReactElement<{
3377
+ onClick?: () => void;
3378
+ "aria-expanded"?: boolean;
3379
+ }>;
3380
+ open?: boolean;
3381
+ defaultOpen?: boolean;
3382
+ onOpenChange?: (open: boolean) => void;
3383
+ placement?: OverlayPlacement;
3384
+ /** Réglages du panneau flottant — décalage, marge au bord, rôle, classe. */
3385
+ overlayProps?: Partial<Omit<OverlayProps, "open" | "anchorRef" | "onOpenChange" | "children">>;
3386
+ trigger?: "click" | "hover";
3387
+ variant?: "solid" | "outline";
3388
+ tone?: ComponentTone;
3389
+ disabled?: boolean;
2695
3390
  className?: string;
2696
3391
  }
2697
3392
  /**
2698
- * Un échec, et de quoi en sortir.
3393
+ * Un panneau attaché à un élément, avec du contenu qu'on peut viser.
2699
3394
  *
2700
- * `error` accepte n'importe quoi : une `Error`, une réponse HTTP, une
2701
- * chaîne. Ce qui arrive d'un appel réseau n'a pas de forme garantie, et
2702
- * exiger un type ferait écrire un `try` autour de chaque affichage
2703
- * d'erreur.
3395
+ * À la différence d'une infobulle, il reste ouvert : on y met un lien, un
3396
+ * bouton, un petit formulaire. Une infobulle qui contient un bouton est une
3397
+ * infobulle cassée — elle disparaît dès qu'on va vers lui.
2704
3398
  */
2705
- declare function ErrorState({ title: titleProp, description, error, action, onRetry, retryLabel: retryLabelProp, compact, className }: ErrorStateProps): react_jsx_runtime.JSX.Element;
3399
+ declare function Popover({ content, title, children, open: openProp, defaultOpen, onOpenChange, placement, overlayProps, trigger, variant, tone, disabled, className }: PopoverProps): react_jsx_runtime.JSX.Element;
2706
3400
 
2707
- interface CalendarEvent {
2708
- id: string;
2709
- date: string;
2710
- title: string;
2711
- tone?: ComponentTone;
2712
- }
2713
- interface EventCalendarProps extends Omit<CalendarProps, "renderDay"> {
2714
- events: CalendarEvent[];
3401
+ /** Un événement du calendrier. Les champs métier en plus passent tels quels. */
3402
+ interface CalendarEvent extends Omit<CalendarEventInput, "start"> {
3403
+ /** `2026-09-30` pour la journée, `2026-09-30T14:30` pour une heure. */
3404
+ start?: string | undefined;
3405
+ /** @deprecated Ancien nom de `start`, gardé pour les projets existants. */
3406
+ date?: string | undefined;
3407
+ tone?: ComponentTone | undefined;
3408
+ description?: ReactNode | undefined;
3409
+ location?: ReactNode | undefined;
3410
+ }
3411
+ /**
3412
+ * Les libellés du calendrier : le groupe `eventCalendar` de la locale SIA.
3413
+ * « +N autres » se décline en `more_one` / `more_other`, avec `{count}`.
3414
+ */
3415
+ type EventCalendarLabels = EventCalendarMessages;
3416
+ interface EventCalendarProps<T extends CalendarEvent = CalendarEvent> {
3417
+ events: T[];
3418
+ /** La vue affichée — mois, semaine, agenda. */
3419
+ view?: CalendarView;
3420
+ defaultView?: CalendarView;
3421
+ onViewChange?: (view: CalendarView) => void;
3422
+ /** Les vues proposées. Une seule masque le sélecteur. */
3423
+ views?: CalendarView[];
3424
+ /**
3425
+ * L'habillage de la grille. `bordered` : des cases tracées, comme un
3426
+ * agenda papier. `minimal` : aucune bordure intérieure, les jours se
3427
+ * lisent à leur numéro. `soft` : des cases sur fond teinté, séparées par
3428
+ * des blancs.
3429
+ */
3430
+ variant?: "bordered" | "minimal" | "soft";
3431
+ /** Le rendu des événements : fond léger, plein, ou contour. */
3432
+ eventVariant?: "soft" | "solid" | "outline";
3433
+ /** `compact` resserre les cases et la grille horaire. */
3434
+ density?: "comfortable" | "compact";
3435
+ /** L'heure affichée en haut de la grille horaire à l'ouverture. 8 h par défaut. */
3436
+ scrollToHour?: number;
3437
+ /** Un jour de la période affichée (`2026-09-30`). Aujourd'hui par défaut. */
3438
+ date?: string;
3439
+ defaultDate?: string;
3440
+ onDateChange?: (date: string) => void;
3441
+ /** @deprecated Ancien nom de `defaultDate`. */
3442
+ defaultValue?: string;
3443
+ /** @deprecated Ancien nom de `defaultDate`, au mois près. */
3444
+ defaultMonth?: string;
3445
+ /**
3446
+ * La période visible, bornes incluses, à chaque changement de vue ou de
3447
+ * période — et au premier affichage. C'est elle qu'on demande au serveur.
3448
+ */
3449
+ onRangeChange?: (range: {
3450
+ start: string;
3451
+ end: string;
3452
+ }, view: CalendarView) => void;
3453
+ /**
3454
+ * Un clic sur un jour, hors événement : le moment de créer. Dans la
3455
+ * grille horaire, `time` donne la demi-heure visée (`14:30`).
3456
+ */
3457
+ onDateClick?: (date: string, time?: string) => void;
3458
+ onEventClick?: (event: T) => void;
3459
+ /** Événements visibles par case en vue mois ; le reste passe dans « +N ». */
2715
3460
  maxEventsPerDay?: number;
2716
- onEventClick?: (event: CalendarEvent) => void;
3461
+ firstDayOfWeek?: 0 | 1;
3462
+ /** La langue des dates. Par défaut, celle de la locale SIA. */
3463
+ locale?: string;
3464
+ /** Remplace le contenu d'un événement. Le bouton qui l'entoure reste. */
3465
+ renderEvent?: (event: T, placement: DayEvent<T & CalendarEventInput>) => ReactNode;
3466
+ /** Actions à droite de la barre : « Nouvel événement », un filtre. */
3467
+ toolbarActions?: ReactNode;
3468
+ loading?: boolean;
3469
+ /** Remplace, clé par clé, les textes du groupe `eventCalendar` de la locale. */
3470
+ labels?: Partial<EventCalendarLabels>;
3471
+ /** Le bouton « Aujourd'hui ». */
3472
+ toolbarButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children">>;
3473
+ /** Le sélecteur de vue — un `RadioGroup` en boutons. */
3474
+ viewSwitchProps?: Partial<Omit<RadioGroupProps, "value" | "defaultValue" | "onValueChange" | "children">>;
3475
+ /** Chaque bouton de vue. */
3476
+ viewButtonProps?: Partial<Omit<RadioButtonProps, "value" | "children">>;
3477
+ /** Le bouton « +N autres » d'une case chargée. */
3478
+ moreButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children">>;
3479
+ /** L'agenda vide. */
3480
+ emptyStateProps?: Partial<EmptyStateProps>;
3481
+ /** Le témoin de chargement de la barre. */
3482
+ spinnerProps?: Partial<Omit<SpinnerProps, "label">>;
3483
+ /** Les flèches de période. */
3484
+ navButtonProps?: Partial<Omit<IconButtonProps, "onClick" | "label" | "icon">>;
3485
+ /** La liste complète d'un jour chargé (« +N autres »). */
3486
+ popoverProps?: Partial<Omit<PopoverProps, "content" | "children">>;
3487
+ className?: string;
2717
3488
  }
2718
3489
  /**
2719
- * Un calendrier qui porte des événements.
3490
+ * Un calendrier d'événements : mois, semaine, agenda.
2720
3491
  *
2721
- * `maxEventsPerDay` plafonne l'affichage : une journée à douze rendez-vous
2722
- * déformerait toute la grille, et les douze ne se lisent de toute façon pas
2723
- * dans une case de calendrier.
3492
+ * Il affiche et signale ; il ne gère pas. Un clic sur un jour appelle
3493
+ * `onDateClick`, un clic sur un événement `onEventClick` — `EventManager`
3494
+ * s'y branche pour créer, consulter, modifier et supprimer. Les données
3495
+ * viennent du serveur : `onRangeChange` donne la période à charger.
3496
+ *
3497
+ * Étroit, la grille du mois n'affiche plus que des points de couleur, et les
3498
+ * événements du jour choisi s'affichent dessous : une case de 45 px ne se lit
3499
+ * pas, une liste si.
2724
3500
  */
2725
- declare function EventCalendar({ events, maxEventsPerDay, onEventClick, ...props }: EventCalendarProps): react_jsx_runtime.JSX.Element;
3501
+ declare function EventCalendar<T extends CalendarEvent = CalendarEvent>({ events, view: viewProp, defaultView, onViewChange, views, variant, eventVariant, density, scrollToHour, date: dateProp, defaultDate, defaultValue, defaultMonth, onDateChange, onRangeChange, onDateClick, onEventClick, maxEventsPerDay, firstDayOfWeek, locale: localeProp, renderEvent, toolbarActions, loading, labels: labelsProp, toolbarButtonProps, viewSwitchProps, viewButtonProps, moreButtonProps, emptyStateProps, spinnerProps, navButtonProps, popoverProps, className, }: EventCalendarProps<T>): react_jsx_runtime.JSX.Element;
2726
3502
 
2727
- interface FiltersBarProps {
2728
- search?: ReactNode;
2729
- filters?: ReactNode;
2730
- actions?: ReactNode;
2731
- activeCount?: number;
2732
- onReset?: () => void;
2733
- resetLabel?: string;
3503
+ /** Ce que le formulaire rend : un événement prêt à envoyer, champs métier compris. */
3504
+ interface EventDraft {
3505
+ title: string;
3506
+ start: string;
3507
+ end?: string | undefined;
3508
+ allDay: boolean;
3509
+ tone?: ComponentTone | undefined;
3510
+ location?: string | undefined;
3511
+ description?: string | undefined;
3512
+ /** Les champs déclarés dans `extraFields`, sous leur nom. */
3513
+ [champ: string]: unknown;
3514
+ }
3515
+ type Resultat = FormSubmitResult<FormShape> | Promise<FormSubmitResult<FormShape>>;
3516
+ /** Les libellés du gestionnaire : le groupe `eventManager` de la locale SIA. */
3517
+ type EventManagerLabels = EventManagerMessages;
3518
+ interface EventManagerProps<T extends CalendarEvent = CalendarEvent> {
3519
+ events: T[];
3520
+ /** Absent : pas de création. Rendre `{ champ: message }` garde le formulaire ouvert. */
3521
+ onCreate?: (draft: EventDraft) => Resultat;
3522
+ /** Absent : les événements se consultent sans se modifier. */
3523
+ onUpdate?: (event: T, draft: EventDraft) => Resultat;
3524
+ /** Absent : pas de suppression. Confirmée d'office. */
3525
+ onDelete?: (event: T) => void | Promise<void>;
3526
+ /** Des champs métier en plus : participants, salle, rappel. Leurs valeurs arrivent dans le brouillon. */
3527
+ extraFields?: FormEntry[];
3528
+ /** Les valeurs de départ de ces champs, et comment les relire sur un événement. */
3529
+ extraDefaults?: FormShape;
3530
+ /** Les couleurs proposées. Par défaut, les tons du système, nommés par la locale. */
3531
+ toneOptions?: Array<{
3532
+ value: ComponentTone;
3533
+ label: string;
3534
+ }>;
3535
+ /** Remplace le contenu de la fiche d'un événement. */
3536
+ renderDetail?: (event: T) => ReactNode;
3537
+ /** Remplace, clé par clé, les textes du groupe `eventManager` de la locale. */
3538
+ labels?: Partial<EventManagerLabels>;
3539
+ /** La langue des dates de la fiche. Par défaut, celle de la locale SIA. */
3540
+ locale?: string;
3541
+ /** Le calendrier lui-même : vues, variantes, période, rendu des événements. */
3542
+ calendarProps?: Partial<Omit<EventCalendarProps<T>, "events" | "onDateClick" | "onEventClick">>;
3543
+ /** Les boîtes de fiche et de formulaire. */
3544
+ modalProps?: Partial<Omit<ModalProps, "open" | "onOpenChange" | "children" | "title" | "footer">>;
3545
+ /** Le formulaire, hors champs, valeurs et envoi qu'il reçoit d'ici. */
3546
+ formProps?: Partial<Omit<FormProps, "fields" | "form" | "defaultValues" | "validate" | "onSubmit">>;
3547
+ /** La confirmation de suppression. */
3548
+ confirmDialogProps?: Partial<Omit<ConfirmDialogProps, "open" | "onOpenChange" | "onConfirm">>;
3549
+ /** Le bouton « Nouvel événement » de la barre. */
3550
+ createButtonProps?: Partial<Omit<ButtonProps, "onClick">>;
3551
+ /** La fiche d'un événement, hors rubriques qu'elle tire de l'événement. */
3552
+ descriptionsProps?: Partial<Omit<DescriptionsProps, "items">>;
3553
+ /** La pastille d'une couleur, dans la fiche et dans le choix des couleurs. */
3554
+ toneBadgeProps?: Partial<Omit<BadgeProps, "tone" | "children">>;
2734
3555
  className?: string;
2735
3556
  }
2736
3557
  /**
2737
- * La barre au-dessus d'une liste : recherche, filtres, actions.
3558
+ * Un calendrier où l'on gère ses événements.
2738
3559
  *
2739
- * `activeCount` affiche combien de filtres sont en vigueur. Sans ce compte,
2740
- * une liste filtrée ressemble à une liste vide, et l'on cherche la panne
2741
- * avant de penser au filtre posé la veille.
3560
+ * Il assemble ce qui existe — \`EventCalendar\` pour voir, \`Modal\` et
3561
+ * \`Form\` pour saisir, \`ConfirmDialog\` pour supprimer — et tient le reste :
3562
+ *
3563
+ * - un clic sur un jour ouvre la création à cette date, et à la demi-heure
3564
+ * visée dans la grille horaire ;
3565
+ * - un clic sur un événement ouvre sa fiche, d'où l'on modifie ou supprime ;
3566
+ * - un refus du serveur garde le formulaire ouvert, erreurs sous les champs.
3567
+ *
3568
+ * Les données restent à l'appelant : `onCreate`, `onUpdate` et `onDelete`
3569
+ * reçoivent un brouillon prêt à envoyer, et le calendrier affiche ce qu'on
3570
+ * lui repasse dans `events`.
2742
3571
  */
2743
- declare function FiltersBar({ search, filters, actions, activeCount, onReset, resetLabel: resetLabelProp, className }: FiltersBarProps): react_jsx_runtime.JSX.Element;
3572
+ declare function EventManager<T extends CalendarEvent = CalendarEvent>({ events, onCreate, onUpdate, onDelete, extraFields, extraDefaults, toneOptions: toneOptionsProp, renderDetail, labels: labelsProp, locale: localeProp, calendarProps, modalProps, formProps, confirmDialogProps, createButtonProps, descriptionsProps, toneBadgeProps, className, }: EventManagerProps<T>): react_jsx_runtime.JSX.Element;
2744
3573
 
2745
3574
  interface HoverCardProps {
2746
3575
  content: ReactNode;
@@ -2756,6 +3585,8 @@ interface HoverCardProps {
2756
3585
  /** Délai avant fermeture, le temps d'atteindre le panneau à la souris. */
2757
3586
  closeDelay?: number;
2758
3587
  placement?: OverlayPlacement;
3588
+ /** Réglages du panneau flottant — décalage, marge au bord, rôle, classe. */
3589
+ overlayProps?: Partial<Omit<OverlayProps, "open" | "anchorRef" | "onOpenChange" | "children">>;
2759
3590
  open?: boolean;
2760
3591
  onOpenChange?: (open: boolean) => void;
2761
3592
  width?: number | string;
@@ -2768,25 +3599,7 @@ interface HoverCardProps {
2768
3599
  * d'œil, celui-là porte du contenu — une fiche, un résumé, une image — que
2769
3600
  * l'on peut vouloir survoler à son tour, voire sélectionner.
2770
3601
  */
2771
- declare function HoverCard({ content, children, openDelay, closeDelay, placement, open: openProp, onOpenChange, width, className, }: HoverCardProps): react_jsx_runtime.JSX.Element;
2772
-
2773
- interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
2774
- label: string;
2775
- icon: ReactNode;
2776
- variant?: "solid" | "outline" | "ghost";
2777
- size?: "sm" | "md" | "lg";
2778
- radius?: "default" | "none" | "sm" | "lg" | "full";
2779
- tooltip?: Omit<TooltipProps, "children">;
2780
- }
2781
- /**
2782
- * Une action réduite à son icône.
2783
- *
2784
- * `label` est obligatoire : une icône seule n'a pas de nom, et un lecteur
2785
- * d'écran annoncerait « bouton » sans dire lequel. Le libellé sert aussi
2786
- * d'infobulle — ce que l'icône signifie doit rester atteignable à la
2787
- * souris comme au clavier.
2788
- */
2789
- declare const IconButton: react.ForwardRefExoticComponent<IconButtonProps & react.RefAttributes<HTMLButtonElement>>;
3602
+ declare function HoverCard({ content, children, openDelay, closeDelay, placement, overlayProps, open: openProp, onOpenChange, width, className, }: HoverCardProps): react_jsx_runtime.JSX.Element;
2790
3603
 
2791
3604
  type IconProps = SVGProps<SVGSVGElement>;
2792
3605
  declare function CalendarIcon(props: IconProps): react_jsx_runtime.JSX.Element;
@@ -2820,6 +3633,8 @@ declare function KeyIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2820
3633
  declare function LockIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2821
3634
  declare function LogOutIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2822
3635
  declare function PencilIcon(props: IconProps): react_jsx_runtime.JSX.Element;
3636
+ declare function SunIcon(props: IconProps): react_jsx_runtime.JSX.Element;
3637
+ declare function MoonIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2823
3638
 
2824
3639
  interface InputNumberProps extends Omit<InputProps, "value" | "defaultValue" | "onChange" | "type" | "right"> {
2825
3640
  value?: number | null;
@@ -2845,6 +3660,200 @@ interface InputNumberProps extends Omit<InputProps, "value" | "defaultValue" | "
2845
3660
  */
2846
3661
  declare const InputNumber: react.ForwardRefExoticComponent<InputNumberProps & react.RefAttributes<HTMLInputElement>>;
2847
3662
 
3663
+ interface ProgressProps {
3664
+ /** La valeur courante. Omise, la barre passe en indéterminé. */
3665
+ value?: number | undefined;
3666
+ max?: number;
3667
+ shape?: "bar" | "circle";
3668
+ tone?: ComponentTone;
3669
+ size?: ComponentSize;
3670
+ /** Épaisseur du trait, en pixels. Par défaut selon la taille. */
3671
+ thickness?: number | undefined;
3672
+ /** Affiche le pourcentage — au centre du cercle, en bout de barre. */
3673
+ showValue?: boolean;
3674
+ /** Remplace l'affichage par défaut. */
3675
+ format?: ((percent: number, value: number, max: number) => ReactNode) | undefined;
3676
+ label?: ReactNode;
3677
+ className?: string;
3678
+ }
3679
+ /**
3680
+ * L'avancement d'une tâche.
3681
+ *
3682
+ * Sans `value`, le composant passe en indéterminé plutôt que d'afficher zéro :
3683
+ * « je travaille » et « je n'ai rien fait » ne se ressemblent pas.
3684
+ */
3685
+ declare function Progress(props: ProgressProps): react_jsx_runtime.JSX.Element;
3686
+
3687
+ type StepStatus = "done" | "current" | "upcoming" | "error";
3688
+ interface StepItem {
3689
+ key: string;
3690
+ title: ReactNode;
3691
+ description?: ReactNode;
3692
+ icon?: ReactNode;
3693
+ /** Forcé au besoin; sinon déduit de `current`. */
3694
+ status?: StepStatus;
3695
+ disabled?: boolean;
3696
+ }
3697
+ interface StepsProps {
3698
+ items: StepItem[];
3699
+ /** Index de l'étape en cours. Ce qui précède est fait, ce qui suit à venir. */
3700
+ current?: number;
3701
+ orientation?: "horizontal" | "vertical";
3702
+ size?: "sm" | "md";
3703
+ /** Rend les étapes cliquables — pour revenir en arrière dans un tunnel. */
3704
+ onStepClick?: (item: StepItem, index: number) => void;
3705
+ className?: string;
3706
+ }
3707
+ /**
3708
+ * Une progression en étapes.
3709
+ *
3710
+ * Le trait entre deux étapes se remplit plutôt que de changer de couleur d'un
3711
+ * coup : c'est ce qui donne le sens de la marche, vers l'avant.
3712
+ */
3713
+ declare function Steps({ items, current, orientation, size, onStepClick, className, }: StepsProps): react_jsx_runtime.JSX.Element;
3714
+
3715
+ /** Le cycle de vie d'une opération asynchrone. */
3716
+ type JobStatus = "queued" | "running" | "succeeded" | "failed" | "cancelled";
3717
+ /** Un instant : une date ISO, un horodatage ou une `Date`. */
3718
+ type JobInstant = string | number | Date;
3719
+ /**
3720
+ * Les textes du composant, à remplacer au cas par cas. Leur valeur par défaut
3721
+ * vient du groupe `jobProgress` de la locale (`JobProgressMessages`) ; ici,
3722
+ * un texte peut aussi être un nœud, et `attempts` une fonction.
3723
+ */
3724
+ interface JobProgressLabels {
3725
+ queued: ReactNode;
3726
+ running: ReactNode;
3727
+ succeeded: ReactNode;
3728
+ failed: ReactNode;
3729
+ cancelled: ReactNode;
3730
+ /** « Essai 2 sur 3 », ou « Essai 2 » sans maximum connu. */
3731
+ attempts: (current: number, max?: number) => ReactNode;
3732
+ /** Le titre de l'encadré d'erreur. */
3733
+ errorTitle: ReactNode;
3734
+ retry: ReactNode;
3735
+ cancel: ReactNode;
3736
+ }
3737
+ interface JobProgressProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
3738
+ status: JobStatus;
3739
+ /** L'avancement, de 0 à 100. Absent pendant `queued`/`running` : indéterminé. */
3740
+ progress?: number;
3741
+ /** L'étape en cours : « Construction de l'image ». */
3742
+ step?: ReactNode;
3743
+ /** Les étapes de l'opération, affichées en liste ; `currentStep` la met en avant. */
3744
+ steps?: StepItem[];
3745
+ /** L'index de l'étape en cours dans `steps`. */
3746
+ currentStep?: number;
3747
+ /** L'essai en cours, et le nombre maximal quand il est connu. */
3748
+ attempts?: {
3749
+ current: number;
3750
+ max?: number;
3751
+ };
3752
+ startedAt?: JobInstant;
3753
+ /** Absent pendant `running` : la durée avance chaque seconde. */
3754
+ finishedAt?: JobInstant;
3755
+ /** Le message d'échec, affiché quand `status` vaut `failed`. */
3756
+ error?: ReactNode;
3757
+ /** Affiche « Relancer » quand l'opération a échoué. */
3758
+ onRetry?: () => void;
3759
+ /** Affiche « Annuler » tant que l'opération est en file ou en cours. */
3760
+ onCancel?: () => void;
3761
+ /** Un emplacement libre sous le reste : un journal, une sortie de commande. */
3762
+ logs?: ReactNode;
3763
+ title?: ReactNode;
3764
+ labels?: Partial<JobProgressLabels>;
3765
+ /** Le ton de chaque statut, pour la pastille et la barre. */
3766
+ statusTones?: Partial<Record<JobStatus, ComponentTone>>;
3767
+ /** Les props de la pastille de statut. Sans `value`, `tones` ni `labels`, tirés du statut. */
3768
+ statusBadgeProps?: Partial<Omit<StatusBadgeProps, "value" | "tones" | "labels">>;
3769
+ /** Les props de la barre. Sans `value`, tirée de `progress`. */
3770
+ progressProps?: Partial<Omit<ProgressProps, "value">>;
3771
+ /** Les props de la liste d'étapes. Sans `items` ni `current`. */
3772
+ stepsProps?: Partial<Omit<StepsProps, "items" | "current">>;
3773
+ /** Les props de la durée. Sans `milliseconds`, calculée des deux instants. */
3774
+ durationProps?: Partial<Omit<DurationDisplayProps, "milliseconds">>;
3775
+ /** Les props de l'encadré d'erreur. Sans `children`, qui est `error`. */
3776
+ alertProps?: Partial<Omit<AlertProps, "children">>;
3777
+ /** Les props du bouton « Relancer ». Sans `onClick`, qui est `onRetry`. */
3778
+ retryButtonProps?: Partial<Omit<ButtonProps, "onClick">>;
3779
+ /** Les props du bouton « Annuler ». Sans `onClick`, qui est `onCancel`. */
3780
+ cancelButtonProps?: Partial<Omit<ButtonProps, "onClick">>;
3781
+ }
3782
+ /**
3783
+ * Le suivi d'une opération asynchrone : un déploiement, un import, un export.
3784
+ *
3785
+ * Statut, étape, progression, essais, erreur et relance : chaque projet
3786
+ * recomposait ce motif avec les mêmes briques, et chacun oubliait une chose
3787
+ * différente — la durée figée pendant l'exécution, le bouton d'annulation
3788
+ * resté visible après l'échec. Le composant tranche ce qui s'affiche selon le
3789
+ * statut ; l'appelant ne fournit que l'état de l'opération.
3790
+ *
3791
+ * Pensé pour un tiroir de 28 à 40rem : dense, sur une colonne.
3792
+ */
3793
+ declare function JobProgress({ status, progress, step, steps, currentStep, attempts, startedAt, finishedAt, error, onRetry, onCancel, logs, title, labels: labelsProp, statusTones, statusBadgeProps, progressProps, stepsProps, durationProps, alertProps, retryButtonProps, cancelButtonProps, className, ...props }: JobProgressProps): react_jsx_runtime.JSX.Element;
3794
+
3795
+ interface ScrollAreaProps {
3796
+ children: ReactNode;
3797
+ /** Hauteur maximale. Au-delà, la zone défile. */
3798
+ maxHeight?: number | string;
3799
+ height?: number | string;
3800
+ orientation?: "vertical" | "horizontal" | "both";
3801
+ /**
3802
+ * Estompe le contenu aux bords tant qu'il reste quelque chose à faire
3803
+ * défiler. C'est le seul indice fiable quand la barre est fine ou masquée.
3804
+ */
3805
+ fade?: boolean;
3806
+ className?: string;
3807
+ }
3808
+ /**
3809
+ * Une zone défilante sobre.
3810
+ *
3811
+ * La barre reste celle du navigateur, seulement affinée : une barre
3812
+ * réimplémentée en JavaScript coûte un écouteur de défilement, deux mesures
3813
+ * par image et perd le défilement inertiel des pavés tactiles. Le seul ajout
3814
+ * est l'estompe des bords, qui ne demande qu'un booléen par côté.
3815
+ */
3816
+ declare function ScrollArea({ children, maxHeight, height, orientation, fade, className, }: ScrollAreaProps): react_jsx_runtime.JSX.Element;
3817
+
3818
+ interface JsonViewProps {
3819
+ /** Une valeur déjà analysée : objet, tableau, scalaire. */
3820
+ value?: unknown;
3821
+ /**
3822
+ * Un texte JSON, analysé ici. S'il est invalide, il s'affiche tel quel
3823
+ * sous une alerte discrète : une réponse serveur tronquée reste lisible.
3824
+ * Prioritaire sur `value`.
3825
+ */
3826
+ source?: string;
3827
+ /** Les niveaux ouverts au premier affichage. `2` par défaut. */
3828
+ defaultExpandDepth?: number;
3829
+ /** Faux : un simple bloc mis en forme, tout ouvert, sans bascule. */
3830
+ collapsible?: boolean;
3831
+ /** Au-delà, la zone défile. */
3832
+ maxHeight?: number | string;
3833
+ /** Vrai par défaut : un bouton copie le JSON mis en forme. */
3834
+ copyable?: boolean;
3835
+ copyLabel?: string;
3836
+ copiedLabel?: string;
3837
+ /** Le titre de l'alerte quand `source` ne s'analyse pas. */
3838
+ invalidLabel?: ReactNode;
3839
+ className?: string;
3840
+ /** Le bouton de copie. Son action et son libellé suivent la copie. */
3841
+ copyButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children">>;
3842
+ /** L'alerte d'un texte invalide. Son contenu est l'erreur d'analyse. */
3843
+ alertProps?: Partial<Omit<AlertProps, "children">>;
3844
+ /** La zone défilante. Sa hauteur maximale passe par `maxHeight`. */
3845
+ scrollAreaProps?: Partial<Omit<ScrollAreaProps, "children" | "maxHeight">>;
3846
+ }
3847
+ /**
3848
+ * Un JSON en lecture seule, que l'on déplie.
3849
+ *
3850
+ * Pour une réponse d'API, une charge utile, une configuration : les types se
3851
+ * distinguent à la couleur, les branches profondes restent repliées, et un
3852
+ * nœud replié dit ce qu'il contient — `{…} 3 clés`. À la différence de
3853
+ * `JsonEditor`, rien ne s'y saisit.
3854
+ */
3855
+ declare function JsonView({ value, source, defaultExpandDepth, collapsible, maxHeight, copyable, copyLabel: copyLabelProp, copiedLabel: copiedLabelProp, invalidLabel: invalidLabelProp, className, copyButtonProps, alertProps, scrollAreaProps, }: JsonViewProps): react_jsx_runtime.JSX.Element;
3856
+
2848
3857
  interface KpiGridProps extends HTMLAttributes<HTMLDivElement> {
2849
3858
  columns?: 1 | 2 | 3 | 4;
2850
3859
  }
@@ -2876,132 +3885,197 @@ type ILabelProps = LabelProps;
2876
3885
  */
2877
3886
  declare const Label: react.ForwardRefExoticComponent<LabelProps & react.RefAttributes<HTMLLabelElement>>;
2878
3887
 
3888
+ type LiveStatus = "connecting" | "open" | "closed";
3889
+ interface LiveIndicatorProps extends Omit<HTMLAttributes<HTMLSpanElement>, "children"> {
3890
+ /** L'état de la connexion — `useRealtimeStatus(source)` le fournit. */
3891
+ status: LiveStatus;
3892
+ /** Les libellés de chaque état. Par défaut, ceux de la locale. */
3893
+ labels?: Partial<Record<LiveStatus, string>>;
3894
+ /** Le point seul, le libellé restant pour les lecteurs d'écran. */
3895
+ compact?: boolean;
3896
+ }
2879
3897
  /**
2880
- * Le même calendrier, en plus petit.
3898
+ * Dit si l'écran se met à jour tout seul.
2881
3899
  *
2882
- * Une variante de taille et non un composant à part : deux calendriers
2883
- * séparés auraient divergé sur la sélection de plage, les jours désactivés
2884
- * ou le premier jour de la semaine.
3900
+ * Sans lui, une liste qui ne bouge plus après une coupure réseau ressemble à
3901
+ * une liste à jour. Le point pulse en direct, clignote en connexion, s'éteint
3902
+ * hors ligne ; le libellé est annoncé quand il change.
2885
3903
  */
2886
- declare function MiniCalendar({ className, ...props }: CalendarProps): react_jsx_runtime.JSX.Element;
3904
+ declare function LiveIndicator({ status, labels, compact, className, ...props }: LiveIndicatorProps): react_jsx_runtime.JSX.Element;
2887
3905
 
2888
- interface ModalProps {
2889
- open: boolean;
2890
- onOpenChange: (open: boolean) => void;
2891
- title: ReactNode;
2892
- description?: ReactNode;
3906
+ interface ToggleProps {
3907
+ pressed?: boolean;
3908
+ defaultPressed?: boolean;
3909
+ onPressedChange?: (pressed: boolean) => void;
2893
3910
  children?: ReactNode;
2894
- footer?: ReactNode;
2895
- closeOnBackdrop?: boolean;
2896
- closeLabel?: string;
3911
+ icon?: ReactNode;
3912
+ /** Obligatoire quand le contenu se réduit à une icône. */
3913
+ ariaLabel?: string;
3914
+ size?: ComponentSize;
3915
+ tone?: ComponentTone;
3916
+ variant?: "solid" | "outline" | "ghost";
3917
+ disabled?: boolean;
2897
3918
  className?: string;
2898
3919
  }
2899
3920
  /**
2900
- * Une boîte qui interrompt.
3921
+ * Un bouton à deux états.
2901
3922
  *
2902
- * Elle enferme le focus et bloque le défilement de la page : sans cela, la
2903
- * tabulation continue derrière le voile, et l'on remplit un formulaire
2904
- * qu'on ne voit pas. L'échappement la referme toujours — c'est la sortie
2905
- * que tout le monde essaie en premier.
3923
+ * Ce n'est pas un `Switch` : un interrupteur décrit un réglage qui persiste,
3924
+ * une bascule décrit un état de l'interface ici et maintenant — gras, filtre
3925
+ * actif, colonne affichée. `aria-pressed` porte cette différence.
2906
3926
  */
2907
- declare function Modal({ open, onOpenChange, title, description, children, footer, closeOnBackdrop, closeLabel: closeLabelProp, className }: ModalProps): react.ReactPortal | null;
2908
-
2909
- interface MonthPickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "onChange"> {
2910
- onValueChange?: (value: string) => void;
2911
- invalid?: boolean;
3927
+ declare function Toggle({ pressed: pressedProp, defaultPressed, onPressedChange, children, icon, ariaLabel, size, tone, variant, disabled, className, }: ToggleProps): react_jsx_runtime.JSX.Element;
3928
+ interface ToggleGroupOption {
3929
+ value: string;
3930
+ label?: ReactNode;
3931
+ icon?: ReactNode;
3932
+ ariaLabel?: string;
3933
+ disabled?: boolean;
2912
3934
  }
2913
- /**
2914
- * Un mois, sans le jour.
2915
- *
2916
- * C'est le grain d'un exercice comptable ou d'un rapport mensuel : demander
2917
- * un jour obligerait à en choisir un arbitrairement, et le premier du mois
2918
- * finirait par être pris pour une vraie date.
2919
- */
2920
- declare const MonthPicker: react.ForwardRefExoticComponent<MonthPickerProps & react.RefAttributes<HTMLInputElement>>;
2921
-
2922
- interface PageHeaderProps {
2923
- title: ReactNode;
2924
- description?: ReactNode;
2925
- eyebrow?: ReactNode;
2926
- actions?: ReactNode;
2927
- /**
2928
- * Le niveau du titre. `1` — le défaut — pour l'en-tête d'un écran.
2929
- *
2930
- * `2` ou `3` pour une section dans un écran qui a déjà son `<h1>` : la
2931
- * liste des environnements dans la fiche d'un projet. Le titre y est plus
2932
- * petit et l'espace sous l'en-tête plus court.
2933
- */
2934
- level?: 1 | 2 | 3;
3935
+ interface ToggleGroupProps {
3936
+ options: ToggleGroupOption[];
3937
+ /** `single` : une valeur ou aucune. `multiple` : un tableau. */
3938
+ type?: "single" | "multiple";
3939
+ value?: string | string[];
3940
+ defaultValue?: string | string[];
3941
+ /** Une chaîne en `single`, un tableau en `multiple` — comme `value`. */
3942
+ onValueChange?: (value: string | string[]) => void;
3943
+ size?: ComponentSize;
3944
+ tone?: ComponentTone;
3945
+ /** Autorise à tout désélectionner en `single`. */
3946
+ deselectable?: boolean;
3947
+ disabled?: boolean;
3948
+ ariaLabel?: string;
2935
3949
  className?: string;
2936
3950
  }
2937
3951
  /**
2938
- * Le titre d'un écran, et ses actions.
3952
+ * Plusieurs bascules qui partagent une valeur.
2939
3953
  *
2940
- * Un seul `<h1>` par page, rendu ici : la hiérarchie des titres est ce qui
2941
- * permet de parcourir un écran au lecteur d'écran, et deux `<h1>` la
2942
- * cassent sans que rien ne se voie. Une section imbriquée passe donc
2943
- * `level={2}`.
3954
+ * Le repère glisse d'une option à l'autre au lieu de sauter : c'est la même
3955
+ * idée que les onglets, et c'est ce qui rend le changement lisible.
2944
3956
  */
2945
- declare function PageHeader({ title, description, eyebrow, actions, level, className, }: PageHeaderProps): react_jsx_runtime.JSX.Element;
3957
+ declare function ToggleGroup({ options, type, value: valueProp, defaultValue, onValueChange, size, tone, deselectable, disabled, ariaLabel, className, }: ToggleGroupProps): react_jsx_runtime.JSX.Element;
2946
3958
 
2947
- interface PaginationProps {
2948
- page: number;
2949
- totalPages: number;
2950
- onPageChange: (page: number) => void;
2951
- siblingCount?: number;
2952
- previousLabel?: string;
2953
- nextLabel?: string;
3959
+ /** La gravité d'une ligne. */
3960
+ type LogLevel = "debug" | "info" | "warn" | "error" | "success";
3961
+ /** Une ligne de journal. */
3962
+ interface LogLine {
2954
3963
  /**
2955
- * Ajoute un champ pour sauter directement à une page.
2956
- *
2957
- * Sur quarante pages, atteindre la vingt-septième demande sinon de cliquer
2958
- * dans les ellipses jusqu'à ce qu'elle apparaisse.
3964
+ * Un identifiant stable. Facultatif, mais conseillé : sans lui, la ligne
3965
+ * est repérée par sa position, et un tableau raccourci par le début
3966
+ * obligerait à redessiner toutes les lignes.
2959
3967
  */
2960
- jumpTo?: boolean;
2961
- /** Affiche « Page 3 sur 40 » à côté des numéros. */
2962
- showTotal?: boolean;
2963
- /** Masque les libellés et ne garde que les flèches. */
2964
- compact?: boolean;
2965
- /** Le nombre de lignes par page en vigueur. */
2966
- pageSize?: number;
3968
+ id?: string;
3969
+ /** Quand : une date ISO, un horodatage ou une `Date`. */
3970
+ time: string | number | Date;
3971
+ level: LogLevel;
3972
+ message: ReactNode;
3973
+ /** L'essai, l'étape ou la tâche : « Essai 1 », « Essai 2 ». */
3974
+ group?: string;
3975
+ }
3976
+ interface LogStreamProps {
3977
+ lines: LogLine[];
2967
3978
  /**
2968
- * Fourni avec `pageSize`, ajoute le choix du nombre de lignes par page.
3979
+ * Le nombre de lignes gardées. Au-delà, les plus anciennes tombent.
2969
3980
  *
2970
- * Seul le nouveau nombre est remonté : revenir en page 1 est l'affaire de
2971
- * qui tient l'état — `setPerPage` de `useTableQuery` le fait déjà.
3981
+ * C'est la réponse à un journal qui grossit sans fin, plutôt qu'une
3982
+ * virtualisation : mille lignes se dessinent sans peine, et une liste
3983
+ * virtuelle casserait la recherche du navigateur et la sélection au
3984
+ * clavier. `1000` par défaut.
2972
3985
  */
2973
- onPageSizeChange?: (pageSize: number) => void;
2974
- /**
2975
- * Les tailles proposées. Par défaut `10, 20, 50, 100`. Une taille en
2976
- * vigueur absente de la liste y est ajoutée, pour que le champ ne paraisse
2977
- * jamais vide.
2978
- */
2979
- pageSizeOptions?: number[];
2980
- /** Le libellé du choix. Par défaut `locale.perPage` — « Par page ». */
2981
- pageSizeLabel?: string;
3986
+ maxLines?: number;
3987
+ /** La hauteur de la zone défilante. `20rem` par défaut. */
3988
+ height?: number | string;
2982
3989
  /**
2983
- * Remplace entièrement le contrôle — des boutons segmentés, un champ libre.
2984
- * Le choix des tailles et leur tri sont déjà faits.
3990
+ * Défiler jusqu'à la dernière ligne à chaque arrivée. Contrôlé quand il
3991
+ * est fourni ; remonter dans le journal appelle alors `onFollowChange(false)`.
2985
3992
  */
2986
- renderPageSize?: (context: PageSizeContext) => ReactNode;
3993
+ follow?: boolean;
3994
+ /** Vrai par défaut : un journal d'exécution se lit par la fin. */
3995
+ defaultFollow?: boolean;
3996
+ onFollowChange?: (follow: boolean) => void;
3997
+ /** Les niveaux affichés. Contrôlé quand il est fourni. */
3998
+ levels?: LogLevel[];
3999
+ /** Tous par défaut. */
4000
+ defaultLevels?: LogLevel[];
4001
+ onLevelsChange?: (levels: LogLevel[]) => void;
4002
+ /** Les libellés des niveaux, dans la colonne comme dans la copie. */
4003
+ levelLabels?: Partial<Record<LogLevel, string>>;
4004
+ /** Les groupes repliés au premier affichage. */
4005
+ defaultCollapsedGroups?: string[];
4006
+ /** Le premier chargement : rien n'est encore arrivé. */
4007
+ loading?: boolean;
4008
+ /** Des lignes arrivent encore. Un indicateur discret le dit. */
4009
+ streaming?: boolean;
4010
+ streamingLabel?: string;
4011
+ loadingLabel?: string;
4012
+ /** La langue du format horaire. Par défaut, celle de la locale SIA. */
4013
+ locale?: string;
4014
+ /** Sans barre d'outils : ni filtre, ni recherche, ni copie. */
4015
+ toolbar?: boolean;
4016
+ /** Le nom de la zone pour les lecteurs d'écran. */
2987
4017
  ariaLabel?: string;
4018
+ searchPlaceholder?: string;
4019
+ copyLabel?: string;
4020
+ copiedLabel?: string;
4021
+ followLabel?: string;
4022
+ resumeLabel?: string;
2988
4023
  className?: string;
4024
+ /**
4025
+ * Le filtre par niveau. Sans ses options ni sa valeur, tirées des niveaux,
4026
+ * ni son type : on en retient plusieurs à la fois.
4027
+ */
4028
+ levelFilterProps?: Partial<Omit<ToggleGroupProps, "options" | "type" | "value" | "defaultValue" | "onValueChange">>;
4029
+ /** La recherche. Sa valeur reste celle du journal, qui filtre avec. */
4030
+ searchInputProps?: Partial<Omit<SearchInputProps, "value" | "defaultValue" | "onValueChange">>;
4031
+ /** Le bouton de copie. Son action et son libellé suivent la copie. */
4032
+ copyButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children">>;
4033
+ /** La bascule « Suivre la fin ». Son état est celui du suivi. */
4034
+ followToggleProps?: Partial<Omit<ToggleProps, "pressed" | "defaultPressed" | "onPressedChange">>;
4035
+ /** Le bouton « Reprendre le suivi », affiché quand le suivi est en pause. */
4036
+ resumeButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children">>;
4037
+ /**
4038
+ * L'en-tête repliable de chaque groupe. `aria-expanded` et
4039
+ * `aria-controls` restent calculés groupe par groupe.
4040
+ */
4041
+ groupButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children" | "aria-expanded" | "aria-controls">>;
4042
+ /** L'état vide : pas encore de ligne, ou aucune qui corresponde. */
4043
+ emptyStateProps?: Partial<EmptyStateProps>;
4044
+ /** Les indicateurs de chargement et de flux en cours. Sans `label`. */
4045
+ spinnerProps?: Partial<Omit<SpinnerProps, "label">>;
2989
4046
  }
2990
- /** Ce que reçoit `renderPageSize`. */
2991
- interface PageSizeContext {
2992
- pageSize: number;
2993
- options: number[];
2994
- onChange: (pageSize: number) => void;
2995
- label: string;
2996
- }
2997
- declare const DEFAULT_PAGE_SIZE_OPTIONS: number[];
2998
4047
  /**
2999
- * La navigation entre les pages.
4048
+ * Un journal d'exécution qui se lit en direct.
3000
4049
  *
3001
- * Le calcul des numéros et des ellipses vient de `@sia-ui/headless` :
3002
- * `usePagination` et ce composant appliquent la même règle, écrite une fois.
4050
+ * `Timeline` raconte des événements ; ici, on suit une exécution : heure en
4051
+ * colonne, niveau, police à chasse fixe, essais repliables. Le suivi de la
4052
+ * fin se met en pause dès qu'on remonte — lire une erreur pendant que le
4053
+ * journal défile sous les yeux est impossible — et un bouton dit combien de
4054
+ * lignes sont arrivées entre-temps.
4055
+ */
4056
+ declare function LogStream({ lines, maxLines, height, follow, defaultFollow, onFollowChange, levels: levelsProp, defaultLevels, onLevelsChange, levelLabels, defaultCollapsedGroups, loading, streaming, streamingLabel: streamingLabelProp, loadingLabel: loadingLabelProp, locale: localeProp, toolbar, ariaLabel: ariaLabelProp, searchPlaceholder: searchPlaceholderProp, copyLabel: copyLabelProp, copiedLabel: copiedLabelProp, followLabel: followLabelProp, resumeLabel: resumeLabelProp, className, levelFilterProps, searchInputProps, copyButtonProps, followToggleProps, resumeButtonProps, groupButtonProps, emptyStateProps, spinnerProps, }: LogStreamProps): react_jsx_runtime.JSX.Element;
4057
+
4058
+ /**
4059
+ * Le même calendrier, en plus petit.
4060
+ *
4061
+ * Une variante de taille et non un composant à part : deux calendriers
4062
+ * séparés auraient divergé sur la sélection de plage, les jours désactivés
4063
+ * ou le premier jour de la semaine.
3003
4064
  */
3004
- declare function Pagination({ page, totalPages, onPageChange, siblingCount, previousLabel: previousLabelProp, nextLabel: nextLabelProp, jumpTo, showTotal, compact, pageSize, onPageSizeChange, pageSizeOptions, pageSizeLabel, renderPageSize, ariaLabel, className, }: PaginationProps): react_jsx_runtime.JSX.Element | null;
4065
+ declare function MiniCalendar({ className, ...props }: CalendarProps): react_jsx_runtime.JSX.Element;
4066
+
4067
+ interface MonthPickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "onChange"> {
4068
+ onValueChange?: (value: string) => void;
4069
+ invalid?: boolean;
4070
+ }
4071
+ /**
4072
+ * Un mois, sans le jour.
4073
+ *
4074
+ * C'est le grain d'un exercice comptable ou d'un rapport mensuel : demander
4075
+ * un jour obligerait à en choisir un arbitrairement, et le premier du mois
4076
+ * finirait par être pris pour une vraie date.
4077
+ */
4078
+ declare const MonthPicker: react.ForwardRefExoticComponent<MonthPickerProps & react.RefAttributes<HTMLInputElement>>;
3005
4079
 
3006
4080
  interface PasswordStrength {
3007
4081
  /** De 0 à 4. */
@@ -3015,7 +4089,8 @@ interface PasswordInputProps extends Omit<InputProps, "type" | "right"> {
3015
4089
  hideToggle?: boolean;
3016
4090
  /**
3017
4091
  * Remplace l'évaluation par défaut. Un projet qui utilise `zxcvbn` branche
3018
- * son résultat ici; le composant ne dépend de rien.
4092
+ * son résultat ici; le composant ne dépend de rien. Les libellés de
4093
+ * l'évaluation par défaut viennent de la locale (`passwordInput`).
3019
4094
  */
3020
4095
  evaluate?: (value: string) => PasswordStrength;
3021
4096
  }
@@ -3048,7 +4123,11 @@ interface PhoneCountry {
3048
4123
  code: string;
3049
4124
  /** Indicatif, avec le `+`. */
3050
4125
  dial: string;
3051
- label: string;
4126
+ /**
4127
+ * Le nom affiché. Par défaut, celui que donne `Intl.DisplayNames` dans la
4128
+ * langue de la locale — « Cameroun », « Cameroon ».
4129
+ */
4130
+ label?: string;
3052
4131
  flag: string;
3053
4132
  /** Nombre de chiffres attendus après l'indicatif. */
3054
4133
  digits?: number;
@@ -3074,6 +4153,14 @@ interface PhoneInputProps extends Omit<InputProps, "value" | "defaultValue" | "o
3074
4153
  defaultCountry?: string;
3075
4154
  /** Verrouille le pays et masque le sélecteur. */
3076
4155
  lockCountry?: boolean;
4156
+ /**
4157
+ * Le sélecteur d'indicatif : placement, recherche, rendu, classe.
4158
+ *
4159
+ * La valeur, les options et le rappel viennent de `countries` et du
4160
+ * numéro ; `disabled` suit celui du champ — pour figer le pays seul,
4161
+ * `lockCountry`.
4162
+ */
4163
+ countrySelectProps?: Partial<Omit<SelectProps, "value" | "defaultValue" | "options" | "children" | "onValueChange" | "disabled">>;
3077
4164
  }
3078
4165
  /**
3079
4166
  * Un numéro de téléphone international.
@@ -3088,59 +4175,9 @@ interface PhoneInputProps extends Omit<InputProps, "value" | "defaultValue" | "o
3088
4175
  */
3089
4176
  declare const PhoneInput: react.ForwardRefExoticComponent<PhoneInputProps & react.RefAttributes<HTMLInputElement>>;
3090
4177
 
3091
- interface PopoverProps {
3092
- content: ReactNode;
3093
- title?: ReactNode;
3094
- children: ReactElement<{
3095
- onClick?: () => void;
3096
- "aria-expanded"?: boolean;
3097
- }>;
3098
- open?: boolean;
3099
- defaultOpen?: boolean;
3100
- onOpenChange?: (open: boolean) => void;
3101
- placement?: OverlayPlacement;
3102
- trigger?: "click" | "hover";
3103
- variant?: "solid" | "outline";
3104
- tone?: ComponentTone;
3105
- disabled?: boolean;
3106
- className?: string;
3107
- }
3108
- /**
3109
- * Un panneau attaché à un élément, avec du contenu qu'on peut viser.
3110
- *
3111
- * À la différence d'une infobulle, il reste ouvert : on y met un lien, un
3112
- * bouton, un petit formulaire. Une infobulle qui contient un bouton est une
3113
- * infobulle cassée — elle disparaît dès qu'on va vers lui.
3114
- */
3115
- declare function Popover({ content, title, children, open: openProp, defaultOpen, onOpenChange, placement, trigger, variant, tone, disabled, className }: PopoverProps): react_jsx_runtime.JSX.Element;
3116
-
3117
- interface ProgressProps {
3118
- /** La valeur courante. Omise, la barre passe en indéterminé. */
3119
- value?: number | undefined;
3120
- max?: number;
3121
- shape?: "bar" | "circle";
3122
- tone?: ComponentTone;
3123
- size?: ComponentSize;
3124
- /** Épaisseur du trait, en pixels. Par défaut selon la taille. */
3125
- thickness?: number | undefined;
3126
- /** Affiche le pourcentage — au centre du cercle, en bout de barre. */
3127
- showValue?: boolean;
3128
- /** Remplace l'affichage par défaut. */
3129
- format?: ((percent: number, value: number, max: number) => ReactNode) | undefined;
3130
- label?: ReactNode;
3131
- className?: string;
3132
- }
3133
- /**
3134
- * L'avancement d'une tâche.
3135
- *
3136
- * Sans `value`, le composant passe en indéterminé plutôt que d'afficher zéro :
3137
- * « je travaille » et « je n'ai rien fait » ne se ressemblent pas.
3138
- */
3139
- declare function Progress(props: ProgressProps): react_jsx_runtime.JSX.Element;
3140
-
3141
4178
  interface QRCodeProps {
3142
4179
  value: string;
3143
- size?: number;
4180
+ size?: number; /** Par défaut, celui de la locale. */
3144
4181
  label?: string;
3145
4182
  render?: (value: string, size: number) => ReactNode;
3146
4183
  className?: string;
@@ -3152,10 +4189,11 @@ interface QRCodeProps {
3152
4189
  * dépendance à tous ceux qui ne s'en servent pas, alors que les projets qui
3153
4190
  * en ont besoin ont déjà le leur.
3154
4191
  */
3155
- declare function QRCode({ value, size, label, render, className }: QRCodeProps): react_jsx_runtime.JSX.Element;
4192
+ declare function QRCode({ value, size, label: labelProp, render, className }: QRCodeProps): react_jsx_runtime.JSX.Element;
3156
4193
 
3157
4194
  interface RelativeTimeProps extends Omit<HTMLAttributes<HTMLTimeElement>, "dateTime"> {
3158
4195
  value: Date | string | number;
4196
+ /** La langue de la phrase. Par défaut, celle de la locale SIA. */
3159
4197
  locale?: string;
3160
4198
  prefix?: string;
3161
4199
  refreshInterval?: number;
@@ -3166,7 +4204,7 @@ interface RelativeTimeProps extends Omit<HTMLAttributes<HTMLTimeElement>, "dateT
3166
4204
  * Elle se rafraîchit d'elle-même : « il y a une minute » affiché une heure
3167
4205
  * plus tard est faux, et rien ne le signale à qui lit l'écran resté ouvert.
3168
4206
  */
3169
- declare function RelativeTime({ value, locale, prefix, refreshInterval, className, title, ...props }: RelativeTimeProps): react_jsx_runtime.JSX.Element | null;
4207
+ declare function RelativeTime({ value, locale: localeProp, prefix, refreshInterval, className, title, ...props }: RelativeTimeProps): react_jsx_runtime.JSX.Element | null;
3170
4208
 
3171
4209
  interface RequireSessionProps<TUser, TTenant, TRule> {
3172
4210
  session: SessionStore<TUser, TTenant, TRule>;
@@ -3198,18 +4236,23 @@ interface RequireSessionProps<TUser, TTenant, TRule> {
3198
4236
  onForbidden?: (state: SessionState<TUser, TTenant>) => void;
3199
4237
  onIncomplete?: (state: SessionState<TUser, TTenant>) => void;
3200
4238
  className?: string;
4239
+ /**
4240
+ * Les props du `Spinner` d'attente par défaut — taille, variante, libellé
4241
+ * lu par les lecteurs d'écran. Sans effet quand `pending` est fourni.
4242
+ */
4243
+ spinnerProps?: Partial<SpinnerProps>;
3201
4244
  }
3202
4245
  /**
3203
4246
  * Ce qui se trouve derrière une session valide.
3204
4247
  *
3205
- * Écrite cinq fois dans les projets du disque D, cinq fois de la même façon
3206
- * à la cible de redirection près. Elle ne dépend d'aucun routeur : elle rend
4248
+ * Chaque application l'écrit, presque toujours de la même façon, à la cible
4249
+ * de redirection près. Elle ne dépend d'aucun routeur : elle rend
3207
4250
  * un état et prévient, l'application décide où aller.
3208
4251
  *
3209
4252
  * > Ceci protège l'interface, pas les données. Une route masquée reste une
3210
4253
  * > route ouverte tant que le serveur ne refuse pas l'appel.
3211
4254
  */
3212
- declare function RequireSession<TUser, TTenant, TRule = PermissionRule>({ session, children, require: rule, pending, fallback, forbidden, allowIncomplete, onUnauthenticated, onForbidden, onIncomplete, className, }: RequireSessionProps<TUser, TTenant, TRule>): react_jsx_runtime.JSX.Element;
4255
+ declare function RequireSession<TUser, TTenant, TRule = PermissionRule>({ session, children, require: rule, pending, fallback, forbidden, allowIncomplete, onUnauthenticated, onForbidden, onIncomplete, className, spinnerProps, }: RequireSessionProps<TUser, TTenant, TRule>): react_jsx_runtime.JSX.Element;
3213
4256
  interface CanProps<TUser, TTenant, TRule> {
3214
4257
  session: SessionStore<TUser, TTenant, TRule>;
3215
4258
  require: TRule;
@@ -3243,57 +4286,6 @@ interface ResizablePanelProps {
3243
4286
  */
3244
4287
  declare function ResizablePanel({ first, second, defaultSize, minSize, maxSize, direction, className }: ResizablePanelProps): react_jsx_runtime.JSX.Element;
3245
4288
 
3246
- interface ScrollAreaProps {
3247
- children: ReactNode;
3248
- /** Hauteur maximale. Au-delà, la zone défile. */
3249
- maxHeight?: number | string;
3250
- height?: number | string;
3251
- orientation?: "vertical" | "horizontal" | "both";
3252
- /**
3253
- * Estompe le contenu aux bords tant qu'il reste quelque chose à faire
3254
- * défiler. C'est le seul indice fiable quand la barre est fine ou masquée.
3255
- */
3256
- fade?: boolean;
3257
- className?: string;
3258
- }
3259
- /**
3260
- * Une zone défilante sobre.
3261
- *
3262
- * La barre reste celle du navigateur, seulement affinée : une barre
3263
- * réimplémentée en JavaScript coûte un écouteur de défilement, deux mesures
3264
- * par image et perd le défilement inertiel des pavés tactiles. Le seul ajout
3265
- * est l'estompe des bords, qui ne demande qu'un booléen par côté.
3266
- */
3267
- declare function ScrollArea({ children, maxHeight, height, orientation, fade, className, }: ScrollAreaProps): react_jsx_runtime.JSX.Element;
3268
-
3269
- interface SearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "onChange"> {
3270
- value?: string;
3271
- defaultValue?: string;
3272
- onValueChange?: (value: string) => void;
3273
- /** Appelé à la validation, et après le délai si `searchDelay` est posé. */
3274
- onSearch?: (value: string) => void;
3275
- /**
3276
- * Millisecondes d'inactivité avant de déclencher `onSearch`.
3277
- *
3278
- * `0` — le défaut — ne déclenche qu'à la validation. Au-delà, la recherche
3279
- * part quand la frappe s'arrête : c'est ce que chaque projet réécrivait
3280
- * autour de ce champ.
3281
- */
3282
- searchDelay?: number;
3283
- clearable?: boolean;
3284
- searchLabel?: string;
3285
- clearLabel?: string;
3286
- }
3287
- /**
3288
- * Une recherche, avec son délai.
3289
- *
3290
- * `searchDelay` vaut zéro par défaut : la recherche ne part qu'à la
3291
- * validation. C'est le réglage sûr — une requête à chaque frappe se paie en
3292
- * appels serveur, et le défaut ne doit pas engager ce coût sans qu'on l'ait
3293
- * demandé.
3294
- */
3295
- declare const SearchInput: react.ForwardRefExoticComponent<SearchInputProps & react.RefAttributes<HTMLInputElement>>;
3296
-
3297
4289
  /** Une paire nom / valeur. La valeur n'est jamais relue du serveur. */
3298
4290
  interface SecretEntry {
3299
4291
  key: string;
@@ -3315,12 +4307,39 @@ interface SecretFieldsProps {
3315
4307
  templates?: string[];
3316
4308
  /** La forme d'un nom valide. Par défaut, aucune contrainte. */
3317
4309
  keyPattern?: RegExp;
4310
+ /** Les libellés ci-dessous viennent par défaut du groupe `secretFields` de la locale. */
3318
4311
  keyPatternMessage?: string;
3319
4312
  keyLabel?: string;
3320
4313
  valueLabel?: string;
3321
4314
  addLabel?: ReactNode;
3322
4315
  disabled?: boolean;
3323
4316
  className?: string;
4317
+ /**
4318
+ * Le bouton d'ajout : variante, taille, icône, classe. Son libellé passe
4319
+ * par `addLabel`.
4320
+ */
4321
+ addButtonProps?: Partial<Omit<ButtonProps, "onClick" | "children" | "disabled">>;
4322
+ /**
4323
+ * Le bouton qui retire une ligne : icône, variante, taille.
4324
+ *
4325
+ * Son nom reste calculé ligne par ligne — « Retirer API_KEY » — pour que
4326
+ * chaque bouton dise lequel il retire.
4327
+ */
4328
+ removeButtonProps?: Partial<Omit<IconButtonProps, "onClick" | "label" | "disabled">>;
4329
+ /**
4330
+ * Le champ du nom : placeholder, taille, classe.
4331
+ *
4332
+ * La valeur, la saisie et l'état d'erreur, avec son `aria-describedby`,
4333
+ * restent calculés par ligne.
4334
+ */
4335
+ keyInputProps?: Partial<Omit<InputProps, "value" | "defaultValue" | "onChange" | "disabled" | "invalid" | "aria-describedby">>;
4336
+ /**
4337
+ * Le champ de la valeur : placeholder, jauge, classe.
4338
+ *
4339
+ * Pas d'`autoComplete` : `new-password` est ce qui empêche le navigateur
4340
+ * de proposer le mot de passe du compte à la place du secret.
4341
+ */
4342
+ valueInputProps?: Partial<Omit<PasswordInputProps, "value" | "defaultValue" | "onChange" | "disabled" | "autoComplete">>;
3324
4343
  }
3325
4344
  /** Les valeurs effacées, les noms gardés — ce qu'on affiche après l'envoi. */
3326
4345
  declare function clearSecretValues(entries: SecretEntry[]): SecretEntry[];
@@ -3335,7 +4354,7 @@ declare function clearSecretValues(entries: SecretEntry[]): SecretEntry[];
3335
4354
  * Après l'envoi, `clearSecretValues` vide les valeurs : un secret ne reste pas
3336
4355
  * affiché dans un formulaire ouvert.
3337
4356
  */
3338
- declare function SecretFields({ value, defaultValue, onValueChange, storedKeys, templates, keyPattern, keyPatternMessage, keyLabel, valueLabel, addLabel, disabled, className, }: SecretFieldsProps): react_jsx_runtime.JSX.Element;
4357
+ declare function SecretFields({ value, defaultValue, onValueChange, storedKeys, templates, keyPattern, keyPatternMessage: keyPatternMessageProp, keyLabel: keyLabelProp, valueLabel: valueLabelProp, addLabel: addLabelProp, disabled, className, addButtonProps, removeButtonProps, keyInputProps, valueInputProps, }: SecretFieldsProps): react_jsx_runtime.JSX.Element;
3339
4358
  /** Ce qu'il faut envoyer au serveur après une saisie dans `SecretFields`. */
3340
4359
  interface SecretChanges {
3341
4360
  /** À créer ou à remplacer (rotation) : nom → nouvelle valeur. */
@@ -3365,25 +4384,11 @@ interface SecretChanges {
3365
4384
  */
3366
4385
  declare function secretChanges(entries: SecretEntry[], storedKeys?: string[]): SecretChanges;
3367
4386
 
3368
- interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {
3369
- width?: CSSProperties["width"];
3370
- height?: CSSProperties["height"];
3371
- radius?: CSSProperties["borderRadius"];
3372
- circle?: boolean;
3373
- }
3374
- /**
3375
- * La forme de ce qui n'est pas encore là.
3376
- *
3377
- * Aux dimensions du contenu attendu, et non d'une taille générique : c'est
3378
- * ce qui évite le sursaut de mise en page à l'arrivée des données, lequel
3379
- * fait cliquer à côté.
3380
- */
3381
- declare function Skeleton({ className, width, height, radius, circle, style, ...props }: SkeletonProps): react_jsx_runtime.JSX.Element;
3382
-
3383
4387
  interface StatisticProps {
3384
4388
  value: number;
3385
4389
  label?: ReactNode;
3386
4390
  format?: "number" | "currency" | "percent";
4391
+ /** La langue du format. Par défaut, celle de la locale SIA. */
3387
4392
  locale?: string;
3388
4393
  currency?: string;
3389
4394
  precision?: number;
@@ -3399,12 +4404,20 @@ interface StatisticProps {
3399
4404
  * décide du sens et de la couleur. Une flèche passée en prop finit par
3400
4405
  * pointer vers le haut sur une baisse.
3401
4406
  */
3402
- declare function Statistic({ value, label, format, locale, currency, precision, prefix, suffix, trend, className }: StatisticProps): react_jsx_runtime.JSX.Element;
4407
+ declare function Statistic({ value, label, format, locale: localeProp, currency, precision, prefix, suffix, trend, className }: StatisticProps): react_jsx_runtime.JSX.Element;
3403
4408
 
3404
4409
  interface StatCardProps extends StatisticProps {
3405
4410
  icon?: ReactNode;
3406
4411
  description?: ReactNode;
3407
4412
  action?: ReactNode;
4413
+ /**
4414
+ * Les props de la `Card` qui entoure l'indicateur — un `id`, un
4415
+ * `aria-label`, un gestionnaire de clic. Sans `children` : le contenu est
4416
+ * celui de l'indicateur. `className` s'ajoute à celui de la carte.
4417
+ */
4418
+ cardProps?: Partial<Omit<CardProps, "children">>;
4419
+ /** Les props du `CardBody`, sans `children`, rempli par l'indicateur. */
4420
+ cardBodyProps?: Partial<Omit<CardBodyProps, "children">>;
3408
4421
  }
3409
4422
  /**
3410
4423
  * Un indicateur, dans une carte.
@@ -3413,35 +4426,7 @@ interface StatCardProps extends StatisticProps {
3413
4426
  * presque toujours ensemble, et qu'il serait fastidieux de recomposer à
3414
4427
  * chaque tableau de bord.
3415
4428
  */
3416
- declare function StatCard({ icon, description, action, className, ...statisticProps }: StatCardProps): react_jsx_runtime.JSX.Element;
3417
-
3418
- type StepStatus = "done" | "current" | "upcoming" | "error";
3419
- interface StepItem {
3420
- key: string;
3421
- title: ReactNode;
3422
- description?: ReactNode;
3423
- icon?: ReactNode;
3424
- /** Forcé au besoin; sinon déduit de `current`. */
3425
- status?: StepStatus;
3426
- disabled?: boolean;
3427
- }
3428
- interface StepsProps {
3429
- items: StepItem[];
3430
- /** Index de l'étape en cours. Ce qui précède est fait, ce qui suit à venir. */
3431
- current?: number;
3432
- orientation?: "horizontal" | "vertical";
3433
- size?: "sm" | "md";
3434
- /** Rend les étapes cliquables — pour revenir en arrière dans un tunnel. */
3435
- onStepClick?: (item: StepItem, index: number) => void;
3436
- className?: string;
3437
- }
3438
- /**
3439
- * Une progression en étapes.
3440
- *
3441
- * Le trait entre deux étapes se remplit plutôt que de changer de couleur d'un
3442
- * coup : c'est ce qui donne le sens de la marche, vers l'avant.
3443
- */
3444
- declare function Steps({ items, current, orientation, size, onStepClick, className, }: StepsProps): react_jsx_runtime.JSX.Element;
4429
+ declare function StatCard({ icon, description, action, className, cardProps, cardBodyProps, ...statisticProps }: StatCardProps): react_jsx_runtime.JSX.Element;
3445
4430
 
3446
4431
  interface TabsProps {
3447
4432
  value?: string;
@@ -3538,6 +4523,12 @@ interface ToasterProps {
3538
4523
  */
3539
4524
  container?: HTMLElement | null | undefined;
3540
4525
  className?: string;
4526
+ /**
4527
+ * Les props du `Spinner` des annonces en attente (`toast.loading`,
4528
+ * `toast.promise`) — variante, taille. Sans effet sur une annonce qui
4529
+ * fournit sa propre `icon`.
4530
+ */
4531
+ spinnerProps?: Partial<SpinnerProps>;
3541
4532
  }
3542
4533
  /**
3543
4534
  * La pile visible.
@@ -3547,7 +4538,7 @@ interface ToasterProps {
3547
4538
  * d'apparaître près du geste qui l'a déclenchée et à une panne générale de
3548
4539
  * s'imposer en haut de l'écran.
3549
4540
  */
3550
- declare function Toaster({ placement, limit, duration, width, offset, container, className, }: ToasterProps): react.ReactPortal | null;
4541
+ declare function Toaster({ placement, limit, duration, width, offset, container, className, spinnerProps, }: ToasterProps): react.ReactPortal | null;
3551
4542
  interface ToastProviderProps extends PropsWithChildren, ToasterProps {
3552
4543
  }
3553
4544
  /**
@@ -3575,59 +4566,6 @@ declare function useToast(): ((input: _sia_ui_headless.ToastInput) => string) &
3575
4566
  custom: (options: ToastOptions) => string;
3576
4567
  };
3577
4568
 
3578
- interface ToggleProps {
3579
- pressed?: boolean;
3580
- defaultPressed?: boolean;
3581
- onPressedChange?: (pressed: boolean) => void;
3582
- children?: ReactNode;
3583
- icon?: ReactNode;
3584
- /** Obligatoire quand le contenu se réduit à une icône. */
3585
- ariaLabel?: string;
3586
- size?: ComponentSize;
3587
- tone?: ComponentTone;
3588
- variant?: "solid" | "outline" | "ghost";
3589
- disabled?: boolean;
3590
- className?: string;
3591
- }
3592
- /**
3593
- * Un bouton à deux états.
3594
- *
3595
- * Ce n'est pas un `Switch` : un interrupteur décrit un réglage qui persiste,
3596
- * une bascule décrit un état de l'interface ici et maintenant — gras, filtre
3597
- * actif, colonne affichée. `aria-pressed` porte cette différence.
3598
- */
3599
- declare function Toggle({ pressed: pressedProp, defaultPressed, onPressedChange, children, icon, ariaLabel, size, tone, variant, disabled, className, }: ToggleProps): react_jsx_runtime.JSX.Element;
3600
- interface ToggleGroupOption {
3601
- value: string;
3602
- label?: ReactNode;
3603
- icon?: ReactNode;
3604
- ariaLabel?: string;
3605
- disabled?: boolean;
3606
- }
3607
- interface ToggleGroupProps {
3608
- options: ToggleGroupOption[];
3609
- /** `single` : une valeur ou aucune. `multiple` : un tableau. */
3610
- type?: "single" | "multiple";
3611
- value?: string | string[];
3612
- defaultValue?: string | string[];
3613
- /** Une chaîne en `single`, un tableau en `multiple` — comme `value`. */
3614
- onValueChange?: (value: string | string[]) => void;
3615
- size?: ComponentSize;
3616
- tone?: ComponentTone;
3617
- /** Autorise à tout désélectionner en `single`. */
3618
- deselectable?: boolean;
3619
- disabled?: boolean;
3620
- ariaLabel?: string;
3621
- className?: string;
3622
- }
3623
- /**
3624
- * Plusieurs bascules qui partagent une valeur.
3625
- *
3626
- * Le repère glisse d'une option à l'autre au lieu de sauter : c'est la même
3627
- * idée que les onglets, et c'est ce qui rend le changement lisible.
3628
- */
3629
- declare function ToggleGroup({ options, type, value: valueProp, defaultValue, onValueChange, size, tone, deselectable, disabled, ariaLabel, className, }: ToggleGroupProps): react_jsx_runtime.JSX.Element;
3630
-
3631
4569
  interface TourStep {
3632
4570
  target: string;
3633
4571
  title: ReactNode;
@@ -3670,7 +4608,7 @@ interface TransferProps {
3670
4608
  * cocher de deux cents lignes ne montre plus ce qui est retenu, alors que
3671
4609
  * la colonne de droite ne contient que cela.
3672
4610
  */
3673
- declare function Transfer({ items, targetKeys, onChange, sourceTitle, targetTitle, className }: TransferProps): react_jsx_runtime.JSX.Element;
4611
+ declare function Transfer({ items, targetKeys, onChange, sourceTitle: sourceTitleProp, targetTitle: targetTitleProp, className }: TransferProps): react_jsx_runtime.JSX.Element;
3674
4612
 
3675
4613
  interface TreeNode {
3676
4614
  key: Key;
@@ -3700,6 +4638,13 @@ interface TreeSelectProps {
3700
4638
  onValueChange?: (value: Key, node: TreeNode) => void;
3701
4639
  placeholder?: string;
3702
4640
  className?: string;
4641
+ /**
4642
+ * L'arbre du panneau : nœuds dépliés à l'ouverture, classe.
4643
+ *
4644
+ * Les nœuds, la sélection et son rappel restent au sélecteur, qui se
4645
+ * referme sur le choix.
4646
+ */
4647
+ treeProps?: Partial<Omit<TreeProps, "nodes" | "selectedKey" | "onSelect">>;
3703
4648
  }
3704
4649
  /**
3705
4650
  * Un choix dans une arborescence.
@@ -3708,7 +4653,7 @@ interface TreeSelectProps {
3708
4653
  * attente » ne se réduit pas à « En attente » sans devenir ambigu dès qu'un
3709
4654
  * autre nœud porte le même nom.
3710
4655
  */
3711
- declare function TreeSelect({ nodes, value, onValueChange, placeholder: placeholderProp, className }: TreeSelectProps): react_jsx_runtime.JSX.Element;
4656
+ declare function TreeSelect({ nodes, value, onValueChange, placeholder: placeholderProp, className, treeProps }: TreeSelectProps): react_jsx_runtime.JSX.Element;
3712
4657
 
3713
4658
  interface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {
3714
4659
  level?: 1 | 2 | 3 | 4 | 5 | 6;
@@ -3732,6 +4677,7 @@ declare function InlineCode({ className, ...props }: HTMLAttributes<HTMLElement>
3732
4677
 
3733
4678
  interface UnsavedChangesGuardProps {
3734
4679
  when: boolean;
4680
+ /** Le message de la confirmation. Par défaut, `unsavedChangesGuard.message` de la locale. */
3735
4681
  message?: string;
3736
4682
  }
3737
4683
  /**
@@ -3742,7 +4688,14 @@ interface UnsavedChangesGuardProps {
3742
4688
  * confirmation interne, que `confirmUnsavedNavigation` déclenche avant une
3743
4689
  * navigation du routeur.
3744
4690
  */
3745
- declare function UnsavedChangesGuard({ when, message }: UnsavedChangesGuardProps): null;
4691
+ declare function UnsavedChangesGuard({ when, message: messageProp }: UnsavedChangesGuardProps): null;
4692
+ /**
4693
+ * La confirmation avant une navigation du routeur.
4694
+ *
4695
+ * Hors d'un composant, la locale n'est pas lisible : passer
4696
+ * `locale.unsavedChangesGuard.message` (lu avec `useSiaLocale()`) pour un
4697
+ * message dans la langue de l'application. À défaut, le message français.
4698
+ */
3746
4699
  declare function confirmUnsavedNavigation(when: boolean, message?: string): boolean;
3747
4700
 
3748
4701
  interface WeekPickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "onChange"> {
@@ -3775,4 +4728,4 @@ interface YearPickerProps {
3775
4728
  */
3776
4729
  declare function YearPicker({ value, defaultValue, min, max, onValueChange, className }: YearPickerProps): react_jsx_runtime.JSX.Element;
3777
4730
 
3778
- export { Accordion, type AccordionItem, type AccordionProps, type ActivityEntry, ActivityIcon, ActivityLog, type ActivityLogFilter, type ActivityLogProps, Alert, AlertCircleIcon, type AlertProps, AmountDisplay, type AmountDisplayProps, AppShell, AppShellBrand, type AppShellBrandProps, type AppShellCollapsible, type AppShellContentWidth, type AppShellMobileNav, type AppShellProps, AppShellRailItem, type AppShellRailItemProps, ArrowRightIcon, AspectRatio, type AspectRatioProps, AsyncState, type AsyncStateProps, type AuditEvent, AuditMeta, type AuditMetaProps, AuthLayout, type AuthLayoutProps, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarShape, type AvatarSize, type AvatarStatus, type AvatarTint, type AvatarVariant, Badge, type BadgeProps, BottomTabs, type BottomTabsProps, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Calendar, type CalendarDay, type CalendarEvent, CalendarIcon, type CalendarMode, type CalendarProps, type CalendarRangeValue, Can, type CanProps, Card, CardBody, CardFooter, CardHeader, Chart, type ChartProps, type ChartSeries, CheckIcon, Checkbox, CheckboxGroup, type CheckboxGroupProps, type CheckboxProps, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ClockIcon, Collapse, type CollapseProps, ColorPicker, type ColorPickerProps, type ColumnCardRole, type CommandItem, CommandPalette, type CommandPaletteProps, ConfirmDialog, type ConfirmDialogProps, Container, ContextMenu, type ContextMenuProps, Countdown, type CountdownProps, type CrudActionOptions, type CrudCreateOptions, type CrudDialogOptions, type CrudDialogState, CrudDialogs, CrudPage, type CrudPageProps, CurrencyInput, type CurrencyInputProps, DEFAULT_COUNTRIES, DEFAULT_PAGE_SIZE_OPTIONS, DataTable, type DataTableColumn, type DataTableProps, type DataTableView, DatePicker, type DatePickerProps, DateRangeFilter, type DateRangeFilterProps, DateRangePicker, type DateRangePickerProps, type DateRangePreset, type DateRangeValue, DateTimePicker, type DateTimePickerProps, type DateTimeValue, type DescriptionItem, Descriptions, type DescriptionsProps, Divider, type DividerProps, Drawer, DrawerBody, DrawerClose, type DrawerComponent, DrawerFooter, DrawerHeader, type DrawerPosition, type DrawerProps, type DrawerRef, type DrawerSize, DrawerTitle, DropdownMenu, type DropdownMenuProps, DurationDisplay, type DurationDisplayProps, EmptyState, type EmptyStateProps, EntityMeta, type EntityMetaProps, ErrorState, type ErrorStateProps, EventCalendar, type EventCalendarProps, EyeIcon, EyeOffIcon, Field, type FieldBindingLike, type FieldProps, type FieldStatus, type FieldType, type FieldValue, FileUpload, type FileUploadProps, FiltersBar, type FiltersBarProps, FolderIcon, Form, type FormEntry, Field as FormField, type FormFieldConfig, type FormFieldGroup, type FieldProps as FormFieldProps, type FormProps, type FormShape, Heading, type HeadingProps, HomeIcon, HoverCard, type HoverCardProps, type IDrawerProps, type ILabelProps, type ITooltipProps, type ITooltipVariant, IconButton, type IconButtonProps, ImageUpload, type ImageUploadProps, InfoIcon, InlineCode, Input, InputNumber, type InputNumberProps, type InputProps, JsonEditor, type JsonEditorProps, KeyIcon, KpiGrid, type KpiGridProps, Label, type LabelProps, LockIcon, LogOutIcon, MarkdownEditor, type MarkdownEditorProps, type MenuEntry, type MenuItem, type MenuLabel, MenuList, type MenuListProps, type MenuSeparator, MiniCalendar, MinusIcon, Modal, type ModalProps, MonthPicker, type MonthPickerProps, MoreHorizontalIcon, MultiSelect, type MultiSelectProps, OtpInput, type OtpInputProps, Overlay, type OverlayPlacement, type OverlayProps, PageHeader, type PageHeaderProps, type PageSizeContext, Pagination, type PaginationProps, PasswordInput, type PasswordInputProps, type PasswordStrength, PencilIcon, PermissionGate, type PermissionGateProps, type PhoneCountry, PhoneInput, type PhoneInputProps, PlusIcon, Popover, type PopoverProps, Progress, type ProgressProps, QRCode, type QRCodeProps, Radio, RadioButton, type RadioButtonProps, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, type ReferenceOption, ReferenceSelect, type ReferenceSelectProps, RelativeTime, type RelativeTimeProps, RequireSession, type RequireSessionProps, ResizablePanel, type ResizablePanelProps, type ResourceDefinition, type ResourceField, type ResourceFormMode, RichTextEditor, type RichTextEditorProps, type RowAction, ScrollArea, type ScrollAreaProps, SearchIcon, SearchInput, type SearchInputProps, type SecretChanges, type SecretEntry, SecretFields, type SecretFieldsProps, Select, type SelectOption, type SelectProps, ServerIcon, SettingsIcon, Sidebar, type SidebarEntry, type SidebarItem, type SidebarProps, type SidebarRenderLink, type SidebarSection, type SidebarState, Skeleton, type SkeletonProps, Slider, type SliderProps, type SliderRangeValue, Sparkline, type SparklineProps, Spinner, type SpinnerProps, Stack, StarIcon, StatCard, type StatCardProps, Statistic, type StatisticProps, StatusBadge, type StatusBadgeProps, type StepItem, type StepStatus, Steps, type StepsProps, Switch, type SwitchProps, Tabs, TabsContent, TabsList, type TabsProps, TabsTrigger, TagsInput, type TagsInputProps, type TanStackRouterLike, Text, type TextProps, Textarea, type TextareaProps, type TimeParts, TimePicker, type TimePickerProps, TimeRangePicker, type TimeRangePickerProps, type TimeRangeValue, Timeline, type TimelineItem, type TimelineProps, Timer, type TimerProps, ToastProvider, type ToastProviderProps, Toaster, type ToasterProps, Toggle, ToggleGroup, type ToggleGroupOption, type ToggleGroupProps, type ToggleProps, Tooltip, type TooltipProps, type TooltipVariant, Tour, type TourProps, type TourStep, Transfer, type TransferItem, type TransferProps, TrashIcon, Tree, type TreeNode, type TreeProps, TreeSelect, type TreeSelectProps, UnsavedChangesGuard, type UnsavedChangesGuardProps, UploadIcon, type UseDataTableQueryOptions, UserIcon, UsersIcon, WeekPicker, type WeekPickerProps, XIcon, YearPicker, type YearPickerProps, activityColumns, clearSecretValues, confirmUnsavedNavigation, createTanStackRouterStorage, createUrlTableStorage, defineResource, formFieldNames, formatDuration, formatTimeValue, initialsOf, parseTimeValue, resourceColumns, resourceDefaults, resourceDetailColumns, resourceFormFields, resourcePermissions, resourceRowKey, resourceSearchKeys, resourceValidator, secretChanges, tintForName, toneOf, useDataTableQuery, useToast };
4731
+ export { Accordion, type AccordionItem, type AccordionProps, AccountMenu, type AccountMenuProps, type ActivityEntry, ActivityIcon, ActivityLog, type ActivityLogFilter, type ActivityLogProps, Alert, AlertCircleIcon, type AlertProps, AmountDisplay, type AmountDisplayProps, AppShell, AppShellBrand, type AppShellBrandProps, type AppShellCollapsible, type AppShellContentWidth, type AppShellMobileNav, type AppShellProps, AppShellRailItem, type AppShellRailItemProps, ArrowRightIcon, AspectRatio, type AspectRatioProps, AsyncState, type AsyncStateProps, type AuditEvent, AuditMeta, type AuditMetaProps, AuthLayout, type AuthLayoutProps, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarShape, type AvatarSize, type AvatarStatus, type AvatarTint, type AvatarVariant, Badge, type BadgeProps, BottomTabs, type BottomTabsProps, BrandIcon, type BrandIconData, type BrandIconProps, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Calendar, type CalendarDay, type CalendarEvent, CalendarIcon, type CalendarMode, type CalendarProps, type CalendarRangeValue, Can, type CanProps, Card, CardBody, type CardBodyProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, type CardProps, Chart, type ChartProps, type ChartSeries, CheckIcon, Checkbox, CheckboxGroup, type CheckboxGroupProps, type CheckboxProps, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ClockIcon, Collapse, type CollapseProps, ColorModeToggle, type ColorModeToggleProps, ColorPicker, type ColorPickerProps, type ColumnCardRole, type CommandItem, CommandPalette, type CommandPaletteProps, ConfirmDialog, type ConfirmDialogProps, Container, ContextMenu, type ContextMenuProps, Countdown, type CountdownProps, type CrudActionOptions, type CrudCreateOptions, type CrudDescriptionsProps, type CrudDialogOptions, type CrudDialogState, CrudDialogs, type CrudFormProps, type CrudModalProps, CrudPage, type CrudPageProps, CurrencyInput, type CurrencyInputProps, DEFAULT_COUNTRIES, DEFAULT_PAGE_SIZE_OPTIONS, DataTable, type DataTableColumn, type DataTableProps, type DataTableView, DatePicker, type DatePickerProps, DateRangeFilter, type DateRangeFilterProps, DateRangePicker, type DateRangePickerProps, type DateRangePreset, type DateRangeValue, DateTimePicker, type DateTimePickerProps, type DateTimeValue, type DescriptionItem, Descriptions, type DescriptionsProps, Divider, type DividerProps, Drawer, DrawerBody, DrawerClose, type DrawerComponent, DrawerFooter, DrawerHeader, type DrawerPosition, type DrawerProps, type DrawerRef, type DrawerSize, DrawerTitle, DropdownMenu, type DropdownMenuProps, DurationDisplay, type DurationDisplayProps, EmptyState, type EmptyStateProps, EntityMeta, type EntityMetaProps, ErrorState, type ErrorStateProps, EventCalendar, type EventCalendarLabels, type EventCalendarProps, type EventDraft, EventManager, type EventManagerLabels, type EventManagerProps, EyeIcon, EyeOffIcon, Field, type FieldBindingLike, type FieldControlOverrides, type FieldProps, type FieldStatus, type FieldType, type FieldValue, FileUpload, type FileUploadProps, FiltersBar, type FiltersBarProps, FolderIcon, Form, type FormEntry, Field as FormField, type FormFieldConfig, type FormFieldGroup, type FieldProps as FormFieldProps, type FormProps, type FormShape, Heading, type HeadingProps, HomeIcon, HoverCard, type HoverCardProps, type IDrawerProps, type ILabelProps, type ITooltipProps, type ITooltipVariant, IconButton, type IconButtonProps, ImageUpload, type ImageUploadProps, InfoIcon, InlineCode, Input, InputNumber, type InputNumberProps, type InputProps, type JobInstant, JobProgress, type JobProgressLabels, type JobProgressProps, type JobStatus, JsonEditor, type JsonEditorProps, JsonView, type JsonViewProps, KeyIcon, KpiGrid, type KpiGridProps, Label, type LabelProps, LiveIndicator, type LiveIndicatorProps, type LiveStatus, LockIcon, type LogLevel, type LogLine, LogOutIcon, LogStream, type LogStreamProps, MarkdownEditor, type MarkdownEditorProps, type MenuEntry, type MenuHeader, type MenuItem, type MenuLabel, MenuList, type MenuListProps, type MenuOverlayProps, type MenuSeparator, MiniCalendar, MinusIcon, Modal, type ModalProps, MonthPicker, type MonthPickerProps, MoonIcon, MoreHorizontalIcon, MultiSelect, type MultiSelectProps, OtpInput, type OtpInputProps, Overlay, type OverlayPlacement, type OverlayProps, PageHeader, type PageHeaderProps, type PageSizeContext, Pagination, type PaginationProps, PasswordInput, type PasswordInputProps, type PasswordStrength, PencilIcon, PermissionGate, type PermissionGateProps, type PhoneCountry, PhoneInput, type PhoneInputProps, PlusIcon, Popover, type PopoverProps, Progress, type ProgressProps, QRCode, type QRCodeProps, Radio, RadioButton, type RadioButtonProps, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, type ReferenceOption, ReferenceSelect, type ReferenceSelectProps, RelativeTime, type RelativeTimeProps, RequireSession, type RequireSessionProps, ResizablePanel, type ResizablePanelProps, type ResourceDefinition, type ResourceField, type ResourceFormMode, RichTextEditor, type RichTextEditorProps, type RowAction, ScrollArea, type ScrollAreaProps, SearchIcon, SearchInput, type SearchInputProps, type SecretChanges, type SecretEntry, SecretFields, type SecretFieldsProps, Select, type SelectOption, type SelectProps, ServerIcon, SettingsIcon, Sidebar, type SidebarEntry, type SidebarItem, type SidebarProps, type SidebarRenderLink, type SidebarSection, type SidebarState, Skeleton, type SkeletonProps, Slider, type SliderProps, type SliderRangeValue, Sparkline, type SparklineProps, Spinner, type SpinnerProps, Stack, StarIcon, StatCard, type StatCardProps, Statistic, type StatisticProps, StatusBadge, type StatusBadgeProps, type StepItem, type StepStatus, Steps, type StepsProps, SunIcon, Switch, type SwitchProps, Tabs, TabsContent, TabsList, type TabsProps, TabsTrigger, TagsInput, type TagsInputProps, type TanStackRouterLike, Text, type TextProps, Textarea, type TextareaProps, type TimeParts, TimePicker, type TimePickerProps, TimeRangePicker, type TimeRangePickerProps, type TimeRangeValue, Timeline, type TimelineItem, type TimelineProps, Timer, type TimerProps, ToastProvider, type ToastProviderProps, Toaster, type ToasterProps, Toggle, ToggleGroup, type ToggleGroupOption, type ToggleGroupProps, type ToggleProps, Tooltip, type TooltipProps, type TooltipVariant, Tour, type TourProps, type TourStep, Transfer, type TransferItem, type TransferProps, TrashIcon, Tree, type TreeNode, type TreeProps, TreeSelect, type TreeSelectProps, UnsavedChangesGuard, type UnsavedChangesGuardProps, UploadIcon, type UseDataTableQueryOptions, UserIcon, UsersIcon, WeekPicker, type WeekPickerProps, XIcon, YearPicker, type YearPickerProps, activityColumns, clearSecretValues, confirmUnsavedNavigation, createTanStackRouterStorage, createUrlTableStorage, defineResource, formFieldNames, formatDuration, formatTimeValue, initialsOf, parseTimeValue, resourceColumns, resourceDefaults, resourceDetailColumns, resourceFormFields, resourcePermissions, resourceRowKey, resourceSearchKeys, resourceValidator, secretChanges, tintForName, toneOf, useDataTableQuery, useToast };