@vantageos/mosaic 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/artifacts.cjs +113 -0
  2. package/dist/artifacts.cjs.map +1 -0
  3. package/dist/artifacts.d.cts +29 -0
  4. package/dist/artifacts.d.ts +29 -0
  5. package/dist/artifacts.js +105 -0
  6. package/dist/artifacts.js.map +1 -0
  7. package/dist/confirmation.cjs +180 -0
  8. package/dist/confirmation.cjs.map +1 -0
  9. package/dist/confirmation.d.cts +33 -0
  10. package/dist/confirmation.d.ts +33 -0
  11. package/dist/confirmation.js +176 -0
  12. package/dist/confirmation.js.map +1 -0
  13. package/dist/display.cjs +273 -0
  14. package/dist/display.cjs.map +1 -0
  15. package/dist/display.d.cts +94 -0
  16. package/dist/display.d.ts +94 -0
  17. package/dist/display.js +268 -0
  18. package/dist/display.js.map +1 -0
  19. package/dist/index.cjs +40 -2
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +12 -232
  22. package/dist/index.d.ts +12 -232
  23. package/dist/index.js +40 -3
  24. package/dist/index.js.map +1 -1
  25. package/dist/input.cjs +102 -0
  26. package/dist/input.cjs.map +1 -0
  27. package/dist/input.d.cts +34 -0
  28. package/dist/input.d.ts +34 -0
  29. package/dist/input.js +98 -0
  30. package/dist/input.js.map +1 -0
  31. package/dist/media.cjs +98 -0
  32. package/dist/media.cjs.map +1 -0
  33. package/dist/media.d.cts +29 -0
  34. package/dist/media.d.ts +29 -0
  35. package/dist/media.js +94 -0
  36. package/dist/media.js.map +1 -0
  37. package/dist/progress.cjs +125 -0
  38. package/dist/progress.cjs.map +1 -0
  39. package/dist/progress.d.cts +29 -0
  40. package/dist/progress.d.ts +29 -0
  41. package/dist/progress.js +121 -0
  42. package/dist/progress.js.map +1 -0
  43. package/dist/server.cjs +121 -0
  44. package/dist/server.cjs.map +1 -0
  45. package/dist/server.d.cts +33 -0
  46. package/dist/server.d.ts +33 -0
  47. package/dist/server.js +116 -0
  48. package/dist/server.js.map +1 -0
  49. package/package.json +48 -7
@@ -0,0 +1,125 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ // src/i18n/strings.ts
7
+ var EN = {
8
+ "ProgressBar.aria.label": "Progress",
9
+ "ProgressBar.error.invalidProps": "ProgressBar: invalid props",
10
+ "ConfirmDialog.button.confirm": "Confirm",
11
+ "ConfirmDialog.button.cancel": "Cancel",
12
+ "ConfirmDialog.aria.dialog": "Confirmation dialog",
13
+ "TableView.aria.table": "Data table",
14
+ "TableView.pagination.next": "Next page",
15
+ "TableView.pagination.prev": "Previous page",
16
+ "TableView.empty.message": "No data to display",
17
+ "TableView.error.invalidProps": "TableView: invalid props",
18
+ "MarkdownRenderer.aria.content": "Rendered Markdown content",
19
+ "MarkdownRenderer.error.invalidProps": "MarkdownRenderer: invalid props",
20
+ "MarkdownRenderer.error.tooLong": "Content exceeds maximum length",
21
+ "TokenDisplayOnceModal.button.copy": "Copy token",
22
+ "TokenDisplayOnceModal.button.close": "Close",
23
+ "TokenDisplayOnceModal.warning.once": "This token will only be shown once. Copy it now.",
24
+ "TokenDisplayOnceModal.copied": "Copied",
25
+ "StatusBadge.aria.status": "Status",
26
+ "StatusBadge.error.invalidProps": "StatusBadge: invalid props"
27
+ };
28
+ var FR = {
29
+ "ProgressBar.aria.label": "Progression",
30
+ "ProgressBar.error.invalidProps": "ProgressBar : propri\xE9t\xE9s invalides",
31
+ "ConfirmDialog.button.confirm": "Confirmer",
32
+ "ConfirmDialog.button.cancel": "Annuler",
33
+ "ConfirmDialog.aria.dialog": "Bo\xEEte de dialogue de confirmation",
34
+ "TableView.aria.table": "Tableau de donn\xE9es",
35
+ "TableView.pagination.next": "Page suivante",
36
+ "TableView.pagination.prev": "Page pr\xE9c\xE9dente",
37
+ "TableView.empty.message": "Aucune donn\xE9e \xE0 afficher",
38
+ "TableView.error.invalidProps": "TableView : propri\xE9t\xE9s invalides",
39
+ "MarkdownRenderer.aria.content": "Contenu Markdown rendu",
40
+ "MarkdownRenderer.error.invalidProps": "MarkdownRenderer : propri\xE9t\xE9s invalides",
41
+ "MarkdownRenderer.error.tooLong": "Le contenu d\xE9passe la longueur maximale",
42
+ "TokenDisplayOnceModal.button.copy": "Copier le jeton",
43
+ "TokenDisplayOnceModal.button.close": "Fermer",
44
+ "TokenDisplayOnceModal.warning.once": "Ce jeton ne sera affich\xE9 qu'une seule fois. Copiez-le maintenant.",
45
+ "TokenDisplayOnceModal.copied": "Copi\xE9",
46
+ "StatusBadge.aria.status": "Statut",
47
+ "StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides"
48
+ };
49
+ var TABLE = {
50
+ en: EN,
51
+ fr: FR
52
+ };
53
+ function t(key, locale = "en") {
54
+ return TABLE[locale]?.[key] ?? TABLE.en[key];
55
+ }
56
+ var ProgressBarPropsSchema = zod.z.object({
57
+ value: zod.z.number().min(0).max(100),
58
+ label: zod.z.string().min(1),
59
+ locale: zod.z.enum(["en", "fr"]).default("en"),
60
+ colorVariant: zod.z.enum(["default", "warning", "danger"]).default("default")
61
+ });
62
+ function validateProps(raw) {
63
+ return ProgressBarPropsSchema.parse(raw);
64
+ }
65
+ function pickLocale(raw) {
66
+ return raw.locale === "fr" ? "fr" : "en";
67
+ }
68
+ var colorVariantClasses = {
69
+ default: "bg-blue-600",
70
+ warning: "bg-amber-500",
71
+ danger: "bg-red-600"
72
+ };
73
+ var containerVariantClasses = {
74
+ default: "progressbar-default",
75
+ warning: "progressbar-warning",
76
+ danger: "progressbar-danger"
77
+ };
78
+ function ProgressBarInner(props) {
79
+ const { value, label, colorVariant } = props;
80
+ const fillClass = colorVariantClasses[colorVariant];
81
+ const containerClass = containerVariantClasses[colorVariant];
82
+ return /* @__PURE__ */ jsxRuntime.jsxs(
83
+ "div",
84
+ {
85
+ role: "progressbar",
86
+ "aria-valuenow": value,
87
+ "aria-valuemin": 0,
88
+ "aria-valuemax": 100,
89
+ "aria-label": label,
90
+ tabIndex: 0,
91
+ className: `mosaic-progress ${containerClass}`,
92
+ style: { width: "100%" },
93
+ children: [
94
+ /* @__PURE__ */ jsxRuntime.jsx(
95
+ "div",
96
+ {
97
+ "data-testid": "progress-fill",
98
+ className: `mosaic-progress-fill ${fillClass}`,
99
+ style: { width: `${value}%` }
100
+ }
101
+ ),
102
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mosaic-progress-label", children: [
103
+ label,
104
+ ": ",
105
+ value,
106
+ "%"
107
+ ] })
108
+ ]
109
+ }
110
+ );
111
+ }
112
+ function ProgressBar(raw) {
113
+ try {
114
+ const props = validateProps(raw);
115
+ return /* @__PURE__ */ jsxRuntime.jsx(ProgressBarInner, { ...props });
116
+ } catch {
117
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "alert", className: "mosaic-progress-error", children: t("ProgressBar.error.invalidProps", pickLocale(raw)) });
118
+ }
119
+ }
120
+
121
+ exports.ProgressBar = ProgressBar;
122
+ exports.ProgressBarPropsSchema = ProgressBarPropsSchema;
123
+ exports.validateProps = validateProps;
124
+ //# sourceMappingURL=progress.cjs.map
125
+ //# sourceMappingURL=progress.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/strings.ts","../src/components/progress/ProgressBar.schema.ts","../src/components/progress/ProgressBar.tsx"],"names":["z","jsxs","jsx"],"mappings":";;;;;;AAaA,IAAM,EAAA,GAAK;AAAA,EACT,wBAAA,EAA0B,UAAA;AAAA,EAC1B,gCAAA,EAAkC,4BAAA;AAAA,EAClC,8BAAA,EAAgC,SAAA;AAAA,EAChC,6BAAA,EAA+B,QAAA;AAAA,EAC/B,2BAAA,EAA6B,qBAAA;AAAA,EAC7B,sBAAA,EAAwB,YAAA;AAAA,EACxB,2BAAA,EAA6B,WAAA;AAAA,EAC7B,2BAAA,EAA6B,eAAA;AAAA,EAC7B,yBAAA,EAA2B,oBAAA;AAAA,EAC3B,8BAAA,EAAgC,0BAAA;AAAA,EAChC,+BAAA,EAAiC,2BAAA;AAAA,EACjC,qCAAA,EAAuC,iCAAA;AAAA,EACvC,gCAAA,EAAkC,gCAAA;AAAA,EAClC,mCAAA,EAAqC,YAAA;AAAA,EACrC,oCAAA,EAAsC,OAAA;AAAA,EACtC,oCAAA,EAAsC,kDAAA;AAAA,EACtC,8BAAA,EAAgC,QAAA;AAAA,EAChC,yBAAA,EAA2B,QAAA;AAAA,EAC3B,gCAAA,EAAkC;AACpC,CAAA;AAEA,IAAM,EAAA,GAAsC;AAAA,EAC1C,wBAAA,EAA0B,aAAA;AAAA,EAC1B,gCAAA,EAAkC,0CAAA;AAAA,EAClC,8BAAA,EAAgC,WAAA;AAAA,EAChC,6BAAA,EAA+B,SAAA;AAAA,EAC/B,2BAAA,EAA6B,sCAAA;AAAA,EAC7B,sBAAA,EAAwB,uBAAA;AAAA,EACxB,2BAAA,EAA6B,eAAA;AAAA,EAC7B,2BAAA,EAA6B,uBAAA;AAAA,EAC7B,yBAAA,EAA2B,gCAAA;AAAA,EAC3B,8BAAA,EAAgC,wCAAA;AAAA,EAChC,+BAAA,EAAiC,wBAAA;AAAA,EACjC,qCAAA,EAAuC,+CAAA;AAAA,EACvC,gCAAA,EAAkC,4CAAA;AAAA,EAClC,mCAAA,EAAqC,iBAAA;AAAA,EACrC,oCAAA,EAAsC,QAAA;AAAA,EACtC,oCAAA,EACE,sEAAA;AAAA,EACF,8BAAA,EAAgC,UAAA;AAAA,EAChC,yBAAA,EAA2B,QAAA;AAAA,EAC3B,gCAAA,EAAkC;AACpC,CAAA;AAIA,IAAM,KAAA,GAA6D;AAAA,EACjE,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAGO,SAAS,CAAA,CAAE,GAAA,EAAoB,MAAA,GAAuB,IAAA,EAAc;AACzE,EAAA,OAAO,MAAM,MAAM,CAAA,GAAI,GAAG,CAAA,IAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AAC7C;AClEO,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EAC7C,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EAChC,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,MAAM,IAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACzC,YAAA,EAAcA,KAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,WAAW,QAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS;AAC1E,CAAC;AAIM,SAAS,cAAc,GAAA,EAAgC;AAC5D,EAAA,OAAO,sBAAA,CAAuB,MAAM,GAAG,CAAA;AACzC;ACTA,SAAS,WAAW,GAAA,EAA4C;AAC9D,EAAA,OAAO,GAAA,CAAI,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AACtC;AAEA,IAAM,mBAAA,GAAwE;AAAA,EAC5E,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,uBAAA,GAA4E;AAAA,EAChF,OAAA,EAAS,qBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,SAAS,iBAAiB,KAAA,EAAyB;AACjD,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,YAAA,EAAa,GAAI,KAAA;AACvC,EAAA,MAAM,SAAA,GAAY,oBAAoB,YAAY,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,wBAAwB,YAAY,CAAA;AAE3D,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAe,KAAA;AAAA,MACf,eAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAe,GAAA;AAAA,MACf,YAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAW,mBAAmB,cAAc,CAAA,CAAA;AAAA,MAC5C,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MAEvB,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,eAAA;AAAA,YACZ,SAAA,EAAW,wBAAwB,SAAS,CAAA,CAAA;AAAA,YAC5C,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA;AAAI;AAAA,SAC9B;AAAA,wBACAD,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAM,IAAA;AAAA,UAAG,KAAA;AAAA,UAAM;AAAA,SAAA,EAClB;AAAA;AAAA;AAAA,GACF;AAEJ;AAMO,SAAS,YAAY,GAAA,EAA8B;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,IAAA,uBAAOC,cAAA,CAAC,gBAAA,EAAA,EAAkB,GAAG,KAAA,EAAO,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,uBACEA,cAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,uBAAA,EACzB,QAAA,EAAA,CAAA,CAAE,gCAAA,EAAkC,UAAA,CAAW,GAAG,CAAC,CAAA,EACtD,CAAA;AAAA,EAEJ;AACF","file":"progress.cjs","sourcesContent":["/**\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} 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};\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","import { z } from \"zod\";\n\nexport const ProgressBarPropsSchema = z.object({\n value: z.number().min(0).max(100),\n label: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n colorVariant: z.enum([\"default\", \"warning\", \"danger\"]).default(\"default\"),\n});\n\nexport type ProgressBarProps = z.infer<typeof ProgressBarPropsSchema>;\n\nexport function validateProps(raw: unknown): ProgressBarProps {\n return ProgressBarPropsSchema.parse(raw);\n}\n","import React from \"react\";\nimport { type MosaicLocale, t } from \"../../i18n/strings.js\";\nimport { type ProgressBarProps, validateProps } from \"./ProgressBar.schema.js\";\n\nfunction pickLocale(raw: Record<string, unknown>): MosaicLocale {\n return raw.locale === \"fr\" ? \"fr\" : \"en\";\n}\n\nconst colorVariantClasses: Record<ProgressBarProps[\"colorVariant\"], string> = {\n default: \"bg-blue-600\",\n warning: \"bg-amber-500\",\n danger: \"bg-red-600\",\n};\n\nconst containerVariantClasses: Record<ProgressBarProps[\"colorVariant\"], string> = {\n default: \"progressbar-default\",\n warning: \"progressbar-warning\",\n danger: \"progressbar-danger\",\n};\n\nfunction ProgressBarInner(props: ProgressBarProps) {\n const { value, label, colorVariant } = props;\n const fillClass = colorVariantClasses[colorVariant];\n const containerClass = containerVariantClasses[colorVariant];\n\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label}\n tabIndex={0}\n className={`mosaic-progress ${containerClass}`}\n style={{ width: \"100%\" }}\n >\n <div\n data-testid=\"progress-fill\"\n className={`mosaic-progress-fill ${fillClass}`}\n style={{ width: `${value}%` }}\n />\n <span className=\"mosaic-progress-label\">\n {label}: {value}%\n </span>\n </div>\n );\n}\n\n/**\n * ProgressBar accepts any props object for JSX and MCP postMessage injection alike.\n * Internal Zod validation narrows the type — invalid data renders an accessible error fallback.\n */\nexport function ProgressBar(raw: Record<string, unknown>) {\n try {\n const props = validateProps(raw);\n return <ProgressBarInner {...props} />;\n } catch {\n return (\n <div role=\"alert\" className=\"mosaic-progress-error\">\n {t(\"ProgressBar.error.invalidProps\", pickLocale(raw))}\n </div>\n );\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { z } from 'zod';
3
+
4
+ /**
5
+ * ProgressBar accepts any props object for JSX and MCP postMessage injection alike.
6
+ * Internal Zod validation narrows the type — invalid data renders an accessible error fallback.
7
+ */
8
+ declare function ProgressBar(raw: Record<string, unknown>): react_jsx_runtime.JSX.Element;
9
+
10
+ declare const ProgressBarPropsSchema: z.ZodObject<{
11
+ value: z.ZodNumber;
12
+ label: z.ZodString;
13
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
14
+ colorVariant: z.ZodDefault<z.ZodEnum<["default", "warning", "danger"]>>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ value: number;
17
+ label: string;
18
+ locale: "en" | "fr";
19
+ colorVariant: "default" | "warning" | "danger";
20
+ }, {
21
+ value: number;
22
+ label: string;
23
+ locale?: "en" | "fr" | undefined;
24
+ colorVariant?: "default" | "warning" | "danger" | undefined;
25
+ }>;
26
+ type ProgressBarProps = z.infer<typeof ProgressBarPropsSchema>;
27
+ declare function validateProps(raw: unknown): ProgressBarProps;
28
+
29
+ export { ProgressBar, type ProgressBarProps, ProgressBarPropsSchema, validateProps };
@@ -0,0 +1,29 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { z } from 'zod';
3
+
4
+ /**
5
+ * ProgressBar accepts any props object for JSX and MCP postMessage injection alike.
6
+ * Internal Zod validation narrows the type — invalid data renders an accessible error fallback.
7
+ */
8
+ declare function ProgressBar(raw: Record<string, unknown>): react_jsx_runtime.JSX.Element;
9
+
10
+ declare const ProgressBarPropsSchema: z.ZodObject<{
11
+ value: z.ZodNumber;
12
+ label: z.ZodString;
13
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
14
+ colorVariant: z.ZodDefault<z.ZodEnum<["default", "warning", "danger"]>>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ value: number;
17
+ label: string;
18
+ locale: "en" | "fr";
19
+ colorVariant: "default" | "warning" | "danger";
20
+ }, {
21
+ value: number;
22
+ label: string;
23
+ locale?: "en" | "fr" | undefined;
24
+ colorVariant?: "default" | "warning" | "danger" | undefined;
25
+ }>;
26
+ type ProgressBarProps = z.infer<typeof ProgressBarPropsSchema>;
27
+ declare function validateProps(raw: unknown): ProgressBarProps;
28
+
29
+ export { ProgressBar, type ProgressBarProps, ProgressBarPropsSchema, validateProps };
@@ -0,0 +1,121 @@
1
+ import { z } from 'zod';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+
4
+ // src/i18n/strings.ts
5
+ var EN = {
6
+ "ProgressBar.aria.label": "Progress",
7
+ "ProgressBar.error.invalidProps": "ProgressBar: invalid props",
8
+ "ConfirmDialog.button.confirm": "Confirm",
9
+ "ConfirmDialog.button.cancel": "Cancel",
10
+ "ConfirmDialog.aria.dialog": "Confirmation dialog",
11
+ "TableView.aria.table": "Data table",
12
+ "TableView.pagination.next": "Next page",
13
+ "TableView.pagination.prev": "Previous page",
14
+ "TableView.empty.message": "No data to display",
15
+ "TableView.error.invalidProps": "TableView: invalid props",
16
+ "MarkdownRenderer.aria.content": "Rendered Markdown content",
17
+ "MarkdownRenderer.error.invalidProps": "MarkdownRenderer: invalid props",
18
+ "MarkdownRenderer.error.tooLong": "Content exceeds maximum length",
19
+ "TokenDisplayOnceModal.button.copy": "Copy token",
20
+ "TokenDisplayOnceModal.button.close": "Close",
21
+ "TokenDisplayOnceModal.warning.once": "This token will only be shown once. Copy it now.",
22
+ "TokenDisplayOnceModal.copied": "Copied",
23
+ "StatusBadge.aria.status": "Status",
24
+ "StatusBadge.error.invalidProps": "StatusBadge: invalid props"
25
+ };
26
+ var FR = {
27
+ "ProgressBar.aria.label": "Progression",
28
+ "ProgressBar.error.invalidProps": "ProgressBar : propri\xE9t\xE9s invalides",
29
+ "ConfirmDialog.button.confirm": "Confirmer",
30
+ "ConfirmDialog.button.cancel": "Annuler",
31
+ "ConfirmDialog.aria.dialog": "Bo\xEEte de dialogue de confirmation",
32
+ "TableView.aria.table": "Tableau de donn\xE9es",
33
+ "TableView.pagination.next": "Page suivante",
34
+ "TableView.pagination.prev": "Page pr\xE9c\xE9dente",
35
+ "TableView.empty.message": "Aucune donn\xE9e \xE0 afficher",
36
+ "TableView.error.invalidProps": "TableView : propri\xE9t\xE9s invalides",
37
+ "MarkdownRenderer.aria.content": "Contenu Markdown rendu",
38
+ "MarkdownRenderer.error.invalidProps": "MarkdownRenderer : propri\xE9t\xE9s invalides",
39
+ "MarkdownRenderer.error.tooLong": "Le contenu d\xE9passe la longueur maximale",
40
+ "TokenDisplayOnceModal.button.copy": "Copier le jeton",
41
+ "TokenDisplayOnceModal.button.close": "Fermer",
42
+ "TokenDisplayOnceModal.warning.once": "Ce jeton ne sera affich\xE9 qu'une seule fois. Copiez-le maintenant.",
43
+ "TokenDisplayOnceModal.copied": "Copi\xE9",
44
+ "StatusBadge.aria.status": "Statut",
45
+ "StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides"
46
+ };
47
+ var TABLE = {
48
+ en: EN,
49
+ fr: FR
50
+ };
51
+ function t(key, locale = "en") {
52
+ return TABLE[locale]?.[key] ?? TABLE.en[key];
53
+ }
54
+ var ProgressBarPropsSchema = z.object({
55
+ value: z.number().min(0).max(100),
56
+ label: z.string().min(1),
57
+ locale: z.enum(["en", "fr"]).default("en"),
58
+ colorVariant: z.enum(["default", "warning", "danger"]).default("default")
59
+ });
60
+ function validateProps(raw) {
61
+ return ProgressBarPropsSchema.parse(raw);
62
+ }
63
+ function pickLocale(raw) {
64
+ return raw.locale === "fr" ? "fr" : "en";
65
+ }
66
+ var colorVariantClasses = {
67
+ default: "bg-blue-600",
68
+ warning: "bg-amber-500",
69
+ danger: "bg-red-600"
70
+ };
71
+ var containerVariantClasses = {
72
+ default: "progressbar-default",
73
+ warning: "progressbar-warning",
74
+ danger: "progressbar-danger"
75
+ };
76
+ function ProgressBarInner(props) {
77
+ const { value, label, colorVariant } = props;
78
+ const fillClass = colorVariantClasses[colorVariant];
79
+ const containerClass = containerVariantClasses[colorVariant];
80
+ return /* @__PURE__ */ jsxs(
81
+ "div",
82
+ {
83
+ role: "progressbar",
84
+ "aria-valuenow": value,
85
+ "aria-valuemin": 0,
86
+ "aria-valuemax": 100,
87
+ "aria-label": label,
88
+ tabIndex: 0,
89
+ className: `mosaic-progress ${containerClass}`,
90
+ style: { width: "100%" },
91
+ children: [
92
+ /* @__PURE__ */ jsx(
93
+ "div",
94
+ {
95
+ "data-testid": "progress-fill",
96
+ className: `mosaic-progress-fill ${fillClass}`,
97
+ style: { width: `${value}%` }
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsxs("span", { className: "mosaic-progress-label", children: [
101
+ label,
102
+ ": ",
103
+ value,
104
+ "%"
105
+ ] })
106
+ ]
107
+ }
108
+ );
109
+ }
110
+ function ProgressBar(raw) {
111
+ try {
112
+ const props = validateProps(raw);
113
+ return /* @__PURE__ */ jsx(ProgressBarInner, { ...props });
114
+ } catch {
115
+ return /* @__PURE__ */ jsx("div", { role: "alert", className: "mosaic-progress-error", children: t("ProgressBar.error.invalidProps", pickLocale(raw)) });
116
+ }
117
+ }
118
+
119
+ export { ProgressBar, ProgressBarPropsSchema, validateProps };
120
+ //# sourceMappingURL=progress.js.map
121
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/strings.ts","../src/components/progress/ProgressBar.schema.ts","../src/components/progress/ProgressBar.tsx"],"names":[],"mappings":";;;;AAaA,IAAM,EAAA,GAAK;AAAA,EACT,wBAAA,EAA0B,UAAA;AAAA,EAC1B,gCAAA,EAAkC,4BAAA;AAAA,EAClC,8BAAA,EAAgC,SAAA;AAAA,EAChC,6BAAA,EAA+B,QAAA;AAAA,EAC/B,2BAAA,EAA6B,qBAAA;AAAA,EAC7B,sBAAA,EAAwB,YAAA;AAAA,EACxB,2BAAA,EAA6B,WAAA;AAAA,EAC7B,2BAAA,EAA6B,eAAA;AAAA,EAC7B,yBAAA,EAA2B,oBAAA;AAAA,EAC3B,8BAAA,EAAgC,0BAAA;AAAA,EAChC,+BAAA,EAAiC,2BAAA;AAAA,EACjC,qCAAA,EAAuC,iCAAA;AAAA,EACvC,gCAAA,EAAkC,gCAAA;AAAA,EAClC,mCAAA,EAAqC,YAAA;AAAA,EACrC,oCAAA,EAAsC,OAAA;AAAA,EACtC,oCAAA,EAAsC,kDAAA;AAAA,EACtC,8BAAA,EAAgC,QAAA;AAAA,EAChC,yBAAA,EAA2B,QAAA;AAAA,EAC3B,gCAAA,EAAkC;AACpC,CAAA;AAEA,IAAM,EAAA,GAAsC;AAAA,EAC1C,wBAAA,EAA0B,aAAA;AAAA,EAC1B,gCAAA,EAAkC,0CAAA;AAAA,EAClC,8BAAA,EAAgC,WAAA;AAAA,EAChC,6BAAA,EAA+B,SAAA;AAAA,EAC/B,2BAAA,EAA6B,sCAAA;AAAA,EAC7B,sBAAA,EAAwB,uBAAA;AAAA,EACxB,2BAAA,EAA6B,eAAA;AAAA,EAC7B,2BAAA,EAA6B,uBAAA;AAAA,EAC7B,yBAAA,EAA2B,gCAAA;AAAA,EAC3B,8BAAA,EAAgC,wCAAA;AAAA,EAChC,+BAAA,EAAiC,wBAAA;AAAA,EACjC,qCAAA,EAAuC,+CAAA;AAAA,EACvC,gCAAA,EAAkC,4CAAA;AAAA,EAClC,mCAAA,EAAqC,iBAAA;AAAA,EACrC,oCAAA,EAAsC,QAAA;AAAA,EACtC,oCAAA,EACE,sEAAA;AAAA,EACF,8BAAA,EAAgC,UAAA;AAAA,EAChC,yBAAA,EAA2B,QAAA;AAAA,EAC3B,gCAAA,EAAkC;AACpC,CAAA;AAIA,IAAM,KAAA,GAA6D;AAAA,EACjE,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAGO,SAAS,CAAA,CAAE,GAAA,EAAoB,MAAA,GAAuB,IAAA,EAAc;AACzE,EAAA,OAAO,MAAM,MAAM,CAAA,GAAI,GAAG,CAAA,IAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AAC7C;AClEO,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC7C,KAAA,EAAO,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EAChC,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,MAAA,EAAQ,EAAE,IAAA,CAAK,CAAC,MAAM,IAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACzC,YAAA,EAAc,CAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,WAAW,QAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS;AAC1E,CAAC;AAIM,SAAS,cAAc,GAAA,EAAgC;AAC5D,EAAA,OAAO,sBAAA,CAAuB,MAAM,GAAG,CAAA;AACzC;ACTA,SAAS,WAAW,GAAA,EAA4C;AAC9D,EAAA,OAAO,GAAA,CAAI,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AACtC;AAEA,IAAM,mBAAA,GAAwE;AAAA,EAC5E,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,uBAAA,GAA4E;AAAA,EAChF,OAAA,EAAS,qBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,SAAS,iBAAiB,KAAA,EAAyB;AACjD,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,YAAA,EAAa,GAAI,KAAA;AACvC,EAAA,MAAM,SAAA,GAAY,oBAAoB,YAAY,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,wBAAwB,YAAY,CAAA;AAE3D,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAe,KAAA;AAAA,MACf,eAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAe,GAAA;AAAA,MACf,YAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAW,mBAAmB,cAAc,CAAA,CAAA;AAAA,MAC5C,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MAEvB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,eAAA;AAAA,YACZ,SAAA,EAAW,wBAAwB,SAAS,CAAA,CAAA;AAAA,YAC5C,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA;AAAI;AAAA,SAC9B;AAAA,wBACA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAM,IAAA;AAAA,UAAG,KAAA;AAAA,UAAM;AAAA,SAAA,EAClB;AAAA;AAAA;AAAA,GACF;AAEJ;AAMO,SAAS,YAAY,GAAA,EAA8B;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,IAAA,uBAAO,GAAA,CAAC,gBAAA,EAAA,EAAkB,GAAG,KAAA,EAAO,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,uBAAA,EACzB,QAAA,EAAA,CAAA,CAAE,gCAAA,EAAkC,UAAA,CAAW,GAAG,CAAC,CAAA,EACtD,CAAA;AAAA,EAEJ;AACF","file":"progress.js","sourcesContent":["/**\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} 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};\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","import { z } from \"zod\";\n\nexport const ProgressBarPropsSchema = z.object({\n value: z.number().min(0).max(100),\n label: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n colorVariant: z.enum([\"default\", \"warning\", \"danger\"]).default(\"default\"),\n});\n\nexport type ProgressBarProps = z.infer<typeof ProgressBarPropsSchema>;\n\nexport function validateProps(raw: unknown): ProgressBarProps {\n return ProgressBarPropsSchema.parse(raw);\n}\n","import React from \"react\";\nimport { type MosaicLocale, t } from \"../../i18n/strings.js\";\nimport { type ProgressBarProps, validateProps } from \"./ProgressBar.schema.js\";\n\nfunction pickLocale(raw: Record<string, unknown>): MosaicLocale {\n return raw.locale === \"fr\" ? \"fr\" : \"en\";\n}\n\nconst colorVariantClasses: Record<ProgressBarProps[\"colorVariant\"], string> = {\n default: \"bg-blue-600\",\n warning: \"bg-amber-500\",\n danger: \"bg-red-600\",\n};\n\nconst containerVariantClasses: Record<ProgressBarProps[\"colorVariant\"], string> = {\n default: \"progressbar-default\",\n warning: \"progressbar-warning\",\n danger: \"progressbar-danger\",\n};\n\nfunction ProgressBarInner(props: ProgressBarProps) {\n const { value, label, colorVariant } = props;\n const fillClass = colorVariantClasses[colorVariant];\n const containerClass = containerVariantClasses[colorVariant];\n\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label}\n tabIndex={0}\n className={`mosaic-progress ${containerClass}`}\n style={{ width: \"100%\" }}\n >\n <div\n data-testid=\"progress-fill\"\n className={`mosaic-progress-fill ${fillClass}`}\n style={{ width: `${value}%` }}\n />\n <span className=\"mosaic-progress-label\">\n {label}: {value}%\n </span>\n </div>\n );\n}\n\n/**\n * ProgressBar accepts any props object for JSX and MCP postMessage injection alike.\n * Internal Zod validation narrows the type — invalid data renders an accessible error fallback.\n */\nexport function ProgressBar(raw: Record<string, unknown>) {\n try {\n const props = validateProps(raw);\n return <ProgressBarInner {...props} />;\n } catch {\n return (\n <div role=\"alert\" className=\"mosaic-progress-error\">\n {t(\"ProgressBar.error.invalidProps\", pickLocale(raw))}\n </div>\n );\n }\n}\n"]}
@@ -0,0 +1,121 @@
1
+ 'use strict';
2
+
3
+ var server = require('@mcp-ui/server');
4
+ var zod = require('zod');
5
+
6
+ // src/server/create-mosaic-resource.ts
7
+ var MarkdownRendererPropsSchema = zod.z.object({
8
+ content: zod.z.string(),
9
+ locale: zod.z.enum(["en", "fr"]),
10
+ maxLength: zod.z.number().positive().default(5e4),
11
+ allowHtml: zod.z.boolean().default(false)
12
+ });
13
+ var TokenDisplayOnceModalPropsSchema = zod.z.object({
14
+ token: zod.z.string().min(1),
15
+ title: zod.z.string().min(1),
16
+ warningMessage: zod.z.string().min(1),
17
+ copyLabel: zod.z.string().min(1),
18
+ closeLabel: zod.z.string().min(1),
19
+ locale: zod.z.enum(["en", "fr"]).default("en")
20
+ });
21
+ var ColumnDefSchema = zod.z.object({
22
+ key: zod.z.string().min(1),
23
+ header: zod.z.string().min(1)
24
+ // render is a runtime function — excluded from Zod, typed separately
25
+ });
26
+ var TableViewPropsSchema = zod.z.object({
27
+ columns: zod.z.array(ColumnDefSchema).min(1, "TableView requires at least one column"),
28
+ virtualizeThreshold: zod.z.number().int().positive().default(100),
29
+ ariaLabel: zod.z.string().min(1),
30
+ locale: zod.z.enum(["en", "fr"]).default("en")
31
+ });
32
+ var ConfirmDialogPropsSchema = zod.z.object({
33
+ title: zod.z.string().min(1),
34
+ message: zod.z.string().min(1),
35
+ confirmLabel: zod.z.string().min(1),
36
+ cancelLabel: zod.z.string().min(1),
37
+ variant: zod.z.enum(["default", "danger"]).default("default"),
38
+ locale: zod.z.enum(["en", "fr"]).default("en")
39
+ });
40
+ var StatusBadgePropsSchema = zod.z.object({
41
+ status: zod.z.string(),
42
+ variant: zod.z.enum(["success", "warning", "danger", "info", "neutral"]).default("neutral"),
43
+ label: zod.z.string().optional(),
44
+ locale: zod.z.enum(["en", "fr"])
45
+ });
46
+ var ProgressBarPropsSchema = zod.z.object({
47
+ value: zod.z.number().min(0).max(100),
48
+ label: zod.z.string().min(1),
49
+ locale: zod.z.enum(["en", "fr"]).default("en"),
50
+ colorVariant: zod.z.enum(["default", "warning", "danger"]).default("default")
51
+ });
52
+
53
+ // src/server/create-mosaic-resource.ts
54
+ var MCP_UI_CAPABILITY_KEY = "io.modelcontextprotocol/ui";
55
+ var MOSAIC_MIME_TYPE = "text/html;profile=mcp-app";
56
+ var SCHEMA_BY_NAME = {
57
+ ProgressBar: ProgressBarPropsSchema,
58
+ ConfirmDialog: ConfirmDialogPropsSchema,
59
+ TableView: TableViewPropsSchema,
60
+ MarkdownRenderer: MarkdownRendererPropsSchema,
61
+ TokenDisplayOnceModal: TokenDisplayOnceModalPropsSchema,
62
+ StatusBadge: StatusBadgePropsSchema
63
+ };
64
+ var COMPONENT_KEYS = Object.keys(SCHEMA_BY_NAME);
65
+ var I18N_TITLE = {
66
+ ProgressBar: { en: "Progress", fr: "Progression" },
67
+ ConfirmDialog: { en: "Confirmation", fr: "Confirmation" },
68
+ TableView: { en: "Data table", fr: "Tableau de donn\xE9es" },
69
+ MarkdownRenderer: { en: "Markdown content", fr: "Contenu Markdown" },
70
+ TokenDisplayOnceModal: { en: "Token (shown once)", fr: "Jeton (affich\xE9 une fois)" },
71
+ StatusBadge: { en: "Status", fr: "Statut" }
72
+ };
73
+ function escapeHtml(s) {
74
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
75
+ }
76
+ function fallbackMarkdown(componentName, locale) {
77
+ const heading = I18N_TITLE[componentName][locale];
78
+ const note = locale === "fr" ? "Rendu Markdown de secours \u2014 composant Mosaic charg\xE9 via MCP UI." : "Markdown fallback \u2014 Mosaic component rendered via MCP UI.";
79
+ return `# ${heading}
80
+
81
+ ${note}
82
+ `;
83
+ }
84
+ function buildHtml(componentName, props, locale) {
85
+ const propsJson = escapeHtml(JSON.stringify(props));
86
+ const title = escapeHtml(I18N_TITLE[componentName][locale]);
87
+ return `<!DOCTYPE html><html lang="${locale}"><head><meta charset="utf-8"><title>${title}</title></head><body><div id="mosaic-root" data-component="${componentName}" data-props='${propsJson}'></div></body></html>`;
88
+ }
89
+ function createMosaicResource(componentName, props, locale = "en") {
90
+ const schema = SCHEMA_BY_NAME[componentName];
91
+ if (!schema) {
92
+ throw new Error(`createMosaicResource: unknown component '${componentName}'`);
93
+ }
94
+ const validated = schema.parse(props);
95
+ const uri = `ui://mosaic/${componentName.toLowerCase()}`;
96
+ const html = buildHtml(componentName, validated, locale);
97
+ const fallback = fallbackMarkdown(componentName, locale);
98
+ const resource = server.createUIResource({
99
+ uri,
100
+ content: { type: "rawHtml", htmlString: html },
101
+ encoding: "text",
102
+ metadata: {
103
+ ui: {
104
+ resourceUri: uri,
105
+ locale,
106
+ componentName,
107
+ fallback
108
+ }
109
+ }
110
+ });
111
+ resource.resource.mimeType = MOSAIC_MIME_TYPE;
112
+ return resource;
113
+ }
114
+ var MOSAIC_SUPPORTED_COMPONENTS = COMPONENT_KEYS;
115
+
116
+ exports.MCP_UI_CAPABILITY_KEY = MCP_UI_CAPABILITY_KEY;
117
+ exports.MOSAIC_MIME_TYPE = MOSAIC_MIME_TYPE;
118
+ exports.MOSAIC_SUPPORTED_COMPONENTS = MOSAIC_SUPPORTED_COMPONENTS;
119
+ exports.createMosaicResource = createMosaicResource;
120
+ //# sourceMappingURL=server.cjs.map
121
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/artifacts/MarkdownRenderer.schema.ts","../src/components/confirmation/TokenDisplayOnceModal.schema.ts","../src/components/display/TableView.schema.ts","../src/components/input/ConfirmDialog.schema.ts","../src/components/media/StatusBadge.schema.ts","../src/components/progress/ProgressBar.schema.ts","../src/server/create-mosaic-resource.ts"],"names":["z","createUIResource"],"mappings":"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","file":"server.cjs","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","import { z } from \"zod\";\n\n// i18nKeys: TokenDisplayOnceModal.button.copy, TokenDisplayOnceModal.button.close,\n// TokenDisplayOnceModal.warning.once, TokenDisplayOnceModal.copied\n\nexport const TokenDisplayOnceModalPropsSchema = z.object({\n token: z.string().min(1),\n title: z.string().min(1),\n warningMessage: z.string().min(1),\n copyLabel: z.string().min(1),\n closeLabel: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type TokenDisplayOnceModalProps = z.infer<typeof TokenDisplayOnceModalPropsSchema> & {\n onClose: () => void;\n};\n\nexport function validateTokenDisplayOnceModalProps(\n raw: unknown,\n): z.infer<typeof TokenDisplayOnceModalPropsSchema> {\n return TokenDisplayOnceModalPropsSchema.parse(raw);\n}\n","import type { ReactNode } from \"react\";\nimport type { Observable } from \"rxjs\";\nimport { z } from \"zod\";\n\n// i18nKeys: TableView.aria.table, TableView.pagination.next, TableView.pagination.prev, TableView.empty.message, TableView.error.invalidProps\n\nexport const ColumnDefSchema = z.object({\n key: z.string().min(1),\n header: z.string().min(1),\n // render is a runtime function — excluded from Zod, typed separately\n});\n\nexport type ColumnDef<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n key: string;\n header: string;\n render?: (row: TRow) => ReactNode;\n};\n\n/**\n * Validates the serialisable (non-function) portion of TableView props.\n * The `rows$` Observable and `render` callbacks are not Zod-parseable and\n * must be validated at the call-site type level.\n */\nexport const TableViewPropsSchema = z.object({\n columns: z.array(ColumnDefSchema).min(1, \"TableView requires at least one column\"),\n virtualizeThreshold: z.number().int().positive().default(100),\n ariaLabel: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type TableViewPropsSchemaInput = z.input<typeof TableViewPropsSchema>;\nexport type TableViewPropsSchemaOutput = z.output<typeof TableViewPropsSchema>;\n\n/**\n * Props for the static TableView — accepts a plain array of rows.\n * Primary API for already-fetched data (no rxjs required).\n */\nexport type TableViewProps<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n columns: ColumnDef<TRow>[];\n rows: Partial<TRow>[];\n virtualizeThreshold?: number;\n ariaLabel: string;\n locale?: \"en\" | \"fr\";\n};\n\n/**\n * Props for StreamingTableView — accepts an RxJS Observable for incremental row appending.\n * Consumers using this variant MUST install rxjs ^7.8.0 in their project.\n */\nexport type StreamingTableViewProps<\n TRow extends Record<string, unknown> = Record<string, unknown>,\n> = {\n columns: ColumnDef<TRow>[];\n rows$: Observable<Partial<TRow>[]>;\n virtualizeThreshold?: number;\n ariaLabel: string;\n locale?: \"en\" | \"fr\";\n};\n\nexport function validateTableViewProps(raw: unknown): TableViewPropsSchemaOutput {\n return TableViewPropsSchema.parse(raw);\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","import { z } from \"zod\";\n\nexport const StatusBadgePropsSchema = z.object({\n status: z.string(),\n variant: z.enum([\"success\", \"warning\", \"danger\", \"info\", \"neutral\"]).default(\"neutral\"),\n label: z.string().optional(),\n locale: z.enum([\"en\", \"fr\"]),\n});\n\nexport type StatusBadgeProps = z.infer<typeof StatusBadgePropsSchema>;\n\nexport function validateProps(raw: unknown): StatusBadgeProps {\n return StatusBadgePropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\nexport const ProgressBarPropsSchema = z.object({\n value: z.number().min(0).max(100),\n label: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n colorVariant: z.enum([\"default\", \"warning\", \"danger\"]).default(\"default\"),\n});\n\nexport type ProgressBarProps = z.infer<typeof ProgressBarPropsSchema>;\n\nexport function validateProps(raw: unknown): ProgressBarProps {\n return ProgressBarPropsSchema.parse(raw);\n}\n","import { type UIResource, createUIResource } from \"@mcp-ui/server\";\nimport { MarkdownRendererPropsSchema } from \"../components/artifacts/MarkdownRenderer.schema.js\";\nimport { TokenDisplayOnceModalPropsSchema } from \"../components/confirmation/TokenDisplayOnceModal.schema.js\";\nimport { TableViewPropsSchema } from \"../components/display/TableView.schema.js\";\nimport { ConfirmDialogPropsSchema } from \"../components/input/ConfirmDialog.schema.js\";\nimport { StatusBadgePropsSchema } from \"../components/media/StatusBadge.schema.js\";\nimport { ProgressBarPropsSchema } from \"../components/progress/ProgressBar.schema.js\";\n\n/**\n * MCP capability key used by hosts to discover that this server emits\n * MCP UI Apps resources (mosaic-architecture-standard-v1 §2.1).\n */\nexport const MCP_UI_CAPABILITY_KEY = \"io.modelcontextprotocol/ui\" as const;\n\n/**\n * Canonical Mosaic MIME type — every UIResource produced by this server\n * advertises the MCP Apps profile (`text/html;profile=mcp-app`).\n */\nexport const MOSAIC_MIME_TYPE = \"text/html;profile=mcp-app\" as const;\n\ntype SupportedComponent =\n | \"ProgressBar\"\n | \"ConfirmDialog\"\n | \"TableView\"\n | \"MarkdownRenderer\"\n | \"TokenDisplayOnceModal\"\n | \"StatusBadge\";\n\nconst SCHEMA_BY_NAME = {\n ProgressBar: ProgressBarPropsSchema,\n ConfirmDialog: ConfirmDialogPropsSchema,\n TableView: TableViewPropsSchema,\n MarkdownRenderer: MarkdownRendererPropsSchema,\n TokenDisplayOnceModal: TokenDisplayOnceModalPropsSchema,\n StatusBadge: StatusBadgePropsSchema,\n} as const;\n\nconst COMPONENT_KEYS = Object.keys(SCHEMA_BY_NAME) as SupportedComponent[];\n\nconst I18N_TITLE: Record<SupportedComponent, { en: string; fr: string }> = {\n ProgressBar: { en: \"Progress\", fr: \"Progression\" },\n ConfirmDialog: { en: \"Confirmation\", fr: \"Confirmation\" },\n TableView: { en: \"Data table\", fr: \"Tableau de données\" },\n MarkdownRenderer: { en: \"Markdown content\", fr: \"Contenu Markdown\" },\n TokenDisplayOnceModal: { en: \"Token (shown once)\", fr: \"Jeton (affiché une fois)\" },\n StatusBadge: { en: \"Status\", fr: \"Statut\" },\n};\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction fallbackMarkdown(componentName: SupportedComponent, locale: \"en\" | \"fr\"): string {\n const heading = I18N_TITLE[componentName][locale];\n const note =\n locale === \"fr\"\n ? \"Rendu Markdown de secours — composant Mosaic chargé via MCP UI.\"\n : \"Markdown fallback — Mosaic component rendered via MCP UI.\";\n return `# ${heading}\\n\\n${note}\\n`;\n}\n\nfunction buildHtml(componentName: SupportedComponent, props: unknown, locale: \"en\" | \"fr\"): string {\n const propsJson = escapeHtml(JSON.stringify(props));\n const title = escapeHtml(I18N_TITLE[componentName][locale]);\n return `<!DOCTYPE html><html lang=\"${locale}\"><head><meta charset=\"utf-8\"><title>${title}</title></head><body><div id=\"mosaic-root\" data-component=\"${componentName}\" data-props='${propsJson}'></div></body></html>`;\n}\n\nexport interface CreateMosaicResourceOptions {\n /** Optional override for the generated `ui://` URI. */\n uri?: `ui://${string}`;\n /** Optional override of the markdown fallback emitted under `_meta.ui.fallback`. */\n markdownFallback?: string;\n}\n\n/**\n * Create a canonical MCP UI Apps `UIResource` for a Mosaic component.\n *\n * - Runtime-validates `props` with the component's Zod schema (throws on failure).\n * - Wraps the rendered HTML with `createUIResource()` from `@mcp-ui/server`.\n * - Emits canonical nested `_meta.ui.{ resourceUri, locale, componentName, fallback }`.\n * - Uses MIME `text/html;profile=mcp-app` (Mosaic standard §2.1).\n *\n * @throws ZodError when `props` fails validation for `componentName`.\n */\nexport function createMosaicResource(\n componentName: SupportedComponent,\n props: unknown,\n locale: \"en\" | \"fr\" = \"en\",\n): UIResource {\n const schema = SCHEMA_BY_NAME[componentName];\n if (!schema) {\n throw new Error(`createMosaicResource: unknown component '${componentName}'`);\n }\n const validated = schema.parse(props);\n const uri: `ui://${string}` = `ui://mosaic/${componentName.toLowerCase()}`;\n const html = buildHtml(componentName, validated, locale);\n const fallback = fallbackMarkdown(componentName, locale);\n\n const resource = createUIResource({\n uri,\n content: { type: \"rawHtml\", htmlString: html },\n encoding: \"text\",\n metadata: {\n ui: {\n resourceUri: uri,\n locale,\n componentName,\n fallback,\n },\n },\n });\n\n // createUIResource may itself default the MIME type; ensure it matches the\n // Mosaic canonical profile regardless of upstream defaults.\n resource.resource.mimeType = MOSAIC_MIME_TYPE;\n return resource;\n}\n\nexport const MOSAIC_SUPPORTED_COMPONENTS: readonly SupportedComponent[] = COMPONENT_KEYS;\nexport type { SupportedComponent };\n"]}
@@ -0,0 +1,33 @@
1
+ import { UIResource } from '@mcp-ui/server';
2
+
3
+ /**
4
+ * MCP capability key used by hosts to discover that this server emits
5
+ * MCP UI Apps resources (mosaic-architecture-standard-v1 §2.1).
6
+ */
7
+ declare const MCP_UI_CAPABILITY_KEY: "io.modelcontextprotocol/ui";
8
+ /**
9
+ * Canonical Mosaic MIME type — every UIResource produced by this server
10
+ * advertises the MCP Apps profile (`text/html;profile=mcp-app`).
11
+ */
12
+ declare const MOSAIC_MIME_TYPE: "text/html;profile=mcp-app";
13
+ type SupportedComponent = "ProgressBar" | "ConfirmDialog" | "TableView" | "MarkdownRenderer" | "TokenDisplayOnceModal" | "StatusBadge";
14
+ interface CreateMosaicResourceOptions {
15
+ /** Optional override for the generated `ui://` URI. */
16
+ uri?: `ui://${string}`;
17
+ /** Optional override of the markdown fallback emitted under `_meta.ui.fallback`. */
18
+ markdownFallback?: string;
19
+ }
20
+ /**
21
+ * Create a canonical MCP UI Apps `UIResource` for a Mosaic component.
22
+ *
23
+ * - Runtime-validates `props` with the component's Zod schema (throws on failure).
24
+ * - Wraps the rendered HTML with `createUIResource()` from `@mcp-ui/server`.
25
+ * - Emits canonical nested `_meta.ui.{ resourceUri, locale, componentName, fallback }`.
26
+ * - Uses MIME `text/html;profile=mcp-app` (Mosaic standard §2.1).
27
+ *
28
+ * @throws ZodError when `props` fails validation for `componentName`.
29
+ */
30
+ declare function createMosaicResource(componentName: SupportedComponent, props: unknown, locale?: "en" | "fr"): UIResource;
31
+ declare const MOSAIC_SUPPORTED_COMPONENTS: readonly SupportedComponent[];
32
+
33
+ export { type CreateMosaicResourceOptions, MCP_UI_CAPABILITY_KEY, MOSAIC_MIME_TYPE, MOSAIC_SUPPORTED_COMPONENTS, type SupportedComponent, createMosaicResource };
@@ -0,0 +1,33 @@
1
+ import { UIResource } from '@mcp-ui/server';
2
+
3
+ /**
4
+ * MCP capability key used by hosts to discover that this server emits
5
+ * MCP UI Apps resources (mosaic-architecture-standard-v1 §2.1).
6
+ */
7
+ declare const MCP_UI_CAPABILITY_KEY: "io.modelcontextprotocol/ui";
8
+ /**
9
+ * Canonical Mosaic MIME type — every UIResource produced by this server
10
+ * advertises the MCP Apps profile (`text/html;profile=mcp-app`).
11
+ */
12
+ declare const MOSAIC_MIME_TYPE: "text/html;profile=mcp-app";
13
+ type SupportedComponent = "ProgressBar" | "ConfirmDialog" | "TableView" | "MarkdownRenderer" | "TokenDisplayOnceModal" | "StatusBadge";
14
+ interface CreateMosaicResourceOptions {
15
+ /** Optional override for the generated `ui://` URI. */
16
+ uri?: `ui://${string}`;
17
+ /** Optional override of the markdown fallback emitted under `_meta.ui.fallback`. */
18
+ markdownFallback?: string;
19
+ }
20
+ /**
21
+ * Create a canonical MCP UI Apps `UIResource` for a Mosaic component.
22
+ *
23
+ * - Runtime-validates `props` with the component's Zod schema (throws on failure).
24
+ * - Wraps the rendered HTML with `createUIResource()` from `@mcp-ui/server`.
25
+ * - Emits canonical nested `_meta.ui.{ resourceUri, locale, componentName, fallback }`.
26
+ * - Uses MIME `text/html;profile=mcp-app` (Mosaic standard §2.1).
27
+ *
28
+ * @throws ZodError when `props` fails validation for `componentName`.
29
+ */
30
+ declare function createMosaicResource(componentName: SupportedComponent, props: unknown, locale?: "en" | "fr"): UIResource;
31
+ declare const MOSAIC_SUPPORTED_COMPONENTS: readonly SupportedComponent[];
32
+
33
+ export { type CreateMosaicResourceOptions, MCP_UI_CAPABILITY_KEY, MOSAIC_MIME_TYPE, MOSAIC_SUPPORTED_COMPONENTS, type SupportedComponent, createMosaicResource };