@vantageos/mosaic 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/README.md +193 -0
  3. package/dist/Alert.schema-LPJE5gFP.d.cts +71 -0
  4. package/dist/Alert.schema-LPJE5gFP.d.ts +71 -0
  5. package/dist/ConfirmDialog-B3CQQGmJ.d.cts +34 -0
  6. package/dist/ConfirmDialog-B3CQQGmJ.d.ts +34 -0
  7. package/dist/MarkdownRenderer.schema-Rx7kIeVA.d.cts +22 -0
  8. package/dist/MarkdownRenderer.schema-Rx7kIeVA.d.ts +22 -0
  9. package/dist/ProgressBar.schema-CdVYx0Wq.d.cts +22 -0
  10. package/dist/ProgressBar.schema-CdVYx0Wq.d.ts +22 -0
  11. package/dist/StatusBadge.schema-1tOjB4Ir.d.cts +22 -0
  12. package/dist/StatusBadge.schema-1tOjB4Ir.d.ts +22 -0
  13. package/dist/Tabs.schema-BzcEyeq8.d.cts +79 -0
  14. package/dist/Tabs.schema-BzcEyeq8.d.ts +79 -0
  15. package/dist/artifacts.cjs +144 -2
  16. package/dist/artifacts.cjs.map +1 -1
  17. package/dist/artifacts.d.cts +3 -21
  18. package/dist/artifacts.d.ts +3 -21
  19. package/dist/artifacts.js +144 -2
  20. package/dist/artifacts.js.map +1 -1
  21. package/dist/confirmation.cjs +168 -2
  22. package/dist/confirmation.cjs.map +1 -1
  23. package/dist/confirmation.d.cts +24 -20
  24. package/dist/confirmation.d.ts +24 -20
  25. package/dist/confirmation.js +165 -3
  26. package/dist/confirmation.js.map +1 -1
  27. package/dist/display.cjs +272 -2
  28. package/dist/display.cjs.map +1 -1
  29. package/dist/display.d.cts +132 -1
  30. package/dist/display.d.ts +132 -1
  31. package/dist/display.js +267 -3
  32. package/dist/display.js.map +1 -1
  33. package/dist/forms.cjs +1415 -0
  34. package/dist/forms.cjs.map +1 -0
  35. package/dist/forms.d.cts +159 -0
  36. package/dist/forms.d.ts +159 -0
  37. package/dist/forms.js +1334 -0
  38. package/dist/forms.js.map +1 -0
  39. package/dist/index-CwXVgtGb.d.cts +917 -0
  40. package/dist/index-CwXVgtGb.d.ts +917 -0
  41. package/dist/index.cjs +315 -2
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +11 -6
  44. package/dist/index.d.ts +11 -6
  45. package/dist/index.js +304 -3
  46. package/dist/index.js.map +1 -1
  47. package/dist/input.cjs +19 -0
  48. package/dist/input.cjs.map +1 -1
  49. package/dist/input.d.cts +4 -34
  50. package/dist/input.d.ts +4 -34
  51. package/dist/input.js +18 -1
  52. package/dist/input.js.map +1 -1
  53. package/dist/media.cjs +144 -2
  54. package/dist/media.cjs.map +1 -1
  55. package/dist/media.d.cts +3 -21
  56. package/dist/media.d.ts +3 -21
  57. package/dist/media.js +144 -2
  58. package/dist/media.js.map +1 -1
  59. package/dist/preact/artifacts.d.ts +39 -1
  60. package/dist/preact/artifacts.js +234 -0
  61. package/dist/preact/artifacts.js.map +1 -1
  62. package/dist/preact/confirmation.d.ts +115 -1
  63. package/dist/preact/confirmation.js +503 -0
  64. package/dist/preact/confirmation.js.map +1 -1
  65. package/dist/preact/display.d.ts +366 -1
  66. package/dist/preact/display.js +774 -0
  67. package/dist/preact/display.js.map +1 -1
  68. package/dist/preact/forms.d.ts +875 -0
  69. package/dist/preact/forms.js +1326 -0
  70. package/dist/preact/forms.js.map +1 -0
  71. package/dist/preact/input.d.ts +88 -1
  72. package/dist/preact/input.js +194 -0
  73. package/dist/preact/input.js.map +1 -1
  74. package/dist/preact/progress.d.ts +35 -1
  75. package/dist/preact/progress.js +263 -0
  76. package/dist/preact/progress.js.map +1 -1
  77. package/dist/progress.cjs +144 -2
  78. package/dist/progress.cjs.map +1 -1
  79. package/dist/progress.d.cts +3 -21
  80. package/dist/progress.d.ts +3 -21
  81. package/dist/progress.js +144 -2
  82. package/dist/progress.js.map +1 -1
  83. package/dist/react/artifacts.cjs +241 -0
  84. package/dist/react/artifacts.cjs.map +1 -1
  85. package/dist/react/artifacts.d.cts +20 -1
  86. package/dist/react/artifacts.d.ts +20 -1
  87. package/dist/react/artifacts.js +234 -0
  88. package/dist/react/artifacts.js.map +1 -1
  89. package/dist/react/confirmation.cjs +513 -0
  90. package/dist/react/confirmation.cjs.map +1 -1
  91. package/dist/react/confirmation.d.cts +21 -1
  92. package/dist/react/confirmation.d.ts +21 -1
  93. package/dist/react/confirmation.js +503 -0
  94. package/dist/react/confirmation.js.map +1 -1
  95. package/dist/react/display.cjs +788 -0
  96. package/dist/react/display.cjs.map +1 -1
  97. package/dist/react/display.d.cts +129 -1
  98. package/dist/react/display.d.ts +129 -1
  99. package/dist/react/display.js +771 -0
  100. package/dist/react/display.js.map +1 -1
  101. package/dist/react/forms.cjs +1387 -0
  102. package/dist/react/forms.cjs.map +1 -0
  103. package/dist/react/forms.d.cts +5 -0
  104. package/dist/react/forms.d.ts +5 -0
  105. package/dist/react/forms.js +1326 -0
  106. package/dist/react/forms.js.map +1 -0
  107. package/dist/react/input.cjs +197 -0
  108. package/dist/react/input.cjs.map +1 -1
  109. package/dist/react/input.d.cts +13 -1
  110. package/dist/react/input.d.ts +13 -1
  111. package/dist/react/input.js +194 -0
  112. package/dist/react/input.js.map +1 -1
  113. package/dist/react/progress.cjs +266 -0
  114. package/dist/react/progress.cjs.map +1 -1
  115. package/dist/react/progress.d.cts +17 -1
  116. package/dist/react/progress.d.ts +17 -1
  117. package/dist/react/progress.js +263 -0
  118. package/dist/react/progress.js.map +1 -1
  119. package/package.json +87 -61
  120. package/registry.yaml +167 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,145 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@vantageos/mosaic` are documented in this file.
4
+
5
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
+ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ---
9
+
10
+ ## [Unreleased]
11
+
12
+ ### Added
13
+ - **D-PR1 — Pre-publish dry-run evidence for v0.3.0 GA.** New doc `docs/D-PR1-PRE-PUBLISH-DRY-RUN-V0.3.0.md` (bilingual EN+FR) capturing the hard-evidence pre-publish gate run in a fresh sandbox worktree off `origin/main` @ `7ae5450`: sandbox build-pass (RULE #19, `SANDBOX_BUILD_PASS_ID=7ae5450`, build exit 0), Gate 1 build-parity (exit 0), `npm pack --dry-run` (150 files / 511.8 kB / unpacked 3.0 MB / version 0.3.0 / sha `31caed2f`, CHANGELOG + README + package.json + registry.yaml + full `dist/` surface present — **no real publish**), corrected vendored cross-runtime subpath coverage gate (`--ga-mode`, exit 0, 0 missing), and the full gate set re-run green (tsc, biome, vitest 854, playwright-axe 29, size-limit, registry-drift, storybook-test 103, Gate 2 peer-resolution, Gate 3 coherence 10). Documents the **D-T1 blocker**: the canonical B-PR1 skill / B-PR2 publish hook carry a category-prefixed layout defect (`./forms/react`) vs Mosaic's runtime-prefixed layout (`./react/forms`) and **false-block** the real publish — must be fixed before `tag v0.3.0` (Sigma task `k176e5rpz`); plus `ETA_APPROVED_TASK_ID` must be set after Eta approval. Mission `k57b6d1b` · task `k177e1wr`. No source/build/gate code changed — docs-only.
14
+ - **CI Gate 4 — Cross-runtime subpath coverage (B-PR3).** New fail-fast CI gate asserting that **every bare component category** in `packages/mosaic/package.json` `exports` (`./forms`, `./progress`, `./display`, `./artifacts`, `./confirmation`, `./media`, `./input`) also exports a **non-empty** `dist` artifact under **both** `./react/<cat>` and `./preact/<cat>`. This is the gate that would have caught the original v0.3.0 GA blocker (foundation components present as bare exports but missing/empty under `/react` + `/preact`).
15
+ - New vendored script `packages/mosaic/scripts/cross-runtime-subpath-coverage-check.py` — vendored from the canonical B-PR1 skill `mosaic-cross-runtime-subpath-coverage-check` (VantageRegistry; PR #20). Stdlib-only, with an optional PyYAML registry cross-check that degrades gracefully when PyYAML is absent (no Python dependency added to CI). Carries one documented deviation: a `RUNTIME_PREFIXED` toggle adapting the canonical category-prefixed layout (`./forms/react`) to this repo's runtime-prefixed layout (`./react/forms`).
16
+ - New job `cross-runtime-subpath-coverage` (`needs: build-parity-cross-runtime`) builds tokens + mosaic so `dist/` exists, then runs `python3 .../cross-runtime-subpath-coverage-check.py --package-root packages/mosaic --ga-mode` (exit 1 fails CI with a `component × runtime` diagnostic). CI-side equivalent of the B-PR2 npm-publish hook.
17
+ - New doc `docs/CROSS-RUNTIME-GATE.md` (bilingual EN+FR). Additive change — no existing gate (Gate 1 build-parity, Gate 2 peerDeps smoke, Gate 3 coherence, `ci` job) weakened or replaced. Mission `k57b6d1b` · task `k176pzsszyy4v3f505khwg33gx88j36n`.
18
+ - Wave 3 components TBD (DatePicker, Avatar, FilterChip, Pagination — demand-driven T21+).
19
+
20
+ ### Fixed
21
+ - CI Gate 2 (PeerDeps optionality smoke) now runs GREEN (unblocks v0.3.0 GA publish gate). Two layered bugs, both packaging-scope:
22
+ - **Build (tsup):** the preact runtime bundles that re-export the shared React implementation (`preact/progress`, `preact/input`, `preact/confirmation`, `preact/forms`) shipped `import … from "react/jsx-runtime"` and `import … from "react"`. `esbuildOptions.alias` (`react → preact/compat`) never fired because tsup auto-externalises peerDeps (`react`, `react/jsx-runtime`) *before* alias resolution, so the alias was a no-op for those specifiers. A react-only consumer (which has react) could therefore resolve `@vantageos/mosaic/preact/*` even with preact absent — optionality broken in both directions. Fix: replaced the alias with an esbuild `onResolve` plugin (`mosaic-react-to-preact`) that deterministically rewrites the whole react family (`react`, `react-dom`, `react-dom/client`, `react/jsx-runtime`, `react/jsx-dev-runtime`) to their preact equivalents and marks them external; paired with `noExternal: [/^react…/]` on the preact pass so tsup's own external plugin returns undefined for the react family and lets the rewrite run. Added `preact/jsx-runtime` to `PREACT_EXTERNAL`. Preact bundles now import only preact specifiers; react bundles unchanged.
23
+ - **Smoke fixture (run-smoke.sh):** the fixtures installed mosaic via `npm install file:../../../packages/mosaic`, which npm symlinks into the monorepo source tree; Node then resolved the bundle's runtime imports by climbing out of the fixture into the monorepo root `node_modules` (where both react and preact are hoisted devDeps), producing a false PASS. Rewrote the driver to model a real npm consumer faithfully: `pnpm pack` both packages (rewriting the `workspace:*` tokens dep to a concrete version) and install the tarballs into an isolated `mktemp -d` consumer outside the repo tree, with `--legacy-peer-deps` so npm does not auto-install the *transitive* peer react pulled by `@tanstack/react-virtual` into a preact-only consumer. Fixture assertions (`index.mjs`) untouched. Smoke now PASSES: react-only resolves `react/*` and fails `preact/*`; preact-only resolves `preact/*` and fails `react/*`.
24
+ - CI `biome check --error-on-warnings` now exits 0 on `main` (unblocks v0.3.0 GA publish gate): suppressed 6 `noNonNullAssertion` lint errors in VirtualList tests (React + Preact) with justified `biome-ignore` comments matching repo convention, plus format/organizeImports auto-fixes across 7 files.
25
+ - `forms/Select.tsx` (React + Preact) biome a11y gate: replaced the blanket `biome.json` per-file rule override with scoped, justified `biome-ignore` comments on exactly the 6 flagged ARIA roles per runtime (`useSemanticElements` on the `combobox`/`listbox`/`option` roles, `noNoninteractiveElementToInteractiveRole` on `ul`→`listbox` + `li`→`option`, `useFocusableInteractive` on the `li`). These are biome heuristic false-positives on the WAI-ARIA APG combobox + listbox pattern (options managed via `aria-activedescendant`, intentionally not in the tab order). Comments mirror the existing `noAutofocus` APG-pattern suppression; no JSX/logic changed. Added `tests/a11y/Select.spec.ts` (axe-core) proving 0 violations on the pattern.
26
+ - CI `playwright-axe` step now runs GREEN (unblocks v0.3.0 GA `npm-publish` gate, which is `needs: ci`). Root cause from real CI logs: the runner ships no browsers, so every a11y spec died at `browserType.launch` ("Executable doesn't exist"). Fixes: (1) added a `playwright install --with-deps chromium` step before `playwright-axe` in `.github/workflows/ci.yml`; (2) normalized the stale `/storybook/?story=` spec URLs (StatusBadge, MarkdownRenderer, ConfirmDialog, TokenDisplayOnceModal, ProgressBar) to the working `/iframe.html?id=` convention used by `Select.spec.ts`, corrected three wrong story-id slugs (`media-statusbadge--error-state`, `artifacts-markdownrenderer--error-state`, `progress-progressbar--default`), and scoped axe to `#storybook-root` so the Storybook iframe shell's page-level best-practice rules no longer mask component results; (3) `TableView.spec.ts` now waits via `getByRole("table")` (matches the native `<table>` implicit role; the CSS `[role="table"]` selector never matched) and scopes axe to `#storybook-root`.
27
+ - `display/TableView.tsx`: fixed a real axe violation (`scrollable-region-focusable`, WCAG 2.1.1 / 2.1.3, serious) — the virtualized scroll viewport is scrollable but was not keyboard-operable. Added `tabIndex={0}` + `role="region"` + `aria-label` (justified `biome-ignore` comments matching repo convention). Full `tests/a11y/` suite now passes 29/29 with axe 0 violations under `CI=true` against the Playwright `webServer`.
28
+
29
+ ---
30
+
31
+ ## [0.3.0] — GA — 2026-06-13
32
+
33
+ ### Added
34
+ - All Wave 1 + Wave 2 components promoted from `0.3.0-alpha.1` with no breaking API changes.
35
+ - `forms` category becomes stable (7th top-level taxonomy bucket).
36
+
37
+ ---
38
+
39
+ ## [0.3.0-alpha.1] — 2026-06-11
40
+
41
+ ### Added
42
+ - **`RadioGroup`** (Wave 2 T17) — WCAG-AA mutually exclusive single-choice form primitive. Cross-runtime: `@vantageos/mosaic/react/forms` + `@vantageos/mosaic/preact/forms`. Roving tabindex (WAI-ARIA §3.10), Arrow/Home/End keyboard navigation, `aria-orientation`, group-level and per-option disabled.
43
+ - **`Select`** (Wave 2 T13) — single-select dropdown implementing the ARIA combobox+listbox pattern (APG 2024). Optional in-popup search. ArrowUp/Down/Home/End/Enter/Escape/type-ahead keyboard navigation. Shared pure logic (`Select.logic.ts`) referenced by both runtimes.
44
+ - **`MultiSelect`** (Wave 2 T15) — multi-value dropdown with removable chips. `aria-multiselectable`, per-chip `aria-label="Remove {label}"`, `maxItems` gate, searchable filter, Backspace removes last chip.
45
+ - **`Textarea`** (Wave 2 T12) — multi-line text input with optional `autoResize` (grow-to-fit) and `maxLength` clamping enforced at the `onChange` boundary before RHF receives the value.
46
+ - **`Input`** (Wave 2 T11) — first field primitive of the `forms` category. Five HTML input types (`text | email | password | number | url`). `aria-invalid` + `aria-describedby` wired automatically.
47
+ - **`Checkbox`** (Wave 2 T14) — boolean checkbox with `indeterminate` state (DOM `.indeterminate = true` + `aria-checked="mixed"`), optional `description` wired to `aria-describedby`.
48
+ - **`FieldArray`** (Wave 2 T16) — render-prop wrapper around RHF `useFieldArray`. Keys rows by stable `field.id` (not array index). Provides `append / remove / move / swap / insert / prepend / replace / update`. WCAG-AA `role="list"` + `role="listitem"` container.
49
+ - **`ConfirmModal`** alias (Wave 1 T9-v2) — thin re-export of `ConfirmDialog` on `@vantageos/mosaic/react/confirmation` and `@vantageos/mosaic/preact/confirmation`. Referential identity invariant (`ConfirmModal === ConfirmDialog`) enforced by tests.
50
+ - **`VirtualList<T>`** (Wave 1 T2) — generic virtualized list using `@tanstack/react-virtual` v3. API: `items`, `itemHeight`, `estimateSize`, `renderItem`, `onRowClick`, `overscan`, `className`, `locale`. WCAG-AA when `onRowClick` present (`role="button"`, `tabIndex={0}`, Enter/Space handlers). Bilingual empty state (EN/FR).
51
+ - **`forms` category** (Wave 2 T10 scaffold) — 7th top-level taxonomy bucket. Five scaffold primitives: `useMosaicForm`, `FormProvider`, `FormField`, `ErrorDisplay`, `SubmitButton`. Default validation mode `"onBlur"`. Subpaths: `@vantageos/mosaic/react/forms`, `@vantageos/mosaic/preact/forms`, `@vantageos/mosaic/forms` (back-compat root).
52
+ - `react-hook-form ^7.54.0` and `@hookform/resolvers ^3.10.0` added as optional peer dependencies.
53
+ - `./forms`, `./react/forms`, `./preact/forms` subpath exports added.
54
+
55
+ ### Fixed
56
+ - Cascade-merge build break (hotfix 2026-06-11): restored JSDoc openers, deduped barrel re-exports, dropped phantom `Badge` refs, added missing `Skeleton` i18n strings.
57
+
58
+ ### Wave 1 additions (also shipping in 0.3.0-alpha.1 codebase)
59
+ - **`Tabs`** (T5) — cross-runtime React 19 + Preact 10, WCAG-AA.
60
+ - **`Alert`** (T8) — persistent inline banner (React 19 + Preact 10).
61
+ - **`Toast`** (T3) — ephemeral notification (confirmation category, Chi+Hermes convergence).
62
+ - **`Skeleton`** (T6) — loading placeholder (React 19 + Preact 10).
63
+ - **`EmptyState`** (T7) — empty list / zero-data state (display category, Hermes+Chi convergence).
64
+ - Three new CI gate jobs wired into `ci.yml` per Standard v1.2 §20.
65
+
66
+ ---
67
+
68
+ ## [0.2.2] — 2026-06-11
69
+
70
+ ### Fixed
71
+ - **Critical — §18.5 type surface contract**: `tsup.config.ts` react pass changed from `clean: true` to `clean: false`. The three sibling tsup configs (react / preact / tokens re-export) ran their DTS phases in parallel; the react DTS pass finished last and previously wiped `dist/preact/*.d.ts` and `dist/tokens.d.ts` written by the sibling passes. All DTS files now persist on disk.
72
+ - Added `prebuild` script (`node -e "fs.rmSync('dist',{recursive:true,force:true})"`) to guarantee a clean `dist` before tsup runs, replacing the racy in-pass `clean: true`.
73
+
74
+ ---
75
+
76
+ ## [0.2.1] — 2026-06-11 (YANKED — superseded by 0.2.2)
77
+
78
+ ### Added
79
+ - `TableView.onRowClick(row, index)` and `StreamingTableView.onRowClick` — when provided, rows render with `role="button"`, `tabIndex={0}`, and Enter/Space keyboard handlers. Fixes 5-BU ABSOLUTE blocker (Phi + Chi + Theta + Hermes + Demeter).
80
+
81
+ ### Notes
82
+ - 100% back-compat with v0.2.0: when `onRowClick` is undefined, row rendering is byte-identical to v0.2.0.
83
+
84
+ ---
85
+
86
+ ## [0.2.0] — 2026-06-02
87
+
88
+ ### Added
89
+ - **Cross-runtime subpaths** — `@vantageos/mosaic/react/<cat>` (React 19) and `@vantageos/mosaic/preact/<cat>` (Preact 10) for all 6 categories (`progress`, `input`, `display`, `artifacts`, `confirmation`, `media`). Path A architecture (single package, multi-runtime subpaths) replaces forked maintenance.
90
+ - **`@vantageos/mosaic/tokens` subpath** — convenience re-export of `@vantageos/mosaic-tokens`.
91
+ - **tsup three sibling configs** — react pass (legacy v0.1.2 entries + new `react/<cat>`), preact pass (`preact/<cat>` ESM-only with esbuild `alias` mapping `react` → `preact/compat`), tokens re-export shim.
92
+ - **`preact ^10.25.0`** added to peerDependencies. All peer deps (`react`, `react-dom`, `preact`, `react-i18next`, `@mcp-ui/client`, `rxjs`) marked optional via `peerDependenciesMeta`.
93
+ - **`@vantageos/mosaic-tokens`** (new sibling package) — 58 framework-free design tokens across 6 categories: 15 colors (OKLCH × 3 shades × 5 statuses), 8 spacing values, 14 typography vars, 6 shadows, 7 radii, 8 motion. Three surfaces: CSS custom properties, typed JS exports, Tailwind v4 plugin.
94
+
95
+ ### Changed
96
+ - Standard §18 "Cross-Runtime Support (v0.2.0 amendment)" published to `mosaic-architecture-standard-v1.md` documenting the A1 architecture, exports surface table, peerDependenciesMeta model, bundle targets, new CI gates, compatibility commitments, and per-BU migration guide.
97
+
98
+ ---
99
+
100
+ ## [0.1.2] — 2026-06-02
101
+
102
+ ### Added
103
+ - Per-component subpath exports: `@vantageos/mosaic/progress`, `/input`, `/display`, `/artifacts`, `/confirmation`, `/media`, `/server`.
104
+ - `TableView` static rows array overload — accepts `rows: Row[]` for already-fetched data. Streaming variant renamed to `StreamingTableView` with `rows$: Observable`.
105
+
106
+ ### Fixed
107
+ - Removed `recharts` from dependencies (unused in v0.1.0 — will re-add as optional peer when Chart component lands).
108
+ - Moved `rxjs` from dependencies → optional peerDependencies.
109
+
110
+ ### Migration from 0.1.1
111
+ - Root imports (`import { Foo } from '@vantageos/mosaic'`) still work — root export preserved.
112
+ - For optimal tree-shaking, switch to subpath: `import { ProgressBar } from '@vantageos/mosaic/progress'`.
113
+ - Streaming usage: rename `<TableView rows$={obs}>` to `<StreamingTableView rows$={obs}>` and ensure `rxjs` is in your project deps.
114
+
115
+ ---
116
+
117
+ ## [0.1.1] — 2026-06-02
118
+
119
+ ### Added
120
+ - `no-hardcode-strings.test.ts` — vitest AST scan enforcing zero raw JSX text children with alphabetic content (Eta axis 6 CONDITION fix path).
121
+ - Whitelist mechanisms: same-line `// allow-hardcode-i18n: <reason>` comment and file-level `// allow-hardcode-i18n-file: <reason>` comment.
122
+ - Auto-exempt: `.test.tsx`, `.spec.tsx`, `.stories.tsx` files.
123
+
124
+ ---
125
+
126
+ ## [0.1.0] — 2026-05-28
127
+
128
+ ### Added
129
+ - Initial release — 6 consumer-driven MCP UI components: `MarkdownRenderer`, `TokenDisplayOnceModal`, `TableView`, `ConfirmDialog`, `StatusBadge`, `ProgressBar`.
130
+ - Monorepo scaffold: pnpm + turbo + 4 pattern infrastructure + CI gate.
131
+ - Zod runtime validation on all component props.
132
+ - `registry.yaml` with component catalogue.
133
+ - i18n consumer-driven model (zero hardcoded JSX text).
134
+
135
+ ---
136
+
137
+ [Unreleased]: https://github.com/elpiarthera/vantageos-mosaic/compare/v0.3.0...HEAD
138
+ [0.3.0]: https://github.com/elpiarthera/vantageos-mosaic/compare/v0.2.2...v0.3.0
139
+ [0.3.0-alpha.1]: https://github.com/elpiarthera/vantageos-mosaic/compare/v0.2.2...v0.3.0-alpha.1
140
+ [0.2.2]: https://github.com/elpiarthera/vantageos-mosaic/compare/v0.2.1...v0.2.2
141
+ [0.2.1]: https://github.com/elpiarthera/vantageos-mosaic/compare/v0.2.0...v0.2.1
142
+ [0.2.0]: https://github.com/elpiarthera/vantageos-mosaic/compare/v0.1.2...v0.2.0
143
+ [0.1.2]: https://github.com/elpiarthera/vantageos-mosaic/compare/v0.1.1...v0.1.2
144
+ [0.1.1]: https://github.com/elpiarthera/vantageos-mosaic/compare/v0.1.0...v0.1.1
145
+ [0.1.0]: https://github.com/elpiarthera/vantageos-mosaic/releases/tag/v0.1.0
package/README.md CHANGED
@@ -14,6 +14,18 @@ npm install @vantageos/mosaic@^0.2.0 @vantageos/mosaic-tokens@^0.2.0 preact
14
14
 
15
15
  All runtime peers are marked optional via `peerDependenciesMeta` — install only what your runtime needs.
16
16
 
17
+ ## Build
18
+
19
+ ```sh
20
+ pnpm --filter @vantageos/mosaic build
21
+ ```
22
+
23
+ The `build` script prefixes `NODE_OPTIONS=--max-old-space-size=8192` automatically — no manual env export required.
24
+
25
+ **Why 8 GB heap?** tsup runs multiple parallel DTS (declaration emit) configs for cross-runtime outputs (React 19, Preact 10, server, tokens). Each TypeScript compiler worker holds the full type graph in memory. The combined peak exceeds Node's default 2 GB V8 limit, causing OOM crashes (`FATAL ERROR: Reached heap limit Allocation failed`). 8 GB gives adequate headroom on a standard CI runner (ubuntu-latest provides 16 GB RAM).
26
+
27
+ This constraint is codified locally via the `build` script (the `NODE_OPTIONS` prefix above), so it applies anywhere the script runs — including CI. Wiring it as an explicit job-level `env: NODE_OPTIONS` in `.github/workflows/ci.yml` for the build-bearing jobs (`build-parity-cross-runtime`, `peer-resolution-smoke`, `npm-publish`) is planned but not yet present.
28
+
17
29
  ## Surface
18
30
 
19
31
  | Subpath | Runtime | Use case |
@@ -52,6 +64,143 @@ export function MyComponent({ progress, label }: { progress: number; label: stri
52
64
  }
53
65
  ```
54
66
 
67
+ ## Forms (v0.3.0-alpha.1)
68
+
69
+ `@vantageos/mosaic/{react,preact}/forms` — composite form primitives wrapping `react-hook-form` + `@hookform/resolvers/zod`. Default validation mode is `onBlur` (Chi co-validated, Day 102 DM). Cross-runtime: same imports, React 19 path or Preact 10 path.
70
+
71
+ ### Install peers
72
+
73
+ ```sh
74
+ npm install react-hook-form@^7.54.0 @hookform/resolvers@^3.10.0
75
+ ```
76
+
77
+ Both peers are declared optional in `peerDependenciesMeta` — only install them if you use the forms surface.
78
+
79
+ ### Quick start
80
+
81
+ ```tsx
82
+ import { z } from "zod";
83
+ import {
84
+ useMosaicForm,
85
+ FormProvider,
86
+ FormField,
87
+ ErrorDisplay,
88
+ SubmitButton,
89
+ } from "@vantageos/mosaic/react/forms";
90
+
91
+ const schema = z.object({
92
+ email: z.string().email("Invalid email"),
93
+ age: z.number().min(18, "Must be 18+"),
94
+ });
95
+
96
+ export function SignupForm({ onSubmit }: { onSubmit: (data: z.infer<typeof schema>) => void }) {
97
+ const form = useMosaicForm({
98
+ schema,
99
+ defaultValues: { email: "", age: 0 },
100
+ // mode defaults to "onBlur" — Mosaic doctrine
101
+ });
102
+
103
+ return (
104
+ <FormProvider form={form}>
105
+ <form onSubmit={form.handleSubmit(onSubmit)}>
106
+ <FormField name="email">
107
+ {({ field, fieldState }) => (
108
+ <label>
109
+ Email
110
+ <input {...field} value={(field.value as string) ?? ""} />
111
+ <ErrorDisplay error={fieldState.error} />
112
+ </label>
113
+ )}
114
+ </FormField>
115
+ <SubmitButton label="Sign up" />
116
+ </form>
117
+ </FormProvider>
118
+ );
119
+ }
120
+ ```
121
+
122
+ ### Surface
123
+
124
+ | Export | Purpose |
125
+ |---|---|
126
+ | `useMosaicForm({ schema, defaultValues, mode? })` | Wrapper around `useForm` + `zodResolver`. Returns RHF's `UseFormReturn` extended with `mosaicSchema` + `mosaicMode`. |
127
+ | `<FormProvider form={...}>` | Wraps RHF's `FormProvider` AND a Mosaic-specific context. Use `useMosaicFormContext()` inside descendants. |
128
+ | `<FormField name="...">{({ field, fieldState, formState }) => ...}</FormField>` | Render-prop wrapper around RHF's `Controller`. |
129
+ | `<ErrorDisplay error={...} messageMap={...} />` | Single-field error formatter. Renders nothing when no error. Priority: `error.message` → `messageMap[type]` → generic fallback. |
130
+ | `<SubmitButton label="..." loadingLabel="..." />` | Bound to the surrounding `FormProvider`. Disabled while invalid OR submitting. |
131
+ | `<Input name="..." type="text\|email\|password\|number\|url" label="..." placeholder? disabled? autoComplete? />` | Single-field `<input>` bound to the surrounding `FormProvider`. `label` is required (consumer-driven i18n). Emits `aria-invalid` + `aria-describedby` on validation error. |
132
+
133
+ Field primitives (Textarea, Select, Checkbox, MultiSelect, RadioGroup, FieldArray) land in T12-T20 — see `docs/v0.3.0-plan.md` §7.
134
+ | `<Textarea name="..." rows? maxLength? autoResize? placeholder? disabled? label? />` | Multi-line text input field primitive. `rows` default 3, `maxLength` enforced via shared logic gate, optional `autoResize` grows to content. `aria-invalid` + `aria-describedby` on error. |
135
+
136
+ Remaining field primitives (Input shipped T11, Select, Checkbox, MultiSelect, RadioGroup, FieldArray) land in T13-T20 — see `docs/v0.3.0-plan.md` §7.
137
+ | `useFieldArray({ name, control? })` | Thin wrapper around RHF's `useFieldArray`. Returns `{ fields, append, remove, move, swap }` + the rest of RHF's native return for advanced cases. Reads `control` from `FormProvider` when omitted. |
138
+ | `<FieldArray name="...">{({ field, index }, { append, remove, move, swap, fields }) => ...}</FieldArray>` | Render-prop wrapper around `useFieldArray`. Emits `role="list"` shell + `role="listitem"` per row, keyed by RHF's stable `field.id` (NOT array index). Powers PromptForm Add Variable, Hermes variable mappings, Demeter filter chips. |
139
+
140
+ | `<Checkbox name="..." label="..." indeterminate? description? disabled? />` | Boolean checkbox primitive. `indeterminate=true` → `aria-checked="mixed"` + DOM `.indeterminate=true` via ref. `description` wired via `aria-describedby`. `aria-invalid` + `aria-describedby` on error. |
141
+ | `<RadioGroup name="..." label="..." options={[...]} orientation? disabled? />` | WCAG-AA radiogroup. Roving tabIndex, Arrow key selection sync, Home/End, Space/Enter. |
142
+
143
+ Remaining field primitives (Input, Textarea, Select, MultiSelect) land in T11-T15 + T18-T20 — see `docs/v0.3.0-plan.md` §7.
144
+
145
+ ### RadioGroup
146
+
147
+ Mutually exclusive single-choice field. Keyboard navigation follows WAI-ARIA radiogroup pattern (§3.10): Arrow keys move focus AND select simultaneously (roving tabindex). Disabled options are skipped during navigation.
148
+
149
+ ```tsx
150
+ import { z } from "zod";
151
+ import {
152
+ useMosaicForm,
153
+ FormProvider,
154
+ RadioGroup,
155
+ } from "@vantageos/mosaic/react/forms";
156
+
157
+ const schema = z.object({
158
+ plan: z.string().min(1, "Please select a plan"),
159
+ });
160
+
161
+ export function PlanSelector() {
162
+ const form = useMosaicForm({
163
+ schema,
164
+ defaultValues: { plan: "" },
165
+ });
166
+
167
+ return (
168
+ <FormProvider form={form}>
169
+ <form onSubmit={form.handleSubmit(console.log)}>
170
+ <RadioGroup
171
+ name="plan"
172
+ label="Select a plan"
173
+ options={[
174
+ { value: "free", label: "Free", description: "Up to 3 projects" },
175
+ { value: "pro", label: "Pro", description: "Unlimited projects" },
176
+ { value: "team", label: "Team", description: "Multi-user", disabled: false },
177
+ ]}
178
+ orientation="vertical"
179
+ />
180
+ </form>
181
+ </FormProvider>
182
+ );
183
+ }
184
+ ```
185
+
186
+ **WCAG-AA contract:**
187
+ - `role="radiogroup"` + `aria-labelledby` on container
188
+ - `role="radio"` + `aria-checked` + roving `tabIndex` per option
189
+ - `aria-labelledby` per option → its visible label span
190
+ - `aria-describedby` per option → its description span (when present)
191
+ - `aria-disabled` on disabled options; disabled options skipped in arrow nav
192
+ - `aria-orientation` reflects `orientation` prop
193
+
194
+ Field primitives (Textarea, Select, MultiSelect, RadioGroup, FieldArray) land in T12-T20 — see `docs/v0.3.0-plan.md` §7.
195
+ | `<MultiSelect name="..." label="..." options={...} placeholder? disabled? searchable? maxItems? />` | Multi-value dropdown. RHF value is `string[]`. Selected items render as removable chips (Backspace/Delete on trigger removes last, per-chip × removes specific). WCAG-AA combobox (`role=combobox aria-multiselectable=true`), Arrow/Enter keyboard nav, optional case-insensitive search, optional `maxItems` cap. |
196
+
197
+ Remaining field primitives (Input + Textarea + MultiSelect shipped T11/T12/T15; Select, Checkbox, RadioGroup, FieldArray) land in T13-T20 — see `docs/v0.3.0-plan.md` §7.
198
+ | `<Select name="..." label="..." options={[...]} />` | Single-select dropdown (combobox+listbox APG). Optional `searchable` prop enables in-popup filter. Full keyboard nav + type-ahead. WCAG-AA strict. |
199
+
200
+ Field primitives (Input, Textarea, Checkbox, MultiSelect, RadioGroup, FieldArray) land in T11, T14-T20 — see `docs/v0.3.0-plan.md` §7.
201
+
202
+
203
+
55
204
  ## Server (MCP UI)
56
205
 
57
206
  ```ts
@@ -64,6 +213,50 @@ const resource = createMosaicResource({
64
213
  // returns a SEP-1865-compliant MCP UI resource with text/html;profile=mcp-app MIME
65
214
  ```
66
215
 
216
+
217
+ ## Components
218
+
219
+ ### Display
220
+
221
+ #### VirtualList
222
+
223
+ Generic virtualized list for large datasets. Uses @tanstack/react-virtual v3 (already bundled via TableView). Cross-runtime: React 19 + Preact 10.
224
+
225
+ ```tsx
226
+ import { VirtualList } from "@vantageos/mosaic/react/display";
227
+ // Preact: import { VirtualList } from "@vantageos/mosaic/preact/display";
228
+
229
+ type Task = { id: string; title: string; status: string };
230
+
231
+ <VirtualList<Task>
232
+ items={tasks}
233
+ itemHeight={56} // fixed px height
234
+ renderItem={(task, index) => (
235
+ <div key={task.id}>
236
+ <span>{task.title}</span>
237
+ <span>{task.status}</span>
238
+ </div>
239
+ )}
240
+ onRowClick={(task, index) => router.push('/tasks/' + task.id)}
241
+ overscan={5} // rows outside viewport (default 5)
242
+ className="task-list"
243
+ locale="en" // "en" | "fr"
244
+ />
245
+ ```
246
+
247
+ **Props**
248
+
249
+ | Prop | Type | Default | Description |
250
+ |---|---|---|---|
251
+ | `items` | `T[]` | required | Items to render |
252
+ | `itemHeight` | `number` | -- | Fixed row height px (mutually exclusive with `estimateSize`) |
253
+ | `estimateSize` | `(index) => number` | -- | Variable height estimator |
254
+ | `renderItem` | `(item: T, index: number) => ReactNode` | required | Row renderer |
255
+ | `onRowClick` | `(item: T, index: number) => void` | `undefined` | Click handler — triggers WCAG-AA a11y (role=button + tabIndex=0 + Enter/Space) |
256
+ | `overscan` | `number` | `5` | Rows outside visible area |
257
+ | `className` | `string` | `undefined` | CSS class on scroll container |
258
+ | `locale` | `"en" or "fr"` | `"en"` | Built-in string locale |
259
+
67
260
  ## Doctrine
68
261
 
69
262
  - **Pattern 1 (Zod runtime validation)** — every component validates props at the MCP host boundary; invalid props render an a11y fallback (`role="alert"`), never white-screen.
@@ -0,0 +1,71 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { z } from 'zod';
3
+
4
+ declare const TokenDisplayOnceModalPropsSchema: z.ZodObject<{
5
+ token: z.ZodString;
6
+ title: z.ZodString;
7
+ warningMessage: z.ZodString;
8
+ copyLabel: z.ZodString;
9
+ closeLabel: z.ZodString;
10
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ locale: "en" | "fr";
13
+ title: string;
14
+ token: string;
15
+ warningMessage: string;
16
+ copyLabel: string;
17
+ closeLabel: string;
18
+ }, {
19
+ title: string;
20
+ token: string;
21
+ warningMessage: string;
22
+ copyLabel: string;
23
+ closeLabel: string;
24
+ locale?: "en" | "fr" | undefined;
25
+ }>;
26
+ type TokenDisplayOnceModalProps = z.infer<typeof TokenDisplayOnceModalPropsSchema> & {
27
+ onClose: () => void;
28
+ };
29
+ declare function validateTokenDisplayOnceModalProps(raw: unknown): z.infer<typeof TokenDisplayOnceModalPropsSchema>;
30
+
31
+ declare function TokenDisplayOnceModal(raw: Omit<TokenDisplayOnceModalProps, "locale"> & Partial<Pick<TokenDisplayOnceModalProps, "locale">>): react_jsx_runtime.JSX.Element | null;
32
+
33
+ /**
34
+ * Alert component props schema.
35
+ *
36
+ * Persistent inline banner (vs Toast which is ephemeral + auto-dismissing).
37
+ *
38
+ * variant — controls visual style + ARIA role auto-assignment:
39
+ * "error" → role="alert" (assertive, interrupts screen reader)
40
+ * all others → role="status" (polite, non-intrusive)
41
+ * title — consumer-driven; caller passes already-localized string
42
+ * description — optional supporting text beneath the title
43
+ * dismissible — when true, renders a dismiss button (default: false)
44
+ * onDismiss — callback fired when dismiss button is clicked
45
+ * locale — controls dismiss button aria-label language
46
+ */
47
+ declare const AlertPropsSchema: z.ZodObject<{
48
+ variant: z.ZodEnum<["success", "error", "info", "warning"]>;
49
+ title: z.ZodString;
50
+ description: z.ZodOptional<z.ZodString>;
51
+ dismissible: z.ZodDefault<z.ZodBoolean>;
52
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
53
+ }, "strip", z.ZodTypeAny, {
54
+ locale: "en" | "fr";
55
+ title: string;
56
+ variant: "warning" | "error" | "success" | "info";
57
+ dismissible: boolean;
58
+ description?: string | undefined;
59
+ }, {
60
+ title: string;
61
+ variant: "warning" | "error" | "success" | "info";
62
+ locale?: "en" | "fr" | undefined;
63
+ description?: string | undefined;
64
+ dismissible?: boolean | undefined;
65
+ }>;
66
+ type AlertProps = z.infer<typeof AlertPropsSchema> & {
67
+ onDismiss?: () => void;
68
+ };
69
+ declare function validateAlertProps(raw: unknown): z.infer<typeof AlertPropsSchema>;
70
+
71
+ export { type AlertProps as A, TokenDisplayOnceModal as T, AlertPropsSchema as a, type TokenDisplayOnceModalProps as b, TokenDisplayOnceModalPropsSchema as c, validateTokenDisplayOnceModalProps as d, validateAlertProps as v };
@@ -0,0 +1,71 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { z } from 'zod';
3
+
4
+ declare const TokenDisplayOnceModalPropsSchema: z.ZodObject<{
5
+ token: z.ZodString;
6
+ title: z.ZodString;
7
+ warningMessage: z.ZodString;
8
+ copyLabel: z.ZodString;
9
+ closeLabel: z.ZodString;
10
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ locale: "en" | "fr";
13
+ title: string;
14
+ token: string;
15
+ warningMessage: string;
16
+ copyLabel: string;
17
+ closeLabel: string;
18
+ }, {
19
+ title: string;
20
+ token: string;
21
+ warningMessage: string;
22
+ copyLabel: string;
23
+ closeLabel: string;
24
+ locale?: "en" | "fr" | undefined;
25
+ }>;
26
+ type TokenDisplayOnceModalProps = z.infer<typeof TokenDisplayOnceModalPropsSchema> & {
27
+ onClose: () => void;
28
+ };
29
+ declare function validateTokenDisplayOnceModalProps(raw: unknown): z.infer<typeof TokenDisplayOnceModalPropsSchema>;
30
+
31
+ declare function TokenDisplayOnceModal(raw: Omit<TokenDisplayOnceModalProps, "locale"> & Partial<Pick<TokenDisplayOnceModalProps, "locale">>): react_jsx_runtime.JSX.Element | null;
32
+
33
+ /**
34
+ * Alert component props schema.
35
+ *
36
+ * Persistent inline banner (vs Toast which is ephemeral + auto-dismissing).
37
+ *
38
+ * variant — controls visual style + ARIA role auto-assignment:
39
+ * "error" → role="alert" (assertive, interrupts screen reader)
40
+ * all others → role="status" (polite, non-intrusive)
41
+ * title — consumer-driven; caller passes already-localized string
42
+ * description — optional supporting text beneath the title
43
+ * dismissible — when true, renders a dismiss button (default: false)
44
+ * onDismiss — callback fired when dismiss button is clicked
45
+ * locale — controls dismiss button aria-label language
46
+ */
47
+ declare const AlertPropsSchema: z.ZodObject<{
48
+ variant: z.ZodEnum<["success", "error", "info", "warning"]>;
49
+ title: z.ZodString;
50
+ description: z.ZodOptional<z.ZodString>;
51
+ dismissible: z.ZodDefault<z.ZodBoolean>;
52
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
53
+ }, "strip", z.ZodTypeAny, {
54
+ locale: "en" | "fr";
55
+ title: string;
56
+ variant: "warning" | "error" | "success" | "info";
57
+ dismissible: boolean;
58
+ description?: string | undefined;
59
+ }, {
60
+ title: string;
61
+ variant: "warning" | "error" | "success" | "info";
62
+ locale?: "en" | "fr" | undefined;
63
+ description?: string | undefined;
64
+ dismissible?: boolean | undefined;
65
+ }>;
66
+ type AlertProps = z.infer<typeof AlertPropsSchema> & {
67
+ onDismiss?: () => void;
68
+ };
69
+ declare function validateAlertProps(raw: unknown): z.infer<typeof AlertPropsSchema>;
70
+
71
+ export { type AlertProps as A, TokenDisplayOnceModal as T, AlertPropsSchema as a, type TokenDisplayOnceModalProps as b, TokenDisplayOnceModalPropsSchema as c, validateTokenDisplayOnceModalProps as d, validateAlertProps as v };
@@ -0,0 +1,34 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { z } from 'zod';
3
+
4
+ declare const ConfirmDialogPropsSchema: z.ZodObject<{
5
+ title: z.ZodString;
6
+ message: z.ZodString;
7
+ confirmLabel: z.ZodString;
8
+ cancelLabel: z.ZodString;
9
+ variant: z.ZodDefault<z.ZodEnum<["default", "danger"]>>;
10
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ locale: "en" | "fr";
13
+ message: string;
14
+ title: string;
15
+ confirmLabel: string;
16
+ cancelLabel: string;
17
+ variant: "default" | "danger";
18
+ }, {
19
+ message: string;
20
+ title: string;
21
+ confirmLabel: string;
22
+ cancelLabel: string;
23
+ locale?: "en" | "fr" | undefined;
24
+ variant?: "default" | "danger" | undefined;
25
+ }>;
26
+ type ConfirmDialogProps = z.infer<typeof ConfirmDialogPropsSchema> & {
27
+ onConfirm: () => void;
28
+ onCancel: () => void;
29
+ };
30
+ declare function validateConfirmDialogProps(raw: unknown): z.infer<typeof ConfirmDialogPropsSchema>;
31
+
32
+ declare function ConfirmDialog(raw: Omit<ConfirmDialogProps, "variant" | "locale"> & Partial<Pick<ConfirmDialogProps, "variant" | "locale">>): react_jsx_runtime.JSX.Element | null;
33
+
34
+ export { ConfirmDialog as C, type ConfirmDialogProps as a, ConfirmDialogPropsSchema as b, validateConfirmDialogProps as v };
@@ -0,0 +1,34 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { z } from 'zod';
3
+
4
+ declare const ConfirmDialogPropsSchema: z.ZodObject<{
5
+ title: z.ZodString;
6
+ message: z.ZodString;
7
+ confirmLabel: z.ZodString;
8
+ cancelLabel: z.ZodString;
9
+ variant: z.ZodDefault<z.ZodEnum<["default", "danger"]>>;
10
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ locale: "en" | "fr";
13
+ message: string;
14
+ title: string;
15
+ confirmLabel: string;
16
+ cancelLabel: string;
17
+ variant: "default" | "danger";
18
+ }, {
19
+ message: string;
20
+ title: string;
21
+ confirmLabel: string;
22
+ cancelLabel: string;
23
+ locale?: "en" | "fr" | undefined;
24
+ variant?: "default" | "danger" | undefined;
25
+ }>;
26
+ type ConfirmDialogProps = z.infer<typeof ConfirmDialogPropsSchema> & {
27
+ onConfirm: () => void;
28
+ onCancel: () => void;
29
+ };
30
+ declare function validateConfirmDialogProps(raw: unknown): z.infer<typeof ConfirmDialogPropsSchema>;
31
+
32
+ declare function ConfirmDialog(raw: Omit<ConfirmDialogProps, "variant" | "locale"> & Partial<Pick<ConfirmDialogProps, "variant" | "locale">>): react_jsx_runtime.JSX.Element | null;
33
+
34
+ export { ConfirmDialog as C, type ConfirmDialogProps as a, ConfirmDialogPropsSchema as b, validateConfirmDialogProps as v };
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const MarkdownRendererPropsSchema: z.ZodObject<{
4
+ content: z.ZodString;
5
+ locale: z.ZodEnum<["en", "fr"]>;
6
+ maxLength: z.ZodDefault<z.ZodNumber>;
7
+ allowHtml: z.ZodDefault<z.ZodBoolean>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ locale: "en" | "fr";
10
+ content: string;
11
+ maxLength: number;
12
+ allowHtml: boolean;
13
+ }, {
14
+ locale: "en" | "fr";
15
+ content: string;
16
+ maxLength?: number | undefined;
17
+ allowHtml?: boolean | undefined;
18
+ }>;
19
+ type MarkdownRendererProps = z.infer<typeof MarkdownRendererPropsSchema>;
20
+ declare function validateProps(raw: unknown): MarkdownRendererProps;
21
+
22
+ export { type MarkdownRendererProps as M, MarkdownRendererPropsSchema as a, validateProps as v };
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const MarkdownRendererPropsSchema: z.ZodObject<{
4
+ content: z.ZodString;
5
+ locale: z.ZodEnum<["en", "fr"]>;
6
+ maxLength: z.ZodDefault<z.ZodNumber>;
7
+ allowHtml: z.ZodDefault<z.ZodBoolean>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ locale: "en" | "fr";
10
+ content: string;
11
+ maxLength: number;
12
+ allowHtml: boolean;
13
+ }, {
14
+ locale: "en" | "fr";
15
+ content: string;
16
+ maxLength?: number | undefined;
17
+ allowHtml?: boolean | undefined;
18
+ }>;
19
+ type MarkdownRendererProps = z.infer<typeof MarkdownRendererPropsSchema>;
20
+ declare function validateProps(raw: unknown): MarkdownRendererProps;
21
+
22
+ export { type MarkdownRendererProps as M, MarkdownRendererPropsSchema as a, validateProps as v };
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const ProgressBarPropsSchema: z.ZodObject<{
4
+ value: z.ZodNumber;
5
+ label: z.ZodString;
6
+ locale: z.ZodDefault<z.ZodEnum<["en", "fr"]>>;
7
+ colorVariant: z.ZodDefault<z.ZodEnum<["default", "warning", "danger"]>>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ value: number;
10
+ label: string;
11
+ locale: "en" | "fr";
12
+ colorVariant: "default" | "warning" | "danger";
13
+ }, {
14
+ value: number;
15
+ label: string;
16
+ locale?: "en" | "fr" | undefined;
17
+ colorVariant?: "default" | "warning" | "danger" | undefined;
18
+ }>;
19
+ type ProgressBarProps = z.infer<typeof ProgressBarPropsSchema>;
20
+ declare function validateProps(raw: unknown): ProgressBarProps;
21
+
22
+ export { type ProgressBarProps as P, ProgressBarPropsSchema as a, validateProps as v };