@sia-ui/react-web 0.4.0 → 0.6.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,10 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { ReactNode, ReactElement, HTMLAttributes, RefObject, ImgHTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, Key, TextareaHTMLAttributes, ForwardRefExoticComponent, RefAttributes, SVGProps, CSSProperties, PropsWithChildren } from 'react';
4
- import { ComponentTone, ComponentSize } from '@sia-ui/tokens';
3
+ import { ReactNode, Key, RefObject, ReactElement, HTMLAttributes, ImgHTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, ForwardRefExoticComponent, RefAttributes, SVGProps, CSSProperties, PropsWithChildren } from 'react';
5
4
  import * as _sia_ui_headless from '@sia-ui/headless';
6
- import { PermissionRule, Placement, SliderValue, FormAdapter, FormValidator, TableQueryStorage, TableQueryState, TableQuery, SessionStore, SessionState, ToastPlacement, ToastId, ToastOptions } 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';
7
6
  export { SliderValue, ToastId, ToastOptions, ToastPlacement, ToastTone, toast, toastStore } from '@sia-ui/headless';
7
+ import { ComponentTone, ComponentSize } from '@sia-ui/tokens';
8
8
  import { Rule } from '@sia-ui/utils/validation';
9
9
 
10
10
  interface AccordionItem {
@@ -54,6 +54,330 @@ interface CollapseProps {
54
54
  /** Une section seule. Le même rendu, pour le cas le plus courant. */
55
55
  declare function Collapse({ title, children, description, meta, icon, open, defaultOpen, onOpenChange, variant, disabled, className, }: CollapseProps): react_jsx_runtime.JSX.Element;
56
56
 
57
+ /** Liste dense, ou grille de cartes. */
58
+ type DataTableView = "table" | "cards";
59
+ /**
60
+ * Le rôle d'une colonne dans la carte.
61
+ *
62
+ * `title` sert d'en-tête — la première colonne le prend si rien n'est
63
+ * déclaré. `meta` s'affiche en paire libellé / valeur. `hidden` reste au
64
+ * tableau seul : une carte qui recopie douze colonnes n'est plus une carte.
65
+ */
66
+ type ColumnCardRole = "title" | "meta" | "hidden";
67
+ interface DataTableColumn<T> {
68
+ key: string;
69
+ header: ReactNode;
70
+ /**
71
+ * Où lire la valeur : une clé de l'objet, ou une fonction pour les valeurs
72
+ * calculées. Sert au rendu par défaut, à la carte et à la recherche locale.
73
+ */
74
+ accessor?: keyof T | ((row: T) => unknown);
75
+ /** Rendu personnalisé. Prioritaire sur `accessor`. */
76
+ cell?: (row: T, index: number) => ReactNode;
77
+ align?: "start" | "center" | "end";
78
+ /**
79
+ * Largeur suggérée — `120px`, `20%`.
80
+ *
81
+ * En `layout="auto"` (défaut) le navigateur n'y voit qu'une indication.
82
+ * Pour qu'elle soit tenue, passer en `layout="fixed"`.
83
+ */
84
+ width?: string;
85
+ minWidth?: string;
86
+ /** Coupe au lieu d'élargir. Indispensable en `layout="fixed"`. */
87
+ truncate?: boolean;
88
+ /** Retire la colonne du tableau sans toucher à la carte. */
89
+ hidden?: boolean;
90
+ /** Rend l'en-tête cliquable. Le tri lui-même reste au serveur. */
91
+ sortable?: boolean;
92
+ /** Le champ envoyé au serveur, si différent de `key`. */
93
+ sortKey?: string;
94
+ /** Place de la colonne dans la carte. */
95
+ card?: ColumnCardRole;
96
+ headerClassName?: string;
97
+ cellClassName?: string;
98
+ }
99
+ interface RowAction<T> {
100
+ key: string;
101
+ label: ReactNode;
102
+ icon?: ReactNode;
103
+ tone?: ComponentTone;
104
+ /** Masque l'action pour cette ligne — un solde nul, un envoi déjà annulé. */
105
+ hidden?: (row: T, index: number) => boolean;
106
+ disabled?: (row: T, index: number) => boolean;
107
+ /** Même grammaire de droits que la navigation. */
108
+ permission?: PermissionRule;
109
+ /** Demande confirmation. Obligatoire pour tout ce qui détruit. */
110
+ confirm?: {
111
+ title: ReactNode;
112
+ description?: ReactNode;
113
+ confirmLabel?: string;
114
+ cancelLabel?: string;
115
+ destructive?: boolean;
116
+ };
117
+ onSelect: (row: T, index: number) => void | Promise<void>;
118
+ }
119
+ interface DataTableProps<T> {
120
+ columns: Array<DataTableColumn<T>>;
121
+ data: T[];
122
+ /** La clé d'une ligne. Sans elle, l'index — à éviter si les lignes bougent. */
123
+ getRowKey?: (row: T, index: number) => Key;
124
+ title?: ReactNode;
125
+ description?: ReactNode;
126
+ /** Zone libre : filtres, sélecteur de période. */
127
+ toolbar?: ReactNode;
128
+ /** Actions globales, à droite. */
129
+ actions?: ReactNode;
130
+ /**
131
+ * Les clés sur lesquelles porte la recherche.
132
+ *
133
+ * Absente, aucun champ n'est affiché : un tableau sans champ déclaré n'a
134
+ * rien à chercher. Le filtrage est local, sur les lignes déjà chargées.
135
+ */
136
+ searchKeys?: string[];
137
+ searchPlaceholder?: string;
138
+ /** Recherche déléguée. Fournie, le tableau cesse de filtrer lui-même. */
139
+ onSearch?: (query: string) => void;
140
+ /**
141
+ * Millisecondes d'inactivité avant d'appeler `onSearch`.
142
+ *
143
+ * `0` — le défaut — l'appelle à chaque frappe, ce qui convient à un
144
+ * filtrage local. Pour une recherche serveur, 300 évite une requête par
145
+ * lettre ; Entrée et l'effacement déclenchent sans attendre.
146
+ */
147
+ searchDelay?: number;
148
+ layout?: "auto" | "fixed";
149
+ /** Hauteur du corps. Sans elle, `stickyHeader` n'a rien où se coller. */
150
+ maxHeight?: string;
151
+ stickyHeader?: boolean;
152
+ density?: "compact" | "default" | "comfortable";
153
+ /** Un fond alterné, une ligne sur deux. */
154
+ striped?: boolean;
155
+ bordered?: boolean;
156
+ rowActions?: Array<RowAction<T>> | ((row: T, index: number) => Array<RowAction<T>>);
157
+ /** Au-delà, les actions passent dans un menu. */
158
+ inlineActionsLimit?: number;
159
+ actionsHeader?: ReactNode;
160
+ /** `icon` garde la colonne étroite sur un tableau déjà large. */
161
+ actionsDisplay?: "icon" | "label";
162
+ /** Évalue les règles de permission des actions. */
163
+ can?: (rule: PermissionRule) => boolean;
164
+ view?: DataTableView;
165
+ defaultView?: DataTableView;
166
+ onViewChange?: (view: DataTableView) => void;
167
+ showViewToggle?: boolean;
168
+ /**
169
+ * Bascule en cartes sous le point de rupture. Actif par défaut : un
170
+ * tableau à sept colonnes est illisible sur un téléphone.
171
+ */
172
+ responsive?: boolean;
173
+ cardsBreakpoint?: number;
174
+ /** Rendu complet d'une carte. Sans lui, elle est déduite des colonnes. */
175
+ renderCard?: (row: T, index: number) => ReactNode;
176
+ loading?: boolean;
177
+ /** Lignes fantômes pendant le premier chargement. */
178
+ skeletonRows?: number;
179
+ error?: ReactNode;
180
+ onRetry?: () => void;
181
+ empty?: {
182
+ title?: ReactNode;
183
+ description?: ReactNode;
184
+ action?: ReactNode;
185
+ };
186
+ /**
187
+ * Ajoute une colonne de cases à cocher.
188
+ *
189
+ * Sur une liste paginée côté serveur, la case d'en-tête ne porte que sur la
190
+ * page affichée : le composant ne connaît pas les lignes qu'il n'a pas
191
+ * reçues, et prétendre « tout sélectionner » serait un mensonge.
192
+ */
193
+ selectable?: boolean;
194
+ selectedKeys?: Key[];
195
+ defaultSelectedKeys?: Key[];
196
+ onSelectionChange?: (keys: Key[], rows: T[]) => void;
197
+ isRowSelectable?: (row: T, index: number) => boolean;
198
+ /** Barre affichée dès qu'une ligne est cochée. */
199
+ selectionActions?: (context: {
200
+ keys: Key[];
201
+ rows: T[];
202
+ clear: () => void;
203
+ }) => ReactNode;
204
+ sort?: {
205
+ field: string;
206
+ direction: "asc" | "desc";
207
+ } | null;
208
+ onSortChange?: (field: string) => void;
209
+ onRowClick?: (row: T, index: number) => void;
210
+ rowClassName?: (row: T, index: number) => string | undefined;
211
+ caption?: string;
212
+ className?: string;
213
+ }
214
+
215
+ /**
216
+ * Les douze placements du moteur de géométrie.
217
+ *
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.
222
+ */
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;
233
+ className?: string;
234
+ id?: string;
235
+ role?: string;
236
+ }
237
+ /**
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.
243
+ *
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.
246
+ */
247
+ declare function Overlay({ open, anchorRef, onOpenChange, children, placement, offset, matchAnchorWidth, viewportPadding, className, ...props }: OverlayProps): react.ReactPortal | null;
248
+
249
+ interface SelectOption {
250
+ value: string;
251
+ label: ReactNode;
252
+ description?: ReactNode;
253
+ disabled?: boolean;
254
+ keywords?: string[];
255
+ }
256
+ interface SelectProps {
257
+ id?: string;
258
+ name?: string;
259
+ options?: SelectOption[];
260
+ /** Compatibility path. Prefer the options prop. */
261
+ children?: ReactNode;
262
+ value?: string;
263
+ defaultValue?: string;
264
+ onValueChange?: (value: string, option?: SelectOption) => void;
265
+ placeholder?: string;
266
+ searchable?: boolean;
267
+ searchPlaceholder?: string;
268
+ fetcher?: (query: string, signal?: AbortSignal) => Promise<SelectOption[]>;
269
+ debounce?: number;
270
+ loadingText?: ReactNode;
271
+ emptyText?: ReactNode;
272
+ errorText?: ReactNode;
273
+ clearable?: boolean;
274
+ disabled?: boolean;
275
+ invalid?: boolean;
276
+ required?: boolean;
277
+ placement?: OverlayPlacement;
278
+ /**
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 ».
283
+ */
284
+ renderValue?: (option: SelectOption | undefined) => ReactNode;
285
+ /**
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`.
289
+ */
290
+ variant?: "default" | "embedded";
291
+ className?: string;
292
+ "aria-label"?: string;
293
+ "aria-describedby"?: string;
294
+ "aria-labelledby"?: string;
295
+ "aria-invalid"?: boolean;
296
+ "aria-required"?: boolean;
297
+ }
298
+ /**
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.
305
+ *
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.
308
+ */
309
+ declare const Select: react.ForwardRefExoticComponent<SelectProps & react.RefAttributes<HTMLButtonElement>>;
310
+
311
+ /** Une entrée de journal, dans sa forme la plus courante. */
312
+ interface ActivityEntry {
313
+ id: string | number;
314
+ /** Quand : une date ISO, un horodatage ou une `Date`. */
315
+ at: string | number | Date;
316
+ /** Qui : un nom lisible. */
317
+ actor: string;
318
+ /** Quoi : un code — `create`, `delete`, `login`. */
319
+ action: string;
320
+ /** Sur quoi : « Projet Atlas », « Compte ovh-prod ». */
321
+ target?: string | undefined;
322
+ /** Le type de la cible : `project`, `account`. */
323
+ targetType?: string | undefined;
324
+ /** Une phrase de contexte, facultative. */
325
+ summary?: ReactNode;
326
+ }
327
+ /** Un filtre déclaré : une clé de requête et ses choix. */
328
+ interface ActivityLogFilter {
329
+ /** La clé envoyée au serveur : `actor`, `action`, `targetType`. */
330
+ key: string;
331
+ label: string;
332
+ options: SelectOption[];
333
+ /** Cherchable au-delà d'une dizaine de choix. */
334
+ searchable?: boolean;
335
+ }
336
+ interface ActivityLogProps<T = ActivityEntry> {
337
+ entries: T[];
338
+ /**
339
+ * L'état de la requête : page, taille, recherche, filtres.
340
+ *
341
+ * `useDataTableQuery()` le fournit, synchronisé avec l'URL ou le routeur ;
342
+ * `query.params` part tel quel au serveur. Le journal ne filtre rien
343
+ * lui-même : un journal se compte en milliers de lignes.
344
+ */
345
+ query: TableQuery;
346
+ totalPages?: number;
347
+ filters?: ActivityLogFilter[];
348
+ /** Absente, la recherche n'est pas proposée. */
349
+ searchPlaceholder?: string;
350
+ /** Par défaut, les colonnes d'une `ActivityEntry`. */
351
+ columns?: Array<DataTableColumn<T>>;
352
+ getRowKey?: (row: T, index: number) => Key;
353
+ /** Le ton de chaque action dans les colonnes par défaut. */
354
+ actionTones?: Record<string, ComponentTone>;
355
+ /** Le libellé de chaque action — « Suppression » pour `delete`. */
356
+ actionLabels?: Record<string, ReactNode>;
357
+ title?: ReactNode;
358
+ description?: ReactNode;
359
+ headingLevel?: 1 | 2 | 3;
360
+ loading?: boolean;
361
+ error?: ReactNode;
362
+ onRetry?: () => void;
363
+ empty?: DataTableProps<T>["empty"];
364
+ className?: string;
365
+ }
366
+ /** Les colonnes d'une `ActivityEntry` : quand, qui, quoi, sur quoi. */
367
+ declare function activityColumns(options?: {
368
+ actionTones?: Record<string, ComponentTone> | undefined;
369
+ actionLabels?: Record<string, ReactNode> | undefined;
370
+ }): Array<DataTableColumn<ActivityEntry>>;
371
+ /**
372
+ * Un journal d'activité, filtrable et paginé par le serveur.
373
+ *
374
+ * `AuditMeta` et `Timeline` racontent l'histoire d'un objet ; ce bloc sert
375
+ * l'autre question — qui a fait quoi, sur tout le système, cette semaine.
376
+ * Filtres déclarés, recherche temporisée, pagination et taille de page : tout
377
+ * passe par la requête, rien n'est filtré dans le navigateur.
378
+ */
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;
380
+
57
381
  interface AlertProps {
58
382
  tone?: ComponentTone;
59
383
  title?: ReactNode;
@@ -415,129 +739,46 @@ interface AsyncStateProps {
415
739
  */
416
740
  declare function AsyncState({ loading, error, empty, emptyTitle, emptyDescription, onRetry, children }: AsyncStateProps): react_jsx_runtime.JSX.Element;
417
741
 
418
- interface AuditEvent {
419
- label: ReactNode;
420
- at: Date | string | number;
421
- by?: ReactNode;
422
- detail?: ReactNode;
423
- }
424
- interface AuditMetaProps {
425
- events: AuditEvent[];
426
- locale?: string;
427
- title?: ReactNode;
428
- emptyLabel?: ReactNode;
429
- className?: string;
430
- }
431
- /**
432
- * Qui a fait quoi, et quand.
433
- *
434
- * Une liste d'événements plutôt qu'un dernier état : savoir qu'une facture
435
- * a été validée n'apprend rien si l'on ignore qu'elle avait été rejetée la
436
- * veille. Les dates sont relatives — « il y a deux jours » se compare sans
437
- * calcul mental.
438
- */
439
- declare function AuditMeta({ events, locale, title, emptyLabel, className }: AuditMetaProps): react_jsx_runtime.JSX.Element;
440
-
441
- interface AuthLayoutProps {
442
- title: ReactNode;
443
- description?: ReactNode;
444
- logo?: ReactNode;
445
- aside?: ReactNode;
446
- children: ReactNode;
447
- footer?: ReactNode;
448
- className?: string;
449
- }
450
- /**
451
- * La page qui précède l'application : connexion, inscription, mot de passe
452
- * oublié.
453
- *
454
- * Elle n'a ni navigation ni coquille, et c'est délibéré : tout ce qui mène
455
- * ailleurs est hors de portée de quelqu'un qui n'est pas encore entré.
456
- */
457
- declare function AuthLayout({ title, description, logo, aside, children, footer, className, }: AuthLayoutProps): react_jsx_runtime.JSX.Element;
458
-
459
- /**
460
- * Les douze placements du moteur de géométrie.
461
- *
462
- * Ce composant n'en exposait que quatre — haut et bas — parce qu'il calculait
463
- * lui-même sa position, en vertical seulement. Le calcul vit dans
464
- * `@sia-ui/headless`, sait basculer et recadrer dans les deux axes, et sert
465
- * déjà le natif : le refaire ici privait tous les flottants des côtés.
466
- */
467
- type OverlayPlacement = Placement;
468
- interface OverlayProps {
469
- open: boolean;
470
- anchorRef: RefObject<HTMLElement | null>;
471
- onOpenChange: (open: boolean) => void;
472
- children: ReactNode;
473
- placement?: OverlayPlacement;
474
- offset?: number;
475
- matchAnchorWidth?: boolean;
476
- viewportPadding?: number;
477
- className?: string;
478
- id?: string;
479
- role?: string;
480
- }
481
- /**
482
- * Ce qui flotte à côté d'un élément.
483
- *
484
- * Le socle des menus, des listes déroulantes et des infobulles. Il place le
485
- * panneau parmi douze positions, le retourne quand le bord de la fenêtre
486
- * approche, et le ramène dans la vue plutôt que de le laisser déborder.
487
- *
488
- * Le calcul vit dans `@sia-ui/headless` : il ne dépend d'aucun rendu, et
489
- * sert donc aussi à ce qui n'est pas le DOM.
490
- */
491
- declare function Overlay({ open, anchorRef, onOpenChange, children, placement, offset, matchAnchorWidth, viewportPadding, className, ...props }: OverlayProps): react.ReactPortal | null;
492
-
493
- interface SelectOption {
494
- value: string;
495
- label: ReactNode;
496
- description?: ReactNode;
497
- disabled?: boolean;
498
- keywords?: string[];
499
- }
500
- interface SelectProps {
501
- id?: string;
502
- name?: string;
503
- options?: SelectOption[];
504
- /** Compatibility path. Prefer the options prop. */
505
- children?: ReactNode;
506
- value?: string;
507
- defaultValue?: string;
508
- onValueChange?: (value: string, option?: SelectOption) => void;
509
- placeholder?: string;
510
- searchable?: boolean;
511
- searchPlaceholder?: string;
512
- fetcher?: (query: string, signal?: AbortSignal) => Promise<SelectOption[]>;
513
- debounce?: number;
514
- loadingText?: ReactNode;
515
- emptyText?: ReactNode;
516
- errorText?: ReactNode;
517
- clearable?: boolean;
518
- disabled?: boolean;
519
- invalid?: boolean;
520
- required?: boolean;
521
- placement?: OverlayPlacement;
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;
522
753
  className?: string;
523
- "aria-label"?: string;
524
- "aria-describedby"?: string;
525
- "aria-labelledby"?: string;
526
- "aria-invalid"?: boolean;
527
- "aria-required"?: boolean;
528
754
  }
529
755
  /**
530
- * Un choix parmi une liste.
756
+ * Qui a fait quoi, et quand.
531
757
  *
532
- * Le champ n'est pas un `<select>` natif : celui-ci ne sait ni chercher, ni
533
- * afficher une description sous chaque option, ni charger ses choix à la
534
- * demande. Le comportement clavier du natif, lui, est reproduit — flèches,
535
- * première lettre, échappement.
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é.
536
777
  *
537
- * `fetcher` sert les listes qu'on ne peut pas descendre en entier : la
538
- * requête part après la frappe et s'annule si l'on continue à taper.
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é.
539
780
  */
540
- declare const Select: react.ForwardRefExoticComponent<SelectProps & react.RefAttributes<HTMLButtonElement>>;
781
+ declare function AuthLayout({ title, description, logo, aside, children, footer, className, }: AuthLayoutProps): react_jsx_runtime.JSX.Element;
541
782
 
542
783
  interface AutocompleteProps {
543
784
  id?: string;
@@ -675,6 +916,39 @@ interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
675
916
  * qui agit est un bouton.
676
917
  */
677
918
  declare function Badge({ tone: toneProp, variant: variantProp, left, right, loading, loadingLabel: loadingLabelProp, spinnerProps, className, children, ...props }: BadgeProps): react_jsx_runtime.JSX.Element;
919
+ /**
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
+ * ```
929
+ */
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;
942
+ }
943
+ /**
944
+ * Une valeur rendue en pastille, ton et libellé tirés de deux tables.
945
+ *
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.
950
+ */
951
+ declare function StatusBadge({ value, tones, labels, fallbackTone, empty, ...props }: StatusBadgeProps): react_jsx_runtime.JSX.Element;
678
952
 
679
953
  interface BreadcrumbItem {
680
954
  key?: string;
@@ -1025,156 +1299,6 @@ type CountdownProps = Omit<TimerProps, "direction">;
1025
1299
  */
1026
1300
  declare function Countdown(props: CountdownProps): react_jsx_runtime.JSX.Element;
1027
1301
 
1028
- /** Liste dense, ou grille de cartes. */
1029
- type DataTableView = "table" | "cards";
1030
- /**
1031
- * Le rôle d'une colonne dans la carte.
1032
- *
1033
- * `title` sert d'en-tête — la première colonne le prend si rien n'est
1034
- * déclaré. `meta` s'affiche en paire libellé / valeur. `hidden` reste au
1035
- * tableau seul : une carte qui recopie douze colonnes n'est plus une carte.
1036
- */
1037
- type ColumnCardRole = "title" | "meta" | "hidden";
1038
- interface DataTableColumn<T> {
1039
- key: string;
1040
- header: ReactNode;
1041
- /**
1042
- * Où lire la valeur : une clé de l'objet, ou une fonction pour les valeurs
1043
- * calculées. Sert au rendu par défaut, à la carte et à la recherche locale.
1044
- */
1045
- accessor?: keyof T | ((row: T) => unknown);
1046
- /** Rendu personnalisé. Prioritaire sur `accessor`. */
1047
- cell?: (row: T, index: number) => ReactNode;
1048
- align?: "start" | "center" | "end";
1049
- /**
1050
- * Largeur suggérée — `120px`, `20%`.
1051
- *
1052
- * En `layout="auto"` (défaut) le navigateur n'y voit qu'une indication.
1053
- * Pour qu'elle soit tenue, passer en `layout="fixed"`.
1054
- */
1055
- width?: string;
1056
- minWidth?: string;
1057
- /** Coupe au lieu d'élargir. Indispensable en `layout="fixed"`. */
1058
- truncate?: boolean;
1059
- /** Retire la colonne du tableau sans toucher à la carte. */
1060
- hidden?: boolean;
1061
- /** Rend l'en-tête cliquable. Le tri lui-même reste au serveur. */
1062
- sortable?: boolean;
1063
- /** Le champ envoyé au serveur, si différent de `key`. */
1064
- sortKey?: string;
1065
- /** Place de la colonne dans la carte. */
1066
- card?: ColumnCardRole;
1067
- headerClassName?: string;
1068
- cellClassName?: string;
1069
- }
1070
- interface RowAction<T> {
1071
- key: string;
1072
- label: ReactNode;
1073
- icon?: ReactNode;
1074
- tone?: ComponentTone;
1075
- /** Masque l'action pour cette ligne — un solde nul, un envoi déjà annulé. */
1076
- hidden?: (row: T, index: number) => boolean;
1077
- disabled?: (row: T, index: number) => boolean;
1078
- /** Même grammaire de droits que la navigation. */
1079
- permission?: PermissionRule;
1080
- /** Demande confirmation. Obligatoire pour tout ce qui détruit. */
1081
- confirm?: {
1082
- title: ReactNode;
1083
- description?: ReactNode;
1084
- confirmLabel?: string;
1085
- cancelLabel?: string;
1086
- destructive?: boolean;
1087
- };
1088
- onSelect: (row: T, index: number) => void | Promise<void>;
1089
- }
1090
- interface DataTableProps<T> {
1091
- columns: Array<DataTableColumn<T>>;
1092
- data: T[];
1093
- /** La clé d'une ligne. Sans elle, l'index — à éviter si les lignes bougent. */
1094
- getRowKey?: (row: T, index: number) => Key;
1095
- title?: ReactNode;
1096
- description?: ReactNode;
1097
- /** Zone libre : filtres, sélecteur de période. */
1098
- toolbar?: ReactNode;
1099
- /** Actions globales, à droite. */
1100
- actions?: ReactNode;
1101
- /**
1102
- * Les clés sur lesquelles porte la recherche.
1103
- *
1104
- * Absente, aucun champ n'est affiché : un tableau sans champ déclaré n'a
1105
- * rien à chercher. Le filtrage est local, sur les lignes déjà chargées.
1106
- */
1107
- searchKeys?: string[];
1108
- searchPlaceholder?: string;
1109
- /** Recherche déléguée. Fournie, le tableau cesse de filtrer lui-même. */
1110
- onSearch?: (query: string) => void;
1111
- layout?: "auto" | "fixed";
1112
- /** Hauteur du corps. Sans elle, `stickyHeader` n'a rien où se coller. */
1113
- maxHeight?: string;
1114
- stickyHeader?: boolean;
1115
- density?: "compact" | "default" | "comfortable";
1116
- /** Un fond alterné, une ligne sur deux. */
1117
- striped?: boolean;
1118
- bordered?: boolean;
1119
- rowActions?: Array<RowAction<T>> | ((row: T, index: number) => Array<RowAction<T>>);
1120
- /** Au-delà, les actions passent dans un menu. */
1121
- inlineActionsLimit?: number;
1122
- actionsHeader?: ReactNode;
1123
- /** `icon` garde la colonne étroite sur un tableau déjà large. */
1124
- actionsDisplay?: "icon" | "label";
1125
- /** Évalue les règles de permission des actions. */
1126
- can?: (rule: PermissionRule) => boolean;
1127
- view?: DataTableView;
1128
- defaultView?: DataTableView;
1129
- onViewChange?: (view: DataTableView) => void;
1130
- showViewToggle?: boolean;
1131
- /**
1132
- * Bascule en cartes sous le point de rupture. Actif par défaut : un
1133
- * tableau à sept colonnes est illisible sur un téléphone.
1134
- */
1135
- responsive?: boolean;
1136
- cardsBreakpoint?: number;
1137
- /** Rendu complet d'une carte. Sans lui, elle est déduite des colonnes. */
1138
- renderCard?: (row: T, index: number) => ReactNode;
1139
- loading?: boolean;
1140
- /** Lignes fantômes pendant le premier chargement. */
1141
- skeletonRows?: number;
1142
- error?: ReactNode;
1143
- onRetry?: () => void;
1144
- empty?: {
1145
- title?: ReactNode;
1146
- description?: ReactNode;
1147
- action?: ReactNode;
1148
- };
1149
- /**
1150
- * Ajoute une colonne de cases à cocher.
1151
- *
1152
- * Sur une liste paginée côté serveur, la case d'en-tête ne porte que sur la
1153
- * page affichée : le composant ne connaît pas les lignes qu'il n'a pas
1154
- * reçues, et prétendre « tout sélectionner » serait un mensonge.
1155
- */
1156
- selectable?: boolean;
1157
- selectedKeys?: Key[];
1158
- defaultSelectedKeys?: Key[];
1159
- onSelectionChange?: (keys: Key[], rows: T[]) => void;
1160
- isRowSelectable?: (row: T, index: number) => boolean;
1161
- /** Barre affichée dès qu'une ligne est cochée. */
1162
- selectionActions?: (context: {
1163
- keys: Key[];
1164
- rows: T[];
1165
- clear: () => void;
1166
- }) => ReactNode;
1167
- sort?: {
1168
- field: string;
1169
- direction: "asc" | "desc";
1170
- } | null;
1171
- onSortChange?: (field: string) => void;
1172
- onRowClick?: (row: T, index: number) => void;
1173
- rowClassName?: (row: T, index: number) => string | undefined;
1174
- caption?: string;
1175
- className?: string;
1176
- }
1177
-
1178
1302
  interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
1179
1303
  invalid?: boolean;
1180
1304
  left?: ReactNode;
@@ -1719,6 +1843,8 @@ interface FormFieldGroup {
1719
1843
  fields: FormFieldConfig[];
1720
1844
  }
1721
1845
  type FormEntry = FormFieldConfig | FormFieldGroup;
1846
+ /** Les noms de champs, groupes aplatis. */
1847
+ declare function formFieldNames(fields: FormEntry[]): string[];
1722
1848
  /**
1723
1849
  * Les valeurs qu'un formulaire déclaratif peut porter.
1724
1850
  *
@@ -1740,7 +1866,14 @@ interface FormProps<TValues extends FormShape = FormShape> {
1740
1866
  defaultValues?: TValues;
1741
1867
  /** La validation. Un schéma Zod s'y branche en cinq lignes. */
1742
1868
  validate?: FormValidator<TValues>;
1743
- onSubmit?: (values: TValues) => void | Promise<void>;
1869
+ /**
1870
+ * L'envoi.
1871
+ *
1872
+ * Rendre des erreurs par champ les pose sous les champs. Lever une erreur
1873
+ * l'affiche dans une alerte en tête des boutons — et une `HttpError` de
1874
+ * `@sia-ui/api` voit en plus ses erreurs de champ posées à leur place.
1875
+ */
1876
+ onSubmit?: (values: TValues) => FormSubmitResult<TValues> | Promise<FormSubmitResult<TValues>>;
1744
1877
  columns?: number;
1745
1878
  submitText?: ReactNode;
1746
1879
  clearText?: ReactNode;
@@ -1801,6 +1934,8 @@ declare function Form<TValues extends FormShape = FormShape>({ fields, form: ada
1801
1934
  * même client finissent toujours par diverger, et c'est le formulaire qui
1802
1935
  * oublie le champ que le tableau affiche.
1803
1936
  */
1937
+ /** Le formulaire ouvert : une création, ou la modification d'une ligne. */
1938
+ type ResourceFormMode = "create" | "edit";
1804
1939
  interface ResourceField<T = unknown> {
1805
1940
  /** Le contrôle de saisie et le rendu par défaut. `text` sans précision. */
1806
1941
  type?: FieldType;
@@ -1809,7 +1944,13 @@ interface ResourceField<T = unknown> {
1809
1944
  description?: ReactNode;
1810
1945
  helpText?: ReactNode;
1811
1946
  placeholder?: string;
1812
- required?: boolean;
1947
+ /**
1948
+ * Obligatoire toujours, ou dans un seul mode.
1949
+ *
1950
+ * `"create"` sert au mot de passe initial : exigé à la création, facultatif
1951
+ * ensuite — le laisser vide en modification veut dire « inchangé ».
1952
+ */
1953
+ required?: boolean | ResourceFormMode;
1813
1954
  /** Les règles en plus de `required`. Celles du type sont ajoutées seules. */
1814
1955
  rules?: Array<Rule<never>>;
1815
1956
  /** Les choix d'un `select`, `radio` ou `multiselect`. */
@@ -1826,8 +1967,11 @@ interface ResourceField<T = unknown> {
1826
1967
  readOnly?: boolean;
1827
1968
  /** Par défaut, tout sauf les types trop longs pour une cellule. */
1828
1969
  inTable?: boolean;
1829
- /** Par défaut, tout sauf `readOnly`. */
1830
- inForm?: boolean;
1970
+ /**
1971
+ * Par défaut, tout sauf `readOnly` et les valeurs calculées. `"create"` ou
1972
+ * `"edit"` limitent le champ à l'un des deux formulaires.
1973
+ */
1974
+ inForm?: boolean | ResourceFormMode;
1831
1975
  /** Par défaut, tout. */
1832
1976
  inDetail?: boolean;
1833
1977
  /** Par défaut, les types textuels. */
@@ -1854,6 +1998,15 @@ interface ResourceField<T = unknown> {
1854
1998
  tones?: Record<string, ComponentTone>;
1855
1999
  /** Le rendu en tableau et en détail. Écrase celui déduit du type. */
1856
2000
  render?: (row: T, index: number) => ReactNode;
2001
+ /**
2002
+ * Une valeur calculée plutôt que lue sur la ligne.
2003
+ *
2004
+ * La colonne peut alors porter une clé qui n'est pas une propriété de `T`
2005
+ * — un nom complet, un solde — sans élargir le type de la ligne. Le rendu
2006
+ * par défaut, la carte et la recherche locale passent par elle. Une valeur
2007
+ * calculée ne se saisit pas : elle sort du formulaire, sauf `inForm`.
2008
+ */
2009
+ value?: (row: T) => unknown;
1857
2010
  }
1858
2011
  interface ResourceDefinition<T> {
1859
2012
  /** L'identifiant technique — sert aux droits et aux clés de cache. */
@@ -1928,17 +2081,17 @@ declare function resourceColumns<T>(resource: ResourceDefinition<T>): Array<Data
1928
2081
  */
1929
2082
  declare function resourceDetailColumns<T>(resource: ResourceDefinition<T>): Array<DataTableColumn<T>>;
1930
2083
  /** Les champs du formulaire, groupés si la déclaration les groupe. */
1931
- declare function resourceFormFields<T>(resource: ResourceDefinition<T>): FormEntry[];
2084
+ declare function resourceFormFields<T>(resource: ResourceDefinition<T>, mode?: ResourceFormMode): FormEntry[];
1932
2085
  /**
1933
2086
  * La validation, dérivée des types et des `required`.
1934
2087
  *
1935
2088
  * Un champ `email` valide une adresse sans qu'on le demande : le type le dit
1936
2089
  * déjà. Les règles déclarées s'y ajoutent, elles ne les remplacent pas.
1937
2090
  */
1938
- declare function resourceValidator<T>(resource: ResourceDefinition<T>): FormValidator<FormShape> | undefined;
2091
+ declare function resourceValidator<T>(resource: ResourceDefinition<T>, mode?: ResourceFormMode): FormValidator<FormShape> | undefined;
1939
2092
  /** Les clés que la recherche locale parcourt. */
1940
2093
  declare function resourceSearchKeys<T>(resource: ResourceDefinition<T>): string[];
1941
- /** Les valeurs de départ d'une création. */
2094
+ /** Les valeurs de départ d'une création : les champs du mode `create`. */
1942
2095
  declare function resourceDefaults<T>(resource: ResourceDefinition<T>): FormShape;
1943
2096
  /** Comment lire la clé d'une ligne. */
1944
2097
  declare function resourceRowKey<T>(resource: ResourceDefinition<T>): (row: T, index: number) => Key;
@@ -1982,11 +2135,18 @@ interface CrudDialogsProps<T> {
1982
2135
  columns: Array<DataTableColumn<T>>;
1983
2136
  fields?: FormEntry[] | undefined;
1984
2137
  validate?: FormValidator<FormShape> | undefined;
2138
+ /**
2139
+ * Les champs et la validation de la modification, quand ils diffèrent de
2140
+ * la création — un mot de passe exigé à la création seulement. À défaut,
2141
+ * `fields` et `validate` servent aux deux.
2142
+ */
2143
+ editFields?: FormEntry[] | undefined;
2144
+ editValidate?: FormValidator<FormShape> | undefined;
1985
2145
  onSubmit?: ((values: FormShape, context: {
1986
2146
  mode: "create" | "edit";
1987
2147
  row?: T;
1988
2148
  index?: number;
1989
- }) => void | Promise<void>) | undefined;
2149
+ }) => FormSubmitResult<FormShape> | Promise<FormSubmitResult<FormShape>>) | undefined;
1990
2150
  createDefaults?: FormShape | undefined;
1991
2151
  toFormValues?: ((row: T) => FormShape) | undefined;
1992
2152
  renderDetail?: ((row: T, index: number) => ReactNode) | undefined;
@@ -2001,7 +2161,7 @@ interface CrudDialogsProps<T> {
2001
2161
  * laquelle ouvrir, avec quelles valeurs, et de refermer une fois l'envoi
2002
2162
  * passé.
2003
2163
  */
2004
- declare function CrudDialogs<T>({ state, onClose, columns, fields, validate, onSubmit, createDefaults, toFormValues, renderDetail, getRowKey, dialog, }: CrudDialogsProps<T>): react_jsx_runtime.JSX.Element;
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;
2005
2165
 
2006
2166
  /**
2007
2167
  * La personnalisation d'une action standard.
@@ -2030,6 +2190,12 @@ interface CrudPageBase<T> {
2030
2190
  title?: ReactNode;
2031
2191
  description?: ReactNode;
2032
2192
  eyebrow?: ReactNode;
2193
+ /**
2194
+ * Le niveau du titre. `1` pour un écran ; `2` quand la liste est une
2195
+ * section d'une fiche — les comptes d'un fournisseur — qui a déjà son
2196
+ * `<h1>`.
2197
+ */
2198
+ headingLevel?: 1 | 2 | 3;
2033
2199
  data: T[];
2034
2200
  getRowKey?: (row: T, index: number) => Key;
2035
2201
  /**
@@ -2055,12 +2221,17 @@ interface CrudPageBase<T> {
2055
2221
  * propre à cette page, aucune bibliothèque imposée.
2056
2222
  */
2057
2223
  fields?: FormEntry[];
2058
- /** Ce que la page fait d'un formulaire envoyé. */
2224
+ /**
2225
+ * Ce que la page fait d'un formulaire envoyé.
2226
+ *
2227
+ * Rendre des erreurs par champ, ou lever une `HttpError`, garde la boîte
2228
+ * ouverte avec les erreurs affichées ; sinon elle se ferme.
2229
+ */
2059
2230
  onSubmit?: (values: FormShape, context: {
2060
2231
  mode: "create" | "edit";
2061
2232
  row?: T;
2062
2233
  index?: number;
2063
- }) => void | Promise<void>;
2234
+ }) => FormSubmitResult<FormShape> | Promise<FormSubmitResult<FormShape>>;
2064
2235
  /**
2065
2236
  * La validation, sous la même forme que `Form`.
2066
2237
  *
@@ -2110,6 +2281,8 @@ interface CrudPageBase<T> {
2110
2281
  searchKeys?: string[];
2111
2282
  searchPlaceholder?: string;
2112
2283
  onSearch?: (query: string) => void;
2284
+ /** Temporise `onSearch` — voir `DataTable`. 300 pour une recherche serveur. */
2285
+ searchDelay?: number;
2113
2286
  loading?: boolean;
2114
2287
  error?: ReactNode;
2115
2288
  onRetry?: () => void;
@@ -2117,6 +2290,11 @@ interface CrudPageBase<T> {
2117
2290
  page?: number;
2118
2291
  totalPages?: number;
2119
2292
  onPageChange?: (page: number) => void;
2293
+ /** Avec `onPageSizeChange`, ajoute le choix du nombre de lignes par page. */
2294
+ pageSize?: number;
2295
+ onPageSizeChange?: (pageSize: number) => void;
2296
+ /** Les tailles proposées — voir `Pagination`. */
2297
+ pageSizeOptions?: number[];
2120
2298
  /**
2121
2299
  * Ce qui n'a pas de raccourci ici passe au tableau tel quel — densité,
2122
2300
  * mode cartes, tri, colonnes figées.
@@ -2158,7 +2336,7 @@ type CrudPageProps<T> = CrudPageBase<T> & ({
2158
2336
  *
2159
2337
  * Ici, fournir le gestionnaire suffit. Ne pas le fournir retire l'action.
2160
2338
  */
2161
- declare function CrudPage<T>({ resource, title, description, eyebrow, 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, loading, error, onRetry, empty, page, totalPages, onPageChange, table, children, className, }: CrudPageProps<T>): react_jsx_runtime.JSX.Element;
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;
2162
2340
 
2163
2341
  /**
2164
2342
  * L'état du tableau dans la barre d'adresse.
@@ -2176,6 +2354,17 @@ interface UseDataTableQueryOptions {
2176
2354
  history?: "replace" | "push";
2177
2355
  /** Préfixe des clés, pour deux tableaux sur la même page. */
2178
2356
  prefix?: string;
2357
+ /**
2358
+ * Un autre endroit où ranger l'état — le plus souvent le routeur.
2359
+ *
2360
+ * La barre d'adresse écrite directement passe sous le nez d'un routeur qui
2361
+ * tient ses propres paramètres (TanStack Router, React Router) : il ne voit
2362
+ * pas le changement, et le réécrit au prochain rendu. Fourni, ce stockage
2363
+ * remplace celui de l'URL, et `syncUrl` / `history` sont ignorés.
2364
+ */
2365
+ storage?: TableQueryStorage;
2366
+ /** Les noms des paramètres serveur — `limit`, `sort` + `order`… */
2367
+ serverParams?: TableParamsMapping;
2179
2368
  }
2180
2369
  /**
2181
2370
  * Tri, filtres et pagination d'un tableau, synchronisés avec l'URL.
@@ -2196,7 +2385,7 @@ declare function useDataTableQuery(options?: UseDataTableQueryOptions): TableQue
2196
2385
  * elle filtre les lignes déjà chargées — ce qui suffit tant que tout tient
2197
2386
  * sur une page.
2198
2387
  */
2199
- declare function DataTable<T>({ columns, data, getRowKey, title, description, toolbar, actions, searchKeys, searchPlaceholder, onSearch, 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;
2388
+ 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;
2200
2389
 
2201
2390
  type DateRangeValue = CalendarRangeValue;
2202
2391
  interface DateRangePickerProps extends Pick<CalendarProps, "locale" | "firstDayOfWeek" | "disabledDate" | "cellRender" | "showWeek"> {
@@ -2581,6 +2770,16 @@ declare function InfoIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2581
2770
  declare function SettingsIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2582
2771
  declare function EyeIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2583
2772
  declare function EyeOffIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2773
+ declare function HomeIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2774
+ declare function FolderIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2775
+ declare function ServerIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2776
+ declare function UserIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2777
+ declare function UsersIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2778
+ declare function ActivityIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2779
+ declare function KeyIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2780
+ declare function LockIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2781
+ declare function LogOutIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2782
+ declare function PencilIcon(props: IconProps): react_jsx_runtime.JSX.Element;
2584
2783
 
2585
2784
  interface InputNumberProps extends Omit<InputProps, "value" | "defaultValue" | "onChange" | "type" | "right"> {
2586
2785
  value?: number | null;
@@ -2685,6 +2884,14 @@ interface PageHeaderProps {
2685
2884
  description?: ReactNode;
2686
2885
  eyebrow?: ReactNode;
2687
2886
  actions?: ReactNode;
2887
+ /**
2888
+ * Le niveau du titre. `1` — le défaut — pour l'en-tête d'un écran.
2889
+ *
2890
+ * `2` ou `3` pour une section dans un écran qui a déjà son `<h1>` : la
2891
+ * liste des environnements dans la fiche d'un projet. Le titre y est plus
2892
+ * petit et l'espace sous l'en-tête plus court.
2893
+ */
2894
+ level?: 1 | 2 | 3;
2688
2895
  className?: string;
2689
2896
  }
2690
2897
  /**
@@ -2692,9 +2899,10 @@ interface PageHeaderProps {
2692
2899
  *
2693
2900
  * Un seul `<h1>` par page, rendu ici : la hiérarchie des titres est ce qui
2694
2901
  * permet de parcourir un écran au lecteur d'écran, et deux `<h1>` la
2695
- * cassent sans que rien ne se voie.
2902
+ * cassent sans que rien ne se voie. Une section imbriquée passe donc
2903
+ * `level={2}`.
2696
2904
  */
2697
- declare function PageHeader({ title, description, eyebrow, actions, className }: PageHeaderProps): react_jsx_runtime.JSX.Element;
2905
+ declare function PageHeader({ title, description, eyebrow, actions, level, className, }: PageHeaderProps): react_jsx_runtime.JSX.Element;
2698
2906
 
2699
2907
  interface PaginationProps {
2700
2908
  page: number;
@@ -2714,16 +2922,46 @@ interface PaginationProps {
2714
2922
  showTotal?: boolean;
2715
2923
  /** Masque les libellés et ne garde que les flèches. */
2716
2924
  compact?: boolean;
2925
+ /** Le nombre de lignes par page en vigueur. */
2926
+ pageSize?: number;
2927
+ /**
2928
+ * Fourni avec `pageSize`, ajoute le choix du nombre de lignes par page.
2929
+ *
2930
+ * Seul le nouveau nombre est remonté : revenir en page 1 est l'affaire de
2931
+ * qui tient l'état — `setPerPage` de `useTableQuery` le fait déjà.
2932
+ */
2933
+ onPageSizeChange?: (pageSize: number) => void;
2934
+ /**
2935
+ * Les tailles proposées. Par défaut `10, 20, 50, 100`. Une taille en
2936
+ * vigueur absente de la liste y est ajoutée, pour que le champ ne paraisse
2937
+ * jamais vide.
2938
+ */
2939
+ pageSizeOptions?: number[];
2940
+ /** Le libellé du choix. Par défaut `locale.perPage` — « Par page ». */
2941
+ pageSizeLabel?: string;
2942
+ /**
2943
+ * Remplace entièrement le contrôle — des boutons segmentés, un champ libre.
2944
+ * Le choix des tailles et leur tri sont déjà faits.
2945
+ */
2946
+ renderPageSize?: (context: PageSizeContext) => ReactNode;
2717
2947
  ariaLabel?: string;
2718
2948
  className?: string;
2719
2949
  }
2950
+ /** Ce que reçoit `renderPageSize`. */
2951
+ interface PageSizeContext {
2952
+ pageSize: number;
2953
+ options: number[];
2954
+ onChange: (pageSize: number) => void;
2955
+ label: string;
2956
+ }
2957
+ declare const DEFAULT_PAGE_SIZE_OPTIONS: number[];
2720
2958
  /**
2721
2959
  * La navigation entre les pages.
2722
2960
  *
2723
2961
  * Le calcul des numéros et des ellipses vient de `@sia-ui/headless` :
2724
2962
  * `usePagination` et ce composant appliquent la même règle, écrite une fois.
2725
2963
  */
2726
- declare function Pagination({ page, totalPages, onPageChange, siblingCount, previousLabel: previousLabelProp, nextLabel: nextLabelProp, jumpTo, showTotal, compact, ariaLabel, className, }: PaginationProps): react_jsx_runtime.JSX.Element | null;
2964
+ 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;
2727
2965
 
2728
2966
  interface PasswordStrength {
2729
2967
  /** De 0 à 4. */
@@ -3016,6 +3254,49 @@ interface SearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "
3016
3254
  */
3017
3255
  declare const SearchInput: react.ForwardRefExoticComponent<SearchInputProps & react.RefAttributes<HTMLInputElement>>;
3018
3256
 
3257
+ /** Une paire nom / valeur. La valeur n'est jamais relue du serveur. */
3258
+ interface SecretEntry {
3259
+ key: string;
3260
+ value: string;
3261
+ }
3262
+ interface SecretFieldsProps {
3263
+ value?: SecretEntry[];
3264
+ defaultValue?: SecretEntry[];
3265
+ onValueChange?: (entries: SecretEntry[]) => void;
3266
+ /**
3267
+ * Les noms déjà enregistrés côté serveur.
3268
+ *
3269
+ * Affichés, mais leur valeur reste vide : un secret ne revient jamais au
3270
+ * navigateur. Une valeur laissée vide sur l'un d'eux veut dire « inchangé » ;
3271
+ * en saisir une, c'est le remplacer — une rotation.
3272
+ */
3273
+ storedKeys?: string[];
3274
+ /** Des noms proposés d'un clic : `DATABASE_URL`, `API_KEY`… */
3275
+ templates?: string[];
3276
+ /** La forme d'un nom valide. Par défaut, aucune contrainte. */
3277
+ keyPattern?: RegExp;
3278
+ keyPatternMessage?: string;
3279
+ keyLabel?: string;
3280
+ valueLabel?: string;
3281
+ addLabel?: ReactNode;
3282
+ disabled?: boolean;
3283
+ className?: string;
3284
+ }
3285
+ /** Les valeurs effacées, les noms gardés — ce qu'on affiche après l'envoi. */
3286
+ declare function clearSecretValues(entries: SecretEntry[]): SecretEntry[];
3287
+ /**
3288
+ * Des secrets en écriture seule : les noms se lisent, les valeurs jamais.
3289
+ *
3290
+ * Chaque ligne est un nom et une valeur masquée. Les noms déjà enregistrés
3291
+ * s'affichent sans leur valeur — le serveur ne la renvoie pas, et ne doit pas
3292
+ * la renvoyer. Les champs refusent l'autocomplétion du navigateur, qui
3293
+ * proposerait sinon le mot de passe du compte à la place d'une clé d'API.
3294
+ *
3295
+ * Après l'envoi, `clearSecretValues` vide les valeurs : un secret ne reste pas
3296
+ * affiché dans un formulaire ouvert.
3297
+ */
3298
+ declare function SecretFields({ value, defaultValue, onValueChange, storedKeys, templates, keyPattern, keyPatternMessage, keyLabel, valueLabel, addLabel, disabled, className, }: SecretFieldsProps): react_jsx_runtime.JSX.Element;
3299
+
3019
3300
  interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {
3020
3301
  width?: CSSProperties["width"];
3021
3302
  height?: CSSProperties["height"];
@@ -3426,4 +3707,4 @@ interface YearPickerProps {
3426
3707
  */
3427
3708
  declare function YearPicker({ value, defaultValue, min, max, onValueChange, className }: YearPickerProps): react_jsx_runtime.JSX.Element;
3428
3709
 
3429
- export { Accordion, type AccordionItem, type AccordionProps, 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, 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, Form, type FormEntry, Field as FormField, type FormFieldConfig, type FormFieldGroup, type FieldProps as FormFieldProps, type FormProps, type FormShape, Heading, type HeadingProps, 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, KpiGrid, type KpiGridProps, Label, type LabelProps, 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, Pagination, type PaginationProps, PasswordInput, type PasswordInputProps, type PasswordStrength, 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, RichTextEditor, type RichTextEditorProps, type RowAction, ScrollArea, type ScrollAreaProps, SearchIcon, SearchInput, type SearchInputProps, Select, type SelectOption, type SelectProps, 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, type StepItem, type StepStatus, Steps, type StepsProps, Switch, type SwitchProps, Tabs, TabsContent, TabsList, type TabsProps, TabsTrigger, TagsInput, type TagsInputProps, 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, WeekPicker, type WeekPickerProps, XIcon, YearPicker, type YearPickerProps, confirmUnsavedNavigation, createUrlTableStorage, defineResource, formatDuration, formatTimeValue, initialsOf, parseTimeValue, resourceColumns, resourceDefaults, resourceDetailColumns, resourceFormFields, resourcePermissions, resourceRowKey, resourceSearchKeys, resourceValidator, tintForName, useDataTableQuery, useToast };
3710
+ 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 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, 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, createUrlTableStorage, defineResource, formFieldNames, formatDuration, formatTimeValue, initialsOf, parseTimeValue, resourceColumns, resourceDefaults, resourceDetailColumns, resourceFormFields, resourcePermissions, resourceRowKey, resourceSearchKeys, resourceValidator, tintForName, toneOf, useDataTableQuery, useToast };