@nxgt/material-vue 0.39.0 → 0.40.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 +43 -0
- package/README.md +1 -0
- package/dist/{Button-DVeAQorb.js → Button-BAIJ8YvT.js} +1 -1
- package/dist/{HoverCardTrigger-VvXPswRz.js → HoverCardTrigger-CKtL8teP.js} +3 -3
- package/dist/{camera-CG6WfZNc.js → camera-2UuZVfGS.js} +4 -4
- package/dist/components/theme-tokens.css +7 -2
- package/dist/{components-B2kSyBK0.js → components-CCrK1Sbt.js} +13373 -13137
- package/dist/components.js +8 -8
- package/dist/composables.js +3 -3
- package/dist/dnd.js +1 -1
- package/dist/{form-scope-XhlaF5na.js → form-scope-BLjSnqUf.js} +1 -1
- package/dist/{i18n-provider-BBnUUGqM.js → i18n-provider-BpNC9SxV.js} +1 -1
- package/dist/i18n.js +4 -4
- package/dist/{icon-button-CSPfP615.js → icon-button-5bl9odKW.js} +1 -1
- package/dist/lib/components/ui/collections/data-table/data-table.stories.columns.d.ts +3 -1
- package/dist/lib/components/ui/collections/data-table/data-table.stories.template.d.ts +1 -1
- package/dist/lib/components/ui/collections/facet-group/facet-group-classes.d.ts +18 -0
- package/dist/lib/components/ui/collections/facet-group/facet-group.vue.d.ts +47 -0
- package/dist/lib/components/ui/collections/facet-group/index.d.ts +2 -0
- package/dist/lib/components/ui/collections/index.d.ts +1 -0
- package/dist/lib/components/ui/fields/contacts/consts.d.ts +1 -1
- package/dist/lib/components/ui/layout/sidebar/sidebar-menu-item.vue.d.ts +4 -3
- package/dist/lib/components/ui/menu-item-loading.d.ts +26 -0
- package/dist/lib/components/ui/overlays/context-menu/ContextMenuItem.vue.d.ts +4 -2
- package/dist/lib/components/ui/overlays/dropdown-menu/DropdownMenuItem.vue.d.ts +9 -3
- package/dist/lib/components/ui/overlays/menubar/MenubarItem.vue.d.ts +4 -2
- package/dist/lib/composables/use-hidden-input-name.d.ts +12 -0
- package/dist/lib/i18n/resources/en/en.d.ts +6 -0
- package/dist/lib/i18n/resources/en/material.json.d.ts +7 -1
- package/dist/lib/i18n/resources/fr/fr.d.ts +6 -0
- package/dist/lib/i18n/resources/fr/material.json.d.ts +7 -1
- package/dist/lib/i18n/resources/resources.d.ts +12 -0
- package/dist/lib/i18n/translator.d.ts +1 -1
- package/dist/lib/nuxt/component-names.d.ts +1 -1
- package/dist/lib.js +3 -3
- package/dist/main.js +17 -17
- package/dist/map.js +4 -4
- package/dist/material-vue.css +1 -1
- package/dist/{number.utils-Bpo9tUaJ.js → number.utils-C1eB3GDr.js} +427 -427
- package/dist/{pdf-outline-sidebar-aQ5Lhbss.js → pdf-outline-sidebar-BUvWHjiE.js} +2 -2
- package/dist/{pdf-page-NCmScgMW.js → pdf-page-B57B0uES.js} +1 -1
- package/dist/{pdf-page-list-BnvE130d.js → pdf-page-list-BHU7pW0b.js} +2 -2
- package/dist/{pdf-reader-CMt9dKZ-.js → pdf-reader-CwTYGXq8.js} +8 -8
- package/dist/{pdf-sidebar-BWzX3e0f.js → pdf-sidebar-CtMy8Kw_.js} +3 -3
- package/dist/{pdf-thumbnail-sidebar-8nbYsI3d.js → pdf-thumbnail-sidebar-DS0iT3qo.js} +3 -3
- package/dist/{pdf-toolbar-DpQMG5rv.js → pdf-toolbar-DL_vCyXG.js} +4 -4
- package/dist/pdf.js +2 -2
- package/dist/{print-format.utils-oj5kle2P.js → print-format.utils-k5W0GBRF.js} +3 -3
- package/dist/{sortable-provider-2czx1jSW.js → sortable-provider-cYkCa6tm.js} +2 -2
- package/dist/{stored-language-CKZMMJcz.js → stored-language-DEyPmUzl.js} +14 -2
- package/dist/{stx-player-CS1FYHVS.js → stx-player-C_lPkXc6.js} +13 -13
- package/dist/{translator-uh5FWiMq.js → translator-B62GlCBp.js} +1 -1
- package/dist/{use-heading-spy-CcJfoBA1.js → use-heading-spy-T94lNeNA.js} +21 -21
- package/dist/{use-material-translation-C6xccbic.js → use-material-translation-DxU51--g.js} +3 -3
- package/docs/components/data-table-filter-and-lists.md +42 -0
- package/docs/components/feedback-and-status.md +7 -6
- package/docs/components/form-fields.md +1 -1
- package/docs/components/navigation-and-layout.md +6 -5
- package/docs/components/overlays-and-menus.md +3 -0
- package/docs/guides/csp.md +10 -0
- package/docs/guides/i18n.md +1 -1
- package/docs/guides/ssr.md +8 -0
- package/docs/guides/theming.md +29 -6
- package/docs/previews/buttons-actions-button.webp +0 -0
- package/docs/previews/data-display-avatar.webp +0 -0
- package/docs/previews/data-display-badge.webp +0 -0
- package/docs/previews/data-display-chip.webp +0 -0
- package/docs/previews/data-display-statusindicator.webp +0 -0
- package/docs/previews/data-display-timeline.webp +0 -0
- package/docs/previews/data-table-filter-lists-facetgroup.webp +0 -0
- package/docs/previews/feedback-status-alert.webp +0 -0
- package/docs/previews/feedback-status-banner.webp +0 -0
- package/docs/previews/feedback-status-circularprogress.webp +0 -0
- package/docs/previews/feedback-status-emptystate.webp +0 -0
- package/docs/previews/feedback-status-progress.webp +0 -0
- package/docs/previews/feedback-status-spinner.webp +0 -0
- package/docs/previews/feedback-status-toast.webp +0 -0
- package/docs/previews/form-fields-passwordfield.webp +0 -0
- package/docs/previews/form-fields-ratingfield.webp +0 -0
- package/docs/roadmap.md +5 -0
- package/docs/troubleshooting.md +5 -5
- package/lib/components/theme-tokens.css +7 -2
- package/lib/nuxt/component-names.ts +1 -0
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
2
|
import { t } from "./utils-CykWQ0iJ.js";
|
|
3
|
-
import {
|
|
4
|
-
import { t as r } from "./use-material-translation-
|
|
3
|
+
import { Lf as n } from "./components-CCrK1Sbt.js";
|
|
4
|
+
import { t as r } from "./use-material-translation-DxU51--g.js";
|
|
5
5
|
import { Fragment as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, defineComponent as u, normalizeClass as d, normalizeStyle as f, openBlock as p, ref as m, renderList as h, toDisplayString as g, unref as _, withCtx as v } from "vue";
|
|
6
6
|
//#region lib/components/ui/media/pdf-viewer/partials/pdf-outline-row.vue?vue&type=script&setup=true&lang.ts
|
|
7
7
|
var y = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as e } from "./utils-CykWQ0iJ.js";
|
|
2
|
-
import {
|
|
2
|
+
import { Kp as t } from "./components-CCrK1Sbt.js";
|
|
3
3
|
import { computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, defineComponent as s, nextTick as c, normalizeClass as l, normalizeStyle as u, onBeforeUnmount as d, openBlock as f, ref as p, shallowRef as m, unref as h, watch as g } from "vue";
|
|
4
4
|
import { DEFAULT_PAGE_SIZE as _, escapeHtml as v, findTextMatches as y, highlightItemHtml as b, placeholderSize as x, rotatedSize as S } from "@nxgt/material-core/pdf-viewer";
|
|
5
5
|
//#region lib/components/ui/media/pdf-viewer/pdf-note-icons.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
|
-
import {
|
|
3
|
-
import { t as n } from "./pdf-page-
|
|
2
|
+
import { Lf as t } from "./components-CCrK1Sbt.js";
|
|
3
|
+
import { t as n } from "./pdf-page-B57B0uES.js";
|
|
4
4
|
import { Fragment as r, createBlock as i, createElementBlock as a, createElementVNode as o, defineComponent as s, openBlock as c, renderList as l, withCtx as u } from "vue";
|
|
5
5
|
//#region lib/components/ui/media/pdf-viewer/partials/pdf-page-list.vue?vue&type=script&setup=true&lang.ts
|
|
6
6
|
var d = { class: "flex flex-col items-center gap-4 px-4 py-4" }, f = /*@__PURE__*/ s({
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { t as e } from "./utils-CykWQ0iJ.js";
|
|
2
|
-
import { kn as t } from "./components-
|
|
3
|
-
import { t as n } from "./use-material-translation-
|
|
4
|
-
import { t as r } from "./Button-
|
|
5
|
-
import { o as i } from "./HoverCardTrigger-
|
|
6
|
-
import { n as a } from "./pdf-page-
|
|
7
|
-
import { t as o } from "./pdf-page-list-
|
|
8
|
-
import { t as s } from "./pdf-sidebar-
|
|
9
|
-
import { t as c } from "./pdf-toolbar-
|
|
2
|
+
import { kn as t } from "./components-CCrK1Sbt.js";
|
|
3
|
+
import { t as n } from "./use-material-translation-DxU51--g.js";
|
|
4
|
+
import { t as r } from "./Button-BAIJ8YvT.js";
|
|
5
|
+
import { o as i } from "./HoverCardTrigger-CKtL8teP.js";
|
|
6
|
+
import { n as a } from "./pdf-page-B57B0uES.js";
|
|
7
|
+
import { t as o } from "./pdf-page-list-BHU7pW0b.js";
|
|
8
|
+
import { t as s } from "./pdf-sidebar-CtMy8Kw_.js";
|
|
9
|
+
import { t as c } from "./pdf-toolbar-DL_vCyXG.js";
|
|
10
10
|
import { computed as l, createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createTextVNode as m, createVNode as h, defineComponent as g, nextTick as _, normalizeClass as v, onBeforeUnmount as y, onMounted as b, openBlock as x, reactive as S, ref as C, shallowRef as w, toDisplayString as T, toRef as E, unref as D, useId as O, watch as k, withCtx as A } from "vue";
|
|
11
11
|
import { AlertCircle as j, FileX2 as M, KeyRound as N, Loader2 as P } from "@lucide/vue";
|
|
12
12
|
import { pdfSourceKey as F, toPdfjsParams as I } from "@nxgt/material-core/pdf-source";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
2
|
import { t } from "./utils-CykWQ0iJ.js";
|
|
3
|
-
import { t as n } from "./use-material-translation-
|
|
4
|
-
import { t as r } from "./pdf-outline-sidebar-
|
|
5
|
-
import { t as i } from "./pdf-thumbnail-sidebar-
|
|
3
|
+
import { t as n } from "./use-material-translation-DxU51--g.js";
|
|
4
|
+
import { t as r } from "./pdf-outline-sidebar-BUvWHjiE.js";
|
|
5
|
+
import { t as i } from "./pdf-thumbnail-sidebar-DS0iT3qo.js";
|
|
6
6
|
import { createElementBlock as a, createElementVNode as o, createVNode as s, defineComponent as c, normalizeClass as l, openBlock as u, toDisplayString as d, unref as f, useId as p, useTemplateRef as m } from "vue";
|
|
7
7
|
//#region lib/components/ui/media/pdf-viewer/partials/pdf-sidebar.vue?vue&type=script&setup=true&lang.ts
|
|
8
8
|
var h = ["aria-label"], g = ["aria-label"], _ = [
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
2
|
import { t } from "./utils-CykWQ0iJ.js";
|
|
3
|
-
import {
|
|
4
|
-
import { t as r } from "./use-material-translation-
|
|
5
|
-
import { t as i } from "./pdf-page-
|
|
3
|
+
import { Lf as n } from "./components-CCrK1Sbt.js";
|
|
4
|
+
import { t as r } from "./use-material-translation-DxU51--g.js";
|
|
5
|
+
import { t as i } from "./pdf-page-B57B0uES.js";
|
|
6
6
|
import { Fragment as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createVNode as l, defineComponent as u, normalizeClass as d, openBlock as f, renderList as p, toDisplayString as m, unref as h, withCtx as g } from "vue";
|
|
7
7
|
//#region lib/components/ui/media/pdf-viewer/partials/pdf-thumbnail-sidebar.vue?vue&type=script&setup=true&lang.ts
|
|
8
8
|
var _ = ["aria-label"], v = {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { n as e } from "./rolldown-runtime-CWhphoD1.js";
|
|
2
2
|
import { t } from "./utils-CykWQ0iJ.js";
|
|
3
|
-
import { t as n } from "./use-material-translation-
|
|
4
|
-
import { d as r } from "./Button-
|
|
5
|
-
import { t as i } from "./icon-button-
|
|
3
|
+
import { t as n } from "./use-material-translation-DxU51--g.js";
|
|
4
|
+
import { d as r } from "./Button-BAIJ8YvT.js";
|
|
5
|
+
import { t as i } from "./icon-button-5bl9odKW.js";
|
|
6
6
|
import { a, i as o, n as s, o as c, r as l, t as u } from "./DropdownMenuTrigger-C7uYPf_9.js";
|
|
7
|
-
import { o as d } from "./HoverCardTrigger-
|
|
7
|
+
import { o as d } from "./HoverCardTrigger-CKtL8teP.js";
|
|
8
8
|
import { Fragment as f, computed as p, createBlock as m, createCommentVNode as h, createElementBlock as g, createElementVNode as _, createTextVNode as v, createVNode as y, defineComponent as b, nextTick as x, normalizeClass as S, openBlock as C, ref as w, renderList as T, toDisplayString as E, unref as D, useTemplateRef as O, watch as k, withCtx as A } from "vue";
|
|
9
9
|
import { ChevronDown as j, ChevronLeft as M, ChevronRight as N, ChevronUp as P, Download as F, Maximize2 as I, Minimize2 as L, Moon as R, Printer as z, RotateCw as B, Search as V, Sidebar as H, ZoomIn as U, ZoomOut as W } from "@lucide/vue";
|
|
10
10
|
//#region lib/components/ui/media/pdf-viewer/partials/pdf-toolbar-search.vue?vue&type=script&setup=true&lang.ts
|
package/dist/pdf.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as e, t } from "./use-material-translation-
|
|
2
|
-
import { t as n } from "./Button-
|
|
1
|
+
import { n as e, t } from "./use-material-translation-DxU51--g.js";
|
|
2
|
+
import { t as n } from "./Button-BAIJ8YvT.js";
|
|
3
3
|
import { computed as r, createBlock as i, createTextVNode as a, defineComponent as o, getCurrentInstance as s, nextTick as c, onMounted as l, onScopeDispose as u, openBlock as d, ref as f, renderSlot as p, shallowRef as m, toDisplayString as ee, toValue as h, unref as g, watch as te, withCtx as ne } from "vue";
|
|
4
4
|
import { contentDisposition as re, pdfBytesResponse as ie, toWebStream as ae } from "@nxgt/material-core/pdf/http";
|
|
5
5
|
import { badge as oe, dataTable as se, defaultPdfTheme as ce, definePdfDocument as _, divider as v, header as y, heading as b, image as x, keyValue as S, keyValueOf as C, link as w, metric as T, page as E, pageBreak as D, pageNumber as O, pdfDocument as k, resolvePdfColor as A, resolvePdfTheme as j, row as M, section as N, spacer as P, stack as F, table as I, text as L, totals as R } from "@nxgt/material-core/pdf/model";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { i as e, r as t, t as n } from "./stored-language-
|
|
2
|
-
import { r } from "./translator-
|
|
1
|
+
import { i as e, r as t, t as n } from "./stored-language-DEyPmUzl.js";
|
|
2
|
+
import { r } from "./translator-B62GlCBp.js";
|
|
3
3
|
import { t as i } from "./_baseIsEqual-BUD8VQJE.js";
|
|
4
|
-
import {
|
|
4
|
+
import { E as a } from "./number.utils-C1eB3GDr.js";
|
|
5
5
|
import { defineComponent as o, getCurrentInstance as s, h as c, inject as l, provide as u, useId as d } from "vue";
|
|
6
6
|
import { defineStore as f } from "pinia";
|
|
7
7
|
import { invalidFormatMessage as p, sizeMessage as m } from "@nxgt/material-core/zod-issue-messages";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as e } from "./utils-CykWQ0iJ.js";
|
|
2
|
-
import { t } from "./use-material-translation-
|
|
3
|
-
import { t as n } from "./icon-button-
|
|
2
|
+
import { t } from "./use-material-translation-DxU51--g.js";
|
|
3
|
+
import { t as n } from "./icon-button-5bl9odKW.js";
|
|
4
4
|
import { Teleport as r, computed as i, createBlock as a, createCommentVNode as o, createElementBlock as s, createVNode as c, defineComponent as l, inject as u, mergeProps as d, normalizeStyle as f, onUnmounted as p, openBlock as m, provide as h, reactive as g, ref as _, renderSlot as v, toValue as y, unref as b, useAttrs as x, watch as S, watchEffect as C, withCtx as w, withModifiers as T } from "vue";
|
|
5
5
|
import { GripVertical as E } from "@lucide/vue";
|
|
6
6
|
import { Primitive as D } from "reka-ui";
|
|
@@ -129,7 +129,8 @@ var e = {
|
|
|
129
129
|
copy: "Copy",
|
|
130
130
|
copied: "Copied",
|
|
131
131
|
language: "Language",
|
|
132
|
-
"word-wrap": "Word wrap"
|
|
132
|
+
"word-wrap": "Word wrap",
|
|
133
|
+
"load-failed": "The editor could not be loaded."
|
|
133
134
|
},
|
|
134
135
|
"json-viewer": {
|
|
135
136
|
expand: "Expand",
|
|
@@ -754,6 +755,11 @@ var e = {
|
|
|
754
755
|
empty: "No results"
|
|
755
756
|
},
|
|
756
757
|
"option-count": { label: "{count, plural, one {result} other {results}}" },
|
|
758
|
+
"facet-group": {
|
|
759
|
+
name: "{title}, {count, plural, one {# selected} other {# selected}}",
|
|
760
|
+
clear: "Clear",
|
|
761
|
+
"clear-label": "Clear {title}"
|
|
762
|
+
},
|
|
757
763
|
autocomplete: {
|
|
758
764
|
empty: "No option found.",
|
|
759
765
|
add: "Add \"{query}\"",
|
|
@@ -1366,7 +1372,8 @@ var e = {
|
|
|
1366
1372
|
copy: "Copier",
|
|
1367
1373
|
copied: "Copié",
|
|
1368
1374
|
language: "Langage",
|
|
1369
|
-
"word-wrap": "Retour à la ligne"
|
|
1375
|
+
"word-wrap": "Retour à la ligne",
|
|
1376
|
+
"load-failed": "Impossible de charger l'éditeur."
|
|
1370
1377
|
},
|
|
1371
1378
|
"json-viewer": {
|
|
1372
1379
|
expand: "Déplier",
|
|
@@ -1991,6 +1998,11 @@ var e = {
|
|
|
1991
1998
|
empty: "Aucun résultat"
|
|
1992
1999
|
},
|
|
1993
2000
|
"option-count": { label: "{count, plural, one {résultat} other {résultats}}" },
|
|
2001
|
+
"facet-group": {
|
|
2002
|
+
name: "{title}, {count, plural, one {# sélectionné} other {# sélectionnés}}",
|
|
2003
|
+
clear: "Effacer",
|
|
2004
|
+
"clear-label": "Effacer {title}"
|
|
2005
|
+
},
|
|
1994
2006
|
autocomplete: {
|
|
1995
2007
|
empty: "Aucune option.",
|
|
1996
2008
|
add: "Ajouter « {query} »",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as e } from "./utils-CykWQ0iJ.js";
|
|
2
|
-
import { $t as t,
|
|
3
|
-
import { t as l } from "./use-material-translation-
|
|
2
|
+
import { $t as t, Jt as n, Qt as r, Xt as i, Yp as a, Yt as o, en as s, tn as c } from "./components-CCrK1Sbt.js";
|
|
3
|
+
import { t as l } from "./use-material-translation-DxU51--g.js";
|
|
4
4
|
import { createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createTextVNode as m, createVNode as h, defineComponent as g, normalizeClass as _, openBlock as v, toDisplayString as y, unref as b, withCtx as x } from "vue";
|
|
5
5
|
//#region lib/components/ui/media/stx-player/partials/stx-player-frame.vue?vue&type=script&setup=true&lang.ts
|
|
6
6
|
var S = ["data-layout", "aria-label"], C = {
|
|
@@ -19,7 +19,7 @@ var S = ["data-layout", "aria-label"], C = {
|
|
|
19
19
|
Array
|
|
20
20
|
] }
|
|
21
21
|
},
|
|
22
|
-
setup(
|
|
22
|
+
setup(i) {
|
|
23
23
|
let { containerRef: g, state: w } = c();
|
|
24
24
|
function T(e) {
|
|
25
25
|
g.value = e instanceof HTMLElement ? e : null;
|
|
@@ -28,24 +28,24 @@ var S = ["data-layout", "aria-label"], C = {
|
|
|
28
28
|
return (c, l) => (v(), f("section", {
|
|
29
29
|
ref: T,
|
|
30
30
|
"data-slot": "stx-player",
|
|
31
|
-
"data-layout":
|
|
31
|
+
"data-layout": i.layout,
|
|
32
32
|
"aria-label": b(w).current?.title ?? b(E)("material.stx-player.label", "Media player"),
|
|
33
33
|
class: _(b(e)("@container rounded outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50", c.$props.class))
|
|
34
|
-
}, [
|
|
34
|
+
}, [i.layout === "mini" ? (v(), u(r, { key: 0 })) : (v(), f("div", {
|
|
35
35
|
key: 1,
|
|
36
|
-
class: _(b(e)("grid gap-3",
|
|
36
|
+
class: _(b(e)("grid gap-3", i.showQueue && "@min-[768px]:grid-cols-[minmax(0,1fr)_18rem] @min-[768px]:items-stretch"))
|
|
37
37
|
}, [p("div", { class: _(b(e)("bg-card overflow-hidden rounded border", b(w).current?.kind === "audio" && "flex flex-col gap-4 p-6")) }, [
|
|
38
|
-
b(w).current?.kind === "audio" ? (v(), f("div", C, [h(
|
|
38
|
+
b(w).current?.kind === "audio" ? (v(), f("div", C, [h(a, { variant: "title-medium" }, {
|
|
39
39
|
default: x(() => [m(y(b(w).current.title), 1)]),
|
|
40
40
|
_: 1
|
|
41
|
-
}), b(w).current.artist ? (v(), u(
|
|
41
|
+
}), b(w).current.artist ? (v(), u(a, {
|
|
42
42
|
key: 0,
|
|
43
43
|
class: "text-muted-foreground"
|
|
44
44
|
}, {
|
|
45
45
|
default: x(() => [m(y(b(w).current.artist) + " " + y(b(w).current.album ? ` · ${b(w).current.album}` : ""), 1)]),
|
|
46
46
|
_: 1
|
|
47
47
|
})) : d("", !0)])) : d("", !0),
|
|
48
|
-
h(
|
|
48
|
+
h(n, null, {
|
|
49
49
|
default: x(() => [b(w).current?.kind === "audio" ? d("", !0) : (v(), u(s, {
|
|
50
50
|
key: 0,
|
|
51
51
|
tone: "overlay"
|
|
@@ -62,7 +62,7 @@ var S = ["data-layout", "aria-label"], C = {
|
|
|
62
62
|
trailing: x(() => [h(t, { tone: "surface" })]),
|
|
63
63
|
_: 1
|
|
64
64
|
})) : d("", !0)
|
|
65
|
-
], 2),
|
|
65
|
+
], 2), i.showQueue ? (v(), u(o, {
|
|
66
66
|
key: 0,
|
|
67
67
|
class: "min-h-72"
|
|
68
68
|
})) : d("", !0)], 2))], 10, S));
|
|
@@ -99,16 +99,16 @@ var S = ["data-layout", "aria-label"], C = {
|
|
|
99
99
|
emits: ["trackChange"],
|
|
100
100
|
setup(e, { emit: t }) {
|
|
101
101
|
let n = e, r = t;
|
|
102
|
-
function
|
|
102
|
+
function a(e, t) {
|
|
103
103
|
n.onTrackChange?.(e, t), r("trackChange", e, t);
|
|
104
104
|
}
|
|
105
|
-
return (t, r) => (v(), u(
|
|
105
|
+
return (t, r) => (v(), u(i, {
|
|
106
106
|
tracks: e.tracks,
|
|
107
107
|
"current-index": e.currentIndex,
|
|
108
108
|
"default-index": e.defaultIndex,
|
|
109
109
|
"auto-play": e.autoPlay,
|
|
110
110
|
loop: e.loop,
|
|
111
|
-
"on-track-change":
|
|
111
|
+
"on-track-change": a
|
|
112
112
|
}, {
|
|
113
113
|
default: x(() => [h(w, {
|
|
114
114
|
layout: e.layout,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as e, i as t, r as n, t as r } from "./stored-language-
|
|
1
|
+
import { a as e, i as t, r as n, t as r } from "./stored-language-DEyPmUzl.js";
|
|
2
2
|
import { t as i } from "./get-CTzJAwfc.js";
|
|
3
3
|
//#region ../../node_modules/@formatjs/fast-memoize/index.js
|
|
4
4
|
function a(e, t) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as e } from "./i18n-provider-
|
|
2
|
-
import { c as t, d as n,
|
|
1
|
+
import { a as e } from "./i18n-provider-BpNC9SxV.js";
|
|
2
|
+
import { c as t, d as n, l as r, n as i, s as a, u as o } from "./number.utils-C1eB3GDr.js";
|
|
3
3
|
import { computed as s, getCurrentInstance as c, inject as l, onMounted as u, ref as d, shallowRef as f, toValue as p, watch as m } from "vue";
|
|
4
4
|
import { injectConfigProviderContext as h } from "reka-ui";
|
|
5
5
|
import { useIntersectionObserver as g, useMediaQuery as _, useSSRWidth as v, useStorage as y } from "@vueuse/core";
|
|
@@ -110,7 +110,7 @@ var D = {
|
|
|
110
110
|
let r, i = D[e];
|
|
111
111
|
return r = typeof i == "string" ? i : t === 1 ? i.one : i.other.replace("{{count}}", String(t)), n?.addSuffix ? n.comparison && n.comparison > 0 ? "dans " + r : "il y a " + r : r;
|
|
112
112
|
}, k = {
|
|
113
|
-
date:
|
|
113
|
+
date: n({
|
|
114
114
|
formats: {
|
|
115
115
|
full: "EEEE d MMMM y",
|
|
116
116
|
long: "d MMMM y",
|
|
@@ -119,7 +119,7 @@ var D = {
|
|
|
119
119
|
},
|
|
120
120
|
defaultWidth: "full"
|
|
121
121
|
}),
|
|
122
|
-
time:
|
|
122
|
+
time: n({
|
|
123
123
|
formats: {
|
|
124
124
|
full: "HH:mm:ss zzzz",
|
|
125
125
|
long: "HH:mm:ss z",
|
|
@@ -128,7 +128,7 @@ var D = {
|
|
|
128
128
|
},
|
|
129
129
|
defaultWidth: "full"
|
|
130
130
|
}),
|
|
131
|
-
dateTime:
|
|
131
|
+
dateTime: n({
|
|
132
132
|
formats: {
|
|
133
133
|
full: "{{date}} 'à' {{time}}",
|
|
134
134
|
long: "{{date}} 'à' {{time}}",
|
|
@@ -290,7 +290,7 @@ var D = {
|
|
|
290
290
|
], a;
|
|
291
291
|
return a = n === 1 ? r && i.includes(r) ? "ère" : "er" : "ème", n + a;
|
|
292
292
|
}, R = ["MMM", "MMMM"], z = {
|
|
293
|
-
en:
|
|
293
|
+
en: a,
|
|
294
294
|
fr: {
|
|
295
295
|
code: "fr",
|
|
296
296
|
formatDistance: O,
|
|
@@ -302,35 +302,35 @@ var D = {
|
|
|
302
302
|
value: "d"
|
|
303
303
|
} : e),
|
|
304
304
|
ordinalNumber: L,
|
|
305
|
-
era:
|
|
305
|
+
era: o({
|
|
306
306
|
values: M,
|
|
307
307
|
defaultWidth: "wide"
|
|
308
308
|
}),
|
|
309
|
-
quarter:
|
|
309
|
+
quarter: o({
|
|
310
310
|
values: N,
|
|
311
311
|
defaultWidth: "wide",
|
|
312
312
|
argumentCallback: (e) => e - 1
|
|
313
313
|
}),
|
|
314
|
-
month:
|
|
314
|
+
month: o({
|
|
315
315
|
values: P,
|
|
316
316
|
defaultWidth: "wide"
|
|
317
317
|
}),
|
|
318
|
-
day:
|
|
318
|
+
day: o({
|
|
319
319
|
values: F,
|
|
320
320
|
defaultWidth: "wide"
|
|
321
321
|
}),
|
|
322
|
-
dayPeriod:
|
|
322
|
+
dayPeriod: o({
|
|
323
323
|
values: I,
|
|
324
324
|
defaultWidth: "wide"
|
|
325
325
|
})
|
|
326
326
|
},
|
|
327
327
|
match: {
|
|
328
|
-
ordinalNumber:
|
|
328
|
+
ordinalNumber: t({
|
|
329
329
|
matchPattern: /^(\d+)(ième|ère|ème|er|e)?/i,
|
|
330
330
|
parsePattern: /\d+/i,
|
|
331
331
|
valueCallback: (e) => parseInt(e)
|
|
332
332
|
}),
|
|
333
|
-
era:
|
|
333
|
+
era: r({
|
|
334
334
|
matchPatterns: {
|
|
335
335
|
narrow: /^(av\.J\.C|ap\.J\.C|ap\.J\.-C)/i,
|
|
336
336
|
abbreviated: /^(av\.J\.-C|av\.J-C|apr\.J\.-C|apr\.J-C|ap\.J-C)/i,
|
|
@@ -340,7 +340,7 @@ var D = {
|
|
|
340
340
|
parsePatterns: { any: [/^av/i, /^ap/i] },
|
|
341
341
|
defaultParseWidth: "any"
|
|
342
342
|
}),
|
|
343
|
-
quarter:
|
|
343
|
+
quarter: r({
|
|
344
344
|
matchPatterns: {
|
|
345
345
|
narrow: /^T?[1234]/i,
|
|
346
346
|
abbreviated: /^[1234](er|ème|e)? trim\.?/i,
|
|
@@ -356,7 +356,7 @@ var D = {
|
|
|
356
356
|
defaultParseWidth: "any",
|
|
357
357
|
valueCallback: (e) => e + 1
|
|
358
358
|
}),
|
|
359
|
-
month:
|
|
359
|
+
month: r({
|
|
360
360
|
matchPatterns: {
|
|
361
361
|
narrow: /^[jfmasond]/i,
|
|
362
362
|
abbreviated: /^(janv|févr|mars|avr|mai|juin|juill|juil|août|sept|oct|nov|déc)\.?/i,
|
|
@@ -395,7 +395,7 @@ var D = {
|
|
|
395
395
|
},
|
|
396
396
|
defaultParseWidth: "any"
|
|
397
397
|
}),
|
|
398
|
-
day:
|
|
398
|
+
day: r({
|
|
399
399
|
matchPatterns: {
|
|
400
400
|
narrow: /^[lmjvsd]/i,
|
|
401
401
|
short: /^(di|lu|ma|me|je|ve|sa)/i,
|
|
@@ -425,7 +425,7 @@ var D = {
|
|
|
425
425
|
},
|
|
426
426
|
defaultParseWidth: "any"
|
|
427
427
|
}),
|
|
428
|
-
dayPeriod:
|
|
428
|
+
dayPeriod: r({
|
|
429
429
|
matchPatterns: {
|
|
430
430
|
narrow: /^(a|p|minuit|midi|mat\.?|ap\.?m\.?|soir|nuit)/i,
|
|
431
431
|
any: /^([ap]\.?\s?m\.?|du matin|de l'après[-\s]midi|du soir|de la nuit)/i
|
|
@@ -451,15 +451,15 @@ var D = {
|
|
|
451
451
|
}
|
|
452
452
|
};
|
|
453
453
|
function B() {
|
|
454
|
-
let
|
|
454
|
+
let t = e(), n = s(() => t?.language ?? "en"), r = s(() => z[n.value] ?? a);
|
|
455
455
|
return {
|
|
456
456
|
get language() {
|
|
457
|
-
return
|
|
457
|
+
return n.value;
|
|
458
458
|
},
|
|
459
459
|
get locale() {
|
|
460
|
-
return
|
|
460
|
+
return r.value;
|
|
461
461
|
},
|
|
462
|
-
format: (e, t) =>
|
|
462
|
+
format: (e, t) => i.format(e, t, r.value)
|
|
463
463
|
};
|
|
464
464
|
}
|
|
465
465
|
//#endregion
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import "./stored-language-
|
|
2
|
-
import { a as e } from "./i18n-provider-
|
|
3
|
-
import { i as t, r as n } from "./translator-
|
|
1
|
+
import "./stored-language-DEyPmUzl.js";
|
|
2
|
+
import { a as e } from "./i18n-provider-BpNC9SxV.js";
|
|
3
|
+
import { i as t, r as n } from "./translator-B62GlCBp.js";
|
|
4
4
|
//#region lib/i18n/translate-material.ts
|
|
5
5
|
function r(e, r, i, a) {
|
|
6
6
|
if (e) for (let t of /* @__PURE__ */ new Set([e, e.split("-")[0]])) {
|
|
@@ -15,6 +15,7 @@ each other, so either can be used alone.
|
|
|
15
15
|
| <img src="../previews/data-table-filter-lists-datatable.webp" width="96" alt=""> | [DataTable](#datatable) | TanStack Table v9 with sorting, selection, expansion and pagination, client-side or one server page at a time |
|
|
16
16
|
| <img src="../previews/data-table-filter-lists-filter.webp" width="96" alt=""> | [Filter](#filter) | Schema-driven filters with chips, presets and persistence |
|
|
17
17
|
| <img src="../previews/data-table-filter-lists-filter.webp" width="96" alt=""> | [FilterInline, FilterPopover…](#filterinline-filterpopover-filterdialog-filtersheet-filterdrawer) | The filter panel inline or in an overlay |
|
|
18
|
+
| <img src="../previews/data-table-filter-lists-facetgroup.webp" width="96" alt=""> | [FacetGroup](#facetgroup) | A collapsible facet: a title, a count Badge, Clear and the values |
|
|
18
19
|
| <img src="../previews/data-table-filter-lists-pagination.webp" width="96" alt=""> | [Pagination](#pagination) | Pagination primitives |
|
|
19
20
|
| <img src="../previews/data-table-filter-lists-tree.webp" width="96" alt=""> | [Tree](#tree) | Expandable tree with selection and keyboard navigation |
|
|
20
21
|
| <img src="../previews/data-table-filter-lists-drag-and-drop.webp" width="96" alt=""> | [Drag and drop](#drag-and-drop) | `DndProvider`, `Sortable` and friends |
|
|
@@ -515,6 +516,47 @@ above shows `FilterPopover` open; every variant has its own story.
|
|
|
515
516
|
|
|
516
517
|
---
|
|
517
518
|
|
|
519
|
+
## FacetGroup
|
|
520
|
+
|
|
521
|
+

|
|
522
|
+
|
|
523
|
+
A collapsible facet: a header button with the title, a count Badge of the active values and a chevron, over the values. It is the building block of a facets panel.
|
|
524
|
+
|
|
525
|
+
```vue
|
|
526
|
+
<script setup lang="ts">
|
|
527
|
+
import { ref } from 'vue';
|
|
528
|
+
import { CheckboxGroup, FacetGroup } from '@nxgt/material-vue/components';
|
|
529
|
+
|
|
530
|
+
const levels = ref(['ce1']);
|
|
531
|
+
const options = [
|
|
532
|
+
{ value: 'ce1', label: 'CE1', count: 24 },
|
|
533
|
+
{ value: 'ce2', label: 'CE2', count: 10 },
|
|
534
|
+
];
|
|
535
|
+
</script>
|
|
536
|
+
|
|
537
|
+
<template>
|
|
538
|
+
<FacetGroup title="Level" :active-count="levels.length" @clear="levels = []">
|
|
539
|
+
<CheckboxGroup v-model="levels" aria-label="Level" orientation="vertical" :options="options" />
|
|
540
|
+
</FacetGroup>
|
|
541
|
+
</template>
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
| Prop | Type | Default | Effect |
|
|
545
|
+
| --- | --- | --- | --- |
|
|
546
|
+
| `title` | `string` | — | the facet's name, in the header; a string, because it builds the accessible names |
|
|
547
|
+
| `activeCount` | `number` | `0` | how many values are active: the count Badge (hidden at 0) and the toggle's name |
|
|
548
|
+
| `@clear` | `() => void` | — | the "Clear" button shows only with a listener and while `activeCount > 0`; the focus then goes to the toggle |
|
|
549
|
+
| `v-model:open` / `defaultOpen` | `boolean` / `boolean` | uncontrolled, open | controlled or not |
|
|
550
|
+
| `density` | `'comfortable' \| 'compact'` | `'comfortable'` | as [DataTable](#datatable)'s: a 40px header, 28px compact; `data-density`, styled with classes |
|
|
551
|
+
| `headingLevel` | `2 \| 3 \| 4 \| 5 \| 6` | `3` | the heading around the toggle |
|
|
552
|
+
| default slot | — | — | the values, typically a `CheckboxGroup` with option `count`s |
|
|
553
|
+
|
|
554
|
+
The toggle is a disclosure (`aria-expanded`, `aria-controls`) inside a heading. With active values its name is "Level, 2 selected" (`material.facet-group.name`, an ICU plural: "Level, 2 sélectionnés" in French); the Badge is decorative. "Clear" is named "Clear Level" (`material.facet-group.clear-label`) and is a sibling of the toggle, never inside it. The chevron turns over unless the user prefers reduced motion; every target is at least 24px, also when compact.
|
|
555
|
+
|
|
556
|
+
**Storybook:** `Data table, filter & lists/FacetGroup` · **React:** `FacetGroup`
|
|
557
|
+
|
|
558
|
+
---
|
|
559
|
+
|
|
518
560
|
## Pagination
|
|
519
561
|
|
|
520
562
|

|
|
@@ -92,7 +92,7 @@ const open = ref(true);
|
|
|
92
92
|
| --- | --- | --- | --- |
|
|
93
93
|
| `tone` | `'info' \| 'success' \| 'warning' \| 'error'` | `'info'` | colours and the default icon |
|
|
94
94
|
| `#icon` slot | — | the tone's icon | replaces the default icon |
|
|
95
|
-
| `#action` slot | — | — | rendered at the end of the banner |
|
|
95
|
+
| `#action` slot | — | — | rendered at the end of the banner; under `sm` it drops below the text, in line with it |
|
|
96
96
|
| `dismissible` | `boolean` | `false` | shows a close button that emits `dismiss`; the banner does not hide itself |
|
|
97
97
|
|
|
98
98
|
Where React shows the close button when `onDismiss` is passed, Vue asks for
|
|
@@ -603,13 +603,14 @@ is vue-sonner's own `toast`, for anything the presets do not cover.
|
|
|
603
603
|
|
|
604
604
|
**On a phone** (under 600px wide, where vue-sonner lays toasts out across the
|
|
605
605
|
screen), a `Toaster` with no `position` shows its toasts at the top
|
|
606
|
-
(`top-center`)
|
|
607
|
-
|
|
606
|
+
(`top-center`), 80px down so the app shell's sticky bar (menu button, title,
|
|
607
|
+
account control) stays reachable: across the bottom they covered what a form
|
|
608
|
+
keeps there, its submit button first, and at the very top that bar. A `position` you pass applies on every screen. The server
|
|
608
609
|
and the client's first render answer for a desktop (`bottom-right`, or for the
|
|
609
610
|
width `provideSSRWidth()` gives), and a phone moves the toasts to the top once
|
|
610
|
-
mounted. The phone offset is vue-sonner's `mobile-offset`
|
|
611
|
-
|
|
612
|
-
`<Toaster :mobile-offset="{ top:
|
|
611
|
+
mounted. The phone offset is vue-sonner's `mobile-offset`, `{ top: 80 }` by default
|
|
612
|
+
when no `position` is given; pass your own for a taller header:
|
|
613
|
+
`<Toaster :mobile-offset="{ top: 96 }" />`.
|
|
613
614
|
|
|
614
615
|
```vue
|
|
615
616
|
<Toaster /> <!-- bottom-right on a desktop, top-center on a phone -->
|
|
@@ -1045,7 +1045,7 @@ const notify = ref(true);
|
|
|
1045
1045
|
| `placeholder` | `string` | — | text inside the bordered row; with it, `label` sits above the row |
|
|
1046
1046
|
| `label` | `string` | — | without `placeholder`, it is the row text instead |
|
|
1047
1047
|
| `helper-text` | `string` | — | line under the row (or under the bare switch), with or without `placeholder` |
|
|
1048
|
-
| `error`, `required`, `disabled` | `boolean` | — | the row's state; `error` also sets `aria-invalid` on the `switch` (an `aria-invalid` you pass wins), `required` also sets `aria-required` and, with a `name` inside a `<form>`, the hidden input's `required` (an unchecked switch then blocks native submit) |
|
|
1048
|
+
| `error`, `required`, `disabled` | `boolean` | — | the row's state; `error` also sets `aria-invalid` on the `switch` (an `aria-invalid` you pass wins), `required` also sets `aria-required` and, with a `name` inside a `<form>`, the hidden input's `required` (after mount, an unchecked switch then blocks native submit; before it, the server sends no hidden input) |
|
|
1049
1049
|
|
|
1050
1050
|
The row's text is the switch's `<label>`, so a labelled switch has an
|
|
1051
1051
|
accessible name (`getByRole('switch', { name: 'Newsletter' })`) and clicking the
|
|
@@ -90,10 +90,11 @@ to the router's root, so a history base is kept; a crumb with params links to
|
|
|
90
90
|
its path with them filled in) and the current page is text with
|
|
91
91
|
`aria-current="page"`.
|
|
92
92
|
|
|
93
|
-
`AppSidebar`
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
pass,
|
|
93
|
+
`AppSidebar` entries have **no tooltip**: the collapsed rail shows each label
|
|
94
|
+
under its icon, and the expanded sidebar (and the phone menu sheet) beside it,
|
|
95
|
+
so a tooltip would only repeat it and cover the entry above. A
|
|
96
|
+
`SidebarMenuItem` of your own shows the `tooltip` you pass, to the right of the
|
|
97
|
+
entry, and an icon-only one (no label) falls back to its `aria-label`.
|
|
97
98
|
|
|
98
99
|
**Storybook:** `Navigation & layout/AppShell` · **React:** `ActivityLayout`, `ActivityContent`, `AppSidebar`, `AppHeader`, `AppBreadcrumb`
|
|
99
100
|
|
|
@@ -222,7 +223,7 @@ real link, a plain `<a>` unless you pass `link-component` (given the `href`):
|
|
|
222
223
|
|
|
223
224
|
| Prop | Type | Default | Effect |
|
|
224
225
|
| --- | --- | --- | --- |
|
|
225
|
-
| `v-model:expanded` | `boolean` | `false` | labels beside the icons; collapsed shows icons with
|
|
226
|
+
| `v-model:expanded` | `boolean` | `false` | labels beside the icons; collapsed shows icons with their labels under them, and no tooltip |
|
|
226
227
|
| `withToggleIcon` | `boolean` | `false` | built-in expand / collapse button, shown on hover or while focus is inside the sidebar, named "Toggle sidebar" (`material.sidebar.toggle`) with `aria-expanded` |
|
|
227
228
|
|
|
228
229
|
**Emits:** `update:expanded` with `boolean`.
|
|
@@ -453,6 +453,7 @@ Parts: `DropdownMenu`, `DropdownMenuTrigger`, `DropdownMenuContent`,
|
|
|
453
453
|
| Prop | Type | Default | Effect |
|
|
454
454
|
| --- | --- | --- | --- |
|
|
455
455
|
| `variant` (`DropdownMenuItem`) | `'default' \| 'error'` | `'default'` | error colour for a destructive item; `'destructive'` is a deprecated alias of `'error'`; both render `data-variant="error"`, so style or test with `[data-variant=error]` |
|
|
456
|
+
| `loading` (`DropdownMenuItem`) | `boolean` | `false` | busy item, e.g. a sign-out in flight: it stays focusable (not `disabled`), is `aria-busy` and `aria-disabled`, shows a spinner in place of its icon, and a selection is ignored: `@select` does not fire and the menu stays open; if `disabled` is set too, `loading` wins (the item is not disabled) |
|
|
456
457
|
| `inset` (item, label, sub-trigger) | `boolean` | — | indents to line up with checkbox and radio items |
|
|
457
458
|
| `@select` (`DropdownMenuItem`) | `(event: Event) => void` | — | the item's action; `event.preventDefault()` keeps the menu open |
|
|
458
459
|
| `default-open` / `v-model:open`, `modal` (`DropdownMenu`) | `boolean` | —, `false` | open state; `modal` brings back the scroll lock, swallowed outside clicks and an `aria-hidden`, `inert` page behind the menu |
|
|
@@ -510,6 +511,7 @@ Parts: `ContextMenu`, `ContextMenuTrigger`, `ContextMenuContent`,
|
|
|
510
511
|
| Prop | Type | Default | Effect |
|
|
511
512
|
| --- | --- | --- | --- |
|
|
512
513
|
| `variant` (`ContextMenuItem`) | `'default' \| 'error'` | `'default'` | error colour for a destructive item; `'destructive'` is a deprecated alias of `'error'` |
|
|
514
|
+
| `loading` (`ContextMenuItem`) | `boolean` | `false` | busy item, e.g. a sign-out in flight: it stays focusable (not `disabled`), is `aria-busy` and `aria-disabled`, shows a spinner in place of its icon, and a selection is ignored: `@select` does not fire and the menu stays open; if `disabled` is set too, `loading` wins (the item is not disabled) |
|
|
513
515
|
| `inset` (item, label, sub-trigger) | `boolean` | — | indents to line up with checkbox and radio items |
|
|
514
516
|
| `@update:open` (`ContextMenu`) | `(open: boolean) => void` | — | there is no `open` prop: only a right click (or long press) opens it |
|
|
515
517
|
|
|
@@ -570,6 +572,7 @@ Parts: `Menubar`, `MenubarMenu`, `MenubarTrigger`, `MenubarContent`,
|
|
|
570
572
|
| --- | --- | --- | --- |
|
|
571
573
|
| `default-value` / `v-model` (`Menubar`) | `string` | — | the open menu, by its `MenubarMenu` `value` |
|
|
572
574
|
| `variant` (`MenubarItem`) | `'default' \| 'error'` | — | error colour for a destructive item, as in the other menus; `'destructive'` is a deprecated alias of `'error'` |
|
|
575
|
+
| `loading` (`MenubarItem`) | `boolean` | `false` | busy item, e.g. a sign-out in flight: it stays focusable (not `disabled`), is `aria-busy` and `aria-disabled`, shows a spinner in place of its icon, and a selection is ignored: `@select` does not fire and the menu stays open; if `disabled` is set too, `loading` wins (the item is not disabled) |
|
|
573
576
|
| `inset` (`MenubarItem`) | `boolean` | — | indents to line up with checkbox and radio items |
|
|
574
577
|
|
|
575
578
|
Once one menu is open, moving the pointer across triggers opens the others, as
|
package/docs/guides/csp.md
CHANGED
|
@@ -60,6 +60,16 @@ configuration through `globalThis`, and the app and the library share one copy).
|
|
|
60
60
|
package manager (pnpm) does not let the app import a package it does not
|
|
61
61
|
list, so install what you import: `bun add zod reka-ui @monaco-editor/loader`.
|
|
62
62
|
|
|
63
|
+
## The hidden form inputs
|
|
64
|
+
|
|
65
|
+
`Checkbox`, `Switch`, `RadioGroup` and `Select` no longer render their hidden
|
|
66
|
+
form input on the server (Reka rendered it there with an inline `style`), so
|
|
67
|
+
those four need no `style-src-attr` for it. Other components still send inline
|
|
68
|
+
`style` attributes (the list is softistx/nxgt-material#596), so the
|
|
69
|
+
recommended policy above keeps `style-src-attr 'unsafe-inline'`. A page
|
|
70
|
+
without JavaScript, or a form posted natively before hydration, carries none
|
|
71
|
+
of these four controls' values: the input appears after mount.
|
|
72
|
+
|
|
63
73
|
## NonceProvider
|
|
64
74
|
|
|
65
75
|
Render `NonceProvider` once, at the root, with this request's nonce, on the
|
package/docs/guides/i18n.md
CHANGED
|
@@ -292,7 +292,7 @@ the `LocationPreview` trigger (`material.map.preview` / `preview-named`),
|
|
|
292
292
|
(`material['duration-field']['hours-label']` / `minutes-label`), and
|
|
293
293
|
the delete button of the deprecated `ContactItem` / `OpeningHoursItem`
|
|
294
294
|
(`material.contacts.buttons.remove`,
|
|
295
|
-
`material['opening-hours'].buttons.remove`). When the form of a
|
|
295
|
+
`material['opening-hours'].buttons.remove`). `FacetGroup`'s toggle is named "Level, 2 selected" / "Level, 2 sélectionnés" (`material.facet-group.name`, an ICU plural over `{title}` and `{count}`) and its Clear button "Clear Level" / "Effacer Level" (`material.facet-group.clear-label`, with the visible `material.facet-group.clear`). When the form of a
|
|
296
296
|
`ConfirmationDialog` with `form-options` cannot be loaded, it says so in the
|
|
297
297
|
form's place: "The form could not be loaded." / "Le formulaire n’a pas pu être
|
|
298
298
|
chargé." (`material.confirm-dialog.form-failed`). The keys and the French are the
|
package/docs/guides/ssr.md
CHANGED
|
@@ -179,6 +179,14 @@ function clientOnly<P extends object>(component: Component<P>): Component<P>;
|
|
|
179
179
|
`@nxgt/material-vue/composables` is a `Ref<boolean>` that is `false` on the
|
|
180
180
|
server and the first render, then `true`.
|
|
181
181
|
|
|
182
|
+
## Hidden form inputs
|
|
183
|
+
|
|
184
|
+
`Checkbox`, `Switch`, `RadioGroup` and `Select` create their hidden form input
|
|
185
|
+
after mount, never in the server HTML (Reka put an inline `style` on it, which a
|
|
186
|
+
strict CSP blocks). Before hydration a native form post therefore carries none
|
|
187
|
+
of these four controls' values; submit through the client, or wait for
|
|
188
|
+
hydration. See [csp.md](csp.md#the-hidden-form-inputs).
|
|
189
|
+
|
|
182
190
|
## Hydration
|
|
183
191
|
|
|
184
192
|
**Never name an SVG with `<svg><title>`.** Some SSR setups treat `<title>` as
|