@nxgt/material 3.64.0 → 3.65.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 (70) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/{alert-dialog-RHm6WtQj.js → alert-dialog-C0nGUSCP.js} +1 -1
  3. package/dist/{async-slice-DmX59NyA.js → async-slice-CyansBvD.js} +1 -1
  4. package/dist/{button-DfS_amfQ.js → button-D5k3K-gM.js} +1 -1
  5. package/dist/charts.js +818 -807
  6. package/dist/{chip-Cbndukko.js → chip-lWXIJkqo.js} +2 -2
  7. package/dist/{code-editor-B0tN8Ha_.js → code-editor-aXG4CdY-.js} +403 -393
  8. package/dist/code-editor.js +5 -5
  9. package/dist/{code-language-items-andgHKrM.js → code-language-items-CsaXyApg.js} +2 -2
  10. package/dist/components/ui/display/chip/chip-soft.css +19 -5
  11. package/dist/{components-2kTVPsMg.js → components-DNcTvjlv.js} +9685 -9674
  12. package/dist/components.js +21 -21
  13. package/dist/{dialog-Bd7Hid2L.js → dialog-DWNaxpa-.js} +4 -4
  14. package/dist/dnd.js +1 -1
  15. package/dist/{dropdown-menu-_SyVmSuy.js → dropdown-menu-ChvAIQIW.js} +1 -1
  16. package/dist/editor.js +10 -10
  17. package/dist/{empty-state-D-2ZMXXJ.js → empty-state-CFLcVzKL.js} +2 -2
  18. package/dist/{field-blur-DyOByjzw.js → field-blur-CV9orzdJ.js} +1 -1
  19. package/dist/{field-blur-context-DPe5_Nv5.js → field-blur-context-C8BX8IBy.js} +1 -1
  20. package/dist/{hooks-a7_exKWS.js → hooks-DilW-3jc.js} +2 -2
  21. package/dist/hooks.js +2 -2
  22. package/dist/{hover-card-D_0smKBQ.js → hover-card-IeS_1RPH.js} +1 -1
  23. package/dist/i18n.js +3 -3
  24. package/dist/{icon-badge-CBCU3ySF.js → icon-badge-Bf4SoA2i.js} +3 -3
  25. package/dist/{icon-button-hKHsWTAt.js → icon-button-l3dQTRrC.js} +1 -1
  26. package/dist/lib/components/ui/collections/filter/use-filter-field-config.d.ts +1 -0
  27. package/dist/lib/components/ui/collections/server-table/past-end.d.ts +3 -0
  28. package/dist/lib/components/ui/collections/server-table/types.d.ts +2 -2
  29. package/dist/lib/components/ui/collections/server-table/use-table-answer.d.ts +1 -1
  30. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  31. package/dist/lib/components/ui/widgets/code-editor/code-editor-field.d.ts +7 -6
  32. package/dist/lib/components/ui/widgets/code-editor/code-editor-types.d.ts +6 -0
  33. package/dist/lib/components/ui/widgets/code-editor/use-code-editor-instance.d.ts +12 -1
  34. package/dist/lib/components/ui/widgets/native-charts/core/reference-geometry.d.ts +16 -2
  35. package/dist/lib/i18n/resources/en/en.d.ts +1 -0
  36. package/dist/lib/i18n/resources/en/material.json.d.ts +1 -0
  37. package/dist/lib/i18n/resources/fr/fr.d.ts +1 -0
  38. package/dist/lib/i18n/resources/fr/material.json.d.ts +1 -0
  39. package/dist/lib/i18n/resources/resources.d.ts +2 -0
  40. package/dist/lib/i18n/translator.d.ts +1 -1
  41. package/dist/lib.js +1 -1
  42. package/dist/main.js +25 -25
  43. package/dist/map.js +8 -8
  44. package/dist/material.css +1 -1
  45. package/dist/pdf-reader.js +1 -1
  46. package/dist/print.js +1 -1
  47. package/dist/{public-D8JGp3PH.js → public-B-greXGt.js} +9 -9
  48. package/dist/{rich-code-block-0R3bidsM.js → rich-code-block-Cv6s59vB.js} +5 -5
  49. package/dist/{sortable-provider-B75v53sB.js → sortable-provider-DVmZcglU.js} +2 -2
  50. package/dist/{spinner-CAnpF3RK.js → spinner-OQAweH2r.js} +1 -1
  51. package/dist/theme-picker.js +2 -2
  52. package/dist/{theme-toggle-pQ5F602V.js → theme-toggle-DPx44p6a.js} +1 -1
  53. package/dist/{toolbar-items-_ezD5B0r.js → toolbar-items-CQ3S_XZw.js} +3 -3
  54. package/dist/{translate-material-CvZK8_S6.js → translate-material-BHL4g2UB.js} +1 -1
  55. package/dist/{translator-Caf-d96e.js → translator-BJsjXcAp.js} +2 -0
  56. package/dist/{typography-CEK19bj8.js → typography-CwhEwPay.js} +1 -1
  57. package/dist/{use-chat-composer-Dpvi_-CR.js → use-chat-composer-R0vng5RU.js} +16 -16
  58. package/dist/{use-heading-spy-mmcyEGmm.js → use-heading-spy-Brcn0l_J.js} +4 -4
  59. package/dist/{use-material-translation-C_1cWRzW.js → use-material-translation-mY3U83TV.js} +1 -1
  60. package/dist/{use-return-focus-1ZIchrBM.js → use-return-focus-BQ413TNG.js} +1 -1
  61. package/docs/components/buttons-and-actions.md +1 -1
  62. package/docs/components/data-table-filter-and-lists.md +16 -3
  63. package/docs/components/navigation-and-layout.md +9 -5
  64. package/docs/components/rich-widgets.md +1 -0
  65. package/docs/guides/charts.md +1 -1
  66. package/docs/guides/code-editor.md +14 -0
  67. package/docs/guides/i18n.md +3 -1
  68. package/docs/troubleshooting.md +9 -7
  69. package/lib/components/ui/display/chip/chip-soft.css +19 -5
  70. package/package.json +2 -2
@@ -1,3 +1,3 @@
1
- import { t as e } from "./public-D8JGp3PH.js";
1
+ import { t as e } from "./public-B-greXGt.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,4 +1,4 @@
1
- import { i as e, t } from "./translate-material-CvZK8_S6.js";
1
+ import { i as e, t } from "./translate-material-BHL4g2UB.js";
2
2
  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";
3
3
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
4
4
  import { resolvePdfFileName as f } from "@nxgt/material-core/pdf-file-name";
@@ -3,22 +3,22 @@ import { n as t } from "./ui.utils-CAnKTCw5.js";
3
3
  import { t as n } from "./utils-BLfntITJ.js";
4
4
  import { o as r } from "./dist-DVRQkaTK.js";
5
5
  import { c as i, i as a, l as o, n as s, o as c, s as l } from "./dist-lmHmz_bu.js";
6
- import { n as u, s as d } from "./spinner-CAnpF3RK.js";
6
+ import { n as u, s as d } from "./spinner-OQAweH2r.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 { a as h, c as g, i as _, l as v, n as y, o as b, r as x, s as ee, t as te, u as ne } from "./use-return-focus-1ZIchrBM.js";
10
- import { c as S, d as C, f as w, i as T, l as re, n as ie, o as E, t as ae, u as D } from "./dropdown-menu-_SyVmSuy.js";
11
- import { S as oe, a as O, d as k, g as se, h as ce, i as le, m as ue, n as A, r as de, t as j, u as fe, w as pe } from "./toolbar-items-_ezD5B0r.js";
12
- import { t as me } from "./button-DfS_amfQ.js";
13
- import { t as M } from "./use-material-translation-C_1cWRzW.js";
14
- import { n as he, t as ge } from "./icon-button-hKHsWTAt.js";
9
+ import { a as h, c as g, i as _, l as v, n as y, o as b, r as x, s as ee, t as te, u as ne } from "./use-return-focus-BQ413TNG.js";
10
+ import { c as S, d as C, f as w, i as T, l as re, n as ie, o as E, t as ae, u as D } from "./dropdown-menu-ChvAIQIW.js";
11
+ import { S as oe, a as O, d as k, g as se, h as ce, i as le, m as ue, n as A, r as de, t as j, u as fe, w as pe } from "./toolbar-items-CQ3S_XZw.js";
12
+ import { t as me } from "./button-D5k3K-gM.js";
13
+ import { t as M } from "./use-material-translation-mY3U83TV.js";
14
+ import { n as he, t as ge } from "./icon-button-l3dQTRrC.js";
15
15
  import { t as _e } from "./useEvent-2fKq-6w8.js";
16
16
  import { n as ve, t as ye } from "./toggle-group-BkH23Jk4.js";
17
17
  import { i as be } from "./escape-owner-DpaP0lm1.js";
18
18
  import { n as xe } from "./use-slice-reducer-BGkeGtML.js";
19
- import { f as Se, r as Ce, t as we, u as Te } from "./dialog-Bd7Hid2L.js";
19
+ import { f as Se, r as Ce, t as we, u as Te } from "./dialog-DWNaxpa-.js";
20
20
  import { r as Ee } from "./use-csp-nonce-ZKs9k-ov.js";
21
- import { n as De, t as Oe } from "./empty-state-D-2ZMXXJ.js";
21
+ import { n as De, t as Oe } from "./empty-state-CFLcVzKL.js";
22
22
  import { t as ke } from "./client-only.utils-3nHNzCki.js";
23
23
  import { t as Ae } from "./use-scroll-away-PQRFZkT2.js";
24
24
  import * as N from "react";
@@ -1,7 +1,7 @@
1
- import { r as e } from "./spinner-CAnpF3RK.js";
2
- import { c as t, n, t as r } from "./dropdown-menu-_SyVmSuy.js";
3
- import { t as i } from "./use-material-translation-C_1cWRzW.js";
4
- import { a, i as o, n as s, o as c, t as l } from "./code-language-items-andgHKrM.js";
1
+ import { r as e } from "./spinner-OQAweH2r.js";
2
+ import { c as t, n, t as r } from "./dropdown-menu-ChvAIQIW.js";
3
+ import { t as i } from "./use-material-translation-mY3U83TV.js";
4
+ import { a, i as o, n as s, o as c, t as l } from "./code-language-items-CsaXyApg.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 { Suspense as h, lazy as g, useEffect as _, useRef as v, useState as y } from "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 = g(() => import("./code-editor-B0tN8Ha_.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
146
+ var N = g(() => import("./code-editor-aXG4CdY-.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
147
147
  function P() {
148
148
  let { t: e } = i();
149
149
  return /* @__PURE__ */ b("div", {
@@ -1,7 +1,7 @@
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-C_1cWRzW.js";
4
- import { t as r } from "./icon-button-hKHsWTAt.js";
3
+ import { t as n } from "./use-material-translation-mY3U83TV.js";
4
+ import { t as r } from "./icon-button-l3dQTRrC.js";
5
5
  import { t as i } from "./compose-refs-DZ0iIVF-.js";
6
6
  import a, { cloneElement as o, createContext as s, forwardRef as c, memo as l, useCallback as u, useContext as d, useEffect as f, useId as p, useLayoutEffect as m, useMemo as h, useReducer as g, useRef as _, useState as v } from "react";
7
7
  import { jsx as y } from "react/jsx-runtime";
@@ -3,7 +3,7 @@ import { n as t, t as n } from "./utils-BLfntITJ.js";
3
3
  import { i as r, o as i } from "./dist-DVRQkaTK.js";
4
4
  import { a, c as o, i as s, l as c, n as l, o as u, r as d, s as f, t as p, u as m } from "./dist-lmHmz_bu.js";
5
5
  import { a as h, c as g, d as _, i as v, l as y, o as b, r as x, t as S, u as C } from "./floating-ui.dom-KkZSW8_E.js";
6
- import { t as w } from "./use-material-translation-C_1cWRzW.js";
6
+ import { t as w } from "./use-material-translation-mY3U83TV.js";
7
7
  import * as T from "react";
8
8
  import { useLayoutEffect as E, useRef as D, useSyncExternalStore as O } from "react";
9
9
  import { jsx as k, jsxs as A } from "react/jsx-runtime";
@@ -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
3
  import { a as s, r as c } from "./icon-sprites-CaYXzOL4.js";
4
- import { t as l } from "./use-material-translation-C_1cWRzW.js";
4
+ import { t as l } from "./use-material-translation-mY3U83TV.js";
5
5
  import { t as u } from "./use-theme-BCLireTd.js";
6
6
  import { a as d, r as f } from "./theme-context-Cofk6vgs.js";
7
- import { t as p } from "./theme-toggle-pQ5F602V.js";
7
+ import { t as p } from "./theme-toggle-DPx44p6a.js";
8
8
  import { n as m, t as h } from "./nxgt-theme-DA1IQe0O.js";
9
9
  import { useContext as g } from "react";
10
10
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./use-material-translation-C_1cWRzW.js";
1
+ import { t as e } from "./use-material-translation-mY3U83TV.js";
2
2
  import { i as t } from "./theme-store-BdPp43cV.js";
3
3
  import { n, t as r } from "./use-theme-BCLireTd.js";
4
4
  import { r as i } from "./theme-context-Cofk6vgs.js";
@@ -1,13 +1,13 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { o as t, r as n, t as r } from "./dist-DVRQkaTK.js";
3
3
  import { a as i, c as a, i as o, l as s, r as c, s as l } from "./dist-lmHmz_bu.js";
4
- import { C as u, S as d, d as f, f as p, m, p as h, r as g, u as _ } from "./spinner-CAnpF3RK.js";
4
+ import { C as u, S as d, d as f, f as p, m, p as h, r as g, u as _ } from "./spinner-OQAweH2r.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 ne } from "./in-dialog-Vwkyp-M5.js";
7
- import { A as re, M as ie, N as ae, b as oe, d as se, f as ce, i as le, j as ue, l as de, n as fe, o as pe, r as me, t as he, u as ge, y as _e } from "./dropdown-menu-_SyVmSuy.js";
7
+ import { A as re, M as ie, N as ae, b as oe, d as se, f as ce, i as le, j as ue, l as de, n as fe, o as pe, r as me, t as he, u as ge, y as _e } from "./dropdown-menu-ChvAIQIW.js";
8
8
  import { a as ve, n as ye, r as be, t as xe } from "./dist-B7RjY7SL.js";
9
9
  import { t as Se } from "./warn-once-C_e47JM8.js";
10
- import { t as Ce } from "./use-material-translation-C_1cWRzW.js";
10
+ import { t as Ce } from "./use-material-translation-mY3U83TV.js";
11
11
  import { i as we } from "./escape-owner-DpaP0lm1.js";
12
12
  import * as E from "react";
13
13
  import { createContext as D, useCallback as Te, useContext as O, useEffect as k, useId as Ee, useLayoutEffect as A, useMemo as j, useReducer as De, useRef as M, useState as N } from "react";
@@ -1,4 +1,4 @@
1
- import { a as e, l as t, r as n, s as r, t as i, u as a } from "./translator-Caf-d96e.js";
1
+ import { a as e, l as t, r as n, s as r, t as i, u as a } from "./translator-BJsjXcAp.js";
2
2
  import { createContext as o, useCallback as s, useContext as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
3
3
  import { jsx as p } from "react/jsx-runtime";
4
4
  //#region lib/i18n/material-resources-registry.ts
@@ -1450,6 +1450,7 @@ var r = {
1450
1450
  apply: "Apply Filters",
1451
1451
  reset: "Reset",
1452
1452
  "clear-all": "Clear all",
1453
+ "inline-clear-hint": "Pressing a selected chip removes it from the filter",
1453
1454
  min: "Min",
1454
1455
  max: "Max",
1455
1456
  presets: {
@@ -4353,6 +4354,7 @@ var r = {
4353
4354
  apply: "Appliquer",
4354
4355
  reset: "Réinitialiser",
4355
4356
  "clear-all": "Tout effacer",
4357
+ "inline-clear-hint": "Appuyer sur une puce sélectionnée la retire du filtre",
4356
4358
  min: "Min",
4357
4359
  max: "Max",
4358
4360
  presets: {
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./dist-DVRQkaTK.js";
3
- import { n } from "./spinner-CAnpF3RK.js";
3
+ import { n } from "./spinner-OQAweH2r.js";
4
4
  import { jsx as r } from "react/jsx-runtime";
5
5
  //#region lib/components/ui/primitives/typography/typography.variants.ts
6
6
  var i = [
@@ -4,40 +4,40 @@ import { t as n } from "./utils-BLfntITJ.js";
4
4
  import { n as r } from "./use-shape-morph-BKA_R5P5.js";
5
5
  import { n as i, o as a, t as o } from "./dist-DVRQkaTK.js";
6
6
  import { a as s, c, i as l, l as u, n as d, o as f, r as p, s as m, t as h } from "./dist-lmHmz_bu.js";
7
- import { _ as g, a as _, b as v, c as y, g as b, h as x, i as S, n as C, o as w, r as T, s as E, t as D, v as O, x as k, y as A } from "./spinner-CAnpF3RK.js";
7
+ import { _ as g, a as _, b as v, c as y, g as b, h as x, i as S, n as C, o as w, r as T, s as E, t as D, v as O, x as k, y as A } from "./spinner-OQAweH2r.js";
8
8
  import { a as ee, i as j, n as M, r as N, t as te } from "./dist-C4wtXCjf.js";
9
9
  import { i as ne, n as P } from "./in-dialog-Vwkyp-M5.js";
10
- import { c as re, l as ie, n as F, r as ae, t as oe } from "./alert-dialog-RHm6WtQj.js";
10
+ import { c as re, l as ie, n as F, r as ae, t as oe } from "./alert-dialog-C0nGUSCP.js";
11
11
  import { A as se, C as I, D as ce, E as le, O as ue, S as de, T as fe, _ as pe, a as me, b as he, d as ge, f as _e, g as ve, h as ye, i as be, k as xe, l as Se, m as Ce, n as we, o as Te, p as Ee, r as De, s as Oe, t as ke, u as Ae, v as je, w as Me, x as Ne, y as Pe } from "./floating-ui.dom-KkZSW8_E.js";
12
- import { D as Fe, E as Ie, N as Le, O as Re, c as ze, d as Be, f as Ve, i as He, k as Ue, m as We, n as Ge, o as Ke, p as qe, t as Je, u as Ye } from "./dropdown-menu-_SyVmSuy.js";
13
- import { a as Xe, i as Ze, n as Qe } from "./field-blur-context-DPe5_Nv5.js";
14
- import { C as $e, S as et, a as tt, c as nt, d as rt, l as it, n as at, o as ot, s as st, u as ct } from "./toolbar-items-_ezD5B0r.js";
12
+ import { D as Fe, E as Ie, N as Le, O as Re, c as ze, d as Be, f as Ve, i as He, k as Ue, m as We, n as Ge, o as Ke, p as qe, t as Je, u as Ye } from "./dropdown-menu-ChvAIQIW.js";
13
+ import { a as Xe, i as Ze, n as Qe } from "./field-blur-context-C8BX8IBy.js";
14
+ import { C as $e, S as et, a as tt, c as nt, d as rt, l as it, n as at, o as ot, s as st, u as ct } from "./toolbar-items-CQ3S_XZw.js";
15
15
  import { a as lt, i as ut, n as dt, o as ft, t as pt } from "./bubble-input-B7BVd9fX.js";
16
16
  import { i as mt } from "./dist-B7RjY7SL.js";
17
17
  import { o as ht, s as gt, t as _t } from "./use-click-lock-BZYtTmVt.js";
18
18
  import { a as vt, r as yt } from "./icon-sprites-CaYXzOL4.js";
19
19
  import { t as bt } from "./warn-once-C_e47JM8.js";
20
- import { r as xt, t as St } from "./button-DfS_amfQ.js";
21
- import { a as Ct } from "./translator-Caf-d96e.js";
20
+ import { r as xt, t as St } from "./button-D5k3K-gM.js";
21
+ import { a as Ct } from "./translator-BJsjXcAp.js";
22
22
  import { h as wt } from "./get-CTzJAwfc.js";
23
23
  import { t as Tt } from "./isEmpty-F_g3jLf8.js";
24
- import { t as L } from "./use-material-translation-C_1cWRzW.js";
25
- import { t as R } from "./icon-button-hKHsWTAt.js";
24
+ import { t as L } from "./use-material-translation-mY3U83TV.js";
25
+ import { t as R } from "./icon-button-l3dQTRrC.js";
26
26
  import { t as Et } from "./use-ssr-media-query-C6M5m8sf.js";
27
- import { n as Dt, t as Ot } from "./typography-CEK19bj8.js";
27
+ import { n as Dt, t as Ot } from "./typography-CwhEwPay.js";
28
28
  import { n as kt, t as At } from "./util-4heV2LPI.js";
29
29
  import { t as jt } from "./useEvent-2fKq-6w8.js";
30
- import { f as Mt } from "./field-blur-DyOByjzw.js";
30
+ import { f as Mt } from "./field-blur-CV9orzdJ.js";
31
31
  import { c as Nt, i as Pt, l as Ft, o as It, r as Lt, s as Rt, t as zt } from "./dist-C3GR7kJd.js";
32
32
  import { i as Bt } from "./toggle-group-BkH23Jk4.js";
33
33
  import { n as Vt } from "./use-slice-reducer-BGkeGtML.js";
34
34
  import { t as Ht } from "./browser-only-DQ94lWF8.js";
35
35
  import { t as Ut } from "./compose-refs-DZ0iIVF-.js";
36
- import { n as Wt, r as Gt, t as Kt } from "./chip-Cbndukko.js";
37
- import { _ as qt, f as Jt, g as Yt, l as Xt, m as Zt, n as Qt, o as $t, r as en, s as tn, t as nn, u as rn, v as an, y as on } from "./dialog-Bd7Hid2L.js";
38
- import { n as sn, t as cn } from "./icon-badge-CBCU3ySF.js";
36
+ import { n as Wt, r as Gt, t as Kt } from "./chip-lWXIJkqo.js";
37
+ import { _ as qt, f as Jt, g as Yt, l as Xt, m as Zt, n as Qt, o as $t, r as en, s as tn, t as nn, u as rn, v as an, y as on } from "./dialog-DWNaxpa-.js";
38
+ import { n as sn, t as cn } from "./icon-badge-Bf4SoA2i.js";
39
39
  import { r as ln } from "./use-csp-nonce-ZKs9k-ov.js";
40
- import { t as un } from "./empty-state-D-2ZMXXJ.js";
40
+ import { t as un } from "./empty-state-CFLcVzKL.js";
41
41
  import { t as dn } from "./skeleton-DSdtr2qc.js";
42
42
  import { H as fn, V as pn, X as mn, bt as hn, it as gn, lt as _n, n as vn, t as yn, xt as bn, yt as xn } from "./dist-moutbfbd.js";
43
43
  import { t as Sn } from "./markdown-Dw_uH7j7.js";
@@ -11250,7 +11250,7 @@ var xS = (e = {}) => Cn({
11250
11250
  let [{ default: t }, { lowlight: n }, { richCodeBlock: r }] = await Promise.all([
11251
11251
  import("./dist-CRMFGjng.js"),
11252
11252
  import("./lowlight-OtcjU2Sa.js"),
11253
- import("./rich-code-block-0R3bidsM.js")
11253
+ import("./rich-code-block-Cv6s59vB.js")
11254
11254
  ]);
11255
11255
  return [r(t, {
11256
11256
  lowlight: n,
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { a as t, c as n, d as r, i, n as a, r as o, t as s, u as c } from "./alert-dialog-RHm6WtQj.js";
3
- import { a as l } from "./button-DfS_amfQ.js";
4
- import { i as u } from "./translate-material-CvZK8_S6.js";
5
- import { t as d } from "./use-material-translation-C_1cWRzW.js";
2
+ import { a as t, c as n, d as r, i, n as a, r as o, t as s, u as c } from "./alert-dialog-C0nGUSCP.js";
3
+ import { a as l } from "./button-D5k3K-gM.js";
4
+ import { i as u } from "./translate-material-BHL4g2UB.js";
5
+ import { t as d } from "./use-material-translation-mY3U83TV.js";
6
6
  import { _ as f, g as p, h as m, n as h, v as g, y as _ } from "./number.utils-BG_eEt5g.js";
7
7
  import { useCallback as v, useEffect as y, useMemo as b, useRef as x, useState as S } from "react";
8
8
  import { jsx as C, jsxs as w } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { i as e, t } from "./translate-material-CvZK8_S6.js";
1
+ import { i as e, t } from "./translate-material-BHL4g2UB.js";
2
2
  import { useCallback as n } from "react";
3
3
  //#region lib/i18n/use-material-translation.ts
4
4
  function r() {
@@ -1,6 +1,6 @@
1
1
  import { o as e, r as t } from "./dist-DVRQkaTK.js";
2
2
  import { a as n, c as r, i, l as a, o, r as s, s as c } from "./dist-lmHmz_bu.js";
3
- import { C as l, S as u, w as d } from "./spinner-CAnpF3RK.js";
3
+ import { C as l, S as u, w as d } from "./spinner-OQAweH2r.js";
4
4
  import { c as f, i as p, l as m, o as h, r as g, s as ee } from "./in-dialog-Vwkyp-M5.js";
5
5
  import { r as _ } from "./escape-owner-DpaP0lm1.js";
6
6
  import * as v from "react";
@@ -975,7 +975,7 @@ buttons.
975
975
 
976
976
  ![LoadMoreFooter](../previews/buttons-actions-loadmorefooter.webp)
977
977
 
978
- The footer of a paged list: a "Showing N of M" line (a polite live region), the load button and, when the next page failed, an error alert whose "Try again" calls `onLoad`. The rows already shown stay on screen. It renders nothing when there is no next page. When the last page arrives it keeps the status line (so the final "Showing 85 of 85" is announced) and, if the button had the focus as it went away, takes the focus itself (the footer is `tabIndex={-1}`); a list that never had a next page renders nothing, and a list that restarts smaller (a new filter, `shown` or `total` dropping) drops the line. That is a heuristic: a restart at the same size or larger (a new query whose first page ends the list, `total` unknown) cannot be told from a real end, and `shown === 0` (a list being rebuilt) is ignored. Give a standalone footer a `key` that names the query (the search, filters and sort, not the page), `<LoadMoreFooter key={queryIdentity} … />`, so a new query starts it afresh; `ServerTable` does it for you.
978
+ The footer of a paged list: a "Showing N of M" line (a polite live region), the load button and, when the next page failed, an error alert whose "Try again" calls `onLoad`. The rows already shown stay on screen. It renders nothing when there is no next page. When the last page arrives it keeps the status line (so the final "Showing 85 of 85" is announced) and, if the button had the focus as it went away, takes the focus itself (the footer is `tabIndex={-1}`); a list that never had a next page renders nothing, and a list that restarts smaller (a new filter, `shown` or `total` dropping) drops the line. That is a heuristic: a restart at the same size or larger (a new query whose first page ends the list, `total` unknown) cannot be told from a real end, and `shown === 0` (a list being rebuilt) is ignored. Give a standalone footer a `key` that names the query (the search, filters and sort, not the page), `<LoadMoreFooter key={queryIdentity} … />`, so a new query starts it afresh; `ServerTable` does it for you. `ServerTable` also takes no `totalCount` (an API with no total): its `footer="load-more"` then reads "20 shown" while a next page exists, never a made-up "N of N" ([ServerTable, load-more](./data-table-filter-and-lists.md#servertable)).
979
979
 
980
980
  ```tsx
981
981
  import { LoadMoreFooter } from '@nxgt/material/components';
@@ -622,7 +622,12 @@ export default function Students() {
622
622
  announces "41–60 of 133" when the page changes. With neither `offset` nor
623
623
  `totalCount` the region is empty, and is kept in the DOM so a later change
624
624
  is still announced; on an empty page too, which never reads "0 rows" (see
625
- [an empty server page](#an-empty-server-page)). The table already has a visually hidden status for
625
+ [an empty server page](#an-empty-server-page)). `ServerTable` with no
626
+ `totalCount` (a cursor feed) passes no `offset` and no `totalCount`: the
627
+ footer is Previous / Next from `pageInfo` and the cursor trail, and its live
628
+ region says the rows on the page ("20 shown"); a later page that comes back
629
+ empty is not announced as "0 results", since only the first page can say
630
+ there are none. The table already has a visually hidden status for
626
631
  "Loading data…" (a `<p role="status" aria-live="polite" aria-atomic="true">`,
627
632
  `data-slot="data-table-status"`; the page may have a toast region too), so a test finds the
628
633
  range with `getByRole('status', { name: 'Rows shown' })`, not a bare
@@ -706,6 +711,8 @@ For the TanStack API itself (column helpers, features, row models), see
706
711
 
707
712
  One server page of a list in a `manual` `DataTable`, its state in the URL's search params and no router imported: a top band (the title, the [filter bar](#filter-bar) and its active filters in one `search` landmark, the page's actions), the sort, forward cursor paging (`after` plus a `trail`), a selection that follows the user across pages but resets on a new query, the empty page, and the count announced once a new query is answered.
708
713
 
714
+ `totalCount` is optional: an API that gives no total (an audit log, an event feed) leaves it out, and the paged footer is then Previous / Next from `pageInfo` and the cursor trail, with no "x of y" (the same footer as [PageFooter](#pagefooter) without a total); the live region says "N shown", and a later page that comes back empty is not announced as "0 results".
715
+
709
716
  The `filter` prop is the list's [`Filter`](#filter-bar) (over
710
717
  `@nxgt/material-core/filter`): `ServerTable` renders it in the band,
711
718
  reads its query from the params and writes it back on the first page. The
@@ -1017,7 +1024,7 @@ Its props are `ServerTableProps<T>`; `filter` is a `ServerTableFilter`,
1017
1024
  | --- | --- | --- | --- |
1018
1025
  | `params` | `URLSearchParams` | — | the URL's search params |
1019
1026
  | `onParamsChange` | `(next: URLSearchParams) => void` | — | the router's setter |
1020
- | `rows`, `totalCount`, `pageInfo` | the connection's page | — | `pageInfo: { endCursor?, hasNextPage }`; `rows` stable per answer |
1027
+ | `rows`, `totalCount`, `pageInfo` | the connection's page | — | `pageInfo: { endCursor?, hasNextPage }`; `rows` stable per answer. `totalCount` is optional: leave it out when the API gives no total (an audit log, an event feed); the paging footer is then Previous / Next from `pageInfo` and the cursor trail, with no "x of y", and the live region says the rows on the page ("N shown") |
1021
1028
  | `pageSize` | `number` | — | the footer's range ("21–40 of 45") |
1022
1029
  | `getRowId` | `(row) => string` | — | the selection's key |
1023
1030
  | `filter` | `ServerTableFilter` | — | `{ model, locked?, fieldProps?, variant?, sheetTrigger?, quick?, density?, shortcuts?, previewCount?, counts?, liveDelayMs?, label?, searchLabel?, searchPlaceholder?, searchApply?, searchMinLength?, codec?, defaults?, errors? }` |
@@ -1899,6 +1906,10 @@ if the button had the focus as it went away, the footer takes it
1899
1906
  (`tabIndex={-1}`). `ServerTable` restarts the footer by itself whenever `params` change (the search, filters and sort, not a page), so a new query never keeps the old list's last line.
1900
1907
  `footer="load-more"` without `onLoadMore` warns in development.
1901
1908
 
1909
+ A list whose API returns no total leaves `totalCount` out: while a next page
1910
+ exists the footer says "N shown" (never a made-up "N of N"), and after the
1911
+ last page it keeps that line with the final count.
1912
+
1902
1913
  #### An inline chip group
1903
1914
 
1904
1915
  A `chips-single` or `chips-multiple` field declared `inline: true` shows its
@@ -1913,7 +1924,9 @@ way to narrow a list (the topics of a catalogue).
1913
1924
  - **Pressing** a chip sets the condition in one query change (back on the
1914
1925
  first page); pressing the chosen chip of a single group clears it. A
1915
1926
  multiple group toggles each chip. The group is a `radiogroup` (or a `group`
1916
- of checkboxes) named by the field's label.
1927
+ of checkboxes) named by the field's label, and described (`aria-describedby`,
1928
+ visually hidden text, `material.filter.inline-clear-hint`) as "Pressing a
1929
+ selected chip removes it from the filter", since there is no "All" chip.
1917
1930
  - **A plain filter.** It is counted, in the URL like any field, and cleared by
1918
1931
  "Clear all". It has no chip of its own (the group shows it) and is not in
1919
1932
  "Add filter" nor among the quick pills; the phone sheet still lists it.
@@ -373,6 +373,7 @@ the page. It takes a `div`'s props.
373
373
  the room the others leave, which keep their size. Give it the one filled
374
374
  `Button`; a second filled `Button` among the children warns once in
375
375
  development, make the others `outlined` or `tonal`.
376
+ - **Surface.** Below `md` the bar paints `--background` (it is stuck over the content); from `md`, and with `sticky={false}`, it paints nothing and takes its parent's surface, such as a `Card`.
376
377
  - **Safe areas.** Under `viewport-fit=cover` the bar pads clear of
377
378
  `env(safe-area-inset-left | right | bottom)`, as classes.
378
379
  - **Keyboard.** From the visual viewport (`visualViewport`), the bar rises by
@@ -460,12 +461,15 @@ import { ListDetailsLayout, PaneLayout, ThreadLayout } from '@nxgt/material/comp
460
461
  </ThreadLayout>
461
462
  ```
462
463
 
463
- Below 648 px `ListDetailsLayout` shows one view at a time and
464
+ At 648 px and narrower `ListDetailsLayout` shows one view at a time and
464
465
  `PaneLayout` moves its pane into a sheet; the `…Trigger` parts switch view or
465
- open the pane (`ListDetailsTrigger` takes the `view` to show), and their `children` / `className` can be functions of the
466
- layout state. A server, which has no screen width, renders the wide layout,
467
- as does a hydrating client; a phone switches right after hydrating. A page
468
- rendered only in the browser starts on the real layout. `ThreadLayout` is a centred column over the app
466
+ open the pane (`ListDetailsTrigger` takes the `view` to show), and their
467
+ `children` / `className` can be functions of the layout state. A server, which
468
+ has no screen width, renders the wide layout, as does a hydrating client; a
469
+ phone switches right after hydrating. `PaneLayout`'s inline pane is hidden by
470
+ CSS at 648 px and narrower, so a phone never sees it flash before the sheet
471
+ takes over. A page rendered only in the browser starts on the real layout.
472
+ `ThreadLayout` is a centred column over the app
469
473
  [background](#background) on the page ground (`bg-ground`, so a `bg-card` card stands apart) for focused flows (sign-in, onboarding), with no
470
474
  app bar.
471
475
 
@@ -2207,6 +2207,7 @@ function Config() {
2207
2207
  | `height` | `string \| number` | `300` | editor height |
2208
2208
  | `readOnly` | `boolean` | `false` | a reader: the code can be selected, searched and copied, not changed; no caret and no current line, a quiet gutter, a Read-only badge and the line count in the status bar, Copy filled and labelled, no Format or language menu. Not dimmed (unlike `disabled`) |
2209
2209
  | `disabled` | `boolean` | — | dimmed, read-only, its tools off |
2210
+ | `aria-describedby` | `string` | — | the id(s) of what describes the code (a question's description, `QuestionCodeField.describedBy`); set on Monaco's input before the `helperText` id, each id once |
2210
2211
  | `lineNumbers` | `boolean` | `true` | the line numbers in the gutter |
2211
2212
  | `minimap` | `boolean` | `false` | Monaco's minimap |
2212
2213
  | `wordWrap` / `defaultWordWrap` / `onWordWrapChange` | `boolean` | `false` | wraps long lines; the pill's Word wrap toggles it (controlled when `wordWrap` is given) |
@@ -241,7 +241,7 @@ const toneOf = (point: ChartPoint) =>
241
241
  | Prop | Effect |
242
242
  | --- | --- |
243
243
  | `bands` | `{ from, to, label, tone? }[]`: a wash across the plot behind the lines, with its `label` inside it at the left. `from` and `to` may come in either order, and are a number, a row field or a function of the row (a stepped band; typed `ChartRowValue`). |
244
- | `thresholds` | `{ value, label, tone?, dash? }[]` (`value`: a number, a row field or a function of the row): a horizontal line behind the series with its `label` above it at the right end; dashed unless `dash: false`. |
244
+ | `thresholds` | `{ value, label, tone?, dash? }[]` (`value`: a number, a row field or a function of the row): a horizontal line behind the series with its `label` above it at the right end (under it when a point of a series sits where the label would be, so it never covers a point or its marker); dashed unless `dash: false`. |
245
245
  | `pointTone` | `(point: ChartPoint, series: ChartSeries) => Tone \| undefined`: the tone of one value. It is given the point `onPointClick` gets, so `point.index` is the row of the full `data` even when the chart is zoomed. |
246
246
  | `toneLabels` | `{ [tone]: word }`: the word of each tone, in your language and domain. Unset, the library's neutral word ("Error", translated by `material.charts.tone.*`); an app tone you declared falls back to its own name. |
247
247
 
@@ -24,12 +24,26 @@ screen ("Open in editor"); `fullscreen` and `onFullscreenChange` let your
24
24
  own button do the same
25
25
  ([CodeEditor](../components/rich-widgets.md#codeeditor)).
26
26
 
27
+ - [Describing the code](#describing-the-code)
27
28
  - [Client-only](#client-only)
28
29
  - [Themes](#themes)
29
30
  - [Your own theme](#your-own-theme)
30
31
  - [Self-hosting Monaco](#self-hosting-monaco)
31
32
  - [Moving off the barrel import](#moving-off-the-barrel-import)
32
33
 
34
+ ## Describing the code
35
+
36
+ `aria-describedby` takes the id of the element that describes the code, such
37
+ as the description line of a question. It goes on Monaco's input, before the
38
+ id of the field's own `helperText`, so a screen reader reads both.
39
+
40
+ ```tsx
41
+ <CodeEditor label="Answer" aria-describedby="question-description" />
42
+
43
+ // In a QuestionCard:
44
+ <QuestionCard renderCode={(field) => <CodeEditor aria-describedby={field.describedBy} />} />
45
+ ```
46
+
33
47
  ## Client-only
34
48
 
35
49
  The entry's built files carry no `'use client'` directive: import the
@@ -303,7 +303,9 @@ value to enter." (an operator such as "is empty")),
303
303
  `material.filter.op.<id>.*` for each operator (`is`, `is_not`, `in`,
304
304
  `between`, `before`, `after`, `contains`, `empty`, `gt`, `lt`, `gte`, `lte`):
305
305
  its `label` ("is any of") and its words on a chip, `chip` and, for several
306
- values, `chip-many`. "Clear all" is `material.filter.clear-all`. The phone sheet
306
+ values, `chip-many`. "Clear all" is `material.filter.clear-all`. An inline chip group
307
+ is described by `material.filter.inline-clear-hint` ("Pressing a selected chip
308
+ removes it from the filter"). The phone sheet
307
309
  has `material.filter.sheet.*`: `title` "Filters" (its trigger and its
308
310
  title), `show` "Show results", `show-count` (an ICU plural over `count`:
309
311
  "No results", "Show # result", "Show # results") and `locked` "Locked
@@ -1508,15 +1508,17 @@ top (`align="start"`).
1508
1508
  **When:** an `ActivityContent` `aside` scrolls away with the page instead of
1509
1509
  staying under the app bar, or it is not beside the content at 1280px.
1510
1510
  **Why:** `position: sticky` sticks inside its nearest scrolling ancestor, and
1511
- any ancestor with an `overflow` other than `visible` (`overflow-hidden`,
1512
- `overflow-auto`, `overflow-clip`; a `PaneLayout`'s root has `overflow-hidden`)
1513
- becomes that scroller, which does not scroll, so the panel never moves. A
1514
- wrapper of yours around the screen, or an `ActivityLayout` with
1515
- `scroll="container"` where you meant `"document"`, does the same. Below
1511
+ any ancestor with an `overflow` other than `visible` or `clip`
1512
+ (`overflow-hidden`, `overflow-auto`; a `PaneLayout`'s root and content use
1513
+ `overflow-clip`, which clips without becoming a scroller, so a sticky panel
1514
+ inside still sticks) becomes that scroller, which does not scroll, so the
1515
+ panel never moves. A wrapper of yours around the screen, or an
1516
+ `ActivityLayout` with `scroll="container"` where you meant `"document"`, does
1517
+ the same. Below
1516
1518
  `asideFrom` (1280px by default) the panel is stacked and not sticky on
1517
1519
  purpose, and the breakpoint is the window's width, not the column's.
1518
- **Fix:** take the `overflow` off every ancestor between `ActivityLayout` and
1519
- `ActivityContent`, or move it onto an element inside the screen; use
1520
+ **Fix:** take the `overflow` (other than `visible` or `clip`) off every
1521
+ ancestor between `ActivityLayout` and `ActivityContent`, or move it onto an element inside the screen; use
1520
1522
  `scroll="document"` (the default). Find the culprit in the console:
1521
1523
 
1522
1524
  ```js
@@ -1,6 +1,10 @@
1
1
  /* Chip `tonal` and `filled`, "soft": no outline at all. A low tonal fill that reads as a
2
2
  * chip on any surface; selected = the library's primary tint, a hairline
3
- * ring in primary-text and a check (the ≥3:1 cue), the label unchanged. */
3
+ * ring in primary-text and a check (the ≥3:1 cue), the label unchanged. In
4
+ * dark the tint is mixed from --primary-text, the light end of the primary,
5
+ * 56 % at rest and 58 % on hover, and the label is white: in all 14 themes
6
+ * the fill is ≥3:1 over the surface and the label ≥4.5:1 (#2044); the deep
7
+ * --primary gave 1.3:1. */
4
8
  @layer components {
5
9
  .nxgt-chip[data-look="soft"] {
6
10
  --chip-bg: color-mix(in oklab, var(--foreground) 6.5%, var(--background));
@@ -9,8 +13,8 @@
9
13
  var(--foreground) 10%,
10
14
  var(--background)
11
15
  );
12
- --chip-on: color-mix(in oklab, var(--primary) 12%, var(--background));
13
- --chip-on-hover: color-mix(in oklab, var(--primary) 17%, var(--background));
16
+ --chip-on: color-mix(in oklab, var(--primary) 20%, var(--background));
17
+ --chip-on-hover: color-mix(in oklab, var(--primary) 25%, var(--background));
14
18
  --chip-on-ring: color-mix(
15
19
  in oklab,
16
20
  var(--primary-text) 75%,
@@ -25,8 +29,13 @@
25
29
  var(--foreground) 14%,
26
30
  var(--background)
27
31
  );
28
- --chip-on: color-mix(in oklab, var(--primary) 42%, var(--background));
29
- --chip-on-hover: color-mix(in oklab, var(--primary) 52%, var(--background));
32
+ --chip-on: color-mix(in oklab, var(--primary-text) 56%, var(--background));
33
+ --chip-on-hover: color-mix(
34
+ in oklab,
35
+ var(--primary-text) 58%,
36
+ var(--background)
37
+ );
38
+ --chip-on-text: white;
30
39
  --chip-on-ring: color-mix(
31
40
  in oklab,
32
41
  var(--primary-text) 80%,
@@ -43,6 +52,11 @@
43
52
  background: var(--chip-on);
44
53
  box-shadow: inset 0 0 0 1px var(--chip-on-ring);
45
54
  }
55
+ /* Dark: the label on the lighter fill is white (the foreground fell under
56
+ * 4.5:1 on some themes' hover). Light keeps the foreground. */
57
+ .nxgt-chip[data-look="soft"][data-selected] {
58
+ color: var(--chip-on-text, var(--foreground));
59
+ }
46
60
  .nxgt-chip[data-look="soft"][data-selected]:is(
47
61
  button:hover,
48
62
  :has(> button[data-slot="chip-body"]:hover)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxgt/material",
3
- "version": "3.64.0",
3
+ "version": "3.65.0",
4
4
  "license": "MIT",
5
5
  "bugs": {
6
6
  "email": "stevegires@gmail.com"
@@ -372,7 +372,7 @@
372
372
  "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"
373
373
  },
374
374
  "dependencies": {
375
- "@nxgt/material-core": "^0.45.0",
375
+ "@nxgt/material-core": "^0.45.1",
376
376
  "@base-ui/react": "^1.6.0",
377
377
  "@dnd-kit/core": "^6.3.1",
378
378
  "@dnd-kit/sortable": "^10.0.0",