@vantageos/mosaic 0.3.0-alpha.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +175 -0
- package/README.md +12 -0
- package/dist/{Alert.schema-BQsZGG6P.d.cts → Alert.schema-LPJE5gFP.d.cts} +31 -1
- package/dist/{Alert.schema-BQsZGG6P.d.ts → Alert.schema-LPJE5gFP.d.ts} +31 -1
- package/dist/MarkdownRenderer.schema-Rx7kIeVA.d.cts +22 -0
- package/dist/MarkdownRenderer.schema-Rx7kIeVA.d.ts +22 -0
- package/dist/ProgressBar.schema-CdVYx0Wq.d.cts +22 -0
- package/dist/ProgressBar.schema-CdVYx0Wq.d.ts +22 -0
- package/dist/StatusBadge.schema-1tOjB4Ir.d.cts +22 -0
- package/dist/StatusBadge.schema-1tOjB4Ir.d.ts +22 -0
- package/dist/artifacts.cjs +126 -2
- package/dist/artifacts.cjs.map +1 -1
- package/dist/artifacts.d.cts +3 -21
- package/dist/artifacts.d.ts +3 -21
- package/dist/artifacts.js +126 -2
- package/dist/artifacts.js.map +1 -1
- package/dist/confirmation.cjs +126 -2
- package/dist/confirmation.cjs.map +1 -1
- package/dist/confirmation.d.cts +3 -32
- package/dist/confirmation.d.ts +3 -32
- package/dist/confirmation.js +126 -2
- package/dist/confirmation.js.map +1 -1
- package/dist/display.cjs +129 -2
- package/dist/display.cjs.map +1 -1
- package/dist/display.d.cts +132 -2
- package/dist/display.d.ts +132 -2
- package/dist/display.js +129 -2
- package/dist/display.js.map +1 -1
- package/dist/forms.cjs +20 -17
- package/dist/forms.cjs.map +1 -1
- package/dist/forms.js +20 -17
- package/dist/forms.js.map +1 -1
- package/dist/index.cjs +129 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.js +129 -2
- package/dist/index.js.map +1 -1
- package/dist/media.cjs +126 -2
- package/dist/media.cjs.map +1 -1
- package/dist/media.d.cts +3 -21
- package/dist/media.d.ts +3 -21
- package/dist/media.js +126 -2
- package/dist/media.js.map +1 -1
- package/dist/preact/artifacts.d.ts +39 -1
- package/dist/preact/artifacts.js +234 -0
- package/dist/preact/artifacts.js.map +1 -1
- package/dist/preact/confirmation.d.ts +31 -1
- package/dist/preact/confirmation.js +245 -5
- package/dist/preact/confirmation.js.map +1 -1
- package/dist/preact/display.d.ts +127 -1
- package/dist/preact/display.js +419 -11
- package/dist/preact/display.js.map +1 -1
- package/dist/preact/forms.js +22 -19
- package/dist/preact/forms.js.map +1 -1
- package/dist/preact/input.js +2 -2
- package/dist/preact/progress.d.ts +35 -1
- package/dist/preact/progress.js +263 -0
- package/dist/preact/progress.js.map +1 -1
- package/dist/progress.cjs +126 -2
- package/dist/progress.cjs.map +1 -1
- package/dist/progress.d.cts +3 -21
- package/dist/progress.d.ts +3 -21
- package/dist/progress.js +126 -2
- package/dist/progress.js.map +1 -1
- package/dist/react/artifacts.cjs +241 -0
- package/dist/react/artifacts.cjs.map +1 -1
- package/dist/react/artifacts.d.cts +20 -1
- package/dist/react/artifacts.d.ts +20 -1
- package/dist/react/artifacts.js +234 -0
- package/dist/react/artifacts.js.map +1 -1
- package/dist/react/confirmation.cjs +248 -2
- package/dist/react/confirmation.cjs.map +1 -1
- package/dist/react/confirmation.d.cts +3 -3
- package/dist/react/confirmation.d.ts +3 -3
- package/dist/react/confirmation.js +244 -4
- package/dist/react/confirmation.js.map +1 -1
- package/dist/react/display.cjs +418 -2
- package/dist/react/display.cjs.map +1 -1
- package/dist/react/display.d.cts +20 -3
- package/dist/react/display.d.ts +20 -3
- package/dist/react/display.js +413 -4
- package/dist/react/display.js.map +1 -1
- package/dist/react/forms.cjs +20 -17
- package/dist/react/forms.cjs.map +1 -1
- package/dist/react/forms.js +20 -17
- package/dist/react/forms.js.map +1 -1
- package/dist/react/progress.cjs +266 -0
- package/dist/react/progress.cjs.map +1 -1
- package/dist/react/progress.d.cts +17 -1
- package/dist/react/progress.d.ts +17 -1
- package/dist/react/progress.js +263 -0
- package/dist/react/progress.js.map +1 -1
- package/package.json +231 -228
- package/registry.yaml +34 -21
- package/dist/Skeleton.schema-BO0ca2UX.d.cts +0 -135
- package/dist/Skeleton.schema-BO0ca2UX.d.ts +0 -135
package/dist/preact/artifacts.js
CHANGED
|
@@ -1,3 +1,237 @@
|
|
|
1
|
+
import DOMPurify from 'dompurify';
|
|
2
|
+
import { marked } from 'marked';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { jsx } from 'preact/jsx-runtime';
|
|
1
5
|
|
|
6
|
+
// src/runtimes/preact/components/artifacts/MarkdownRenderer.tsx
|
|
7
|
+
var MarkdownRendererPropsSchema = z.object({
|
|
8
|
+
content: z.string(),
|
|
9
|
+
locale: z.enum(["en", "fr"]),
|
|
10
|
+
maxLength: z.number().positive().default(5e4),
|
|
11
|
+
allowHtml: z.boolean().default(false)
|
|
12
|
+
});
|
|
13
|
+
function validateProps(raw) {
|
|
14
|
+
return MarkdownRendererPropsSchema.parse(raw);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// src/i18n/strings.ts
|
|
18
|
+
var EN = {
|
|
19
|
+
// ─── Non-forms components ──────────────────────────────────────────────────
|
|
20
|
+
"ProgressBar.aria.label": "Progress",
|
|
21
|
+
"ProgressBar.error.invalidProps": "ProgressBar: invalid props",
|
|
22
|
+
"ConfirmDialog.button.confirm": "Confirm",
|
|
23
|
+
"ConfirmDialog.button.cancel": "Cancel",
|
|
24
|
+
"ConfirmDialog.aria.dialog": "Confirmation dialog",
|
|
25
|
+
"TableView.aria.table": "Data table",
|
|
26
|
+
"TableView.pagination.next": "Next page",
|
|
27
|
+
"TableView.pagination.prev": "Previous page",
|
|
28
|
+
"TableView.empty.message": "No data to display",
|
|
29
|
+
"TableView.error.invalidProps": "TableView: invalid props",
|
|
30
|
+
"MarkdownRenderer.aria.content": "Rendered Markdown content",
|
|
31
|
+
"MarkdownRenderer.error.invalidProps": "MarkdownRenderer: invalid props",
|
|
32
|
+
"MarkdownRenderer.error.tooLong": "Content exceeds maximum length",
|
|
33
|
+
"TokenDisplayOnceModal.button.copy": "Copy token",
|
|
34
|
+
"TokenDisplayOnceModal.button.close": "Close",
|
|
35
|
+
"TokenDisplayOnceModal.warning.once": "This token will only be shown once. Copy it now.",
|
|
36
|
+
"TokenDisplayOnceModal.copied": "Copied",
|
|
37
|
+
"StatusBadge.aria.status": "Status",
|
|
38
|
+
"StatusBadge.error.invalidProps": "StatusBadge: invalid props",
|
|
39
|
+
"EmptyState.error.invalidProps": "EmptyState: invalid props",
|
|
40
|
+
"Toast.aria.close": "Close notification",
|
|
41
|
+
"Toast.error.invalidProps": "Toast: invalid props",
|
|
42
|
+
"Alert.aria.dismiss": "Dismiss alert",
|
|
43
|
+
"Alert.error.invalidProps": "Alert: invalid props",
|
|
44
|
+
"VirtualList.empty.message": "No items to display",
|
|
45
|
+
"VirtualList.error.invalidProps": "VirtualList: invalid props",
|
|
46
|
+
"Skeleton.aria.label": "Loading",
|
|
47
|
+
"Skeleton.error.invalidProps": "Skeleton: invalid props",
|
|
48
|
+
// ─── Forms — useMosaicForm ─────────────────────────────────────────────────
|
|
49
|
+
"useMosaicForm.error.invalidProps": "useMosaicForm: invalid options",
|
|
50
|
+
// ─── Forms — FormProvider ──────────────────────────────────────────────────
|
|
51
|
+
"FormProvider.error.invalidProps": "FormProvider: invalid props",
|
|
52
|
+
// ─── Forms — FormField ────────────────────────────────────────────────────
|
|
53
|
+
"FormField.error.invalidProps": "FormField: invalid props",
|
|
54
|
+
// ─── Forms — ErrorDisplay ─────────────────────────────────────────────────
|
|
55
|
+
"ErrorDisplay.error.required": "This field is required",
|
|
56
|
+
"ErrorDisplay.error.min": "Value is below the minimum",
|
|
57
|
+
"ErrorDisplay.error.max": "Value exceeds the maximum",
|
|
58
|
+
"ErrorDisplay.error.minLength": "Input is too short",
|
|
59
|
+
"ErrorDisplay.error.maxLength": "Input is too long",
|
|
60
|
+
"ErrorDisplay.error.pattern": "Invalid format",
|
|
61
|
+
"ErrorDisplay.error.email": "Enter a valid email address",
|
|
62
|
+
"ErrorDisplay.error.url": "Enter a valid URL",
|
|
63
|
+
"ErrorDisplay.error.generic": "Invalid value",
|
|
64
|
+
// ─── Forms — SubmitButton ─────────────────────────────────────────────────
|
|
65
|
+
"SubmitButton.aria.submit": "Submit form",
|
|
66
|
+
"SubmitButton.state.loading": "Submitting\u2026",
|
|
67
|
+
"SubmitButton.error.invalidProps": "SubmitButton: invalid props",
|
|
68
|
+
// ─── Forms — Input ────────────────────────────────────────────────────────
|
|
69
|
+
"Input.aria.label": "Input field",
|
|
70
|
+
"Input.error.required": "This field is required",
|
|
71
|
+
"Input.error.invalid": "Invalid value",
|
|
72
|
+
"Input.error.tooLong": "Input is too long",
|
|
73
|
+
"Input.error.tooShort": "Input is too short",
|
|
74
|
+
"Input.error.invalidProps": "Input: invalid props",
|
|
75
|
+
// ─── Forms — Textarea ─────────────────────────────────────────────────────
|
|
76
|
+
"Textarea.aria.label": "Text area",
|
|
77
|
+
"Textarea.error.required": "This field is required",
|
|
78
|
+
"Textarea.error.tooLong": "Text is too long",
|
|
79
|
+
"Textarea.counter.remaining": "characters remaining",
|
|
80
|
+
"Textarea.error.invalidProps": "Textarea: invalid props",
|
|
81
|
+
// ─── Forms — FieldArray ───────────────────────────────────────────────────
|
|
82
|
+
"FieldArray.aria.list": "List of items",
|
|
83
|
+
"FieldArray.aria.addItem": "Add item",
|
|
84
|
+
"FieldArray.aria.removeItem": "Remove item",
|
|
85
|
+
"FieldArray.error.invalidProps": "FieldArray: invalid props",
|
|
86
|
+
// ─── Forms — Checkbox ─────────────────────────────────────────────────────
|
|
87
|
+
"Checkbox.aria.label": "Checkbox",
|
|
88
|
+
"Checkbox.error.required": "This field must be checked",
|
|
89
|
+
"Checkbox.error.invalidProps": "Checkbox: invalid props",
|
|
90
|
+
// ─── Forms — MultiSelect ──────────────────────────────────────────────────
|
|
91
|
+
"MultiSelect.aria.label": "Multi-select field",
|
|
92
|
+
"MultiSelect.aria.removeChip": "Remove",
|
|
93
|
+
"MultiSelect.error.required": "Select at least one option",
|
|
94
|
+
"MultiSelect.error.maxItems": "Maximum number of selections reached",
|
|
95
|
+
"MultiSelect.placeholder": "Select options\u2026",
|
|
96
|
+
"MultiSelect.search.placeholder": "Search\u2026",
|
|
97
|
+
"MultiSelect.empty": "No options available",
|
|
98
|
+
"MultiSelect.error.invalidProps": "MultiSelect: invalid props",
|
|
99
|
+
// ─── Forms — RadioGroup ───────────────────────────────────────────────────
|
|
100
|
+
"RadioGroup.aria.label": "Radio group",
|
|
101
|
+
"RadioGroup.error.required": "Select one option",
|
|
102
|
+
"RadioGroup.error.invalidProps": "RadioGroup: invalid props",
|
|
103
|
+
// ─── Forms — Select ───────────────────────────────────────────────────────
|
|
104
|
+
"Select.placeholder": "Select an option\u2026",
|
|
105
|
+
"Select.search.placeholder": "Search\u2026",
|
|
106
|
+
"Select.empty": "No options available",
|
|
107
|
+
"Select.error.required": "Select an option",
|
|
108
|
+
"Select.error.invalidProps": "Select: invalid props"
|
|
109
|
+
};
|
|
110
|
+
var FR = {
|
|
111
|
+
// ─── Non-forms components ──────────────────────────────────────────────────
|
|
112
|
+
"ProgressBar.aria.label": "Progression",
|
|
113
|
+
"ProgressBar.error.invalidProps": "ProgressBar : propri\xE9t\xE9s invalides",
|
|
114
|
+
"ConfirmDialog.button.confirm": "Confirmer",
|
|
115
|
+
"ConfirmDialog.button.cancel": "Annuler",
|
|
116
|
+
"ConfirmDialog.aria.dialog": "Bo\xEEte de dialogue de confirmation",
|
|
117
|
+
"TableView.aria.table": "Tableau de donn\xE9es",
|
|
118
|
+
"TableView.pagination.next": "Page suivante",
|
|
119
|
+
"TableView.pagination.prev": "Page pr\xE9c\xE9dente",
|
|
120
|
+
"TableView.empty.message": "Aucune donn\xE9e \xE0 afficher",
|
|
121
|
+
"TableView.error.invalidProps": "TableView : propri\xE9t\xE9s invalides",
|
|
122
|
+
"MarkdownRenderer.aria.content": "Contenu Markdown rendu",
|
|
123
|
+
"MarkdownRenderer.error.invalidProps": "MarkdownRenderer : propri\xE9t\xE9s invalides",
|
|
124
|
+
"MarkdownRenderer.error.tooLong": "Le contenu d\xE9passe la longueur maximale",
|
|
125
|
+
"TokenDisplayOnceModal.button.copy": "Copier le jeton",
|
|
126
|
+
"TokenDisplayOnceModal.button.close": "Fermer",
|
|
127
|
+
"TokenDisplayOnceModal.warning.once": "Ce jeton ne sera affich\xE9 qu'une seule fois. Copiez-le maintenant.",
|
|
128
|
+
"TokenDisplayOnceModal.copied": "Copi\xE9",
|
|
129
|
+
"StatusBadge.aria.status": "Statut",
|
|
130
|
+
"StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides",
|
|
131
|
+
"EmptyState.error.invalidProps": "EmptyState : propri\xE9t\xE9s invalides",
|
|
132
|
+
"Toast.aria.close": "Fermer la notification",
|
|
133
|
+
"Toast.error.invalidProps": "Toast : propri\xE9t\xE9s invalides",
|
|
134
|
+
"Alert.aria.dismiss": "Fermer l'alerte",
|
|
135
|
+
"Alert.error.invalidProps": "Alert : propri\xE9t\xE9s invalides",
|
|
136
|
+
"VirtualList.empty.message": "Aucun \xE9l\xE9ment \xE0 afficher",
|
|
137
|
+
"VirtualList.error.invalidProps": "VirtualList : propri\xE9t\xE9s invalides",
|
|
138
|
+
"Skeleton.aria.label": "Chargement",
|
|
139
|
+
"Skeleton.error.invalidProps": "Skeleton : propri\xE9t\xE9s invalides",
|
|
140
|
+
// ─── Forms — useMosaicForm ─────────────────────────────────────────────────
|
|
141
|
+
"useMosaicForm.error.invalidProps": "useMosaicForm : options invalides",
|
|
142
|
+
// ─── Forms — FormProvider ──────────────────────────────────────────────────
|
|
143
|
+
"FormProvider.error.invalidProps": "FormProvider : propri\xE9t\xE9s invalides",
|
|
144
|
+
// ─── Forms — FormField ────────────────────────────────────────────────────
|
|
145
|
+
"FormField.error.invalidProps": "FormField : propri\xE9t\xE9s invalides",
|
|
146
|
+
// ─── Forms — ErrorDisplay ─────────────────────────────────────────────────
|
|
147
|
+
"ErrorDisplay.error.required": "Ce champ est obligatoire",
|
|
148
|
+
"ErrorDisplay.error.min": "La valeur est inf\xE9rieure au minimum",
|
|
149
|
+
"ErrorDisplay.error.max": "La valeur d\xE9passe le maximum",
|
|
150
|
+
"ErrorDisplay.error.minLength": "La saisie est trop courte",
|
|
151
|
+
"ErrorDisplay.error.maxLength": "La saisie est trop longue",
|
|
152
|
+
"ErrorDisplay.error.pattern": "Format invalide",
|
|
153
|
+
"ErrorDisplay.error.email": "Saisissez une adresse e-mail valide",
|
|
154
|
+
"ErrorDisplay.error.url": "Saisissez une URL valide",
|
|
155
|
+
"ErrorDisplay.error.generic": "Valeur invalide",
|
|
156
|
+
// ─── Forms — SubmitButton ─────────────────────────────────────────────────
|
|
157
|
+
"SubmitButton.aria.submit": "Soumettre le formulaire",
|
|
158
|
+
"SubmitButton.state.loading": "Envoi en cours\u2026",
|
|
159
|
+
"SubmitButton.error.invalidProps": "SubmitButton : propri\xE9t\xE9s invalides",
|
|
160
|
+
// ─── Forms — Input ────────────────────────────────────────────────────────
|
|
161
|
+
"Input.aria.label": "Champ de saisie",
|
|
162
|
+
"Input.error.required": "Ce champ est obligatoire",
|
|
163
|
+
"Input.error.invalid": "Valeur invalide",
|
|
164
|
+
"Input.error.tooLong": "La saisie est trop longue",
|
|
165
|
+
"Input.error.tooShort": "La saisie est trop courte",
|
|
166
|
+
"Input.error.invalidProps": "Input : propri\xE9t\xE9s invalides",
|
|
167
|
+
// ─── Forms — Textarea ─────────────────────────────────────────────────────
|
|
168
|
+
"Textarea.aria.label": "Zone de texte",
|
|
169
|
+
"Textarea.error.required": "Ce champ est obligatoire",
|
|
170
|
+
"Textarea.error.tooLong": "Le texte est trop long",
|
|
171
|
+
"Textarea.counter.remaining": "caract\xE8res restants",
|
|
172
|
+
"Textarea.error.invalidProps": "Textarea : propri\xE9t\xE9s invalides",
|
|
173
|
+
// ─── Forms — FieldArray ───────────────────────────────────────────────────
|
|
174
|
+
"FieldArray.aria.list": "Liste d'\xE9l\xE9ments",
|
|
175
|
+
"FieldArray.aria.addItem": "Ajouter un \xE9l\xE9ment",
|
|
176
|
+
"FieldArray.aria.removeItem": "Supprimer l'\xE9l\xE9ment",
|
|
177
|
+
"FieldArray.error.invalidProps": "FieldArray : propri\xE9t\xE9s invalides",
|
|
178
|
+
// ─── Forms — Checkbox ─────────────────────────────────────────────────────
|
|
179
|
+
"Checkbox.aria.label": "Case \xE0 cocher",
|
|
180
|
+
"Checkbox.error.required": "Ce champ doit \xEAtre coch\xE9",
|
|
181
|
+
"Checkbox.error.invalidProps": "Checkbox : propri\xE9t\xE9s invalides",
|
|
182
|
+
// ─── Forms — MultiSelect ──────────────────────────────────────────────────
|
|
183
|
+
"MultiSelect.aria.label": "Champ de s\xE9lection multiple",
|
|
184
|
+
"MultiSelect.aria.removeChip": "Retirer",
|
|
185
|
+
"MultiSelect.error.required": "S\xE9lectionnez au moins une option",
|
|
186
|
+
"MultiSelect.error.maxItems": "Nombre maximum de s\xE9lections atteint",
|
|
187
|
+
"MultiSelect.placeholder": "S\xE9lectionner des options\u2026",
|
|
188
|
+
"MultiSelect.search.placeholder": "Rechercher\u2026",
|
|
189
|
+
"MultiSelect.empty": "Aucune option disponible",
|
|
190
|
+
"MultiSelect.error.invalidProps": "MultiSelect : propri\xE9t\xE9s invalides",
|
|
191
|
+
// ─── Forms — RadioGroup ───────────────────────────────────────────────────
|
|
192
|
+
"RadioGroup.aria.label": "Groupe de boutons radio",
|
|
193
|
+
"RadioGroup.error.required": "S\xE9lectionnez une option",
|
|
194
|
+
"RadioGroup.error.invalidProps": "RadioGroup : propri\xE9t\xE9s invalides",
|
|
195
|
+
// ─── Forms — Select ───────────────────────────────────────────────────────
|
|
196
|
+
"Select.placeholder": "S\xE9lectionner une option\u2026",
|
|
197
|
+
"Select.search.placeholder": "Rechercher\u2026",
|
|
198
|
+
"Select.empty": "Aucune option disponible",
|
|
199
|
+
"Select.error.required": "S\xE9lectionnez une option",
|
|
200
|
+
"Select.error.invalidProps": "Select : propri\xE9t\xE9s invalides"
|
|
201
|
+
};
|
|
202
|
+
var TABLE = {
|
|
203
|
+
en: EN,
|
|
204
|
+
fr: FR
|
|
205
|
+
};
|
|
206
|
+
function t(key, locale = "en") {
|
|
207
|
+
return TABLE[locale]?.[key] ?? TABLE.en[key];
|
|
208
|
+
}
|
|
209
|
+
function MarkdownRendererInner({ content, locale, maxLength, allowHtml }) {
|
|
210
|
+
if (content.length > maxLength) {
|
|
211
|
+
return /* @__PURE__ */ jsx("div", { role: "alert", lang: locale, children: t("MarkdownRenderer.error.tooLong", locale) });
|
|
212
|
+
}
|
|
213
|
+
const source = allowHtml ? content : content.replace(/<[^>]*>/g, "");
|
|
214
|
+
const rawHtml = marked.parse(source, { async: false });
|
|
215
|
+
const cleanHtml = DOMPurify.sanitize(rawHtml);
|
|
216
|
+
return /* @__PURE__ */ jsx(
|
|
217
|
+
"article",
|
|
218
|
+
{
|
|
219
|
+
"aria-label": t("MarkdownRenderer.aria.content", locale),
|
|
220
|
+
lang: locale,
|
|
221
|
+
dangerouslySetInnerHTML: { __html: cleanHtml }
|
|
222
|
+
}
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
function MarkdownRenderer(raw) {
|
|
226
|
+
try {
|
|
227
|
+
const props = validateProps(raw);
|
|
228
|
+
return /* @__PURE__ */ jsx(MarkdownRendererInner, { ...props });
|
|
229
|
+
} catch {
|
|
230
|
+
const locale = raw.locale === "fr" ? "fr" : "en";
|
|
231
|
+
return /* @__PURE__ */ jsx("div", { role: "alert", children: t("MarkdownRenderer.error.invalidProps", locale) });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export { MarkdownRenderer, MarkdownRendererPropsSchema, validateProps as validateMarkdownRendererProps };
|
|
2
236
|
//# sourceMappingURL=artifacts.js.map
|
|
3
237
|
//# sourceMappingURL=artifacts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"artifacts.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/artifacts/MarkdownRenderer.schema.ts","../../src/i18n/strings.ts","../../src/runtimes/preact/components/artifacts/MarkdownRenderer.tsx"],"names":[],"mappings":"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","file":"artifacts.js","sourcesContent":["import { z } from \"zod\";\n\nexport const MarkdownRendererPropsSchema = z.object({\n content: z.string(),\n locale: z.enum([\"en\", \"fr\"]),\n maxLength: z.number().positive().default(50000),\n allowHtml: z.boolean().default(false),\n});\n\nexport type MarkdownRendererProps = z.infer<typeof MarkdownRendererPropsSchema>;\n\nexport function validateProps(raw: unknown): MarkdownRendererProps {\n return MarkdownRendererPropsSchema.parse(raw);\n}\n","/**\n * Compile-time mirror of `@vantageos/mosaic-i18n` EN/FR locales for all\n * Mosaic components (v0.3.0). Inlined here so that `<Comp>` renderers can\n * resolve `t(key, locale)` without dragging react-i18next into the component\n * runtime (keeps bundle small and tests provider-free). Drift is gated by\n * `mosaic-registry-drift-check.mjs` which validates the canonical\n * `packages/mosaic-i18n/src/locales/{en,fr}.json` against `registry.yaml`.\n *\n * Mosaic standard §8: production JSX MUST resolve user-facing strings via\n * `t()` — no hardcoded English literals.\n *\n * Forms keys added — v0.3.0-C-PR1 (Axis 5/6 i18n pass).\n * Convention: Forms.<Component>.<context>.<id>\n */\nexport type MosaicLocale = \"en\" | \"fr\";\n\nconst EN = {\n // ─── Non-forms components ──────────────────────────────────────────────────\n \"ProgressBar.aria.label\": \"Progress\",\n \"ProgressBar.error.invalidProps\": \"ProgressBar: invalid props\",\n \"ConfirmDialog.button.confirm\": \"Confirm\",\n \"ConfirmDialog.button.cancel\": \"Cancel\",\n \"ConfirmDialog.aria.dialog\": \"Confirmation dialog\",\n \"TableView.aria.table\": \"Data table\",\n \"TableView.pagination.next\": \"Next page\",\n \"TableView.pagination.prev\": \"Previous page\",\n \"TableView.empty.message\": \"No data to display\",\n \"TableView.error.invalidProps\": \"TableView: invalid props\",\n \"MarkdownRenderer.aria.content\": \"Rendered Markdown content\",\n \"MarkdownRenderer.error.invalidProps\": \"MarkdownRenderer: invalid props\",\n \"MarkdownRenderer.error.tooLong\": \"Content exceeds maximum length\",\n \"TokenDisplayOnceModal.button.copy\": \"Copy token\",\n \"TokenDisplayOnceModal.button.close\": \"Close\",\n \"TokenDisplayOnceModal.warning.once\": \"This token will only be shown once. Copy it now.\",\n \"TokenDisplayOnceModal.copied\": \"Copied\",\n \"StatusBadge.aria.status\": \"Status\",\n \"StatusBadge.error.invalidProps\": \"StatusBadge: invalid props\",\n \"EmptyState.error.invalidProps\": \"EmptyState: invalid props\",\n \"Toast.aria.close\": \"Close notification\",\n \"Toast.error.invalidProps\": \"Toast: invalid props\",\n \"Alert.aria.dismiss\": \"Dismiss alert\",\n \"Alert.error.invalidProps\": \"Alert: invalid props\",\n \"VirtualList.empty.message\": \"No items to display\",\n \"VirtualList.error.invalidProps\": \"VirtualList: invalid props\",\n \"Skeleton.aria.label\": \"Loading\",\n \"Skeleton.error.invalidProps\": \"Skeleton: invalid props\",\n // ─── Forms — useMosaicForm ─────────────────────────────────────────────────\n \"useMosaicForm.error.invalidProps\": \"useMosaicForm: invalid options\",\n // ─── Forms — FormProvider ──────────────────────────────────────────────────\n \"FormProvider.error.invalidProps\": \"FormProvider: invalid props\",\n // ─── Forms — FormField ────────────────────────────────────────────────────\n \"FormField.error.invalidProps\": \"FormField: invalid props\",\n // ─── Forms — ErrorDisplay ─────────────────────────────────────────────────\n \"ErrorDisplay.error.required\": \"This field is required\",\n \"ErrorDisplay.error.min\": \"Value is below the minimum\",\n \"ErrorDisplay.error.max\": \"Value exceeds the maximum\",\n \"ErrorDisplay.error.minLength\": \"Input is too short\",\n \"ErrorDisplay.error.maxLength\": \"Input is too long\",\n \"ErrorDisplay.error.pattern\": \"Invalid format\",\n \"ErrorDisplay.error.email\": \"Enter a valid email address\",\n \"ErrorDisplay.error.url\": \"Enter a valid URL\",\n \"ErrorDisplay.error.generic\": \"Invalid value\",\n // ─── Forms — SubmitButton ─────────────────────────────────────────────────\n \"SubmitButton.aria.submit\": \"Submit form\",\n \"SubmitButton.state.loading\": \"Submitting…\",\n \"SubmitButton.error.invalidProps\": \"SubmitButton: invalid props\",\n // ─── Forms — Input ────────────────────────────────────────────────────────\n \"Input.aria.label\": \"Input field\",\n \"Input.error.required\": \"This field is required\",\n \"Input.error.invalid\": \"Invalid value\",\n \"Input.error.tooLong\": \"Input is too long\",\n \"Input.error.tooShort\": \"Input is too short\",\n \"Input.error.invalidProps\": \"Input: invalid props\",\n // ─── Forms — Textarea ─────────────────────────────────────────────────────\n \"Textarea.aria.label\": \"Text area\",\n \"Textarea.error.required\": \"This field is required\",\n \"Textarea.error.tooLong\": \"Text is too long\",\n \"Textarea.counter.remaining\": \"characters remaining\",\n \"Textarea.error.invalidProps\": \"Textarea: invalid props\",\n // ─── Forms — FieldArray ───────────────────────────────────────────────────\n \"FieldArray.aria.list\": \"List of items\",\n \"FieldArray.aria.addItem\": \"Add item\",\n \"FieldArray.aria.removeItem\": \"Remove item\",\n \"FieldArray.error.invalidProps\": \"FieldArray: invalid props\",\n // ─── Forms — Checkbox ─────────────────────────────────────────────────────\n \"Checkbox.aria.label\": \"Checkbox\",\n \"Checkbox.error.required\": \"This field must be checked\",\n \"Checkbox.error.invalidProps\": \"Checkbox: invalid props\",\n // ─── Forms — MultiSelect ──────────────────────────────────────────────────\n \"MultiSelect.aria.label\": \"Multi-select field\",\n \"MultiSelect.aria.removeChip\": \"Remove\",\n \"MultiSelect.error.required\": \"Select at least one option\",\n \"MultiSelect.error.maxItems\": \"Maximum number of selections reached\",\n \"MultiSelect.placeholder\": \"Select options…\",\n \"MultiSelect.search.placeholder\": \"Search…\",\n \"MultiSelect.empty\": \"No options available\",\n \"MultiSelect.error.invalidProps\": \"MultiSelect: invalid props\",\n // ─── Forms — RadioGroup ───────────────────────────────────────────────────\n \"RadioGroup.aria.label\": \"Radio group\",\n \"RadioGroup.error.required\": \"Select one option\",\n \"RadioGroup.error.invalidProps\": \"RadioGroup: invalid props\",\n // ─── Forms — Select ───────────────────────────────────────────────────────\n \"Select.placeholder\": \"Select an option…\",\n \"Select.search.placeholder\": \"Search…\",\n \"Select.empty\": \"No options available\",\n \"Select.error.required\": \"Select an option\",\n \"Select.error.invalidProps\": \"Select: invalid props\",\n} as const;\n\nconst FR: Record<keyof typeof EN, string> = {\n // ─── Non-forms components ──────────────────────────────────────────────────\n \"ProgressBar.aria.label\": \"Progression\",\n \"ProgressBar.error.invalidProps\": \"ProgressBar : propriétés invalides\",\n \"ConfirmDialog.button.confirm\": \"Confirmer\",\n \"ConfirmDialog.button.cancel\": \"Annuler\",\n \"ConfirmDialog.aria.dialog\": \"Boîte de dialogue de confirmation\",\n \"TableView.aria.table\": \"Tableau de données\",\n \"TableView.pagination.next\": \"Page suivante\",\n \"TableView.pagination.prev\": \"Page précédente\",\n \"TableView.empty.message\": \"Aucune donnée à afficher\",\n \"TableView.error.invalidProps\": \"TableView : propriétés invalides\",\n \"MarkdownRenderer.aria.content\": \"Contenu Markdown rendu\",\n \"MarkdownRenderer.error.invalidProps\": \"MarkdownRenderer : propriétés invalides\",\n \"MarkdownRenderer.error.tooLong\": \"Le contenu dépasse la longueur maximale\",\n \"TokenDisplayOnceModal.button.copy\": \"Copier le jeton\",\n \"TokenDisplayOnceModal.button.close\": \"Fermer\",\n \"TokenDisplayOnceModal.warning.once\":\n \"Ce jeton ne sera affiché qu'une seule fois. Copiez-le maintenant.\",\n \"TokenDisplayOnceModal.copied\": \"Copié\",\n \"StatusBadge.aria.status\": \"Statut\",\n \"StatusBadge.error.invalidProps\": \"StatusBadge : propriétés invalides\",\n \"EmptyState.error.invalidProps\": \"EmptyState : propriétés invalides\",\n \"Toast.aria.close\": \"Fermer la notification\",\n \"Toast.error.invalidProps\": \"Toast : propriétés invalides\",\n \"Alert.aria.dismiss\": \"Fermer l'alerte\",\n \"Alert.error.invalidProps\": \"Alert : propriétés invalides\",\n \"VirtualList.empty.message\": \"Aucun élément à afficher\",\n \"VirtualList.error.invalidProps\": \"VirtualList : propriétés invalides\",\n \"Skeleton.aria.label\": \"Chargement\",\n \"Skeleton.error.invalidProps\": \"Skeleton : propriétés invalides\",\n // ─── Forms — useMosaicForm ─────────────────────────────────────────────────\n \"useMosaicForm.error.invalidProps\": \"useMosaicForm : options invalides\",\n // ─── Forms — FormProvider ──────────────────────────────────────────────────\n \"FormProvider.error.invalidProps\": \"FormProvider : propriétés invalides\",\n // ─── Forms — FormField ────────────────────────────────────────────────────\n \"FormField.error.invalidProps\": \"FormField : propriétés invalides\",\n // ─── Forms — ErrorDisplay ─────────────────────────────────────────────────\n \"ErrorDisplay.error.required\": \"Ce champ est obligatoire\",\n \"ErrorDisplay.error.min\": \"La valeur est inférieure au minimum\",\n \"ErrorDisplay.error.max\": \"La valeur dépasse le maximum\",\n \"ErrorDisplay.error.minLength\": \"La saisie est trop courte\",\n \"ErrorDisplay.error.maxLength\": \"La saisie est trop longue\",\n \"ErrorDisplay.error.pattern\": \"Format invalide\",\n \"ErrorDisplay.error.email\": \"Saisissez une adresse e-mail valide\",\n \"ErrorDisplay.error.url\": \"Saisissez une URL valide\",\n \"ErrorDisplay.error.generic\": \"Valeur invalide\",\n // ─── Forms — SubmitButton ─────────────────────────────────────────────────\n \"SubmitButton.aria.submit\": \"Soumettre le formulaire\",\n \"SubmitButton.state.loading\": \"Envoi en cours…\",\n \"SubmitButton.error.invalidProps\": \"SubmitButton : propriétés invalides\",\n // ─── Forms — Input ────────────────────────────────────────────────────────\n \"Input.aria.label\": \"Champ de saisie\",\n \"Input.error.required\": \"Ce champ est obligatoire\",\n \"Input.error.invalid\": \"Valeur invalide\",\n \"Input.error.tooLong\": \"La saisie est trop longue\",\n \"Input.error.tooShort\": \"La saisie est trop courte\",\n \"Input.error.invalidProps\": \"Input : propriétés invalides\",\n // ─── Forms — Textarea ─────────────────────────────────────────────────────\n \"Textarea.aria.label\": \"Zone de texte\",\n \"Textarea.error.required\": \"Ce champ est obligatoire\",\n \"Textarea.error.tooLong\": \"Le texte est trop long\",\n \"Textarea.counter.remaining\": \"caractères restants\",\n \"Textarea.error.invalidProps\": \"Textarea : propriétés invalides\",\n // ─── Forms — FieldArray ───────────────────────────────────────────────────\n \"FieldArray.aria.list\": \"Liste d'éléments\",\n \"FieldArray.aria.addItem\": \"Ajouter un élément\",\n \"FieldArray.aria.removeItem\": \"Supprimer l'élément\",\n \"FieldArray.error.invalidProps\": \"FieldArray : propriétés invalides\",\n // ─── Forms — Checkbox ─────────────────────────────────────────────────────\n \"Checkbox.aria.label\": \"Case à cocher\",\n \"Checkbox.error.required\": \"Ce champ doit être coché\",\n \"Checkbox.error.invalidProps\": \"Checkbox : propriétés invalides\",\n // ─── Forms — MultiSelect ──────────────────────────────────────────────────\n \"MultiSelect.aria.label\": \"Champ de sélection multiple\",\n \"MultiSelect.aria.removeChip\": \"Retirer\",\n \"MultiSelect.error.required\": \"Sélectionnez au moins une option\",\n \"MultiSelect.error.maxItems\": \"Nombre maximum de sélections atteint\",\n \"MultiSelect.placeholder\": \"Sélectionner des options…\",\n \"MultiSelect.search.placeholder\": \"Rechercher…\",\n \"MultiSelect.empty\": \"Aucune option disponible\",\n \"MultiSelect.error.invalidProps\": \"MultiSelect : propriétés invalides\",\n // ─── Forms — RadioGroup ───────────────────────────────────────────────────\n \"RadioGroup.aria.label\": \"Groupe de boutons radio\",\n \"RadioGroup.error.required\": \"Sélectionnez une option\",\n \"RadioGroup.error.invalidProps\": \"RadioGroup : propriétés invalides\",\n // ─── Forms — Select ───────────────────────────────────────────────────────\n \"Select.placeholder\": \"Sélectionner une option…\",\n \"Select.search.placeholder\": \"Rechercher…\",\n \"Select.empty\": \"Aucune option disponible\",\n \"Select.error.required\": \"Sélectionnez une option\",\n \"Select.error.invalidProps\": \"Select : propriétés invalides\",\n};\n\nexport type MosaicI18nKey = keyof typeof EN;\n\nconst TABLE: Record<MosaicLocale, Record<MosaicI18nKey, string>> = {\n en: EN,\n fr: FR,\n};\n\n/** Resolves a Mosaic i18n key for the given locale, falling back to EN. */\nexport function t(key: MosaicI18nKey, locale: MosaicLocale = \"en\"): string {\n return TABLE[locale]?.[key] ?? TABLE.en[key];\n}\n","// i18nKeys: MarkdownRenderer.aria.content, MarkdownRenderer.error.invalidProps, MarkdownRenderer.error.tooLong\n/** @jsxImportSource preact */\n\nimport DOMPurify from \"dompurify\";\nimport { marked } from \"marked\";\nimport {\n type MarkdownRendererProps,\n validateProps,\n} from \"../../../../components/artifacts/MarkdownRenderer.schema.js\";\nimport { t } from \"../../../../i18n/strings.js\";\n\n// ─── Inner (validated props) ──────────────────────────────────────────────────\n\nfunction MarkdownRendererInner({ content, locale, maxLength, allowHtml }: MarkdownRendererProps) {\n if (content.length > maxLength) {\n return (\n <div role=\"alert\" lang={locale}>\n {t(\"MarkdownRenderer.error.tooLong\", locale)}\n </div>\n );\n }\n\n // When allowHtml=false, strip raw HTML tags from source before parsing,\n // so user-supplied HTML is neutralised before marked converts markdown to HTML.\n const source = allowHtml ? content : content.replace(/<[^>]*>/g, \"\");\n const rawHtml = marked.parse(source, { async: false }) as string;\n // Always sanitize the marked output to prevent XSS from markdown-injected HTML.\n const cleanHtml = DOMPurify.sanitize(rawHtml);\n\n return (\n <article\n aria-label={t(\"MarkdownRenderer.aria.content\", locale)}\n lang={locale}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: sanitized by DOMPurify\n dangerouslySetInnerHTML={{ __html: cleanHtml }}\n />\n );\n}\n\n/**\n * MarkdownRenderer — cross-runtime markdown-to-HTML renderer (Preact 10 implementation).\n *\n * Accepts `Record<string, unknown>` for JSX and MCP postMessage injection alike.\n * Internal Zod validation narrows the type — invalid data renders an accessible error fallback.\n *\n * WCAG-AA:\n * - <article aria-label> — landmark with i18n label (EN/FR)\n * - <div role=\"alert\" lang> — tooLong + invalidProps errors announce to screen readers\n * - DOMPurify sanitization prevents XSS; allowHtml=false (default) strips raw HTML first\n *\n * i18nKeys: MarkdownRenderer.aria.content, MarkdownRenderer.error.invalidProps,\n * MarkdownRenderer.error.tooLong\n */\nexport function MarkdownRenderer(raw: Record<string, unknown>) {\n try {\n const props = validateProps(raw);\n return <MarkdownRendererInner {...props} />;\n } catch {\n const locale = raw.locale === \"fr\" ? \"fr\" : \"en\";\n return <div role=\"alert\">{t(\"MarkdownRenderer.error.invalidProps\", locale)}</div>;\n }\n}\n"]}
|
|
@@ -80,7 +80,37 @@ type ConfirmDialogProps = z.infer<typeof ConfirmDialogPropsSchema> & {
|
|
|
80
80
|
onConfirm: () => void;
|
|
81
81
|
onCancel: () => void;
|
|
82
82
|
};
|
|
83
|
+
declare function validateConfirmDialogProps(raw: unknown): z.infer<typeof ConfirmDialogPropsSchema>;
|
|
83
84
|
|
|
84
85
|
declare function ConfirmDialog(raw: Omit<ConfirmDialogProps, "variant" | "locale"> & Partial<Pick<ConfirmDialogProps, "variant" | "locale">>): react_jsx_runtime.JSX.Element | null;
|
|
85
86
|
|
|
86
|
-
|
|
87
|
+
declare const TokenDisplayOnceModalPropsSchema: z.ZodObject<{
|
|
88
|
+
token: z.ZodString;
|
|
89
|
+
title: z.ZodString;
|
|
90
|
+
warningMessage: z.ZodString;
|
|
91
|
+
copyLabel: z.ZodString;
|
|
92
|
+
closeLabel: z.ZodString;
|
|
93
|
+
locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
|
|
94
|
+
}, "strip", z.ZodTypeAny, {
|
|
95
|
+
title: string;
|
|
96
|
+
locale: "en" | "fr";
|
|
97
|
+
token: string;
|
|
98
|
+
warningMessage: string;
|
|
99
|
+
copyLabel: string;
|
|
100
|
+
closeLabel: string;
|
|
101
|
+
}, {
|
|
102
|
+
title: string;
|
|
103
|
+
token: string;
|
|
104
|
+
warningMessage: string;
|
|
105
|
+
copyLabel: string;
|
|
106
|
+
closeLabel: string;
|
|
107
|
+
locale?: "en" | "fr" | undefined;
|
|
108
|
+
}>;
|
|
109
|
+
type TokenDisplayOnceModalProps = z.infer<typeof TokenDisplayOnceModalPropsSchema> & {
|
|
110
|
+
onClose: () => void;
|
|
111
|
+
};
|
|
112
|
+
declare function validateTokenDisplayOnceModalProps(raw: unknown): z.infer<typeof TokenDisplayOnceModalPropsSchema>;
|
|
113
|
+
|
|
114
|
+
declare function TokenDisplayOnceModal(raw: Omit<TokenDisplayOnceModalProps, "locale"> & Partial<Pick<TokenDisplayOnceModalProps, "locale">>): react_jsx_runtime.JSX.Element | null;
|
|
115
|
+
|
|
116
|
+
export { Alert, type AlertProps, AlertPropsSchema, ConfirmDialog, type ConfirmDialogProps, ConfirmDialogPropsSchema, ConfirmDialog as ConfirmModal, type ConfirmDialogProps as ConfirmModalProps, TokenDisplayOnceModal, type TokenDisplayOnceModalProps, TokenDisplayOnceModalPropsSchema, validateAlertProps, validateConfirmDialogProps, validateTokenDisplayOnceModalProps };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { jsx, jsxs } from '
|
|
3
|
-
import { useRef, useId, useEffect } from '
|
|
2
|
+
import { jsx, jsxs } from 'preact/jsx-runtime';
|
|
3
|
+
import { useRef, useId, useEffect, useState } from 'preact/compat';
|
|
4
4
|
|
|
5
5
|
// src/components/confirmation/Alert.logic.ts
|
|
6
6
|
function getAlertAriaRole(variant) {
|
|
@@ -46,6 +46,7 @@ function validateAlertProps(raw) {
|
|
|
46
46
|
|
|
47
47
|
// src/i18n/strings.ts
|
|
48
48
|
var EN = {
|
|
49
|
+
// ─── Non-forms components ──────────────────────────────────────────────────
|
|
49
50
|
"ProgressBar.aria.label": "Progress",
|
|
50
51
|
"ProgressBar.error.invalidProps": "ProgressBar: invalid props",
|
|
51
52
|
"ConfirmDialog.button.confirm": "Confirm",
|
|
@@ -73,9 +74,71 @@ var EN = {
|
|
|
73
74
|
"VirtualList.empty.message": "No items to display",
|
|
74
75
|
"VirtualList.error.invalidProps": "VirtualList: invalid props",
|
|
75
76
|
"Skeleton.aria.label": "Loading",
|
|
76
|
-
"Skeleton.error.invalidProps": "Skeleton: invalid props"
|
|
77
|
+
"Skeleton.error.invalidProps": "Skeleton: invalid props",
|
|
78
|
+
// ─── Forms — useMosaicForm ─────────────────────────────────────────────────
|
|
79
|
+
"useMosaicForm.error.invalidProps": "useMosaicForm: invalid options",
|
|
80
|
+
// ─── Forms — FormProvider ──────────────────────────────────────────────────
|
|
81
|
+
"FormProvider.error.invalidProps": "FormProvider: invalid props",
|
|
82
|
+
// ─── Forms — FormField ────────────────────────────────────────────────────
|
|
83
|
+
"FormField.error.invalidProps": "FormField: invalid props",
|
|
84
|
+
// ─── Forms — ErrorDisplay ─────────────────────────────────────────────────
|
|
85
|
+
"ErrorDisplay.error.required": "This field is required",
|
|
86
|
+
"ErrorDisplay.error.min": "Value is below the minimum",
|
|
87
|
+
"ErrorDisplay.error.max": "Value exceeds the maximum",
|
|
88
|
+
"ErrorDisplay.error.minLength": "Input is too short",
|
|
89
|
+
"ErrorDisplay.error.maxLength": "Input is too long",
|
|
90
|
+
"ErrorDisplay.error.pattern": "Invalid format",
|
|
91
|
+
"ErrorDisplay.error.email": "Enter a valid email address",
|
|
92
|
+
"ErrorDisplay.error.url": "Enter a valid URL",
|
|
93
|
+
"ErrorDisplay.error.generic": "Invalid value",
|
|
94
|
+
// ─── Forms — SubmitButton ─────────────────────────────────────────────────
|
|
95
|
+
"SubmitButton.aria.submit": "Submit form",
|
|
96
|
+
"SubmitButton.state.loading": "Submitting\u2026",
|
|
97
|
+
"SubmitButton.error.invalidProps": "SubmitButton: invalid props",
|
|
98
|
+
// ─── Forms — Input ────────────────────────────────────────────────────────
|
|
99
|
+
"Input.aria.label": "Input field",
|
|
100
|
+
"Input.error.required": "This field is required",
|
|
101
|
+
"Input.error.invalid": "Invalid value",
|
|
102
|
+
"Input.error.tooLong": "Input is too long",
|
|
103
|
+
"Input.error.tooShort": "Input is too short",
|
|
104
|
+
"Input.error.invalidProps": "Input: invalid props",
|
|
105
|
+
// ─── Forms — Textarea ─────────────────────────────────────────────────────
|
|
106
|
+
"Textarea.aria.label": "Text area",
|
|
107
|
+
"Textarea.error.required": "This field is required",
|
|
108
|
+
"Textarea.error.tooLong": "Text is too long",
|
|
109
|
+
"Textarea.counter.remaining": "characters remaining",
|
|
110
|
+
"Textarea.error.invalidProps": "Textarea: invalid props",
|
|
111
|
+
// ─── Forms — FieldArray ───────────────────────────────────────────────────
|
|
112
|
+
"FieldArray.aria.list": "List of items",
|
|
113
|
+
"FieldArray.aria.addItem": "Add item",
|
|
114
|
+
"FieldArray.aria.removeItem": "Remove item",
|
|
115
|
+
"FieldArray.error.invalidProps": "FieldArray: invalid props",
|
|
116
|
+
// ─── Forms — Checkbox ─────────────────────────────────────────────────────
|
|
117
|
+
"Checkbox.aria.label": "Checkbox",
|
|
118
|
+
"Checkbox.error.required": "This field must be checked",
|
|
119
|
+
"Checkbox.error.invalidProps": "Checkbox: invalid props",
|
|
120
|
+
// ─── Forms — MultiSelect ──────────────────────────────────────────────────
|
|
121
|
+
"MultiSelect.aria.label": "Multi-select field",
|
|
122
|
+
"MultiSelect.aria.removeChip": "Remove",
|
|
123
|
+
"MultiSelect.error.required": "Select at least one option",
|
|
124
|
+
"MultiSelect.error.maxItems": "Maximum number of selections reached",
|
|
125
|
+
"MultiSelect.placeholder": "Select options\u2026",
|
|
126
|
+
"MultiSelect.search.placeholder": "Search\u2026",
|
|
127
|
+
"MultiSelect.empty": "No options available",
|
|
128
|
+
"MultiSelect.error.invalidProps": "MultiSelect: invalid props",
|
|
129
|
+
// ─── Forms — RadioGroup ───────────────────────────────────────────────────
|
|
130
|
+
"RadioGroup.aria.label": "Radio group",
|
|
131
|
+
"RadioGroup.error.required": "Select one option",
|
|
132
|
+
"RadioGroup.error.invalidProps": "RadioGroup: invalid props",
|
|
133
|
+
// ─── Forms — Select ───────────────────────────────────────────────────────
|
|
134
|
+
"Select.placeholder": "Select an option\u2026",
|
|
135
|
+
"Select.search.placeholder": "Search\u2026",
|
|
136
|
+
"Select.empty": "No options available",
|
|
137
|
+
"Select.error.required": "Select an option",
|
|
138
|
+
"Select.error.invalidProps": "Select: invalid props"
|
|
77
139
|
};
|
|
78
140
|
var FR = {
|
|
141
|
+
// ─── Non-forms components ──────────────────────────────────────────────────
|
|
79
142
|
"ProgressBar.aria.label": "Progression",
|
|
80
143
|
"ProgressBar.error.invalidProps": "ProgressBar : propri\xE9t\xE9s invalides",
|
|
81
144
|
"ConfirmDialog.button.confirm": "Confirmer",
|
|
@@ -103,7 +166,68 @@ var FR = {
|
|
|
103
166
|
"VirtualList.empty.message": "Aucun \xE9l\xE9ment \xE0 afficher",
|
|
104
167
|
"VirtualList.error.invalidProps": "VirtualList : propri\xE9t\xE9s invalides",
|
|
105
168
|
"Skeleton.aria.label": "Chargement",
|
|
106
|
-
"Skeleton.error.invalidProps": "Skeleton : propri\xE9t\xE9s invalides"
|
|
169
|
+
"Skeleton.error.invalidProps": "Skeleton : propri\xE9t\xE9s invalides",
|
|
170
|
+
// ─── Forms — useMosaicForm ─────────────────────────────────────────────────
|
|
171
|
+
"useMosaicForm.error.invalidProps": "useMosaicForm : options invalides",
|
|
172
|
+
// ─── Forms — FormProvider ──────────────────────────────────────────────────
|
|
173
|
+
"FormProvider.error.invalidProps": "FormProvider : propri\xE9t\xE9s invalides",
|
|
174
|
+
// ─── Forms — FormField ────────────────────────────────────────────────────
|
|
175
|
+
"FormField.error.invalidProps": "FormField : propri\xE9t\xE9s invalides",
|
|
176
|
+
// ─── Forms — ErrorDisplay ─────────────────────────────────────────────────
|
|
177
|
+
"ErrorDisplay.error.required": "Ce champ est obligatoire",
|
|
178
|
+
"ErrorDisplay.error.min": "La valeur est inf\xE9rieure au minimum",
|
|
179
|
+
"ErrorDisplay.error.max": "La valeur d\xE9passe le maximum",
|
|
180
|
+
"ErrorDisplay.error.minLength": "La saisie est trop courte",
|
|
181
|
+
"ErrorDisplay.error.maxLength": "La saisie est trop longue",
|
|
182
|
+
"ErrorDisplay.error.pattern": "Format invalide",
|
|
183
|
+
"ErrorDisplay.error.email": "Saisissez une adresse e-mail valide",
|
|
184
|
+
"ErrorDisplay.error.url": "Saisissez une URL valide",
|
|
185
|
+
"ErrorDisplay.error.generic": "Valeur invalide",
|
|
186
|
+
// ─── Forms — SubmitButton ─────────────────────────────────────────────────
|
|
187
|
+
"SubmitButton.aria.submit": "Soumettre le formulaire",
|
|
188
|
+
"SubmitButton.state.loading": "Envoi en cours\u2026",
|
|
189
|
+
"SubmitButton.error.invalidProps": "SubmitButton : propri\xE9t\xE9s invalides",
|
|
190
|
+
// ─── Forms — Input ────────────────────────────────────────────────────────
|
|
191
|
+
"Input.aria.label": "Champ de saisie",
|
|
192
|
+
"Input.error.required": "Ce champ est obligatoire",
|
|
193
|
+
"Input.error.invalid": "Valeur invalide",
|
|
194
|
+
"Input.error.tooLong": "La saisie est trop longue",
|
|
195
|
+
"Input.error.tooShort": "La saisie est trop courte",
|
|
196
|
+
"Input.error.invalidProps": "Input : propri\xE9t\xE9s invalides",
|
|
197
|
+
// ─── Forms — Textarea ─────────────────────────────────────────────────────
|
|
198
|
+
"Textarea.aria.label": "Zone de texte",
|
|
199
|
+
"Textarea.error.required": "Ce champ est obligatoire",
|
|
200
|
+
"Textarea.error.tooLong": "Le texte est trop long",
|
|
201
|
+
"Textarea.counter.remaining": "caract\xE8res restants",
|
|
202
|
+
"Textarea.error.invalidProps": "Textarea : propri\xE9t\xE9s invalides",
|
|
203
|
+
// ─── Forms — FieldArray ───────────────────────────────────────────────────
|
|
204
|
+
"FieldArray.aria.list": "Liste d'\xE9l\xE9ments",
|
|
205
|
+
"FieldArray.aria.addItem": "Ajouter un \xE9l\xE9ment",
|
|
206
|
+
"FieldArray.aria.removeItem": "Supprimer l'\xE9l\xE9ment",
|
|
207
|
+
"FieldArray.error.invalidProps": "FieldArray : propri\xE9t\xE9s invalides",
|
|
208
|
+
// ─── Forms — Checkbox ─────────────────────────────────────────────────────
|
|
209
|
+
"Checkbox.aria.label": "Case \xE0 cocher",
|
|
210
|
+
"Checkbox.error.required": "Ce champ doit \xEAtre coch\xE9",
|
|
211
|
+
"Checkbox.error.invalidProps": "Checkbox : propri\xE9t\xE9s invalides",
|
|
212
|
+
// ─── Forms — MultiSelect ──────────────────────────────────────────────────
|
|
213
|
+
"MultiSelect.aria.label": "Champ de s\xE9lection multiple",
|
|
214
|
+
"MultiSelect.aria.removeChip": "Retirer",
|
|
215
|
+
"MultiSelect.error.required": "S\xE9lectionnez au moins une option",
|
|
216
|
+
"MultiSelect.error.maxItems": "Nombre maximum de s\xE9lections atteint",
|
|
217
|
+
"MultiSelect.placeholder": "S\xE9lectionner des options\u2026",
|
|
218
|
+
"MultiSelect.search.placeholder": "Rechercher\u2026",
|
|
219
|
+
"MultiSelect.empty": "Aucune option disponible",
|
|
220
|
+
"MultiSelect.error.invalidProps": "MultiSelect : propri\xE9t\xE9s invalides",
|
|
221
|
+
// ─── Forms — RadioGroup ───────────────────────────────────────────────────
|
|
222
|
+
"RadioGroup.aria.label": "Groupe de boutons radio",
|
|
223
|
+
"RadioGroup.error.required": "S\xE9lectionnez une option",
|
|
224
|
+
"RadioGroup.error.invalidProps": "RadioGroup : propri\xE9t\xE9s invalides",
|
|
225
|
+
// ─── Forms — Select ───────────────────────────────────────────────────────
|
|
226
|
+
"Select.placeholder": "S\xE9lectionner une option\u2026",
|
|
227
|
+
"Select.search.placeholder": "Rechercher\u2026",
|
|
228
|
+
"Select.empty": "Aucune option disponible",
|
|
229
|
+
"Select.error.required": "S\xE9lectionnez une option",
|
|
230
|
+
"Select.error.invalidProps": "Select : propri\xE9t\xE9s invalides"
|
|
107
231
|
};
|
|
108
232
|
var TABLE = {
|
|
109
233
|
en: EN,
|
|
@@ -260,7 +384,123 @@ function ConfirmDialog(raw) {
|
|
|
260
384
|
return null;
|
|
261
385
|
}
|
|
262
386
|
}
|
|
387
|
+
var TokenDisplayOnceModalPropsSchema = z.object({
|
|
388
|
+
token: z.string().min(1),
|
|
389
|
+
title: z.string().min(1),
|
|
390
|
+
warningMessage: z.string().min(1),
|
|
391
|
+
copyLabel: z.string().min(1),
|
|
392
|
+
closeLabel: z.string().min(1),
|
|
393
|
+
locale: z.enum(["en", "fr"]).default("en")
|
|
394
|
+
});
|
|
395
|
+
function validateTokenDisplayOnceModalProps(raw) {
|
|
396
|
+
return TokenDisplayOnceModalPropsSchema.parse(raw);
|
|
397
|
+
}
|
|
398
|
+
function TokenDisplayOnceModalInner({
|
|
399
|
+
token,
|
|
400
|
+
title,
|
|
401
|
+
warningMessage,
|
|
402
|
+
copyLabel,
|
|
403
|
+
closeLabel,
|
|
404
|
+
locale,
|
|
405
|
+
onClose
|
|
406
|
+
}) {
|
|
407
|
+
const dialogRef = useRef(null);
|
|
408
|
+
const titleId = useId();
|
|
409
|
+
const warningId = useId();
|
|
410
|
+
const [copied, setCopied] = useState(false);
|
|
411
|
+
const [secureToken] = useState(token);
|
|
412
|
+
useEffect(() => {
|
|
413
|
+
const dialog = dialogRef.current;
|
|
414
|
+
if (!dialog) return;
|
|
415
|
+
dialog.showModal();
|
|
416
|
+
return () => {
|
|
417
|
+
if (dialog.open) dialog.close();
|
|
418
|
+
};
|
|
419
|
+
}, []);
|
|
420
|
+
async function handleCopy() {
|
|
421
|
+
try {
|
|
422
|
+
await navigator.clipboard.writeText(secureToken);
|
|
423
|
+
setCopied(true);
|
|
424
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
425
|
+
} catch {
|
|
426
|
+
setCopied(false);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
function handleKeyDown(e) {
|
|
430
|
+
if (e.key === "Escape") {
|
|
431
|
+
e.preventDefault();
|
|
432
|
+
onClose();
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
function handleBackdropClick(e) {
|
|
436
|
+
if (e.target === dialogRef.current) {
|
|
437
|
+
onClose();
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return /* @__PURE__ */ jsx(
|
|
441
|
+
"dialog",
|
|
442
|
+
{
|
|
443
|
+
ref: dialogRef,
|
|
444
|
+
"aria-modal": "true",
|
|
445
|
+
"aria-labelledby": titleId,
|
|
446
|
+
"aria-describedby": warningId,
|
|
447
|
+
onKeyDown: handleKeyDown,
|
|
448
|
+
onClick: handleBackdropClick,
|
|
449
|
+
className: "rounded-lg shadow-xl p-0 backdrop:bg-black/40 w-full max-w-lg mx-auto",
|
|
450
|
+
children: /* @__PURE__ */ jsxs(
|
|
451
|
+
"div",
|
|
452
|
+
{
|
|
453
|
+
className: "p-6 flex flex-col gap-4",
|
|
454
|
+
onClick: (e) => e.stopPropagation(),
|
|
455
|
+
onKeyDown: (e) => e.stopPropagation(),
|
|
456
|
+
children: [
|
|
457
|
+
/* @__PURE__ */ jsx("h2", { id: titleId, className: "text-lg font-semibold text-gray-900", children: title }),
|
|
458
|
+
/* @__PURE__ */ jsx(
|
|
459
|
+
"p",
|
|
460
|
+
{
|
|
461
|
+
id: warningId,
|
|
462
|
+
className: "text-sm text-amber-700 bg-amber-50 border border-amber-200 rounded-md px-3 py-2",
|
|
463
|
+
children: warningMessage
|
|
464
|
+
}
|
|
465
|
+
),
|
|
466
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 bg-gray-50 border border-gray-200 rounded-md px-3 py-2", children: /* @__PURE__ */ jsx("code", { className: "flex-1 text-sm font-mono text-gray-800 break-all select-all", children: secureToken }) }),
|
|
467
|
+
/* @__PURE__ */ jsx("output", { "aria-live": "polite", "aria-atomic": "true", className: "min-h-[1.25rem] block", children: copied && /* @__PURE__ */ jsx("span", { className: "text-sm text-green-700 font-medium", children: t("TokenDisplayOnceModal.copied", locale) }) }),
|
|
468
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-3 mt-2", children: [
|
|
469
|
+
/* @__PURE__ */ jsx(
|
|
470
|
+
"button",
|
|
471
|
+
{
|
|
472
|
+
type: "button",
|
|
473
|
+
onClick: handleCopy,
|
|
474
|
+
className: "px-4 py-2 rounded-md text-sm font-medium bg-gray-100 text-gray-800 hover:bg-gray-200 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400 transition-colors",
|
|
475
|
+
children: copyLabel
|
|
476
|
+
}
|
|
477
|
+
),
|
|
478
|
+
/* @__PURE__ */ jsx(
|
|
479
|
+
"button",
|
|
480
|
+
{
|
|
481
|
+
type: "button",
|
|
482
|
+
onClick: onClose,
|
|
483
|
+
className: "px-4 py-2 rounded-md text-sm font-medium bg-gray-900 text-white hover:bg-gray-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900 transition-colors",
|
|
484
|
+
children: closeLabel
|
|
485
|
+
}
|
|
486
|
+
)
|
|
487
|
+
] })
|
|
488
|
+
]
|
|
489
|
+
}
|
|
490
|
+
)
|
|
491
|
+
}
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
function TokenDisplayOnceModal(raw) {
|
|
495
|
+
try {
|
|
496
|
+
const parsed = validateTokenDisplayOnceModalProps(raw);
|
|
497
|
+
return /* @__PURE__ */ jsx(TokenDisplayOnceModalInner, { ...parsed, onClose: raw.onClose });
|
|
498
|
+
} catch (err) {
|
|
499
|
+
console.warn("[TokenDisplayOnceModal] Invalid props \u2014 component will not render.", err);
|
|
500
|
+
return null;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
263
503
|
|
|
264
|
-
export { Alert, AlertPropsSchema, ConfirmDialog as ConfirmModal, validateAlertProps };
|
|
504
|
+
export { Alert, AlertPropsSchema, ConfirmDialog, ConfirmDialogPropsSchema, ConfirmDialog as ConfirmModal, TokenDisplayOnceModal, TokenDisplayOnceModalPropsSchema, validateAlertProps, validateConfirmDialogProps, validateTokenDisplayOnceModalProps };
|
|
265
505
|
//# sourceMappingURL=confirmation.js.map
|
|
266
506
|
//# sourceMappingURL=confirmation.js.map
|