@vantageos/mosaic 0.1.2 → 0.2.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 (75) hide show
  1. package/README.md +102 -0
  2. package/dist/display.cjs +47 -9
  3. package/dist/display.cjs.map +1 -1
  4. package/dist/display.d.cts +4 -0
  5. package/dist/display.d.ts +4 -0
  6. package/dist/display.js +47 -9
  7. package/dist/display.js.map +1 -1
  8. package/dist/index.cjs +47 -9
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.js +47 -9
  11. package/dist/index.js.map +1 -1
  12. package/dist/preact/artifacts.js +3 -0
  13. package/dist/preact/artifacts.js.map +1 -0
  14. package/dist/preact/confirmation.js +3 -0
  15. package/dist/preact/confirmation.js.map +1 -0
  16. package/dist/preact/display.js +3 -0
  17. package/dist/preact/display.js.map +1 -0
  18. package/dist/preact/index.js +3 -0
  19. package/dist/preact/index.js.map +1 -0
  20. package/dist/preact/input.js +3 -0
  21. package/dist/preact/input.js.map +1 -0
  22. package/dist/preact/media.js +3 -0
  23. package/dist/preact/media.js.map +1 -0
  24. package/dist/preact/progress.js +3 -0
  25. package/dist/preact/progress.js.map +1 -0
  26. package/dist/react/artifacts.cjs +4 -0
  27. package/dist/react/artifacts.cjs.map +1 -0
  28. package/dist/react/artifacts.d.cts +2 -0
  29. package/dist/react/artifacts.d.ts +2 -0
  30. package/dist/react/artifacts.js +3 -0
  31. package/dist/react/artifacts.js.map +1 -0
  32. package/dist/react/confirmation.cjs +4 -0
  33. package/dist/react/confirmation.cjs.map +1 -0
  34. package/dist/react/confirmation.d.cts +2 -0
  35. package/dist/react/confirmation.d.ts +2 -0
  36. package/dist/react/confirmation.js +3 -0
  37. package/dist/react/confirmation.js.map +1 -0
  38. package/dist/react/display.cjs +4 -0
  39. package/dist/react/display.cjs.map +1 -0
  40. package/dist/react/display.d.cts +2 -0
  41. package/dist/react/display.d.ts +2 -0
  42. package/dist/react/display.js +3 -0
  43. package/dist/react/display.js.map +1 -0
  44. package/dist/react/index.cjs +4 -0
  45. package/dist/react/index.cjs.map +1 -0
  46. package/dist/react/index.d.cts +2 -0
  47. package/dist/react/index.d.ts +2 -0
  48. package/dist/react/index.js +3 -0
  49. package/dist/react/index.js.map +1 -0
  50. package/dist/react/input.cjs +4 -0
  51. package/dist/react/input.cjs.map +1 -0
  52. package/dist/react/input.d.cts +2 -0
  53. package/dist/react/input.d.ts +2 -0
  54. package/dist/react/input.js +3 -0
  55. package/dist/react/input.js.map +1 -0
  56. package/dist/react/media.cjs +4 -0
  57. package/dist/react/media.cjs.map +1 -0
  58. package/dist/react/media.d.cts +2 -0
  59. package/dist/react/media.d.ts +2 -0
  60. package/dist/react/media.js +3 -0
  61. package/dist/react/media.js.map +1 -0
  62. package/dist/react/progress.cjs +4 -0
  63. package/dist/react/progress.cjs.map +1 -0
  64. package/dist/react/progress.d.cts +2 -0
  65. package/dist/react/progress.d.ts +2 -0
  66. package/dist/react/progress.js +3 -0
  67. package/dist/react/progress.js.map +1 -0
  68. package/dist/server.cjs.map +1 -1
  69. package/dist/server.js.map +1 -1
  70. package/dist/tokens.cjs +95 -0
  71. package/dist/tokens.cjs.map +1 -0
  72. package/dist/tokens.js +84 -0
  73. package/dist/tokens.js.map +1 -0
  74. package/package.json +83 -3
  75. package/registry.yaml +1 -1
package/dist/index.cjs CHANGED
@@ -254,7 +254,8 @@ function TableView(props) {
254
254
  rows: props.rows,
255
255
  columns: props.columns,
256
256
  ariaLabel: props.ariaLabel,
257
- locale: resolvedLocale
257
+ locale: resolvedLocale,
258
+ onRowClick: props.onRowClick
258
259
  }
259
260
  );
260
261
  }
@@ -264,7 +265,8 @@ function TableView(props) {
264
265
  rows: props.rows,
265
266
  columns: props.columns,
266
267
  ariaLabel: props.ariaLabel,
267
- locale: resolvedLocale
268
+ locale: resolvedLocale,
269
+ onRowClick: props.onRowClick
268
270
  }
269
271
  );
270
272
  }
@@ -282,14 +284,22 @@ function StreamingTableView(props) {
282
284
  const locale = props.locale === "fr" ? "fr" : "en";
283
285
  return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "alert", children: t("TableView.error.invalidProps", locale) });
284
286
  }
285
- return /* @__PURE__ */ jsxRuntime.jsx(StreamingTableViewInner, { ...props, virtualizeThreshold: validatedThreshold });
287
+ return /* @__PURE__ */ jsxRuntime.jsx(
288
+ StreamingTableViewInner,
289
+ {
290
+ ...props,
291
+ virtualizeThreshold: validatedThreshold,
292
+ onRowClick: props.onRowClick
293
+ }
294
+ );
286
295
  }
287
296
  function StreamingTableViewInner({
288
297
  columns,
289
298
  rows$,
290
299
  virtualizeThreshold = 100,
291
300
  ariaLabel,
292
- locale
301
+ locale,
302
+ onRowClick
293
303
  }) {
294
304
  const resolvedLocale = locale === "fr" ? "fr" : "en";
295
305
  const [rows, setRows] = react.useState([]);
@@ -310,7 +320,8 @@ function StreamingTableViewInner({
310
320
  rows,
311
321
  columns,
312
322
  ariaLabel,
313
- locale: resolvedLocale
323
+ locale: resolvedLocale,
324
+ onRowClick
314
325
  }
315
326
  );
316
327
  }
@@ -320,7 +331,8 @@ function StreamingTableViewInner({
320
331
  rows,
321
332
  columns,
322
333
  ariaLabel,
323
- locale: resolvedLocale
334
+ locale: resolvedLocale,
335
+ onRowClick
324
336
  }
325
337
  );
326
338
  }
@@ -334,7 +346,8 @@ function StaticTable({
334
346
  rows,
335
347
  columns,
336
348
  ariaLabel,
337
- locale
349
+ locale,
350
+ onRowClick
338
351
  }) {
339
352
  const emptyMsg = t("TableView.empty.message", locale);
340
353
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -349,6 +362,18 @@ function StaticTable({
349
362
  "tr",
350
363
  {
351
364
  "aria-rowindex": rowIndex + 2,
365
+ ...onRowClick ? {
366
+ role: "button",
367
+ tabIndex: 0,
368
+ style: { cursor: "pointer" },
369
+ onClick: () => onRowClick(row, rowIndex),
370
+ onKeyDown: (e) => {
371
+ if (e.key === "Enter" || e.key === " ") {
372
+ e.preventDefault();
373
+ onRowClick(row, rowIndex);
374
+ }
375
+ }
376
+ } : {},
352
377
  children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx("td", { children: renderCell(col, row) }, col.key))
353
378
  },
354
379
  row.id != null ? String(row.id) : `row-${rowIndex}`
@@ -362,7 +387,8 @@ function VirtualTable({
362
387
  columns,
363
388
  ariaLabel,
364
389
  // locale reserved for future virtual-mode empty/pagination strings
365
- locale: _locale
390
+ locale: _locale,
391
+ onRowClick
366
392
  }) {
367
393
  const scrollRef = react.useRef(null);
368
394
  const rowVirtualizer = reactVirtual.useVirtualizer({
@@ -408,8 +434,20 @@ function VirtualTable({
408
434
  left: 0,
409
435
  width: "100%",
410
436
  transform: `translateY(${virtualRow.start}px)`,
411
- display: "flex"
437
+ display: "flex",
438
+ ...onRowClick ? { cursor: "pointer" } : {}
412
439
  },
440
+ ...onRowClick ? {
441
+ role: "button",
442
+ tabIndex: 0,
443
+ onClick: () => onRowClick(row, virtualRow.index),
444
+ onKeyDown: (e) => {
445
+ if (e.key === "Enter" || e.key === " ") {
446
+ e.preventDefault();
447
+ onRowClick(row, virtualRow.index);
448
+ }
449
+ }
450
+ } : {},
413
451
  children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx("td", { style: { flex: 1 }, children: renderCell(col, row) }, col.key))
414
452
  },
415
453
  row.id != null ? String(row.id) : `vrow-${virtualRow.index}`
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/strings.ts","../src/components/progress/ProgressBar.schema.ts","../src/components/progress/ProgressBar.tsx","../src/components/input/ConfirmDialog.schema.ts","../src/components/input/ConfirmDialog.tsx","../src/components/display/TableView.schema.ts","../src/components/display/TableView.tsx","../src/components/artifacts/MarkdownRenderer.schema.ts","../src/components/artifacts/MarkdownRenderer.tsx","../src/components/confirmation/TokenDisplayOnceModal.schema.ts","../src/components/confirmation/TokenDisplayOnceModal.tsx","../src/components/media/StatusBadge.schema.ts","../src/components/media/StatusBadge.tsx","../src/hooks/useStreamingHydration.ts","../src/adapters/postMessageAdapter.ts","../src/server/create-mosaic-resource.ts"],"names":["z","jsxs","jsx","useRef","useId","useEffect","useState","useVirtualizer","useCallback","validateProps","marked","DOMPurify","Subject","createUIResource"],"mappings":";;;;;;;;;;;;;;;;AAaA,IAAM,EAAA,GAAK;AAAA,EACT,wBAAA,EAA0B,UAAA;AAAA,EAC1B,gCAAA,EAAkC,4BAAA;AAAA,EAClC,8BAAA,EAAgC,SAAA;AAAA,EAChC,6BAAA,EAA+B,QAAA;AAAA,EAC/B,2BAAA,EAA6B,qBAAA;AAAA,EAC7B,sBAAA,EAAwB,YAAA;AAAA,EACxB,2BAAA,EAA6B,WAAA;AAAA,EAC7B,2BAAA,EAA6B,eAAA;AAAA,EAC7B,yBAAA,EAA2B,oBAAA;AAAA,EAC3B,8BAAA,EAAgC,0BAAA;AAAA,EAChC,+BAAA,EAAiC,2BAAA;AAAA,EACjC,qCAAA,EAAuC,iCAAA;AAAA,EACvC,gCAAA,EAAkC,gCAAA;AAAA,EAClC,mCAAA,EAAqC,YAAA;AAAA,EACrC,oCAAA,EAAsC,OAAA;AAAA,EACtC,oCAAA,EAAsC,kDAAA;AAAA,EACtC,8BAAA,EAAgC,QAAA;AAAA,EAChC,yBAAA,EAA2B,QAAA;AAAA,EAC3B,gCAAA,EAAkC;AACpC,CAAA;AAEA,IAAM,EAAA,GAAsC;AAAA,EAC1C,wBAAA,EAA0B,aAAA;AAAA,EAC1B,gCAAA,EAAkC,0CAAA;AAAA,EAClC,8BAAA,EAAgC,WAAA;AAAA,EAChC,6BAAA,EAA+B,SAAA;AAAA,EAC/B,2BAAA,EAA6B,sCAAA;AAAA,EAC7B,sBAAA,EAAwB,uBAAA;AAAA,EACxB,2BAAA,EAA6B,eAAA;AAAA,EAC7B,2BAAA,EAA6B,uBAAA;AAAA,EAC7B,yBAAA,EAA2B,gCAAA;AAAA,EAC3B,8BAAA,EAAgC,wCAAA;AAAA,EAChC,+BAAA,EAAiC,wBAAA;AAAA,EACjC,qCAAA,EAAuC,+CAAA;AAAA,EACvC,gCAAA,EAAkC,4CAAA;AAAA,EAClC,mCAAA,EAAqC,iBAAA;AAAA,EACrC,oCAAA,EAAsC,QAAA;AAAA,EACtC,oCAAA,EACE,sEAAA;AAAA,EACF,8BAAA,EAAgC,UAAA;AAAA,EAChC,yBAAA,EAA2B,QAAA;AAAA,EAC3B,gCAAA,EAAkC;AACpC,CAAA;AAIA,IAAM,KAAA,GAA6D;AAAA,EACjE,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAGO,SAAS,CAAA,CAAE,GAAA,EAAoB,MAAA,GAAuB,IAAA,EAAc;AACzE,EAAA,OAAO,MAAM,MAAM,CAAA,GAAI,GAAG,CAAA,IAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AAC7C;AClEO,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EAC7C,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EAChC,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,MAAM,IAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACzC,YAAA,EAAcA,KAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,WAAW,QAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS;AAC1E,CAAC;AAIM,SAAS,cAAc,GAAA,EAAgC;AAC5D,EAAA,OAAO,sBAAA,CAAuB,MAAM,GAAG,CAAA;AACzC;ACTA,SAAS,WAAW,GAAA,EAA4C;AAC9D,EAAA,OAAO,GAAA,CAAI,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AACtC;AAEA,IAAM,mBAAA,GAAwE;AAAA,EAC5E,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,uBAAA,GAA4E;AAAA,EAChF,OAAA,EAAS,qBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,SAAS,iBAAiB,KAAA,EAAyB;AACjD,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,YAAA,EAAa,GAAI,KAAA;AACvC,EAAA,MAAM,SAAA,GAAY,oBAAoB,YAAY,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,wBAAwB,YAAY,CAAA;AAE3D,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAe,KAAA;AAAA,MACf,eAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAe,GAAA;AAAA,MACf,YAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAW,mBAAmB,cAAc,CAAA,CAAA;AAAA,MAC5C,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MAEvB,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,eAAA;AAAA,YACZ,SAAA,EAAW,wBAAwB,SAAS,CAAA,CAAA;AAAA,YAC5C,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA;AAAI;AAAA,SAC9B;AAAA,wBACAD,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAM,IAAA;AAAA,UAAG,KAAA;AAAA,UAAM;AAAA,SAAA,EAClB;AAAA;AAAA;AAAA,GACF;AAEJ;AAMO,SAAS,YAAY,GAAA,EAA8B;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,IAAA,uBAAOC,cAAA,CAAC,gBAAA,EAAA,EAAkB,GAAG,KAAA,EAAO,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,uBACEA,cAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,uBAAA,EACzB,QAAA,EAAA,CAAA,CAAE,gCAAA,EAAkC,UAAA,CAAW,GAAG,CAAC,CAAA,EACtD,CAAA;AAAA,EAEJ;AACF;AC3DO,IAAM,wBAAA,GAA2BF,MAAE,MAAA,CAAO;AAAA,EAC/C,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC9B,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC7B,OAAA,EAASA,MAAE,IAAA,CAAK,CAAC,WAAW,QAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACxD,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,MAAM,IAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAI;AAC3C,CAAC;AAOM,SAAS,2BAA2B,GAAA,EAAwD;AACjG,EAAA,OAAO,wBAAA,CAAyB,MAAM,GAAG,CAAA;AAC3C;ACbA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,SAAA,GAAYG,aAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,UAAUC,WAAA,EAAM;AACtB,EAAA,MAAM,YAAYA,WAAA,EAAM;AAExB,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AAEzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAA,CAAO,SAAA,EAAU;AACjB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAA,EAAM;AAAA,IAChC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAS,cAAc,CAAA,EAAqC;AAC1D,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AAEA,EAAA,SAAS,oBAAoB,CAAA,EAAkC;AAC7D,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,SAAA,CAAU,OAAA,EAAS;AAClC,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GACJ,OAAA,KAAY,QAAA,GACR,8MAAA,GACA,iNAAA;AAEN,EAAA,uBACEH,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,iBAAA,EAAiB,OAAA;AAAA,MACjB,kBAAA,EAAkB,SAAA;AAAA,MAClB,SAAA,EAAW,aAAA;AAAA,MACX,OAAA,EAAS,mBAAA;AAAA,MACT,SAAA,EAAU,uEAAA;AAAA,MAGV,QAAA,kBAAAD,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,yBAAA;AAAA,UACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAClC,SAAA,EAAW,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAEpC,QAAA,EAAA;AAAA,4BAAAC,eAAC,IAAA,EAAA,EAAG,EAAA,EAAI,OAAA,EAAS,SAAA,EAAU,uCACxB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,4BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAI,SAAA,EAAW,SAAA,EAAU,yBACzB,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,4BACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,QAAA;AAAA,kBACT,SAAA,EAAU,wMAAA;AAAA,kBAET,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,8BACAA,eAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,gBAAA,EAClD,QAAA,EAAA,YAAA,EACH;AAAA,aAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AAEO,SAAS,cACd,GAAA,EAEA;AACA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,2BAA2B,GAAG,CAAA;AAC7C,IAAA,uBAAOA,cAAAA,CAAC,kBAAA,EAAA,EAAoB,GAAG,MAAA,EAAQ,WAAW,GAAA,CAAI,SAAA,EAAW,QAAA,EAAU,GAAA,CAAI,QAAA,EAAU,CAAA;AAAA,EAC3F,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,mEAA8D,GAAG,CAAA;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AC5FO,IAAM,eAAA,GAAkBF,MAAE,MAAA,CAAO;AAAA,EACtC,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACrB,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AAAA;AAE1B,CAAC,CAAA;AAaM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,SAASA,KAAAA,CAAE,KAAA,CAAM,eAAe,CAAA,CAAE,GAAA,CAAI,GAAG,wCAAwC,CAAA;AAAA,EACjF,mBAAA,EAAqBA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC5D,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,MAAM,IAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAI;AAC3C,CAAC;AA+BM,SAAS,uBAAuB,GAAA,EAA0C;AAC/E,EAAA,OAAO,oBAAA,CAAqB,MAAM,GAAG,CAAA;AACvC;ACpDA,IAAM,QAAA,GAAW,CAAA;AAUV,SAAS,UACd,KAAA,EACA;AAEA,EAAA,IAAI,kBAAA,GAAqB,GAAA;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,sBAAA,CAAuB;AAAA,MACvC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,MAAA,EAAO,MAAO,EAAE,GAAA,EAAK,MAAA,EAAO,CAAE,CAAA;AAAA,MACjE,qBAAqB,KAAA,CAAM,mBAAA;AAAA,MAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AACD,IAAA,kBAAA,GAAqB,SAAA,CAAU,mBAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,MAAA,GAAuB,KAAA,CAAM,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AAC5D,IAAA,uBAAOE,eAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAS,QAAA,EAAA,CAAA,CAAE,8BAAA,EAAgC,MAAM,CAAA,EAAE,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,kBAAA;AACtC,EAAA,MAAM,cAAA,GAA+B,KAAA,CAAM,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AAEpE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEA,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,MAAA,EAAQ;AAAA;AAAA,KACV;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,MAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;AAYO,SAAS,mBACd,KAAA,EACA;AAEA,EAAA,IAAI,kBAAA,GAAqB,GAAA;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,sBAAA,CAAuB;AAAA,MACvC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,MAAA,EAAO,MAAO,EAAE,GAAA,EAAK,MAAA,EAAO,CAAE,CAAA;AAAA,MACjE,qBAAqB,KAAA,CAAM,mBAAA;AAAA,MAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AACD,IAAA,kBAAA,GAAqB,SAAA,CAAU,mBAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,MAAA,GAAuB,KAAA,CAAM,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AAC5D,IAAA,uBAAOA,eAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAS,QAAA,EAAA,CAAA,CAAE,8BAAA,EAAgC,MAAM,CAAA,EAAE,CAAA;AAAA,EACtE;AAEA,EAAA,uBAAOA,cAAAA,CAAC,uBAAA,EAAA,EAA+B,GAAG,KAAA,EAAO,qBAAqB,kBAAA,EAAoB,CAAA;AAC5F;AAIA,SAAS,uBAAA,CAAwF;AAAA,EAC/F,OAAA;AAAA,EACA,KAAA;AAAA,EACA,mBAAA,GAAsB,GAAA;AAAA,EACtB,SAAA;AAAA,EACA;AACF,CAAA,EAAoE;AAClE,EAAA,MAAM,cAAA,GAA+B,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AAC9D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,cAAA,CAA0B,EAAE,CAAA;AAGpD,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,CAAQ,EAAE,CAAA;AACV,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,SAAA,CAAU,CAAC,KAAA,KAAU;AACrC,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,KAAK,CAAC,CAAA;AAAA,IACvC,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,WAAA,EAAY;AAAA,IAClB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,SAAA,GAAY,KAAK,MAAA,GAAS,mBAAA;AAEhC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEH,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA,KACV;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;AAYA,SAAS,UAAA,CACP,KACA,GAAA,EACiB;AACjB,EAAA,IAAI,IAAI,MAAA,EAAQ;AACd,IAAA,OAAO,GAAA,CAAI,OAAO,GAAW,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,MAAA,CAAQ,GAAA,CAAgC,GAAA,CAAI,GAAG,KAAK,EAAE,CAAA;AAC/D;AAEA,SAAS,WAAA,CAAkD;AAAA,EACzD,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,yBAAA,EAA2B,MAAM,CAAA;AACpD,EAAA,uBACED,eAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,SAAA;AAAA,MACZ,iBAAe,IAAA,CAAK,MAAA;AAAA,MACpB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,gBAAgB,UAAA,EAAW;AAAA,MAEnD,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,WACC,QAAA,kBAAAA,cAAAA,CAAC,QACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZA,eAAC,IAAA,EAAA,EAAiB,KAAA,EAAM,OACrB,QAAA,EAAA,GAAA,CAAI,MAAA,EAAA,EADE,IAAI,GAEb,CACD,GACH,CAAA,EACF,CAAA;AAAA,wBACAA,cAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,MAAA,KAAW,oBACfA,cAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAS,OAAA,CAAQ,MAAA,EAAQ,YAAA,EAAY,QAAA,EACtC,QAAA,EAAA,QAAA,EACH,CAAA,EACF,CAAA,GAEA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,QAAA,qBACbA,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAMC,iBAAe,QAAA,GAAW,CAAA;AAAA,YAEzB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZA,cAAAA,CAAC,IAAA,EAAA,EAAkB,QAAA,EAAA,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA,EAAA,EAA7B,GAAA,CAAI,GAA2B,CACzC;AAAA,WAAA;AAAA,UARE,GAAA,CAAgC,MAAM,IAAA,GACnC,MAAA,CAAQ,IAAgC,EAAE,CAAA,GAC1C,OAAO,QAAQ,CAAA;AAAA,SAQxB,CAAA,EAEL;AAAA;AAAA;AAAA,GACF;AAEJ;AAIA,SAAS,YAAA,CAAmD;AAAA,EAC1D,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAEA,MAAA,EAAQ;AACV,CAAA,EAA4B;AAC1B,EAAA,MAAM,SAAA,GAAYC,aAAuB,IAAI,CAAA;AAE7C,EAAA,MAAM,iBAAiBI,2BAAA,CAAe;AAAA,IACpC,OAAO,IAAA,CAAK,MAAA;AAAA;AAAA,IAEZ,gBAAA,EAAkB,MAAM,SAAA,CAAU,OAAA;AAAA,IAClC,YAAA,EAAcC,iBAAA,CAAY,MAAM,EAAA,EAAI,EAAE,CAAA;AAAA,IACtC,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,eAAe,eAAA,EAAgB;AACpD,EAAA,MAAM,SAAA,GAAY,eAAe,YAAA,EAAa;AAE9C,EAAA,uBACEN,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAa,MAAA;AAAA,MACb,GAAA,EAAK,SAAA;AAAA,MACL,OAAO,EAAE,MAAA,EAAQ,KAAK,QAAA,EAAU,MAAA,EAAQ,UAAU,UAAA,EAAW;AAAA,MAE7D,QAAA,kBAAAD,eAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAY,SAAA;AAAA,UACZ,iBAAe,IAAA,CAAK,MAAA;AAAA,UACpB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,gBAAgB,UAAA,EAAW;AAAA,UAEnD,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,WACC,QAAA,kBAAAA,cAAAA,CAAC,QACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZA,eAAC,IAAA,EAAA,EAAiB,KAAA,EAAM,OACrB,QAAA,EAAA,GAAA,CAAI,MAAA,EAAA,EADE,IAAI,GAEb,CACD,GACH,CAAA,EACF,CAAA;AAAA,4BACAA,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,MAAA,EAAQ,GAAG,SAAS,CAAA,EAAA,CAAA;AAAA,kBACpB,QAAA,EAAU,UAAA;AAAA,kBACV,OAAA,EAAS;AAAA,iBACX;AAAA,gBAEC,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,UAAA,KAAe;AAEhC,kBAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,KAAK,KAAM,EAAC;AACxC,kBAAA,uBACEA,cAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBAMC,eAAA,EAAe,WAAW,KAAA,GAAQ,CAAA;AAAA,sBAClC,KAAA,EAAO;AAAA,wBACL,QAAA,EAAU,UAAA;AAAA,wBACV,GAAA,EAAK,CAAA;AAAA,wBACL,IAAA,EAAM,CAAA;AAAA,wBACN,KAAA,EAAO,MAAA;AAAA,wBACP,SAAA,EAAW,CAAA,WAAA,EAAc,UAAA,CAAW,KAAK,CAAA,GAAA,CAAA;AAAA,wBACzC,OAAA,EAAS;AAAA,uBACX;AAAA,sBAEC,kBAAQ,GAAA,CAAI,CAAC,wBACZA,cAAAA,CAAC,QAAiB,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,IAC9B,QAAA,EAAA,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA,EAAA,EADb,GAAA,CAAI,GAEb,CACD;AAAA,qBAAA;AAAA,oBAlBE,GAAA,CAAgC,MAAM,IAAA,GACnC,MAAA,CAAQ,IAAgC,EAAE,CAAA,GAC1C,CAAA,KAAA,EAAQ,UAAA,CAAW,KAAK,CAAA;AAAA,mBAiBhC;AAAA,gBAEJ,CAAC;AAAA;AAAA;AACH;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AC/RO,IAAM,2BAAA,GAA8BF,MAAE,MAAA,CAAO;AAAA,EAClD,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,QAAQA,KAAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,EAC3B,WAAWA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,GAAK,CAAA;AAAA,EAC9C,SAAA,EAAWA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK;AACtC,CAAC;AAIM,SAASS,eAAc,GAAA,EAAqC;AACjE,EAAA,OAAO,2BAAA,CAA4B,MAAM,GAAG,CAAA;AAC9C;ACCA,IAAM,eAAA,GAA+C;AAAA,EACnD,EAAA,EAAI,iCAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,IAAI,OAAA,CAAQ,SAAS,SAAA,EAAW;AAC9B,IAAA,uBACEP,eAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAQ,IAAA,EAAM,MAAA,EACrB,QAAA,EAAA,eAAA,CAAgB,MAAM,CAAA,EACzB,CAAA;AAAA,EAEJ;AAIA,EAAA,MAAM,SAAS,SAAA,GAAY,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,YAAY,EAAE,CAAA;AACnE,EAAA,MAAM,UAAUQ,aAAA,CAAO,KAAA,CAAM,QAAQ,EAAE,KAAA,EAAO,OAAO,CAAA;AAErD,EAAA,MAAM,SAAA,GAAYC,0BAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAE5C,EAAA,MAAM,SAAA,GAAY,MAAA,KAAW,IAAA,GAAO,oBAAA,GAAoB,mBAAA;AAExD,EAAA,uBACET,cAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MAEN,uBAAA,EAAyB,EAAE,MAAA,EAAQ,SAAA;AAAU;AAAA,GAC/C;AAEJ;AAMO,SAAS,iBAAiB,GAAA,EAA8B;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQO,eAAc,GAAG,CAAA;AAC/B,IAAA,uBAAOP,cAAAA,CAAC,qBAAA,EAAA,EAAuB,GAAG,KAAA,EAAO,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,MAAA,GAAuB,GAAA,CAAI,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AAC1D,IAAA,uBAAOA,eAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAS,QAAA,EAAA,CAAA,CAAE,qCAAA,EAAuC,MAAM,CAAA,EAAE,CAAA;AAAA,EAC7E;AACF;AC3DO,IAAM,gCAAA,GAAmCF,MAAE,MAAA,CAAO;AAAA,EACvD,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,cAAA,EAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAChC,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,UAAA,EAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,MAAM,IAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAI;AAC3C,CAAC;AAMM,SAAS,mCACd,GAAA,EACkD;AAClD,EAAA,OAAO,gCAAA,CAAiC,MAAM,GAAG,CAAA;AACnD;ACVA,SAAS,0BAAA,CAA2B;AAAA,EAClC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,SAAA,GAAYG,aAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,UAAUC,WAAAA,EAAM;AACtB,EAAA,MAAM,YAAYA,WAAAA,EAAM;AACxB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,eAAS,KAAK,CAAA;AAG1C,EAAA,MAAM,CAAC,WAAW,CAAA,GAAIA,cAAAA,CAAiB,KAAK,CAAA;AAE5C,EAAAD,gBAAU,MAAM;AACd,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AAEzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAA,CAAO,SAAA,EAAU;AACjB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAA,EAAM;AAAA,IAChC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,eAAe,UAAA,GAAa;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,WAAW,CAAA;AAC/C,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AAEN,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,SAAS,cAAc,CAAA,EAAqC;AAC1D,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAEA,EAAA,SAAS,oBAAoB,CAAA,EAAkC;AAC7D,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,SAAA,CAAU,OAAA,EAAS;AAClC,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAEA,EAAA,uBACEH,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,iBAAA,EAAiB,OAAA;AAAA,MACjB,kBAAA,EAAkB,SAAA;AAAA,MAClB,SAAA,EAAW,aAAA;AAAA,MACX,OAAA,EAAS,mBAAA;AAAA,MACT,SAAA,EAAU,uEAAA;AAAA,MAGV,QAAA,kBAAAD,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,yBAAA;AAAA,UACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAClC,SAAA,EAAW,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAEpC,QAAA,EAAA;AAAA,4BAAAC,eAAC,IAAA,EAAA,EAAG,EAAA,EAAI,OAAA,EAAS,SAAA,EAAU,uCACxB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,4BACAA,cAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,SAAA;AAAA,gBACJ,SAAA,EAAU,iFAAA;AAAA,gBAET,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,4BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA,WAAA,EACH,CAAA,EACF,CAAA;AAAA,4BAEAA,cAAAA,CAAC,QAAA,EAAA,EAAO,aAAU,QAAA,EAAS,aAAA,EAAY,QAAO,SAAA,EAAU,uBAAA,EACrD,oCACCA,cAAAA,CAAC,UAAK,SAAA,EAAU,oCAAA,EACb,YAAE,8BAAA,EAAgC,MAAM,GAC3C,CAAA,EAEJ,CAAA;AAAA,4BACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,UAAA;AAAA,kBACT,SAAA,EAAU,oNAAA;AAAA,kBAET,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,8BACAA,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,SAAA,EAAU,iNAAA;AAAA,kBAET,QAAA,EAAA;AAAA;AAAA;AACH,aAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AAEO,SAAS,sBACd,GAAA,EAEA;AACA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,mCAAmC,GAAG,CAAA;AACrD,IAAA,uBAAOA,cAAAA,CAAC,0BAAA,EAAA,EAA4B,GAAG,MAAA,EAAQ,OAAA,EAAS,IAAI,OAAA,EAAS,CAAA;AAAA,EACvE,SAAS,GAAA,EAAK;AAEZ,IAAA,OAAA,CAAQ,IAAA,CAAK,2EAAsE,GAAG,CAAA;AACtF,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACpIO,IAAM,sBAAA,GAAyBF,MAAE,MAAA,CAAO;AAAA,EAC7C,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,OAAA,EAASA,KAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACtF,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,QAAQA,KAAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,IAAI,CAAC;AAC7B,CAAC;AAIM,SAASS,eAAc,GAAA,EAAgC;AAC5D,EAAA,OAAO,sBAAA,CAAuB,MAAM,GAAG,CAAA;AACzC;ACNA,IAAM,cAAA,GAA0C;AAAA,EAC9C,OAAA,EAAS,mDAAA;AAAA,EACT,OAAA,EAAS,mDAAA;AAAA,EACT,MAAA,EAAQ,6CAAA;AAAA,EACR,IAAA,EAAM,gDAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AASA,SAAS,iBAAiB,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,QAAO,EAA0B;AACnF,EAAA,MAAM,YAAY,KAAA,IAAS,MAAA;AAC3B,EAAA,uBACEP,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MACN,SAAA,EAAW,CAAA,wEAAA,EAA2E,cAAA,CAAe,OAAO,CAAC,CAAA,CAAA;AAAA,MAE5G,QAAA,EAAA,KAAA,IAAS;AAAA;AAAA,GACZ;AAEJ;AAMO,SAAS,YAAY,GAAA,EAA8B;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQO,eAAc,GAAG,CAAA;AAC/B,IAAA,uBAAOP,cAAAA,CAAC,gBAAA,EAAA,EAAkB,GAAG,KAAA,EAAO,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,MAAA,GAAuB,GAAA,CAAI,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA;AAC1D,IAAA,uBAAOA,eAAC,MAAA,EAAA,EAAK,IAAA,EAAK,SAAS,QAAA,EAAA,CAAA,CAAE,gCAAA,EAAkC,MAAM,CAAA,EAAE,CAAA;AAAA,EACzE;AACF;ACpCO,SAAS,sBAAyB,MAAA,EAA4C;AACnF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAII,cAAAA,CAAqB,EAAE,CAAA;AACjD,EAAAD,gBAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,CAAC,KAAA,KAAU;AACtC,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,GAAG,OAAM,CAAE,CAAA;AAAA,IAC5C,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,WAAA,EAAY;AAAA,IAClB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,OAAO,KAAA;AACT;ACZO,IAAM,wBAAA,GAA2B;AAEjC,SAAS,2BAAA,GAAyD;AACvE,EAAA,MAAM,OAAA,GAAU,IAAIO,YAAA,EAAoB;AACxC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,CAAC,KAAA,KAAwB;AAC1D,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,MAAA,IAAI,IAAA,EAAM,SAAS,wBAAA,EAA0B;AAC3C,QAAA,OAAA,CAAQ,IAAA,CAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,MAAqB,CAAA;AAAA,MACvD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,QAAQ,YAAA,EAAa;AAC9B;ACXO,IAAM,qBAAA,GAAwB;AAM9B,IAAM,gBAAA,GAAmB;AAUhC,IAAM,cAAA,GAAiB;AAAA,EACrB,WAAA,EAAa,sBAAA;AAAA,EACb,aAAA,EAAe,wBAAA;AAAA,EACf,SAAA,EAAW,oBAAA;AAAA,EACX,gBAAA,EAAkB,2BAAA;AAAA,EAClB,qBAAA,EAAuB,gCAAA;AAAA,EACvB,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAEjD,IAAM,UAAA,GAAqE;AAAA,EACzE,WAAA,EAAa,EAAE,EAAA,EAAI,UAAA,EAAY,IAAI,aAAA,EAAc;AAAA,EACjD,aAAA,EAAe,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAI,cAAA,EAAe;AAAA,EACxD,SAAA,EAAW,EAAE,EAAA,EAAI,YAAA,EAAc,IAAI,uBAAA,EAAqB;AAAA,EACxD,gBAAA,EAAkB,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAI,kBAAA,EAAmB;AAAA,EACnE,qBAAA,EAAuB,EAAE,EAAA,EAAI,oBAAA,EAAsB,IAAI,6BAAA,EAA2B;AAAA,EAClF,WAAA,EAAa,EAAE,EAAA,EAAI,QAAA,EAAU,IAAI,QAAA;AACnC,CAAA;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,EACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1B;AAEA,SAAS,gBAAA,CAAiB,eAAmC,MAAA,EAA6B;AACxF,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,aAAa,CAAA,CAAE,MAAM,CAAA;AAChD,EAAA,MAAM,IAAA,GACJ,MAAA,KAAW,IAAA,GACP,yEAAA,GACA,gEAAA;AACN,EAAA,OAAO,KAAK,OAAO;;AAAA,EAAO,IAAI;AAAA,CAAA;AAChC;AAEA,SAAS,SAAA,CAAU,aAAA,EAAmC,KAAA,EAAgB,MAAA,EAA6B;AACjG,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAClD,EAAA,MAAM,QAAQ,UAAA,CAAW,UAAA,CAAW,aAAa,CAAA,CAAE,MAAM,CAAC,CAAA;AAC1D,EAAA,OAAO,8BAA8B,MAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,2DAAA,EAA8D,aAAa,iBAAiB,SAAS,CAAA,sBAAA,CAAA;AAC/L;AAmBO,SAAS,oBAAA,CACd,aAAA,EACA,KAAA,EACA,MAAA,GAAsB,IAAA,EACV;AACZ,EAAA,MAAM,MAAA,GAAS,eAAe,aAAa,CAAA;AAC3C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,aAAa,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9E;AACA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AACpC,EAAA,MAAM,GAAA,GAAwB,CAAA,YAAA,EAAe,aAAA,CAAc,WAAA,EAAa,CAAA,CAAA;AACxE,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,aAAA,EAAe,SAAA,EAAW,MAAM,CAAA;AACvD,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,aAAA,EAAe,MAAM,CAAA;AAEvD,EAAA,MAAM,WAAWC,uBAAA,CAAiB;AAAA,IAChC,GAAA;AAAA,IACA,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,IAAA,EAAK;AAAA,IAC7C,QAAA,EAAU,MAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,EAAA,EAAI;AAAA,QACF,WAAA,EAAa,GAAA;AAAA,QACb,MAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AACF;AACF,GACD,CAAA;AAID,EAAA,QAAA,CAAS,SAAS,QAAA,GAAW,gBAAA;AAC7B,EAAA,OAAO,QAAA;AACT;AAEO,IAAM,2BAAA,GAA6D","file":"index.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","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","import type { ReactNode } from \"react\";\nimport type { Observable } from \"rxjs\";\nimport { z } from \"zod\";\n\n// i18nKeys: TableView.aria.table, TableView.pagination.next, TableView.pagination.prev, TableView.empty.message, TableView.error.invalidProps\n\nexport const ColumnDefSchema = z.object({\n key: z.string().min(1),\n header: z.string().min(1),\n // render is a runtime function — excluded from Zod, typed separately\n});\n\nexport type ColumnDef<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n key: string;\n header: string;\n render?: (row: TRow) => ReactNode;\n};\n\n/**\n * Validates the serialisable (non-function) portion of TableView props.\n * The `rows$` Observable and `render` callbacks are not Zod-parseable and\n * must be validated at the call-site type level.\n */\nexport const TableViewPropsSchema = z.object({\n columns: z.array(ColumnDefSchema).min(1, \"TableView requires at least one column\"),\n virtualizeThreshold: z.number().int().positive().default(100),\n ariaLabel: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type TableViewPropsSchemaInput = z.input<typeof TableViewPropsSchema>;\nexport type TableViewPropsSchemaOutput = z.output<typeof TableViewPropsSchema>;\n\n/**\n * Props for the static TableView — accepts a plain array of rows.\n * Primary API for already-fetched data (no rxjs required).\n */\nexport type TableViewProps<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n columns: ColumnDef<TRow>[];\n rows: Partial<TRow>[];\n virtualizeThreshold?: number;\n ariaLabel: string;\n locale?: \"en\" | \"fr\";\n};\n\n/**\n * Props for StreamingTableView — accepts an RxJS Observable for incremental row appending.\n * Consumers using this variant MUST install rxjs ^7.8.0 in their project.\n */\nexport type StreamingTableViewProps<\n TRow extends Record<string, unknown> = Record<string, unknown>,\n> = {\n columns: ColumnDef<TRow>[];\n rows$: Observable<Partial<TRow>[]>;\n virtualizeThreshold?: number;\n ariaLabel: string;\n locale?: \"en\" | \"fr\";\n};\n\nexport function validateTableViewProps(raw: unknown): TableViewPropsSchemaOutput {\n return TableViewPropsSchema.parse(raw);\n}\n","// i18nKeys: TableView.aria.table, TableView.pagination.next, TableView.pagination.prev, TableView.empty.message, TableView.error.invalidProps\n\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { type MosaicLocale, t } from \"../../i18n/strings.js\";\nimport { validateTableViewProps } from \"./TableView.schema\";\nimport type { StreamingTableViewProps, TableViewProps } from \"./TableView.schema\";\n\nconst OVERSCAN = 5;\n\n/**\n * TableView — Static rows variant (primary API).\n *\n * Accepts `rows: Row[]` for already-fetched data — no rxjs required.\n * Activates TanStack Virtual v3 windowing when rows.length > virtualizeThreshold.\n * Zod-validates serialisable props; renders role=\"alert\" fallback on failure.\n * Fully accessible: aria-rowcount, aria-label, scope=\"col\".\n */\nexport function TableView<TRow extends Record<string, unknown> = Record<string, unknown>>(\n props: TableViewProps<TRow>,\n) {\n // ── Zod validation (serialisable props only) ───────────────────────────────\n let validatedThreshold = 100;\n try {\n const validated = validateTableViewProps({\n columns: props.columns.map(({ key, header }) => ({ key, header })),\n virtualizeThreshold: props.virtualizeThreshold,\n ariaLabel: props.ariaLabel,\n locale: props.locale,\n });\n validatedThreshold = validated.virtualizeThreshold;\n } catch {\n const locale: MosaicLocale = props.locale === \"fr\" ? \"fr\" : \"en\";\n return <div role=\"alert\">{t(\"TableView.error.invalidProps\", locale)}</div>;\n }\n\n const isVirtual = props.rows.length > validatedThreshold;\n const resolvedLocale: MosaicLocale = props.locale === \"fr\" ? \"fr\" : \"en\";\n\n if (isVirtual) {\n return (\n <VirtualTable<TRow>\n rows={props.rows}\n columns={props.columns}\n ariaLabel={props.ariaLabel}\n locale={resolvedLocale}\n />\n );\n }\n\n return (\n <StaticTable<TRow>\n rows={props.rows}\n columns={props.columns}\n ariaLabel={props.ariaLabel}\n locale={resolvedLocale}\n />\n );\n}\n\n/**\n * StreamingTableView — Streaming rows variant (advanced, opt-in).\n *\n * Pattern 4 Streaming Hydration reference implementation.\n * Consumes an RxJS Observable<Row[]> for incremental row appending.\n * Consumers MUST install rxjs ^7.8.0 in their project.\n * Activates TanStack Virtual v3 windowing when rows.length > virtualizeThreshold.\n * Zod-validates serialisable props; renders role=\"alert\" fallback on failure.\n * Fully accessible: aria-rowcount, aria-label, scope=\"col\".\n */\nexport function StreamingTableView<TRow extends Record<string, unknown> = Record<string, unknown>>(\n props: StreamingTableViewProps<TRow>,\n) {\n // ── Zod validation (serialisable props only) ───────────────────────────────\n let validatedThreshold = 100;\n try {\n const validated = validateTableViewProps({\n columns: props.columns.map(({ key, header }) => ({ key, header })),\n virtualizeThreshold: props.virtualizeThreshold,\n ariaLabel: props.ariaLabel,\n locale: props.locale,\n });\n validatedThreshold = validated.virtualizeThreshold;\n } catch {\n const locale: MosaicLocale = props.locale === \"fr\" ? \"fr\" : \"en\";\n return <div role=\"alert\">{t(\"TableView.error.invalidProps\", locale)}</div>;\n }\n\n return <StreamingTableViewInner<TRow> {...props} virtualizeThreshold={validatedThreshold} />;\n}\n\n// ── Inner implementation for streaming (rendered only after validation passes) ──\n\nfunction StreamingTableViewInner<TRow extends Record<string, unknown> = Record<string, unknown>>({\n columns,\n rows$,\n virtualizeThreshold = 100,\n ariaLabel,\n locale,\n}: StreamingTableViewProps<TRow> & { virtualizeThreshold: number }) {\n const resolvedLocale: MosaicLocale = locale === \"fr\" ? \"fr\" : \"en\";\n const [rows, setRows] = useState<Partial<TRow>[]>([]);\n\n // Subscribe to the Observable and accumulate chunks\n useEffect(() => {\n setRows([]);\n const sub = rows$.subscribe((chunk) => {\n setRows((prev) => [...prev, ...chunk]);\n });\n return () => {\n sub.unsubscribe();\n };\n }, [rows$]);\n\n const isVirtual = rows.length > virtualizeThreshold;\n\n if (isVirtual) {\n return (\n <VirtualTable<TRow>\n rows={rows}\n columns={columns}\n ariaLabel={ariaLabel}\n locale={resolvedLocale}\n />\n );\n }\n\n return (\n <StaticTable<TRow>\n rows={rows}\n columns={columns}\n ariaLabel={ariaLabel}\n locale={resolvedLocale}\n />\n );\n}\n\n// ── Static table (rows <= virtualizeThreshold) ────────────────────────────────\n\ntype TableContentProps<TRow extends Record<string, unknown>> = {\n rows: Partial<TRow>[];\n columns: TableViewProps<TRow>[\"columns\"];\n ariaLabel: string;\n locale: MosaicLocale;\n};\n\n/** Renders a single cell — uses col.render if provided, else converts to string */\nfunction renderCell<TRow extends Record<string, unknown>>(\n col: TableViewProps<TRow>[\"columns\"][number],\n row: Partial<TRow>,\n): React.ReactNode {\n if (col.render) {\n return col.render(row as TRow);\n }\n return String((row as Record<string, unknown>)[col.key] ?? \"\");\n}\n\nfunction StaticTable<TRow extends Record<string, unknown>>({\n rows,\n columns,\n ariaLabel,\n locale,\n}: TableContentProps<TRow>) {\n const emptyMsg = t(\"TableView.empty.message\", locale);\n return (\n <table\n aria-label={ariaLabel}\n aria-rowcount={rows.length}\n style={{ width: \"100%\", borderCollapse: \"collapse\" }}\n >\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.key} scope=\"col\">\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td colSpan={columns.length} aria-label={emptyMsg}>\n {emptyMsg}\n </td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr\n key={\n (row as Record<string, unknown>).id != null\n ? String((row as Record<string, unknown>).id)\n : `row-${rowIndex}`\n }\n aria-rowindex={rowIndex + 2}\n >\n {columns.map((col) => (\n <td key={col.key}>{renderCell(col, row)}</td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n );\n}\n\n// ── Virtual table (rows > virtualizeThreshold) — TanStack Virtual v3 ─────────\n\nfunction VirtualTable<TRow extends Record<string, unknown>>({\n rows,\n columns,\n ariaLabel,\n // locale reserved for future virtual-mode empty/pagination strings\n locale: _locale,\n}: TableContentProps<TRow>) {\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const rowVirtualizer = useVirtualizer({\n count: rows.length,\n /* v8 ignore next 1 */\n getScrollElement: () => scrollRef.current,\n estimateSize: useCallback(() => 40, []),\n overscan: OVERSCAN,\n });\n\n const virtualItems = rowVirtualizer.getVirtualItems();\n const totalSize = rowVirtualizer.getTotalSize();\n\n return (\n <div\n data-virtual=\"true\"\n ref={scrollRef}\n style={{ height: 400, overflow: \"auto\", position: \"relative\" }}\n >\n <table\n aria-label={ariaLabel}\n aria-rowcount={rows.length}\n style={{ width: \"100%\", borderCollapse: \"collapse\" }}\n >\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.key} scope=\"col\">\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody\n style={{\n height: `${totalSize}px`,\n position: \"relative\",\n display: \"block\",\n }}\n >\n {virtualItems.map((virtualRow) => {\n /* v8 ignore next */\n const row = rows[virtualRow.index] ?? ({} as Partial<TRow>);\n return (\n <tr\n key={\n (row as Record<string, unknown>).id != null\n ? String((row as Record<string, unknown>).id)\n : `vrow-${virtualRow.index}`\n }\n aria-rowindex={virtualRow.index + 2}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n transform: `translateY(${virtualRow.start}px)`,\n display: \"flex\",\n }}\n >\n {columns.map((col) => (\n <td key={col.key} style={{ flex: 1 }}>\n {renderCell(col, row)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","import { z } from \"zod\";\n\nexport const MarkdownRendererPropsSchema = z.object({\n content: z.string(),\n locale: z.enum([\"en\", \"fr\"]),\n maxLength: z.number().positive().default(50000),\n allowHtml: z.boolean().default(false),\n});\n\nexport type MarkdownRendererProps = z.infer<typeof MarkdownRendererPropsSchema>;\n\nexport function validateProps(raw: unknown): MarkdownRendererProps {\n return MarkdownRendererPropsSchema.parse(raw);\n}\n","import DOMPurify from \"dompurify\";\nimport { marked } from \"marked\";\n// i18nKeys: MarkdownRenderer.aria.content, MarkdownRenderer.error.invalidProps, MarkdownRenderer.error.tooLong\nimport React from \"react\";\nimport { type MosaicLocale, t } from \"../../i18n/strings.js\";\nimport { type MarkdownRendererProps, validateProps } from \"./MarkdownRenderer.schema\";\n\ninterface MarkdownRendererInnerProps {\n content: string;\n locale: \"en\" | \"fr\";\n maxLength: number;\n allowHtml: boolean;\n}\n\nconst tooLongMessages: Record<\"en\" | \"fr\", string> = {\n en: \"Content exceeds maximum length.\",\n fr: \"Le contenu dépasse la longueur maximale.\",\n};\n\nfunction MarkdownRendererInner({\n content,\n locale,\n maxLength,\n allowHtml,\n}: MarkdownRendererInnerProps) {\n if (content.length > maxLength) {\n return (\n <div role=\"alert\" lang={locale}>\n {tooLongMessages[locale]}\n </div>\n );\n }\n\n // When allowHtml=false, strip raw HTML tags from source before parsing,\n // so user-supplied HTML is neutralised before marked converts markdown to HTML.\n const source = allowHtml ? content : content.replace(/<[^>]*>/g, \"\");\n const rawHtml = marked.parse(source, { async: false }) as string;\n // Always sanitize the marked output to prevent XSS from markdown-injected HTML.\n const cleanHtml = DOMPurify.sanitize(rawHtml);\n\n const ariaLabel = locale === \"fr\" ? \"Contenu formaté\" : \"Formatted content\";\n\n return (\n <article\n aria-label={ariaLabel}\n lang={locale}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: sanitized by DOMPurify\n dangerouslySetInnerHTML={{ __html: cleanHtml }}\n />\n );\n}\n\n/**\n * MarkdownRenderer 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 MarkdownRenderer(raw: Record<string, unknown>) {\n try {\n const props = validateProps(raw);\n return <MarkdownRendererInner {...props} />;\n } catch {\n const locale: MosaicLocale = raw.locale === \"fr\" ? \"fr\" : \"en\";\n return <div role=\"alert\">{t(\"MarkdownRenderer.error.invalidProps\", locale)}</div>;\n }\n}\n","import { z } from \"zod\";\n\n// i18nKeys: TokenDisplayOnceModal.button.copy, TokenDisplayOnceModal.button.close,\n// TokenDisplayOnceModal.warning.once, TokenDisplayOnceModal.copied\n\nexport const TokenDisplayOnceModalPropsSchema = z.object({\n token: z.string().min(1),\n title: z.string().min(1),\n warningMessage: z.string().min(1),\n copyLabel: z.string().min(1),\n closeLabel: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type TokenDisplayOnceModalProps = z.infer<typeof TokenDisplayOnceModalPropsSchema> & {\n onClose: () => void;\n};\n\nexport function validateTokenDisplayOnceModalProps(\n raw: unknown,\n): z.infer<typeof TokenDisplayOnceModalPropsSchema> {\n return TokenDisplayOnceModalPropsSchema.parse(raw);\n}\n","\"use client\";\n\n// i18nKeys: TokenDisplayOnceModal.button.copy, TokenDisplayOnceModal.button.close,\n// TokenDisplayOnceModal.warning.once, TokenDisplayOnceModal.copied\n\nimport { type KeyboardEvent, type MouseEvent, useEffect, useId, useRef, useState } from \"react\";\nimport { t } from \"../../i18n/strings.js\";\nimport {\n type TokenDisplayOnceModalProps,\n validateTokenDisplayOnceModalProps,\n} from \"./TokenDisplayOnceModal.schema\";\n\nfunction TokenDisplayOnceModalInner({\n token,\n title,\n warningMessage,\n copyLabel,\n closeLabel,\n locale,\n onClose,\n}: TokenDisplayOnceModalProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const titleId = useId();\n const warningId = useId();\n const [copied, setCopied] = useState(false);\n // Security: token is held only in this useState — on unmount, released by React GC.\n // NEVER logged, NEVER stored in data-*, NEVER written to innerHTML.\n const [secureToken] = useState<string>(token);\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 async function handleCopy() {\n try {\n await navigator.clipboard.writeText(secureToken);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Copy failed — do not leak token in error message\n setCopied(false);\n }\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLDialogElement>) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }\n\n function handleBackdropClick(e: MouseEvent<HTMLDialogElement>) {\n if (e.target === dialogRef.current) {\n onClose();\n }\n }\n\n return (\n <dialog\n ref={dialogRef}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={warningId}\n onKeyDown={handleKeyDown}\n onClick={handleBackdropClick}\n className=\"rounded-lg shadow-xl p-0 backdrop:bg-black/40 w-full max-w-lg 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\n id={warningId}\n className=\"text-sm text-amber-700 bg-amber-50 border border-amber-200 rounded-md px-3 py-2\"\n >\n {warningMessage}\n </p>\n <div className=\"flex items-center gap-2 bg-gray-50 border border-gray-200 rounded-md px-3 py-2\">\n <code className=\"flex-1 text-sm font-mono text-gray-800 break-all select-all\">\n {secureToken}\n </code>\n </div>\n {/* Ephemeral \"Copied\" toast — aria-live polite, no token text */}\n <output aria-live=\"polite\" aria-atomic=\"true\" className=\"min-h-[1.25rem] block\">\n {copied && (\n <span className=\"text-sm text-green-700 font-medium\">\n {t(\"TokenDisplayOnceModal.copied\", locale)}\n </span>\n )}\n </output>\n <div className=\"flex justify-end gap-3 mt-2\">\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"px-4 py-2 rounded-md text-sm font-medium bg-gray-100 text-gray-800 hover:bg-gray-200 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400 transition-colors\"\n >\n {copyLabel}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 rounded-md text-sm font-medium bg-gray-900 text-white hover:bg-gray-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900 transition-colors\"\n >\n {closeLabel}\n </button>\n </div>\n </div>\n </dialog>\n );\n}\n\nexport function TokenDisplayOnceModal(\n raw: Omit<TokenDisplayOnceModalProps, \"locale\"> &\n Partial<Pick<TokenDisplayOnceModalProps, \"locale\">>,\n) {\n try {\n const parsed = validateTokenDisplayOnceModalProps(raw);\n return <TokenDisplayOnceModalInner {...parsed} onClose={raw.onClose} />;\n } catch (err) {\n // Security: use console.warn (not console.error) and do not expose token value in log\n console.warn(\"[TokenDisplayOnceModal] Invalid props — component will not render.\", err);\n return null;\n }\n}\n","import { z } from \"zod\";\n\nexport const StatusBadgePropsSchema = z.object({\n status: z.string(),\n variant: z.enum([\"success\", \"warning\", \"danger\", \"info\", \"neutral\"]).default(\"neutral\"),\n label: z.string().optional(),\n locale: z.enum([\"en\", \"fr\"]),\n});\n\nexport type StatusBadgeProps = z.infer<typeof StatusBadgePropsSchema>;\n\nexport function validateProps(raw: unknown): StatusBadgeProps {\n return StatusBadgePropsSchema.parse(raw);\n}\n","// i18nKeys: StatusBadge.aria.status, StatusBadge.error.invalidProps\nimport React from \"react\";\nimport { type MosaicLocale, t } from \"../../i18n/strings.js\";\nimport { type StatusBadgeProps, validateProps } from \"./StatusBadge.schema\";\n\ntype Variant = \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n\nconst variantClasses: Record<Variant, string> = {\n success: \"bg-green-100 text-green-800 ring-1 ring-green-300\",\n warning: \"bg-amber-100 text-amber-800 ring-1 ring-amber-300\",\n danger: \"bg-red-100 text-red-800 ring-1 ring-red-300\",\n info: \"bg-blue-100 text-blue-800 ring-1 ring-blue-300\",\n neutral: \"bg-slate-100 text-slate-800 ring-1 ring-slate-300\",\n};\n\ninterface StatusBadgeInnerProps {\n status: string;\n variant: Variant;\n label?: string;\n locale: \"en\" | \"fr\";\n}\n\nfunction StatusBadgeInner({ status, variant, label, locale }: StatusBadgeInnerProps) {\n const ariaLabel = label ?? status;\n return (\n <output\n aria-label={ariaLabel}\n lang={locale}\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${variantClasses[variant]}`}\n >\n {label ?? status}\n </output>\n );\n}\n\n/**\n * StatusBadge 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 StatusBadge(raw: Record<string, unknown>) {\n try {\n const props = validateProps(raw);\n return <StatusBadgeInner {...props} />;\n } catch {\n const locale: MosaicLocale = raw.locale === \"fr\" ? \"fr\" : \"en\";\n return <span role=\"alert\">{t(\"StatusBadge.error.invalidProps\", locale)}</span>;\n }\n}\n","import { useEffect, useState } from \"react\";\nimport type { Observable } from \"rxjs\";\n\n/**\n * Subscribes to an Observable stream of partial prop updates and merges them\n * into local state. Used for MCP App streaming hydration (SEP-1865 host-context\n * change notifications, TableView large dataset chunking, etc).\n *\n * @param props$ Observable emitting partial prop chunks.\n * @returns merged state accumulated across emissions.\n */\nexport function useStreamingHydration<T>(props$: Observable<Partial<T>>): Partial<T> {\n const [state, setState] = useState<Partial<T>>({});\n useEffect(() => {\n const sub = props$.subscribe((chunk) => {\n setState((prev) => ({ ...prev, ...chunk }));\n });\n return () => {\n sub.unsubscribe();\n };\n }, [props$]);\n return state;\n}\n","import { type Observable, Subject } from \"rxjs\";\n\n/**\n * MCP App postMessage adapter (mosaic-architecture-standard-v1 §3.4 streaming).\n * Listens for `mosaic.stream.chunk` messages and emits their `data` payload\n * into an RxJS Observable so components can consume them via {@link useStreamingHydration}.\n *\n * Canonical envelope per StreamChunkSchema:\n * { type: 'mosaic.stream.chunk', componentKey, chunkId, data, isLast }\n */\nexport const MOSAIC_STREAM_CHUNK_TYPE = \"mosaic.stream.chunk\" as const;\n\nexport function createPostMessageObservable<T>(): Observable<Partial<T>> {\n const subject = new Subject<Partial<T>>();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"message\", (event: MessageEvent) => {\n const data = event.data as { type?: string; data?: unknown; params?: unknown } | undefined;\n if (data?.type === MOSAIC_STREAM_CHUNK_TYPE) {\n subject.next((data.data ?? data.params) as Partial<T>);\n }\n });\n }\n return subject.asObservable();\n}\n","import { type UIResource, createUIResource } from \"@mcp-ui/server\";\nimport { MarkdownRendererPropsSchema } from \"../components/artifacts/MarkdownRenderer.schema.js\";\nimport { TokenDisplayOnceModalPropsSchema } from \"../components/confirmation/TokenDisplayOnceModal.schema.js\";\nimport { TableViewPropsSchema } from \"../components/display/TableView.schema.js\";\nimport { ConfirmDialogPropsSchema } from \"../components/input/ConfirmDialog.schema.js\";\nimport { StatusBadgePropsSchema } from \"../components/media/StatusBadge.schema.js\";\nimport { ProgressBarPropsSchema } from \"../components/progress/ProgressBar.schema.js\";\n\n/**\n * MCP capability key used by hosts to discover that this server emits\n * MCP UI Apps resources (mosaic-architecture-standard-v1 §2.1).\n */\nexport const MCP_UI_CAPABILITY_KEY = \"io.modelcontextprotocol/ui\" as const;\n\n/**\n * Canonical Mosaic MIME type — every UIResource produced by this server\n * advertises the MCP Apps profile (`text/html;profile=mcp-app`).\n */\nexport const MOSAIC_MIME_TYPE = \"text/html;profile=mcp-app\" as const;\n\ntype SupportedComponent =\n | \"ProgressBar\"\n | \"ConfirmDialog\"\n | \"TableView\"\n | \"MarkdownRenderer\"\n | \"TokenDisplayOnceModal\"\n | \"StatusBadge\";\n\nconst SCHEMA_BY_NAME = {\n ProgressBar: ProgressBarPropsSchema,\n ConfirmDialog: ConfirmDialogPropsSchema,\n TableView: TableViewPropsSchema,\n MarkdownRenderer: MarkdownRendererPropsSchema,\n TokenDisplayOnceModal: TokenDisplayOnceModalPropsSchema,\n StatusBadge: StatusBadgePropsSchema,\n} as const;\n\nconst COMPONENT_KEYS = Object.keys(SCHEMA_BY_NAME) as SupportedComponent[];\n\nconst I18N_TITLE: Record<SupportedComponent, { en: string; fr: string }> = {\n ProgressBar: { en: \"Progress\", fr: \"Progression\" },\n ConfirmDialog: { en: \"Confirmation\", fr: \"Confirmation\" },\n TableView: { en: \"Data table\", fr: \"Tableau de données\" },\n MarkdownRenderer: { en: \"Markdown content\", fr: \"Contenu Markdown\" },\n TokenDisplayOnceModal: { en: \"Token (shown once)\", fr: \"Jeton (affiché une fois)\" },\n StatusBadge: { en: \"Status\", fr: \"Statut\" },\n};\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction fallbackMarkdown(componentName: SupportedComponent, locale: \"en\" | \"fr\"): string {\n const heading = I18N_TITLE[componentName][locale];\n const note =\n locale === \"fr\"\n ? \"Rendu Markdown de secours — composant Mosaic chargé via MCP UI.\"\n : \"Markdown fallback — Mosaic component rendered via MCP UI.\";\n return `# ${heading}\\n\\n${note}\\n`;\n}\n\nfunction buildHtml(componentName: SupportedComponent, props: unknown, locale: \"en\" | \"fr\"): string {\n const propsJson = escapeHtml(JSON.stringify(props));\n const title = escapeHtml(I18N_TITLE[componentName][locale]);\n return `<!DOCTYPE html><html lang=\"${locale}\"><head><meta charset=\"utf-8\"><title>${title}</title></head><body><div id=\"mosaic-root\" data-component=\"${componentName}\" data-props='${propsJson}'></div></body></html>`;\n}\n\nexport interface CreateMosaicResourceOptions {\n /** Optional override for the generated `ui://` URI. */\n uri?: `ui://${string}`;\n /** Optional override of the markdown fallback emitted under `_meta.ui.fallback`. */\n markdownFallback?: string;\n}\n\n/**\n * Create a canonical MCP UI Apps `UIResource` for a Mosaic component.\n *\n * - Runtime-validates `props` with the component's Zod schema (throws on failure).\n * - Wraps the rendered HTML with `createUIResource()` from `@mcp-ui/server`.\n * - Emits canonical nested `_meta.ui.{ resourceUri, locale, componentName, fallback }`.\n * - Uses MIME `text/html;profile=mcp-app` (Mosaic standard §2.1).\n *\n * @throws ZodError when `props` fails validation for `componentName`.\n */\nexport function createMosaicResource(\n componentName: SupportedComponent,\n props: unknown,\n locale: \"en\" | \"fr\" = \"en\",\n): UIResource {\n const schema = SCHEMA_BY_NAME[componentName];\n if (!schema) {\n throw new Error(`createMosaicResource: unknown component '${componentName}'`);\n }\n const validated = schema.parse(props);\n const uri: `ui://${string}` = `ui://mosaic/${componentName.toLowerCase()}`;\n const html = buildHtml(componentName, validated, locale);\n const fallback = fallbackMarkdown(componentName, locale);\n\n const resource = createUIResource({\n uri,\n content: { type: \"rawHtml\", htmlString: html },\n encoding: \"text\",\n metadata: {\n ui: {\n resourceUri: uri,\n locale,\n componentName,\n fallback,\n },\n },\n });\n\n // createUIResource may itself default the MIME type; ensure it matches the\n // Mosaic canonical profile regardless of upstream defaults.\n resource.resource.mimeType = MOSAIC_MIME_TYPE;\n return resource;\n}\n\nexport const MOSAIC_SUPPORTED_COMPONENTS: readonly SupportedComponent[] = COMPONENT_KEYS;\nexport type { SupportedComponent };\n"]}
1
+ {"version":3,"sources":["../src/i18n/strings.ts","../src/components/progress/ProgressBar.schema.ts","../src/components/progress/ProgressBar.tsx","../src/components/input/ConfirmDialog.schema.ts","../src/components/input/ConfirmDialog.tsx","../src/components/display/TableView.schema.ts","../src/components/display/TableView.tsx","../src/components/artifacts/MarkdownRenderer.schema.ts","../src/components/artifacts/MarkdownRenderer.tsx","../src/components/confirmation/TokenDisplayOnceModal.schema.ts","../src/components/confirmation/TokenDisplayOnceModal.tsx","../src/components/media/StatusBadge.schema.ts","../src/components/media/StatusBadge.tsx","../src/hooks/useStreamingHydration.ts","../src/adapters/postMessageAdapter.ts","../src/server/create-mosaic-resource.ts"],"names":["z","jsxs","jsx","useRef","useId","useEffect","useState","useVirtualizer","useCallback","validateProps","marked","DOMPurify","Subject","createUIResource"],"mappings":"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","file":"index.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","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","import type { ReactNode } from \"react\";\nimport type { Observable } from \"rxjs\";\nimport { z } from \"zod\";\n\n// i18nKeys: TableView.aria.table, TableView.pagination.next, TableView.pagination.prev, TableView.empty.message, TableView.error.invalidProps\n\nexport const ColumnDefSchema = z.object({\n key: z.string().min(1),\n header: z.string().min(1),\n // render is a runtime function — excluded from Zod, typed separately\n});\n\nexport type ColumnDef<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n key: string;\n header: string;\n render?: (row: TRow) => ReactNode;\n};\n\n/**\n * Validates the serialisable (non-function) portion of TableView props.\n * The `rows$` Observable and `render` callbacks are not Zod-parseable and\n * must be validated at the call-site type level.\n */\nexport const TableViewPropsSchema = z.object({\n columns: z.array(ColumnDefSchema).min(1, \"TableView requires at least one column\"),\n virtualizeThreshold: z.number().int().positive().default(100),\n ariaLabel: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type TableViewPropsSchemaInput = z.input<typeof TableViewPropsSchema>;\nexport type TableViewPropsSchemaOutput = z.output<typeof TableViewPropsSchema>;\n\n/**\n * Props for the static TableView — accepts a plain array of rows.\n * Primary API for already-fetched data (no rxjs required).\n */\nexport type TableViewProps<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n columns: ColumnDef<TRow>[];\n rows: Partial<TRow>[];\n virtualizeThreshold?: number;\n ariaLabel: string;\n locale?: \"en\" | \"fr\";\n /** v0.2.1+: when provided, rows become keyboard-activable (role=button + tabIndex=0 + Enter/Space). 5-BU ABSOLUTE blocker fix. */\n onRowClick?: (row: TRow, index: number) => void;\n};\n\n/**\n * Props for StreamingTableView — accepts an RxJS Observable for incremental row appending.\n * Consumers using this variant MUST install rxjs ^7.8.0 in their project.\n */\nexport type StreamingTableViewProps<\n TRow extends Record<string, unknown> = Record<string, unknown>,\n> = {\n columns: ColumnDef<TRow>[];\n rows$: Observable<Partial<TRow>[]>;\n virtualizeThreshold?: number;\n ariaLabel: string;\n locale?: \"en\" | \"fr\";\n /** v0.2.1+: same semantics as static TableView. */\n onRowClick?: (row: TRow, index: number) => void;\n};\n\nexport function validateTableViewProps(raw: unknown): TableViewPropsSchemaOutput {\n return TableViewPropsSchema.parse(raw);\n}\n","// i18nKeys: TableView.aria.table, TableView.pagination.next, TableView.pagination.prev, TableView.empty.message, TableView.error.invalidProps\n\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { type MosaicLocale, t } from \"../../i18n/strings.js\";\nimport { validateTableViewProps } from \"./TableView.schema\";\nimport type { StreamingTableViewProps, TableViewProps } from \"./TableView.schema\";\n\nconst OVERSCAN = 5;\n\n/**\n * TableView — Static rows variant (primary API).\n *\n * Accepts `rows: Row[]` for already-fetched data — no rxjs required.\n * Activates TanStack Virtual v3 windowing when rows.length > virtualizeThreshold.\n * Zod-validates serialisable props; renders role=\"alert\" fallback on failure.\n * Fully accessible: aria-rowcount, aria-label, scope=\"col\".\n */\nexport function TableView<TRow extends Record<string, unknown> = Record<string, unknown>>(\n props: TableViewProps<TRow>,\n) {\n // ── Zod validation (serialisable props only) ───────────────────────────────\n let validatedThreshold = 100;\n try {\n const validated = validateTableViewProps({\n columns: props.columns.map(({ key, header }) => ({ key, header })),\n virtualizeThreshold: props.virtualizeThreshold,\n ariaLabel: props.ariaLabel,\n locale: props.locale,\n });\n validatedThreshold = validated.virtualizeThreshold;\n } catch {\n const locale: MosaicLocale = props.locale === \"fr\" ? \"fr\" : \"en\";\n return <div role=\"alert\">{t(\"TableView.error.invalidProps\", locale)}</div>;\n }\n\n const isVirtual = props.rows.length > validatedThreshold;\n const resolvedLocale: MosaicLocale = props.locale === \"fr\" ? \"fr\" : \"en\";\n\n if (isVirtual) {\n return (\n <VirtualTable<TRow>\n rows={props.rows}\n columns={props.columns}\n ariaLabel={props.ariaLabel}\n locale={resolvedLocale}\n onRowClick={props.onRowClick}\n />\n );\n }\n\n return (\n <StaticTable<TRow>\n rows={props.rows}\n columns={props.columns}\n ariaLabel={props.ariaLabel}\n locale={resolvedLocale}\n onRowClick={props.onRowClick}\n />\n );\n}\n\n/**\n * StreamingTableView — Streaming rows variant (advanced, opt-in).\n *\n * Pattern 4 Streaming Hydration reference implementation.\n * Consumes an RxJS Observable<Row[]> for incremental row appending.\n * Consumers MUST install rxjs ^7.8.0 in their project.\n * Activates TanStack Virtual v3 windowing when rows.length > virtualizeThreshold.\n * Zod-validates serialisable props; renders role=\"alert\" fallback on failure.\n * Fully accessible: aria-rowcount, aria-label, scope=\"col\".\n */\nexport function StreamingTableView<TRow extends Record<string, unknown> = Record<string, unknown>>(\n props: StreamingTableViewProps<TRow>,\n) {\n // ── Zod validation (serialisable props only) ───────────────────────────────\n let validatedThreshold = 100;\n try {\n const validated = validateTableViewProps({\n columns: props.columns.map(({ key, header }) => ({ key, header })),\n virtualizeThreshold: props.virtualizeThreshold,\n ariaLabel: props.ariaLabel,\n locale: props.locale,\n });\n validatedThreshold = validated.virtualizeThreshold;\n } catch {\n const locale: MosaicLocale = props.locale === \"fr\" ? \"fr\" : \"en\";\n return <div role=\"alert\">{t(\"TableView.error.invalidProps\", locale)}</div>;\n }\n\n return (\n <StreamingTableViewInner<TRow>\n {...props}\n virtualizeThreshold={validatedThreshold}\n onRowClick={props.onRowClick}\n />\n );\n}\n\n// ── Inner implementation for streaming (rendered only after validation passes) ──\n\nfunction StreamingTableViewInner<TRow extends Record<string, unknown> = Record<string, unknown>>({\n columns,\n rows$,\n virtualizeThreshold = 100,\n ariaLabel,\n locale,\n onRowClick,\n}: StreamingTableViewProps<TRow> & { virtualizeThreshold: number }) {\n const resolvedLocale: MosaicLocale = locale === \"fr\" ? \"fr\" : \"en\";\n const [rows, setRows] = useState<Partial<TRow>[]>([]);\n\n // Subscribe to the Observable and accumulate chunks\n useEffect(() => {\n setRows([]);\n const sub = rows$.subscribe((chunk) => {\n setRows((prev) => [...prev, ...chunk]);\n });\n return () => {\n sub.unsubscribe();\n };\n }, [rows$]);\n\n const isVirtual = rows.length > virtualizeThreshold;\n\n if (isVirtual) {\n return (\n <VirtualTable<TRow>\n rows={rows}\n columns={columns}\n ariaLabel={ariaLabel}\n locale={resolvedLocale}\n onRowClick={onRowClick}\n />\n );\n }\n\n return (\n <StaticTable<TRow>\n rows={rows}\n columns={columns}\n ariaLabel={ariaLabel}\n locale={resolvedLocale}\n onRowClick={onRowClick}\n />\n );\n}\n\n// ── Static table (rows <= virtualizeThreshold) ────────────────────────────────\n\ntype TableContentProps<TRow extends Record<string, unknown>> = {\n rows: Partial<TRow>[];\n columns: TableViewProps<TRow>[\"columns\"];\n ariaLabel: string;\n locale: MosaicLocale;\n onRowClick?: (row: TRow, index: number) => void;\n};\n\n/** Renders a single cell — uses col.render if provided, else converts to string */\nfunction renderCell<TRow extends Record<string, unknown>>(\n col: TableViewProps<TRow>[\"columns\"][number],\n row: Partial<TRow>,\n): React.ReactNode {\n if (col.render) {\n return col.render(row as TRow);\n }\n return String((row as Record<string, unknown>)[col.key] ?? \"\");\n}\n\nfunction StaticTable<TRow extends Record<string, unknown>>({\n rows,\n columns,\n ariaLabel,\n locale,\n onRowClick,\n}: TableContentProps<TRow>) {\n const emptyMsg = t(\"TableView.empty.message\", locale);\n return (\n <table\n aria-label={ariaLabel}\n aria-rowcount={rows.length}\n style={{ width: \"100%\", borderCollapse: \"collapse\" }}\n >\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.key} scope=\"col\">\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td colSpan={columns.length} aria-label={emptyMsg}>\n {emptyMsg}\n </td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr\n key={\n (row as Record<string, unknown>).id != null\n ? String((row as Record<string, unknown>).id)\n : `row-${rowIndex}`\n }\n aria-rowindex={rowIndex + 2}\n {...(onRowClick\n ? {\n role: \"button\",\n tabIndex: 0,\n style: { cursor: \"pointer\" },\n onClick: () => onRowClick(row as TRow, rowIndex),\n onKeyDown: (e: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onRowClick(row as TRow, rowIndex);\n }\n },\n }\n : {})}\n >\n {columns.map((col) => (\n <td key={col.key}>{renderCell(col, row)}</td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n );\n}\n\n// ── Virtual table (rows > virtualizeThreshold) — TanStack Virtual v3 ─────────\n\nfunction VirtualTable<TRow extends Record<string, unknown>>({\n rows,\n columns,\n ariaLabel,\n // locale reserved for future virtual-mode empty/pagination strings\n locale: _locale,\n onRowClick,\n}: TableContentProps<TRow>) {\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const rowVirtualizer = useVirtualizer({\n count: rows.length,\n /* v8 ignore next 1 */\n getScrollElement: () => scrollRef.current,\n estimateSize: useCallback(() => 40, []),\n overscan: OVERSCAN,\n });\n\n const virtualItems = rowVirtualizer.getVirtualItems();\n const totalSize = rowVirtualizer.getTotalSize();\n\n return (\n <div\n data-virtual=\"true\"\n ref={scrollRef}\n style={{ height: 400, overflow: \"auto\", position: \"relative\" }}\n >\n <table\n aria-label={ariaLabel}\n aria-rowcount={rows.length}\n style={{ width: \"100%\", borderCollapse: \"collapse\" }}\n >\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.key} scope=\"col\">\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody\n style={{\n height: `${totalSize}px`,\n position: \"relative\",\n display: \"block\",\n }}\n >\n {virtualItems.map((virtualRow) => {\n /* v8 ignore next */\n const row = rows[virtualRow.index] ?? ({} as Partial<TRow>);\n return (\n <tr\n key={\n (row as Record<string, unknown>).id != null\n ? String((row as Record<string, unknown>).id)\n : `vrow-${virtualRow.index}`\n }\n aria-rowindex={virtualRow.index + 2}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n transform: `translateY(${virtualRow.start}px)`,\n display: \"flex\",\n ...(onRowClick ? { cursor: \"pointer\" } : {}),\n }}\n {...(onRowClick\n ? {\n role: \"button\",\n tabIndex: 0,\n onClick: () => onRowClick(row as TRow, virtualRow.index),\n onKeyDown: (e: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onRowClick(row as TRow, virtualRow.index);\n }\n },\n }\n : {})}\n >\n {columns.map((col) => (\n <td key={col.key} style={{ flex: 1 }}>\n {renderCell(col, row)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","import { z } from \"zod\";\n\nexport const MarkdownRendererPropsSchema = z.object({\n content: z.string(),\n locale: z.enum([\"en\", \"fr\"]),\n maxLength: z.number().positive().default(50000),\n allowHtml: z.boolean().default(false),\n});\n\nexport type MarkdownRendererProps = z.infer<typeof MarkdownRendererPropsSchema>;\n\nexport function validateProps(raw: unknown): MarkdownRendererProps {\n return MarkdownRendererPropsSchema.parse(raw);\n}\n","import DOMPurify from \"dompurify\";\nimport { marked } from \"marked\";\n// i18nKeys: MarkdownRenderer.aria.content, MarkdownRenderer.error.invalidProps, MarkdownRenderer.error.tooLong\nimport React from \"react\";\nimport { type MosaicLocale, t } from \"../../i18n/strings.js\";\nimport { type MarkdownRendererProps, validateProps } from \"./MarkdownRenderer.schema\";\n\ninterface MarkdownRendererInnerProps {\n content: string;\n locale: \"en\" | \"fr\";\n maxLength: number;\n allowHtml: boolean;\n}\n\nconst tooLongMessages: Record<\"en\" | \"fr\", string> = {\n en: \"Content exceeds maximum length.\",\n fr: \"Le contenu dépasse la longueur maximale.\",\n};\n\nfunction MarkdownRendererInner({\n content,\n locale,\n maxLength,\n allowHtml,\n}: MarkdownRendererInnerProps) {\n if (content.length > maxLength) {\n return (\n <div role=\"alert\" lang={locale}>\n {tooLongMessages[locale]}\n </div>\n );\n }\n\n // When allowHtml=false, strip raw HTML tags from source before parsing,\n // so user-supplied HTML is neutralised before marked converts markdown to HTML.\n const source = allowHtml ? content : content.replace(/<[^>]*>/g, \"\");\n const rawHtml = marked.parse(source, { async: false }) as string;\n // Always sanitize the marked output to prevent XSS from markdown-injected HTML.\n const cleanHtml = DOMPurify.sanitize(rawHtml);\n\n const ariaLabel = locale === \"fr\" ? \"Contenu formaté\" : \"Formatted content\";\n\n return (\n <article\n aria-label={ariaLabel}\n lang={locale}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: sanitized by DOMPurify\n dangerouslySetInnerHTML={{ __html: cleanHtml }}\n />\n );\n}\n\n/**\n * MarkdownRenderer 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 MarkdownRenderer(raw: Record<string, unknown>) {\n try {\n const props = validateProps(raw);\n return <MarkdownRendererInner {...props} />;\n } catch {\n const locale: MosaicLocale = raw.locale === \"fr\" ? \"fr\" : \"en\";\n return <div role=\"alert\">{t(\"MarkdownRenderer.error.invalidProps\", locale)}</div>;\n }\n}\n","import { z } from \"zod\";\n\n// i18nKeys: TokenDisplayOnceModal.button.copy, TokenDisplayOnceModal.button.close,\n// TokenDisplayOnceModal.warning.once, TokenDisplayOnceModal.copied\n\nexport const TokenDisplayOnceModalPropsSchema = z.object({\n token: z.string().min(1),\n title: z.string().min(1),\n warningMessage: z.string().min(1),\n copyLabel: z.string().min(1),\n closeLabel: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type TokenDisplayOnceModalProps = z.infer<typeof TokenDisplayOnceModalPropsSchema> & {\n onClose: () => void;\n};\n\nexport function validateTokenDisplayOnceModalProps(\n raw: unknown,\n): z.infer<typeof TokenDisplayOnceModalPropsSchema> {\n return TokenDisplayOnceModalPropsSchema.parse(raw);\n}\n","\"use client\";\n\n// i18nKeys: TokenDisplayOnceModal.button.copy, TokenDisplayOnceModal.button.close,\n// TokenDisplayOnceModal.warning.once, TokenDisplayOnceModal.copied\n\nimport { type KeyboardEvent, type MouseEvent, useEffect, useId, useRef, useState } from \"react\";\nimport { t } from \"../../i18n/strings.js\";\nimport {\n type TokenDisplayOnceModalProps,\n validateTokenDisplayOnceModalProps,\n} from \"./TokenDisplayOnceModal.schema\";\n\nfunction TokenDisplayOnceModalInner({\n token,\n title,\n warningMessage,\n copyLabel,\n closeLabel,\n locale,\n onClose,\n}: TokenDisplayOnceModalProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const titleId = useId();\n const warningId = useId();\n const [copied, setCopied] = useState(false);\n // Security: token is held only in this useState — on unmount, released by React GC.\n // NEVER logged, NEVER stored in data-*, NEVER written to innerHTML.\n const [secureToken] = useState<string>(token);\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 async function handleCopy() {\n try {\n await navigator.clipboard.writeText(secureToken);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Copy failed — do not leak token in error message\n setCopied(false);\n }\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLDialogElement>) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }\n\n function handleBackdropClick(e: MouseEvent<HTMLDialogElement>) {\n if (e.target === dialogRef.current) {\n onClose();\n }\n }\n\n return (\n <dialog\n ref={dialogRef}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={warningId}\n onKeyDown={handleKeyDown}\n onClick={handleBackdropClick}\n className=\"rounded-lg shadow-xl p-0 backdrop:bg-black/40 w-full max-w-lg 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\n id={warningId}\n className=\"text-sm text-amber-700 bg-amber-50 border border-amber-200 rounded-md px-3 py-2\"\n >\n {warningMessage}\n </p>\n <div className=\"flex items-center gap-2 bg-gray-50 border border-gray-200 rounded-md px-3 py-2\">\n <code className=\"flex-1 text-sm font-mono text-gray-800 break-all select-all\">\n {secureToken}\n </code>\n </div>\n {/* Ephemeral \"Copied\" toast — aria-live polite, no token text */}\n <output aria-live=\"polite\" aria-atomic=\"true\" className=\"min-h-[1.25rem] block\">\n {copied && (\n <span className=\"text-sm text-green-700 font-medium\">\n {t(\"TokenDisplayOnceModal.copied\", locale)}\n </span>\n )}\n </output>\n <div className=\"flex justify-end gap-3 mt-2\">\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"px-4 py-2 rounded-md text-sm font-medium bg-gray-100 text-gray-800 hover:bg-gray-200 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400 transition-colors\"\n >\n {copyLabel}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 rounded-md text-sm font-medium bg-gray-900 text-white hover:bg-gray-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900 transition-colors\"\n >\n {closeLabel}\n </button>\n </div>\n </div>\n </dialog>\n );\n}\n\nexport function TokenDisplayOnceModal(\n raw: Omit<TokenDisplayOnceModalProps, \"locale\"> &\n Partial<Pick<TokenDisplayOnceModalProps, \"locale\">>,\n) {\n try {\n const parsed = validateTokenDisplayOnceModalProps(raw);\n return <TokenDisplayOnceModalInner {...parsed} onClose={raw.onClose} />;\n } catch (err) {\n // Security: use console.warn (not console.error) and do not expose token value in log\n console.warn(\"[TokenDisplayOnceModal] Invalid props — component will not render.\", err);\n return null;\n }\n}\n","import { z } from \"zod\";\n\nexport const StatusBadgePropsSchema = z.object({\n status: z.string(),\n variant: z.enum([\"success\", \"warning\", \"danger\", \"info\", \"neutral\"]).default(\"neutral\"),\n label: z.string().optional(),\n locale: z.enum([\"en\", \"fr\"]),\n});\n\nexport type StatusBadgeProps = z.infer<typeof StatusBadgePropsSchema>;\n\nexport function validateProps(raw: unknown): StatusBadgeProps {\n return StatusBadgePropsSchema.parse(raw);\n}\n","// i18nKeys: StatusBadge.aria.status, StatusBadge.error.invalidProps\nimport React from \"react\";\nimport { type MosaicLocale, t } from \"../../i18n/strings.js\";\nimport { type StatusBadgeProps, validateProps } from \"./StatusBadge.schema\";\n\ntype Variant = \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n\nconst variantClasses: Record<Variant, string> = {\n success: \"bg-green-100 text-green-800 ring-1 ring-green-300\",\n warning: \"bg-amber-100 text-amber-800 ring-1 ring-amber-300\",\n danger: \"bg-red-100 text-red-800 ring-1 ring-red-300\",\n info: \"bg-blue-100 text-blue-800 ring-1 ring-blue-300\",\n neutral: \"bg-slate-100 text-slate-800 ring-1 ring-slate-300\",\n};\n\ninterface StatusBadgeInnerProps {\n status: string;\n variant: Variant;\n label?: string;\n locale: \"en\" | \"fr\";\n}\n\nfunction StatusBadgeInner({ status, variant, label, locale }: StatusBadgeInnerProps) {\n const ariaLabel = label ?? status;\n return (\n <output\n aria-label={ariaLabel}\n lang={locale}\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${variantClasses[variant]}`}\n >\n {label ?? status}\n </output>\n );\n}\n\n/**\n * StatusBadge 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 StatusBadge(raw: Record<string, unknown>) {\n try {\n const props = validateProps(raw);\n return <StatusBadgeInner {...props} />;\n } catch {\n const locale: MosaicLocale = raw.locale === \"fr\" ? \"fr\" : \"en\";\n return <span role=\"alert\">{t(\"StatusBadge.error.invalidProps\", locale)}</span>;\n }\n}\n","import { useEffect, useState } from \"react\";\nimport type { Observable } from \"rxjs\";\n\n/**\n * Subscribes to an Observable stream of partial prop updates and merges them\n * into local state. Used for MCP App streaming hydration (SEP-1865 host-context\n * change notifications, TableView large dataset chunking, etc).\n *\n * @param props$ Observable emitting partial prop chunks.\n * @returns merged state accumulated across emissions.\n */\nexport function useStreamingHydration<T>(props$: Observable<Partial<T>>): Partial<T> {\n const [state, setState] = useState<Partial<T>>({});\n useEffect(() => {\n const sub = props$.subscribe((chunk) => {\n setState((prev) => ({ ...prev, ...chunk }));\n });\n return () => {\n sub.unsubscribe();\n };\n }, [props$]);\n return state;\n}\n","import { type Observable, Subject } from \"rxjs\";\n\n/**\n * MCP App postMessage adapter (mosaic-architecture-standard-v1 §3.4 streaming).\n * Listens for `mosaic.stream.chunk` messages and emits their `data` payload\n * into an RxJS Observable so components can consume them via {@link useStreamingHydration}.\n *\n * Canonical envelope per StreamChunkSchema:\n * { type: 'mosaic.stream.chunk', componentKey, chunkId, data, isLast }\n */\nexport const MOSAIC_STREAM_CHUNK_TYPE = \"mosaic.stream.chunk\" as const;\n\nexport function createPostMessageObservable<T>(): Observable<Partial<T>> {\n const subject = new Subject<Partial<T>>();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"message\", (event: MessageEvent) => {\n const data = event.data as { type?: string; data?: unknown; params?: unknown } | undefined;\n if (data?.type === MOSAIC_STREAM_CHUNK_TYPE) {\n subject.next((data.data ?? data.params) as Partial<T>);\n }\n });\n }\n return subject.asObservable();\n}\n","import { type UIResource, createUIResource } from \"@mcp-ui/server\";\nimport { MarkdownRendererPropsSchema } from \"../components/artifacts/MarkdownRenderer.schema.js\";\nimport { TokenDisplayOnceModalPropsSchema } from \"../components/confirmation/TokenDisplayOnceModal.schema.js\";\nimport { TableViewPropsSchema } from \"../components/display/TableView.schema.js\";\nimport { ConfirmDialogPropsSchema } from \"../components/input/ConfirmDialog.schema.js\";\nimport { StatusBadgePropsSchema } from \"../components/media/StatusBadge.schema.js\";\nimport { ProgressBarPropsSchema } from \"../components/progress/ProgressBar.schema.js\";\n\n/**\n * MCP capability key used by hosts to discover that this server emits\n * MCP UI Apps resources (mosaic-architecture-standard-v1 §2.1).\n */\nexport const MCP_UI_CAPABILITY_KEY = \"io.modelcontextprotocol/ui\" as const;\n\n/**\n * Canonical Mosaic MIME type — every UIResource produced by this server\n * advertises the MCP Apps profile (`text/html;profile=mcp-app`).\n */\nexport const MOSAIC_MIME_TYPE = \"text/html;profile=mcp-app\" as const;\n\ntype SupportedComponent =\n | \"ProgressBar\"\n | \"ConfirmDialog\"\n | \"TableView\"\n | \"MarkdownRenderer\"\n | \"TokenDisplayOnceModal\"\n | \"StatusBadge\";\n\nconst SCHEMA_BY_NAME = {\n ProgressBar: ProgressBarPropsSchema,\n ConfirmDialog: ConfirmDialogPropsSchema,\n TableView: TableViewPropsSchema,\n MarkdownRenderer: MarkdownRendererPropsSchema,\n TokenDisplayOnceModal: TokenDisplayOnceModalPropsSchema,\n StatusBadge: StatusBadgePropsSchema,\n} as const;\n\nconst COMPONENT_KEYS = Object.keys(SCHEMA_BY_NAME) as SupportedComponent[];\n\nconst I18N_TITLE: Record<SupportedComponent, { en: string; fr: string }> = {\n ProgressBar: { en: \"Progress\", fr: \"Progression\" },\n ConfirmDialog: { en: \"Confirmation\", fr: \"Confirmation\" },\n TableView: { en: \"Data table\", fr: \"Tableau de données\" },\n MarkdownRenderer: { en: \"Markdown content\", fr: \"Contenu Markdown\" },\n TokenDisplayOnceModal: { en: \"Token (shown once)\", fr: \"Jeton (affiché une fois)\" },\n StatusBadge: { en: \"Status\", fr: \"Statut\" },\n};\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction fallbackMarkdown(componentName: SupportedComponent, locale: \"en\" | \"fr\"): string {\n const heading = I18N_TITLE[componentName][locale];\n const note =\n locale === \"fr\"\n ? \"Rendu Markdown de secours — composant Mosaic chargé via MCP UI.\"\n : \"Markdown fallback — Mosaic component rendered via MCP UI.\";\n return `# ${heading}\\n\\n${note}\\n`;\n}\n\nfunction buildHtml(componentName: SupportedComponent, props: unknown, locale: \"en\" | \"fr\"): string {\n const propsJson = escapeHtml(JSON.stringify(props));\n const title = escapeHtml(I18N_TITLE[componentName][locale]);\n return `<!DOCTYPE html><html lang=\"${locale}\"><head><meta charset=\"utf-8\"><title>${title}</title></head><body><div id=\"mosaic-root\" data-component=\"${componentName}\" data-props='${propsJson}'></div></body></html>`;\n}\n\nexport interface CreateMosaicResourceOptions {\n /** Optional override for the generated `ui://` URI. */\n uri?: `ui://${string}`;\n /** Optional override of the markdown fallback emitted under `_meta.ui.fallback`. */\n markdownFallback?: string;\n}\n\n/**\n * Create a canonical MCP UI Apps `UIResource` for a Mosaic component.\n *\n * - Runtime-validates `props` with the component's Zod schema (throws on failure).\n * - Wraps the rendered HTML with `createUIResource()` from `@mcp-ui/server`.\n * - Emits canonical nested `_meta.ui.{ resourceUri, locale, componentName, fallback }`.\n * - Uses MIME `text/html;profile=mcp-app` (Mosaic standard §2.1).\n *\n * @throws ZodError when `props` fails validation for `componentName`.\n */\nexport function createMosaicResource(\n componentName: SupportedComponent,\n props: unknown,\n locale: \"en\" | \"fr\" = \"en\",\n): UIResource {\n const schema = SCHEMA_BY_NAME[componentName];\n if (!schema) {\n throw new Error(`createMosaicResource: unknown component '${componentName}'`);\n }\n const validated = schema.parse(props);\n const uri: `ui://${string}` = `ui://mosaic/${componentName.toLowerCase()}`;\n const html = buildHtml(componentName, validated, locale);\n const fallback = fallbackMarkdown(componentName, locale);\n\n const resource = createUIResource({\n uri,\n content: { type: \"rawHtml\", htmlString: html },\n encoding: \"text\",\n metadata: {\n ui: {\n resourceUri: uri,\n locale,\n componentName,\n fallback,\n },\n },\n });\n\n // createUIResource may itself default the MIME type; ensure it matches the\n // Mosaic canonical profile regardless of upstream defaults.\n resource.resource.mimeType = MOSAIC_MIME_TYPE;\n return resource;\n}\n\nexport const MOSAIC_SUPPORTED_COMPONENTS: readonly SupportedComponent[] = COMPONENT_KEYS;\nexport type { SupportedComponent };\n"]}
package/dist/index.js CHANGED
@@ -248,7 +248,8 @@ function TableView(props) {
248
248
  rows: props.rows,
249
249
  columns: props.columns,
250
250
  ariaLabel: props.ariaLabel,
251
- locale: resolvedLocale
251
+ locale: resolvedLocale,
252
+ onRowClick: props.onRowClick
252
253
  }
253
254
  );
254
255
  }
@@ -258,7 +259,8 @@ function TableView(props) {
258
259
  rows: props.rows,
259
260
  columns: props.columns,
260
261
  ariaLabel: props.ariaLabel,
261
- locale: resolvedLocale
262
+ locale: resolvedLocale,
263
+ onRowClick: props.onRowClick
262
264
  }
263
265
  );
264
266
  }
@@ -276,14 +278,22 @@ function StreamingTableView(props) {
276
278
  const locale = props.locale === "fr" ? "fr" : "en";
277
279
  return /* @__PURE__ */ jsx("div", { role: "alert", children: t("TableView.error.invalidProps", locale) });
278
280
  }
279
- return /* @__PURE__ */ jsx(StreamingTableViewInner, { ...props, virtualizeThreshold: validatedThreshold });
281
+ return /* @__PURE__ */ jsx(
282
+ StreamingTableViewInner,
283
+ {
284
+ ...props,
285
+ virtualizeThreshold: validatedThreshold,
286
+ onRowClick: props.onRowClick
287
+ }
288
+ );
280
289
  }
281
290
  function StreamingTableViewInner({
282
291
  columns,
283
292
  rows$,
284
293
  virtualizeThreshold = 100,
285
294
  ariaLabel,
286
- locale
295
+ locale,
296
+ onRowClick
287
297
  }) {
288
298
  const resolvedLocale = locale === "fr" ? "fr" : "en";
289
299
  const [rows, setRows] = useState([]);
@@ -304,7 +314,8 @@ function StreamingTableViewInner({
304
314
  rows,
305
315
  columns,
306
316
  ariaLabel,
307
- locale: resolvedLocale
317
+ locale: resolvedLocale,
318
+ onRowClick
308
319
  }
309
320
  );
310
321
  }
@@ -314,7 +325,8 @@ function StreamingTableViewInner({
314
325
  rows,
315
326
  columns,
316
327
  ariaLabel,
317
- locale: resolvedLocale
328
+ locale: resolvedLocale,
329
+ onRowClick
318
330
  }
319
331
  );
320
332
  }
@@ -328,7 +340,8 @@ function StaticTable({
328
340
  rows,
329
341
  columns,
330
342
  ariaLabel,
331
- locale
343
+ locale,
344
+ onRowClick
332
345
  }) {
333
346
  const emptyMsg = t("TableView.empty.message", locale);
334
347
  return /* @__PURE__ */ jsxs(
@@ -343,6 +356,18 @@ function StaticTable({
343
356
  "tr",
344
357
  {
345
358
  "aria-rowindex": rowIndex + 2,
359
+ ...onRowClick ? {
360
+ role: "button",
361
+ tabIndex: 0,
362
+ style: { cursor: "pointer" },
363
+ onClick: () => onRowClick(row, rowIndex),
364
+ onKeyDown: (e) => {
365
+ if (e.key === "Enter" || e.key === " ") {
366
+ e.preventDefault();
367
+ onRowClick(row, rowIndex);
368
+ }
369
+ }
370
+ } : {},
346
371
  children: columns.map((col) => /* @__PURE__ */ jsx("td", { children: renderCell(col, row) }, col.key))
347
372
  },
348
373
  row.id != null ? String(row.id) : `row-${rowIndex}`
@@ -356,7 +381,8 @@ function VirtualTable({
356
381
  columns,
357
382
  ariaLabel,
358
383
  // locale reserved for future virtual-mode empty/pagination strings
359
- locale: _locale
384
+ locale: _locale,
385
+ onRowClick
360
386
  }) {
361
387
  const scrollRef = useRef(null);
362
388
  const rowVirtualizer = useVirtualizer({
@@ -402,8 +428,20 @@ function VirtualTable({
402
428
  left: 0,
403
429
  width: "100%",
404
430
  transform: `translateY(${virtualRow.start}px)`,
405
- display: "flex"
431
+ display: "flex",
432
+ ...onRowClick ? { cursor: "pointer" } : {}
406
433
  },
434
+ ...onRowClick ? {
435
+ role: "button",
436
+ tabIndex: 0,
437
+ onClick: () => onRowClick(row, virtualRow.index),
438
+ onKeyDown: (e) => {
439
+ if (e.key === "Enter" || e.key === " ") {
440
+ e.preventDefault();
441
+ onRowClick(row, virtualRow.index);
442
+ }
443
+ }
444
+ } : {},
407
445
  children: columns.map((col) => /* @__PURE__ */ jsx("td", { style: { flex: 1 }, children: renderCell(col, row) }, col.key))
408
446
  },
409
447
  row.id != null ? String(row.id) : `vrow-${virtualRow.index}`