@nxgt/material 3.28.0 → 3.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +5 -3
  3. package/dist/{async-slice-DmhasXmq.js → async-slice-Cll-4Mvg.js} +2 -2
  4. package/dist/{button-BjIg_Lz6.js → button-B47lM8a5.js} +1 -1
  5. package/dist/charts.js +3 -3
  6. package/dist/{chip-DIBIDUZH.js → chip-Bf80b1XT.js} +1 -1
  7. package/dist/{code-editor-2EU-q9FV.js → code-editor-BLLpzmCc.js} +4 -4
  8. package/dist/code-editor.js +4 -4
  9. package/dist/{code-language-items-C_UeMQMm.js → code-language-items-COd99vab.js} +2 -2
  10. package/dist/{components-Cl3Zyoe-.js → components-BgMUA99Q.js} +15433 -15235
  11. package/dist/components.js +26 -26
  12. package/dist/{dialog-LtXwv6N3.js → dialog-Cp7bS5LI.js} +1 -1
  13. package/dist/dnd.js +1 -1
  14. package/dist/{dropdown-menu-ppMPD12c.js → dropdown-menu-DJNMcPZa.js} +1 -1
  15. package/dist/editor.js +7 -7
  16. package/dist/{empty-state-X_nikpBS.js → empty-state-Dv9AtrMw.js} +1 -1
  17. package/dist/hooks.js +2 -2
  18. package/dist/{i18n-provider-BfyDgd2o.js → i18n-provider-BBhhsa4I.js} +1 -1
  19. package/dist/i18n.js +5 -5
  20. package/dist/{icon-badge-oLBh3Mlk.js → icon-badge-DEk244kn.js} +1 -1
  21. package/dist/lib/components/ui/collections/filter/bar/filter-bar-classes.d.ts +5 -0
  22. package/dist/lib/components/ui/collections/filter/internal.d.ts +1 -0
  23. package/dist/lib/components/ui/collections/filter/query/filter-results-status.d.ts +2 -1
  24. package/dist/lib/components/ui/collections/filter/query/types.d.ts +16 -0
  25. package/dist/lib/components/ui/collections/filter/query/use-filter-query-options.d.ts +3 -1
  26. package/dist/lib/components/ui/collections/filter/query/use-filter-query-value.d.ts +2 -0
  27. package/dist/lib/components/ui/collections/filter/query/use-filter-query.d.ts +5 -1
  28. package/dist/lib/components/ui/collections/filter/sections/filter-form-error.d.ts +8 -0
  29. package/dist/lib/components/ui/collections/filter/sections/filter-search-error.d.ts +9 -0
  30. package/dist/lib/components/ui/collections/index.d.ts +1 -0
  31. package/dist/lib/components/ui/collections/row-menu/index.d.ts +3 -0
  32. package/dist/lib/components/ui/collections/row-menu/row-menu-column.d.ts +37 -0
  33. package/dist/lib/components/ui/collections/row-menu/row-menu-trigger.d.ts +16 -0
  34. package/dist/lib/components/ui/collections/row-menu/row-menu.d.ts +36 -0
  35. package/dist/lib/components/ui/collections/server-table/types.d.ts +11 -0
  36. package/dist/lib/components/ui/display/badge/badge.d.ts +10 -2
  37. package/dist/lib/components/ui/display/index.d.ts +1 -0
  38. package/dist/lib/components/ui/display/zoned-time/index.d.ts +1 -0
  39. package/dist/lib/components/ui/display/zoned-time/zoned-time.d.ts +34 -0
  40. package/dist/lib/components/ui/overlays/command/command-dialog.d.ts +22 -0
  41. package/dist/lib/components/ui/overlays/command/command.d.ts +1 -12
  42. package/dist/lib/components/ui/overlays/command/index.d.ts +1 -0
  43. package/dist/lib/i18n/resources/en/en.d.ts +4 -0
  44. package/dist/lib/i18n/resources/en/material.json.d.ts +4 -0
  45. package/dist/lib/i18n/resources/fr/fr.d.ts +4 -0
  46. package/dist/lib/i18n/resources/fr/material.json.d.ts +4 -0
  47. package/dist/lib/i18n/resources/resources.d.ts +8 -0
  48. package/dist/lib/i18n/translator.d.ts +1 -1
  49. package/dist/lib/lib/zoned.d.ts +27 -0
  50. package/dist/lib.js +1 -1
  51. package/dist/main.js +43 -43
  52. package/dist/map.js +4 -4
  53. package/dist/material.css +1 -1
  54. package/dist/pdf-reader.js +1 -1
  55. package/dist/print.js +2 -2
  56. package/dist/{public-BeM7-x-m.js → public-Cvwb2tds.js} +6 -6
  57. package/dist/{rich-code-block-B4TIjZRA.js → rich-code-block-MItKFVB-.js} +4 -4
  58. package/dist/{sortable-provider-Dcsw0pgW.js → sortable-provider-CIlK0Vuk.js} +1 -1
  59. package/dist/{spinner-1Ia6Akhy.js → spinner-DRGPXRNW.js} +1 -1
  60. package/dist/{stored-language-DoWMr969.js → stored-language-CkPRWAaM.js} +8 -0
  61. package/dist/theme-picker.js +2 -2
  62. package/dist/{theme-toggle-GlKtdgYz.js → theme-toggle-CPzxOW_X.js} +1 -1
  63. package/dist/{toolbar-items-C1GdN9P9.js → toolbar-items-GIaifZbx.js} +2 -2
  64. package/dist/{translate-material-BneuBHXZ.js → translate-material-BEQGLLY7.js} +2 -2
  65. package/dist/{translator-D88BbpXZ.js → translator-Ec9Uj32C.js} +1 -1
  66. package/dist/{use-chat-composer-beyfZPBD.js → use-chat-composer-BEs82Xar.js} +12 -12
  67. package/dist/{use-heading-spy-BN0yeBod.js → use-heading-spy-BRAPVvfh.js} +1 -1
  68. package/dist/{use-material-translation-Cqcwkuur.js → use-material-translation-B0RHv3l7.js} +2 -2
  69. package/docs/components/data-display.md +44 -2
  70. package/docs/components/data-table-filter-and-lists.md +107 -0
  71. package/docs/components/overlays-and-menus.md +16 -3
  72. package/docs/previews/data-display-zonedtime.webp +0 -0
  73. package/docs/previews/data-table-filter-lists-rowmenu.webp +0 -0
  74. package/docs/troubleshooting.md +21 -1
  75. package/package.json +2 -2
  76. package/dist/lib/components/ui/display/change-history/zoned.d.ts +0 -12
@@ -1,3 +1,3 @@
1
- import { t as e } from "./public-BeM7-x-m.js";
1
+ import { t as e } from "./public-Cvwb2tds.js";
2
2
  import { configurePdfReader as t } from "@nxgt/material-core/pdf-reader";
3
3
  export { e as PdfReader, t as configurePdfReader };
package/dist/print.js CHANGED
@@ -1,5 +1,5 @@
1
- import { r as e } from "./i18n-provider-BfyDgd2o.js";
2
- import { t } from "./translate-material-BneuBHXZ.js";
1
+ import { r as e } from "./i18n-provider-BBhhsa4I.js";
2
+ import { t } from "./translate-material-BEQGLLY7.js";
3
3
  import { Children as n, createContext as r, isValidElement as i, useCallback as a, useContext as o, useEffect as s, useMemo as c, useState as l } from "react";
4
4
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
5
  import { resolvePdfFileName as f } from "@nxgt/material-core/pdf-file-name";
@@ -6,18 +6,18 @@ import { c as i, i as a, l as o, n as s, o as c, s as l } from "./dist-lmHmz_bu.
6
6
  import { a as u, o as d } from "./tooltip-CkttDIab.js";
7
7
  import { i as f } from "./dist-C4wtXCjf.js";
8
8
  import { r as p, t as m } from "./in-dialog-Vwkyp-M5.js";
9
- import { C as h, D as g, E as _, O as v, S as y, T as b, _ as x, f as S, g as ee, k as te, r as ne, t as C, u as re, w } from "./dialog-LtXwv6N3.js";
10
- import { c as T, d as ie, f as E, i as ae, l as oe, n as se, o as D, t as ce, u as O } from "./dropdown-menu-ppMPD12c.js";
11
- import { S as le, a as k, d as A, g as ue, h as de, i as fe, m as pe, n as j, r as me, t as M, u as he, w as ge } from "./toolbar-items-C1GdN9P9.js";
12
- import { t as N } from "./use-material-translation-Cqcwkuur.js";
13
- import { t as _e } from "./button-BjIg_Lz6.js";
9
+ import { C as h, D as g, E as _, O as v, S as y, T as b, _ as x, f as S, g as ee, k as te, r as ne, t as C, u as re, w } from "./dialog-Cp7bS5LI.js";
10
+ import { c as T, d as ie, f as E, i as ae, l as oe, n as se, o as D, t as ce, u as O } from "./dropdown-menu-DJNMcPZa.js";
11
+ import { S as le, a as k, d as A, g as ue, h as de, i as fe, m as pe, n as j, r as me, t as M, u as he, w as ge } from "./toolbar-items-GIaifZbx.js";
12
+ import { t as N } from "./use-material-translation-B0RHv3l7.js";
13
+ import { t as _e } from "./button-B47lM8a5.js";
14
14
  import { n as ve, t as ye } from "./icon-button-ifTpXt0A.js";
15
15
  import { t as be } from "./useEvent-2fKq-6w8.js";
16
16
  import { n as xe, t as Se } from "./toggle-group-BMJNcFAC.js";
17
17
  import { o as Ce } from "./escape-owner-C4W_sOAU.js";
18
18
  import { n as we } from "./use-slice-reducer-BGkeGtML.js";
19
19
  import { r as Te } from "./use-csp-nonce-ZKs9k-ov.js";
20
- import { n as Ee, t as De } from "./empty-state-X_nikpBS.js";
20
+ import { n as Ee, t as De } from "./empty-state-Dv9AtrMw.js";
21
21
  import { t as Oe } from "./client-only.utils-3nHNzCki.js";
22
22
  import { t as ke } from "./use-scroll-away-PQRFZkT2.js";
23
23
  import { ArrowLeft as Ae, BookOpenText as je, ChevronDown as Me, ChevronLeft as Ne, ChevronRight as Pe, ChevronUp as Fe, Download as Ie, Eraser as Le, FileText as Re, FileWarning as ze, FileX2 as Be, Highlighter as Ve, KeyRound as He, LayoutGrid as Ue, List as We, Loader2 as Ge, Maximize as Ke, MessageSquareText as qe, Minimize as Je, MoreVertical as Ye, MousePointer2 as Xe, MoveHorizontal as Ze, PanelLeft as Qe, Pen as $e, PencilLine as et, Printer as tt, RotateCw as nt, Search as rt, StickyNote as it, Type as at, Underline as ot, Undo2 as st, Volume2 as ct, X as lt, XIcon as ut, ZoomIn as dt, ZoomOut as ft } from "lucide-react";
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./tooltip-CkttDIab.js";
2
- import { c as t, n, t as r } from "./dropdown-menu-ppMPD12c.js";
3
- import { t as i } from "./use-material-translation-Cqcwkuur.js";
4
- import { a, i as o, n as s, o as c, t as l } from "./code-language-items-C_UeMQMm.js";
2
+ import { c as t, n, t as r } from "./dropdown-menu-DJNMcPZa.js";
3
+ import { t as i } from "./use-material-translation-B0RHv3l7.js";
4
+ import { a, i as o, n as s, o as c, t as l } from "./code-language-items-COd99vab.js";
5
5
  import { i as u, n as d, r as f, s as p } from "./dist-C3GR7kJd.js";
6
6
  import { t as m } from "./code-block-spec-CGLKRhwD.js";
7
7
  import { Check as h, ChevronDown as g, Copy as _, Maximize2 as v, WrapText as y } from "lucide-react";
@@ -143,7 +143,7 @@ function M({ node: e, editor: t, updateAttributes: n, editable: r, wrap: a, onWr
143
143
  }
144
144
  //#endregion
145
145
  //#region lib/components/ui/widgets/editor/extensions/code/code-block-open.tsx
146
- var N = x(() => import("./code-editor-2EU-q9FV.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
146
+ var N = x(() => import("./code-editor-BLLpzmCc.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
147
147
  function P() {
148
148
  let { t: e } = i();
149
149
  return /* @__PURE__ */ T("div", {
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./dist-DVRQkaTK.js";
3
- import { t as n } from "./use-material-translation-Cqcwkuur.js";
3
+ import { t as n } from "./use-material-translation-B0RHv3l7.js";
4
4
  import { t as r } from "./icon-button-ifTpXt0A.js";
5
5
  import { t as i } from "./compose-refs-DZ0iIVF-.js";
6
6
  import { GripVertical as a } from "lucide-react";
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { o as t } from "./tooltip-CkttDIab.js";
3
- import { t as n } from "./use-material-translation-Cqcwkuur.js";
3
+ import { t as n } from "./use-material-translation-B0RHv3l7.js";
4
4
  import { jsx as r } from "react/jsx-runtime";
5
5
  //#region lib/components/ui/feedback/spinner/spinner.tsx
6
6
  var i = t("transition-all duration-500", {
@@ -2663,6 +2663,10 @@ var t = {
2663
2663
  recent: "Recent",
2664
2664
  manage: "Manage…",
2665
2665
  choose: "Choose"
2666
+ },
2667
+ "row-menu": {
2668
+ label: "Actions for {name}",
2669
+ column: "Actions"
2666
2670
  }
2667
2671
  } },
2668
2672
  fr: { material: {
@@ -5326,6 +5330,10 @@ var t = {
5326
5330
  recent: "Récents",
5327
5331
  manage: "Gérer…",
5328
5332
  choose: "Choisir"
5333
+ },
5334
+ "row-menu": {
5335
+ label: "Actions pour {name}",
5336
+ column: "Actions"
5329
5337
  }
5330
5338
  } }
5331
5339
  }, n = "language", r = "en", i = Object.keys(t);
@@ -1,10 +1,10 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { a as t, i as n, n as r, o as i, r as a, t as o } from "./bubble-input-B7BVd9fX.js";
3
- import { t as s } from "./use-material-translation-Cqcwkuur.js";
3
+ import { t as s } from "./use-material-translation-B0RHv3l7.js";
4
4
  import { a as c, r as l } from "./icon-sprites-CaYXzOL4.js";
5
5
  import { t as u } from "./use-theme-DMcyJ52N.js";
6
6
  import { a as d, r as f } from "./theme-context-Cofk6vgs.js";
7
- import { t as p } from "./theme-toggle-GlKtdgYz.js";
7
+ import { t as p } from "./theme-toggle-CPzxOW_X.js";
8
8
  import { n as m, t as h } from "./nxgt-theme-ZS945iMP.js";
9
9
  import { Check as g } from "lucide-react";
10
10
  import { useContext as _ } from "react";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./use-material-translation-Cqcwkuur.js";
1
+ import { t as e } from "./use-material-translation-B0RHv3l7.js";
2
2
  import { i as t } from "./theme-store-CSl51uNH.js";
3
3
  import { n, t as r } from "./use-theme-DMcyJ52N.js";
4
4
  import { r as i } from "./theme-context-Cofk6vgs.js";
@@ -4,9 +4,9 @@ import { a as i, c as a, i as o, l as s, r as c, s as l } from "./dist-lmHmz_bu.
4
4
  import { b as u, c as d, d as f, f as p, l as m, t as h, u as g, x as _ } from "./tooltip-CkttDIab.js";
5
5
  import { i as v, n as y, r as b, t as x } from "./dist-C4wtXCjf.js";
6
6
  import { a as S, c as C, l as w, o as T, r as ee, s as te, t as E } from "./in-dialog-Vwkyp-M5.js";
7
- import { A as ne, M as re, N as ie, b as ae, d as oe, f as se, i as ce, j as le, l as ue, n as de, o as fe, r as pe, t as me, u as he, y as ge } from "./dropdown-menu-ppMPD12c.js";
7
+ import { A as ne, M as re, N as ie, b as ae, d as oe, f as se, i as ce, j as le, l as ue, n as de, o as fe, r as pe, t as me, u as he, y as ge } from "./dropdown-menu-DJNMcPZa.js";
8
8
  import { a as _e, n as ve, r as ye, t as be } from "./dist-B7RjY7SL.js";
9
- import { t as xe } from "./use-material-translation-Cqcwkuur.js";
9
+ import { t as xe } from "./use-material-translation-B0RHv3l7.js";
10
10
  import { t as Se } from "./warn-once-C_e47JM8.js";
11
11
  import { o as Ce } from "./escape-owner-C4W_sOAU.js";
12
12
  import { ChevronLeft as we, ChevronRightIcon as Te, MoreVertical as Ee } from "lucide-react";
@@ -1,5 +1,5 @@
1
- import "./stored-language-DoWMr969.js";
2
- import { a as e, r as t } from "./translator-D88BbpXZ.js";
1
+ import "./stored-language-CkPRWAaM.js";
2
+ import { a as e, r as t } from "./translator-Ec9Uj32C.js";
3
3
  //#region lib/i18n/translate-material.ts
4
4
  function n(n, r, i, a) {
5
5
  if (n) for (let e of /* @__PURE__ */ new Set([n, n.split("-")[0]])) {
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./is-production-GLw59WU8.js";
2
- import { a as t, i as n, r, t as i } from "./stored-language-DoWMr969.js";
2
+ import { a as t, i as n, r, t as i } from "./stored-language-CkPRWAaM.js";
3
3
  import { t as a } from "./get-CTzJAwfc.js";
4
4
  //#region ../../node_modules/@formatjs/fast-memoize/index.js
5
5
  function o(e, t) {
@@ -7,21 +7,21 @@ import { a as o, c as s, i as c, l, n as u, o as d, r as f, s as p, t as m } fro
7
7
  import { _ as h, a as g, g as _, h as v, m as y, o as b, p as x, t as S, v as C, y as w } from "./tooltip-CkttDIab.js";
8
8
  import { a as T, i as E, n as D, r as O, t as k } from "./dist-C4wtXCjf.js";
9
9
  import { i as A, n as ee, t as j } from "./in-dialog-Vwkyp-M5.js";
10
- import { A as M, C as N, D as te, E as ne, O as P, S as re, T as ie, _ as F, b as ae, f as oe, g as se, k as I, l as ce, m as le, n as ue, o as de, r as fe, s as pe, t as me, u as he, v as ge, w as _e, x as ve, y as ye } from "./dialog-LtXwv6N3.js";
10
+ import { A as M, C as N, D as te, E as ne, O as P, S as re, T as ie, _ as F, b as ae, f as oe, g as se, k as I, l as ce, m as le, n as ue, o as de, r as fe, s as pe, t as me, u as he, v as ge, w as _e, x as ve, y as ye } from "./dialog-Cp7bS5LI.js";
11
11
  import { A as be, C as xe, D as Se, E as Ce, O as we, S as Te, T as Ee, _ as De, a as Oe, b as ke, d as Ae, f as je, g as Me, h as Ne, i as Pe, k as Fe, l as Ie, m as Le, n as Re, o as ze, p as Be, r as Ve, s as He, t as Ue, u as We, v as Ge, w as Ke, x as qe, y as Je } from "./floating-ui.dom-KkZSW8_E.js";
12
- import { D as Ye, E as Xe, N as Ze, O as Qe, c as $e, d as et, f as tt, i as nt, k as rt, m as it, n as at, o as ot, p as st, t as ct, u as lt } from "./dropdown-menu-ppMPD12c.js";
12
+ import { D as Ye, E as Xe, N as Ze, O as Qe, c as $e, d as et, f as tt, i as nt, k as rt, m as it, n as at, o as ot, p as st, t as ct, u as lt } from "./dropdown-menu-DJNMcPZa.js";
13
13
  import { a as ut, i as dt, n as ft } from "./field-blur-context-Cft9s7Hg.js";
14
- import { C as pt, S as mt, a as ht, c as gt, d as _t, l as vt, n as yt, o as bt, s as xt, u as St } from "./toolbar-items-C1GdN9P9.js";
14
+ import { C as pt, S as mt, a as ht, c as gt, d as _t, l as vt, n as yt, o as bt, s as xt, u as St } from "./toolbar-items-GIaifZbx.js";
15
15
  import { a as Ct, i as wt, n as Tt, o as Et, t as Dt } from "./bubble-input-B7BVd9fX.js";
16
16
  import { i as Ot } from "./dist-B7RjY7SL.js";
17
- import "./stored-language-DoWMr969.js";
18
- import { a as kt } from "./translator-D88BbpXZ.js";
17
+ import "./stored-language-CkPRWAaM.js";
18
+ import { a as kt } from "./translator-Ec9Uj32C.js";
19
19
  import { h as At } from "./get-CTzJAwfc.js";
20
20
  import { t as jt } from "./isEmpty-F_g3jLf8.js";
21
- import { t as L } from "./use-material-translation-Cqcwkuur.js";
22
- import { t as Mt } from "./spinner-1Ia6Akhy.js";
21
+ import { t as L } from "./use-material-translation-B0RHv3l7.js";
22
+ import { t as Mt } from "./spinner-DRGPXRNW.js";
23
23
  import { a as Nt } from "./button-tones-BwuVvAmd.js";
24
- import { a as Pt, i as Ft, n as It, r as Lt, t as Rt } from "./button-BjIg_Lz6.js";
24
+ import { a as Pt, i as Ft, n as It, r as Lt, t as Rt } from "./button-B47lM8a5.js";
25
25
  import { t as R } from "./icon-button-ifTpXt0A.js";
26
26
  import { a as zt, r as Bt } from "./icon-sprites-CaYXzOL4.js";
27
27
  import { t as Vt } from "./use-ssr-media-query-C6M5m8sf.js";
@@ -35,10 +35,10 @@ import { a as tn, i as nn, o as rn } from "./escape-owner-C4W_sOAU.js";
35
35
  import { n as an } from "./use-slice-reducer-BGkeGtML.js";
36
36
  import { t as on } from "./browser-only-DQ94lWF8.js";
37
37
  import { t as sn } from "./compose-refs-DZ0iIVF-.js";
38
- import { n as cn, r as ln, t as un } from "./chip-DIBIDUZH.js";
39
- import { n as dn, t as fn } from "./icon-badge-oLBh3Mlk.js";
38
+ import { n as cn, r as ln, t as un } from "./chip-Bf80b1XT.js";
39
+ import { n as dn, t as fn } from "./icon-badge-DEk244kn.js";
40
40
  import { r as pn } from "./use-csp-nonce-ZKs9k-ov.js";
41
- import { t as mn } from "./empty-state-X_nikpBS.js";
41
+ import { t as mn } from "./empty-state-Dv9AtrMw.js";
42
42
  import { t as hn } from "./skeleton-DSdtr2qc.js";
43
43
  import { H as gn, V as _n, X as vn, bt as yn, it as bn, lt as xn, n as Sn, t as Cn, xt as wn, yt as Tn } from "./dist-moutbfbd.js";
44
44
  import { t as En } from "./markdown-Dw_uH7j7.js";
@@ -10782,7 +10782,7 @@ var CS = (e = {}) => Dn({
10782
10782
  let [{ default: t }, { lowlight: n }, { richCodeBlock: r }] = await Promise.all([
10783
10783
  import("./dist-CRMFGjng.js"),
10784
10784
  import("./lowlight-OtcjU2Sa.js"),
10785
- import("./rich-code-block-B4TIjZRA.js")
10785
+ import("./rich-code-block-MItKFVB-.js")
10786
10786
  ]);
10787
10787
  return [r(t, {
10788
10788
  lowlight: n,
@@ -1,4 +1,4 @@
1
- import { r as e } from "./i18n-provider-BfyDgd2o.js";
1
+ import { r as e } from "./i18n-provider-BBhhsa4I.js";
2
2
  import { _ as t, g as n, h as r, n as i, v as a, y as o } from "./number.utils-BG_eEt5g.js";
3
3
  import { useCallback as s, useEffect as c, useMemo as l, useRef as u } from "react";
4
4
  //#region ../../node_modules/date-fns/locale/fr/_lib/formatDistance.js
@@ -1,5 +1,5 @@
1
- import { r as e } from "./i18n-provider-BfyDgd2o.js";
2
- import { t } from "./translate-material-BneuBHXZ.js";
1
+ import { r as e } from "./i18n-provider-BBhhsa4I.js";
2
+ import { t } from "./translate-material-BEQGLLY7.js";
3
3
  import { useCallback as n } from "react";
4
4
  //#region lib/i18n/use-material-translation.ts
5
5
  function r() {
@@ -9,7 +9,7 @@ from `@nxgt/material/components`.
9
9
  | <img src="../previews/data-display-avatar.webp" width="96" alt=""> | [Avatar](#avatar) | Image with a fallback and an optional online / offline dot |
10
10
  | <img src="../previews/data-display-avatargroup.webp" width="96" alt=""> | [AvatarGroup](#avatargroup) | Overlapping avatars with a `+N` overflow |
11
11
  | <img src="../previews/data-display-shape.webp" width="96" alt=""> | [Shape](#shape) | Material 3 Expressive's shapes as a backdrop, an icon container or a mask for a photo |
12
- | <img src="../previews/data-display-badge.webp" width="96" alt=""> | [Badge](#badge) | Status pill, 20 px, in seven tones, soft or outlined |
12
+ | <img src="../previews/data-display-badge.webp" width="96" alt=""> | [Badge](#badge) | Status pill, 20 px, in seven tones, soft or outlined, with an optional decorative `icon` before the words |
13
13
  | <img src="../previews/data-display-countbadge.webp" width="96" alt=""> | [CountBadge](#countbadge) | Count in the corner of its children |
14
14
  | <img src="../previews/data-display-dayseparator.webp" width="96" alt=""> | [DaySeparator](#dayseparator) | "Today", "Yesterday" or the date between two hairlines |
15
15
  | <img src="../previews/data-display-periodcards.webp" width="96" alt=""> | [PeriodCards](#periodcards) | Consecutive date ranges (terms, sprints) as cards, with a current marker and an optional link per card |
@@ -26,6 +26,7 @@ from `@nxgt/material/components`.
26
26
  | <img src="../previews/data-display-accordioncard.webp" width="96" alt=""> | [AccordionCard](#accordioncard) | Accordion rendered from `items` |
27
27
  | <img src="../previews/data-display-timeline.webp" width="96" alt=""> | [Timeline](#timeline) | Vertical event timeline with relative times |
28
28
  | <img src="../previews/data-display-changehistory.webp" width="96" alt=""> | [ChangeHistory](#changehistory) | History of the changes made to anything, as a rail or as cards |
29
+ | <img src="../previews/data-display-zonedtime.webp" width="96" alt=""> | [ZonedTime](#zonedtime) | A moment written in a given time zone, identical on the server and the client |
29
30
  | <img src="../previews/data-display-eventchip.webp" width="96" alt=""> | [EventChip](#eventchip) | Calendar event pill, soft, solid or outlined |
30
31
  | <img src="../previews/data-display-codeblock.webp" width="96" alt=""> | [CodeBlock](#codeblock) | Code, JSON tree and tabbed samples |
31
32
  | <img src="../previews/data-display-markdown.webp" width="96" alt=""> | [Markdown](#markdown) | GFM with math and mermaid |
@@ -226,17 +227,21 @@ import { Badge } from '@nxgt/material/components';
226
227
  <Badge variant="soft" tone="success">Paid</Badge>
227
228
  <Badge variant="outlined" tone="error">Late</Badge>
228
229
  <Badge variant="success">New</Badge>
230
+ <Badge variant="soft" tone="warning" icon="box-archive">Archived</Badge>
229
231
  ```
230
232
 
233
+ With an `icon`, a status reads as icon plus words, so colour is never the only signal. The icon is decorative (`aria-hidden`: the words name the status), 12 px, and takes the tone's text colour in `soft` and `outlined`; nothing changes without it.
234
+
231
235
  | Prop | Type | Default | Effect |
232
236
  | --- | --- | --- | --- |
237
+ | `icon` | `IconName \| ReactNode` | — | a decorative icon before the label: a string is a Font Awesome name (drawn solid), a node is rendered as given. Ignored with `asChild` |
233
238
  | `variant` | `'default' \| 'secondary' \| 'error' \| 'success' \| 'info' \| 'warning' \| 'soft' \| 'outlined'` | `'default'` | the filled tones, `soft` (recommended for a state) or `outlined` |
234
239
  | `tone` | the eight named tones, or a tone of your own declared in `AppTones` | `'neutral'` | the colour of a `soft` or `outlined` badge; ignored by the filled variants |
235
240
  | `asChild` | `boolean` | `false` | renders its child (a link) with the badge styles |
236
241
 
237
242
  A `Badge` link (`asChild`) no longer fades on hover: a badge is a status, not a button. Put a `Chip` or a `Button` where the user acts.
238
243
 
239
- **Storybook:** `Data display/Badge` (Soft, SoftContrast) · **Vue:** `Badge` (without `soft` and `tone` yet)
244
+ **Storybook:** `Data display/Badge` (Soft, SoftContrast), `Data display/Badge/Icon` · **Vue:** `Badge` (without `soft` and `tone` yet)
240
245
 
241
246
  ---
242
247
 
@@ -1083,6 +1088,43 @@ and the user's zone) and both sides agree:
1083
1088
 
1084
1089
  ---
1085
1090
 
1091
+ ## ZonedTime
1092
+
1093
+ ![ZonedTime](../previews/data-display-zonedtime.webp)
1094
+
1095
+ A moment written in a time zone you name, with the zone: `Mar 12, 2026, 4:04 PM UTC+1`
1096
+ inside a `<time dateTime>`. It prints the same on the server and in the browser,
1097
+ so there is no hydration warning to suppress: the zone is passed in (the
1098
+ component never reads the machine's), the date and the time are formatted
1099
+ separately and joined with a comma, and the zone is a computed offset (`UTC+2`,
1100
+ `UTC+5:30`, `UTC`), never a name that depends on the runtime's ICU data. The
1101
+ language is the provider's: `12 mars 2026, 16:04 UTC+1` in French.
1102
+
1103
+ ```tsx
1104
+ import { ZonedTime } from '@nxgt/material/components';
1105
+
1106
+ <ZonedTime at="2026-03-12T15:04:05Z" timeZone="Europe/Paris" />
1107
+ // Mar 12, 2026, 4:04 PM UTC+1
1108
+ <ZonedTime at={event.startsAt} timeZone={school.timeZone} seconds zoneLabel="none" />
1109
+ ```
1110
+
1111
+ | Prop | Type | Default | Effect |
1112
+ | --- | --- | --- | --- |
1113
+ | `at` | `Date \| string \| number` | — | the instant; an invalid one renders nothing |
1114
+ | `timeZone` | `string` | — | the IANA zone it is written in. One `Intl` does not know is written as `UTC`, not as the machine's zone |
1115
+ | `seconds` | `boolean` | `false` | writes the seconds (`4:04:05 PM`); lists read at a glance without |
1116
+ | `dateStyle` | `'short' \| 'medium' \| 'long'` | `'medium'` | `03/12/2026`, `Mar 12, 2026`, `March 12th, 2026` (the language's patterns) |
1117
+ | `zoneLabel` | `'offset' \| 'none'` | `'offset'` | the offset after the time, or nothing for a column whose header names the zone. A zone's short name (`CEST`) is not offered: it differs between ICU builds |
1118
+ | `className` | `string` | — | on the `<time>` |
1119
+
1120
+ The offset follows the instant (`Europe/Paris` is `UTC+1` in winter and
1121
+ `UTC+2` in summer). `ChangeHistory` takes a `timeZone` and `RelativeTime` a `now`
1122
+ the same way; pass the app's zone from the server so every screen agrees.
1123
+
1124
+ **Storybook:** `Data display/ZonedTime` · **Vue:** not yet (tracked as a `vue` issue)
1125
+
1126
+ ---
1127
+
1086
1128
  ## EventChip
1087
1129
 
1088
1130
  ![EventChip](../previews/data-display-eventchip.webp)
@@ -15,6 +15,7 @@ either can be used alone.
15
15
  | --- | --- | --- |
16
16
  | <img src="../previews/data-table-filter-lists-datatable.webp" width="96" alt=""> | [DataTable](#datatable) | TanStack Table v9 with sorting, selection, expansion and pagination, client-side or one server page at a time |
17
17
  | <img src="../previews/data-table-filter-lists-servertable.webp" width="96" alt=""> | [ServerTable](#servertable) | A server-mode `DataTable` driven by the URL, with the Filter in its top band (a title and a description, or neither): sort, cursor paging, the empty page with a scene, an action and removable chips, one count announced |
18
+ | <img src="../previews/data-table-filter-lists-rowmenu.webp" width="96" alt=""> | [RowMenu](#rowmenu) | A row's "..." button named after its row ("Actions for Ada"), its menu aligned to the end with the destructive item last, and `rowMenuColumn` to drop both in a table |
18
19
  | <img src="../previews/data-table-filter-lists-listempty.webp" width="96" alt=""> | [ListEmpty](#listempty) | A list's empty page: nothing yet, with a scene and an action, or nothing matches and the way out |
19
20
  | <img src="../previews/data-table-filter-lists-datagrid.webp" width="96" alt=""> | [DataGrid](#datagrid) | An editable grid: spreadsheet keys, paste, a fill handle with series, undo, totals, saving with versions and conflicts (lazy ones fetch theirs on "Keep mine"), `onRefuse` for a refused paste or fill, row selection (`enableRowSelection`), and resizable, hideable and reorderable columns (`columnControls`, `columnLayout`, `DataGridColumnsMenu`) |
20
21
  | <img src="../previews/data-table-filter-lists-daygroupedlist.webp" width="96" alt=""> | [DayGroupedList](#daygroupedlist) | A list split by day under sticky Today / Yesterday / Earlier headings |
@@ -955,6 +956,70 @@ page's `title`.
955
956
 
956
957
  ---
957
958
 
959
+ ## RowMenu
960
+
961
+ ![RowMenu](../previews/data-table-filter-lists-rowmenu.webp)
962
+
963
+ The actions of a row: a ghost "..." button and a menu aligned to its end. The
964
+ button is named after its row ("Actions for Ada Lovelace", the template is
965
+ `material.row-menu.label`), so a screen reader does not hear a bare "Actions"
966
+ on every row. It is 44px on a coarse pointer (and below `md`) and 36px with a
967
+ fine pointer from `md` up; the menu's items are 44px high on a coarse pointer,
968
+ and the destructive ones come last, after a separator.
969
+
970
+ ```tsx
971
+ import { DataTable, rowMenuColumn } from '@nxgt/material/components';
972
+
973
+ const columns = [
974
+ /* …your columns… */
975
+ rowMenuColumn<Person>({
976
+ label: (person) => person.name,
977
+ items: (person) => [
978
+ { label: 'Edit', onSelect: () => edit(person) },
979
+ { label: 'Delete…', destructive: true, onSelect: () => setRemoving(person) },
980
+ ],
981
+ }),
982
+ ];
983
+
984
+ <DataTable columns={columns} data={people} />
985
+ ```
986
+
987
+ `rowMenuColumn` returns a column for `DataTable` and `ServerTable`: a header
988
+ that is visually hidden but named "Actions" (`material.row-menu.column`), a cell
989
+ per row, no sorting and no hiding. Build the columns once (outside the render,
990
+ or in a `useMemo`), and keep a dialog's state in the page, not in the cell: a
991
+ cell that remounts would lose it.
992
+
993
+ For a menu of your own, compose the parts: `RowMenuTrigger` forwards its props
994
+ and `ref`, so it is the child of a `DropdownMenuTrigger asChild`.
995
+
996
+ ```tsx
997
+ <DropdownMenu>
998
+ <DropdownMenuTrigger asChild>
999
+ <RowMenuTrigger label={person.name} />
1000
+ </DropdownMenuTrigger>
1001
+ <DropdownMenuContent align="end">{/* items */}</DropdownMenuContent>
1002
+ </DropdownMenu>
1003
+ ```
1004
+
1005
+ | Prop | Type | Default | Effect |
1006
+ | --- | --- | --- | --- |
1007
+ | `label` (`RowMenu`, `RowMenuTrigger`) | `string` | — | the row's name; the button's name is "Actions for {label}" (translated). An `aria-label` of your own wins |
1008
+ | `items` (`RowMenu`) | `{ label, icon?, onSelect?, disabled?, destructive?, id? }[]` | `[]` | the actions; `destructive` ones are drawn in the error colour and moved last, after a separator |
1009
+ | `children` (`RowMenu`) | `ReactNode` | — | menu content of your own, above `items` (put a destructive item last yourself) |
1010
+ | `triggerProps` (`RowMenu`) | button props | — | `disabled`, `className`, `data-*` on the button |
1011
+ | `open`, `onOpenChange` (`RowMenu`) | as `DropdownMenu` | — | controlled state |
1012
+ | `label`, `items`, `menu` (`rowMenuColumn`) | `(row) => string` / `(row) => RowMenuItem[]` / `(row) => ReactNode` | — | the row's name, its actions as data, or its menu content as nodes |
1013
+ | `id`, `className` (`rowMenuColumn`) | `string` | `'actions'`, `'w-12'` | the column's id and its cell classes |
1014
+
1015
+ Focus returns to the button when the menu closes, and when a dialog opened from
1016
+ an item (a `ConfirmDialog`, a `Dialog`, a `Sheet`) closes: the item is gone by
1017
+ then, so the dialog hands the focus back to the menu's button.
1018
+
1019
+ **Storybook:** `Data table, filter & lists/RowMenu`, `Guides/Accessibility/Touch targets/Row menu` · **Vue:** not yet (tracked as a `vue` issue)
1020
+
1021
+ ---
1022
+
958
1023
  ## ListEmpty
959
1024
 
960
1025
  ![ListEmpty](../previews/data-table-filter-lists-listempty.webp)
@@ -1570,6 +1635,48 @@ one. The page clears it when the condition changes, by passing no error. The
1570
1635
  words are `material.filter.error.*`; `fieldErrors(errors, model, locked)` in
1571
1636
  the core lists what the bar shows.
1572
1637
 
1638
+ #### A refused search, and a refusal of no field
1639
+
1640
+ `errors` is keyed by field id, so it cannot name the search box nor carry a
1641
+ refusal that belongs to no field. Two more props, on the same three surfaces
1642
+ (`Filter`, `FilterBar` and `ServerTable`'s `filter`), take them:
1643
+
1644
+ ```tsx
1645
+ <FilterBar
1646
+ model={model}
1647
+ params={params}
1648
+ onParamsChange={setParams}
1649
+ searchError="Not a valid item."
1650
+ formError="The list could not be filtered right now."
1651
+ />
1652
+ ```
1653
+
1654
+ - **`searchError`** (a node) is the refusal of the typed search. The search
1655
+ box takes the error tone and shows an icon, "Invalid." and the message under
1656
+ it; the input is `aria-invalid` and `aria-describedby` points at the message.
1657
+ Nothing for a model with `search: false`.
1658
+ - **`formError`** (a node) is a refusal that belongs to no field: one error
1659
+ `Alert` under the bar, in place (under the bar's row in `FilterBar`, between
1660
+ the band and the chips in `ServerTable`, under the search in the facets
1661
+ panel). It is no live region of its own.
1662
+
1663
+ Both are told by the bar's one polite live region, the same refusal path as a
1664
+ field's, once and after the count: "Search: Not a valid item." and the
1665
+ `formError`'s text (a node is read as its text). The page drops them when the
1666
+ search or the query changes, by passing nothing, as it does for `errors`.
1667
+
1668
+ When the loader answers one flat record, `splitFilterErrors(refusal, model)`
1669
+ from `@nxgt/material-core/filter` splits it: the key equal to the model's
1670
+ search param becomes `searchError`, the key `FILTER_FORM_ERROR_KEY`
1671
+ (`'$form'`, never a field id) becomes `formError`, and the rest stays in
1672
+ `errors`. Messages are trimmed and an empty one is dropped:
1673
+
1674
+ ```tsx
1675
+ // the loader answered { item: 'Not a valid item.', $form: 'Try again later.', period: 'Too long.' }
1676
+ <FilterBar model={model} params={params} onParamsChange={setParams}
1677
+ {...splitFilterErrors(data.fieldErrors, model)} />
1678
+ ```
1679
+
1573
1680
  #### A list without a search box
1574
1681
 
1575
1682
  `defineFilterModel({ search: false, fields })` declares a list with no text
@@ -42,7 +42,7 @@ item that is both chosen and highlighted gets an 18 % tint and the bar. `SelectF
42
42
  | <img src="../previews/overlays-menus-dropdownmenu.webp" width="96" alt=""> | [DropdownMenu](#dropdownmenu) | Menu with checkbox and radio items, submenus and shortcuts |
43
43
  | <img src="../previews/overlays-menus-contextmenu.webp" width="96" alt=""> | [ContextMenu](#contextmenu) | Right-click menu |
44
44
  | <img src="../previews/overlays-menus-menubar.webp" width="96" alt=""> | [Menubar](#menubar) | Desktop-style menubar |
45
- | <img src="../previews/overlays-menus-command.webp" width="96" alt=""> | [Command](#command) | Command palette, inline or in a modal |
45
+ | <img src="../previews/overlays-menus-command.webp" width="96" alt=""> | [Command](#command) | Command palette, inline or in a modal; `commandProps` for server results |
46
46
 
47
47
  ## Dialog
48
48
 
@@ -679,9 +679,22 @@ children and they replace that, as before.
679
679
  | `shouldFilter` (`Command`) | `boolean` | `true` | `false` when you filter the items yourself (server search) |
680
680
  | `title` / `description` (`CommandDialog`) | `string` | `"Command Palette"` / `"Search for a command to run..."` (translated) | the dialog's title and description, inside the dialog and visually hidden |
681
681
  | `mobilePresentation` (`CommandDialog`) | `'dialog' \| 'top' \| 'fullscreen'` | `'top'` | below 640 px: pinned under the top edge (so the input and the results stay above the on-screen keyboard), the whole screen, or the centred modal it was before |
682
- | `open`, `onOpenChange` (`CommandDialog`) | as `Dialog` | — | `CommandDialog` takes every `Dialog` prop |
682
+ | `commandProps` (`CommandDialog`) | `Pick<CommandProps, 'shouldFilter' \| 'value' \| 'onValueChange' \| 'loop' \| 'filter' \| 'label'>` | — | reaches the inner `Command`: `{ shouldFilter: false }` for a palette whose results come from a server (cmdk then does not hide them again by the typed text), `value` / `onValueChange` for the highlighted item, `label` for the input's accessible name. The input's sizing, the dialog's title and its focus stay as they are |
683
+ | `open`, `onOpenChange` (`CommandDialog`) | as `Dialog` | — | every other prop goes to the `Dialog` |
683
684
 
684
685
  `CommandDialog` does not bind a keyboard shortcut; listen for ⌘K yourself and
685
686
  set `open`.
686
687
 
687
- **Storybook:** `Overlays & menus/Command` · **Vue:** `Command`, `CommandDialog` (same parts)
688
+ ```tsx
689
+ // A server-driven search: the server already filtered, cmdk must not again.
690
+ <CommandDialog open={open} onOpenChange={setOpen} commandProps={{ shouldFilter: false }}>
691
+ <CommandInput value={query} onValueChange={setQuery} />
692
+ <CommandList>
693
+ {results.map((r) => (
694
+ <CommandItem key={r.id} value={r.id}>{r.label}</CommandItem>
695
+ ))}
696
+ </CommandList>
697
+ </CommandDialog>
698
+ ```
699
+
700
+ **Storybook:** `Overlays & menus/Command`, `Overlays & menus/Command/Server results` · **Vue:** `Command`, `CommandDialog` (same parts)
@@ -2538,6 +2538,25 @@ the field out of `locked`. `fieldErrors(errors, model, locked)` from
2538
2538
  <ServerTable filter={{ model, locked, errors: { period: 'The period cannot exceed 366 days.' } }} {...table} />
2539
2539
  ```
2540
2540
 
2541
+ ### A refused search or a refusal of no field shows nothing
2542
+
2543
+ **When:** the server refuses the typed search, or refuses with a message that
2544
+ names no field, and the page passes it as `errors={{ item: 'Not a valid item' }}`
2545
+ (the search param as a key) or `errors={{ form: '…' }}`: the search box looks
2546
+ normal and no Alert shows. Nothing is printed.
2547
+ **Why:** `errors` only reads field ids. The search box and a refusal of no field
2548
+ have their own props, `searchError` and `formError`.
2549
+ **Fix:** pass them as props, or split one flat record with `splitFilterErrors`
2550
+ from `@nxgt/material-core/filter` (the key equal to `model.search.param` is the
2551
+ search, `'$form'` is the form). A model with `search: false` shows no
2552
+ `searchError`, and an empty message shows nothing. The page must drop them when
2553
+ the search changes:
2554
+
2555
+ ```tsx
2556
+ <FilterBar model={model} params={params} onParamsChange={setParams}
2557
+ {...splitFilterErrors({ item: 'Not a valid item.', $form: 'Try again later.' }, model)} />
2558
+ ```
2559
+
2541
2560
  ### `@nxgt/material-core/filter: unknown time zone "…", using the runtime's`
2542
2561
 
2543
2562
  **When:** in the console, once, when a date preset (`this-month`) is matched or
@@ -2566,7 +2585,8 @@ const conditions = resolveDateConditions(effectiveConditions(query, model, locke
2566
2585
  neither, it has nothing to offer. The functions live in `fieldProps`, never in
2567
2586
  the model, so the loader can share it.
2568
2587
  **Fix:** give the field `options`, or a `search` (and `resolveLabels`, for the
2569
- ids a link brings) by field id:
2588
+ ids a link brings) by field id. A field only a link sets (`addable: false`)
2589
+ is never offered for picking and needs neither, so it raises no warning:
2570
2590
 
2571
2591
  ```tsx
2572
2592
  const fieldProps: FilterFieldProps = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxgt/material",
3
- "version": "3.28.0",
3
+ "version": "3.30.0",
4
4
  "license": "MIT",
5
5
  "bugs": {
6
6
  "email": "stevegires@gmail.com"
@@ -362,7 +362,7 @@
362
362
  "docs:previews": "rm -rf node_modules/.cache/nxgt-preview-free/missing && NXGT_PREVIEW_FREE=1 vitest run --project previews && bun .storybook/preview-free-report.ts"
363
363
  },
364
364
  "dependencies": {
365
- "@nxgt/material-core": "^0.36.0",
365
+ "@nxgt/material-core": "^0.37.0",
366
366
  "@base-ui/react": "^1.6.0",
367
367
  "@dnd-kit/core": "^6.3.1",
368
368
  "@dnd-kit/sortable": "^10.0.0",
@@ -1,12 +0,0 @@
1
- import { DayInput } from '@nxgt/material-core/day-math';
2
- /**
3
- * The wall clock of an instant in `timeZone`, as a `Date` whose local
4
- * getters read it: `wallClock('2026-08-02T23:30:00Z', 'Asia/Tokyo')` is
5
- * August 3rd, 08:30 whatever zone the machine runs in. The day maths
6
- * (`daysAgo`, `localIsoDay`, `formatDayLabel`) then work on it unchanged, so
7
- * a server and a browser group and label the same way. Without a
8
- * `timeZone` (or with one `Intl` does not know), the instant itself.
9
- */
10
- export declare function wallClock(value: DayInput, timeZone?: string): Date;
11
- /** The wall clock as an offset-less ISO string, which date-fns reads as local: `2026-08-03T08:30:00`. */
12
- export declare function wallIso(value: DayInput, timeZone?: string): string;