@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.
Files changed (84) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +1 -0
  3. package/dist/{Button-DVeAQorb.js → Button-BAIJ8YvT.js} +1 -1
  4. package/dist/{HoverCardTrigger-VvXPswRz.js → HoverCardTrigger-CKtL8teP.js} +3 -3
  5. package/dist/{camera-CG6WfZNc.js → camera-2UuZVfGS.js} +4 -4
  6. package/dist/components/theme-tokens.css +7 -2
  7. package/dist/{components-B2kSyBK0.js → components-CCrK1Sbt.js} +13373 -13137
  8. package/dist/components.js +8 -8
  9. package/dist/composables.js +3 -3
  10. package/dist/dnd.js +1 -1
  11. package/dist/{form-scope-XhlaF5na.js → form-scope-BLjSnqUf.js} +1 -1
  12. package/dist/{i18n-provider-BBnUUGqM.js → i18n-provider-BpNC9SxV.js} +1 -1
  13. package/dist/i18n.js +4 -4
  14. package/dist/{icon-button-CSPfP615.js → icon-button-5bl9odKW.js} +1 -1
  15. package/dist/lib/components/ui/collections/data-table/data-table.stories.columns.d.ts +3 -1
  16. package/dist/lib/components/ui/collections/data-table/data-table.stories.template.d.ts +1 -1
  17. package/dist/lib/components/ui/collections/facet-group/facet-group-classes.d.ts +18 -0
  18. package/dist/lib/components/ui/collections/facet-group/facet-group.vue.d.ts +47 -0
  19. package/dist/lib/components/ui/collections/facet-group/index.d.ts +2 -0
  20. package/dist/lib/components/ui/collections/index.d.ts +1 -0
  21. package/dist/lib/components/ui/fields/contacts/consts.d.ts +1 -1
  22. package/dist/lib/components/ui/layout/sidebar/sidebar-menu-item.vue.d.ts +4 -3
  23. package/dist/lib/components/ui/menu-item-loading.d.ts +26 -0
  24. package/dist/lib/components/ui/overlays/context-menu/ContextMenuItem.vue.d.ts +4 -2
  25. package/dist/lib/components/ui/overlays/dropdown-menu/DropdownMenuItem.vue.d.ts +9 -3
  26. package/dist/lib/components/ui/overlays/menubar/MenubarItem.vue.d.ts +4 -2
  27. package/dist/lib/composables/use-hidden-input-name.d.ts +12 -0
  28. package/dist/lib/i18n/resources/en/en.d.ts +6 -0
  29. package/dist/lib/i18n/resources/en/material.json.d.ts +7 -1
  30. package/dist/lib/i18n/resources/fr/fr.d.ts +6 -0
  31. package/dist/lib/i18n/resources/fr/material.json.d.ts +7 -1
  32. package/dist/lib/i18n/resources/resources.d.ts +12 -0
  33. package/dist/lib/i18n/translator.d.ts +1 -1
  34. package/dist/lib/nuxt/component-names.d.ts +1 -1
  35. package/dist/lib.js +3 -3
  36. package/dist/main.js +17 -17
  37. package/dist/map.js +4 -4
  38. package/dist/material-vue.css +1 -1
  39. package/dist/{number.utils-Bpo9tUaJ.js → number.utils-C1eB3GDr.js} +427 -427
  40. package/dist/{pdf-outline-sidebar-aQ5Lhbss.js → pdf-outline-sidebar-BUvWHjiE.js} +2 -2
  41. package/dist/{pdf-page-NCmScgMW.js → pdf-page-B57B0uES.js} +1 -1
  42. package/dist/{pdf-page-list-BnvE130d.js → pdf-page-list-BHU7pW0b.js} +2 -2
  43. package/dist/{pdf-reader-CMt9dKZ-.js → pdf-reader-CwTYGXq8.js} +8 -8
  44. package/dist/{pdf-sidebar-BWzX3e0f.js → pdf-sidebar-CtMy8Kw_.js} +3 -3
  45. package/dist/{pdf-thumbnail-sidebar-8nbYsI3d.js → pdf-thumbnail-sidebar-DS0iT3qo.js} +3 -3
  46. package/dist/{pdf-toolbar-DpQMG5rv.js → pdf-toolbar-DL_vCyXG.js} +4 -4
  47. package/dist/pdf.js +2 -2
  48. package/dist/{print-format.utils-oj5kle2P.js → print-format.utils-k5W0GBRF.js} +3 -3
  49. package/dist/{sortable-provider-2czx1jSW.js → sortable-provider-cYkCa6tm.js} +2 -2
  50. package/dist/{stored-language-CKZMMJcz.js → stored-language-DEyPmUzl.js} +14 -2
  51. package/dist/{stx-player-CS1FYHVS.js → stx-player-C_lPkXc6.js} +13 -13
  52. package/dist/{translator-uh5FWiMq.js → translator-B62GlCBp.js} +1 -1
  53. package/dist/{use-heading-spy-CcJfoBA1.js → use-heading-spy-T94lNeNA.js} +21 -21
  54. package/dist/{use-material-translation-C6xccbic.js → use-material-translation-DxU51--g.js} +3 -3
  55. package/docs/components/data-table-filter-and-lists.md +42 -0
  56. package/docs/components/feedback-and-status.md +7 -6
  57. package/docs/components/form-fields.md +1 -1
  58. package/docs/components/navigation-and-layout.md +6 -5
  59. package/docs/components/overlays-and-menus.md +3 -0
  60. package/docs/guides/csp.md +10 -0
  61. package/docs/guides/i18n.md +1 -1
  62. package/docs/guides/ssr.md +8 -0
  63. package/docs/guides/theming.md +29 -6
  64. package/docs/previews/buttons-actions-button.webp +0 -0
  65. package/docs/previews/data-display-avatar.webp +0 -0
  66. package/docs/previews/data-display-badge.webp +0 -0
  67. package/docs/previews/data-display-chip.webp +0 -0
  68. package/docs/previews/data-display-statusindicator.webp +0 -0
  69. package/docs/previews/data-display-timeline.webp +0 -0
  70. package/docs/previews/data-table-filter-lists-facetgroup.webp +0 -0
  71. package/docs/previews/feedback-status-alert.webp +0 -0
  72. package/docs/previews/feedback-status-banner.webp +0 -0
  73. package/docs/previews/feedback-status-circularprogress.webp +0 -0
  74. package/docs/previews/feedback-status-emptystate.webp +0 -0
  75. package/docs/previews/feedback-status-progress.webp +0 -0
  76. package/docs/previews/feedback-status-spinner.webp +0 -0
  77. package/docs/previews/feedback-status-toast.webp +0 -0
  78. package/docs/previews/form-fields-passwordfield.webp +0 -0
  79. package/docs/previews/form-fields-ratingfield.webp +0 -0
  80. package/docs/roadmap.md +5 -0
  81. package/docs/troubleshooting.md +5 -5
  82. package/lib/components/theme-tokens.css +7 -2
  83. package/lib/nuxt/component-names.ts +1 -0
  84. 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 { Hf as n } from "./components-B2kSyBK0.js";
4
- import { t as r } from "./use-material-translation-C6xccbic.js";
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 { Gp as t } from "./components-B2kSyBK0.js";
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 { Hf as t } from "./components-B2kSyBK0.js";
3
- import { t as n } from "./pdf-page-NCmScgMW.js";
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-B2kSyBK0.js";
3
- import { t as n } from "./use-material-translation-C6xccbic.js";
4
- import { t as r } from "./Button-DVeAQorb.js";
5
- import { o as i } from "./HoverCardTrigger-VvXPswRz.js";
6
- import { n as a } from "./pdf-page-NCmScgMW.js";
7
- import { t as o } from "./pdf-page-list-BnvE130d.js";
8
- import { t as s } from "./pdf-sidebar-BWzX3e0f.js";
9
- import { t as c } from "./pdf-toolbar-DpQMG5rv.js";
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-C6xccbic.js";
4
- import { t as r } from "./pdf-outline-sidebar-aQ5Lhbss.js";
5
- import { t as i } from "./pdf-thumbnail-sidebar-8nbYsI3d.js";
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 { Hf as n } from "./components-B2kSyBK0.js";
4
- import { t as r } from "./use-material-translation-C6xccbic.js";
5
- import { t as i } from "./pdf-page-NCmScgMW.js";
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-C6xccbic.js";
4
- import { d as r } from "./Button-DVeAQorb.js";
5
- import { t as i } from "./icon-button-CSPfP615.js";
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-VvXPswRz.js";
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-C6xccbic.js";
2
- import { t as n } from "./Button-DVeAQorb.js";
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-CKZMMJcz.js";
2
- import { r } from "./translator-uh5FWiMq.js";
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 { n as a } from "./number.utils-Bpo9tUaJ.js";
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-C6xccbic.js";
3
- import { t as n } from "./icon-button-CSPfP615.js";
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, Jp as n, Jt as r, Qt as i, Xt as a, Yt as o, en as s, tn as c } from "./components-B2kSyBK0.js";
3
- import { t as l } from "./use-material-translation-C6xccbic.js";
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(a) {
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": a.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
- }, [a.layout === "mini" ? (v(), u(i, { key: 0 })) : (v(), f("div", {
34
+ }, [i.layout === "mini" ? (v(), u(r, { key: 0 })) : (v(), f("div", {
35
35
  key: 1,
36
- class: _(b(e)("grid gap-3", a.showQueue && "@min-[768px]:grid-cols-[minmax(0,1fr)_18rem] @min-[768px]:items-stretch"))
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(n, { variant: "title-medium" }, {
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(n, {
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(r, null, {
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), a.showQueue ? (v(), u(o, {
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 i(e, t) {
102
+ function a(e, t) {
103
103
  n.onTrackChange?.(e, t), r("trackChange", e, t);
104
104
  }
105
- return (t, r) => (v(), u(a, {
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": i
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-CKZMMJcz.js";
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-BBnUUGqM.js";
2
- import { c as t, d as n, f as r, l as i, r as a, u as o } from "./number.utils-Bpo9tUaJ.js";
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: r({
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: r({
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: r({
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: t,
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: n({
305
+ era: o({
306
306
  values: M,
307
307
  defaultWidth: "wide"
308
308
  }),
309
- quarter: n({
309
+ quarter: o({
310
310
  values: N,
311
311
  defaultWidth: "wide",
312
312
  argumentCallback: (e) => e - 1
313
313
  }),
314
- month: n({
314
+ month: o({
315
315
  values: P,
316
316
  defaultWidth: "wide"
317
317
  }),
318
- day: n({
318
+ day: o({
319
319
  values: F,
320
320
  defaultWidth: "wide"
321
321
  }),
322
- dayPeriod: n({
322
+ dayPeriod: o({
323
323
  values: I,
324
324
  defaultWidth: "wide"
325
325
  })
326
326
  },
327
327
  match: {
328
- ordinalNumber: i({
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: o({
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: o({
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: o({
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: o({
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: o({
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 n = e(), r = s(() => n?.language ?? "en"), i = s(() => z[r.value] ?? t);
454
+ let t = e(), n = s(() => t?.language ?? "en"), r = s(() => z[n.value] ?? a);
455
455
  return {
456
456
  get language() {
457
- return r.value;
457
+ return n.value;
458
458
  },
459
459
  get locale() {
460
- return i.value;
460
+ return r.value;
461
461
  },
462
- format: (e, t) => a.format(e, t, i.value)
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-CKZMMJcz.js";
2
- import { a as e } from "./i18n-provider-BBnUUGqM.js";
3
- import { i as t, r as n } from "./translator-uh5FWiMq.js";
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
+ ![FacetGroup](../previews/data-table-filter-lists-facetgroup.webp)
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
  ![Pagination](../previews/data-table-filter-lists-pagination.webp)
@@ -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`): across the bottom they covered what a form keeps there, its
607
- submit button first. A `position` you pass applies on every screen. The server
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` (16px by default);
611
- raise its `top` when a sticky header must stay visible:
612
- `<Toaster :mobile-offset="{ top: 72 }" />`.
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` gives each entry its label as a tooltip **only while it is
94
- collapsed**: expanded (and in the phone menu sheet) the label is on screen
95
- and no tooltip opens. A `SidebarMenuItem` of your own shows the `tooltip` you
96
- pass, collapsed or expanded.
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 tooltips |
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
@@ -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
@@ -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
@@ -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