@vantageos/mosaic 0.2.2 → 0.3.0-alpha.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/README.md +181 -0
- package/dist/Alert.schema-BQsZGG6P.d.cts +41 -0
- package/dist/Alert.schema-BQsZGG6P.d.ts +41 -0
- package/dist/ConfirmDialog-B3CQQGmJ.d.cts +34 -0
- package/dist/ConfirmDialog-B3CQQGmJ.d.ts +34 -0
- package/dist/Skeleton.schema-BO0ca2UX.d.cts +135 -0
- package/dist/Skeleton.schema-BO0ca2UX.d.ts +135 -0
- package/dist/Tabs.schema-BzcEyeq8.d.cts +79 -0
- package/dist/Tabs.schema-BzcEyeq8.d.ts +79 -0
- package/dist/artifacts.cjs +20 -2
- package/dist/artifacts.cjs.map +1 -1
- package/dist/artifacts.js +20 -2
- package/dist/artifacts.js.map +1 -1
- package/dist/confirmation.cjs +44 -2
- package/dist/confirmation.cjs.map +1 -1
- package/dist/confirmation.d.cts +34 -1
- package/dist/confirmation.d.ts +34 -1
- package/dist/confirmation.js +41 -3
- package/dist/confirmation.js.map +1 -1
- package/dist/display.cjs +145 -2
- package/dist/display.cjs.map +1 -1
- package/dist/display.d.cts +1 -0
- package/dist/display.d.ts +1 -0
- package/dist/display.js +140 -3
- package/dist/display.js.map +1 -1
- package/dist/forms.cjs +1412 -0
- package/dist/forms.cjs.map +1 -0
- package/dist/forms.d.cts +159 -0
- package/dist/forms.d.ts +159 -0
- package/dist/forms.js +1331 -0
- package/dist/forms.js.map +1 -0
- package/dist/index-CwXVgtGb.d.cts +917 -0
- package/dist/index-CwXVgtGb.d.ts +917 -0
- package/dist/index.cjs +188 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.js +177 -3
- package/dist/index.js.map +1 -1
- package/dist/input.cjs +19 -0
- package/dist/input.cjs.map +1 -1
- package/dist/input.d.cts +4 -34
- package/dist/input.d.ts +4 -34
- package/dist/input.js +18 -1
- package/dist/input.js.map +1 -1
- package/dist/media.cjs +20 -2
- package/dist/media.cjs.map +1 -1
- package/dist/media.js +20 -2
- package/dist/media.js.map +1 -1
- package/dist/preact/confirmation.d.ts +85 -1
- package/dist/preact/confirmation.js +263 -0
- package/dist/preact/confirmation.js.map +1 -1
- package/dist/preact/display.d.ts +240 -1
- package/dist/preact/display.js +366 -0
- package/dist/preact/display.js.map +1 -1
- package/dist/preact/forms.d.ts +875 -0
- package/dist/preact/forms.js +1323 -0
- package/dist/preact/forms.js.map +1 -0
- package/dist/preact/input.d.ts +88 -1
- package/dist/preact/input.js +194 -0
- package/dist/preact/input.js.map +1 -1
- package/dist/progress.cjs +20 -2
- package/dist/progress.cjs.map +1 -1
- package/dist/progress.js +20 -2
- package/dist/progress.js.map +1 -1
- package/dist/react/confirmation.cjs +267 -0
- package/dist/react/confirmation.cjs.map +1 -1
- package/dist/react/confirmation.d.cts +21 -1
- package/dist/react/confirmation.d.ts +21 -1
- package/dist/react/confirmation.js +263 -0
- package/dist/react/confirmation.js.map +1 -1
- package/dist/react/display.cjs +372 -0
- package/dist/react/display.cjs.map +1 -1
- package/dist/react/display.d.cts +112 -1
- package/dist/react/display.d.ts +112 -1
- package/dist/react/display.js +362 -0
- package/dist/react/display.js.map +1 -1
- package/dist/react/forms.cjs +1384 -0
- package/dist/react/forms.cjs.map +1 -0
- package/dist/react/forms.d.cts +5 -0
- package/dist/react/forms.d.ts +5 -0
- package/dist/react/forms.js +1323 -0
- package/dist/react/forms.js.map +1 -0
- package/dist/react/input.cjs +197 -0
- package/dist/react/input.cjs.map +1 -1
- package/dist/react/input.d.cts +13 -1
- package/dist/react/input.d.ts +13 -1
- package/dist/react/input.js +194 -0
- package/dist/react/input.js.map +1 -1
- package/package.json +73 -49
- package/registry.yaml +154 -1
|
@@ -1,3 +1,266 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import { useRef, useId, useEffect } from 'react';
|
|
1
4
|
|
|
5
|
+
// src/components/confirmation/Alert.logic.ts
|
|
6
|
+
function getAlertAriaRole(variant) {
|
|
7
|
+
return variant === "error" ? "alert" : "status";
|
|
8
|
+
}
|
|
9
|
+
function getAlertAriaLive(variant) {
|
|
10
|
+
return variant === "error" ? "assertive" : "polite";
|
|
11
|
+
}
|
|
12
|
+
var alertContainerClasses = {
|
|
13
|
+
success: "bg-green-50 text-green-900 ring-1 ring-green-300 border-l-4 border-green-500",
|
|
14
|
+
error: "bg-red-50 text-red-900 ring-1 ring-red-300 border-l-4 border-red-600",
|
|
15
|
+
info: "bg-blue-50 text-blue-900 ring-1 ring-blue-300 border-l-4 border-blue-500",
|
|
16
|
+
warning: "bg-amber-50 text-amber-900 ring-1 ring-amber-300 border-l-4 border-amber-500"
|
|
17
|
+
};
|
|
18
|
+
var alertTitleClasses = {
|
|
19
|
+
success: "text-green-900 font-semibold",
|
|
20
|
+
error: "text-red-900 font-semibold",
|
|
21
|
+
info: "text-blue-900 font-semibold",
|
|
22
|
+
warning: "text-amber-900 font-semibold"
|
|
23
|
+
};
|
|
24
|
+
var alertDescriptionClasses = {
|
|
25
|
+
success: "text-green-800",
|
|
26
|
+
error: "text-red-800",
|
|
27
|
+
info: "text-blue-800",
|
|
28
|
+
warning: "text-amber-800"
|
|
29
|
+
};
|
|
30
|
+
var alertDismissClasses = {
|
|
31
|
+
success: "text-green-700 hover:bg-green-100 focus-visible:outline-green-600",
|
|
32
|
+
error: "text-red-700 hover:bg-red-100 focus-visible:outline-red-600",
|
|
33
|
+
info: "text-blue-700 hover:bg-blue-100 focus-visible:outline-blue-600",
|
|
34
|
+
warning: "text-amber-700 hover:bg-amber-100 focus-visible:outline-amber-600"
|
|
35
|
+
};
|
|
36
|
+
var AlertPropsSchema = z.object({
|
|
37
|
+
variant: z.enum(["success", "error", "info", "warning"]),
|
|
38
|
+
title: z.string().min(1),
|
|
39
|
+
description: z.string().optional(),
|
|
40
|
+
dismissible: z.boolean().default(false),
|
|
41
|
+
locale: z.enum(["en", "fr"]).default("en")
|
|
42
|
+
});
|
|
43
|
+
function validateAlertProps(raw) {
|
|
44
|
+
return AlertPropsSchema.parse(raw);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// src/i18n/strings.ts
|
|
48
|
+
var EN = {
|
|
49
|
+
"ProgressBar.aria.label": "Progress",
|
|
50
|
+
"ProgressBar.error.invalidProps": "ProgressBar: invalid props",
|
|
51
|
+
"ConfirmDialog.button.confirm": "Confirm",
|
|
52
|
+
"ConfirmDialog.button.cancel": "Cancel",
|
|
53
|
+
"ConfirmDialog.aria.dialog": "Confirmation dialog",
|
|
54
|
+
"TableView.aria.table": "Data table",
|
|
55
|
+
"TableView.pagination.next": "Next page",
|
|
56
|
+
"TableView.pagination.prev": "Previous page",
|
|
57
|
+
"TableView.empty.message": "No data to display",
|
|
58
|
+
"TableView.error.invalidProps": "TableView: invalid props",
|
|
59
|
+
"MarkdownRenderer.aria.content": "Rendered Markdown content",
|
|
60
|
+
"MarkdownRenderer.error.invalidProps": "MarkdownRenderer: invalid props",
|
|
61
|
+
"MarkdownRenderer.error.tooLong": "Content exceeds maximum length",
|
|
62
|
+
"TokenDisplayOnceModal.button.copy": "Copy token",
|
|
63
|
+
"TokenDisplayOnceModal.button.close": "Close",
|
|
64
|
+
"TokenDisplayOnceModal.warning.once": "This token will only be shown once. Copy it now.",
|
|
65
|
+
"TokenDisplayOnceModal.copied": "Copied",
|
|
66
|
+
"StatusBadge.aria.status": "Status",
|
|
67
|
+
"StatusBadge.error.invalidProps": "StatusBadge: invalid props",
|
|
68
|
+
"EmptyState.error.invalidProps": "EmptyState: invalid props",
|
|
69
|
+
"Toast.aria.close": "Close notification",
|
|
70
|
+
"Toast.error.invalidProps": "Toast: invalid props",
|
|
71
|
+
"Alert.aria.dismiss": "Dismiss alert",
|
|
72
|
+
"Alert.error.invalidProps": "Alert: invalid props",
|
|
73
|
+
"VirtualList.empty.message": "No items to display",
|
|
74
|
+
"VirtualList.error.invalidProps": "VirtualList: invalid props",
|
|
75
|
+
"Skeleton.aria.label": "Loading",
|
|
76
|
+
"Skeleton.error.invalidProps": "Skeleton: invalid props"
|
|
77
|
+
};
|
|
78
|
+
var FR = {
|
|
79
|
+
"ProgressBar.aria.label": "Progression",
|
|
80
|
+
"ProgressBar.error.invalidProps": "ProgressBar : propri\xE9t\xE9s invalides",
|
|
81
|
+
"ConfirmDialog.button.confirm": "Confirmer",
|
|
82
|
+
"ConfirmDialog.button.cancel": "Annuler",
|
|
83
|
+
"ConfirmDialog.aria.dialog": "Bo\xEEte de dialogue de confirmation",
|
|
84
|
+
"TableView.aria.table": "Tableau de donn\xE9es",
|
|
85
|
+
"TableView.pagination.next": "Page suivante",
|
|
86
|
+
"TableView.pagination.prev": "Page pr\xE9c\xE9dente",
|
|
87
|
+
"TableView.empty.message": "Aucune donn\xE9e \xE0 afficher",
|
|
88
|
+
"TableView.error.invalidProps": "TableView : propri\xE9t\xE9s invalides",
|
|
89
|
+
"MarkdownRenderer.aria.content": "Contenu Markdown rendu",
|
|
90
|
+
"MarkdownRenderer.error.invalidProps": "MarkdownRenderer : propri\xE9t\xE9s invalides",
|
|
91
|
+
"MarkdownRenderer.error.tooLong": "Le contenu d\xE9passe la longueur maximale",
|
|
92
|
+
"TokenDisplayOnceModal.button.copy": "Copier le jeton",
|
|
93
|
+
"TokenDisplayOnceModal.button.close": "Fermer",
|
|
94
|
+
"TokenDisplayOnceModal.warning.once": "Ce jeton ne sera affich\xE9 qu'une seule fois. Copiez-le maintenant.",
|
|
95
|
+
"TokenDisplayOnceModal.copied": "Copi\xE9",
|
|
96
|
+
"StatusBadge.aria.status": "Statut",
|
|
97
|
+
"StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides",
|
|
98
|
+
"EmptyState.error.invalidProps": "EmptyState : propri\xE9t\xE9s invalides",
|
|
99
|
+
"Toast.aria.close": "Fermer la notification",
|
|
100
|
+
"Toast.error.invalidProps": "Toast : propri\xE9t\xE9s invalides",
|
|
101
|
+
"Alert.aria.dismiss": "Fermer l'alerte",
|
|
102
|
+
"Alert.error.invalidProps": "Alert : propri\xE9t\xE9s invalides",
|
|
103
|
+
"VirtualList.empty.message": "Aucun \xE9l\xE9ment \xE0 afficher",
|
|
104
|
+
"VirtualList.error.invalidProps": "VirtualList : propri\xE9t\xE9s invalides",
|
|
105
|
+
"Skeleton.aria.label": "Chargement",
|
|
106
|
+
"Skeleton.error.invalidProps": "Skeleton : propri\xE9t\xE9s invalides"
|
|
107
|
+
};
|
|
108
|
+
var TABLE = {
|
|
109
|
+
en: EN,
|
|
110
|
+
fr: FR
|
|
111
|
+
};
|
|
112
|
+
function t(key, locale = "en") {
|
|
113
|
+
return TABLE[locale]?.[key] ?? TABLE.en[key];
|
|
114
|
+
}
|
|
115
|
+
function AlertInner({ variant, title, description, dismissible, locale, onDismiss }) {
|
|
116
|
+
const role = getAlertAriaRole(variant);
|
|
117
|
+
const ariaLive = getAlertAriaLive(variant);
|
|
118
|
+
const dismissLabel = t("Alert.aria.dismiss", locale);
|
|
119
|
+
return /* @__PURE__ */ jsxs(
|
|
120
|
+
"div",
|
|
121
|
+
{
|
|
122
|
+
role,
|
|
123
|
+
"aria-live": ariaLive,
|
|
124
|
+
"aria-atomic": "true",
|
|
125
|
+
className: `relative flex items-start gap-3 rounded-md px-4 py-3 w-full ${alertContainerClasses[variant]}`,
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
128
|
+
/* @__PURE__ */ jsx("p", { className: `text-sm leading-snug ${alertTitleClasses[variant]}`, children: title }),
|
|
129
|
+
description && /* @__PURE__ */ jsx("p", { className: `mt-1 text-xs leading-relaxed ${alertDescriptionClasses[variant]}`, children: description })
|
|
130
|
+
] }),
|
|
131
|
+
dismissible && /* @__PURE__ */ jsx(
|
|
132
|
+
"button",
|
|
133
|
+
{
|
|
134
|
+
type: "button",
|
|
135
|
+
"aria-label": dismissLabel,
|
|
136
|
+
onClick: onDismiss,
|
|
137
|
+
className: `shrink-0 rounded p-0.5 transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 ${alertDismissClasses[variant]}`,
|
|
138
|
+
children: /* @__PURE__ */ jsx(
|
|
139
|
+
"svg",
|
|
140
|
+
{
|
|
141
|
+
"aria-hidden": "true",
|
|
142
|
+
width: "14",
|
|
143
|
+
height: "14",
|
|
144
|
+
viewBox: "0 0 14 14",
|
|
145
|
+
fill: "none",
|
|
146
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
147
|
+
children: /* @__PURE__ */ jsx(
|
|
148
|
+
"path",
|
|
149
|
+
{
|
|
150
|
+
d: "M1 1l12 12M13 1L1 13",
|
|
151
|
+
stroke: "currentColor",
|
|
152
|
+
strokeWidth: "1.8",
|
|
153
|
+
strokeLinecap: "round"
|
|
154
|
+
}
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
function Alert(raw) {
|
|
165
|
+
try {
|
|
166
|
+
const parsed = validateAlertProps(raw);
|
|
167
|
+
return /* @__PURE__ */ jsx(AlertInner, { ...parsed, onDismiss: raw.onDismiss });
|
|
168
|
+
} catch (err) {
|
|
169
|
+
console.error("[Alert] Invalid props \u2014 component will not render.", err);
|
|
170
|
+
const locale = raw.locale === "fr" ? "fr" : "en";
|
|
171
|
+
return /* @__PURE__ */ jsx("span", { role: "alert", children: t("Alert.error.invalidProps", locale) });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
var ConfirmDialogPropsSchema = z.object({
|
|
175
|
+
title: z.string().min(1),
|
|
176
|
+
message: z.string().min(1),
|
|
177
|
+
confirmLabel: z.string().min(1),
|
|
178
|
+
cancelLabel: z.string().min(1),
|
|
179
|
+
variant: z.enum(["default", "danger"]).default("default"),
|
|
180
|
+
locale: z.enum(["en", "fr"]).default("en")
|
|
181
|
+
});
|
|
182
|
+
function validateConfirmDialogProps(raw) {
|
|
183
|
+
return ConfirmDialogPropsSchema.parse(raw);
|
|
184
|
+
}
|
|
185
|
+
function ConfirmDialogInner({
|
|
186
|
+
title,
|
|
187
|
+
message,
|
|
188
|
+
confirmLabel,
|
|
189
|
+
cancelLabel,
|
|
190
|
+
variant,
|
|
191
|
+
onConfirm,
|
|
192
|
+
onCancel
|
|
193
|
+
}) {
|
|
194
|
+
const dialogRef = useRef(null);
|
|
195
|
+
const titleId = useId();
|
|
196
|
+
const messageId = useId();
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
const dialog = dialogRef.current;
|
|
199
|
+
if (!dialog) return;
|
|
200
|
+
dialog.showModal();
|
|
201
|
+
return () => {
|
|
202
|
+
if (dialog.open) dialog.close();
|
|
203
|
+
};
|
|
204
|
+
}, []);
|
|
205
|
+
function handleKeyDown(e) {
|
|
206
|
+
if (e.key === "Escape") {
|
|
207
|
+
e.preventDefault();
|
|
208
|
+
onCancel();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function handleBackdropClick(e) {
|
|
212
|
+
if (e.target === dialogRef.current) {
|
|
213
|
+
onCancel();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const confirmClassName = variant === "danger" ? "bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-600 px-4 py-2 rounded-md text-sm font-medium transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2" : "bg-gray-900 text-white hover:bg-gray-700 focus-visible:outline-gray-900 px-4 py-2 rounded-md text-sm font-medium transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2";
|
|
217
|
+
return /* @__PURE__ */ jsx(
|
|
218
|
+
"dialog",
|
|
219
|
+
{
|
|
220
|
+
ref: dialogRef,
|
|
221
|
+
"aria-modal": "true",
|
|
222
|
+
"aria-labelledby": titleId,
|
|
223
|
+
"aria-describedby": messageId,
|
|
224
|
+
onKeyDown: handleKeyDown,
|
|
225
|
+
onClick: handleBackdropClick,
|
|
226
|
+
className: "rounded-lg shadow-xl p-0 backdrop:bg-black/40 w-full max-w-md mx-auto",
|
|
227
|
+
children: /* @__PURE__ */ jsxs(
|
|
228
|
+
"div",
|
|
229
|
+
{
|
|
230
|
+
className: "p-6 flex flex-col gap-4",
|
|
231
|
+
onClick: (e) => e.stopPropagation(),
|
|
232
|
+
onKeyDown: (e) => e.stopPropagation(),
|
|
233
|
+
children: [
|
|
234
|
+
/* @__PURE__ */ jsx("h2", { id: titleId, className: "text-lg font-semibold text-gray-900", children: title }),
|
|
235
|
+
/* @__PURE__ */ jsx("p", { id: messageId, className: "text-sm text-gray-600", children: message }),
|
|
236
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-3 mt-2", children: [
|
|
237
|
+
/* @__PURE__ */ jsx(
|
|
238
|
+
"button",
|
|
239
|
+
{
|
|
240
|
+
type: "button",
|
|
241
|
+
onClick: onCancel,
|
|
242
|
+
className: "px-4 py-2 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400 transition-colors",
|
|
243
|
+
children: cancelLabel
|
|
244
|
+
}
|
|
245
|
+
),
|
|
246
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: onConfirm, className: confirmClassName, children: confirmLabel })
|
|
247
|
+
] })
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
}
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
function ConfirmDialog(raw) {
|
|
255
|
+
try {
|
|
256
|
+
const parsed = validateConfirmDialogProps(raw);
|
|
257
|
+
return /* @__PURE__ */ jsx(ConfirmDialogInner, { ...parsed, onConfirm: raw.onConfirm, onCancel: raw.onCancel });
|
|
258
|
+
} catch (err) {
|
|
259
|
+
console.error("[ConfirmDialog] Invalid props \u2014 component will not render.", err);
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export { Alert, AlertPropsSchema, ConfirmDialog as ConfirmModal, validateAlertProps };
|
|
2
265
|
//# sourceMappingURL=confirmation.js.map
|
|
3
266
|
//# sourceMappingURL=confirmation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"confirmation.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/confirmation/Alert.logic.ts","../../src/components/confirmation/Alert.schema.ts","../../src/i18n/strings.ts","../../src/runtimes/preact/components/confirmation/Alert.tsx","../../src/components/input/ConfirmDialog.schema.ts","../../src/components/input/ConfirmDialog.tsx"],"names":["z","jsx","jsxs"],"mappings":"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","file":"confirmation.js","sourcesContent":["/**\n * Alert.logic.ts — shared pure logic (no JSX, no runtime dependency).\n *\n * Used by both React 19 and Preact 10 runtime implementations.\n */\n\nexport type AlertVariant = \"success\" | \"error\" | \"info\" | \"warning\";\n\n/**\n * WCAG-AA aria-live / role rules:\n * - \"error\" → role=\"alert\" + aria-live=\"assertive\" (interrupts — user must know immediately)\n * - all others → role=\"status\" + aria-live=\"polite\" (non-intrusive)\n */\nexport function getAlertAriaRole(variant: AlertVariant): \"alert\" | \"status\" {\n return variant === \"error\" ? \"alert\" : \"status\";\n}\n\nexport function getAlertAriaLive(variant: AlertVariant): \"assertive\" | \"polite\" {\n return variant === \"error\" ? \"assertive\" : \"polite\";\n}\n\n/**\n * Tailwind class maps per variant.\n * Using ring-1 for a subtle border + border-l-4 accent.\n * Tinted neutrals — no pure white/black backgrounds.\n */\nexport const alertContainerClasses: Record<AlertVariant, string> = {\n success: \"bg-green-50 text-green-900 ring-1 ring-green-300 border-l-4 border-green-500\",\n error: \"bg-red-50 text-red-900 ring-1 ring-red-300 border-l-4 border-red-600\",\n info: \"bg-blue-50 text-blue-900 ring-1 ring-blue-300 border-l-4 border-blue-500\",\n warning: \"bg-amber-50 text-amber-900 ring-1 ring-amber-300 border-l-4 border-amber-500\",\n};\n\nexport const alertTitleClasses: Record<AlertVariant, string> = {\n success: \"text-green-900 font-semibold\",\n error: \"text-red-900 font-semibold\",\n info: \"text-blue-900 font-semibold\",\n warning: \"text-amber-900 font-semibold\",\n};\n\nexport const alertDescriptionClasses: Record<AlertVariant, string> = {\n success: \"text-green-800\",\n error: \"text-red-800\",\n info: \"text-blue-800\",\n warning: \"text-amber-800\",\n};\n\nexport const alertDismissClasses: Record<AlertVariant, string> = {\n success: \"text-green-700 hover:bg-green-100 focus-visible:outline-green-600\",\n error: \"text-red-700 hover:bg-red-100 focus-visible:outline-red-600\",\n info: \"text-blue-700 hover:bg-blue-100 focus-visible:outline-blue-600\",\n warning: \"text-amber-700 hover:bg-amber-100 focus-visible:outline-amber-600\",\n};\n","import { z } from \"zod\";\n\n// i18nKeys: Alert.aria.dismiss, Alert.error.invalidProps\n\n/**\n * Alert component props schema.\n *\n * Persistent inline banner (vs Toast which is ephemeral + auto-dismissing).\n *\n * variant — controls visual style + ARIA role auto-assignment:\n * \"error\" → role=\"alert\" (assertive, interrupts screen reader)\n * all others → role=\"status\" (polite, non-intrusive)\n * title — consumer-driven; caller passes already-localized string\n * description — optional supporting text beneath the title\n * dismissible — when true, renders a dismiss button (default: false)\n * onDismiss — callback fired when dismiss button is clicked\n * locale — controls dismiss button aria-label language\n */\nexport const AlertPropsSchema = z.object({\n variant: z.enum([\"success\", \"error\", \"info\", \"warning\"]),\n title: z.string().min(1),\n description: z.string().optional(),\n dismissible: z.boolean().default(false),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type AlertProps = z.infer<typeof AlertPropsSchema> & {\n onDismiss?: () => void;\n};\n\nexport function validateAlertProps(raw: unknown): z.infer<typeof AlertPropsSchema> {\n return AlertPropsSchema.parse(raw);\n}\n","/**\n * Compile-time mirror of `@vantageos/mosaic-i18n` EN/FR locales for the 6\n * v0.1.0 components. Inlined here so that `<Comp>` renderers can resolve\n * `t(key, locale)` without dragging react-i18next into the component runtime\n * (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 */\nexport type MosaicLocale = \"en\" | \"fr\";\n\nconst EN = {\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} as const;\n\nconst FR: Record<keyof typeof EN, string> = {\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};\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: Alert.aria.dismiss, Alert.error.invalidProps\n// Note: uses React-compat prop names (className, strokeWidth) for TSC compliance.\n// Preact/compat accepts both className and class at runtime.\n// tsup aliases react → preact/compat at build time per §18.1 architecture standard.\n\nimport {\n alertContainerClasses,\n alertDescriptionClasses,\n alertDismissClasses,\n alertTitleClasses,\n getAlertAriaLive,\n getAlertAriaRole,\n} from \"../../../../components/confirmation/Alert.logic.js\";\nimport {\n type AlertProps,\n validateAlertProps,\n} from \"../../../../components/confirmation/Alert.schema.js\";\nimport { t } from \"../../../../i18n/strings.js\";\n\nfunction AlertInner({ variant, title, description, dismissible, locale, onDismiss }: AlertProps) {\n const role = getAlertAriaRole(variant);\n const ariaLive = getAlertAriaLive(variant);\n const dismissLabel = t(\"Alert.aria.dismiss\", locale);\n\n return (\n <div\n role={role}\n aria-live={ariaLive}\n aria-atomic=\"true\"\n className={`relative flex items-start gap-3 rounded-md px-4 py-3 w-full ${alertContainerClasses[variant]}`}\n >\n <div className=\"flex-1 min-w-0\">\n <p className={`text-sm leading-snug ${alertTitleClasses[variant]}`}>{title}</p>\n {description && (\n <p className={`mt-1 text-xs leading-relaxed ${alertDescriptionClasses[variant]}`}>\n {description}\n </p>\n )}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n aria-label={dismissLabel}\n onClick={onDismiss}\n className={`shrink-0 rounded p-0.5 transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 ${alertDismissClasses[variant]}`}\n >\n {/* X icon — inline SVG, no external deps */}\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M1 1l12 12M13 1L1 13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n\n/**\n * Alert — persistent inline banner (Preact 10 implementation).\n *\n * Contrast with Toast: Alert is PERSISTENT (no auto-dismiss), inline in the\n * document flow. Toast is ephemeral + portal-mounted.\n *\n * Accepts `Record<string, unknown>` for MCP postMessage injection safety.\n * Zod validation narrows before render. Invalid props → accessible error span.\n *\n * WCAG-AA:\n * - variant=\"error\" → role=\"alert\" + aria-live=\"assertive\"\n * - all others → role=\"status\" + aria-live=\"polite\"\n */\nexport function Alert(\n raw: Omit<AlertProps, \"locale\" | \"dismissible\"> &\n Partial<Pick<AlertProps, \"locale\" | \"dismissible\">>,\n) {\n try {\n const parsed = validateAlertProps(raw);\n return <AlertInner {...parsed} onDismiss={raw.onDismiss} />;\n } catch (err) {\n console.error(\"[Alert] Invalid props — component will not render.\", err);\n const locale = (raw as Record<string, unknown>).locale === \"fr\" ? \"fr\" : \"en\";\n return <span role=\"alert\">{t(\"Alert.error.invalidProps\", locale)}</span>;\n }\n}\n","import { z } from \"zod\";\n\n// i18nKeys: ConfirmDialog.button.confirm, ConfirmDialog.button.cancel, ConfirmDialog.aria.dialog\n\nexport const ConfirmDialogPropsSchema = z.object({\n title: z.string().min(1),\n message: z.string().min(1),\n confirmLabel: z.string().min(1),\n cancelLabel: z.string().min(1),\n variant: z.enum([\"default\", \"danger\"]).default(\"default\"),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type ConfirmDialogProps = z.infer<typeof ConfirmDialogPropsSchema> & {\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport function validateConfirmDialogProps(raw: unknown): z.infer<typeof ConfirmDialogPropsSchema> {\n return ConfirmDialogPropsSchema.parse(raw);\n}\n","\"use client\";\n\n// i18nKeys: ConfirmDialog.button.confirm, ConfirmDialog.button.cancel, ConfirmDialog.aria.dialog\n\nimport { type KeyboardEvent, type MouseEvent, useEffect, useId, useRef } from \"react\";\nimport { type ConfirmDialogProps, validateConfirmDialogProps } from \"./ConfirmDialog.schema\";\n\nfunction ConfirmDialogInner({\n title,\n message,\n confirmLabel,\n cancelLabel,\n variant,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const titleId = useId();\n const messageId = useId();\n\n useEffect(() => {\n const dialog = dialogRef.current;\n /* v8 ignore next 2 */\n if (!dialog) return;\n dialog.showModal();\n return () => {\n if (dialog.open) dialog.close();\n };\n }, []);\n\n function handleKeyDown(e: KeyboardEvent<HTMLDialogElement>) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n }\n }\n\n function handleBackdropClick(e: MouseEvent<HTMLDialogElement>) {\n if (e.target === dialogRef.current) {\n onCancel();\n }\n }\n\n const confirmClassName =\n variant === \"danger\"\n ? \"bg-red-600 text-white hover:bg-red-700 focus-visible:outline-red-600 px-4 py-2 rounded-md text-sm font-medium transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n : \"bg-gray-900 text-white hover:bg-gray-700 focus-visible:outline-gray-900 px-4 py-2 rounded-md text-sm font-medium transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\";\n\n return (\n <dialog\n ref={dialogRef}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={messageId}\n onKeyDown={handleKeyDown}\n onClick={handleBackdropClick}\n className=\"rounded-lg shadow-xl p-0 backdrop:bg-black/40 w-full max-w-md mx-auto\"\n >\n {/* Inner div stops click propagation so backdrop-click only fires on <dialog> itself */}\n <div\n className=\"p-6 flex flex-col gap-4\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <h2 id={titleId} className=\"text-lg font-semibold text-gray-900\">\n {title}\n </h2>\n <p id={messageId} className=\"text-sm text-gray-600\">\n {message}\n </p>\n <div className=\"flex justify-end gap-3 mt-2\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-4 py-2 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400 transition-colors\"\n >\n {cancelLabel}\n </button>\n <button type=\"button\" onClick={onConfirm} className={confirmClassName}>\n {confirmLabel}\n </button>\n </div>\n </div>\n </dialog>\n );\n}\n\nexport function ConfirmDialog(\n raw: Omit<ConfirmDialogProps, \"variant\" | \"locale\"> &\n Partial<Pick<ConfirmDialogProps, \"variant\" | \"locale\">>,\n) {\n try {\n const parsed = validateConfirmDialogProps(raw);\n return <ConfirmDialogInner {...parsed} onConfirm={raw.onConfirm} onCancel={raw.onCancel} />;\n } catch (err) {\n console.error(\"[ConfirmDialog] Invalid props — component will not render.\", err);\n return null;\n }\n}\n"]}
|
package/dist/preact/display.d.ts
CHANGED
|
@@ -1,2 +1,241 @@
|
|
|
1
|
+
import * as preact from 'preact';
|
|
2
|
+
import { ComponentChildren, h } from 'preact';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
5
|
+
import { ReactNode } from 'react';
|
|
1
6
|
|
|
2
|
-
|
|
7
|
+
/**
|
|
8
|
+
* EmptyState component props schema.
|
|
9
|
+
*
|
|
10
|
+
* Empty-set illustration + title + description + optional CTA.
|
|
11
|
+
* Consumer-driven i18n: caller passes already-localized strings.
|
|
12
|
+
*
|
|
13
|
+
* icon — optional ReactNode / PreactNode passed by the caller
|
|
14
|
+
* title — required heading (h2, consumer-driven i18n)
|
|
15
|
+
* description — optional supporting text
|
|
16
|
+
* action — optional CTA: { label, onClick, variant? }
|
|
17
|
+
*/
|
|
18
|
+
declare const EmptyStatePropsSchema: z.ZodObject<{
|
|
19
|
+
title: z.ZodString;
|
|
20
|
+
description: z.ZodOptional<z.ZodString>;
|
|
21
|
+
action: z.ZodOptional<z.ZodObject<{
|
|
22
|
+
label: z.ZodString;
|
|
23
|
+
variant: z.ZodDefault<z.ZodEnum<["primary", "secondary"]>>;
|
|
24
|
+
}, "strip", z.ZodTypeAny, {
|
|
25
|
+
label: string;
|
|
26
|
+
variant: "primary" | "secondary";
|
|
27
|
+
}, {
|
|
28
|
+
label: string;
|
|
29
|
+
variant?: "primary" | "secondary" | undefined;
|
|
30
|
+
}>>;
|
|
31
|
+
locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
|
|
32
|
+
}, "strip", z.ZodTypeAny, {
|
|
33
|
+
title: string;
|
|
34
|
+
locale: "en" | "fr";
|
|
35
|
+
description?: string | undefined;
|
|
36
|
+
action?: {
|
|
37
|
+
label: string;
|
|
38
|
+
variant: "primary" | "secondary";
|
|
39
|
+
} | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
title: string;
|
|
42
|
+
description?: string | undefined;
|
|
43
|
+
action?: {
|
|
44
|
+
label: string;
|
|
45
|
+
variant?: "primary" | "secondary" | undefined;
|
|
46
|
+
} | undefined;
|
|
47
|
+
locale?: "en" | "fr" | undefined;
|
|
48
|
+
}>;
|
|
49
|
+
type EmptyStatePropsSchemaOutput = z.output<typeof EmptyStatePropsSchema>;
|
|
50
|
+
/**
|
|
51
|
+
* Full EmptyState props including framework-specific node types and callback.
|
|
52
|
+
* `icon` and `action.onClick` are excluded from Zod (functions/nodes are not serializable).
|
|
53
|
+
*
|
|
54
|
+
* Note: action.variant is optional for callers — Zod applies "primary" default at parse time.
|
|
55
|
+
*/
|
|
56
|
+
type EmptyStateProps = Omit<EmptyStatePropsSchemaOutput, "action"> & {
|
|
57
|
+
icon?: any;
|
|
58
|
+
action?: {
|
|
59
|
+
label: string;
|
|
60
|
+
variant?: "primary" | "secondary";
|
|
61
|
+
onClick: () => void;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
declare function validateEmptyStateProps(raw: unknown): EmptyStatePropsSchemaOutput;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* EmptyState — cross-runtime empty-set display primitive (Preact 10 implementation).
|
|
68
|
+
*
|
|
69
|
+
* Accepts `Record<string, unknown>` for MCP postMessage injection safety.
|
|
70
|
+
* Zod validation narrows before render. Invalid props → accessible error span.
|
|
71
|
+
*
|
|
72
|
+
* WCAG-AA:
|
|
73
|
+
* - <section aria-label={title}> → role="region" landmark (no Biome lint, correct semantics)
|
|
74
|
+
* - heading hierarchy: h2 (title) — caller manages the h1 context
|
|
75
|
+
* - action button is keyboard-accessible (tab + enter/space)
|
|
76
|
+
*/
|
|
77
|
+
declare function EmptyState(raw: Omit<EmptyStateProps, "locale"> & Partial<Pick<EmptyStateProps, "locale">> & {
|
|
78
|
+
icon?: ComponentChildren;
|
|
79
|
+
}): preact.JSX.Element;
|
|
80
|
+
|
|
81
|
+
/** @jsxRuntime classic */
|
|
82
|
+
/** @jsx h */
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Skeleton — cross-runtime loading placeholder (Preact 10 implementation).
|
|
86
|
+
*
|
|
87
|
+
* Structurally identical to the React runtime; JSX differences:
|
|
88
|
+
* - `class` instead of `className`
|
|
89
|
+
* - Preact h/Fragment imports
|
|
90
|
+
* - No "use client" directive (Preact runs in extension context)
|
|
91
|
+
*
|
|
92
|
+
* WCAG-AA: role="status" + aria-busy="true" + aria-label via t()
|
|
93
|
+
*/
|
|
94
|
+
declare function Skeleton(raw: Record<string, unknown>): h.JSX.Element;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Skeleton component props schema.
|
|
98
|
+
*
|
|
99
|
+
* variant — shape of the placeholder:
|
|
100
|
+
* "rect" → rectangular block (default)
|
|
101
|
+
* "circle" → circular avatar / icon placeholder
|
|
102
|
+
* "text" → single or multi-line text placeholder
|
|
103
|
+
*
|
|
104
|
+
* width / height — CSS values (string) or pixels (number).
|
|
105
|
+
* "rect" defaults: width="100%", height=100
|
|
106
|
+
* "circle" defaults: width=height (equal, square rendered as circle)
|
|
107
|
+
* "text" defaults: width="100%", height=16
|
|
108
|
+
*
|
|
109
|
+
* count — number of text line spans (only meaningful for variant="text").
|
|
110
|
+
* Default 1. Ignored for rect/circle.
|
|
111
|
+
*
|
|
112
|
+
* animation — shimmer style:
|
|
113
|
+
* "pulse" → opacity pulse (default)
|
|
114
|
+
* "wave" → left-to-right gradient sweep
|
|
115
|
+
* "none" → static placeholder (auto-selected when prefers-reduced-motion)
|
|
116
|
+
*/
|
|
117
|
+
declare const SkeletonPropsSchema: z.ZodObject<{
|
|
118
|
+
variant: z.ZodDefault<z.ZodEnum<["rect", "circle", "text"]>>;
|
|
119
|
+
width: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
|
|
120
|
+
height: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
|
|
121
|
+
count: z.ZodDefault<z.ZodNumber>;
|
|
122
|
+
animation: z.ZodDefault<z.ZodEnum<["pulse", "wave", "none"]>>;
|
|
123
|
+
locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
|
|
124
|
+
}, "strip", z.ZodTypeAny, {
|
|
125
|
+
variant: "circle" | "rect" | "text";
|
|
126
|
+
locale: "en" | "fr";
|
|
127
|
+
count: number;
|
|
128
|
+
animation: "none" | "pulse" | "wave";
|
|
129
|
+
width?: string | number | undefined;
|
|
130
|
+
height?: string | number | undefined;
|
|
131
|
+
}, {
|
|
132
|
+
variant?: "circle" | "rect" | "text" | undefined;
|
|
133
|
+
locale?: "en" | "fr" | undefined;
|
|
134
|
+
width?: string | number | undefined;
|
|
135
|
+
height?: string | number | undefined;
|
|
136
|
+
count?: number | undefined;
|
|
137
|
+
animation?: "none" | "pulse" | "wave" | undefined;
|
|
138
|
+
}>;
|
|
139
|
+
type SkeletonProps = z.infer<typeof SkeletonPropsSchema>;
|
|
140
|
+
declare function validateSkeletonProps(raw: unknown): SkeletonProps;
|
|
141
|
+
/**
|
|
142
|
+
* Resolve final width/height CSS values given the variant and raw props.
|
|
143
|
+
* Centralised here so React + Preact runtimes share identical defaults.
|
|
144
|
+
*/
|
|
145
|
+
declare function resolveSkeletonDimensions(variant: SkeletonProps["variant"], width: SkeletonProps["width"], height: SkeletonProps["height"]): {
|
|
146
|
+
widthCss: string;
|
|
147
|
+
heightCss: string;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* VirtualList Zod props schema.
|
|
152
|
+
*
|
|
153
|
+
* Runtime functions (renderItem, estimateSize, onRowClick) are excluded from
|
|
154
|
+
* Zod per §18.5 (runtime functions not serialisable). They are typed separately
|
|
155
|
+
* in VirtualListProps<T> below.
|
|
156
|
+
*
|
|
157
|
+
* Serialisable fields validated at render time for safe MCP postMessage injection.
|
|
158
|
+
*/
|
|
159
|
+
declare const VirtualListPropsSchema: z.ZodObject<{
|
|
160
|
+
/** Array of items to render — required, can be empty */
|
|
161
|
+
items: z.ZodArray<z.ZodUnknown, "many">;
|
|
162
|
+
/** Fixed row height in px — mutually exclusive with estimateSize */
|
|
163
|
+
itemHeight: z.ZodOptional<z.ZodNumber>;
|
|
164
|
+
/** Variable row height estimator — mutually exclusive with itemHeight */
|
|
165
|
+
estimateSize: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodNumber], z.ZodUnknown>, z.ZodNumber>>;
|
|
166
|
+
/** Row renderer — required (runtime function, excluded from strict Zod parse but validated for presence) */
|
|
167
|
+
renderItem: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodUnknown, z.ZodNumber], z.ZodUnknown>, z.ZodUnknown>>;
|
|
168
|
+
/** Rows to render outside visible area (default: 5) */
|
|
169
|
+
overscan: z.ZodOptional<z.ZodNumber>;
|
|
170
|
+
/** CSS class applied to the scroll container */
|
|
171
|
+
className: z.ZodOptional<z.ZodString>;
|
|
172
|
+
/** Locale for built-in empty state + error messages */
|
|
173
|
+
locale: z.ZodOptional<z.ZodEnum<["en", "fr"]>>;
|
|
174
|
+
/** a11y: when provided, rows become keyboard-activable (role=button + tabIndex=0 + Enter/Space) */
|
|
175
|
+
onRowClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[z.ZodUnknown, z.ZodNumber], z.ZodUnknown>, z.ZodVoid>>;
|
|
176
|
+
}, "strip", z.ZodTypeAny, {
|
|
177
|
+
items: unknown[];
|
|
178
|
+
locale?: "en" | "fr" | undefined;
|
|
179
|
+
itemHeight?: number | undefined;
|
|
180
|
+
estimateSize?: ((args_0: number, ...args: unknown[]) => number) | undefined;
|
|
181
|
+
renderItem?: ((args_0: unknown, args_1: number, ...args: unknown[]) => unknown) | undefined;
|
|
182
|
+
overscan?: number | undefined;
|
|
183
|
+
className?: string | undefined;
|
|
184
|
+
onRowClick?: ((args_0: unknown, args_1: number, ...args: unknown[]) => void) | undefined;
|
|
185
|
+
}, {
|
|
186
|
+
items: unknown[];
|
|
187
|
+
locale?: "en" | "fr" | undefined;
|
|
188
|
+
itemHeight?: number | undefined;
|
|
189
|
+
estimateSize?: ((args_0: number, ...args: unknown[]) => number) | undefined;
|
|
190
|
+
renderItem?: ((args_0: unknown, args_1: number, ...args: unknown[]) => unknown) | undefined;
|
|
191
|
+
overscan?: number | undefined;
|
|
192
|
+
className?: string | undefined;
|
|
193
|
+
onRowClick?: ((args_0: unknown, args_1: number, ...args: unknown[]) => void) | undefined;
|
|
194
|
+
}>;
|
|
195
|
+
type VirtualListPropsSchemaOutput = z.output<typeof VirtualListPropsSchema>;
|
|
196
|
+
/**
|
|
197
|
+
* Full typed VirtualList props for JSX consumers.
|
|
198
|
+
* Generic over item type T.
|
|
199
|
+
*/
|
|
200
|
+
type VirtualListProps<T = unknown> = {
|
|
201
|
+
/** Array of items to render */
|
|
202
|
+
items: T[];
|
|
203
|
+
/** Fixed row height in px — use when all rows are the same height */
|
|
204
|
+
itemHeight?: number;
|
|
205
|
+
/** Variable height estimator — use when rows have different heights */
|
|
206
|
+
estimateSize?: (index: number) => number;
|
|
207
|
+
/** Required: renders one item */
|
|
208
|
+
renderItem: (item: T, index: number) => ReactNode;
|
|
209
|
+
/** Called when a row is clicked/activated — triggers a11y role=button + keyboard */
|
|
210
|
+
onRowClick?: (item: T, index: number) => void;
|
|
211
|
+
/** Rows rendered outside viewport (default: 5) */
|
|
212
|
+
overscan?: number;
|
|
213
|
+
/** CSS class applied to the scroll container */
|
|
214
|
+
className?: string;
|
|
215
|
+
/** Locale for built-in strings (default: "en") */
|
|
216
|
+
locale?: "en" | "fr";
|
|
217
|
+
};
|
|
218
|
+
/** Validates serialisable portion of VirtualList props — throws on failure */
|
|
219
|
+
declare function validateVirtualListProps(raw: unknown): VirtualListPropsSchemaOutput;
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* VirtualList — generic virtualized list component.
|
|
223
|
+
*
|
|
224
|
+
* Cross-runtime: same file used by React 19 and Preact 10 (via preact/compat alias in tsup).
|
|
225
|
+
* Virtualization: @tanstack/react-virtual v3 (already in mosaic deps via TableView).
|
|
226
|
+
* a11y: WCAG-AA — when onRowClick provided, rows get role=button + tabIndex=0 + Enter/Space.
|
|
227
|
+
* Zod-validated serialisable props; renders role="alert" fallback on failure.
|
|
228
|
+
*
|
|
229
|
+
* API:
|
|
230
|
+
* items: T[] — generic item array
|
|
231
|
+
* itemHeight?: number — fixed px height (mutually exclusive with estimateSize)
|
|
232
|
+
* estimateSize?: (index) => number — variable height estimator
|
|
233
|
+
* renderItem: (item, index) => ReactNode — required row renderer
|
|
234
|
+
* onRowClick?: (item, index) => void — a11y click handler
|
|
235
|
+
* overscan?: number — rows outside viewport (default: 5)
|
|
236
|
+
* className?: string — scroll container class
|
|
237
|
+
* locale?: "en" | "fr" — built-in string locale
|
|
238
|
+
*/
|
|
239
|
+
declare function VirtualList<T = unknown>(props: VirtualListProps<T>): react_jsx_runtime.JSX.Element;
|
|
240
|
+
|
|
241
|
+
export { EmptyState, type EmptyStateProps, EmptyStatePropsSchema, Skeleton, type SkeletonProps, SkeletonPropsSchema, VirtualList, type VirtualListProps, VirtualListPropsSchema, resolveSkeletonDimensions, validateEmptyStateProps, validateSkeletonProps, validateVirtualListProps };
|