@alfadocs/ui-kit-debug 1.126.0 → 1.127.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 (151) hide show
  1. package/dist/_chunks/{balance-badge-cell-DtxbGJcA.js → balance-badge-cell-BtFge7Y6.js} +3 -3
  2. package/dist/_chunks/{balance-badge-cell-DtxbGJcA.js.map → balance-badge-cell-BtFge7Y6.js.map} +1 -1
  3. package/dist/_chunks/{bill-line-table-HrynB7ND.js → bill-line-table-BRxX0Awq.js} +2 -2
  4. package/dist/_chunks/{bill-line-table-HrynB7ND.js.map → bill-line-table-BRxX0Awq.js.map} +1 -1
  5. package/dist/_chunks/{calendar-appointment-editor-dialog-CiCmsBCH.js → calendar-appointment-editor-dialog-B-zYgCgH.js} +2 -2
  6. package/dist/_chunks/{calendar-appointment-editor-dialog-CiCmsBCH.js.map → calendar-appointment-editor-dialog-B-zYgCgH.js.map} +1 -1
  7. package/dist/_chunks/{data-grid-C71BhGDw.js → data-grid-bzvkQ3kc.js} +446 -423
  8. package/dist/_chunks/data-grid-bzvkQ3kc.js.map +1 -0
  9. package/dist/_chunks/{data-table-DhYx-hCD.js → data-table-BCfkcPti.js} +2 -2
  10. package/dist/_chunks/{data-table-DhYx-hCD.js.map → data-table-BCfkcPti.js.map} +1 -1
  11. package/dist/_chunks/{default-tabs-RvCI5uN0.js → default-tabs-yEfqAPuT.js} +3 -3
  12. package/dist/_chunks/{default-tabs-RvCI5uN0.js.map → default-tabs-yEfqAPuT.js.map} +1 -1
  13. package/dist/_chunks/{file-manager-DNq-sEsy.js → file-manager-Dpwv0qs-.js} +2 -2
  14. package/dist/_chunks/{file-manager-DNq-sEsy.js.map → file-manager-Dpwv0qs-.js.map} +1 -1
  15. package/dist/_chunks/{heatmap-BurtKmeu.js → heatmap-Ds5DJBUL.js} +2 -2
  16. package/dist/_chunks/{heatmap-BurtKmeu.js.map → heatmap-Ds5DJBUL.js.map} +1 -1
  17. package/dist/_chunks/{invoice-upload-list-C95s5Q7m.js → invoice-upload-list-CgS_TBuX.js} +12 -12
  18. package/dist/_chunks/invoice-upload-list-CgS_TBuX.js.map +1 -0
  19. package/dist/_chunks/{link-cell-renderer-BEaLczk2.js → link-cell-renderer-CC9VHU68.js} +2 -2
  20. package/dist/_chunks/{link-cell-renderer-BEaLczk2.js.map → link-cell-renderer-CC9VHU68.js.map} +1 -1
  21. package/dist/_chunks/{muscle-scheme-TgnoZGDA.js → muscle-scheme-CHrjv7p2.js} +237 -235
  22. package/dist/_chunks/{muscle-scheme-TgnoZGDA.js.map → muscle-scheme-CHrjv7p2.js.map} +1 -1
  23. package/dist/_chunks/{parts-CcyRkB8t.js → parts-tGzYz0uG.js} +42 -36
  24. package/dist/_chunks/parts-tGzYz0uG.js.map +1 -0
  25. package/dist/_chunks/{toolbar-Dznu_Dou.js → toolbar-Co46MEn9.js} +3 -3
  26. package/dist/_chunks/{toolbar-Dznu_Dou.js.map → toolbar-Co46MEn9.js.map} +1 -1
  27. package/dist/_chunks/warehouse-load-summary-DkAKXcw0.js +289 -0
  28. package/dist/_chunks/warehouse-load-summary-DkAKXcw0.js.map +1 -0
  29. package/dist/agent-catalog.json +1 -1
  30. package/dist/browser-support.js +1 -1
  31. package/dist/components/_shared/table-toolbar/parts.d.ts.map +1 -1
  32. package/dist/components/bill-line-table/index.js +1 -1
  33. package/dist/components/bill-table/index.js +1 -1
  34. package/dist/components/data-grid/data-grid.variants.d.ts +3 -1
  35. package/dist/components/data-grid/data-grid.variants.d.ts.map +1 -1
  36. package/dist/components/data-grid/header.d.ts.map +1 -1
  37. package/dist/components/data-grid/index.js +2 -2
  38. package/dist/components/data-table/index.js +2 -2
  39. package/dist/components/file-manager/index.js +1 -1
  40. package/dist/components/heatmap/index.js +1 -1
  41. package/dist/components/invoice-upload-list/columns.d.ts.map +1 -1
  42. package/dist/components/invoice-upload-list/index.js +1 -1
  43. package/dist/components/muscle-scheme/index.js +1 -1
  44. package/dist/components/muscle-scheme/muscle-scheme.d.ts.map +1 -1
  45. package/dist/components/patient-table/index.js +1 -1
  46. package/dist/components/warehouse-load-summary/index.js +1 -1
  47. package/dist/components/warehouse-load-summary/types.d.ts +6 -0
  48. package/dist/components/warehouse-load-summary/types.d.ts.map +1 -1
  49. package/dist/components/warehouse-load-summary/warehouse-load-summary.d.ts +1 -1
  50. package/dist/components/warehouse-load-summary/warehouse-load-summary.d.ts.map +1 -1
  51. package/dist/core.css +1 -1
  52. package/dist/host-legacy.css +9 -0
  53. package/dist/i18n/locales/ar.d.ts +5 -0
  54. package/dist/i18n/locales/ar.d.ts.map +1 -1
  55. package/dist/i18n/locales/ar.js +5 -0
  56. package/dist/i18n/locales/ar.js.map +1 -1
  57. package/dist/i18n/locales/de.d.ts +5 -0
  58. package/dist/i18n/locales/de.d.ts.map +1 -1
  59. package/dist/i18n/locales/de.js +5 -0
  60. package/dist/i18n/locales/de.js.map +1 -1
  61. package/dist/i18n/locales/el.d.ts +5 -0
  62. package/dist/i18n/locales/el.d.ts.map +1 -1
  63. package/dist/i18n/locales/el.js +5 -0
  64. package/dist/i18n/locales/el.js.map +1 -1
  65. package/dist/i18n/locales/en.d.ts +5 -0
  66. package/dist/i18n/locales/en.d.ts.map +1 -1
  67. package/dist/i18n/locales/en.js +5 -0
  68. package/dist/i18n/locales/en.js.map +1 -1
  69. package/dist/i18n/locales/es.d.ts +5 -0
  70. package/dist/i18n/locales/es.d.ts.map +1 -1
  71. package/dist/i18n/locales/es.js +5 -0
  72. package/dist/i18n/locales/es.js.map +1 -1
  73. package/dist/i18n/locales/fr.d.ts +5 -0
  74. package/dist/i18n/locales/fr.d.ts.map +1 -1
  75. package/dist/i18n/locales/fr.js +5 -0
  76. package/dist/i18n/locales/fr.js.map +1 -1
  77. package/dist/i18n/locales/hi.d.ts +5 -0
  78. package/dist/i18n/locales/hi.d.ts.map +1 -1
  79. package/dist/i18n/locales/hi.js +5 -0
  80. package/dist/i18n/locales/hi.js.map +1 -1
  81. package/dist/i18n/locales/it.d.ts +5 -0
  82. package/dist/i18n/locales/it.d.ts.map +1 -1
  83. package/dist/i18n/locales/it.js +5 -0
  84. package/dist/i18n/locales/it.js.map +1 -1
  85. package/dist/i18n/locales/ja.d.ts +5 -0
  86. package/dist/i18n/locales/ja.d.ts.map +1 -1
  87. package/dist/i18n/locales/ja.js +5 -0
  88. package/dist/i18n/locales/ja.js.map +1 -1
  89. package/dist/i18n/locales/nl.d.ts +5 -0
  90. package/dist/i18n/locales/nl.d.ts.map +1 -1
  91. package/dist/i18n/locales/nl.js +5 -0
  92. package/dist/i18n/locales/nl.js.map +1 -1
  93. package/dist/i18n/locales/pl.d.ts +5 -0
  94. package/dist/i18n/locales/pl.d.ts.map +1 -1
  95. package/dist/i18n/locales/pl.js +5 -0
  96. package/dist/i18n/locales/pl.js.map +1 -1
  97. package/dist/i18n/locales/pt.d.ts +5 -0
  98. package/dist/i18n/locales/pt.d.ts.map +1 -1
  99. package/dist/i18n/locales/pt.js +5 -0
  100. package/dist/i18n/locales/pt.js.map +1 -1
  101. package/dist/i18n/locales/ro.d.ts +5 -0
  102. package/dist/i18n/locales/ro.d.ts.map +1 -1
  103. package/dist/i18n/locales/ro.js +5 -0
  104. package/dist/i18n/locales/ro.js.map +1 -1
  105. package/dist/i18n/locales/ru.d.ts +5 -0
  106. package/dist/i18n/locales/ru.d.ts.map +1 -1
  107. package/dist/i18n/locales/ru.js +5 -0
  108. package/dist/i18n/locales/ru.js.map +1 -1
  109. package/dist/i18n/locales/sq.d.ts +5 -0
  110. package/dist/i18n/locales/sq.d.ts.map +1 -1
  111. package/dist/i18n/locales/sq.js +5 -0
  112. package/dist/i18n/locales/sq.js.map +1 -1
  113. package/dist/i18n/locales/sv.d.ts +5 -0
  114. package/dist/i18n/locales/sv.d.ts.map +1 -1
  115. package/dist/i18n/locales/sv.js +5 -0
  116. package/dist/i18n/locales/sv.js.map +1 -1
  117. package/dist/i18n/locales/tr.d.ts +5 -0
  118. package/dist/i18n/locales/tr.d.ts.map +1 -1
  119. package/dist/i18n/locales/tr.js +5 -0
  120. package/dist/i18n/locales/tr.js.map +1 -1
  121. package/dist/i18n/locales/zh.d.ts +5 -0
  122. package/dist/i18n/locales/zh.d.ts.map +1 -1
  123. package/dist/i18n/locales/zh.js +5 -0
  124. package/dist/i18n/locales/zh.js.map +1 -1
  125. package/dist/index.js +13 -13
  126. package/dist/locales/ar.json +5 -0
  127. package/dist/locales/de.json +5 -0
  128. package/dist/locales/el.json +5 -0
  129. package/dist/locales/en.json +5 -0
  130. package/dist/locales/es.json +5 -0
  131. package/dist/locales/fr.json +5 -0
  132. package/dist/locales/hi.json +5 -0
  133. package/dist/locales/it.json +5 -0
  134. package/dist/locales/ja.json +5 -0
  135. package/dist/locales/nl.json +5 -0
  136. package/dist/locales/pl.json +5 -0
  137. package/dist/locales/pt.json +5 -0
  138. package/dist/locales/ro.json +5 -0
  139. package/dist/locales/ru.json +5 -0
  140. package/dist/locales/sq.json +5 -0
  141. package/dist/locales/sv.json +5 -0
  142. package/dist/locales/tr.json +5 -0
  143. package/dist/locales/zh.json +5 -0
  144. package/dist/patterns/calendar/index.js +1 -1
  145. package/dist/tokens.css +1 -1
  146. package/package.json +1 -1
  147. package/dist/_chunks/data-grid-C71BhGDw.js.map +0 -1
  148. package/dist/_chunks/invoice-upload-list-C95s5Q7m.js.map +0 -1
  149. package/dist/_chunks/parts-CcyRkB8t.js.map +0 -1
  150. package/dist/_chunks/warehouse-load-summary-D88M4Ii7.js +0 -255
  151. package/dist/_chunks/warehouse-load-summary-D88M4Ii7.js.map +0 -1
@@ -7,7 +7,7 @@ import { I as H } from "./icon-button-S8_weU3g.js";
7
7
  import { P as oe } from "./popover-CN5IsOeS.js";
8
8
  import { C as Ve } from "./checkbox-DV4sNDeB.js";
9
9
  import { T as Qe } from "./text-input-B6iAgCr3.js";
10
- import { T as xe } from "./tag-BNlcEJfE.js";
10
+ import { T as Te } from "./tag-BNlcEJfE.js";
11
11
  import { D as U } from "./dropdown-menu-Dw6sgQwJ.js";
12
12
  import { a as me } from "./format-number-DdzqwMs1.js";
13
13
  import { g as Le } from "./date-locale-OG-MupVD.js";
@@ -147,7 +147,7 @@ function it(a, e) {
147
147
  }
148
148
  function ot(a, e, d = {}) {
149
149
  if (!a || typeof a != "object") return "";
150
- const t = a, u = typeof t.type == "string" ? t.type : "", F = d.kitWording === !0, E = (x) => F && typeof t.filter == "string" && at(x) ? st(x, e) : it(x, e), I = (x) => typeof x == "number" && d.number ? d.number(x) : String(x), M = (x) => d.day ? d.day(x) : x, N = e("dataTable.numberFilter.from", "From"), Y = e("dataTable.numberFilter.to", "To");
150
+ const t = a, u = typeof t.type == "string" ? t.type : "", F = d.kitWording === !0, E = (T) => F && typeof t.filter == "string" && at(T) ? st(T, e) : it(T, e), I = (T) => typeof T == "number" && d.number ? d.number(T) : String(T), M = (T) => d.day ? d.day(T) : T, N = e("dataTable.numberFilter.from", "From"), Y = e("dataTable.numberFilter.to", "To");
151
151
  if (u === "blank" || u === "notBlank") return E(u);
152
152
  const Q = typeof t.filter == "string" || typeof t.filter == "number", ee = typeof t.filterTo == "string" || typeof t.filterTo == "number";
153
153
  if (u === "inRange" && (Q || ee))
@@ -155,10 +155,10 @@ function ot(a, e, d = {}) {
155
155
  if (Q)
156
156
  return u ? `${E(u)} ${I(t.filter)}` : I(t.filter);
157
157
  if (F) {
158
- const x = typeof t.dateFrom == "string" && t.dateFrom ? t.dateFrom : "", D = typeof t.dateTo == "string" && t.dateTo ? t.dateTo : "", L = u === "inRange" || u === "";
159
- if (x && D) return `${M(x)} – ${M(D)}`;
160
- if (x)
161
- return L ? `${N} ${M(x)}` : `${E(u)} ${M(x)}`;
158
+ const T = typeof t.dateFrom == "string" && t.dateFrom ? t.dateFrom : "", D = typeof t.dateTo == "string" && t.dateTo ? t.dateTo : "", L = u === "inRange" || u === "";
159
+ if (T && D) return `${M(T)} – ${M(D)}`;
160
+ if (T)
161
+ return L ? `${N} ${M(T)}` : `${E(u)} ${M(T)}`;
162
162
  if (D) return `${Y} ${M(D)}`;
163
163
  } else if (typeof t.dateFrom == "string")
164
164
  return typeof t.dateTo == "string" && t.dateTo ? `${t.dateFrom} – ${t.dateTo}` : String(t.dateFrom);
@@ -204,7 +204,10 @@ const ct = Z([
204
204
  // `flex-nowrap` + `min-w-0` so the row stays single-line at every common
205
205
  // desktop width (1024 / 1280 / 1440): the QuickSearch slot shrinks via
206
206
  // its own `min-w-0` instead of pushing the trailing Actions to a new row.
207
- "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]",
207
+ // `items-start`: when FilterBar grows a second row (the FacetFilter tabs),
208
+ // Actions stay on the first row beside the search box instead of floating
209
+ // between the two rows.
210
+ "ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-sm)]",
208
211
  "ds:sm:flex-nowrap ds:min-w-0"
209
212
  // No card surface: the toolbar sits directly on the page background,
210
213
  // matching the header-tools layout the Patients / Care Plan List
@@ -227,6 +230,9 @@ const ct = Z([
227
230
  defaultVariants: { hiddenQuery: !1 }
228
231
  }), mt = Z([
229
232
  "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]",
233
+ // One control row tall (the sm control height), so the buttons share the
234
+ // centre line of the search box; a taller icon button overflows evenly.
235
+ "ds:h-[var(--row-height-compact)] ds:content-center",
230
236
  "ds:ms-auto"
231
237
  ]), ft = Z(
232
238
  "ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:rounded-[var(--radius-sm)] ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs,var(--spacing-xs))] ds:transition-colors",
@@ -359,7 +365,7 @@ function Vt(a) {
359
365
  Q.displayName = `${e}.Refresh.MenuItem`;
360
366
  const ee = Object.assign(M, {
361
367
  overflowMenuItem: Y
362
- }), x = Object.assign(N, {
368
+ }), T = Object.assign(N, {
363
369
  overflowMenuItem: Q
364
370
  }), D = ({
365
371
  placeholder: n,
@@ -370,15 +376,15 @@ function Vt(a) {
370
376
  l ? ["quickFilter", "filter", "columns"] : []
371
377
  ), b = l && we(o), [k, m] = A(
372
378
  () => l && !we(o) ? o.getQuickFilter() : ""
373
- ), T = _(l ? o.getQuickFilter() : ""), f = _(b), y = _(void 0), [$, S] = A(!1), W = Ge(), g = _(null);
379
+ ), x = _(l ? o.getQuickFilter() : ""), f = _(b), y = _(void 0), [$, S] = A(!1), W = Ge(), g = _(null);
374
380
  X(() => {
375
381
  if (!l) return;
376
382
  const h = o.getQuickFilter();
377
383
  if (f.current !== b) {
378
- f.current = b, T.current = h, m(b ? "" : h);
384
+ f.current = b, x.current = h, m(b ? "" : h);
379
385
  return;
380
386
  }
381
- h !== T.current && (y.current && (window.clearTimeout(y.current), y.current = void 0, S(!1)), T.current = h, m(b && h !== "" ? "" : h));
387
+ h !== x.current && (y.current && (window.clearTimeout(y.current), y.current = void 0, S(!1)), x.current = h, m(b && h !== "" ? "" : h));
382
388
  }, [l, o, v, b]), X(
383
389
  () => () => {
384
390
  y.current && window.clearTimeout(y.current);
@@ -388,8 +394,8 @@ function Vt(a) {
388
394
  const R = (h) => {
389
395
  y.current && window.clearTimeout(y.current), S(!0), y.current = window.setTimeout(() => {
390
396
  if (y.current = void 0, S(!1), l) {
391
- if (o.getQuickFilter() !== T.current || h === T.current) return;
392
- T.current = h;
397
+ if (o.getQuickFilter() !== x.current || h === x.current) return;
398
+ x.current = h;
393
399
  }
394
400
  o.setQuickFilter(h);
395
401
  }, c);
@@ -449,12 +455,12 @@ function Vt(a) {
449
455
  K(i, ["filter", "quickFilter", "columns"]);
450
456
  const [, o] = Ae((g) => g + 1, 0), l = i.getFilterModel() ?? {}, v = i.getColumns(), b = new Map(
451
457
  v.map((g) => [g.id, g])
452
- ), k = i.features.formatsFilterValues === !0, m = (g, R) => k ? n("dataTable.filterChips.chip", { column: g, value: R }) : `${g}: ${R}`, T = [];
458
+ ), k = i.features.formatsFilterValues === !0, m = (g, R) => k ? n("dataTable.filterChips.chip", { column: g, value: R }) : `${g}: ${R}`, x = [];
453
459
  for (const g of Object.keys(l)) {
454
460
  const R = b.get(g);
455
461
  if (!R) {
456
462
  const h = (W = i.getFilterLabel) == null ? void 0 : W.call(i, g);
457
- T.push({ key: g, label: h ?? g });
463
+ x.push({ key: g, label: h ?? g });
458
464
  continue;
459
465
  }
460
466
  const O = R.masked ? "" : ot(
@@ -462,10 +468,10 @@ function Vt(a) {
462
468
  n,
463
469
  nt(R, k, c.language)
464
470
  ), w = R.label || g;
465
- T.push({ key: g, label: O ? m(w, O) : w });
471
+ x.push({ key: g, label: O ? m(w, O) : w });
466
472
  }
467
473
  const f = i.getQuickFilter(), y = n("dataTable.quickSearch.label", "Quick search"), $ = v.some((g) => g.masked === !0) ? y : m(y, f);
468
- return T.length + (f ? 1 : 0) === 0 ? null : /* @__PURE__ */ G(
474
+ return x.length + (f ? 1 : 0) === 0 ? null : /* @__PURE__ */ G(
469
475
  "div",
470
476
  {
471
477
  role: "group",
@@ -473,7 +479,7 @@ function Vt(a) {
473
479
  className: "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]",
474
480
  children: [
475
481
  f && /* @__PURE__ */ r(
476
- xe,
482
+ Te,
477
483
  {
478
484
  label: $,
479
485
  size: "sm",
@@ -484,8 +490,8 @@ function Vt(a) {
484
490
  }
485
491
  }
486
492
  ),
487
- T.map((g) => /* @__PURE__ */ r(
488
- xe,
493
+ x.map((g) => /* @__PURE__ */ r(
494
+ Te,
489
495
  {
490
496
  label: g.label,
491
497
  size: "sm",
@@ -521,7 +527,7 @@ function Vt(a) {
521
527
  X(() => {
522
528
  v && m(null);
523
529
  }, [v, b]);
524
- const T = k ? k.value : v ? ((y = l.getFacet) == null ? void 0 : y.call(l, n)) ?? null : null;
530
+ const x = k ? k.value : v ? ((y = l.getFacet) == null ? void 0 : y.call(l, n)) ?? null : null;
525
531
  function f($) {
526
532
  m({ value: $ }), l.setFacet(n, $);
527
533
  }
@@ -530,9 +536,9 @@ function Vt(a) {
530
536
  {
531
537
  role: "group",
532
538
  "aria-label": i ?? o("dataTable.facetFilter.label", "Filter"),
533
- className: "ds:flex ds:items-center ds:gap-[var(--spacing-xs)]",
539
+ className: "ds:flex ds:w-full ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]",
534
540
  children: c.map(($) => {
535
- const S = T === $.value;
541
+ const S = x === $.value;
536
542
  return /* @__PURE__ */ r(
537
543
  ie,
538
544
  {
@@ -606,7 +612,7 @@ function Vt(a) {
606
612
  he.displayName = `${e}.ExportMenu.Item`;
607
613
  const de = V(
608
614
  function({ label: c, icon: i, footer: o, header: l, intent: v = "outline", ...b }, k) {
609
- const { t: m, i18n: T } = q("ui"), f = t("ColumnToggle"), y = f.features.keyboardReorder, $ = f.features.toolbarAnnouncesColumnMoves === !0, [S, W] = A(!1), [g, R] = A(""), O = K(f, S ? ["columns"] : []), [w, h] = A([]), [ve, ce] = A(null), [Me, te] = A(null), J = _(/* @__PURE__ */ new Map()), re = _(
615
+ const { t: m, i18n: x } = q("ui"), f = t("ColumnToggle"), y = f.features.keyboardReorder, $ = f.features.toolbarAnnouncesColumnMoves === !0, [S, W] = A(!1), [g, R] = A(""), O = K(f, S ? ["columns"] : []), [w, h] = A([]), [ve, ce] = A(null), [Me, te] = A(null), J = _(/* @__PURE__ */ new Map()), re = _(
610
616
  null
611
617
  ), j = se(
612
618
  () => f.getColumns().filter((s) => s.hiddenByPrivacy !== !0),
@@ -631,7 +637,7 @@ function Vt(a) {
631
637
  f.isReady() && (f.setColumnVisible(s, C), h(j()));
632
638
  },
633
639
  [f, j]
634
- ), Te = se(
640
+ ), xe = se(
635
641
  (s, C) => {
636
642
  if (!f.isReady()) return;
637
643
  const B = f.getColumns().find((pe) => pe.id === s);
@@ -650,19 +656,19 @@ function Vt(a) {
650
656
  R(
651
657
  m("dataGrid.announce.columnMoved", {
652
658
  column: ae,
653
- position: me(p + 1, T.language),
654
- total: me(P.length, T.language)
659
+ position: me(p + 1, x.language),
660
+ total: me(P.length, x.language)
655
661
  })
656
662
  );
657
663
  },
658
- [f, j, $, m, T.language]
664
+ [f, j, $, m, x.language]
659
665
  ), ue = se(
660
666
  (s, C) => {
661
667
  if (s === C) return;
662
668
  const B = f.getColumns().findIndex((P) => P.id === C);
663
- B < 0 || Te(s, B);
669
+ B < 0 || xe(s, B);
664
670
  },
665
- [f, Te]
671
+ [f, xe]
666
672
  ), ne = c ?? m("dataTable.columnToggle");
667
673
  return /* @__PURE__ */ G(oe.Root, { open: S, onOpenChange: W, children: [
668
674
  /* @__PURE__ */ r(oe.Trigger, { asChild: !0, children: /* @__PURE__ */ r(
@@ -815,8 +821,8 @@ function Vt(a) {
815
821
  ({ label: n, icon: c, onAction: i, variant: o = "default", size: l = "sm", ...v }, b) => {
816
822
  const { t: k } = q("ui"), m = t("BulkAction");
817
823
  K(m, ["selection"]);
818
- const T = m.getSelectionCount();
819
- return T === 0 ? null : /* @__PURE__ */ G(
824
+ const x = m.getSelectionCount();
825
+ return x === 0 ? null : /* @__PURE__ */ G(
820
826
  ie,
821
827
  {
822
828
  ref: b,
@@ -825,7 +831,7 @@ function Vt(a) {
825
831
  size: l,
826
832
  startIcon: lt(c),
827
833
  onClick: () => i(dt(m)),
828
- "aria-label": `${n} (${k("dataTable.bulkAction", { count: T })})`,
834
+ "aria-label": `${n} (${k("dataTable.bulkAction", { count: x })})`,
829
835
  ...v,
830
836
  children: [
831
837
  /* @__PURE__ */ r("span", { children: n }),
@@ -834,7 +840,7 @@ function Vt(a) {
834
840
  {
835
841
  "aria-hidden": "true",
836
842
  className: "ds:ms-[var(--spacing-xs)] ds:opacity-80",
837
- children: k("dataTable.bulkAction", { count: T })
843
+ children: k("dataTable.bulkAction", { count: x })
838
844
  }
839
845
  )
840
846
  ]
@@ -850,7 +856,7 @@ function Vt(a) {
850
856
  FilterBar: F,
851
857
  Actions: E,
852
858
  Print: ee,
853
- Refresh: x,
859
+ Refresh: T,
854
860
  QuickSearch: D,
855
861
  FilterChips: L,
856
862
  FacetFilter: fe,
@@ -866,4 +872,4 @@ export {
866
872
  dt as a,
867
873
  Vt as c
868
874
  };
869
- //# sourceMappingURL=parts-CcyRkB8t.js.map
875
+ //# sourceMappingURL=parts-tGzYz0uG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts-tGzYz0uG.js","sources":["../../node_modules/lucide-react/dist/esm/icons/columns-3-cog.mjs","../../src/components/_shared/table-toolbar/context.tsx","../../src/components/_shared/table-toolbar/describe-filter.ts","../../src/components/_shared/table-toolbar/parts.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10.5 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.5\", key: \"1g2yzs\" }],\n [\"path\", { d: \"m14.3 19.6 1-.4\", key: \"11sv9r\" }],\n [\"path\", { d: \"M15 3v7.5\", key: \"7lm50a\" }],\n [\"path\", { d: \"m15.2 16.9-.9-.3\", key: \"1t7mvx\" }],\n [\"path\", { d: \"m16.6 21.7.3-.9\", key: \"1j67ps\" }],\n [\"path\", { d: \"m16.8 15.3-.4-1\", key: \"1ei7r6\" }],\n [\"path\", { d: \"m19.1 15.2.3-.9\", key: \"18r7jp\" }],\n [\"path\", { d: \"m19.6 21.7-.4-1\", key: \"z2vh2\" }],\n [\"path\", { d: \"m20.7 16.8 1-.4\", key: \"19m87a\" }],\n [\"path\", { d: \"m21.7 19.4-.9-.3\", key: \"1qgwi9\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"circle\", { cx: \"18\", cy: \"18\", r: \"3\", key: \"1xkwt0\" }]\n];\nconst Columns3Cog = createLucideIcon(\"columns-3-cog\", __iconNode);\n\nexport { __iconNode, Columns3Cog as default };\n//# sourceMappingURL=columns-3-cog.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Table toolbar context: how a toolbar part finds its table's seam. */\n/* */\n/* Engine-agnostic. DataTable provides an AG-backed seam */\n/* (`data-table/ag-toolbar-seam.ts`), DataGrid its own */\n/* (`data-grid/toolbar-seam.ts`). The parts never see an engine API. */\n/* -------------------------------------------------------------------- */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport type { TableToolbarChangeKind, TableToolbarSeam } from './seam';\n\n/** @internal What the shared parts read. */\nexport interface TableToolbarContextValue {\n seam: TableToolbarSeam;\n}\n\nconst TableToolbarContext = createContext<TableToolbarContextValue | null>(\n null,\n);\n\n/** @internal Props of {@link TableToolbarProvider}. */\nexport interface TableToolbarProviderProps {\n seam: TableToolbarSeam;\n children: ReactNode;\n}\n\n/** @internal Puts one table's seam in reach of the toolbar parts below. */\nexport function TableToolbarProvider({\n seam,\n children,\n}: TableToolbarProviderProps) {\n // Keyed on the seam alone; parts re-read the seam through\n // `useSeamVersion`, not through a new context value.\n const value = useMemo<TableToolbarContextValue>(() => ({ seam }), [seam]);\n return (\n <TableToolbarContext.Provider value={value}>\n {children}\n </TableToolbarContext.Provider>\n );\n}\n\n/**\n * @internal The seam of the nearest table toolbar provider, else\n * `fallback` (an engine's own context, such as DataGrid's toolbar slot).\n * Throws `missingMessage` when there is neither (each engine words it for\n * its own API).\n */\nexport function useTableToolbarSeam(\n missingMessage: string,\n fallback?: TableToolbarSeam | null,\n): TableToolbarSeam {\n const ctx = useContext(TableToolbarContext);\n const seam = ctx?.seam ?? fallback;\n if (!seam) throw new Error(missingMessage);\n return seam;\n}\n\n/**\n * @internal A number that changes whenever the seam reports a change of one\n * of `kinds`. Read the seam during render and list this number in the\n * dependencies of anything memoised over it. Subscribing is safe before the\n * engine is ready: the seam binds late and fires once it can answer.\n */\nexport function useSeamVersion(\n seam: TableToolbarSeam,\n kinds: readonly TableToolbarChangeKind[],\n): number {\n const [version, setVersion] = useState(0);\n const key = kinds.join(' ');\n useEffect(() => {\n const wanted = new Set(key.split(' '));\n return seam.subscribe((kind) => {\n if (wanted.has(kind)) setVersion((v) => v + 1);\n });\n }, [seam, key]);\n return version;\n}\n","/* -------------------------------------------------------------------- */\n/* Chip text for a filter model (moved from `data-table/toolbar.tsx`). */\n/* -------------------------------------------------------------------- */\n\nimport { getShortDateFormat } from '../date-locale';\nimport { formatNumber } from '../format-number';\nimport { fromIsoDate } from '../table-filters/calendar-day';\nimport type { TableToolbarColumn, TextFilterOperator } from './seam';\n\n/**\n * `date-fns` `format(date, pattern)` for the patterns `getShortDateFormat`\n * returns, which use only `dd`, `MM`, `yyyy` and the separators `/ . -`.\n * Same output (local calendar fields, zero-padded, era year as date-fns\n * writes it), without shipping date-fns `format` with every toolbar.\n */\nexport function formatShortDate(date: Date, pattern: string): string {\n const pad = (n: number, width: number) => String(n).padStart(width, '0');\n return pattern.replace(/yyyy|MM|dd/g, (token) => {\n if (token === 'dd') return pad(date.getDate(), 2);\n if (token === 'MM') return pad(date.getMonth() + 1, 2);\n const signed = date.getFullYear();\n return pad(signed > 0 ? signed : 1 - signed, 4);\n });\n}\n\n/** A translator with a fallback, as `useTranslation('ui').t` is called. */\nexport type DescribeFilterTranslate = (key: string, fallback: string) => string;\n\n/** How values read in a chip. Each hook is optional: without them the chip\n * reads exactly as DataTable's did in kit 1.112. */\nexport interface DescribeFilterFormat {\n /** DataGrid's wording: a text operator in the text filter menu's words,\n * an open date bound as \"From …\" or \"To …\", and a one-date operator\n * named (\"Less than …\"). Without it, kit 1.112's wording (DataTable). */\n kitWording?: boolean;\n /** A select option's label for its value, if the column has one. */\n optionLabel?: (value: unknown) => string | undefined;\n /** A number in the UI language. */\n number?: (value: number) => string;\n /** A `YYYY-MM-DD` calendar day in the UI language. */\n day?: (day: string) => string;\n}\n\n/**\n * The format hooks for one column, all only when the seam asks for\n * formatted values (`features.formatsFilterValues`, DataGrid), so\n * DataTable's chips keep their kit 1.112 text.\n */\nexport function chipFormatFor(\n column: Pick<TableToolbarColumn, 'filterOptions'>,\n formatsValues: boolean,\n language: string | undefined,\n): DescribeFilterFormat {\n const options = column.filterOptions;\n if (!formatsValues) return {};\n return {\n kitWording: true,\n optionLabel: options\n ? (value) => options.find((o) => o.value === value)?.label\n : undefined,\n number: (n) => formatNumber(n, language),\n day: (day) => {\n const date = fromIsoDate(day);\n return date\n ? formatShortDate(date, getShortDateFormat(language ?? 'en'))\n : day;\n },\n };\n}\n\n/** The text filter's operators (`TextFilterOperator`). */\nfunction isTextOperator(op: string): op is TextFilterOperator {\n return (\n op === 'contains' ||\n op === 'notContains' ||\n op === 'equals' ||\n op === 'startsWith' ||\n op === 'endsWith'\n );\n}\n\n/** A text operator through the text filter's own strings, the words its\n * menu shows. One literal key per operator, so no lookup misses. */\nfunction textOperatorText(\n op: TextFilterOperator,\n t: DescribeFilterTranslate,\n): string {\n switch (op) {\n case 'contains':\n return t('dataTable.textFilter.operators.contains', 'Contains');\n case 'notContains':\n return t(\n 'dataTable.textFilter.operators.notContains',\n 'Does not contain',\n );\n case 'equals':\n return t('dataTable.textFilter.operators.equals', 'Equals');\n case 'startsWith':\n return t('dataTable.textFilter.operators.startsWith', 'Starts with');\n case 'endsWith':\n return t('dataTable.textFilter.operators.endsWith', 'Ends with');\n }\n}\n\n/** An operator through AG Grid's strings, as kit 1.112 chips read (they\n * also name the `…OrEqual` operators). One literal key per operator, so\n * no fallback key is looked up. An operator the kit does not know prints\n * as it is (a consumer's own filter). */\nfunction gridOperatorText(op: string, t: DescribeFilterTranslate): string {\n switch (op) {\n case 'contains':\n return t('dataTable.agGrid.contains', 'Contains');\n case 'notContains':\n return t('dataTable.agGrid.notContains', 'Does not contain');\n case 'startsWith':\n return t('dataTable.agGrid.startsWith', 'Starts with');\n case 'endsWith':\n return t('dataTable.agGrid.endsWith', 'Ends with');\n case 'equals':\n return t('dataTable.agGrid.equals', 'Equals');\n case 'notEqual':\n return t('dataTable.agGrid.notEqual', 'Not equal');\n case 'greaterThan':\n return t('dataTable.agGrid.greaterThan', 'Greater than');\n case 'greaterThanOrEqual':\n return t(\n 'dataTable.agGrid.greaterThanOrEqual',\n 'Greater than or equal to',\n );\n case 'lessThan':\n return t('dataTable.agGrid.lessThan', 'Less than');\n case 'lessThanOrEqual':\n return t('dataTable.agGrid.lessThanOrEqual', 'Less than or equal to');\n case 'inRange':\n return t('dataTable.agGrid.inRange', 'In range');\n case 'blank':\n return t('dataTable.agGrid.blank', 'Blank');\n case 'notBlank':\n return t('dataTable.agGrid.notBlank', 'Not blank');\n default:\n return op;\n }\n}\n\n/**\n * One line of chip text for a kit filter model. The operator is the model's\n * own type key (`contains`, `greaterThan`, …); it reads through the\n * `dataTable.agGrid.*` strings DataTable's filter menus use (with\n * `kitWording`, a text operator reads through the text filter's own menu\n * strings), so a chip says \"Contiene Rossi\" in Italian, not the raw key.\n *\n * The typeahead model (`{ type: 'equals', value }`) is described by its\n * column name only, as in kit 1.112: its value can be a person's name.\n */\nexport function describeFilterModel(\n model: unknown,\n t: DescribeFilterTranslate,\n format: DescribeFilterFormat = {},\n): string {\n if (!model || typeof model !== 'object') return '';\n const m = model as Record<string, unknown>;\n const type = typeof m.type === 'string' ? m.type : '';\n const kitWording = format.kitWording === true;\n const operatorText = (op: string): string =>\n kitWording && typeof m.filter === 'string' && isTextOperator(op)\n ? textOperatorText(op, t)\n : gridOperatorText(op, t);\n const value = (v: unknown): string =>\n typeof v === 'number' && format.number ? format.number(v) : String(v);\n const day = (d: string): string => (format.day ? format.day(d) : d);\n const from = t('dataTable.numberFilter.from', 'From');\n const to = t('dataTable.numberFilter.to', 'To');\n // Blank takes no value; the number popover still sends `filter: 0`.\n if (type === 'blank' || type === 'notBlank') return operatorText(type);\n const hasFrom = typeof m.filter === 'string' || typeof m.filter === 'number';\n const hasTo =\n typeof m.filterTo === 'string' || typeof m.filterTo === 'number';\n // Range first: a number range may carry only `filterTo` (\"≤ 5\"), which the\n // `hasFrom` branch below would drop to an empty chip.\n if (type === 'inRange' && (hasFrom || hasTo)) {\n if (hasFrom && hasTo) return `${value(m.filter)} – ${value(m.filterTo)}`;\n // \"In range 1\" reads as nonsense, so name the one bound that is set.\n return hasFrom\n ? `${from} ${value(m.filter)}`\n : `${to} ${value(m.filterTo)}`;\n }\n // Text / number filter shape: { type, filter, filterTo, filterType }\n if (hasFrom) {\n return type ? `${operatorText(type)} ${value(m.filter)}` : value(m.filter);\n }\n // Date filter shape: { type, dateFrom, dateTo }.\n if (!kitWording) {\n // Kit 1.112 (DataTable): the bare date, or nothing for a range with\n // only an end.\n if (typeof m.dateFrom === 'string') {\n if (typeof m.dateTo === 'string' && m.dateTo) {\n return `${m.dateFrom} – ${m.dateTo}`;\n }\n return String(m.dateFrom);\n }\n } else {\n // Either bound of a range may be open. AG Grid's own date filter keeps\n // a one-date operator's date in `dateFrom` (\"before 1 Jan\" is\n // `lessThan`), so only a range says \"From\".\n const dateFrom =\n typeof m.dateFrom === 'string' && m.dateFrom ? m.dateFrom : '';\n const dateTo = typeof m.dateTo === 'string' && m.dateTo ? m.dateTo : '';\n const range = type === 'inRange' || type === '';\n if (dateFrom && dateTo) return `${day(dateFrom)} – ${day(dateTo)}`;\n if (dateFrom) {\n return range\n ? `${from} ${day(dateFrom)}`\n : `${operatorText(type)} ${day(dateFrom)}`;\n }\n if (dateTo) return `${to} ${day(dateTo)}`;\n }\n // Set filter shape: { values: [...] }\n if (Array.isArray((m as { values?: unknown[] }).values)) {\n const values = (m as { values: unknown[] }).values;\n return values.map((v) => format.optionLabel?.(v) ?? value(v)).join(', ');\n }\n return '';\n}\n","/* -------------------------------------------------------------------- */\n/* Table toolbar parts, shared by DataTable and DataGrid. */\n/* */\n/* Moved from `data-table/toolbar.tsx`. Every part talks to its table */\n/* through `TableToolbarSeam` only (`./seam.ts`), so the same code serves */\n/* AG Grid (DataTable) and TanStack Table (DataGrid). Behaviour that */\n/* differs between engines is gated on `seam.features`. */\n/* */\n/* `createTableToolbarParts` builds one set per engine, so each set */\n/* carries its own display names (`DataTable.Toolbar.*`, */\n/* `DataGrid.Toolbar.*`) and its own \"rendered outside\" message. The */\n/* engine wrappers add the engine-shaped callbacks. */\n/* -------------------------------------------------------------------- */\n\nimport {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useReducer,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport {\n ArrowDown,\n ArrowUp,\n Columns3Cog,\n Download,\n FileSpreadsheet,\n FileText,\n GripVertical,\n Printer,\n RefreshCw,\n RotateCcw,\n Search,\n X,\n} from 'lucide-react';\nimport { Button, type ButtonProps } from '../../button/button';\nimport { IconButton, type IconButtonProps } from '../../button/icon-button';\nimport { Popover } from '../../popover/popover';\nimport { Checkbox } from '../../checkbox/checkbox';\nimport { TextInput } from '../../text-input';\nimport { Tag } from '../../tag';\nimport { DropdownMenu } from '../../dropdown-menu';\nimport type {\n IconButtonGroupOverflowItem,\n IconButtonGroupOverflowItemProps,\n} from '../../icon-button-group/icon-button-group';\nimport { useSeamVersion, useTableToolbarSeam } from './context';\nimport { formatNumber } from '../format-number';\nimport { chipFormatFor, describeFilterModel } from './describe-filter';\nimport type {\n TableFacetValue,\n TableToolbarColumn,\n TableToolbarSeam,\n ToolbarActionContext,\n} from './seam';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n// Lucide icons default to 24×24 regardless of the wrapping span size, so\n// Button's `startIcon` slot (size-4 span) can't shrink them. Coerce icon\n// nodes to the `sm` button's 16px rendered size before handing them off.\nexport function sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as ReactElement<{\n className?: string;\n size?: number;\n }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} ds:size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\n/**\n * Whether the quick-search text counts as personal data now: while privacy\n * mode masks any column, typed free text may be a patient's name (the rule\n * the DataGrid agent applies to `quickFilter`). Always `false` on a seam\n * with no privacy mode (DataTable).\n */\nexport function masksFreeText(seam: TableToolbarSeam): boolean {\n return seam.getColumns().some((c) => c.masked === true);\n}\n\n/**\n * Whether a one-step move of `columns[from]` to `to` would be refused by\n * the seam's rules (`moveColumn`): a fixed column, a pin side the column\n * may not take, or a header group split. ColumnToggle disables such a\n * button rather than offer one that does nothing.\n */\nexport function canStepColumn(\n columns: readonly TableToolbarColumn[],\n from: number,\n to: number,\n): boolean {\n const column = columns[from];\n const target = columns[to];\n if (!column || !target || !column.canMove) return false;\n if (column.canPin === false && target.pinned !== column.pinned) return false;\n const next = columns.filter((_, i) => i !== from);\n next.splice(to, 0, column);\n // Every header group stays one contiguous run.\n const seen = new Set<string>();\n let previous: string | null = null;\n for (const c of next) {\n const group = c.groupId ?? null;\n if (group !== previous) {\n if (group !== null && seen.has(group)) return false;\n if (group !== null) seen.add(group);\n previous = group;\n }\n }\n return true;\n}\n\n/** The engine-agnostic context BulkAction and custom export items pass on. */\nexport function actionContextOf(seam: TableToolbarSeam): ToolbarActionContext {\n return {\n selectedRowIds: seam.getSelectedRowIds(),\n getExportSnapshot: () => seam.getExportSnapshot(),\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants (class strings byte-identical to kit 1.112) */\n/* ------------------------------------------------------------------ */\n\nexport const toolbarRootVariants = cva([\n 'data-table-toolbar',\n // Mobile (<sm) keeps `flex-wrap` so a wide QuickSearch can flow above the\n // Actions cluster on narrow screens. From `sm` (≥640px) we switch to\n // `flex-nowrap` + `min-w-0` so the row stays single-line at every common\n // desktop width (1024 / 1280 / 1440): the QuickSearch slot shrinks via\n // its own `min-w-0` instead of pushing the trailing Actions to a new row.\n // `items-start`: when FilterBar grows a second row (the FacetFilter tabs),\n // Actions stay on the first row beside the search box instead of floating\n // between the two rows.\n 'ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:sm:flex-nowrap ds:min-w-0',\n // No card surface: the toolbar sits directly on the page background,\n // matching the header-tools layout the Patients / Care Plan List\n // patterns established.\n]);\n\nexport const toolbarFilterBarVariants = cva([\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n // `grow` lets FilterBar absorb the free space; `min-w-0` lets the\n // QuickSearch slot inside shrink below its intrinsic width when the\n // toolbar runs `flex-nowrap` at `sm` and above, so the trailing\n // Actions cluster stays pinned on a single row.\n 'ds:grow ds:min-w-0',\n]);\n\nconst quickSearchSlotVariants = cva('ds:w-full ds:max-w-[24rem] ds:min-w-0', {\n variants: {\n // The masked \"Search applied\" state adds a Clear button beside the box.\n hiddenQuery: {\n true: 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:[&>[data-component=text-input]]:min-w-0 ds:[&>[data-component=text-input]]:grow',\n false: '',\n },\n },\n defaultVariants: { hiddenQuery: false },\n});\n\nexport const toolbarActionsVariants = cva([\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]',\n // One control row tall (the sm control height), so the buttons share the\n // centre line of the search box; a taller icon button overflows evenly.\n 'ds:h-[var(--row-height-compact)] ds:content-center',\n 'ds:ms-auto',\n]);\n\nconst columnRowVariants = cva(\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:rounded-[var(--radius-sm)] ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs,var(--spacing-xs))] ds:transition-colors',\n {\n variants: {\n dragging: { true: 'ds:opacity-50', false: '' },\n dragOver: {\n true: 'ds:bg-[color:color-mix(in_srgb,var(--primary)_8%,transparent)]',\n false: '',\n },\n },\n defaultVariants: { dragging: false, dragOver: false },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Public prop shapes (engine-agnostic) */\n/* ------------------------------------------------------------------ */\n\n/** Icon-button parts: the label is the tooltip and the accessible name. */\nexport type TableToolbarIconButtonProps = Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> & {\n label?: string;\n};\n\nexport interface TableQuickSearchProps {\n /** Placeholder text. Falls back to `t('dataTable.quickSearch.placeholder')`. */\n placeholder?: string;\n /** Debounce ms before pushing to the table. Defaults to 150 ms. */\n debounceMs?: number;\n}\n\nexport interface TableFacetOption {\n value: TableFacetValue | null;\n label: string;\n}\n\nexport interface TableFacetFilterProps {\n field: string;\n options: readonly TableFacetOption[];\n label?: string;\n}\n\nexport interface TableColumnToggleProps extends TableToolbarIconButtonProps {\n /** Override the trigger glyph (defaults to the Columns3Cog icon). */\n icon?: ReactNode;\n /** Extra content rendered below the column list. */\n footer?: ReactNode;\n /** Extra content rendered above the column list, under the title. */\n header?: ReactNode;\n}\n\nexport interface TableExportMenuProps extends TableToolbarIconButtonProps {\n /** Menu items (the engine wrapper supplies its defaults). */\n children: ReactNode;\n}\n\nexport type TableExportFormat = 'csv' | 'xlsx' | 'pdf' | 'custom';\n\n/** @internal The shared item: icon, label and what selecting it does. */\nexport interface TableExportMenuItemBaseProps {\n format: TableExportFormat;\n label?: string;\n onSelect: () => void;\n disabled?: boolean;\n /** Shown under the label (the reason a disabled item cannot run). */\n description?: string;\n}\n\nexport interface TableRefreshProps extends TableToolbarIconButtonProps {\n onRefresh: () => void;\n}\n\nexport interface TableBulkActionProps extends Omit<\n ButtonProps,\n 'onClick' | 'children' | 'startIcon' | 'intent'\n> {\n label: string;\n icon?: ReactNode;\n onAction: (context: ToolbarActionContext) => void;\n variant?: 'default' | 'destructive';\n}\n\n/** How one engine names its parts. */\nexport interface TableToolbarPartNames {\n /** Display-name prefix, e.g. `DataTable.Toolbar`. */\n prefix: string;\n /** Error thrown when a part renders outside any toolbar provider. */\n missingProvider: (caller: string) => string;\n /** The engine's own way to find a seam when no toolbar provider is above\n * (a hook, called on every render). */\n useEngineSeam?: () => TableToolbarSeam | null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Factory */\n/* ------------------------------------------------------------------ */\n\n/**\n * @internal One set of toolbar parts for an engine. Called once per engine\n * at module level (`data-table/toolbar.tsx`, `data-grid/toolbar.tsx`).\n */\nexport function createTableToolbarParts(names: TableToolbarPartNames) {\n const { prefix } = names;\n const useEngineSeam = names.useEngineSeam ?? (() => null);\n const useSeam = (part: string): TableToolbarSeam =>\n useTableToolbarSeam(\n names.missingProvider(`${prefix}.${part}`),\n useEngineSeam(),\n );\n\n /* ---- Root, FilterBar, Actions ------------------------------------ */\n\n const Root = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"toolbar\"\n className={toolbarRootVariants({ className })}\n {...props}\n >\n {children}\n </div>\n ),\n );\n Root.displayName = prefix;\n\n const FilterBar = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={toolbarFilterBarVariants({ className })}\n {...props}\n >\n {children}\n </div>\n ),\n );\n FilterBar.displayName = `${prefix}.FilterBar`;\n\n const Actions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={toolbarActionsVariants({ className })}\n {...props}\n >\n {children}\n </div>\n ),\n );\n Actions.displayName = `${prefix}.Actions`;\n\n /* ---- Print, Refresh ---------------------------------------------- */\n\n /* The public props leave out onClick, but a wrapper that clones its\n children (a consumer's own group) may inject one. Read it so the part\n composes it with its own action instead of losing that action. */\n function withInjectedClick<P extends object>(\n props: P,\n ): P & { onClick?: MouseEventHandler<HTMLButtonElement> } {\n return props;\n }\n\n const Print = forwardRef<HTMLButtonElement, TableToolbarIconButtonProps>(\n ({ label, intent = 'outline', ...props }, ref) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('Print');\n const { onClick, ...rest } = withInjectedClick(props);\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Printer aria-hidden />}\n tooltip={label ?? t('dataTable.print')}\n {...rest}\n // Run an injected onClick first, then print unless it called\n // preventDefault.\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) void seam.print();\n }}\n />\n );\n },\n );\n Print.displayName = `${prefix}.Print`;\n\n const Refresh = forwardRef<HTMLButtonElement, TableRefreshProps>(\n ({ onRefresh, label, intent = 'outline', ...props }, ref) => {\n const { t } = useTranslation('ui');\n const { onClick, ...rest } = withInjectedClick(props);\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<RefreshCw aria-hidden />}\n tooltip={label ?? t('dataTable.refresh', 'Refresh')}\n {...rest}\n // Compose with an injected onClick so it never replaces\n // onRefresh.\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) onRefresh();\n }}\n />\n );\n },\n );\n Refresh.displayName = `${prefix}.Refresh`;\n\n /* In an IconButtonGroup with overflow=\"menu\", a folded Print or Refresh\n shows as one of these \"More\" menu items and runs the same action (the\n group would otherwise mirror an onClick prop these parts do not have). */\n const PrintMenuItem = ({\n childProps,\n disabled,\n }: IconButtonGroupOverflowItemProps) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('Print');\n const label = childProps.label;\n return (\n <DropdownMenu.Item\n startIcon={<Printer aria-hidden className=\"ds:size-4\" />}\n disabled={disabled}\n onSelect={() => void seam.print()}\n >\n {typeof label === 'string' ? label : t('dataTable.print')}\n </DropdownMenu.Item>\n );\n };\n PrintMenuItem.displayName = `${prefix}.Print.MenuItem`;\n\n const RefreshMenuItem = ({\n childProps,\n disabled,\n }: IconButtonGroupOverflowItemProps) => {\n const { t } = useTranslation('ui');\n const { label, onRefresh } = childProps as Partial<TableRefreshProps>;\n return (\n <DropdownMenu.Item\n startIcon={<RefreshCw aria-hidden className=\"ds:size-4\" />}\n disabled={disabled}\n onSelect={() => onRefresh?.()}\n >\n {label ?? t('dataTable.refresh', 'Refresh')}\n </DropdownMenu.Item>\n );\n };\n RefreshMenuItem.displayName = `${prefix}.Refresh.MenuItem`;\n\n // An engine wrapper around Print or Refresh copies this static onto its\n // own component, so the group finds it there too.\n const PrintPart = Object.assign(Print, {\n overflowMenuItem: PrintMenuItem as IconButtonGroupOverflowItem,\n });\n const RefreshPart = Object.assign(Refresh, {\n overflowMenuItem: RefreshMenuItem as IconButtonGroupOverflowItem,\n });\n\n /* ---- QuickSearch ------------------------------------------------- */\n\n const QuickSearch = ({\n placeholder,\n debounceMs = 150,\n }: TableQuickSearchProps) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('QuickSearch');\n const sync = seam.features.syncsFilterInputs;\n const version = useSeamVersion(\n seam,\n sync ? ['quickFilter', 'filter', 'columns'] : [],\n );\n // Under privacy mode the box never paints a query the user did not\n // type here (a restored tab, a URL, an agent): it may be a name.\n const masked = sync && masksFreeText(seam);\n const [value, setValue] = useState(() =>\n sync && !masksFreeText(seam) ? seam.getQuickFilter() : '',\n );\n // The table's quick filter as this input last saw it, so an external\n // change (a tab, a chip, an agent, Clear all) can be told apart from\n // the input's own push.\n const seenRef = useRef(sync ? seam.getQuickFilter() : '');\n const maskedRef = useRef(masked);\n const timerRef = useRef<number | undefined>(undefined);\n // A push waits on the debounce: the box is the user's own text until\n // it lands, so it never flips to \"Search applied\" in between.\n const [pending, setPending] = useState(false);\n const describedById = useId();\n // \"Clear search\" unmounts once pressed, so focus goes back to the box.\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!sync) return;\n const external = seam.getQuickFilter();\n if (maskedRef.current !== masked) {\n // Privacy switched: hide what the box shows, or show the table's\n // query again. The table's filter itself is untouched.\n maskedRef.current = masked;\n seenRef.current = external;\n setValue(masked ? '' : external);\n return;\n }\n if (external !== seenRef.current) {\n // The table moved on: a pending edit typed against the old value\n // would overwrite it, so drop it.\n if (timerRef.current) {\n window.clearTimeout(timerRef.current);\n timerRef.current = undefined;\n setPending(false);\n }\n seenRef.current = external;\n setValue(masked && external !== '' ? '' : external);\n }\n }, [sync, seam, version, masked]);\n\n useEffect(\n () => () => {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n },\n [],\n );\n\n // Only the user's own edits are pushed, and only while the table still\n // holds what the input last saw: an external write that lands while a\n // push waits (Clear all, then a tab restoring a query) wins.\n const push = (next: string) => {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n setPending(true);\n timerRef.current = window.setTimeout(() => {\n timerRef.current = undefined;\n setPending(false);\n if (sync) {\n if (seam.getQuickFilter() !== seenRef.current) return;\n if (next === seenRef.current) return;\n seenRef.current = next;\n }\n seam.setQuickFilter(next);\n }, debounceMs);\n };\n\n const edit = (next: string) => {\n setValue(next);\n push(next);\n };\n\n // Privacy mode with a query the box does not show (restored by a tab,\n // set by an agent, or typed before privacy turned on): the search is\n // applied, so say so calmly and offer a way to clear it, without the\n // text. Typing replaces it as usual.\n const hiddenQuery =\n masked && !pending && value === '' && seam.getQuickFilter() !== '';\n\n return (\n // Slot wrapper caps the search at a legible width on desktop: without\n // it, TextInput's `w-full` lets the QuickSearch absorb the entire\n // FilterBar row and push trailing Actions onto a second line at\n // 1024 / 1280 / 1440. `min-w-0` lets the slot shrink below `24rem`\n // when the toolbar is squeezed on narrow viewports.\n <div className={quickSearchSlotVariants({ hiddenQuery })}>\n <TextInput\n ref={inputRef}\n type=\"search\"\n size=\"sm\"\n // Controlled only when the input follows the table, so it can show\n // an external clear. TextInput writes a controlled value to the DOM\n // property only (useDomValue), never the `value` attribute, so a\n // typed or restored name stays out of the markup.\n {...(sync ? { value } : {})}\n onChange={(e) => edit(e.target.value)}\n placeholder={\n hiddenQuery\n ? t('dataTable.quickSearch.appliedHidden', 'Search applied')\n : (placeholder ??\n t('dataTable.quickSearch.placeholder', 'Search…'))\n }\n startAdornment={<Search aria-hidden className=\"ds:size-4\" />}\n clearable\n onClear={() => edit('')}\n aria-label={t('dataTable.quickSearch.label', 'Quick search')}\n aria-describedby={hiddenQuery ? describedById : undefined}\n />\n {hiddenQuery ? (\n <>\n <span id={describedById} className=\"ds:sr-only\">\n {t(\n 'dataTable.quickSearch.appliedHiddenDescription',\n 'A search is applied. Its text is hidden in privacy mode.',\n )}\n </span>\n <IconButton\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n icon={<X aria-hidden />}\n tooltip={t('dataTable.quickSearch.clearApplied', 'Clear search')}\n onClick={() => {\n edit('');\n inputRef.current?.focus();\n }}\n />\n </>\n ) : null}\n </div>\n );\n };\n QuickSearch.displayName = `${prefix}.QuickSearch`;\n\n /* ---- FilterChips ------------------------------------------------- */\n\n interface Chip {\n key: string;\n label: string;\n }\n\n const FilterChips = () => {\n // Named: a host whose i18next defaultNS is `app` would otherwise read\n // every chip label from its own namespace, not the kit's.\n const { t, i18n } = useTranslation('ui');\n const seam = useSeam('FilterChips');\n useSeamVersion(seam, ['filter', 'quickFilter', 'columns']);\n // Re-read straight after this part's own writes, before the table's\n // change event arrives.\n const [, bump] = useReducer((n: number) => n + 1, 0);\n\n // Read on every render, never memoised on events alone: a chip must\n // drop a value the moment privacy mode masks its column, even when the\n // host re-renders without a change event.\n const model = seam.getFilterModel() ?? {};\n const columnList = seam.getColumns();\n const columns = new Map<string, TableToolbarColumn>(\n columnList.map((c) => [c.id, c]),\n );\n const formatsValues = seam.features.formatsFilterValues === true;\n // DataGrid joins the two through a translated pattern (\"Colonne :\n // valeur\" in French); DataTable keeps kit 1.112's \": \".\n const chipText = (column: string, value: string): string =>\n formatsValues\n ? t('dataTable.filterChips.chip', { column, value })\n : `${column}: ${value}`;\n const chips: Chip[] = [];\n for (const key of Object.keys(model)) {\n const column = columns.get(key);\n if (!column) {\n // A host key (DataGrid server filters): its label only, never the\n // value, which is opaque and may be personal data.\n const hostLabel = seam.getFilterLabel?.(key);\n chips.push({ key, label: hostLabel ?? key });\n continue;\n }\n // A masked column's chip names the column only.\n const text = column.masked\n ? ''\n : describeFilterModel(\n model[key],\n t,\n chipFormatFor(column, formatsValues, i18n.language),\n );\n const name = column.label || key;\n chips.push({ key, label: text ? chipText(name, text) : name });\n }\n const quickFilter = seam.getQuickFilter();\n const quickLabel = t('dataTable.quickSearch.label', 'Quick search');\n // Under privacy mode the query may be a name: the chip says only that\n // a quick search is active, so no attribute or announcement carries it.\n const quickChip = columnList.some((c) => c.masked === true)\n ? quickLabel\n : chipText(quickLabel, quickFilter);\n\n const total = chips.length + (quickFilter ? 1 : 0);\n if (total === 0) return null;\n\n return (\n <div\n role=\"group\"\n aria-label={t('dataTable.filterChips.label', 'Active filters')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {quickFilter && (\n <Tag\n label={quickChip}\n size=\"sm\"\n variant=\"brand\"\n fill=\"solid\"\n onRemove={() => {\n seam.setQuickFilter('');\n bump();\n }}\n />\n )}\n {chips.map((c) => (\n <Tag\n key={c.key}\n label={c.label}\n size=\"sm\"\n // An active filter is a state the user must notice: it silently\n // changes what the table means. Outline read as decoration.\n variant=\"brand\"\n fill=\"solid\"\n // Clear the MODEL, never destroy the filter instance, so a\n // floating filter stops showing the value it no longer applies.\n onRemove={() => {\n seam.setColumnFilter(c.key, null);\n bump();\n }}\n />\n ))}\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"sm\"\n onClick={() => {\n seam.clearAllFilters();\n bump();\n }}\n startIcon={<X aria-hidden className=\"ds:size-4\" />}\n >\n {t('dataTable.filterChips.clearAll', 'Clear all')}\n </Button>\n </div>\n );\n };\n FilterChips.displayName = `${prefix}.FilterChips`;\n\n /* ---- FacetFilter ------------------------------------------------- */\n\n const FacetFilter = ({ field, options, label }: TableFacetFilterProps) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('FacetFilter');\n const reads = seam.features.syncsFilterInputs && !!seam.getFacet;\n const version = useSeamVersion(seam, reads ? ['filter'] : []);\n // Local pill: the only state when the seam cannot read facets back;\n // otherwise an optimistic value until the table reports the change.\n const [local, setLocal] = useState<{\n value: TableFacetValue | null;\n } | null>(null);\n useEffect(() => {\n if (reads) setLocal(null);\n }, [reads, version]);\n const active = local\n ? local.value\n : reads\n ? (seam.getFacet?.(field) ?? null)\n : null;\n\n function apply(value: TableFacetValue | null) {\n setLocal({ value });\n seam.setFacet(field, value);\n }\n\n return (\n <div\n role=\"group\"\n aria-label={label ?? t('dataTable.facetFilter.label', 'Filter')}\n className=\"ds:flex ds:w-full ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {options.map((opt) => {\n const isActive = active === opt.value;\n return (\n <Button\n key={String(opt.value)}\n type=\"button\"\n size=\"sm\"\n intent={isActive ? 'primary' : 'secondary'}\n aria-pressed={isActive}\n onClick={() => apply(opt.value)}\n >\n {opt.label}\n </Button>\n );\n })}\n </div>\n );\n };\n FacetFilter.displayName = `${prefix}.FacetFilter`;\n\n /* ---- ExportMenu -------------------------------------------------- */\n\n const ExportMenuMarker = createContext(false);\n\n const ExportMenu = forwardRef<HTMLButtonElement, TableExportMenuProps>(\n ({ children, label, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation('ui');\n useSeam('ExportMenu');\n return (\n <ExportMenuMarker.Provider value>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Download aria-hidden />}\n tooltip={label ?? t('dataTable.export.menu', 'Export')}\n aria-label={label ?? t('dataTable.export.menu', 'Export')}\n aria-haspopup=\"menu\"\n {...rest}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" sideOffset={4}>\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </ExportMenuMarker.Provider>\n );\n },\n );\n ExportMenu.displayName = `${prefix}.ExportMenu`;\n\n function defaultExportLabel(\n t: (key: string, fallback: string) => string,\n format: TableExportFormat,\n ): string {\n if (format === 'csv') return t('dataTable.export.csv', 'Export CSV');\n if (format === 'xlsx') return t('dataTable.export.xlsx', 'Export Excel');\n if (format === 'pdf') return t('dataTable.export.pdf', 'Export PDF');\n return t('dataTable.export.custom', 'Export');\n }\n\n function exportIcon(format: TableExportFormat): ReactNode {\n if (format === 'xlsx')\n return <FileSpreadsheet aria-hidden className=\"ds:size-4\" />;\n if (format === 'pdf') return <FileText aria-hidden className=\"ds:size-4\" />;\n return <Download aria-hidden className=\"ds:size-4\" />;\n }\n\n /** @internal The item shell; engine wrappers decide what `onSelect` does. */\n const ExportMenuItemBase = ({\n format,\n label,\n onSelect,\n disabled,\n description,\n }: TableExportMenuItemBaseProps) => {\n const { t } = useTranslation('ui');\n if (!useContext(ExportMenuMarker)) {\n throw new Error(\n `${prefix}.ExportMenu.Item must be rendered inside ${prefix}.ExportMenu.`,\n );\n }\n return (\n <DropdownMenu.Item\n onSelect={onSelect}\n disabled={disabled}\n description={description}\n >\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {exportIcon(format)}\n <span>{label ?? defaultExportLabel(t, format)}</span>\n </span>\n </DropdownMenu.Item>\n );\n };\n ExportMenuItemBase.displayName = `${prefix}.ExportMenu.Item`;\n\n /* ---- ColumnToggle ------------------------------------------------ */\n\n const ColumnToggle = forwardRef<HTMLButtonElement, TableColumnToggleProps>(\n function ColumnToggle(\n { label, icon, footer, header, intent = 'outline', ...rest },\n ref,\n ) {\n const { t, i18n } = useTranslation('ui');\n const seam = useSeam('ColumnToggle');\n const keyboard = seam.features.keyboardReorder;\n const announces = seam.features.toolbarAnnouncesColumnMoves === true;\n const [open, setOpen] = useState(false);\n // Polite status for engines with no announcer of their own; empty\n // each time the popover opens.\n const [announcement, setAnnouncement] = useState('');\n const version = useSeamVersion(seam, open ? ['columns'] : []);\n const [columns, setColumns] = useState<TableToolbarColumn[]>([]);\n const [draggingColId, setDraggingColId] = useState<string | null>(null);\n const [dragOverColId, setDragOverColId] = useState<string | null>(null);\n const moveButtons = useRef(new Map<string, HTMLButtonElement>());\n const pendingFocus = useRef<{ id: string; dir: 'up' | 'down' } | null>(\n null,\n );\n\n // Refresh the column list whenever the popover opens (picks up\n // columns added, removed or renamed since the last open) and on every\n // column change while it is open.\n // Columns privacy mode removes from view are not listed (design 3.9).\n const readColumns = useCallback(\n () => seam.getColumns().filter((c) => c.hiddenByPrivacy !== true),\n [seam],\n );\n useEffect(() => {\n if (!open) return;\n setColumns(readColumns());\n }, [open, readColumns, version]);\n useEffect(() => {\n if (open) setAnnouncement('');\n }, [open]);\n\n // Keep focus on the moved column's button: React may move its row's\n // DOM node, which drops focus. At an end the other button takes it.\n useLayoutEffect(() => {\n const pending = pendingFocus.current;\n if (!pending) return;\n pendingFocus.current = null;\n const index = columns.findIndex((c) => c.id === pending.id);\n if (index < 0) return;\n const atEnd =\n pending.dir === 'up' ? index === 0 : index === columns.length - 1;\n const dir = atEnd\n ? pending.dir === 'up'\n ? 'down'\n : 'up'\n : pending.dir;\n moveButtons.current.get(`${pending.id}:${dir}`)?.focus();\n }, [columns]);\n\n const toggleColumn = useCallback(\n (colId: string, nextVisible: boolean) => {\n if (!seam.isReady()) return;\n seam.setColumnVisible(colId, nextVisible);\n // Re-read rather than assume: the engine may refuse the change,\n // and the box must never claim a column is shown when it is not.\n setColumns(readColumns());\n },\n [seam, readColumns],\n );\n\n // Move to the final index the target held, then re-read: the seam\n // applies the pin side of the column that sat there and refuses\n // moves a column may not make.\n const moveTo = useCallback(\n (colId: string, toIndex: number) => {\n if (!seam.isReady()) return;\n const before = seam.getColumns().find((c) => c.id === colId);\n seam.moveColumn(colId, toIndex);\n const after = readColumns();\n setColumns(after);\n if (!announces || !before) return;\n const index = after.findIndex((c) => c.id === colId);\n const moved = after[index];\n if (!moved) return;\n const column = moved.label || colId;\n if (moved.pinned !== before.pinned) {\n setAnnouncement(\n moved.pinned === 'start'\n ? t('dataGrid.announce.columnPinnedStart', { column })\n : moved.pinned === 'end'\n ? t('dataGrid.announce.columnPinnedEnd', { column })\n : t('dataGrid.announce.columnUnpinned', { column }),\n );\n return;\n }\n setAnnouncement(\n t('dataGrid.announce.columnMoved', {\n column,\n position: formatNumber(index + 1, i18n.language),\n total: formatNumber(after.length, i18n.language),\n }),\n );\n },\n [seam, readColumns, announces, t, i18n.language],\n );\n\n const moveColumn = useCallback(\n (fromColId: string, toColId: string) => {\n if (fromColId === toColId) return;\n const toIndex = seam.getColumns().findIndex((c) => c.id === toColId);\n if (toIndex < 0) return;\n moveTo(fromColId, toIndex);\n },\n [seam, moveTo],\n );\n\n const labelText = label ?? t('dataTable.columnToggle');\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={icon ?? <Columns3Cog aria-hidden />}\n tooltip={labelText}\n aria-label={labelText}\n aria-haspopup=\"dialog\"\n {...rest}\n />\n </Popover.Trigger>\n {/* Capped to the space Radix reports below the trigger, and the list\n scrolls inside it: 25+ columns otherwise run past the viewport\n with no way to reach the bottom ones. */}\n <Popover.Content\n size=\"sm\"\n align=\"end\"\n className=\"ds:flex ds:max-h-[var(--radix-popover-content-available-height)] ds:flex-col\"\n >\n <Popover.Heading>{labelText}</Popover.Heading>\n {header ? (\n <div className=\"ds:mb-[var(--spacing-xs)] ds:border-b ds:border-[color:var(--border)] ds:pb-[var(--spacing-sm)]\">\n {header}\n </div>\n ) : null}\n <ul\n className=\"ds:flex ds:min-h-0 ds:flex-col ds:gap-[var(--spacing-xs)] ds:overflow-y-auto\"\n aria-label={labelText}\n >\n {columns.map((c, index) => {\n const isDragging = draggingColId === c.id;\n const isDragOver =\n dragOverColId === c.id && draggingColId !== c.id;\n return (\n <li\n key={c.id}\n draggable\n onDragStart={(e) => {\n setDraggingColId(c.id);\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', c.id);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setDragOverColId(c.id);\n }}\n onDragLeave={() => {\n setDragOverColId((prev) => (prev === c.id ? null : prev));\n }}\n onDrop={(e) => {\n e.preventDefault();\n const fromColId = e.dataTransfer.getData('text/plain');\n if (fromColId) moveColumn(fromColId, c.id);\n setDraggingColId(null);\n setDragOverColId(null);\n }}\n onDragEnd={() => {\n setDraggingColId(null);\n setDragOverColId(null);\n }}\n className={columnRowVariants({\n dragging: isDragging,\n dragOver: isDragOver,\n })}\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:cursor-grab ds:text-[color:var(--muted-foreground)] ds:active:cursor-grabbing\"\n >\n <GripVertical className=\"ds:size-4\" />\n </span>\n <Checkbox\n label={c.label}\n checked={c.visible}\n disabled={c.canHide === false}\n onCheckedChange={(checked) =>\n toggleColumn(c.id, checked === true)\n }\n />\n {keyboard ? (\n <span className=\"ds:ms-auto ds:flex ds:items-center\">\n <IconButton\n ref={(node) => {\n if (node)\n moveButtons.current.set(`${c.id}:up`, node);\n else moveButtons.current.delete(`${c.id}:up`);\n }}\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n icon={<ArrowUp aria-hidden />}\n aria-label={t('dataGrid.toolbar.moveColumnUp', {\n column: c.label,\n })}\n disabled={!canStepColumn(columns, index, index - 1)}\n onClick={() => {\n pendingFocus.current = { id: c.id, dir: 'up' };\n const target = columns[index - 1];\n if (target) moveColumn(c.id, target.id);\n }}\n />\n <IconButton\n ref={(node) => {\n if (node)\n moveButtons.current.set(`${c.id}:down`, node);\n else moveButtons.current.delete(`${c.id}:down`);\n }}\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n icon={<ArrowDown aria-hidden />}\n aria-label={t('dataGrid.toolbar.moveColumnDown', {\n column: c.label,\n })}\n disabled={!canStepColumn(columns, index, index + 1)}\n onClick={() => {\n pendingFocus.current = { id: c.id, dir: 'down' };\n const target = columns[index + 1];\n if (target) moveColumn(c.id, target.id);\n }}\n />\n </span>\n ) : null}\n </li>\n );\n })}\n </ul>\n {announces ? (\n <span role=\"status\" className=\"ds:sr-only\">\n {announcement}\n </span>\n ) : null}\n {keyboard && seam.resetColumns ? (\n <div className=\"ds:mt-[var(--spacing-xs)] ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-sm)]\">\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"sm\"\n startIcon={<RotateCcw aria-hidden className=\"ds:size-4\" />}\n onClick={() => {\n seam.resetColumns?.();\n setColumns(readColumns());\n }}\n >\n {t('dataGrid.toolbar.resetColumns')}\n </Button>\n </div>\n ) : null}\n {footer ? (\n <div className=\"ds:mt-[var(--spacing-xs)] ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-sm)]\">\n {footer}\n </div>\n ) : null}\n </Popover.Content>\n </Popover.Root>\n );\n },\n );\n ColumnToggle.displayName = `${prefix}.ColumnToggle`;\n\n /* ---- BulkAction -------------------------------------------------- */\n\n const BulkAction = forwardRef<HTMLButtonElement, TableBulkActionProps>(\n (\n { label, icon, onAction, variant = 'default', size = 'sm', ...rest },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('BulkAction');\n useSeamVersion(seam, ['selection']);\n const selectionCount = seam.getSelectionCount();\n if (selectionCount === 0) return null;\n\n const resolvedIntent =\n variant === 'destructive' ? 'destructive' : 'secondary';\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n intent={resolvedIntent}\n size={size}\n startIcon={sizeIcon(icon)}\n onClick={() => onAction(actionContextOf(seam))}\n aria-label={`${label} (${t('dataTable.bulkAction', { count: selectionCount })})`}\n {...rest}\n >\n <span>{label}</span>\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:opacity-80\"\n >\n {t('dataTable.bulkAction', { count: selectionCount })}\n </span>\n </Button>\n );\n },\n );\n BulkAction.displayName = `${prefix}.BulkAction`;\n\n // These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n // accepts them as direct children (see its rendersIconButton DEV check).\n for (const leaf of [Print, Refresh, ExportMenu, ColumnToggle]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n }\n\n return {\n Root,\n FilterBar,\n Actions,\n Print: PrintPart,\n Refresh: RefreshPart,\n QuickSearch,\n FilterChips,\n FacetFilter,\n ExportMenu,\n ExportMenuItemBase,\n ColumnToggle,\n BulkAction,\n useSeam,\n };\n}\n\n/** @internal One engine's parts. */\nexport type TableToolbarParts = ReturnType<typeof createTableToolbarParts>;\n"],"names":["__iconNode","Columns3Cog","createLucideIcon","TableToolbarContext","createContext","TableToolbarProvider","seam","children","value","useMemo","jsx","useTableToolbarSeam","missingMessage","fallback","ctx","useContext","useSeamVersion","kinds","version","setVersion","useState","key","useEffect","wanted","kind","v","formatShortDate","date","pattern","pad","n","width","token","signed","chipFormatFor","column","formatsValues","language","options","_a","o","formatNumber","day","fromIsoDate","getShortDateFormat","isTextOperator","op","textOperatorText","t","gridOperatorText","describeFilterModel","model","format","m","type","kitWording","operatorText","d","from","to","hasFrom","hasTo","dateFrom","dateTo","range","sizeIcon","node","isValidElement","element","existingClass","className","cloneElement","masksFreeText","c","canStepColumn","columns","target","next","_","i","seen","previous","group","actionContextOf","toolbarRootVariants","cva","toolbarFilterBarVariants","quickSearchSlotVariants","toolbarActionsVariants","columnRowVariants","createTableToolbarParts","names","prefix","useEngineSeam","useSeam","part","Root","forwardRef","props","ref","FilterBar","Actions","withInjectedClick","Print","label","intent","useTranslation","onClick","rest","IconButton","Printer","event","Refresh","onRefresh","RefreshCw","PrintMenuItem","childProps","disabled","DropdownMenu","RefreshMenuItem","PrintPart","RefreshPart","QuickSearch","placeholder","debounceMs","sync","masked","setValue","seenRef","useRef","maskedRef","timerRef","pending","setPending","describedById","useId","inputRef","external","push","edit","hiddenQuery","TextInput","e","Search","jsxs","Fragment","X","FilterChips","i18n","bump","useReducer","columnList","chipText","chips","hostLabel","text","name","quickFilter","quickLabel","quickChip","Tag","Button","FacetFilter","field","reads","local","setLocal","active","apply","opt","isActive","ExportMenuMarker","ExportMenu","Download","defaultExportLabel","exportIcon","FileSpreadsheet","FileText","ExportMenuItemBase","onSelect","description","ColumnToggle","icon","footer","header","keyboard","announces","open","setOpen","announcement","setAnnouncement","setColumns","draggingColId","setDraggingColId","dragOverColId","setDragOverColId","moveButtons","pendingFocus","readColumns","useCallback","useLayoutEffect","index","dir","toggleColumn","colId","nextVisible","moveTo","toIndex","before","after","moved","moveColumn","fromColId","toColId","labelText","Popover","isDragging","isDragOver","prev","GripVertical","Checkbox","checked","ArrowUp","ArrowDown","RotateCcw","BulkAction","onAction","variant","size","selectionCount","leaf"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,11 +1,11 @@
1
1
  import { jsx as r } from "react/jsx-runtime";
2
2
  import { useState as M, useEffect as G, forwardRef as m, useCallback as w } from "react";
3
3
  import { useTranslation as I } from "react-i18next";
4
- import { T as v, c as N, a as R } from "./parts-CcyRkB8t.js";
4
+ import { T as v, c as N, a as R } from "./parts-tGzYz0uG.js";
5
5
  import { e as k, s as P, w as A, a as B } from "./export-files-BByoK9Cg.js";
6
6
  import { i as O } from "./is-development-CLUAnsU7.js";
7
7
  import { d as j, g as Q, u as _ } from "./grid-context-jn9y8tNE.js";
8
- import { g as U } from "./data-grid-C71BhGDw.js";
8
+ import { g as U } from "./data-grid-bzvkQ3kc.js";
9
9
  function S() {
10
10
  var t;
11
11
  return ((t = _()) == null ? void 0 : t.toolbarSeam) ?? null;
@@ -156,4 +156,4 @@ export {
156
156
  Z as D,
157
157
  Y as a
158
158
  };
159
- //# sourceMappingURL=toolbar-Dznu_Dou.js.map
159
+ //# sourceMappingURL=toolbar-Co46MEn9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-Dznu_Dou.js","sources":["../../src/components/data-grid/toolbar.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* DataGridToolbar: the shared table toolbar parts over DataGrid. */\n/* */\n/* The parts live in `_shared/table-toolbar/` and reach the grid only */\n/* through its `TableToolbarSeam` (`./toolbar-seam.ts`). Inside the */\n/* grid's `toolbar` slot they find it through `DataGridContext`; a */\n/* toolbar lifted into a page header uses `DataGridToolbarProvider`. */\n/* Callbacks get a `ToolbarActionContext` (ids and an export snapshot), */\n/* never an engine API. No AG Grid, no DataTable import. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TableToolbarProvider } from '../_shared/table-toolbar/context';\nimport {\n exportFileName,\n snapshotToTable,\n writeTablePdf,\n writeTableXlsx,\n} from '../_shared/table-toolbar/export-files';\nimport {\n actionContextOf,\n createTableToolbarParts,\n} from '../_shared/table-toolbar/parts';\nimport type { TableToolbarSeam } from '../_shared/table-toolbar/seam';\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n dataGridMountSignal,\n getDataGridToolbarSeam,\n useDataGridContext,\n} from './grid-context';\nimport { dataGridSeamCaption } from './toolbar-seam';\nimport type {\n DataGridExportFormat,\n DataGridHandle,\n DataGridToolbarBulkActionProps,\n DataGridToolbarColumnToggleProps,\n DataGridToolbarExportMenuItemProps,\n DataGridToolbarExportMenuProps,\n DataGridToolbarFacetFilterProps,\n DataGridToolbarFilterChipsProps,\n DataGridToolbarPrintProps,\n DataGridToolbarProviderProps,\n DataGridToolbarQuickSearchProps,\n DataGridToolbarRefreshProps,\n DataGridToolbarRootProps,\n} from './types';\n\n/** The grid's own seam when the part sits in its `toolbar` slot. */\nfunction useSlotSeam(): TableToolbarSeam | null {\n return useDataGridContext()?.toolbarSeam ?? null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Lifted toolbar: DataGridToolbarProvider */\n/* ------------------------------------------------------------------ */\n\n/** A seam with nothing behind it, for a lifted toolbar whose grid has not\n * mounted yet: reads are empty, writes do nothing, `isReady()` is false. */\nconst UNBOUND_SEAM: TableToolbarSeam = {\n features: {\n syncsFilterInputs: true,\n exportsAllRows: false,\n keyboardReorder: true,\n },\n isReady: () => false,\n subscribe: () => () => {},\n getColumns: () => [],\n setColumnVisible: () => {},\n moveColumn: () => {},\n getQuickFilter: () => '',\n setQuickFilter: () => {},\n getFilterModel: () => ({}),\n setColumnFilter: () => {},\n clearAllFilters: () => {},\n setFacet: () => {},\n getFacet: () => null,\n getSelectionCount: () => 0,\n getSelectedRowIds: () => [],\n getExportSnapshot: () => undefined,\n exportCsv: () => {},\n print: () => {},\n};\n\ninterface Bound {\n handle: DataGridHandle | null;\n seam: TableToolbarSeam | null;\n}\n\n/**\n * For a toolbar outside the grid (a page header). Binds to whatever\n * `getGrid()` returns, once after mount and again whenever any DataGrid\n * mounts or unmounts (`dataGridMountSignal`): no polling. Until a grid is\n * bound the parts are inert.\n */\nexport function DataGridToolbarProvider({\n getGrid,\n children,\n}: DataGridToolbarProviderProps) {\n const [bound, setBound] = useState<Bound>({ handle: null, seam: null });\n useEffect(() => {\n const resolve = () => {\n const handle = getGrid() ?? null;\n const seam = getDataGridToolbarSeam(handle);\n setBound((prev) =>\n prev.handle === handle && prev.seam === seam ? prev : { handle, seam },\n );\n };\n resolve();\n return dataGridMountSignal.subscribe(resolve);\n }, [getGrid]);\n return (\n <TableToolbarProvider seam={bound.seam ?? UNBOUND_SEAM}>\n {children}\n </TableToolbarProvider>\n );\n}\n\n/**\n * Builds the toolbar and its parts. One call, at module level, marked pure:\n * a bundler drops it (and every shared part, DropdownMenu, Tag and Kbd with\n * it) from an app that imports `DataGrid` without `DataGridToolbar`.\n */\nfunction createDataGridToolbar() {\n const parts = createTableToolbarParts({\n prefix: 'DataGrid.Toolbar',\n missingProvider: (caller) =>\n `${caller} must be rendered in a DataGrid's \\`toolbar\\` slot or inside <DataGridToolbarProvider>.`,\n useEngineSeam: useSlotSeam,\n });\n\n /* ---- Root ---- */\n\n const Root = forwardRef<HTMLDivElement, DataGridToolbarRootProps>(\n (props, ref) => {\n const slotSeam = useSlotSeam();\n const root = (\n <parts.Root ref={ref} data-component=\"data-grid-toolbar\" {...props} />\n );\n // In the grid's slot, the grid's own seam is the nearest one, even\n // under a lifted provider for another grid.\n return slotSeam ? (\n <TableToolbarProvider seam={slotSeam}>{root}</TableToolbarProvider>\n ) : (\n root\n );\n },\n );\n Root.displayName = 'DataGrid.Toolbar';\n\n /* ---- Parts with DataGrid-shaped props ---- */\n\n const QuickSearch = (props: DataGridToolbarQuickSearchProps) => (\n <parts.QuickSearch {...props} />\n );\n QuickSearch.displayName = 'DataGrid.Toolbar.QuickSearch';\n\n const FilterChips = (_props: DataGridToolbarFilterChipsProps) => (\n <parts.FilterChips />\n );\n FilterChips.displayName = 'DataGrid.Toolbar.FilterChips';\n\n /**\n * Pills for one `select` column (or, in server mode, a host key). Any other\n * field renders nothing and warns in development: v9 would evaluate a set\n * model with the column's own (wrong) filter fn.\n */\n const FacetFilter = ({\n field,\n options,\n label,\n }: DataGridToolbarFacetFilterProps) => {\n const seam = parts.useSeam('FacetFilter');\n const column = seam.getColumns().find((c) => c.id === field);\n // A DataGrid seam exports every row exactly in client mode, so a host key\n // (no column) is allowed when it does not.\n const allowed = !seam.isReady()\n ? true\n : column\n ? column.filterKind === 'select' && !column.masked\n : !seam.features.exportsAllRows;\n useEffect(() => {\n if (!allowed && isDevelopment()) {\n console.warn(\n `DataGridToolbar.FacetFilter: \"${field}\" is not a column with filter { kind: 'select' }` +\n ' (or a host key in server mode); the pills are not rendered.',\n );\n }\n }, [allowed, field]);\n if (!allowed) return null;\n return <parts.FacetFilter field={field} options={options} label={label} />;\n };\n FacetFilter.displayName = 'DataGrid.Toolbar.FacetFilter';\n\n const ColumnToggle = forwardRef<\n HTMLButtonElement,\n DataGridToolbarColumnToggleProps\n >((props, ref) => <parts.ColumnToggle ref={ref} {...props} />);\n ColumnToggle.displayName = 'DataGrid.Toolbar.ColumnToggle';\n\n const Print = forwardRef<HTMLButtonElement, DataGridToolbarPrintProps>(\n (props, ref) => <parts.Print ref={ref} {...props} />,\n );\n Print.displayName = 'DataGrid.Toolbar.Print';\n\n const Refresh = forwardRef<HTMLButtonElement, DataGridToolbarRefreshProps>(\n (props, ref) => <parts.Refresh ref={ref} {...props} />,\n );\n Refresh.displayName = 'DataGrid.Toolbar.Refresh';\n\n const BulkAction = forwardRef<\n HTMLButtonElement,\n DataGridToolbarBulkActionProps\n >((props, ref) => <parts.BulkAction ref={ref} {...props} />);\n BulkAction.displayName = 'DataGrid.Toolbar.BulkAction';\n\n const DEFAULT_EXPORT_ITEMS: Exclude<DataGridExportFormat, 'custom'>[] = [\n 'csv',\n 'xlsx',\n 'pdf',\n ];\n\n /**\n * One export item. Built-ins write every filtered row (client mode); in\n * server mode the grid holds one page, so they render disabled with the\n * reason. `custom` always runs and gets the action context.\n */\n const ExportMenuItem = (props: DataGridToolbarExportMenuItemProps) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportMenu.Item');\n const builtIn = props.format !== 'custom';\n const disabled = builtIn && !seam.features.exportsAllRows;\n const handleSelect = useCallback(() => {\n if (props.format === 'custom') {\n props.onExport(actionContextOf(seam));\n return;\n }\n const snapshot = seam.getExportSnapshot();\n if (!snapshot) return;\n const fileName =\n props.fileName ??\n exportFileName(dataGridSeamCaption(seam), props.format);\n if (props.format === 'csv') {\n seam.exportCsv(fileName);\n return;\n }\n const table = snapshotToTable(snapshot);\n if (props.format === 'xlsx') void writeTableXlsx(table, { fileName });\n else void writeTablePdf(table, { fileName });\n }, [props, seam]);\n return (\n <parts.ExportMenuItemBase\n format={props.format}\n label={props.label}\n onSelect={handleSelect}\n disabled={disabled}\n description={\n disabled ? t('dataGrid.toolbar.exportPageOnly') : undefined\n }\n />\n );\n };\n ExportMenuItem.displayName = 'DataGrid.Toolbar.ExportMenu.Item';\n\n const ExportMenu = forwardRef<\n HTMLButtonElement,\n DataGridToolbarExportMenuProps\n >(({ children, ...rest }, ref) => (\n <parts.ExportMenu ref={ref} {...rest}>\n {children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />)}\n </parts.ExportMenu>\n ));\n ExportMenu.displayName = 'DataGrid.Toolbar.ExportMenu';\n\n // These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n // accepts them as direct children (see its rendersIconButton DEV check).\n for (const leaf of [ColumnToggle, Print, Refresh, ExportMenu]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n }\n // Folded into a group's \"More\" menu, Print and Refresh render the shared\n // part's menu item (their action is not an onClick prop).\n Object.assign(Print, { overflowMenuItem: parts.Print.overflowMenuItem });\n Object.assign(Refresh, { overflowMenuItem: parts.Refresh.overflowMenuItem });\n\n const FilterBar = parts.FilterBar;\n const Actions = parts.Actions;\n\n return Object.assign(Root, {\n FilterBar,\n Actions,\n QuickSearch,\n FilterChips,\n FacetFilter,\n ColumnToggle,\n ExportMenu: Object.assign(ExportMenu, { Item: ExportMenuItem }),\n Print,\n Refresh,\n BulkAction,\n });\n}\n\n/**\n * The DataGrid toolbar. Put it in the grid's `toolbar` prop, or lift it into\n * a page header under `DataGridToolbarProvider`.\n */\nexport const DataGridToolbar = /* @__PURE__ */ createDataGridToolbar();\n"],"names":["useSlotSeam","_a","useDataGridContext","UNBOUND_SEAM","DataGridToolbarProvider","getGrid","children","bound","setBound","useState","useEffect","resolve","handle","seam","getDataGridToolbarSeam","prev","dataGridMountSignal","TableToolbarProvider","createDataGridToolbar","parts","createTableToolbarParts","caller","Root","forwardRef","props","ref","slotSeam","root","jsx","QuickSearch","FilterChips","_props","FacetFilter","field","options","label","column","c","allowed","isDevelopment","ColumnToggle","Print","Refresh","BulkAction","DEFAULT_EXPORT_ITEMS","ExportMenuItem","t","useTranslation","disabled","handleSelect","useCallback","actionContextOf","snapshot","fileName","exportFileName","dataGridSeamCaption","table","snapshotToTable","writeTableXlsx","writeTablePdf","ExportMenu","rest","f","leaf","FilterBar","Actions","DataGridToolbar"],"mappings":"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"}
1
+ {"version":3,"file":"toolbar-Co46MEn9.js","sources":["../../src/components/data-grid/toolbar.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* DataGridToolbar: the shared table toolbar parts over DataGrid. */\n/* */\n/* The parts live in `_shared/table-toolbar/` and reach the grid only */\n/* through its `TableToolbarSeam` (`./toolbar-seam.ts`). Inside the */\n/* grid's `toolbar` slot they find it through `DataGridContext`; a */\n/* toolbar lifted into a page header uses `DataGridToolbarProvider`. */\n/* Callbacks get a `ToolbarActionContext` (ids and an export snapshot), */\n/* never an engine API. No AG Grid, no DataTable import. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TableToolbarProvider } from '../_shared/table-toolbar/context';\nimport {\n exportFileName,\n snapshotToTable,\n writeTablePdf,\n writeTableXlsx,\n} from '../_shared/table-toolbar/export-files';\nimport {\n actionContextOf,\n createTableToolbarParts,\n} from '../_shared/table-toolbar/parts';\nimport type { TableToolbarSeam } from '../_shared/table-toolbar/seam';\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n dataGridMountSignal,\n getDataGridToolbarSeam,\n useDataGridContext,\n} from './grid-context';\nimport { dataGridSeamCaption } from './toolbar-seam';\nimport type {\n DataGridExportFormat,\n DataGridHandle,\n DataGridToolbarBulkActionProps,\n DataGridToolbarColumnToggleProps,\n DataGridToolbarExportMenuItemProps,\n DataGridToolbarExportMenuProps,\n DataGridToolbarFacetFilterProps,\n DataGridToolbarFilterChipsProps,\n DataGridToolbarPrintProps,\n DataGridToolbarProviderProps,\n DataGridToolbarQuickSearchProps,\n DataGridToolbarRefreshProps,\n DataGridToolbarRootProps,\n} from './types';\n\n/** The grid's own seam when the part sits in its `toolbar` slot. */\nfunction useSlotSeam(): TableToolbarSeam | null {\n return useDataGridContext()?.toolbarSeam ?? null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Lifted toolbar: DataGridToolbarProvider */\n/* ------------------------------------------------------------------ */\n\n/** A seam with nothing behind it, for a lifted toolbar whose grid has not\n * mounted yet: reads are empty, writes do nothing, `isReady()` is false. */\nconst UNBOUND_SEAM: TableToolbarSeam = {\n features: {\n syncsFilterInputs: true,\n exportsAllRows: false,\n keyboardReorder: true,\n },\n isReady: () => false,\n subscribe: () => () => {},\n getColumns: () => [],\n setColumnVisible: () => {},\n moveColumn: () => {},\n getQuickFilter: () => '',\n setQuickFilter: () => {},\n getFilterModel: () => ({}),\n setColumnFilter: () => {},\n clearAllFilters: () => {},\n setFacet: () => {},\n getFacet: () => null,\n getSelectionCount: () => 0,\n getSelectedRowIds: () => [],\n getExportSnapshot: () => undefined,\n exportCsv: () => {},\n print: () => {},\n};\n\ninterface Bound {\n handle: DataGridHandle | null;\n seam: TableToolbarSeam | null;\n}\n\n/**\n * For a toolbar outside the grid (a page header). Binds to whatever\n * `getGrid()` returns, once after mount and again whenever any DataGrid\n * mounts or unmounts (`dataGridMountSignal`): no polling. Until a grid is\n * bound the parts are inert.\n */\nexport function DataGridToolbarProvider({\n getGrid,\n children,\n}: DataGridToolbarProviderProps) {\n const [bound, setBound] = useState<Bound>({ handle: null, seam: null });\n useEffect(() => {\n const resolve = () => {\n const handle = getGrid() ?? null;\n const seam = getDataGridToolbarSeam(handle);\n setBound((prev) =>\n prev.handle === handle && prev.seam === seam ? prev : { handle, seam },\n );\n };\n resolve();\n return dataGridMountSignal.subscribe(resolve);\n }, [getGrid]);\n return (\n <TableToolbarProvider seam={bound.seam ?? UNBOUND_SEAM}>\n {children}\n </TableToolbarProvider>\n );\n}\n\n/**\n * Builds the toolbar and its parts. One call, at module level, marked pure:\n * a bundler drops it (and every shared part, DropdownMenu, Tag and Kbd with\n * it) from an app that imports `DataGrid` without `DataGridToolbar`.\n */\nfunction createDataGridToolbar() {\n const parts = createTableToolbarParts({\n prefix: 'DataGrid.Toolbar',\n missingProvider: (caller) =>\n `${caller} must be rendered in a DataGrid's \\`toolbar\\` slot or inside <DataGridToolbarProvider>.`,\n useEngineSeam: useSlotSeam,\n });\n\n /* ---- Root ---- */\n\n const Root = forwardRef<HTMLDivElement, DataGridToolbarRootProps>(\n (props, ref) => {\n const slotSeam = useSlotSeam();\n const root = (\n <parts.Root ref={ref} data-component=\"data-grid-toolbar\" {...props} />\n );\n // In the grid's slot, the grid's own seam is the nearest one, even\n // under a lifted provider for another grid.\n return slotSeam ? (\n <TableToolbarProvider seam={slotSeam}>{root}</TableToolbarProvider>\n ) : (\n root\n );\n },\n );\n Root.displayName = 'DataGrid.Toolbar';\n\n /* ---- Parts with DataGrid-shaped props ---- */\n\n const QuickSearch = (props: DataGridToolbarQuickSearchProps) => (\n <parts.QuickSearch {...props} />\n );\n QuickSearch.displayName = 'DataGrid.Toolbar.QuickSearch';\n\n const FilterChips = (_props: DataGridToolbarFilterChipsProps) => (\n <parts.FilterChips />\n );\n FilterChips.displayName = 'DataGrid.Toolbar.FilterChips';\n\n /**\n * Pills for one `select` column (or, in server mode, a host key). Any other\n * field renders nothing and warns in development: v9 would evaluate a set\n * model with the column's own (wrong) filter fn.\n */\n const FacetFilter = ({\n field,\n options,\n label,\n }: DataGridToolbarFacetFilterProps) => {\n const seam = parts.useSeam('FacetFilter');\n const column = seam.getColumns().find((c) => c.id === field);\n // A DataGrid seam exports every row exactly in client mode, so a host key\n // (no column) is allowed when it does not.\n const allowed = !seam.isReady()\n ? true\n : column\n ? column.filterKind === 'select' && !column.masked\n : !seam.features.exportsAllRows;\n useEffect(() => {\n if (!allowed && isDevelopment()) {\n console.warn(\n `DataGridToolbar.FacetFilter: \"${field}\" is not a column with filter { kind: 'select' }` +\n ' (or a host key in server mode); the pills are not rendered.',\n );\n }\n }, [allowed, field]);\n if (!allowed) return null;\n return <parts.FacetFilter field={field} options={options} label={label} />;\n };\n FacetFilter.displayName = 'DataGrid.Toolbar.FacetFilter';\n\n const ColumnToggle = forwardRef<\n HTMLButtonElement,\n DataGridToolbarColumnToggleProps\n >((props, ref) => <parts.ColumnToggle ref={ref} {...props} />);\n ColumnToggle.displayName = 'DataGrid.Toolbar.ColumnToggle';\n\n const Print = forwardRef<HTMLButtonElement, DataGridToolbarPrintProps>(\n (props, ref) => <parts.Print ref={ref} {...props} />,\n );\n Print.displayName = 'DataGrid.Toolbar.Print';\n\n const Refresh = forwardRef<HTMLButtonElement, DataGridToolbarRefreshProps>(\n (props, ref) => <parts.Refresh ref={ref} {...props} />,\n );\n Refresh.displayName = 'DataGrid.Toolbar.Refresh';\n\n const BulkAction = forwardRef<\n HTMLButtonElement,\n DataGridToolbarBulkActionProps\n >((props, ref) => <parts.BulkAction ref={ref} {...props} />);\n BulkAction.displayName = 'DataGrid.Toolbar.BulkAction';\n\n const DEFAULT_EXPORT_ITEMS: Exclude<DataGridExportFormat, 'custom'>[] = [\n 'csv',\n 'xlsx',\n 'pdf',\n ];\n\n /**\n * One export item. Built-ins write every filtered row (client mode); in\n * server mode the grid holds one page, so they render disabled with the\n * reason. `custom` always runs and gets the action context.\n */\n const ExportMenuItem = (props: DataGridToolbarExportMenuItemProps) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportMenu.Item');\n const builtIn = props.format !== 'custom';\n const disabled = builtIn && !seam.features.exportsAllRows;\n const handleSelect = useCallback(() => {\n if (props.format === 'custom') {\n props.onExport(actionContextOf(seam));\n return;\n }\n const snapshot = seam.getExportSnapshot();\n if (!snapshot) return;\n const fileName =\n props.fileName ??\n exportFileName(dataGridSeamCaption(seam), props.format);\n if (props.format === 'csv') {\n seam.exportCsv(fileName);\n return;\n }\n const table = snapshotToTable(snapshot);\n if (props.format === 'xlsx') void writeTableXlsx(table, { fileName });\n else void writeTablePdf(table, { fileName });\n }, [props, seam]);\n return (\n <parts.ExportMenuItemBase\n format={props.format}\n label={props.label}\n onSelect={handleSelect}\n disabled={disabled}\n description={\n disabled ? t('dataGrid.toolbar.exportPageOnly') : undefined\n }\n />\n );\n };\n ExportMenuItem.displayName = 'DataGrid.Toolbar.ExportMenu.Item';\n\n const ExportMenu = forwardRef<\n HTMLButtonElement,\n DataGridToolbarExportMenuProps\n >(({ children, ...rest }, ref) => (\n <parts.ExportMenu ref={ref} {...rest}>\n {children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />)}\n </parts.ExportMenu>\n ));\n ExportMenu.displayName = 'DataGrid.Toolbar.ExportMenu';\n\n // These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n // accepts them as direct children (see its rendersIconButton DEV check).\n for (const leaf of [ColumnToggle, Print, Refresh, ExportMenu]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n }\n // Folded into a group's \"More\" menu, Print and Refresh render the shared\n // part's menu item (their action is not an onClick prop).\n Object.assign(Print, { overflowMenuItem: parts.Print.overflowMenuItem });\n Object.assign(Refresh, { overflowMenuItem: parts.Refresh.overflowMenuItem });\n\n const FilterBar = parts.FilterBar;\n const Actions = parts.Actions;\n\n return Object.assign(Root, {\n FilterBar,\n Actions,\n QuickSearch,\n FilterChips,\n FacetFilter,\n ColumnToggle,\n ExportMenu: Object.assign(ExportMenu, { Item: ExportMenuItem }),\n Print,\n Refresh,\n BulkAction,\n });\n}\n\n/**\n * The DataGrid toolbar. Put it in the grid's `toolbar` prop, or lift it into\n * a page header under `DataGridToolbarProvider`.\n */\nexport const DataGridToolbar = /* @__PURE__ */ createDataGridToolbar();\n"],"names":["useSlotSeam","_a","useDataGridContext","UNBOUND_SEAM","DataGridToolbarProvider","getGrid","children","bound","setBound","useState","useEffect","resolve","handle","seam","getDataGridToolbarSeam","prev","dataGridMountSignal","TableToolbarProvider","createDataGridToolbar","parts","createTableToolbarParts","caller","Root","forwardRef","props","ref","slotSeam","root","jsx","QuickSearch","FilterChips","_props","FacetFilter","field","options","label","column","c","allowed","isDevelopment","ColumnToggle","Print","Refresh","BulkAction","DEFAULT_EXPORT_ITEMS","ExportMenuItem","t","useTranslation","disabled","handleSelect","useCallback","actionContextOf","snapshot","fileName","exportFileName","dataGridSeamCaption","table","snapshotToTable","writeTableXlsx","writeTablePdf","ExportMenu","rest","f","leaf","FilterBar","Actions","DataGridToolbar"],"mappings":"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"}