@nxgt/material 3.63.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.
- package/CHANGELOG.md +45 -0
- package/dist/{alert-dialog-RHm6WtQj.js → alert-dialog-C0nGUSCP.js} +1 -1
- package/dist/{async-slice-DmX59NyA.js → async-slice-CyansBvD.js} +1 -1
- package/dist/{button-DfS_amfQ.js → button-D5k3K-gM.js} +1 -1
- package/dist/charts.js +818 -807
- package/dist/{chip-Cbndukko.js → chip-lWXIJkqo.js} +2 -2
- package/dist/{code-editor-B0tN8Ha_.js → code-editor-aXG4CdY-.js} +403 -393
- package/dist/code-editor.js +5 -5
- package/dist/{code-language-items-andgHKrM.js → code-language-items-CsaXyApg.js} +2 -2
- package/dist/components/ui/display/chip/chip-soft.css +19 -5
- package/dist/{components-Cm2doOJS.js → components-DNcTvjlv.js} +15083 -14933
- package/dist/components.js +21 -21
- package/dist/{dialog-Bd7Hid2L.js → dialog-DWNaxpa-.js} +4 -4
- package/dist/dnd.js +1 -1
- package/dist/{dropdown-menu-_SyVmSuy.js → dropdown-menu-ChvAIQIW.js} +1 -1
- package/dist/editor.js +10 -10
- package/dist/{empty-state-D-2ZMXXJ.js → empty-state-CFLcVzKL.js} +2 -2
- package/dist/{field-blur-DyOByjzw.js → field-blur-CV9orzdJ.js} +1 -1
- package/dist/{field-blur-context-DPe5_Nv5.js → field-blur-context-C8BX8IBy.js} +1 -1
- package/dist/{hooks-a7_exKWS.js → hooks-DilW-3jc.js} +2 -2
- package/dist/hooks.js +2 -2
- package/dist/{hover-card-D_0smKBQ.js → hover-card-IeS_1RPH.js} +1 -1
- package/dist/i18n.js +3 -3
- package/dist/{icon-badge-CBCU3ySF.js → icon-badge-Bf4SoA2i.js} +3 -3
- package/dist/{icon-button-hKHsWTAt.js → icon-button-l3dQTRrC.js} +1 -1
- package/dist/lib/components/ui/actions/load-more-footer/load-more-footer.d.ts +11 -2
- package/dist/lib/components/ui/actions/load-more-footer/use-footer-focus.d.ts +15 -0
- package/dist/lib/components/ui/actions/load-more-footer/use-last-page.d.ts +9 -0
- package/dist/lib/components/ui/collections/filter/bar/partials/filter-inline-chips.d.ts +11 -0
- package/dist/lib/components/ui/collections/filter/bar/partials/filter-inline-list.d.ts +6 -0
- package/dist/lib/components/ui/collections/filter/use-filter-field-config.d.ts +1 -0
- package/dist/lib/components/ui/collections/server-table/partials/server-table-grid-paging.d.ts +9 -0
- package/dist/lib/components/ui/collections/server-table/partials/server-table-load-more.d.ts +17 -0
- package/dist/lib/components/ui/collections/server-table/past-end.d.ts +3 -0
- package/dist/lib/components/ui/collections/server-table/types-paging.d.ts +10 -0
- package/dist/lib/components/ui/collections/server-table/types.d.ts +2 -2
- package/dist/lib/components/ui/collections/server-table/use-table-answer.d.ts +1 -1
- package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
- package/dist/lib/components/ui/widgets/code-editor/code-editor-field.d.ts +7 -6
- package/dist/lib/components/ui/widgets/code-editor/code-editor-types.d.ts +6 -0
- package/dist/lib/components/ui/widgets/code-editor/use-code-editor-instance.d.ts +12 -1
- package/dist/lib/components/ui/widgets/education/questions/partials/question-content.d.ts +1 -1
- package/dist/lib/components/ui/widgets/education/questions/question-long-text.d.ts +2 -2
- package/dist/lib/components/ui/widgets/education/questions/question.d.ts +1 -1
- package/dist/lib/components/ui/widgets/education/questions/types.d.ts +14 -0
- package/dist/lib/components/ui/widgets/native-charts/core/reference-geometry.d.ts +16 -2
- package/dist/lib/i18n/resources/en/en.d.ts +1 -0
- package/dist/lib/i18n/resources/en/material.json.d.ts +1 -0
- package/dist/lib/i18n/resources/fr/fr.d.ts +1 -0
- package/dist/lib/i18n/resources/fr/material.json.d.ts +1 -0
- package/dist/lib/i18n/resources/resources.d.ts +2 -0
- package/dist/lib/i18n/translator.d.ts +1 -1
- package/dist/lib.js +1 -1
- package/dist/main.js +25 -25
- package/dist/map.js +8 -8
- package/dist/material.css +1 -1
- package/dist/pdf-reader.js +1 -1
- package/dist/print.js +1 -1
- package/dist/{public-D8JGp3PH.js → public-B-greXGt.js} +9 -9
- package/dist/{rich-code-block-0R3bidsM.js → rich-code-block-Cv6s59vB.js} +5 -5
- package/dist/{sortable-provider-B75v53sB.js → sortable-provider-DVmZcglU.js} +2 -2
- package/dist/{spinner-CAnpF3RK.js → spinner-OQAweH2r.js} +1 -1
- package/dist/theme-picker.js +2 -2
- package/dist/{theme-toggle-pQ5F602V.js → theme-toggle-DPx44p6a.js} +1 -1
- package/dist/{toolbar-items-_ezD5B0r.js → toolbar-items-CQ3S_XZw.js} +3 -3
- package/dist/{translate-material-CvZK8_S6.js → translate-material-BHL4g2UB.js} +1 -1
- package/dist/{translator-Caf-d96e.js → translator-BJsjXcAp.js} +2 -0
- package/dist/{typography-CEK19bj8.js → typography-CwhEwPay.js} +1 -1
- package/dist/{use-chat-composer-Dpvi_-CR.js → use-chat-composer-R0vng5RU.js} +16 -16
- package/dist/{use-heading-spy-mmcyEGmm.js → use-heading-spy-Brcn0l_J.js} +4 -4
- package/dist/{use-material-translation-C_1cWRzW.js → use-material-translation-mY3U83TV.js} +1 -1
- package/dist/{use-return-focus-1ZIchrBM.js → use-return-focus-BQ413TNG.js} +1 -1
- package/docs/components/buttons-and-actions.md +2 -2
- package/docs/components/data-table-filter-and-lists.md +111 -2
- package/docs/components/navigation-and-layout.md +9 -5
- package/docs/components/rich-widgets.md +4 -1
- package/docs/guides/charts.md +1 -1
- package/docs/guides/code-editor.md +14 -0
- package/docs/guides/i18n.md +3 -1
- package/docs/roadmap.md +4 -0
- package/docs/troubleshooting.md +9 -7
- package/lib/components/ui/display/chip/chip-soft.css +19 -5
- package/package.json +2 -2
package/dist/pdf-reader.js
CHANGED
package/dist/print.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as e, t } from "./translate-material-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
12
|
-
import { t as me } from "./button-
|
|
13
|
-
import { t as M } from "./use-material-translation-
|
|
14
|
-
import { n as he, t as ge } from "./icon-button-
|
|
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-
|
|
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-
|
|
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-
|
|
2
|
-
import { c as t, n, t as r } from "./dropdown-menu-
|
|
3
|
-
import { t as i } from "./use-material-translation-
|
|
4
|
-
import { a, i as o, n as s, o as c, t as l } from "./code-language-items-
|
|
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-
|
|
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-
|
|
4
|
-
import { t as r } from "./icon-button-
|
|
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-
|
|
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";
|
package/dist/theme-picker.js
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
13
|
-
import { a as Xe, i as Ze, n as Qe } from "./field-blur-context-
|
|
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-
|
|
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-
|
|
21
|
-
import { a as Ct } from "./translator-
|
|
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-
|
|
25
|
-
import { t as R } from "./icon-button-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
38
|
-
import { n as sn, t as cn } from "./icon-badge-
|
|
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-
|
|
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-
|
|
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-
|
|
3
|
-
import { a as l } from "./button-
|
|
4
|
-
import { i as u } from "./translate-material-
|
|
5
|
-
import { t as d } from "./use-material-translation-
|
|
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,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-
|
|
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
|

|
|
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.
|
|
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';
|
|
@@ -994,7 +994,7 @@ import { LoadMoreFooter } from '@nxgt/material/components';
|
|
|
994
994
|
| --- | --- | --- | --- |
|
|
995
995
|
| `shown` | `number` | — | items shown now |
|
|
996
996
|
| `total` | `number` | — | items in all; leave it out when unknown, the line then reads "20 shown" |
|
|
997
|
-
| `hasMore` | `boolean` | — | `false` renders nothing, not even the count |
|
|
997
|
+
| `hasMore` | `boolean` | — | `false` renders nothing, not even the count, unless a next page existed before: the status line then stays after the last page (`showCount={false}` drops it) |
|
|
998
998
|
| `loading` | `boolean` | `false` | the button (or the retry) spins and ignores clicks |
|
|
999
999
|
| `failed` | `boolean` | `false` | an error alert with a tonal "Try again" replaces the button |
|
|
1000
1000
|
| `showCount` | `boolean` | `true` | `false` hides the "Showing N of M" line (keep it for a list whose header already announces the count in its own `role="status"`); the button and the failed alert stay |
|
|
@@ -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)).
|
|
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? }` |
|
|
@@ -1027,6 +1034,11 @@ Its props are `ServerTableProps<T>`; `filter` is a `ServerTableFilter`,
|
|
|
1027
1034
|
| `actions` | `ReactNode` | — | the page's actions, at the band's end |
|
|
1028
1035
|
| `bandDensity` | `'comfortable' \| 'compact'` | `'comfortable'` | (the same prop as [`Filter`](#a-compact-band-for-a-list-inside-a-page-section)'s bar) `'compact'` halves the room above the band (16px to 8px) and under it (12px to 6px), for a list under a sticky app bar and a breadcrumb; the controls keep their size (the Filter's own `density` is the controls') |
|
|
1029
1036
|
| `pageControls` | `'labelled' \| 'icon'` | `'labelled'` | the footer's Previous / Next: `'icon'` is icon-only, with a tooltip and the names "Previous page" / "Next page" (`DataTable`'s default is unchanged); on a coarse pointer the icon controls are 44x44 boxes (still painted 32px) |
|
|
1037
|
+
| `footer` | `'paging' \| 'load-more'` | `'paging'` | `'load-more'` replaces Previous / Next with [`LoadMoreFooter`](./feedback-and-status.md): "Showing N of M" (`rows.length` of `totalCount`), the load button while `pageInfo.hasNextPage`, a failed alert with a retry. The page keeps the rows loaded so far in `rows` and fetches the next itself: the cursor params are not used. The selection count stays; `hideOnSinglePage` still hides the footer |
|
|
1038
|
+
| `onLoadMore` | `() => void` | — | with `footer="load-more"` (required): fetches the next page and appends it to `rows`; the retry of a failed page calls it too |
|
|
1039
|
+
| `isLoadingMore` | `boolean` | `false` | with `footer="load-more"`: the next page is being fetched, the button spins and ignores clicks |
|
|
1040
|
+
| `loadMoreFailed` | `boolean` | `false` | with `footer="load-more"`: the next page failed, an alert with "Try again" replaces the button, the rows stay |
|
|
1041
|
+
| `loadMoreLabel` | `string` | "Load more" | with `footer="load-more"`: the button's label |
|
|
1030
1042
|
| `hideOnSinglePage` | `boolean` | `false` | hides the footer's range and Previous / Next when the result is one page (no previous, no next), in the table, cards and tiles layouts; the count is still announced by the live region but no longer shown, so put it in `description` or keep the footer. With `bulkActions` the footer stays for "N rows selected", without its pager |
|
|
1031
1043
|
| `bandActions` | `'stacked' \| 'inline'` | `'stacked'` | with `filter`, where `actions` sit below 768px: `'stacked'` gives them a row above the search; `'inline'` keeps them on the search's row (the search takes the room left), for a lone icon action such as a "+". An action wider than 3.5rem wraps under the search. From 768px both are the same. With a cards or tiles list on a phone, neither applies: [the two-row header](#the-phone-header-of-a-list-in-cards-or-tiles) puts the actions on its second row |
|
|
1032
1044
|
| `filterRef` | `Ref<ServerTableFilterHandle>` | — | with `filter`: `filterRef.current.focus()` focuses the Filter's first control, the search, else the first quick filter, "Add filter" or "Filters (N)" the width shows |
|
|
@@ -1830,6 +1842,103 @@ its lock only. The words are `material.filter.default.*`.
|
|
|
1830
1842
|
<ServerTable filter={{ model: EVENT_FILTERS, defaults: { mine: ['1'] } }} {...table} />
|
|
1831
1843
|
```
|
|
1832
1844
|
|
|
1845
|
+
#### Load more instead of paging
|
|
1846
|
+
|
|
1847
|
+
A catalogue or a history that grows keeps its rows and asks for the next page
|
|
1848
|
+
(`footer="load-more"`). The page owns the accumulated rows: any change of
|
|
1849
|
+
`params` (a search, a filter chip, a sort) is a new query, which **drops the
|
|
1850
|
+
rows, the failure and any request still in flight, and starts again with the
|
|
1851
|
+
first page**; `onLoadMore` **appends only the next page**.
|
|
1852
|
+
|
|
1853
|
+
```tsx
|
|
1854
|
+
function Quizzes() {
|
|
1855
|
+
const [params, setParams] = useSearchParams();
|
|
1856
|
+
const query = params.toString();
|
|
1857
|
+
const [rows, setRows] = useState<Quiz[]>([]);
|
|
1858
|
+
const [page, setPage] = useState({ cursor: null as string | null, hasNext: false, total: 0 });
|
|
1859
|
+
const [isLoadingMore, setLoadingMore] = useState(false);
|
|
1860
|
+
const [failed, setFailed] = useState(false);
|
|
1861
|
+
// Bumped by every new query: an answer of an older one is dropped.
|
|
1862
|
+
const generation = useRef(0);
|
|
1863
|
+
|
|
1864
|
+
useEffect(() => {
|
|
1865
|
+
const mine = ++generation.current;
|
|
1866
|
+
setRows([]); setFailed(false); setLoadingMore(false);
|
|
1867
|
+
fetchQuizzes(new URLSearchParams(query), null).then((first) => {
|
|
1868
|
+
if (mine !== generation.current) return;
|
|
1869
|
+
setRows(first.nodes);
|
|
1870
|
+
setPage({ cursor: first.endCursor, hasNext: first.hasNextPage, total: first.totalCount });
|
|
1871
|
+
});
|
|
1872
|
+
}, [query]);
|
|
1873
|
+
|
|
1874
|
+
const loadMore = async () => {
|
|
1875
|
+
const mine = generation.current;
|
|
1876
|
+
setFailed(false); setLoadingMore(true);
|
|
1877
|
+
try {
|
|
1878
|
+
const next = await fetchQuizzes(new URLSearchParams(query), page.cursor);
|
|
1879
|
+
if (mine !== generation.current) return; // the query changed meanwhile
|
|
1880
|
+
setRows((all) => [...all, ...next.nodes]); // only the next page
|
|
1881
|
+
setPage({ cursor: next.endCursor, hasNext: next.hasNextPage, total: next.totalCount });
|
|
1882
|
+
} catch {
|
|
1883
|
+
if (mine === generation.current) setFailed(true); // the rows stay, "Try again"
|
|
1884
|
+
} finally {
|
|
1885
|
+
if (mine === generation.current) setLoadingMore(false);
|
|
1886
|
+
}
|
|
1887
|
+
};
|
|
1888
|
+
|
|
1889
|
+
return (
|
|
1890
|
+
<ServerTable
|
|
1891
|
+
params={params} onParamsChange={setParams}
|
|
1892
|
+
rows={rows} totalCount={page.total} pageInfo={{ hasNextPage: page.hasNext }}
|
|
1893
|
+
pageSize={20} getRowId={(q) => q.id} columns={columns}
|
|
1894
|
+
filter={{ model: QUIZ_FILTERS }} // a chips-single field with inline: true
|
|
1895
|
+
empty={{ none: 'No quiz yet', noMatch: 'No quiz matches' }}
|
|
1896
|
+
footer="load-more" onLoadMore={loadMore}
|
|
1897
|
+
isLoadingMore={isLoadingMore} loadMoreFailed={failed}
|
|
1898
|
+
/>
|
|
1899
|
+
);
|
|
1900
|
+
}
|
|
1901
|
+
```
|
|
1902
|
+
|
|
1903
|
+
The footer is [`LoadMoreFooter`](./buttons-and-actions.md#loadmorefooter): once
|
|
1904
|
+
the last page is in, its status line stays ("Showing 42 of 42", announced) and,
|
|
1905
|
+
if the button had the focus as it went away, the footer takes it
|
|
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.
|
|
1907
|
+
`footer="load-more"` without `onLoadMore` warns in development.
|
|
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
|
+
|
|
1913
|
+
#### An inline chip group
|
|
1914
|
+
|
|
1915
|
+
A `chips-single` or `chips-multiple` field declared `inline: true` shows its
|
|
1916
|
+
options as a chip group in the bar itself, at every width, instead of a quick
|
|
1917
|
+
pill that opens an editor. It suits a short list of choices that is the main
|
|
1918
|
+
way to narrow a list (the topics of a catalogue).
|
|
1919
|
+
|
|
1920
|
+
```ts
|
|
1921
|
+
{ id: 'topic', type: 'chips-single', label: 'Topic', options: TOPICS, inline: true }
|
|
1922
|
+
```
|
|
1923
|
+
|
|
1924
|
+
- **Pressing** a chip sets the condition in one query change (back on the
|
|
1925
|
+
first page); pressing the chosen chip of a single group clears it. A
|
|
1926
|
+
multiple group toggles each chip. The group is a `radiogroup` (or a `group`
|
|
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.
|
|
1930
|
+
- **A plain filter.** It is counted, in the URL like any field, and cleared by
|
|
1931
|
+
"Clear all". It has no chip of its own (the group shows it) and is not in
|
|
1932
|
+
"Add filter" nor among the quick pills; the phone sheet still lists it.
|
|
1933
|
+
- **Rules.** `defineFilterModel` throws without `options`, with another type,
|
|
1934
|
+
with a `default`, with `scope` or with `addable: false`. A condition the
|
|
1935
|
+
group cannot draw (another operator, or a value that is not an
|
|
1936
|
+
option; the URL codec already drops both, so this guards a query written by
|
|
1937
|
+
code) keeps its normal chip with its ✕, so an active filter
|
|
1938
|
+
is never hidden; `inlineShows(field, condition)` is the rule.
|
|
1939
|
+
- **Core.** `isInline(field)`, `inlineShows(field, condition)`; `bandQuickFields` and the bar's `quickFields`
|
|
1940
|
+
list inline fields after the scope ones.
|
|
1941
|
+
|
|
1833
1942
|
#### A scope field
|
|
1834
1943
|
|
|
1835
1944
|
A list scoped by a value the user changes but never clears (the period or the
|
|
@@ -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
|
-
|
|
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
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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) |
|
|
@@ -2453,7 +2454,9 @@ French bundle — see [i18n](../guides/i18n.md).
|
|
|
2453
2454
|
| `QuestionCard` `value` / `onValueChange` | `QuestionAnswer` | — | controlled answer |
|
|
2454
2455
|
| `Question` `kind: 'open'` | `maxLength?` | — | a multi-line answer in a textarea named by the prompt; a counter shows while editable when `maxLength` is set. No `correct`: pass the grader's `verdict` |
|
|
2455
2456
|
| `Question` `kind: 'code'` | `language?`, `maxLength?` | — | source code: drawn by `renderCode`, else a monospace textarea |
|
|
2456
|
-
| `QuestionCard` `renderCode` | `(field: QuestionCodeField) => ReactNode` | — | the code field of a `code` question; `field` is `{ value, onChange, label, labelledBy, language, maxLength, readOnly, disabled }`. Keeps Monaco out of the card's bundle |
|
|
2457
|
+
| `QuestionCard` `renderCode` | `(field: QuestionCodeField) => ReactNode` | — | the code field of a `code` question; `field` is `{ value, onChange, label, labelledBy, describedBy, language, maxLength, readOnly, disabled }`. Keeps Monaco out of the card's bundle |
|
|
2458
|
+
| `Question` `description` | `string` | — | `open`, `code`: a persistent helper line under the answer field ("A person will mark this answer"), linked to it by `aria-describedby` and passed to `renderCode` as `field.describedBy`; always shown, unlike `hint` (a reveal button). Its id is `${promptId}-description` |
|
|
2459
|
+
| `QuestionCard` `promptId` | `string` | generated | the id of the prompt text: point a wrapping section's `aria-labelledby` at it (and `aria-describedby` at `${promptId}-description`) |
|
|
2457
2460
|
| `QuestionCard` `readOnly` / `busy` | `boolean` | `false` | `readOnly`: an answer already submitted, shown without the revealed marks; `busy`: read-only and `aria-busy` while it is saved; every kind honours both |
|
|
2458
2461
|
| new strings | `material.education.kind-open`, `kind-code`, `code-placeholder` | — | English fallbacks and a French bundle |
|
|
2459
2462
|
| `QuestionCard` `variant` / `density` / `showShortcuts` / `number` / `showFeedback` | — | `'card'`, `'comfortable'`, `false`, —, `true` | framed or plain, spacing, key badges, "Question 2", the verdict banner |
|
package/docs/guides/charts.md
CHANGED
|
@@ -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
|
package/docs/guides/i18n.md
CHANGED
|
@@ -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`.
|
|
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
|
package/docs/roadmap.md
CHANGED
|
@@ -241,6 +241,10 @@ version they shipped in, and planned entries may name the major they target.
|
|
|
241
241
|
slot; the bar's `views` slot is planned with it. They are meant to replace
|
|
242
242
|
the legacy `FilterPresets`. Tracked in [#1876](https://github.com/softistx/nxgt-material/issues/1876).
|
|
243
243
|
|
|
244
|
+
- **Link navigation** — `TabsNav` and `SegmentedNav` render route tabs and segmented navigation as a `nav` of links with `aria-current="page"`, looking like Tabs and the segmented ToggleGroup, plus `useTabParam` to keep the current tab in the URL.
|
|
245
|
+
- **RecordActionsMenu** — one menu for a record's lifecycle: archive with an Undo toast (or confirm first with `archivePolicy="confirm"`), restore, and delete that always confirms and shows the backend's refusal, with `ConfirmDialog` gaining `details` and `refusal` slots.
|
|
246
|
+
- **Cursor trail cap** — `ServerTable` and `PageFooter` keep cursor URLs short: the trail is encoded once and capped by `maxTrail` (20 by default) with an exact page count, and `totalCount` becomes optional for APIs that do not count.
|
|
247
|
+
|
|
244
248
|
## Later
|
|
245
249
|
|
|
246
250
|
- **A strict theme `motif` (4.0)** — a theme background's `motif` with an
|
package/docs/troubleshooting.md
CHANGED
|
@@ -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`
|
|
1512
|
-
`overflow-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
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`
|
|
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
|