@nxgt/material 3.16.0 → 3.18.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 +24 -0
- package/README.md +1 -1
- package/dist/{async-slice-ChtlTP8W.js → async-slice-gqif7FX9.js} +2 -2
- package/dist/{button-BrgyWw7T.js → button-Ck1Bif-Q.js} +1 -1
- package/dist/charts.js +3 -3
- package/dist/{chip-BZu-bvAJ.js → chip-B9pZFWbi.js} +1 -1
- package/dist/{code-editor-DjY7_8TH.js → code-editor-M4DcaX-P.js} +4 -4
- package/dist/code-editor.js +4 -4
- package/dist/{code-language-items-D1lpNQ6J.js → code-language-items-Bnm_WDVg.js} +2 -2
- package/dist/{components-BOF9frx3.js → components-nq1rUKCK.js} +18648 -18025
- package/dist/components.js +15 -15
- package/dist/{dialog-YHZJjDrI.js → dialog-jYcWDh9G.js} +1 -1
- package/dist/dnd.js +1 -1
- package/dist/{dropdown-menu-BEyP-A0J.js → dropdown-menu-BEZhNnhr.js} +1 -1
- package/dist/editor.js +7 -7
- package/dist/{empty-state-ZtqqpX0S.js → empty-state-BBUsR0_X.js} +1 -1
- package/dist/hooks.js +2 -2
- package/dist/{i18n-provider-GV4Ukoe2.js → i18n-provider-3TsMIGn1.js} +1 -1
- package/dist/i18n.js +5 -5
- package/dist/{icon-badge-C0TGvF9o.js → icon-badge-92uhu2o6.js} +1 -1
- package/dist/lib/components/ui/collections/filter/editors/text-editor.d.ts +6 -1
- package/dist/lib/components/ui/collections/filter/index.d.ts +1 -1
- package/dist/lib/components/ui/collections/filter/query/types.d.ts +20 -1
- package/dist/lib/components/ui/collections/filter/query/use-filter-query-value.d.ts +3 -0
- package/dist/lib/components/ui/collections/filter/query/use-filter-query.d.ts +6 -2
- package/dist/lib/components/ui/collections/filter/sections/filter-search.d.ts +7 -1
- package/dist/lib/components/ui/collections/server-table/types.d.ts +12 -1
- package/dist/lib/components/ui/collections/server-table/use-table-answer.d.ts +1 -1
- package/dist/lib/components/ui/fields/search-field/search-field.d.ts +6 -1
- package/dist/lib/components/ui/selection/switcher/partials/switcher-footer.d.ts +13 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-groups.d.ts +9 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-list.d.ts +8 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-menu.d.ts +13 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-popover.d.ts +12 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-row.d.ts +22 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-search.d.ts +14 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-sheet.d.ts +12 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-tile.d.ts +7 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-tooltip.d.ts +9 -0
- package/dist/lib/components/ui/selection/switcher/partials/switcher-trigger.d.ts +17 -0
- package/dist/lib/components/ui/selection/switcher/switcher.d.ts +10 -15
- package/dist/lib/components/ui/selection/switcher/switcher.utils.d.ts +13 -0
- package/dist/lib/components/ui/selection/switcher/types.d.ts +73 -0
- package/dist/lib/components/ui/selection/switcher/use-clipped.d.ts +3 -0
- package/dist/lib/components/ui/selection/switcher/use-switcher-list.d.ts +21 -0
- package/dist/lib/i18n/resources/en/en.d.ts +11 -0
- package/dist/lib/i18n/resources/en/material.json.d.ts +11 -0
- package/dist/lib/i18n/resources/fr/fr.d.ts +11 -0
- package/dist/lib/i18n/resources/fr/material.json.d.ts +11 -0
- package/dist/lib/i18n/resources/resources.d.ts +22 -0
- package/dist/lib/i18n/translator.d.ts +1 -1
- package/dist/lib.js +1 -1
- package/dist/main.js +21 -21
- package/dist/map.js +4 -4
- package/dist/material.css +1 -1
- package/dist/pdf-reader.js +1 -1
- package/dist/print.js +2 -2
- package/dist/{public-Bj3rGSfS.js → public-BLw13izR.js} +6 -6
- package/dist/{rich-code-block-RN-EpeTA.js → rich-code-block-DPe5USBG.js} +4 -4
- package/dist/{sortable-provider-Iej7IS4n.js → sortable-provider-CtAb1Q02.js} +1 -1
- package/dist/{spinner-BwWDXIbg.js → spinner-CcmXeIHf.js} +1 -1
- package/dist/{stored-language-BAAP7qS3.js → stored-language-CsDEJDR7.js} +24 -2
- package/dist/theme-picker.js +2 -2
- package/dist/{theme-toggle-8zHeXSD1.js → theme-toggle-CWovcIQY.js} +1 -1
- package/dist/{toolbar-items-CVQBYp4K.js → toolbar-items-CrATPuOX.js} +2 -2
- package/dist/{translate-material-C0aOnHpZ.js → translate-material-X1daoGxE.js} +2 -2
- package/dist/{translator-BU07gNva.js → translator-BUVKAo4l.js} +1 -1
- package/dist/{use-chat-composer-CoXmJCkr.js → use-chat-composer-UZVFm8Tw.js} +52 -52
- package/dist/{use-heading-spy-DETdqnB6.js → use-heading-spy-ByraZUf9.js} +1 -1
- package/dist/{use-material-translation-DGeVp-qP.js → use-material-translation-tD9XqIBm.js} +2 -2
- package/docs/components/data-table-filter-and-lists.md +35 -3
- package/docs/components/form-fields.md +1 -0
- package/docs/components/overlays-and-menus.md +1 -1
- package/docs/components/selection-and-choice.md +76 -6
- package/docs/guides/i18n.md +1 -1
- package/docs/guides/server-lists-url.md +12 -0
- package/docs/previews/selection-choice-switcher.webp +0 -0
- package/docs/troubleshooting.md +18 -1
- package/package.json +2 -2
package/dist/pdf-reader.js
CHANGED
package/dist/print.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as e } from "./i18n-provider-
|
|
2
|
-
import { t } from "./translate-material-
|
|
1
|
+
import { r as e } from "./i18n-provider-3TsMIGn1.js";
|
|
2
|
+
import { t } from "./translate-material-X1daoGxE.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-
|
|
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-
|
|
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-
|
|
12
|
-
import { t as N } from "./use-material-translation-
|
|
13
|
-
import { t as _e } from "./button-
|
|
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-jYcWDh9G.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-BEZhNnhr.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-CrATPuOX.js";
|
|
12
|
+
import { t as N } from "./use-material-translation-tD9XqIBm.js";
|
|
13
|
+
import { t as _e } from "./button-Ck1Bif-Q.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-
|
|
20
|
+
import { n as Ee, t as De } from "./empty-state-BBUsR0_X.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-
|
|
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-
|
|
2
|
+
import { c as t, n, t as r } from "./dropdown-menu-BEZhNnhr.js";
|
|
3
|
+
import { t as i } from "./use-material-translation-tD9XqIBm.js";
|
|
4
|
+
import { a, i as o, n as s, o as c, t as l } from "./code-language-items-Bnm_WDVg.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-
|
|
146
|
+
var N = x(() => import("./code-editor-M4DcaX-P.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-
|
|
3
|
+
import { t as n } from "./use-material-translation-tD9XqIBm.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-
|
|
3
|
+
import { t as n } from "./use-material-translation-tD9XqIBm.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", {
|
|
@@ -1275,6 +1275,7 @@ var t = {
|
|
|
1275
1275
|
bar: {
|
|
1276
1276
|
label: "Filters",
|
|
1277
1277
|
search: "Search",
|
|
1278
|
+
"search-min": "Type at least {min, plural, one {# character} other {# characters}} to search",
|
|
1278
1279
|
active: "Active filters",
|
|
1279
1280
|
locked: "Locked",
|
|
1280
1281
|
"locked-reason": "Locked: {reason}",
|
|
@@ -2599,7 +2600,17 @@ var t = {
|
|
|
2599
2600
|
"scatter-series": "{series}: {count, plural, one {# point} other {# points}}."
|
|
2600
2601
|
}
|
|
2601
2602
|
},
|
|
2602
|
-
"list-details": { back: "Back to the list" }
|
|
2603
|
+
"list-details": { back: "Back to the list" },
|
|
2604
|
+
switcher: {
|
|
2605
|
+
search: "Search",
|
|
2606
|
+
"search-placeholder": "Search…",
|
|
2607
|
+
clear: "Clear the search",
|
|
2608
|
+
empty: "No results for “{query}”",
|
|
2609
|
+
results: "{count, plural, =0 {No results} one {# result} other {# results}}",
|
|
2610
|
+
recent: "Recent",
|
|
2611
|
+
manage: "Manage…",
|
|
2612
|
+
choose: "Choose"
|
|
2613
|
+
}
|
|
2603
2614
|
} },
|
|
2604
2615
|
fr: { material: {
|
|
2605
2616
|
"empty-state": {
|
|
@@ -3874,6 +3885,7 @@ var t = {
|
|
|
3874
3885
|
bar: {
|
|
3875
3886
|
label: "Filtres",
|
|
3876
3887
|
search: "Rechercher",
|
|
3888
|
+
"search-min": "Saisissez au moins {min, plural, one {# caractère} other {# caractères}} pour rechercher",
|
|
3877
3889
|
active: "Filtres actifs",
|
|
3878
3890
|
locked: "Verrouillé",
|
|
3879
3891
|
"locked-reason": "Verrouillé : {reason}",
|
|
@@ -5198,7 +5210,17 @@ var t = {
|
|
|
5198
5210
|
"scatter-series": "{series} : {count, plural, one {# point} other {# points}}."
|
|
5199
5211
|
}
|
|
5200
5212
|
},
|
|
5201
|
-
"list-details": { back: "Retour à la liste" }
|
|
5213
|
+
"list-details": { back: "Retour à la liste" },
|
|
5214
|
+
switcher: {
|
|
5215
|
+
search: "Rechercher",
|
|
5216
|
+
"search-placeholder": "Rechercher…",
|
|
5217
|
+
clear: "Effacer la recherche",
|
|
5218
|
+
empty: "Aucun résultat pour « {query} »",
|
|
5219
|
+
results: "{count, plural, =0 {Aucun résultat} one {# résultat} other {# résultats}}",
|
|
5220
|
+
recent: "Récents",
|
|
5221
|
+
manage: "Gérer…",
|
|
5222
|
+
choose: "Choisir"
|
|
5223
|
+
}
|
|
5202
5224
|
} }
|
|
5203
5225
|
}, n = "language", r = "en", i = Object.keys(t);
|
|
5204
5226
|
//#endregion
|
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
|
-
import { t as s } from "./use-material-translation-
|
|
3
|
+
import { t as s } from "./use-material-translation-tD9XqIBm.js";
|
|
4
4
|
import { n as c, r as l } from "./icon-sprites-FxHyqyhg.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-
|
|
7
|
+
import { t as p } from "./theme-toggle-CWovcIQY.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-
|
|
1
|
+
import { t as e } from "./use-material-translation-tD9XqIBm.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-
|
|
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-BEZhNnhr.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-
|
|
9
|
+
import { t as xe } from "./use-material-translation-tD9XqIBm.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-
|
|
2
|
-
import { a as e, r as t } from "./translator-
|
|
1
|
+
import "./stored-language-CsDEJDR7.js";
|
|
2
|
+
import { a as e, r as t } from "./translator-BUVKAo4l.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-
|
|
2
|
+
import { a as t, i as n, r, t as i } from "./stored-language-CsDEJDR7.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-
|
|
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-jYcWDh9G.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-
|
|
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-BEZhNnhr.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-
|
|
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-CrATPuOX.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-
|
|
18
|
-
import { a as kt } from "./translator-
|
|
17
|
+
import "./stored-language-CsDEJDR7.js";
|
|
18
|
+
import { a as kt } from "./translator-BUVKAo4l.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-
|
|
22
|
-
import { t as Mt } from "./spinner-
|
|
21
|
+
import { t as L } from "./use-material-translation-tD9XqIBm.js";
|
|
22
|
+
import { t as Mt } from "./spinner-CcmXeIHf.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-
|
|
24
|
+
import { a as Pt, i as Ft, n as It, r as Lt, t as Rt } from "./button-Ck1Bif-Q.js";
|
|
25
25
|
import { t as R } from "./icon-button-ifTpXt0A.js";
|
|
26
26
|
import { n as zt, r as Bt } from "./icon-sprites-FxHyqyhg.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-
|
|
39
|
-
import { n as dn, t as fn } from "./icon-badge-
|
|
38
|
+
import { n as cn, r as ln, t as un } from "./chip-B9pZFWbi.js";
|
|
39
|
+
import { n as dn, t as fn } from "./icon-badge-92uhu2o6.js";
|
|
40
40
|
import { r as pn } from "./use-csp-nonce-ZKs9k-ov.js";
|
|
41
|
-
import { t as mn } from "./empty-state-
|
|
41
|
+
import { t as mn } from "./empty-state-BBUsR0_X.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-
|
|
10785
|
+
import("./rich-code-block-DPe5USBG.js")
|
|
10786
10786
|
]);
|
|
10787
10787
|
return [r(t, {
|
|
10788
10788
|
lowlight: n,
|
|
@@ -12053,35 +12053,35 @@ function WC({ shortcut: e, loading: t, filled: n, disabled: r, onClear: i }) {
|
|
|
12053
12053
|
}
|
|
12054
12054
|
//#endregion
|
|
12055
12055
|
//#region lib/components/ui/fields/search-field/search-field.tsx
|
|
12056
|
-
function GC({ id: e, value: t, defaultValue: r = "", onChange: i, onValueChange: a,
|
|
12057
|
-
let { t:
|
|
12058
|
-
V(() => () =>
|
|
12059
|
-
let
|
|
12060
|
-
if (
|
|
12061
|
-
if (t || !
|
|
12062
|
-
|
|
12056
|
+
function GC({ id: e, value: t, defaultValue: r = "", onChange: i, onValueChange: a, onClear: o, debounceMs: s = 0, loading: c = !1, placeholder: l, label: u, helperText: d, error: f, disabled: p, required: m, name: h, className: g, onKeyDown: _, shortcut: v, ...y }) {
|
|
12057
|
+
let { t: b } = L(), x = eo(), S = eo(), [C, w] = W(String(r ?? "")), T = t !== void 0, E = T ? String(t ?? "") : C, D = Gt(a), O = a !== void 0, k = H(() => s ? Po((e) => D.current?.(e), s) : null, [s, D]);
|
|
12058
|
+
V(() => () => k?.cancel(), [k]);
|
|
12059
|
+
let A = (e, t = !1) => {
|
|
12060
|
+
if (T || w(e), O) {
|
|
12061
|
+
if (t || !k) {
|
|
12062
|
+
k?.cancel(), D.current?.(e);
|
|
12063
12063
|
return;
|
|
12064
12064
|
}
|
|
12065
|
-
|
|
12065
|
+
k(e);
|
|
12066
12066
|
}
|
|
12067
|
-
},
|
|
12068
|
-
|
|
12067
|
+
}, ee = () => {
|
|
12068
|
+
A("", !0), o?.(), i?.({
|
|
12069
12069
|
target: { value: "" },
|
|
12070
12070
|
currentTarget: { value: "" }
|
|
12071
12071
|
});
|
|
12072
|
-
},
|
|
12072
|
+
}, j = e ?? x, M = po(y["aria-describedby"], !!d && S);
|
|
12073
12073
|
return /* @__PURE__ */ K("div", {
|
|
12074
12074
|
"data-slot": "search-field",
|
|
12075
|
-
"data-pw":
|
|
12076
|
-
className: n("grid w-full content-start gap-1.5",
|
|
12075
|
+
"data-pw": h ?? "search-field",
|
|
12076
|
+
className: n("grid w-full content-start gap-1.5", g),
|
|
12077
12077
|
children: [
|
|
12078
|
-
|
|
12079
|
-
htmlFor:
|
|
12080
|
-
withAsterisk:
|
|
12081
|
-
children:
|
|
12078
|
+
u && /* @__PURE__ */ G(dt, {
|
|
12079
|
+
htmlFor: j,
|
|
12080
|
+
withAsterisk: m,
|
|
12081
|
+
children: u
|
|
12082
12082
|
}),
|
|
12083
12083
|
/* @__PURE__ */ K(lv, {
|
|
12084
|
-
"data-disabled":
|
|
12084
|
+
"data-disabled": p || void 0,
|
|
12085
12085
|
children: [
|
|
12086
12086
|
/* @__PURE__ */ G(dv, {
|
|
12087
12087
|
align: "inline-start",
|
|
@@ -12093,39 +12093,39 @@ function GC({ id: e, value: t, defaultValue: r = "", onChange: i, onValueChange:
|
|
|
12093
12093
|
})
|
|
12094
12094
|
}),
|
|
12095
12095
|
/* @__PURE__ */ G(mv, {
|
|
12096
|
-
...
|
|
12097
|
-
id:
|
|
12098
|
-
name:
|
|
12096
|
+
...y,
|
|
12097
|
+
id: j,
|
|
12098
|
+
name: h,
|
|
12099
12099
|
type: "search",
|
|
12100
|
-
value:
|
|
12101
|
-
disabled:
|
|
12102
|
-
required:
|
|
12103
|
-
"aria-invalid":
|
|
12104
|
-
"aria-busy":
|
|
12105
|
-
"aria-describedby":
|
|
12106
|
-
"aria-keyshortcuts":
|
|
12107
|
-
placeholder:
|
|
12100
|
+
value: E,
|
|
12101
|
+
disabled: p,
|
|
12102
|
+
required: m,
|
|
12103
|
+
"aria-invalid": f || void 0,
|
|
12104
|
+
"aria-busy": c || void 0,
|
|
12105
|
+
"aria-describedby": M,
|
|
12106
|
+
"aria-keyshortcuts": v,
|
|
12107
|
+
placeholder: l ?? b("material.search-field.placeholder", "Search"),
|
|
12108
12108
|
className: "[&::-webkit-search-cancel-button]:hidden",
|
|
12109
12109
|
onChange: (e) => {
|
|
12110
|
-
|
|
12110
|
+
A(e.target.value), i?.(e);
|
|
12111
12111
|
},
|
|
12112
12112
|
onKeyDown: (e) => {
|
|
12113
|
-
e.key === "Escape" &&
|
|
12113
|
+
e.key === "Escape" && E && (e.preventDefault(), ee()), _?.(e);
|
|
12114
12114
|
}
|
|
12115
12115
|
}),
|
|
12116
12116
|
/* @__PURE__ */ G(WC, {
|
|
12117
|
-
shortcut:
|
|
12118
|
-
loading:
|
|
12119
|
-
filled:
|
|
12120
|
-
disabled:
|
|
12121
|
-
onClear:
|
|
12117
|
+
shortcut: v,
|
|
12118
|
+
loading: c,
|
|
12119
|
+
filled: E !== "",
|
|
12120
|
+
disabled: p,
|
|
12121
|
+
onClear: ee
|
|
12122
12122
|
})
|
|
12123
12123
|
]
|
|
12124
12124
|
}),
|
|
12125
|
-
|
|
12126
|
-
id:
|
|
12127
|
-
error:
|
|
12128
|
-
children:
|
|
12125
|
+
d && /* @__PURE__ */ G(ut, {
|
|
12126
|
+
id: S,
|
|
12127
|
+
error: f,
|
|
12128
|
+
children: d
|
|
12129
12129
|
})
|
|
12130
12130
|
]
|
|
12131
12131
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as e } from "./i18n-provider-
|
|
1
|
+
import { r as e } from "./i18n-provider-3TsMIGn1.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-
|
|
2
|
-
import { t } from "./translate-material-
|
|
1
|
+
import { r as e } from "./i18n-provider-3TsMIGn1.js";
|
|
2
|
+
import { t } from "./translate-material-X1daoGxE.js";
|
|
3
3
|
import { useCallback as n } from "react";
|
|
4
4
|
//#region lib/i18n/use-material-translation.ts
|
|
5
5
|
function r() {
|
|
@@ -847,7 +847,8 @@ Its props are `ServerTableProps<T>`; `filter` is a `ServerTableFilter`,
|
|
|
847
847
|
| `rows`, `totalCount`, `pageInfo` | the connection's page | — | `pageInfo: { endCursor?, hasNextPage }`; `rows` stable per answer |
|
|
848
848
|
| `pageSize` | `number` | — | the footer's range ("21–40 of 45") |
|
|
849
849
|
| `getRowId` | `(row) => string` | — | the selection's key |
|
|
850
|
-
| `filter` | `ServerTableFilter` | — | `{ model, locked?, fieldProps?, variant?, sheetTrigger?, quick?, density?, shortcuts?, previewCount?, counts?, liveDelayMs?, label?, searchLabel?, searchPlaceholder? }` |
|
|
850
|
+
| `filter` | `ServerTableFilter` | — | `{ model, locked?, fieldProps?, variant?, sheetTrigger?, quick?, density?, shortcuts?, previewCount?, counts?, liveDelayMs?, label?, searchLabel?, searchPlaceholder?, searchApply?, searchMinLength?, codec? }` |
|
|
851
|
+
| `filter.codec` | `{ keepKnownValues?, encoding? }` | — | how the page reads and writes the URL: pass the loader's `keepKnownValues` / `encoding` so chips and rows agree |
|
|
851
852
|
| `title` | `ReactNode` | — | the band's title (a string is an `<h2>`) |
|
|
852
853
|
| `actions` | `ReactNode` | — | the page's actions, at the band's end |
|
|
853
854
|
| `sorting` | `createSorting(…)` | — | headers sorted from the URL |
|
|
@@ -1163,10 +1164,41 @@ Its props are `FilterQueryProps`, its `variant` a `FilterQueryVariant`
|
|
|
1163
1164
|
overload per kind, so `<Filter variant="bar" />` does not compile).
|
|
1164
1165
|
`query` / `defaultQuery` + `onQueryChange` carry the user's query, never a
|
|
1165
1166
|
locked condition; `density` (a `FilterDensity`: `'comfortable'` or
|
|
1166
|
-
`'compact'`), `label`, `searchLabel`, `searchPlaceholder
|
|
1167
|
-
(200 ms) tune it. A locked chip is a focusable group named by its text ("Year is 2026-2027"), with "Locked: <reason>" as its description. The other variants
|
|
1167
|
+
`'compact'`), `label`, `searchLabel`, `searchPlaceholder`, `liveDelayMs`
|
|
1168
|
+
(200 ms), `searchApply` and `searchMinLength` tune it. A locked chip is a focusable group named by its text ("Year is 2026-2027"), with "Locked: <reason>" as its description. The other variants
|
|
1168
1169
|
and `FilterProps` are unchanged.
|
|
1169
1170
|
|
|
1171
|
+
#### The search: apply on Enter, a minimum length
|
|
1172
|
+
|
|
1173
|
+
By default the search is live: the text reaches `onQueryChange` (and a
|
|
1174
|
+
`ServerTable`'s URL) `liveDelayMs` after the last keystroke. A list whose
|
|
1175
|
+
every request is costly or audited can hold it back:
|
|
1176
|
+
|
|
1177
|
+
```tsx
|
|
1178
|
+
<ServerTable
|
|
1179
|
+
filter={{ model, searchApply: 'enter', searchMinLength: 3 }}
|
|
1180
|
+
{...props}
|
|
1181
|
+
/>
|
|
1182
|
+
```
|
|
1183
|
+
|
|
1184
|
+
- `searchApply: 'live' | 'enter'` (default `'live'`). With `'enter'`, typing
|
|
1185
|
+
changes nothing until Enter is pressed. Clearing the field (the ✕, Escape,
|
|
1186
|
+
or emptying it by hand then Enter) applies at once. The URL is written only
|
|
1187
|
+
when the search is applied, so a half-typed query never reaches the router
|
|
1188
|
+
or the loader.
|
|
1189
|
+
- `searchMinLength` (default `0`, in both modes): below it nothing is applied,
|
|
1190
|
+
and a short hint (`material.filter.bar.search-min`, "Type at least 3
|
|
1191
|
+
characters to search") is shown under the field and announced politely. An
|
|
1192
|
+
empty field is always allowed, because it clears. The length counts the
|
|
1193
|
+
trimmed text.
|
|
1194
|
+
- Both go on `Filter` (`variant="bar"` and `"facets"`) and on
|
|
1195
|
+
`ServerTable`'s `filter`. On a phone the search sits beside "Filters (N)"
|
|
1196
|
+
and follows them the same way.
|
|
1197
|
+
- A `text` field (an IPP number, a city) inherits `searchApply`, with no
|
|
1198
|
+
option of its own: its editor (the chip's popover, the facets panel) holds
|
|
1199
|
+
the text until Enter, which applies at once. The phone sheet and a staged
|
|
1200
|
+
panel keep their own Apply. `searchMinLength` concerns the search field only.
|
|
1201
|
+
|
|
1170
1202
|
#### The model, the query and the URL
|
|
1171
1203
|
|
|
1172
1204
|
Declare the fields once, in a `.ts` module with no JSX, so the route's loader
|
|
@@ -609,6 +609,7 @@ import { SearchField } from '@nxgt/material/components';
|
|
|
609
609
|
| Prop | Type | Default | Effect |
|
|
610
610
|
| --- | --- | --- | --- |
|
|
611
611
|
| `onValueChange` | `(value: string) => void` | — | the text, debounced when `debounceMs` is set; the latest `onValueChange` is called when the delay ends, so an inline arrow is safe |
|
|
612
|
+
| `onClear` | `() => void` | — | the clear button or Escape emptied the field, after `onValueChange('')`; an input emptied by typing does not call it |
|
|
612
613
|
| `debounceMs` | `number` | `0` | delay before `onValueChange`; `0` calls it on every key |
|
|
613
614
|
| `loading` | `boolean` | `false` | spinner in place of the clear button |
|
|
614
615
|
| `shortcut` | `string` | — | a hint for the key that focuses the field, e.g. `"/"`: a `Kbd` at the end while the field is empty, not loading and not disabled (`aria-hidden`) and `aria-keyshortcuts` on the input. It binds no key; your page listens and focuses the field |
|
|
@@ -21,7 +21,7 @@ that prevents the default and focuses nothing) goes to the layer's content.
|
|
|
21
21
|
Non-modal layers (`modal={false}`, and `DropdownMenu` and `Popover` by
|
|
22
22
|
default) leave the page as it is.
|
|
23
23
|
|
|
24
|
-
**Checked and radio items draw a mark.** The check of a `*CheckboxItem` draws in and out and the dot of a `*RadioItem` springs in; a checked `CommandItem`, a chosen `Select` or `Combobox` option, the `PhoneField` country menu
|
|
24
|
+
**Checked and radio items draw a mark.** The check of a `*CheckboxItem` draws in and out and the dot of a `*RadioItem` springs in; a checked `CommandItem`, a chosen `Select` or `Combobox` option, the `PhoneField` country menu and the `FilterPresets` menu draw their check in. The mark is `data-slot="option-mark"`, `aria-hidden`, follows the row's text colour and stops moving under reduced motion. Roles, `aria-checked` and keyboard behaviour are unchanged: read `aria-checked` on the item, not the mark.
|
|
25
25
|
|
|
26
26
|
**Chosen and highlighted items look the same everywhere.** In the radio groups of `DropdownMenu`, `ContextMenu` and `Menubar`, and in `Select` and
|
|
27
27
|
`Autocomplete` lists, the one chosen item has a 12 % primary tint, a 3px rounded bar
|
|
@@ -28,7 +28,7 @@ value type each one writes. Everything is imported from
|
|
|
28
28
|
| <img src="../previews/selection-choice-transferlist.webp" width="96" alt=""> | [TransferList](#transferlist) | Two-pane picker: search, counts, select-all, drag between panes |
|
|
29
29
|
| <img src="../previews/selection-choice-sortablelist.webp" width="96" alt=""> | [SortableList](#sortablelist) | Reorderable list: drag or keyboard, announced |
|
|
30
30
|
| <img src="../previews/selection-choice-treeselectfield.webp" width="96" alt=""> | [TreeSelectField](#treeselectfield) | Pick from a tree, single or multiple |
|
|
31
|
-
| <img src="../previews/selection-choice-switcher.webp" width="96" alt=""> | [Switcher](#switcher) | Workspace or
|
|
31
|
+
| <img src="../previews/selection-choice-switcher.webp" width="96" alt=""> | [Switcher](#switcher) | Workspace, establishment or class switcher: menu, search, groups, links |
|
|
32
32
|
|
|
33
33
|
## Select
|
|
34
34
|
|
|
@@ -1125,7 +1125,7 @@ multiple mode).
|
|
|
1125
1125
|
|
|
1126
1126
|

|
|
1127
1127
|
|
|
1128
|
-
|
|
1128
|
+
Switches the workspace, the establishment or the class a page is about. A 44px card trigger (initial or icon tile, title, subtitle, up-down chevron) opens a menu for up to 7 options, and from 8 a panel with a search, groups and a listbox; on a phone it is a bottom sheet. `variant="expressive"` is a pill with a larger panel, "Recent" tiles and soft badges. With `getHref` the options are links.
|
|
1129
1129
|
|
|
1130
1130
|
```tsx
|
|
1131
1131
|
import { Switcher, type SwitcherItem } from '@nxgt/material/components';
|
|
@@ -1138,17 +1138,87 @@ const workspaces: SwitcherItem[] = [
|
|
|
1138
1138
|
|
|
1139
1139
|
export function Workspaces() {
|
|
1140
1140
|
const [value, setValue] = useState('acme');
|
|
1141
|
-
return <Switcher label="
|
|
1141
|
+
return <Switcher label="Workspace" options={workspaces} value={value} onValueChange={setValue} />;
|
|
1142
1142
|
}
|
|
1143
1143
|
```
|
|
1144
1144
|
|
|
1145
|
+
An option with no `icon` draws its `initial` (default: the first letter of its title) in a tile of its `tone`. Establishments take an icon, a tone and a "Manage…" footer:
|
|
1146
|
+
|
|
1147
|
+
```tsx
|
|
1148
|
+
import { Icon, Switcher } from '@nxgt/material/components';
|
|
1149
|
+
|
|
1150
|
+
<Switcher
|
|
1151
|
+
label="Establishment"
|
|
1152
|
+
value={school}
|
|
1153
|
+
onValueChange={setSchool}
|
|
1154
|
+
options={[
|
|
1155
|
+
{ id: 'ljc', title: 'Lycée Joss', subtitle: 'Lycée · Douala', icon: <Icon name="school" />, tone: 'primary' },
|
|
1156
|
+
{ id: 'src', title: 'École La Source', subtitle: 'Primaire · Bafoussam', icon: <Icon name="graduation-cap" />, tone: 'success' },
|
|
1157
|
+
]}
|
|
1158
|
+
footer={{ onSelect: () => navigate('/establishments') }}
|
|
1159
|
+
/>;
|
|
1160
|
+
```
|
|
1161
|
+
|
|
1162
|
+
### Classes: search, groups and links
|
|
1163
|
+
|
|
1164
|
+
Eight options or more (or `searchable`) open a popover with a search field. It is a combobox over a listbox: typing filters on the title, the subtitle and the group (accents and case ignored), the arrows move the active option, Enter chooses it and gives the focus back to the trigger. Options with a `group` are listed under its header, and put the pupil count in the subtitle **or** in `badge`, not both.
|
|
1165
|
+
|
|
1166
|
+
With `getHref` each option is a link, for a switcher that is a navigation (`/classes/6b`): the panel is a `nav` of links with `aria-current="page"` on the chosen one (no `listbox` role), and the arrows move the real focus. Pass your router's link as `linkComponent`, as for `ListTile` and `AccountMenu`:
|
|
1167
|
+
|
|
1168
|
+
```tsx
|
|
1169
|
+
import { Link } from 'react-router';
|
|
1170
|
+
import { Switcher, type AppShellLinkComponent } from '@nxgt/material/components';
|
|
1171
|
+
|
|
1172
|
+
// Hoisted, outside the render: not a new component on every render.
|
|
1173
|
+
const RouterLink: AppShellLinkComponent = ({ href, ...props }) => <Link to={href} {...props} />;
|
|
1174
|
+
|
|
1175
|
+
<Switcher
|
|
1176
|
+
label="Class"
|
|
1177
|
+
value={classId}
|
|
1178
|
+
options={classes} // { id: '6b', title: '6e B', subtitle: 'Mathematics · 26 pupils', group: '6e', tone: 'primary' }
|
|
1179
|
+
getHref={(item) => `/classes/${item.id}`}
|
|
1180
|
+
linkComponent={RouterLink}
|
|
1181
|
+
footer={{ label: 'Manage my classes…', href: '/classes' }}
|
|
1182
|
+
/>;
|
|
1183
|
+
```
|
|
1184
|
+
|
|
1185
|
+
### Expressive
|
|
1186
|
+
|
|
1187
|
+
`variant="expressive"` is a pill that opens a larger panel (always with a search). `recent` lists up to 3 option ids shown as tiles above the groups while nothing is typed; `badge` draws a soft badge after the title. On a phone the sheet is full height with a close button.
|
|
1188
|
+
|
|
1189
|
+
```tsx
|
|
1190
|
+
<Switcher
|
|
1191
|
+
variant="expressive"
|
|
1192
|
+
label="Class"
|
|
1193
|
+
value={classId}
|
|
1194
|
+
onValueChange={setClassId}
|
|
1195
|
+
options={classes.map((c) => ({ ...c, badge: c.pupils }))}
|
|
1196
|
+
recent={['6b', 't1', '4a']}
|
|
1197
|
+
/>
|
|
1198
|
+
```
|
|
1199
|
+
|
|
1200
|
+
A title that does not fit the trigger is cut with an ellipsis: the span carries the full title in `aria-label` (what `expectNoTextOverflow` of `@nxgt/playwright` reads), hovering or focusing the trigger shows it with the subtitle in a tooltip, and the trigger's accessible name is the label, the full title and the subtitle.
|
|
1201
|
+
|
|
1145
1202
|
| Prop | Type | Default | Effect |
|
|
1146
1203
|
| --- | --- | --- | --- |
|
|
1147
|
-
| `options` | `SwitcherItem[]` | — |
|
|
1204
|
+
| `options` | `SwitcherItem[]` | — | see below |
|
|
1148
1205
|
| `value` | `string` | — | the active `id` |
|
|
1149
1206
|
| `onValueChange` | `(value: string) => void` | — | |
|
|
1150
|
-
| `label` | `ReactNode` | — |
|
|
1207
|
+
| `label` | `ReactNode` | — | what is switched: names the trigger, the panel and the list |
|
|
1208
|
+
| `variant` | `'default' \| 'expressive'` | `'default'` | tile trigger and menu, or pill and large panel |
|
|
1209
|
+
| `searchable` | `boolean` | from 8 options (always, expressive) | the search field of the panel; `true` also replaces the menu with the panel |
|
|
1210
|
+
| `recent` | `string[]` | — | up to 3 option ids shown as tiles (expressive) |
|
|
1211
|
+
| `getHref` | `(item) => string \| undefined` | — | link mode; falls back to `item.href` |
|
|
1212
|
+
| `linkComponent` | `LinkComponent` | `<a>` | your router's link: takes `href`, spreads every prop, forwards `ref` |
|
|
1213
|
+
| `footer` | `{ label?, onSelect?, href? }` | — | a "Manage…" button (a link with `href`) at the end of the panel; `label` defaults to `material.switcher.manage` |
|
|
1214
|
+
| `emptyLabel` | `ReactNode` | `material.switcher.empty` | shown when the search matches nothing |
|
|
1215
|
+
| `sheet` | `boolean` | on a phone | `true` always opens a sheet, `false` never |
|
|
1216
|
+
| `name`, button props | `ComponentProps<'button'>` | — | spread on the trigger; `name` is its `data-pw` |
|
|
1217
|
+
|
|
1218
|
+
`SwitcherItem`: `{ id, title, subtitle?, icon?, group?, initial?, tone?, badge?, href?, disabled? }`.
|
|
1219
|
+
|
|
1220
|
+
Strings (the search field, "Recent", "Manage…", the empty and result texts) are `material.switcher.*` keys, in English and French.
|
|
1151
1221
|
|
|
1152
1222
|
**Emits:** `string` (the item `id`). No form wrapper — it switches context,
|
|
1153
1223
|
it is not a form value.
|
|
1154
|
-
**Storybook:** `Selection & choice/Switcher` · **Vue:** `Switcher`
|
|
1224
|
+
**Storybook:** `Selection & choice/Switcher` (and `/Behaviour`) · **Vue:** `Switcher` (the earlier look; the modern one is React only for now)
|
package/docs/guides/i18n.md
CHANGED
|
@@ -275,7 +275,7 @@ children, `Spinner`'s and `ScrollToTop`'s `aria-label`, `LocationMarker`'s
|
|
|
275
275
|
|
|
276
276
|
`Filter variant="bar"` words everything through its own keys,
|
|
277
277
|
overridable like the rest: `material.filter.bar.*` (`label` "Filters" for its
|
|
278
|
-
`search` landmark, `search`, `active` "Active filters" for the chip list,
|
|
278
|
+
`search` landmark, `search`, `search-min` "Type at least {min} character(s) to search" (the hint under the search while it is shorter than `searchMinLength`; a plural), `active` "Active filters" for the chip list,
|
|
279
279
|
`locked` "Locked" and `locked-reason` "Locked: {reason}" (a locked
|
|
280
280
|
chip's description), and a chip's words: `chip` "{field} {operator}
|
|
281
281
|
{value}", `chip-plain`, `remove` "Remove {field}: {value}", `quick-active`;
|
|
@@ -144,6 +144,12 @@ export default function Students({ loaderData }: Route.ComponentProps) {
|
|
|
144
144
|
never leaves you on a page that no longer exists. `serializeFilterQuery`
|
|
145
145
|
copies `into`, it does not change it, and it replaces the search, every `f=`,
|
|
146
146
|
every aliased param and the `reset` ones.
|
|
147
|
+
- **The search on Enter.** Every applied edit is one URL write, hence one
|
|
148
|
+
loader call. `searchApply: 'enter'` (on `Filter`, or `ServerTable`'s
|
|
149
|
+
`filter`) writes the search only when Enter is pressed, and
|
|
150
|
+
`searchMinLength` keeps a too-short text out of the URL; clearing the field
|
|
151
|
+
writes at once. Typing in between writes nothing, so a loader whose every
|
|
152
|
+
read is audited is called once per search.
|
|
147
153
|
- **`resultCount` and `loading`** drive the bar's one live region: it waits
|
|
148
154
|
for `loading` to end, then tells the count once.
|
|
149
155
|
- **A readable URL.** `` `?${written}` `` prints `f=level:in:CE1,CE2`. Passing
|
|
@@ -151,6 +157,12 @@ export default function Students({ loaderData }: Route.ComponentProps) {
|
|
|
151
157
|
re-encodes them (`f=level%3Ain%3ACE1%2CCE2`), which parses back the same. To
|
|
152
158
|
compare a URL you wrote with the one the router hands back, use
|
|
153
159
|
`paramsKey(a) === paramsKey(b)`.
|
|
160
|
+
- **The same options on both sides.** If the loader parses with
|
|
161
|
+
`keepKnownValues: true` (or writes `encoding: 'standard'`), give
|
|
162
|
+
`ServerTable` the same: `filter={{ model, codec: { keepKnownValues: true,
|
|
163
|
+
encoding: 'standard' } }}`. Without it the page drops a condition such as
|
|
164
|
+
`f=level:in:a,zzz` whole and shows no chip, while the loader keeps `a` and
|
|
165
|
+
filters the rows.
|
|
154
166
|
- **Standard encoding.** If your list URLs are already written the
|
|
155
167
|
`URLSearchParams` way (`status=a%2Cb`), pass `encoding: 'standard'` to
|
|
156
168
|
`serializeFilterQuery` (and to `tableFilters` / `withoutFilters`): the params
|
|
Binary file
|