@dododog/ui 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/{chunk-L7OYR6U3.js → chunk-2NMA3AXV.js} +37 -8
  2. package/dist/{chunk-ZZ4EWC53.mjs → chunk-52M2KUC4.mjs} +37 -8
  3. package/dist/{chunk-BKM5VCUS.mjs → chunk-CPBDDGRX.mjs} +4 -1
  4. package/dist/{chunk-FLKEMER2.js → chunk-DJTFRMRY.js} +4 -1
  5. package/dist/chunk-DUCRCDLI.mjs +78 -0
  6. package/dist/{chunk-HH4X2JYO.js → chunk-EKOGDJUT.js} +32 -4
  7. package/dist/{chunk-NHB2TI2B.js → chunk-FHAWYXPX.js} +1 -1
  8. package/dist/{chunk-5UNG2O64.js → chunk-FR46MMNP.js} +7 -1
  9. package/dist/{chunk-EEIPCJQ2.mjs → chunk-KWQKC5TG.mjs} +1 -1
  10. package/dist/{chunk-IJIUUBFT.js → chunk-OUN5BU4Z.js} +1 -1
  11. package/dist/{chunk-QWDKSY6Y.js → chunk-OZ4RJDDZ.js} +46 -2
  12. package/dist/{chunk-762LQMWP.js → chunk-RAXPJ7VC.js} +66 -8
  13. package/dist/{chunk-F2BUMJYW.mjs → chunk-RBVTV3LA.mjs} +1 -1
  14. package/dist/{chunk-B47HQHX3.mjs → chunk-RGZHSI2G.mjs} +1 -1
  15. package/dist/{chunk-GXKON34B.js → chunk-RTI25IBR.js} +1 -1
  16. package/dist/{chunk-LJSMPON7.js → chunk-USJDHMKS.js} +1 -1
  17. package/dist/{chunk-N5ZNXNCO.mjs → chunk-UYOPZZBN.mjs} +32 -4
  18. package/dist/{chunk-EAATIFYL.mjs → chunk-WNBZXXFA.mjs} +1 -1
  19. package/dist/{chunk-JWOV5H6G.mjs → chunk-X53C3IQC.mjs} +7 -1
  20. package/dist/chunk-YGAWCP65.mjs +109 -0
  21. package/dist/components/Autocomplete/index.js +3 -3
  22. package/dist/components/Autocomplete/index.mjs +1 -1
  23. package/dist/components/Checkbox/index.js +2 -2
  24. package/dist/components/Checkbox/index.mjs +1 -1
  25. package/dist/components/DateRangePicker/index.js +3 -3
  26. package/dist/components/DateRangePicker/index.mjs +1 -1
  27. package/dist/components/Input/index.js +3 -3
  28. package/dist/components/Input/index.mjs +1 -1
  29. package/dist/components/Modal/index.d.mts +42 -1
  30. package/dist/components/Modal/index.d.ts +42 -1
  31. package/dist/components/Modal/index.js +2 -2
  32. package/dist/components/Modal/index.mjs +1 -1
  33. package/dist/components/RadioGroup/index.js +2 -2
  34. package/dist/components/RadioGroup/index.mjs +1 -1
  35. package/dist/components/SegmentedControl/index.d.mts +16 -0
  36. package/dist/components/SegmentedControl/index.d.ts +16 -0
  37. package/dist/components/SegmentedControl/index.js +2 -2
  38. package/dist/components/SegmentedControl/index.mjs +1 -1
  39. package/dist/components/Select/index.js +3 -3
  40. package/dist/components/Select/index.mjs +1 -1
  41. package/dist/components/Tabs/index.d.mts +21 -0
  42. package/dist/components/Tabs/index.d.ts +21 -0
  43. package/dist/components/Tabs/index.js +2 -2
  44. package/dist/components/Tabs/index.mjs +1 -1
  45. package/dist/components/Textarea/index.js +3 -3
  46. package/dist/components/Textarea/index.mjs +1 -1
  47. package/dist/index.d.mts +16 -3
  48. package/dist/index.d.ts +16 -3
  49. package/dist/index.js +95 -93
  50. package/dist/index.mjs +23 -21
  51. package/package.json +11 -11
  52. package/dist/chunk-36Y7UU32.mjs +0 -34
  53. package/dist/chunk-VOZPGXQD.mjs +0 -51
@@ -15,6 +15,7 @@ var FOCUSABLE_SELECTOR = [
15
15
  "[contenteditable]:not([contenteditable='false'])",
16
16
  '[tabindex]:not([tabindex="-1"])'
17
17
  ].join(", ");
18
+ var DEFAULT_Z_INDEX_CLASS = "z-50";
18
19
  function getFocusableElements(panel) {
19
20
  return Array.from(panel.querySelectorAll(FOCUSABLE_SELECTOR)).filter(
20
21
  (element) => !element.closest("[hidden], [aria-hidden='true'], details:not([open])")
@@ -32,6 +33,11 @@ var Modal = React.forwardRef(
32
33
  children,
33
34
  title,
34
35
  className,
36
+ variant = "centered",
37
+ overlayClassName,
38
+ zIndexClassName = DEFAULT_Z_INDEX_CLASS,
39
+ initialFocusRef,
40
+ returnFocusTo,
35
41
  "aria-label": ariaLabel,
36
42
  "aria-labelledby": ariaLabelledBy,
37
43
  "aria-describedby": ariaDescribedBy
@@ -40,10 +46,20 @@ var Modal = React.forwardRef(
40
46
  const generatedTitleId = React.useId();
41
47
  const titleId = title ? `${generatedTitleId}-title` : void 0;
42
48
  const labelledBy = ariaLabelledBy ?? titleId;
49
+ const isFullBleed = variant === "fullBleed";
50
+ const initialFocusRefLatest = React.useRef(initialFocusRef);
51
+ initialFocusRefLatest.current = initialFocusRef;
52
+ const returnFocusToLatest = React.useRef(returnFocusTo);
53
+ returnFocusToLatest.current = returnFocusTo;
43
54
  React.useEffect(() => {
44
55
  if (!isOpen) return;
45
56
  const trigger = document.activeElement instanceof HTMLElement ? document.activeElement : null;
46
57
  return () => {
58
+ const designated = returnFocusToLatest.current?.current ?? null;
59
+ if (designated && designated.isConnected) {
60
+ designated.focus();
61
+ return;
62
+ }
47
63
  if (trigger && trigger.isConnected) trigger.focus();
48
64
  };
49
65
  }, [isOpen]);
@@ -51,6 +67,11 @@ var Modal = React.forwardRef(
51
67
  if (!isOpen) return;
52
68
  const panel = panelRef.current;
53
69
  if (!panel) return;
70
+ const preferred = initialFocusRefLatest.current?.current ?? null;
71
+ if (preferred) {
72
+ preferred.focus();
73
+ return;
74
+ }
54
75
  const focusable = getFocusableElements(panel);
55
76
  (focusable[0] ?? panel).focus();
56
77
  }, [isOpen]);
@@ -102,14 +123,21 @@ var Modal = React.forwardRef(
102
123
  "div",
103
124
  {
104
125
  ref,
105
- className: "fixed inset-0 z-50 flex items-center justify-center p-4",
126
+ className: cn(
127
+ "fixed inset-0",
128
+ zIndexClassName,
129
+ // La mise en page centree (et sa marge de 16 px) n'existe que dans la
130
+ // variante `centered` : une surface bord a bord n'en veut pas.
131
+ !isFullBleed && "flex items-center justify-center p-4",
132
+ overlayClassName
133
+ ),
106
134
  role: "dialog",
107
135
  "aria-modal": "true",
108
136
  "aria-labelledby": labelledBy,
109
137
  "aria-label": labelledBy ? void 0 : ariaLabel,
110
138
  "aria-describedby": ariaDescribedBy,
111
139
  children: [
112
- /* @__PURE__ */ jsx(
140
+ !isFullBleed && /* @__PURE__ */ jsx(
113
141
  "div",
114
142
  {
115
143
  className: "absolute inset-0 bg-black/50",
@@ -123,7 +151,7 @@ var Modal = React.forwardRef(
123
151
  ref: panelRef,
124
152
  tabIndex: -1,
125
153
  className: cn(
126
- "relative bg-white rounded-2xl shadow-xl max-w-md w-full max-h-[90vh] overflow-auto outline-none",
154
+ isFullBleed ? "relative h-full w-full outline-none" : "relative bg-white rounded-2xl shadow-xl max-w-md w-full max-h-[90vh] overflow-auto outline-none",
127
155
  className
128
156
  ),
129
157
  children: [
@@ -164,7 +192,7 @@ var Modal = React.forwardRef(
164
192
  }
165
193
  )
166
194
  ] }),
167
- /* @__PURE__ */ jsx("div", { className: cn(title ? "px-6 pb-6" : "p-6"), children })
195
+ isFullBleed ? children : /* @__PURE__ */ jsx("div", { className: cn(title ? "px-6 pb-6" : "p-6"), children })
168
196
  ]
169
197
  }
170
198
  )
@@ -217,7 +217,7 @@ var Select = React.forwardRef(
217
217
  }
218
218
  )
219
219
  ] }),
220
- error && /* @__PURE__ */ jsx("p", { id: errorId, className: "mt-1 text-sm text-red-500", children: error })
220
+ error && /* @__PURE__ */ jsx("p", { id: errorId, role: "alert", className: "mt-1 text-sm text-red-600", children: error })
221
221
  ] });
222
222
  }
223
223
  );
@@ -78,7 +78,13 @@ var Input = React.forwardRef(
78
78
  ),
79
79
  rightIcon && /* @__PURE__ */ jsx("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 text-text-muted", children: rightIcon })
80
80
  ] }),
81
- error && /* @__PURE__ */ jsx("p", { id: errorId, className: "mt-1 text-sm text-red-500", children: error })
81
+ error && // Pas de `role="alert"` ici, contrairement aux autres champs de la
82
+ // bibliotheque : les trois seuls consommateurs de cette prop
83
+ // (BookingForm, PaymentForm, EscalationForm) sont des formulaires du
84
+ // tunnel, et BookingForm annonce deja ses fautes par un resume en
85
+ // region live (TTR-651). Un second canal produirait des annonces
86
+ // concurrentes sur le chemin de paiement.
87
+ /* @__PURE__ */ jsx("p", { id: errorId, className: "mt-1 text-sm text-red-600", children: error })
82
88
  ] });
83
89
  }
84
90
  );
@@ -0,0 +1,109 @@
1
+ import { cn } from './chunk-IMKLN273.mjs';
2
+ import * as React from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ var Tabs = React.forwardRef(
6
+ ({
7
+ tabs,
8
+ defaultTab,
9
+ value,
10
+ onChange,
11
+ className,
12
+ "aria-label": ariaLabel,
13
+ "aria-labelledby": ariaLabelledBy
14
+ }, ref) => {
15
+ const [internalValue, setInternalValue] = React.useState(
16
+ defaultTab || tabs[0]?.key || ""
17
+ );
18
+ const activeKey = value ?? internalValue;
19
+ const idPrefix = React.useId();
20
+ const tabId = (key) => `${idPrefix}-tab-${key}`;
21
+ const panelId = (key) => `${idPrefix}-panel-${key}`;
22
+ const tabRefs = React.useRef([]);
23
+ const handleChange = React.useCallback(
24
+ (key) => {
25
+ if (onChange) {
26
+ onChange(key);
27
+ } else {
28
+ setInternalValue(key);
29
+ }
30
+ },
31
+ [onChange]
32
+ );
33
+ const handleKeyDown = (event, index) => {
34
+ const lastIndex = tabs.length - 1;
35
+ let nextIndex;
36
+ switch (event.key) {
37
+ case "ArrowRight":
38
+ nextIndex = index === lastIndex ? 0 : index + 1;
39
+ break;
40
+ case "ArrowLeft":
41
+ nextIndex = index === 0 ? lastIndex : index - 1;
42
+ break;
43
+ case "Home":
44
+ nextIndex = 0;
45
+ break;
46
+ case "End":
47
+ nextIndex = lastIndex;
48
+ break;
49
+ default:
50
+ return;
51
+ }
52
+ event.preventDefault();
53
+ const nextTab = tabs[nextIndex];
54
+ if (!nextTab) return;
55
+ handleChange(nextTab.key);
56
+ tabRefs.current[nextIndex]?.focus();
57
+ };
58
+ const activeTab = tabs.find((t) => t.key === activeKey);
59
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), children: [
60
+ /* @__PURE__ */ jsx(
61
+ "div",
62
+ {
63
+ role: "tablist",
64
+ "aria-label": ariaLabelledBy ? void 0 : ariaLabel,
65
+ "aria-labelledby": ariaLabelledBy,
66
+ className: "flex border-b border-gray-200 gap-1 overflow-x-auto",
67
+ children: tabs.map((tab, index) => /* @__PURE__ */ jsxs(
68
+ "button",
69
+ {
70
+ id: tabId(tab.key),
71
+ role: "tab",
72
+ type: "button",
73
+ "aria-selected": tab.key === activeKey,
74
+ "aria-controls": panelId(tab.key),
75
+ tabIndex: tab.key === activeKey ? 0 : -1,
76
+ ref: (node) => {
77
+ tabRefs.current[index] = node;
78
+ },
79
+ onKeyDown: (event) => handleKeyDown(event, index),
80
+ onClick: () => handleChange(tab.key),
81
+ className: cn(
82
+ "flex items-center gap-2 px-4 py-3 text-sm font-medium whitespace-nowrap border-b-2 transition-colors -mb-px",
83
+ tab.key === activeKey ? "border-secondary text-secondary" : "border-transparent text-text-secondary hover:text-primary hover:border-gray-300"
84
+ ),
85
+ children: [
86
+ tab.icon && /* @__PURE__ */ jsx("span", { className: "shrink-0", children: tab.icon }),
87
+ tab.label
88
+ ]
89
+ },
90
+ tab.key
91
+ ))
92
+ }
93
+ ),
94
+ activeTab && /* @__PURE__ */ jsx(
95
+ "div",
96
+ {
97
+ role: "tabpanel",
98
+ id: panelId(activeTab.key),
99
+ "aria-labelledby": tabId(activeTab.key),
100
+ className: "py-4",
101
+ children: activeTab.content
102
+ }
103
+ )
104
+ ] });
105
+ }
106
+ );
107
+ Tabs.displayName = "Tabs";
108
+
109
+ export { Tabs };
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkNHB2TI2B_js = require('../../chunk-NHB2TI2B.js');
3
+ var chunkFHAWYXPX_js = require('../../chunk-FHAWYXPX.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Autocomplete", {
9
9
  enumerable: true,
10
- get: function () { return chunkNHB2TI2B_js.Autocomplete; }
10
+ get: function () { return chunkFHAWYXPX_js.Autocomplete; }
11
11
  });
12
12
  Object.defineProperty(exports, "autocompleteInputVariants", {
13
13
  enumerable: true,
14
- get: function () { return chunkNHB2TI2B_js.autocompleteInputVariants; }
14
+ get: function () { return chunkFHAWYXPX_js.autocompleteInputVariants; }
15
15
  });
@@ -1,2 +1,2 @@
1
- export { Autocomplete, autocompleteInputVariants } from '../../chunk-B47HQHX3.mjs';
1
+ export { Autocomplete, autocompleteInputVariants } from '../../chunk-RGZHSI2G.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkIJIUUBFT_js = require('../../chunk-IJIUUBFT.js');
3
+ var chunkOUN5BU4Z_js = require('../../chunk-OUN5BU4Z.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Checkbox", {
9
9
  enumerable: true,
10
- get: function () { return chunkIJIUUBFT_js.Checkbox; }
10
+ get: function () { return chunkOUN5BU4Z_js.Checkbox; }
11
11
  });
@@ -1,2 +1,2 @@
1
- export { Checkbox } from '../../chunk-EEIPCJQ2.mjs';
1
+ export { Checkbox } from '../../chunk-KWQKC5TG.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkFLKEMER2_js = require('../../chunk-FLKEMER2.js');
3
+ var chunkDJTFRMRY_js = require('../../chunk-DJTFRMRY.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "DatePickerInput", {
9
9
  enumerable: true,
10
- get: function () { return chunkFLKEMER2_js.DatePickerInput; }
10
+ get: function () { return chunkDJTFRMRY_js.DatePickerInput; }
11
11
  });
12
12
  Object.defineProperty(exports, "DateRangePicker", {
13
13
  enumerable: true,
14
- get: function () { return chunkFLKEMER2_js.DateRangePicker; }
14
+ get: function () { return chunkDJTFRMRY_js.DateRangePicker; }
15
15
  });
@@ -1,2 +1,2 @@
1
- export { DatePickerInput, DateRangePicker } from '../../chunk-BKM5VCUS.mjs';
1
+ export { DatePickerInput, DateRangePicker } from '../../chunk-CPBDDGRX.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunk5UNG2O64_js = require('../../chunk-5UNG2O64.js');
3
+ var chunkFR46MMNP_js = require('../../chunk-FR46MMNP.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Input", {
9
9
  enumerable: true,
10
- get: function () { return chunk5UNG2O64_js.Input; }
10
+ get: function () { return chunkFR46MMNP_js.Input; }
11
11
  });
12
12
  Object.defineProperty(exports, "inputVariants", {
13
13
  enumerable: true,
14
- get: function () { return chunk5UNG2O64_js.inputVariants; }
14
+ get: function () { return chunkFR46MMNP_js.inputVariants; }
15
15
  });
@@ -1,2 +1,2 @@
1
- export { Input, inputVariants } from '../../chunk-JWOV5H6G.mjs';
1
+ export { Input, inputVariants } from '../../chunk-X53C3IQC.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -1,11 +1,52 @@
1
1
  import * as React from 'react';
2
2
 
3
+ /**
4
+ * Presentation de la racine du dialogue.
5
+ *
6
+ * - `centered` (defaut) : voile sombre + panneau carte centre avec marge de
7
+ * 16 px, angles arrondis et largeur bornee. C'est le rendu historique, il ne
8
+ * doit pas changer pour les appelants existants.
9
+ * - `fullBleed` : la surface occupe tout le cadre, SANS voile ni marge ni
10
+ * arrondi. Necessaire aux surcouches bord a bord (menu mobile plein cadre,
11
+ * lightbox dont l'image est en `fill`), qui devaient sinon reimplementer le
12
+ * comportement de dialogue en local.
13
+ */
14
+ type ModalVariant = "centered" | "fullBleed";
3
15
  interface ModalProps {
4
16
  isOpen: boolean;
5
17
  onClose: () => void;
6
18
  children: React.ReactNode;
7
19
  title?: string;
20
+ /** Classes du PANNEAU interne (pas de la racine). Voir `overlayClassName`. */
8
21
  className?: string;
22
+ /** Presentation de la racine. Defaut : `centered` (rendu historique). */
23
+ variant?: ModalVariant;
24
+ /**
25
+ * Classes de la RACINE (`fixed inset-0`), pour les cas que la variante ne
26
+ * couvre pas : fond propre a la surface, `lg:hidden` d'un menu mobile...
27
+ * Appliquees en dernier, elles l'emportent sur les classes de base.
28
+ */
29
+ overlayClassName?: string;
30
+ /**
31
+ * Plan d'empilement de la racine. Defaut : `z-50`. Chaque appelant devait
32
+ * auparavant envelopper le dialogue dans un conteneur `relative z-[...]`
33
+ * pour passer au-dessus de la barre de reservation (`z-50`) ou des cartes
34
+ * plein ecran (`z-[1000]`).
35
+ */
36
+ zIndexClassName?: string;
37
+ /**
38
+ * Element a focaliser a l'OUVERTURE. Defaut : premier element focusable du
39
+ * panneau, sinon le panneau lui-meme.
40
+ */
41
+ initialFocusRef?: React.RefObject<HTMLElement | null>;
42
+ /**
43
+ * Element a focaliser a la FERMETURE, prioritaire sur le declencheur
44
+ * memorise. Indispensable quand le declencheur est DEMONTE pendant que le
45
+ * dialogue est ouvert (bandeau cookies : le bandeau cede la place au
46
+ * panneau) — sans lui la garde `isConnected` echoue et le focus retombe sur
47
+ * `<body>`. A defaut, le repli reste la restitution au declencheur.
48
+ */
49
+ returnFocusTo?: React.RefObject<HTMLElement | null>;
9
50
  /**
10
51
  * Nom accessible quand aucun `title` n'est rendu. Ignore si `title` est
11
52
  * fourni : le titre visible sert alors de nom via `aria-labelledby`.
@@ -21,4 +62,4 @@ interface ModalProps {
21
62
  }
22
63
  declare const Modal: React.ForwardRefExoticComponent<ModalProps & React.RefAttributes<HTMLDivElement>>;
23
64
 
24
- export { Modal, type ModalProps };
65
+ export { Modal, type ModalProps, type ModalVariant };
@@ -1,11 +1,52 @@
1
1
  import * as React from 'react';
2
2
 
3
+ /**
4
+ * Presentation de la racine du dialogue.
5
+ *
6
+ * - `centered` (defaut) : voile sombre + panneau carte centre avec marge de
7
+ * 16 px, angles arrondis et largeur bornee. C'est le rendu historique, il ne
8
+ * doit pas changer pour les appelants existants.
9
+ * - `fullBleed` : la surface occupe tout le cadre, SANS voile ni marge ni
10
+ * arrondi. Necessaire aux surcouches bord a bord (menu mobile plein cadre,
11
+ * lightbox dont l'image est en `fill`), qui devaient sinon reimplementer le
12
+ * comportement de dialogue en local.
13
+ */
14
+ type ModalVariant = "centered" | "fullBleed";
3
15
  interface ModalProps {
4
16
  isOpen: boolean;
5
17
  onClose: () => void;
6
18
  children: React.ReactNode;
7
19
  title?: string;
20
+ /** Classes du PANNEAU interne (pas de la racine). Voir `overlayClassName`. */
8
21
  className?: string;
22
+ /** Presentation de la racine. Defaut : `centered` (rendu historique). */
23
+ variant?: ModalVariant;
24
+ /**
25
+ * Classes de la RACINE (`fixed inset-0`), pour les cas que la variante ne
26
+ * couvre pas : fond propre a la surface, `lg:hidden` d'un menu mobile...
27
+ * Appliquees en dernier, elles l'emportent sur les classes de base.
28
+ */
29
+ overlayClassName?: string;
30
+ /**
31
+ * Plan d'empilement de la racine. Defaut : `z-50`. Chaque appelant devait
32
+ * auparavant envelopper le dialogue dans un conteneur `relative z-[...]`
33
+ * pour passer au-dessus de la barre de reservation (`z-50`) ou des cartes
34
+ * plein ecran (`z-[1000]`).
35
+ */
36
+ zIndexClassName?: string;
37
+ /**
38
+ * Element a focaliser a l'OUVERTURE. Defaut : premier element focusable du
39
+ * panneau, sinon le panneau lui-meme.
40
+ */
41
+ initialFocusRef?: React.RefObject<HTMLElement | null>;
42
+ /**
43
+ * Element a focaliser a la FERMETURE, prioritaire sur le declencheur
44
+ * memorise. Indispensable quand le declencheur est DEMONTE pendant que le
45
+ * dialogue est ouvert (bandeau cookies : le bandeau cede la place au
46
+ * panneau) — sans lui la garde `isConnected` echoue et le focus retombe sur
47
+ * `<body>`. A defaut, le repli reste la restitution au declencheur.
48
+ */
49
+ returnFocusTo?: React.RefObject<HTMLElement | null>;
9
50
  /**
10
51
  * Nom accessible quand aucun `title` n'est rendu. Ignore si `title` est
11
52
  * fourni : le titre visible sert alors de nom via `aria-labelledby`.
@@ -21,4 +62,4 @@ interface ModalProps {
21
62
  }
22
63
  declare const Modal: React.ForwardRefExoticComponent<ModalProps & React.RefAttributes<HTMLDivElement>>;
23
64
 
24
- export { Modal, type ModalProps };
65
+ export { Modal, type ModalProps, type ModalVariant };
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkHH4X2JYO_js = require('../../chunk-HH4X2JYO.js');
3
+ var chunkEKOGDJUT_js = require('../../chunk-EKOGDJUT.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Modal", {
9
9
  enumerable: true,
10
- get: function () { return chunkHH4X2JYO_js.Modal; }
10
+ get: function () { return chunkEKOGDJUT_js.Modal; }
11
11
  });
@@ -1,2 +1,2 @@
1
- export { Modal } from '../../chunk-N5ZNXNCO.mjs';
1
+ export { Modal } from '../../chunk-UYOPZZBN.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkGXKON34B_js = require('../../chunk-GXKON34B.js');
3
+ var chunkRTI25IBR_js = require('../../chunk-RTI25IBR.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "RadioGroup", {
9
9
  enumerable: true,
10
- get: function () { return chunkGXKON34B_js.RadioGroup; }
10
+ get: function () { return chunkRTI25IBR_js.RadioGroup; }
11
11
  });
@@ -1,2 +1,2 @@
1
- export { RadioGroup } from '../../chunk-F2BUMJYW.mjs';
1
+ export { RadioGroup } from '../../chunk-RBVTV3LA.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -9,7 +9,23 @@ interface SegmentedControlProps {
9
9
  value: string;
10
10
  onChange: (value: string) => void;
11
11
  className?: string;
12
+ /**
13
+ * Nom du groupe de boutons radio. Sans lui, un lecteur d'ecran annonce
14
+ * « groupe de boutons radio » sans dire sur quoi il porte.
15
+ */
16
+ "aria-label"?: string;
17
+ /** Id d'un titre deja rendu qui nomme le groupe. Prioritaire sur `aria-label`. */
18
+ "aria-labelledby"?: string;
12
19
  }
20
+ /**
21
+ * Motif « radio group » de l'APG WAI-ARIA.
22
+ *
23
+ * Le groupe est UN SEUL arret de tabulation (roving tabindex) : seule l'option
24
+ * cochee est atteignable au Tab, les autres se rejoignent aux fleches (les
25
+ * quatre directions, avec bouclage) et Home/Fin. Sans cela, N options font N
26
+ * arrets de tabulation et la selection au clavier n'a pas le comportement
27
+ * attendu d'un groupe radio.
28
+ */
13
29
  declare const SegmentedControl: React.ForwardRefExoticComponent<SegmentedControlProps & React.RefAttributes<HTMLDivElement>>;
14
30
 
15
31
  export { SegmentedControl, type SegmentedControlOption, type SegmentedControlProps };
@@ -9,7 +9,23 @@ interface SegmentedControlProps {
9
9
  value: string;
10
10
  onChange: (value: string) => void;
11
11
  className?: string;
12
+ /**
13
+ * Nom du groupe de boutons radio. Sans lui, un lecteur d'ecran annonce
14
+ * « groupe de boutons radio » sans dire sur quoi il porte.
15
+ */
16
+ "aria-label"?: string;
17
+ /** Id d'un titre deja rendu qui nomme le groupe. Prioritaire sur `aria-label`. */
18
+ "aria-labelledby"?: string;
12
19
  }
20
+ /**
21
+ * Motif « radio group » de l'APG WAI-ARIA.
22
+ *
23
+ * Le groupe est UN SEUL arret de tabulation (roving tabindex) : seule l'option
24
+ * cochee est atteignable au Tab, les autres se rejoignent aux fleches (les
25
+ * quatre directions, avec bouclage) et Home/Fin. Sans cela, N options font N
26
+ * arrets de tabulation et la selection au clavier n'a pas le comportement
27
+ * attendu d'un groupe radio.
28
+ */
13
29
  declare const SegmentedControl: React.ForwardRefExoticComponent<SegmentedControlProps & React.RefAttributes<HTMLDivElement>>;
14
30
 
15
31
  export { SegmentedControl, type SegmentedControlOption, type SegmentedControlProps };
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkQWDKSY6Y_js = require('../../chunk-QWDKSY6Y.js');
3
+ var chunkOZ4RJDDZ_js = require('../../chunk-OZ4RJDDZ.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "SegmentedControl", {
9
9
  enumerable: true,
10
- get: function () { return chunkQWDKSY6Y_js.SegmentedControl; }
10
+ get: function () { return chunkOZ4RJDDZ_js.SegmentedControl; }
11
11
  });
@@ -1,2 +1,2 @@
1
- export { SegmentedControl } from '../../chunk-36Y7UU32.mjs';
1
+ export { SegmentedControl } from '../../chunk-DUCRCDLI.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkLJSMPON7_js = require('../../chunk-LJSMPON7.js');
3
+ var chunkUSJDHMKS_js = require('../../chunk-USJDHMKS.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Select", {
9
9
  enumerable: true,
10
- get: function () { return chunkLJSMPON7_js.Select; }
10
+ get: function () { return chunkUSJDHMKS_js.Select; }
11
11
  });
12
12
  Object.defineProperty(exports, "selectVariants", {
13
13
  enumerable: true,
14
- get: function () { return chunkLJSMPON7_js.selectVariants; }
14
+ get: function () { return chunkUSJDHMKS_js.selectVariants; }
15
15
  });
@@ -1,2 +1,2 @@
1
- export { Select, selectVariants } from '../../chunk-EAATIFYL.mjs';
1
+ export { Select, selectVariants } from '../../chunk-WNBZXXFA.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -12,7 +12,28 @@ interface TabsProps {
12
12
  value?: string;
13
13
  onChange?: (key: string) => void;
14
14
  className?: string;
15
+ /**
16
+ * Nom du groupe d'onglets (« Filtrer les reservations »...). Sans lui, un
17
+ * lecteur d'ecran annonce « liste d'onglets » sans dire de quoi.
18
+ */
19
+ "aria-label"?: string;
20
+ /** Id d'un titre deja rendu qui nomme le groupe. Prioritaire sur `aria-label`. */
21
+ "aria-labelledby"?: string;
15
22
  }
23
+ /**
24
+ * Motif « tabs » de l'APG WAI-ARIA.
25
+ *
26
+ * Le tablist est UN SEUL arret de tabulation (roving tabindex) : on circule
27
+ * entre les onglets aux fleches Gauche/Droite (avec bouclage) et Home/Fin, pas
28
+ * au Tab. Chaque onglet est relie au panneau qu'il commande
29
+ * (`aria-controls` / `id`), et le panneau est nomme par son onglet
30
+ * (`aria-labelledby`) — sans quoi le contenu affiche apres un changement
31
+ * d'onglet n'est pas annonce.
32
+ *
33
+ * Activation automatique : l'onglet qui recoit le focus devient l'onglet actif.
34
+ * Le contenu de tous les onglets est fourni d'avance par `tabs`, aucun
35
+ * chargement reseau n'est declenche par ce deplacement.
36
+ */
16
37
  declare const Tabs: React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>>;
17
38
 
18
39
  export { type TabItem, Tabs, type TabsProps };
@@ -12,7 +12,28 @@ interface TabsProps {
12
12
  value?: string;
13
13
  onChange?: (key: string) => void;
14
14
  className?: string;
15
+ /**
16
+ * Nom du groupe d'onglets (« Filtrer les reservations »...). Sans lui, un
17
+ * lecteur d'ecran annonce « liste d'onglets » sans dire de quoi.
18
+ */
19
+ "aria-label"?: string;
20
+ /** Id d'un titre deja rendu qui nomme le groupe. Prioritaire sur `aria-label`. */
21
+ "aria-labelledby"?: string;
15
22
  }
23
+ /**
24
+ * Motif « tabs » de l'APG WAI-ARIA.
25
+ *
26
+ * Le tablist est UN SEUL arret de tabulation (roving tabindex) : on circule
27
+ * entre les onglets aux fleches Gauche/Droite (avec bouclage) et Home/Fin, pas
28
+ * au Tab. Chaque onglet est relie au panneau qu'il commande
29
+ * (`aria-controls` / `id`), et le panneau est nomme par son onglet
30
+ * (`aria-labelledby`) — sans quoi le contenu affiche apres un changement
31
+ * d'onglet n'est pas annonce.
32
+ *
33
+ * Activation automatique : l'onglet qui recoit le focus devient l'onglet actif.
34
+ * Le contenu de tous les onglets est fourni d'avance par `tabs`, aucun
35
+ * chargement reseau n'est declenche par ce deplacement.
36
+ */
16
37
  declare const Tabs: React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>>;
17
38
 
18
39
  export { type TabItem, Tabs, type TabsProps };
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunk762LQMWP_js = require('../../chunk-762LQMWP.js');
3
+ var chunkRAXPJ7VC_js = require('../../chunk-RAXPJ7VC.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Tabs", {
9
9
  enumerable: true,
10
- get: function () { return chunk762LQMWP_js.Tabs; }
10
+ get: function () { return chunkRAXPJ7VC_js.Tabs; }
11
11
  });
@@ -1,2 +1,2 @@
1
- export { Tabs } from '../../chunk-VOZPGXQD.mjs';
1
+ export { Tabs } from '../../chunk-YGAWCP65.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';