@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.
Files changed (91) hide show
  1. package/README.md +181 -0
  2. package/dist/Alert.schema-BQsZGG6P.d.cts +41 -0
  3. package/dist/Alert.schema-BQsZGG6P.d.ts +41 -0
  4. package/dist/ConfirmDialog-B3CQQGmJ.d.cts +34 -0
  5. package/dist/ConfirmDialog-B3CQQGmJ.d.ts +34 -0
  6. package/dist/Skeleton.schema-BO0ca2UX.d.cts +135 -0
  7. package/dist/Skeleton.schema-BO0ca2UX.d.ts +135 -0
  8. package/dist/Tabs.schema-BzcEyeq8.d.cts +79 -0
  9. package/dist/Tabs.schema-BzcEyeq8.d.ts +79 -0
  10. package/dist/artifacts.cjs +20 -2
  11. package/dist/artifacts.cjs.map +1 -1
  12. package/dist/artifacts.js +20 -2
  13. package/dist/artifacts.js.map +1 -1
  14. package/dist/confirmation.cjs +44 -2
  15. package/dist/confirmation.cjs.map +1 -1
  16. package/dist/confirmation.d.cts +34 -1
  17. package/dist/confirmation.d.ts +34 -1
  18. package/dist/confirmation.js +41 -3
  19. package/dist/confirmation.js.map +1 -1
  20. package/dist/display.cjs +145 -2
  21. package/dist/display.cjs.map +1 -1
  22. package/dist/display.d.cts +1 -0
  23. package/dist/display.d.ts +1 -0
  24. package/dist/display.js +140 -3
  25. package/dist/display.js.map +1 -1
  26. package/dist/forms.cjs +1412 -0
  27. package/dist/forms.cjs.map +1 -0
  28. package/dist/forms.d.cts +159 -0
  29. package/dist/forms.d.ts +159 -0
  30. package/dist/forms.js +1331 -0
  31. package/dist/forms.js.map +1 -0
  32. package/dist/index-CwXVgtGb.d.cts +917 -0
  33. package/dist/index-CwXVgtGb.d.ts +917 -0
  34. package/dist/index.cjs +188 -2
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +5 -2
  37. package/dist/index.d.ts +5 -2
  38. package/dist/index.js +177 -3
  39. package/dist/index.js.map +1 -1
  40. package/dist/input.cjs +19 -0
  41. package/dist/input.cjs.map +1 -1
  42. package/dist/input.d.cts +4 -34
  43. package/dist/input.d.ts +4 -34
  44. package/dist/input.js +18 -1
  45. package/dist/input.js.map +1 -1
  46. package/dist/media.cjs +20 -2
  47. package/dist/media.cjs.map +1 -1
  48. package/dist/media.js +20 -2
  49. package/dist/media.js.map +1 -1
  50. package/dist/preact/confirmation.d.ts +85 -1
  51. package/dist/preact/confirmation.js +263 -0
  52. package/dist/preact/confirmation.js.map +1 -1
  53. package/dist/preact/display.d.ts +240 -1
  54. package/dist/preact/display.js +366 -0
  55. package/dist/preact/display.js.map +1 -1
  56. package/dist/preact/forms.d.ts +875 -0
  57. package/dist/preact/forms.js +1323 -0
  58. package/dist/preact/forms.js.map +1 -0
  59. package/dist/preact/input.d.ts +88 -1
  60. package/dist/preact/input.js +194 -0
  61. package/dist/preact/input.js.map +1 -1
  62. package/dist/progress.cjs +20 -2
  63. package/dist/progress.cjs.map +1 -1
  64. package/dist/progress.js +20 -2
  65. package/dist/progress.js.map +1 -1
  66. package/dist/react/confirmation.cjs +267 -0
  67. package/dist/react/confirmation.cjs.map +1 -1
  68. package/dist/react/confirmation.d.cts +21 -1
  69. package/dist/react/confirmation.d.ts +21 -1
  70. package/dist/react/confirmation.js +263 -0
  71. package/dist/react/confirmation.js.map +1 -1
  72. package/dist/react/display.cjs +372 -0
  73. package/dist/react/display.cjs.map +1 -1
  74. package/dist/react/display.d.cts +112 -1
  75. package/dist/react/display.d.ts +112 -1
  76. package/dist/react/display.js +362 -0
  77. package/dist/react/display.js.map +1 -1
  78. package/dist/react/forms.cjs +1384 -0
  79. package/dist/react/forms.cjs.map +1 -0
  80. package/dist/react/forms.d.cts +5 -0
  81. package/dist/react/forms.d.ts +5 -0
  82. package/dist/react/forms.js +1323 -0
  83. package/dist/react/forms.js.map +1 -0
  84. package/dist/react/input.cjs +197 -0
  85. package/dist/react/input.cjs.map +1 -1
  86. package/dist/react/input.d.cts +13 -1
  87. package/dist/react/input.d.ts +13 -1
  88. package/dist/react/input.js +194 -0
  89. package/dist/react/input.js.map +1 -1
  90. package/package.json +73 -49
  91. package/registry.yaml +154 -1
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"input.js"}
1
+ {"version":3,"sources":["../../src/components/input/Tabs.logic.ts","../../src/components/input/Tabs.schema.ts","../../src/runtimes/react/components/input/Tabs.tsx"],"names":[],"mappings":"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","file":"input.js","sourcesContent":["/**\n * Tabs.logic.ts — pure, framework-agnostic logic.\n * No JSX here — shared between React 19 and Preact 10 runtimes.\n *\n * WCAG-AA ARIA + roving tabindex spec:\n * - role=\"tablist\" on container\n * - role=\"tab\" + aria-selected + aria-controls on each button\n * - role=\"tabpanel\" + aria-labelledby on each panel\n * - Roving tabindex: active tab = tabIndex 0, all others = tabIndex -1\n * - ArrowLeft/Right (horizontal) or ArrowUp/Down (vertical) moves focus between tabs\n * - Home → first enabled tab, End → last enabled tab\n * - Tab key moves focus INTO the active panel content (no tabIndex manipulation needed — natural DOM order)\n * - Disabled tabs are skipped during keyboard nav\n */\n\nexport type TabOrientation = \"horizontal\" | \"vertical\";\n\n/**\n * Returns the prev/next key pair for the given orientation.\n */\nexport function getNavKeys(orientation: TabOrientation): {\n prev: string;\n next: string;\n} {\n return orientation === \"horizontal\"\n ? { prev: \"ArrowLeft\", next: \"ArrowRight\" }\n : { prev: \"ArrowUp\", next: \"ArrowDown\" };\n}\n\n/**\n * Finds the next focusable (non-disabled) tab index in direction.\n * Wraps around at boundaries.\n */\nexport function findNextEnabledIndex(\n tabs: Array<{ id: string; disabled?: boolean }>,\n currentIndex: number,\n direction: 1 | -1,\n): number {\n const len = tabs.length;\n let i = (currentIndex + direction + len) % len;\n // Guard: prevent infinite loop if all tabs are disabled (shouldn't happen but defensive)\n for (let tries = 0; tries < len; tries++) {\n if (!tabs[i]?.disabled) return i;\n i = (i + direction + len) % len;\n }\n return currentIndex;\n}\n\n/**\n * Finds the first enabled tab index.\n */\nexport function findFirstEnabledIndex(tabs: Array<{ id: string; disabled?: boolean }>): number {\n const idx = tabs.findIndex((t) => !t.disabled);\n return idx === -1 ? 0 : idx;\n}\n\n/**\n * Finds the last enabled tab index.\n */\nexport function findLastEnabledIndex(tabs: Array<{ id: string; disabled?: boolean }>): number {\n for (let i = tabs.length - 1; i >= 0; i--) {\n if (!tabs[i]?.disabled) return i;\n }\n return tabs.length - 1;\n}\n\n/**\n * Generates stable DOM IDs for tab + panel linking.\n */\nexport function getTabId(instanceId: string, tabId: string): string {\n return `${instanceId}-tab-${tabId}`;\n}\n\nexport function getPanelId(instanceId: string, tabId: string): string {\n return `${instanceId}-panel-${tabId}`;\n}\n\n/**\n * Resolves the initial active tab ID.\n * Priority: value (controlled) > defaultValue > first enabled tab.\n */\nexport function resolveInitialActive(\n tabs: Array<{ id: string; disabled?: boolean }>,\n value?: string,\n defaultValue?: string,\n): string {\n if (value !== undefined) {\n const found = tabs.find((t) => t.id === value && !t.disabled);\n if (found) return found.id;\n }\n if (defaultValue !== undefined) {\n const found = tabs.find((t) => t.id === defaultValue && !t.disabled);\n if (found) return found.id;\n }\n const firstEnabled = tabs.find((t) => !t.disabled);\n return firstEnabled?.id ?? tabs[0]?.id ?? \"\";\n}\n\n/**\n * Tailwind class helpers for the tablist container.\n */\nexport function getTablistClasses(orientation: TabOrientation): string {\n return orientation === \"horizontal\"\n ? \"flex flex-row border-b border-slate-200\"\n : \"flex flex-col border-r border-slate-200 self-start\";\n}\n\n/**\n * Tailwind class helpers for a single tab button.\n */\nexport function getTabClasses(\n isSelected: boolean,\n isDisabled: boolean,\n orientation: TabOrientation,\n): string {\n const base =\n \"relative px-4 py-2 text-sm font-medium transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 select-none\";\n\n const orientationCls =\n orientation === \"horizontal\" ? \"border-b-2 -mb-px\" : \"border-r-2 -mr-px text-left\";\n\n const stateCls = isDisabled\n ? \"text-slate-400 cursor-not-allowed border-transparent\"\n : isSelected\n ? \"border-blue-600 text-blue-700 bg-slate-50\"\n : \"border-transparent text-slate-600 hover:text-slate-900 hover:border-slate-300 hover:bg-slate-50\";\n\n return [base, orientationCls, stateCls].join(\" \");\n}\n\n/**\n * Tailwind class helpers for the tab panel wrapper.\n */\nexport function getPanelClasses(orientation: TabOrientation): string {\n return orientation === \"horizontal\" ? \"pt-4\" : \"pl-4 flex-1\";\n}\n\n/**\n * Tailwind class helpers for the root container.\n */\nexport function getRootClasses(orientation: TabOrientation): string {\n return orientation === \"horizontal\" ? \"flex flex-col\" : \"flex flex-row\";\n}\n","import { z } from \"zod\";\n\n// i18nKeys: Tabs.error.invalidProps\n\n/**\n * Tabs component props schema.\n *\n * Supports controlled (value + onValueChange) and uncontrolled (defaultValue) modes.\n * orientation — \"horizontal\" (default) or \"vertical\" — affects ArrowLeft/Right vs ArrowUp/Down nav.\n * tabs — ordered list of tab descriptors (id must be unique within the instance).\n */\nexport const TabItemSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n /** ReactNode / PreactNode — accepted as unknown at Zod layer (JSX not serialisable). */\n content: z.unknown(),\n disabled: z.boolean().optional().default(false),\n});\n\nexport type TabItem = z.infer<typeof TabItemSchema>;\n\nexport const TabsPropsSchema = z.object({\n tabs: z.array(TabItemSchema).min(1),\n value: z.string().optional(),\n defaultValue: z.string().optional(),\n orientation: z.enum([\"horizontal\", \"vertical\"]).default(\"horizontal\"),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\n/** Runtime props — onValueChange is a function (not serialisable via Zod, kept outside schema). */\nexport type TabsProps = z.infer<typeof TabsPropsSchema> & {\n onValueChange?: (id: string) => void;\n};\n\nexport function validateTabsProps(raw: unknown): z.infer<typeof TabsPropsSchema> {\n return TabsPropsSchema.parse(raw);\n}\n","\"use client\";\n\n// i18nKeys: Tabs.error.invalidProps\n\nimport { type KeyboardEvent, useId, useRef, useState } from \"react\";\nimport {\n findFirstEnabledIndex,\n findLastEnabledIndex,\n findNextEnabledIndex,\n getNavKeys,\n getPanelClasses,\n getPanelId,\n getRootClasses,\n getTabClasses,\n getTabId,\n getTablistClasses,\n resolveInitialActive,\n} from \"../../../../components/input/Tabs.logic.js\";\nimport {\n type TabItem,\n type TabsProps,\n validateTabsProps,\n} from \"../../../../components/input/Tabs.schema.js\";\n\n// ─── Inner component (validated props) ────────────────────────────────────────\n\nfunction TabsInner({\n tabs,\n value: controlledValue,\n defaultValue,\n orientation,\n onValueChange,\n}: TabsProps) {\n const instanceId = useId();\n const tabButtonRefs = useRef<Map<string, HTMLButtonElement | null>>(new Map());\n\n const isControlled = controlledValue !== undefined;\n\n const [internalValue, setInternalValue] = useState<string>(() =>\n resolveInitialActive(tabs, controlledValue, defaultValue),\n );\n\n const activeId = isControlled\n ? (controlledValue ?? resolveInitialActive(tabs, undefined, defaultValue))\n : internalValue;\n\n function handleSelect(tabId: string) {\n if (!isControlled) {\n setInternalValue(tabId);\n }\n onValueChange?.(tabId);\n }\n\n function focusTabByIndex(index: number) {\n const tab = tabs[index];\n if (!tab) return;\n const btn = tabButtonRefs.current.get(tab.id);\n btn?.focus();\n handleSelect(tab.id);\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLButtonElement>, currentIndex: number) {\n const { prev, next } = getNavKeys(orientation);\n\n switch (e.key) {\n case next: {\n e.preventDefault();\n focusTabByIndex(findNextEnabledIndex(tabs, currentIndex, 1));\n break;\n }\n case prev: {\n e.preventDefault();\n focusTabByIndex(findNextEnabledIndex(tabs, currentIndex, -1));\n break;\n }\n case \"Home\": {\n e.preventDefault();\n focusTabByIndex(findFirstEnabledIndex(tabs));\n break;\n }\n case \"End\": {\n e.preventDefault();\n focusTabByIndex(findLastEnabledIndex(tabs));\n break;\n }\n }\n }\n\n const rootCls = getRootClasses(orientation);\n const tablistCls = getTablistClasses(orientation);\n const panelCls = getPanelClasses(orientation);\n\n return (\n <div className={rootCls}>\n {/* Tab list */}\n <div role=\"tablist\" aria-orientation={orientation} className={tablistCls}>\n {tabs.map((tab: TabItem, index: number) => {\n const isSelected = tab.id === activeId;\n const tabDomId = getTabId(instanceId, tab.id);\n const panelDomId = getPanelId(instanceId, tab.id);\n const isDisabled = tab.disabled ?? false;\n\n return (\n <button\n key={tab.id}\n ref={(el) => {\n tabButtonRefs.current.set(tab.id, el);\n }}\n id={tabDomId}\n type=\"button\"\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={panelDomId}\n aria-disabled={isDisabled || undefined}\n disabled={isDisabled}\n tabIndex={isSelected ? 0 : -1}\n className={getTabClasses(isSelected, isDisabled, orientation)}\n onClick={() => {\n if (!isDisabled) handleSelect(tab.id);\n }}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n\n {/* Tab panels — tabIndex={0} required by WAI-ARIA Tabs pattern for keyboard focus entry */}\n {tabs.map((tab: TabItem) => {\n const isSelected = tab.id === activeId;\n const tabDomId = getTabId(instanceId, tab.id);\n const panelDomId = getPanelId(instanceId, tab.id);\n\n return (\n <div\n key={tab.id}\n id={panelDomId}\n role=\"tabpanel\"\n aria-labelledby={tabDomId}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: WAI-ARIA Tabs pattern requires tabIndex=0 on tabpanel to allow Tab key entry into panel content\n tabIndex={0}\n hidden={!isSelected}\n className={panelCls}\n >\n {tab.content as React.ReactNode}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── Public export with Zod guard ─────────────────────────────────────────────\n\n/**\n * Tabs — cross-runtime tab navigation component.\n *\n * Supports controlled (value + onValueChange) and uncontrolled (defaultValue) modes.\n * WCAG-AA: role=tablist/tab/tabpanel, aria-selected, aria-controls, aria-labelledby,\n * roving tabindex, ArrowLeft/Right/Up/Down, Home/End keyboard navigation.\n */\nexport function Tabs(raw: Record<string, unknown>) {\n try {\n const parsed = validateTabsProps(raw);\n return <TabsInner {...parsed} onValueChange={(raw as TabsProps).onValueChange} />;\n } catch (err) {\n console.error(\"[Tabs] Invalid props — component will not render.\", err);\n return null;\n }\n}\n"]}
package/dist/progress.cjs CHANGED
@@ -23,7 +23,16 @@ var EN = {
23
23
  "TokenDisplayOnceModal.warning.once": "This token will only be shown once. Copy it now.",
24
24
  "TokenDisplayOnceModal.copied": "Copied",
25
25
  "StatusBadge.aria.status": "Status",
26
- "StatusBadge.error.invalidProps": "StatusBadge: invalid props"
26
+ "StatusBadge.error.invalidProps": "StatusBadge: invalid props",
27
+ "EmptyState.error.invalidProps": "EmptyState: invalid props",
28
+ "Toast.aria.close": "Close notification",
29
+ "Toast.error.invalidProps": "Toast: invalid props",
30
+ "Alert.aria.dismiss": "Dismiss alert",
31
+ "Alert.error.invalidProps": "Alert: invalid props",
32
+ "VirtualList.empty.message": "No items to display",
33
+ "VirtualList.error.invalidProps": "VirtualList: invalid props",
34
+ "Skeleton.aria.label": "Loading",
35
+ "Skeleton.error.invalidProps": "Skeleton: invalid props"
27
36
  };
28
37
  var FR = {
29
38
  "ProgressBar.aria.label": "Progression",
@@ -44,7 +53,16 @@ var FR = {
44
53
  "TokenDisplayOnceModal.warning.once": "Ce jeton ne sera affich\xE9 qu'une seule fois. Copiez-le maintenant.",
45
54
  "TokenDisplayOnceModal.copied": "Copi\xE9",
46
55
  "StatusBadge.aria.status": "Statut",
47
- "StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides"
56
+ "StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides",
57
+ "EmptyState.error.invalidProps": "EmptyState : propri\xE9t\xE9s invalides",
58
+ "Toast.aria.close": "Fermer la notification",
59
+ "Toast.error.invalidProps": "Toast : propri\xE9t\xE9s invalides",
60
+ "Alert.aria.dismiss": "Fermer l'alerte",
61
+ "Alert.error.invalidProps": "Alert : propri\xE9t\xE9s invalides",
62
+ "VirtualList.empty.message": "Aucun \xE9l\xE9ment \xE0 afficher",
63
+ "VirtualList.error.invalidProps": "VirtualList : propri\xE9t\xE9s invalides",
64
+ "Skeleton.aria.label": "Chargement",
65
+ "Skeleton.error.invalidProps": "Skeleton : propri\xE9t\xE9s invalides"
48
66
  };
49
67
  var TABLE = {
50
68
  en: EN,
@@ -1 +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":"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","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"]}
1
+ {"version":3,"sources":["../src/i18n/strings.ts","../src/components/progress/ProgressBar.schema.ts","../src/components/progress/ProgressBar.tsx"],"names":["z","jsxs","jsx"],"mappings":"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","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 \"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","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"]}
package/dist/progress.js CHANGED
@@ -21,7 +21,16 @@ var EN = {
21
21
  "TokenDisplayOnceModal.warning.once": "This token will only be shown once. Copy it now.",
22
22
  "TokenDisplayOnceModal.copied": "Copied",
23
23
  "StatusBadge.aria.status": "Status",
24
- "StatusBadge.error.invalidProps": "StatusBadge: invalid props"
24
+ "StatusBadge.error.invalidProps": "StatusBadge: invalid props",
25
+ "EmptyState.error.invalidProps": "EmptyState: invalid props",
26
+ "Toast.aria.close": "Close notification",
27
+ "Toast.error.invalidProps": "Toast: invalid props",
28
+ "Alert.aria.dismiss": "Dismiss alert",
29
+ "Alert.error.invalidProps": "Alert: invalid props",
30
+ "VirtualList.empty.message": "No items to display",
31
+ "VirtualList.error.invalidProps": "VirtualList: invalid props",
32
+ "Skeleton.aria.label": "Loading",
33
+ "Skeleton.error.invalidProps": "Skeleton: invalid props"
25
34
  };
26
35
  var FR = {
27
36
  "ProgressBar.aria.label": "Progression",
@@ -42,7 +51,16 @@ var FR = {
42
51
  "TokenDisplayOnceModal.warning.once": "Ce jeton ne sera affich\xE9 qu'une seule fois. Copiez-le maintenant.",
43
52
  "TokenDisplayOnceModal.copied": "Copi\xE9",
44
53
  "StatusBadge.aria.status": "Statut",
45
- "StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides"
54
+ "StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides",
55
+ "EmptyState.error.invalidProps": "EmptyState : propri\xE9t\xE9s invalides",
56
+ "Toast.aria.close": "Fermer la notification",
57
+ "Toast.error.invalidProps": "Toast : propri\xE9t\xE9s invalides",
58
+ "Alert.aria.dismiss": "Fermer l'alerte",
59
+ "Alert.error.invalidProps": "Alert : propri\xE9t\xE9s invalides",
60
+ "VirtualList.empty.message": "Aucun \xE9l\xE9ment \xE0 afficher",
61
+ "VirtualList.error.invalidProps": "VirtualList : propri\xE9t\xE9s invalides",
62
+ "Skeleton.aria.label": "Chargement",
63
+ "Skeleton.error.invalidProps": "Skeleton : propri\xE9t\xE9s invalides"
46
64
  };
47
65
  var TABLE = {
48
66
  en: EN,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/strings.ts","../src/components/progress/ProgressBar.schema.ts","../src/components/progress/ProgressBar.tsx"],"names":[],"mappings":"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","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"]}
1
+ {"version":3,"sources":["../src/i18n/strings.ts","../src/components/progress/ProgressBar.schema.ts","../src/components/progress/ProgressBar.tsx"],"names":[],"mappings":"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","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 \"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","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"]}
@@ -1,4 +1,271 @@
1
1
  'use strict';
2
2
 
3
+ var zod = require('zod');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var react = require('react');
6
+
7
+ // src/components/confirmation/Alert.logic.ts
8
+ function getAlertAriaRole(variant) {
9
+ return variant === "error" ? "alert" : "status";
10
+ }
11
+ function getAlertAriaLive(variant) {
12
+ return variant === "error" ? "assertive" : "polite";
13
+ }
14
+ var alertContainerClasses = {
15
+ success: "bg-green-50 text-green-900 ring-1 ring-green-300 border-l-4 border-green-500",
16
+ error: "bg-red-50 text-red-900 ring-1 ring-red-300 border-l-4 border-red-600",
17
+ info: "bg-blue-50 text-blue-900 ring-1 ring-blue-300 border-l-4 border-blue-500",
18
+ warning: "bg-amber-50 text-amber-900 ring-1 ring-amber-300 border-l-4 border-amber-500"
19
+ };
20
+ var alertTitleClasses = {
21
+ success: "text-green-900 font-semibold",
22
+ error: "text-red-900 font-semibold",
23
+ info: "text-blue-900 font-semibold",
24
+ warning: "text-amber-900 font-semibold"
25
+ };
26
+ var alertDescriptionClasses = {
27
+ success: "text-green-800",
28
+ error: "text-red-800",
29
+ info: "text-blue-800",
30
+ warning: "text-amber-800"
31
+ };
32
+ var alertDismissClasses = {
33
+ success: "text-green-700 hover:bg-green-100 focus-visible:outline-green-600",
34
+ error: "text-red-700 hover:bg-red-100 focus-visible:outline-red-600",
35
+ info: "text-blue-700 hover:bg-blue-100 focus-visible:outline-blue-600",
36
+ warning: "text-amber-700 hover:bg-amber-100 focus-visible:outline-amber-600"
37
+ };
38
+ var AlertPropsSchema = zod.z.object({
39
+ variant: zod.z.enum(["success", "error", "info", "warning"]),
40
+ title: zod.z.string().min(1),
41
+ description: zod.z.string().optional(),
42
+ dismissible: zod.z.boolean().default(false),
43
+ locale: zod.z.enum(["en", "fr"]).default("en")
44
+ });
45
+ function validateAlertProps(raw) {
46
+ return AlertPropsSchema.parse(raw);
47
+ }
48
+
49
+ // src/i18n/strings.ts
50
+ var EN = {
51
+ "ProgressBar.aria.label": "Progress",
52
+ "ProgressBar.error.invalidProps": "ProgressBar: invalid props",
53
+ "ConfirmDialog.button.confirm": "Confirm",
54
+ "ConfirmDialog.button.cancel": "Cancel",
55
+ "ConfirmDialog.aria.dialog": "Confirmation dialog",
56
+ "TableView.aria.table": "Data table",
57
+ "TableView.pagination.next": "Next page",
58
+ "TableView.pagination.prev": "Previous page",
59
+ "TableView.empty.message": "No data to display",
60
+ "TableView.error.invalidProps": "TableView: invalid props",
61
+ "MarkdownRenderer.aria.content": "Rendered Markdown content",
62
+ "MarkdownRenderer.error.invalidProps": "MarkdownRenderer: invalid props",
63
+ "MarkdownRenderer.error.tooLong": "Content exceeds maximum length",
64
+ "TokenDisplayOnceModal.button.copy": "Copy token",
65
+ "TokenDisplayOnceModal.button.close": "Close",
66
+ "TokenDisplayOnceModal.warning.once": "This token will only be shown once. Copy it now.",
67
+ "TokenDisplayOnceModal.copied": "Copied",
68
+ "StatusBadge.aria.status": "Status",
69
+ "StatusBadge.error.invalidProps": "StatusBadge: invalid props",
70
+ "EmptyState.error.invalidProps": "EmptyState: invalid props",
71
+ "Toast.aria.close": "Close notification",
72
+ "Toast.error.invalidProps": "Toast: invalid props",
73
+ "Alert.aria.dismiss": "Dismiss alert",
74
+ "Alert.error.invalidProps": "Alert: invalid props",
75
+ "VirtualList.empty.message": "No items to display",
76
+ "VirtualList.error.invalidProps": "VirtualList: invalid props",
77
+ "Skeleton.aria.label": "Loading",
78
+ "Skeleton.error.invalidProps": "Skeleton: invalid props"
79
+ };
80
+ var FR = {
81
+ "ProgressBar.aria.label": "Progression",
82
+ "ProgressBar.error.invalidProps": "ProgressBar : propri\xE9t\xE9s invalides",
83
+ "ConfirmDialog.button.confirm": "Confirmer",
84
+ "ConfirmDialog.button.cancel": "Annuler",
85
+ "ConfirmDialog.aria.dialog": "Bo\xEEte de dialogue de confirmation",
86
+ "TableView.aria.table": "Tableau de donn\xE9es",
87
+ "TableView.pagination.next": "Page suivante",
88
+ "TableView.pagination.prev": "Page pr\xE9c\xE9dente",
89
+ "TableView.empty.message": "Aucune donn\xE9e \xE0 afficher",
90
+ "TableView.error.invalidProps": "TableView : propri\xE9t\xE9s invalides",
91
+ "MarkdownRenderer.aria.content": "Contenu Markdown rendu",
92
+ "MarkdownRenderer.error.invalidProps": "MarkdownRenderer : propri\xE9t\xE9s invalides",
93
+ "MarkdownRenderer.error.tooLong": "Le contenu d\xE9passe la longueur maximale",
94
+ "TokenDisplayOnceModal.button.copy": "Copier le jeton",
95
+ "TokenDisplayOnceModal.button.close": "Fermer",
96
+ "TokenDisplayOnceModal.warning.once": "Ce jeton ne sera affich\xE9 qu'une seule fois. Copiez-le maintenant.",
97
+ "TokenDisplayOnceModal.copied": "Copi\xE9",
98
+ "StatusBadge.aria.status": "Statut",
99
+ "StatusBadge.error.invalidProps": "StatusBadge : propri\xE9t\xE9s invalides",
100
+ "EmptyState.error.invalidProps": "EmptyState : propri\xE9t\xE9s invalides",
101
+ "Toast.aria.close": "Fermer la notification",
102
+ "Toast.error.invalidProps": "Toast : propri\xE9t\xE9s invalides",
103
+ "Alert.aria.dismiss": "Fermer l'alerte",
104
+ "Alert.error.invalidProps": "Alert : propri\xE9t\xE9s invalides",
105
+ "VirtualList.empty.message": "Aucun \xE9l\xE9ment \xE0 afficher",
106
+ "VirtualList.error.invalidProps": "VirtualList : propri\xE9t\xE9s invalides",
107
+ "Skeleton.aria.label": "Chargement",
108
+ "Skeleton.error.invalidProps": "Skeleton : propri\xE9t\xE9s invalides"
109
+ };
110
+ var TABLE = {
111
+ en: EN,
112
+ fr: FR
113
+ };
114
+ function t(key, locale = "en") {
115
+ return TABLE[locale]?.[key] ?? TABLE.en[key];
116
+ }
117
+ function AlertInner({ variant, title, description, dismissible, locale, onDismiss }) {
118
+ const role = getAlertAriaRole(variant);
119
+ const ariaLive = getAlertAriaLive(variant);
120
+ const dismissLabel = t("Alert.aria.dismiss", locale);
121
+ return /* @__PURE__ */ jsxRuntime.jsxs(
122
+ "div",
123
+ {
124
+ role,
125
+ "aria-live": ariaLive,
126
+ "aria-atomic": "true",
127
+ className: `relative flex items-start gap-3 rounded-md px-4 py-3 w-full ${alertContainerClasses[variant]}`,
128
+ children: [
129
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
130
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: `text-sm leading-snug ${alertTitleClasses[variant]}`, children: title }),
131
+ description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: `mt-1 text-xs leading-relaxed ${alertDescriptionClasses[variant]}`, children: description })
132
+ ] }),
133
+ dismissible && /* @__PURE__ */ jsxRuntime.jsx(
134
+ "button",
135
+ {
136
+ type: "button",
137
+ "aria-label": dismissLabel,
138
+ onClick: onDismiss,
139
+ className: `shrink-0 rounded p-0.5 transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 ${alertDismissClasses[variant]}`,
140
+ children: /* @__PURE__ */ jsxRuntime.jsx(
141
+ "svg",
142
+ {
143
+ "aria-hidden": "true",
144
+ width: "14",
145
+ height: "14",
146
+ viewBox: "0 0 14 14",
147
+ fill: "none",
148
+ xmlns: "http://www.w3.org/2000/svg",
149
+ children: /* @__PURE__ */ jsxRuntime.jsx(
150
+ "path",
151
+ {
152
+ d: "M1 1l12 12M13 1L1 13",
153
+ stroke: "currentColor",
154
+ strokeWidth: "1.8",
155
+ strokeLinecap: "round"
156
+ }
157
+ )
158
+ }
159
+ )
160
+ }
161
+ )
162
+ ]
163
+ }
164
+ );
165
+ }
166
+ function Alert(raw) {
167
+ try {
168
+ const parsed = validateAlertProps(raw);
169
+ return /* @__PURE__ */ jsxRuntime.jsx(AlertInner, { ...parsed, onDismiss: raw.onDismiss });
170
+ } catch (err) {
171
+ console.error("[Alert] Invalid props \u2014 component will not render.", err);
172
+ const locale = raw.locale === "fr" ? "fr" : "en";
173
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { role: "alert", children: t("Alert.error.invalidProps", locale) });
174
+ }
175
+ }
176
+ var ConfirmDialogPropsSchema = zod.z.object({
177
+ title: zod.z.string().min(1),
178
+ message: zod.z.string().min(1),
179
+ confirmLabel: zod.z.string().min(1),
180
+ cancelLabel: zod.z.string().min(1),
181
+ variant: zod.z.enum(["default", "danger"]).default("default"),
182
+ locale: zod.z.enum(["en", "fr"]).default("en")
183
+ });
184
+ function validateConfirmDialogProps(raw) {
185
+ return ConfirmDialogPropsSchema.parse(raw);
186
+ }
187
+ function ConfirmDialogInner({
188
+ title,
189
+ message,
190
+ confirmLabel,
191
+ cancelLabel,
192
+ variant,
193
+ onConfirm,
194
+ onCancel
195
+ }) {
196
+ const dialogRef = react.useRef(null);
197
+ const titleId = react.useId();
198
+ const messageId = react.useId();
199
+ react.useEffect(() => {
200
+ const dialog = dialogRef.current;
201
+ if (!dialog) return;
202
+ dialog.showModal();
203
+ return () => {
204
+ if (dialog.open) dialog.close();
205
+ };
206
+ }, []);
207
+ function handleKeyDown(e) {
208
+ if (e.key === "Escape") {
209
+ e.preventDefault();
210
+ onCancel();
211
+ }
212
+ }
213
+ function handleBackdropClick(e) {
214
+ if (e.target === dialogRef.current) {
215
+ onCancel();
216
+ }
217
+ }
218
+ 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";
219
+ return /* @__PURE__ */ jsxRuntime.jsx(
220
+ "dialog",
221
+ {
222
+ ref: dialogRef,
223
+ "aria-modal": "true",
224
+ "aria-labelledby": titleId,
225
+ "aria-describedby": messageId,
226
+ onKeyDown: handleKeyDown,
227
+ onClick: handleBackdropClick,
228
+ className: "rounded-lg shadow-xl p-0 backdrop:bg-black/40 w-full max-w-md mx-auto",
229
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
230
+ "div",
231
+ {
232
+ className: "p-6 flex flex-col gap-4",
233
+ onClick: (e) => e.stopPropagation(),
234
+ onKeyDown: (e) => e.stopPropagation(),
235
+ children: [
236
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { id: titleId, className: "text-lg font-semibold text-gray-900", children: title }),
237
+ /* @__PURE__ */ jsxRuntime.jsx("p", { id: messageId, className: "text-sm text-gray-600", children: message }),
238
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-3 mt-2", children: [
239
+ /* @__PURE__ */ jsxRuntime.jsx(
240
+ "button",
241
+ {
242
+ type: "button",
243
+ onClick: onCancel,
244
+ 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",
245
+ children: cancelLabel
246
+ }
247
+ ),
248
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: onConfirm, className: confirmClassName, children: confirmLabel })
249
+ ] })
250
+ ]
251
+ }
252
+ )
253
+ }
254
+ );
255
+ }
256
+ function ConfirmDialog(raw) {
257
+ try {
258
+ const parsed = validateConfirmDialogProps(raw);
259
+ return /* @__PURE__ */ jsxRuntime.jsx(ConfirmDialogInner, { ...parsed, onConfirm: raw.onConfirm, onCancel: raw.onCancel });
260
+ } catch (err) {
261
+ console.error("[ConfirmDialog] Invalid props \u2014 component will not render.", err);
262
+ return null;
263
+ }
264
+ }
265
+
266
+ exports.Alert = Alert;
267
+ exports.AlertPropsSchema = AlertPropsSchema;
268
+ exports.ConfirmModal = ConfirmDialog;
269
+ exports.validateAlertProps = validateAlertProps;
3
270
  //# sourceMappingURL=confirmation.cjs.map
4
271
  //# sourceMappingURL=confirmation.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"confirmation.cjs"}
1
+ {"version":3,"sources":["../../src/components/confirmation/Alert.logic.ts","../../src/components/confirmation/Alert.schema.ts","../../src/i18n/strings.ts","../../src/runtimes/react/components/confirmation/Alert.tsx","../../src/components/input/ConfirmDialog.schema.ts","../../src/components/input/ConfirmDialog.tsx"],"names":["z","jsxs","jsx","useRef","useId","useEffect"],"mappings":"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","file":"confirmation.cjs","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","\"use client\";\n\n// i18nKeys: Alert.aria.dismiss, Alert.error.invalidProps\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 (React 19 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"]}
@@ -1,2 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { A as AlertProps } from '../Alert.schema-BQsZGG6P.cjs';
3
+ export { a as AlertPropsSchema, v as validateAlertProps } from '../Alert.schema-BQsZGG6P.cjs';
4
+ export { C as ConfirmModal, a as ConfirmModalProps } from '../ConfirmDialog-B3CQQGmJ.cjs';
5
+ import 'zod';
1
6
 
2
- export { }
7
+ /**
8
+ * Alert — persistent inline banner (React 19 implementation).
9
+ *
10
+ * Contrast with Toast: Alert is PERSISTENT (no auto-dismiss), inline in the
11
+ * document flow. Toast is ephemeral + portal-mounted.
12
+ *
13
+ * Accepts `Record<string, unknown>` for MCP postMessage injection safety.
14
+ * Zod validation narrows before render. Invalid props → accessible error span.
15
+ *
16
+ * WCAG-AA:
17
+ * - variant="error" → role="alert" + aria-live="assertive"
18
+ * - all others → role="status" + aria-live="polite"
19
+ */
20
+ declare function Alert(raw: Omit<AlertProps, "locale" | "dismissible"> & Partial<Pick<AlertProps, "locale" | "dismissible">>): react_jsx_runtime.JSX.Element;
21
+
22
+ export { Alert, AlertProps };
@@ -1,2 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { A as AlertProps } from '../Alert.schema-BQsZGG6P.js';
3
+ export { a as AlertPropsSchema, v as validateAlertProps } from '../Alert.schema-BQsZGG6P.js';
4
+ export { C as ConfirmModal, a as ConfirmModalProps } from '../ConfirmDialog-B3CQQGmJ.js';
5
+ import 'zod';
1
6
 
2
- export { }
7
+ /**
8
+ * Alert — persistent inline banner (React 19 implementation).
9
+ *
10
+ * Contrast with Toast: Alert is PERSISTENT (no auto-dismiss), inline in the
11
+ * document flow. Toast is ephemeral + portal-mounted.
12
+ *
13
+ * Accepts `Record<string, unknown>` for MCP postMessage injection safety.
14
+ * Zod validation narrows before render. Invalid props → accessible error span.
15
+ *
16
+ * WCAG-AA:
17
+ * - variant="error" → role="alert" + aria-live="assertive"
18
+ * - all others → role="status" + aria-live="polite"
19
+ */
20
+ declare function Alert(raw: Omit<AlertProps, "locale" | "dismissible"> & Partial<Pick<AlertProps, "locale" | "dismissible">>): react_jsx_runtime.JSX.Element;
21
+
22
+ export { Alert, AlertProps };