@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.
- package/dist/{chunk-L7OYR6U3.js → chunk-2NMA3AXV.js} +37 -8
- package/dist/{chunk-ZZ4EWC53.mjs → chunk-52M2KUC4.mjs} +37 -8
- package/dist/{chunk-BKM5VCUS.mjs → chunk-CPBDDGRX.mjs} +4 -1
- package/dist/{chunk-FLKEMER2.js → chunk-DJTFRMRY.js} +4 -1
- package/dist/chunk-DUCRCDLI.mjs +78 -0
- package/dist/{chunk-HH4X2JYO.js → chunk-EKOGDJUT.js} +32 -4
- package/dist/{chunk-NHB2TI2B.js → chunk-FHAWYXPX.js} +1 -1
- package/dist/{chunk-5UNG2O64.js → chunk-FR46MMNP.js} +7 -1
- package/dist/{chunk-EEIPCJQ2.mjs → chunk-KWQKC5TG.mjs} +1 -1
- package/dist/{chunk-IJIUUBFT.js → chunk-OUN5BU4Z.js} +1 -1
- package/dist/{chunk-QWDKSY6Y.js → chunk-OZ4RJDDZ.js} +46 -2
- package/dist/{chunk-762LQMWP.js → chunk-RAXPJ7VC.js} +66 -8
- package/dist/{chunk-F2BUMJYW.mjs → chunk-RBVTV3LA.mjs} +1 -1
- package/dist/{chunk-B47HQHX3.mjs → chunk-RGZHSI2G.mjs} +1 -1
- package/dist/{chunk-GXKON34B.js → chunk-RTI25IBR.js} +1 -1
- package/dist/{chunk-LJSMPON7.js → chunk-USJDHMKS.js} +1 -1
- package/dist/{chunk-N5ZNXNCO.mjs → chunk-UYOPZZBN.mjs} +32 -4
- package/dist/{chunk-EAATIFYL.mjs → chunk-WNBZXXFA.mjs} +1 -1
- package/dist/{chunk-JWOV5H6G.mjs → chunk-X53C3IQC.mjs} +7 -1
- package/dist/chunk-YGAWCP65.mjs +109 -0
- package/dist/components/Autocomplete/index.js +3 -3
- package/dist/components/Autocomplete/index.mjs +1 -1
- package/dist/components/Checkbox/index.js +2 -2
- package/dist/components/Checkbox/index.mjs +1 -1
- package/dist/components/DateRangePicker/index.js +3 -3
- package/dist/components/DateRangePicker/index.mjs +1 -1
- package/dist/components/Input/index.js +3 -3
- package/dist/components/Input/index.mjs +1 -1
- package/dist/components/Modal/index.d.mts +42 -1
- package/dist/components/Modal/index.d.ts +42 -1
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/Modal/index.mjs +1 -1
- package/dist/components/RadioGroup/index.js +2 -2
- package/dist/components/RadioGroup/index.mjs +1 -1
- package/dist/components/SegmentedControl/index.d.mts +16 -0
- package/dist/components/SegmentedControl/index.d.ts +16 -0
- package/dist/components/SegmentedControl/index.js +2 -2
- package/dist/components/SegmentedControl/index.mjs +1 -1
- package/dist/components/Select/index.js +3 -3
- package/dist/components/Select/index.mjs +1 -1
- package/dist/components/Tabs/index.d.mts +21 -0
- package/dist/components/Tabs/index.d.ts +21 -0
- package/dist/components/Tabs/index.js +2 -2
- package/dist/components/Tabs/index.mjs +1 -1
- package/dist/components/Textarea/index.js +3 -3
- package/dist/components/Textarea/index.mjs +1 -1
- package/dist/index.d.mts +16 -3
- package/dist/index.d.ts +16 -3
- package/dist/index.js +95 -93
- package/dist/index.mjs +23 -21
- package/package.json +11 -11
- package/dist/chunk-36Y7UU32.mjs +0 -34
- 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:
|
|
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-
|
|
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 &&
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkFHAWYXPX_js.Autocomplete; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "autocompleteInputVariants", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkFHAWYXPX_js.autocompleteInputVariants; }
|
|
15
15
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Autocomplete, autocompleteInputVariants } from '../../chunk-
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkOUN5BU4Z_js.Checkbox; }
|
|
11
11
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Checkbox } from '../../chunk-
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkDJTFRMRY_js.DatePickerInput; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "DateRangePicker", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkDJTFRMRY_js.DateRangePicker; }
|
|
15
15
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { DatePickerInput, DateRangePicker } from '../../chunk-
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkFR46MMNP_js.Input; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "inputVariants", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkFR46MMNP_js.inputVariants; }
|
|
15
15
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Input, inputVariants } from '../../chunk-
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkEKOGDJUT_js.Modal; }
|
|
11
11
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Modal } from '../../chunk-
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkRTI25IBR_js.RadioGroup; }
|
|
11
11
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { RadioGroup } from '../../chunk-
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkOZ4RJDDZ_js.SegmentedControl; }
|
|
11
11
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { SegmentedControl } from '../../chunk-
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkUSJDHMKS_js.Select; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "selectVariants", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkUSJDHMKS_js.selectVariants; }
|
|
15
15
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Select, selectVariants } from '../../chunk-
|
|
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
|
|
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
|
|
10
|
+
get: function () { return chunkRAXPJ7VC_js.Tabs; }
|
|
11
11
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Tabs } from '../../chunk-
|
|
1
|
+
export { Tabs } from '../../chunk-YGAWCP65.mjs';
|
|
2
2
|
import '../../chunk-IMKLN273.mjs';
|