@nxgt/material-vue 0.38.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 (94) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +1 -0
  3. package/dist/{Button-5UyKA-x_.js → Button-BAIJ8YvT.js} +1 -1
  4. package/dist/{DropdownMenuTrigger-BsuyNVzV.js → DropdownMenuTrigger-C7uYPf_9.js} +36 -36
  5. package/dist/{HoverCardTrigger-CmCDiTn8.js → HoverCardTrigger-CKtL8teP.js} +122 -120
  6. package/dist/{camera-BWzF8sOW.js → camera-2UuZVfGS.js} +4 -4
  7. package/dist/components/base-content.css +64 -4
  8. package/dist/components/theme-tokens.css +7 -2
  9. package/dist/{components-B_s5oxUp.js → components-CCrK1Sbt.js} +13631 -13383
  10. package/dist/components.js +8 -8
  11. package/dist/composables.js +3 -3
  12. package/dist/dnd.js +1 -1
  13. package/dist/{form-scope-UzoU38db.js → form-scope-BLjSnqUf.js} +1 -1
  14. package/dist/{i18n-provider-BEvjls8b.js → i18n-provider-BpNC9SxV.js} +1 -1
  15. package/dist/i18n.js +4 -4
  16. package/dist/{icon-button-DhqJE6Ej.js → icon-button-5bl9odKW.js} +1 -1
  17. package/dist/in-dialog-Blhwwbyb.js +31 -0
  18. package/dist/lib/components/ui/collections/data-table/data-table-density.d.ts +15 -0
  19. package/dist/lib/components/ui/collections/data-table/data-table.stories.columns.d.ts +49 -0
  20. package/dist/lib/components/ui/collections/data-table/data-table.stories.template.d.ts +1 -0
  21. package/dist/lib/components/ui/collections/data-table/index.d.ts +1 -1
  22. package/dist/lib/components/ui/collections/data-table/types.d.ts +7 -0
  23. package/dist/lib/components/ui/collections/facet-group/facet-group-classes.d.ts +18 -0
  24. package/dist/lib/components/ui/collections/facet-group/facet-group.vue.d.ts +47 -0
  25. package/dist/lib/components/ui/collections/facet-group/index.d.ts +2 -0
  26. package/dist/lib/components/ui/collections/index.d.ts +1 -0
  27. package/dist/lib/components/ui/fields/contacts/consts.d.ts +1 -1
  28. package/dist/lib/components/ui/layout/sidebar/sidebar-menu-item.vue.d.ts +4 -3
  29. package/dist/lib/components/ui/menu-item-loading.d.ts +26 -0
  30. package/dist/lib/components/ui/overlays/context-menu/ContextMenuItem.vue.d.ts +4 -2
  31. package/dist/lib/components/ui/overlays/dialog/in-dialog.d.ts +12 -0
  32. package/dist/lib/components/ui/overlays/dropdown-menu/DropdownMenuItem.vue.d.ts +9 -3
  33. package/dist/lib/components/ui/overlays/menubar/MenubarItem.vue.d.ts +4 -2
  34. package/dist/lib/composables/use-hidden-input-name.d.ts +12 -0
  35. package/dist/lib/i18n/resources/en/en.d.ts +7 -0
  36. package/dist/lib/i18n/resources/en/material.json.d.ts +8 -1
  37. package/dist/lib/i18n/resources/fr/fr.d.ts +7 -0
  38. package/dist/lib/i18n/resources/fr/material.json.d.ts +8 -1
  39. package/dist/lib/i18n/resources/resources.d.ts +14 -0
  40. package/dist/lib/i18n/translator.d.ts +1 -1
  41. package/dist/lib/nuxt/component-names.d.ts +1 -1
  42. package/dist/lib.js +3 -3
  43. package/dist/main.js +17 -17
  44. package/dist/map.js +4 -4
  45. package/dist/material-vue.css +1 -1
  46. package/dist/{number.utils-Bpo9tUaJ.js → number.utils-C1eB3GDr.js} +427 -427
  47. package/dist/{pdf-outline-sidebar-BsePJlTi.js → pdf-outline-sidebar-BUvWHjiE.js} +2 -2
  48. package/dist/{pdf-page-Ct313mNF.js → pdf-page-B57B0uES.js} +1 -1
  49. package/dist/{pdf-page-list-JrRo2BeU.js → pdf-page-list-BHU7pW0b.js} +2 -2
  50. package/dist/{pdf-reader-tABBZMbZ.js → pdf-reader-CwTYGXq8.js} +8 -8
  51. package/dist/{pdf-sidebar-Caw9rzU-.js → pdf-sidebar-CtMy8Kw_.js} +3 -3
  52. package/dist/{pdf-thumbnail-sidebar-ZybLeUG7.js → pdf-thumbnail-sidebar-DS0iT3qo.js} +3 -3
  53. package/dist/{pdf-toolbar-BM8Sz_JN.js → pdf-toolbar-DL_vCyXG.js} +5 -5
  54. package/dist/pdf.js +2 -2
  55. package/dist/{print-format.utils-CQFIVeUA.js → print-format.utils-k5W0GBRF.js} +3 -3
  56. package/dist/{sortable-provider-CKkWYijj.js → sortable-provider-cYkCa6tm.js} +2 -2
  57. package/dist/{stored-language-CvOHC8AD.js → stored-language-DEyPmUzl.js} +16 -2
  58. package/dist/{stx-player-CsVKbwFk.js → stx-player-C_lPkXc6.js} +13 -13
  59. package/dist/{translator-k1rKIgC7.js → translator-B62GlCBp.js} +1 -1
  60. package/dist/{use-heading-spy-D-ipoQwl.js → use-heading-spy-T94lNeNA.js} +21 -21
  61. package/dist/{use-material-translation-1FdRx9I7.js → use-material-translation-DxU51--g.js} +3 -3
  62. package/docs/components/data-table-filter-and-lists.md +45 -1
  63. package/docs/components/feedback-and-status.md +7 -6
  64. package/docs/components/form-fields.md +1 -1
  65. package/docs/components/navigation-and-layout.md +6 -5
  66. package/docs/components/overlays-and-menus.md +3 -0
  67. package/docs/guides/csp.md +10 -0
  68. package/docs/guides/forms.md +55 -4
  69. package/docs/guides/i18n.md +3 -2
  70. package/docs/guides/ssr.md +8 -0
  71. package/docs/guides/theming.md +29 -6
  72. package/docs/previews/buttons-actions-button.webp +0 -0
  73. package/docs/previews/data-display-avatar.webp +0 -0
  74. package/docs/previews/data-display-badge.webp +0 -0
  75. package/docs/previews/data-display-chip.webp +0 -0
  76. package/docs/previews/data-display-statusindicator.webp +0 -0
  77. package/docs/previews/data-display-timeline.webp +0 -0
  78. package/docs/previews/data-table-filter-lists-facetgroup.webp +0 -0
  79. package/docs/previews/feedback-status-alert.webp +0 -0
  80. package/docs/previews/feedback-status-banner.webp +0 -0
  81. package/docs/previews/feedback-status-circularprogress.webp +0 -0
  82. package/docs/previews/feedback-status-emptystate.webp +0 -0
  83. package/docs/previews/feedback-status-progress.webp +0 -0
  84. package/docs/previews/feedback-status-spinner.webp +0 -0
  85. package/docs/previews/feedback-status-toast.webp +0 -0
  86. package/docs/previews/form-fields-passwordfield.webp +0 -0
  87. package/docs/previews/form-fields-ratingfield.webp +0 -0
  88. package/docs/roadmap.md +5 -0
  89. package/docs/troubleshooting.md +32 -5
  90. package/lib/components/base-content.css +64 -4
  91. package/lib/components/theme-tokens.css +7 -2
  92. package/lib/nuxt/component-names.ts +1 -0
  93. package/package.json +2 -2
  94. package/dist/use-inert-others-CtGqZKR8.js +0 -22
@@ -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-B_s5oxUp.js";
4
- import { t as r } from "./use-material-translation-1FdRx9I7.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-B_s5oxUp.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-B_s5oxUp.js";
3
- import { t as n } from "./pdf-page-Ct313mNF.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-B_s5oxUp.js";
3
- import { t as n } from "./use-material-translation-1FdRx9I7.js";
4
- import { t as r } from "./Button-5UyKA-x_.js";
5
- import { o as i } from "./HoverCardTrigger-CmCDiTn8.js";
6
- import { n as a } from "./pdf-page-Ct313mNF.js";
7
- import { t as o } from "./pdf-page-list-JrRo2BeU.js";
8
- import { t as s } from "./pdf-sidebar-Caw9rzU-.js";
9
- import { t as c } from "./pdf-toolbar-BM8Sz_JN.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-1FdRx9I7.js";
4
- import { t as r } from "./pdf-outline-sidebar-BsePJlTi.js";
5
- import { t as i } from "./pdf-thumbnail-sidebar-ZybLeUG7.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-B_s5oxUp.js";
4
- import { t as r } from "./use-material-translation-1FdRx9I7.js";
5
- import { t as i } from "./pdf-page-Ct313mNF.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-1FdRx9I7.js";
4
- import { d as r } from "./Button-5UyKA-x_.js";
5
- import { t as i } from "./icon-button-DhqJE6Ej.js";
6
- import { a, i as o, n as s, o as c, r as l, t as u } from "./DropdownMenuTrigger-BsuyNVzV.js";
7
- import { o as d } from "./HoverCardTrigger-CmCDiTn8.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
+ 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-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-1FdRx9I7.js";
2
- import { t as n } from "./Button-5UyKA-x_.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-CvOHC8AD.js";
2
- import { r } from "./translator-k1rKIgC7.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-1FdRx9I7.js";
3
- import { t as n } from "./icon-button-DhqJE6Ej.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",
@@ -345,6 +346,7 @@ var e = {
345
346
  "select-all": "Select all",
346
347
  "select-row": "Select row",
347
348
  "toggle-row": "Toggle row details",
349
+ expand: "Expand",
348
350
  "scroll-region": "Scrollable table"
349
351
  },
350
352
  pagination: {
@@ -753,6 +755,11 @@ var e = {
753
755
  empty: "No results"
754
756
  },
755
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
+ },
756
763
  autocomplete: {
757
764
  empty: "No option found.",
758
765
  add: "Add \"{query}\"",
@@ -1365,7 +1372,8 @@ var e = {
1365
1372
  copy: "Copier",
1366
1373
  copied: "Copié",
1367
1374
  language: "Langage",
1368
- "word-wrap": "Retour à la ligne"
1375
+ "word-wrap": "Retour à la ligne",
1376
+ "load-failed": "Impossible de charger l'éditeur."
1369
1377
  },
1370
1378
  "json-viewer": {
1371
1379
  expand: "Déplier",
@@ -1581,6 +1589,7 @@ var e = {
1581
1589
  "select-all": "Tout sélectionner",
1582
1590
  "select-row": "Sélectionner la ligne",
1583
1591
  "toggle-row": "Afficher ou masquer les détails de la ligne",
1592
+ expand: "Déplier",
1584
1593
  "scroll-region": "Tableau défilant"
1585
1594
  },
1586
1595
  pagination: {
@@ -1989,6 +1998,11 @@ var e = {
1989
1998
  empty: "Aucun résultat"
1990
1999
  },
1991
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
+ },
1992
2006
  autocomplete: {
1993
2007
  empty: "Aucune option.",
1994
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-B_s5oxUp.js";
3
- import { t as l } from "./use-material-translation-1FdRx9I7.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-CvOHC8AD.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-BEvjls8b.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-CvOHC8AD.js";
2
- import { a as e } from "./i18n-provider-BEvjls8b.js";
3
- import { i as t, r as n } from "./translator-k1rKIgC7.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 |
@@ -64,7 +65,8 @@ of your own; both footers take `disabled`);
64
65
  `useColumnHelpers<T>()` returns a
65
66
  `columnHelper` bound to the table's features and `predefinedColumns()` —
66
67
  `select` (checkboxes) and `expand` (a toggle for the expanded row, named
67
- "Toggle row details" (`material.table.labels.toggle-row`) with `aria-expanded`);
68
+ "Toggle row details" (`material.table.labels.toggle-row`) with `aria-expanded`, under a
69
+ visually hidden header "Expand", `material.table.labels.expand`);
68
70
  `useDeleteRowsHandler(onDelete)` for a delete-selected action behind a
69
71
  confirm dialog.
70
72
  `dataTableFeatures` / `DataTableFeatures` are the TanStack v9 features the
@@ -84,6 +86,7 @@ table enables, for typing your own column defs.
84
86
  | `scrollLabel` | `string` | "Scrollable table" | the name of the scroll region the table becomes while it overflows |
85
87
  | `loading` | `boolean` | `false` | skeleton rows, or the current rows dimmed; `aria-busy`; controls disabled |
86
88
  | `loadingRows` | `number` | the page size | how many skeleton rows |
89
+ | `density` | `'comfortable' \| 'compact'` | `'comfortable'` | `compact` tightens the cell padding, the row and header heights and the gap between rows, the selection column included; it is the table's `data-density` attribute, styled with classes (no inline style). The toolbar band and the empty state keep their size; the print variant is unchanged |
87
90
  | `#empty="{ filtered }"` | slot | icon and "No data available" | content of the empty row, spanning every visible column |
88
91
  | `manual` | `boolean` | `false` | `data` is one server page: no client filtering, sorting or paging; the footer is the server footer ([server-side data](#server-side-data)) |
89
92
  | `v-model:sorting` | `SortingState` | held inside | controlled sorting; `update:sorting` gets the new state |
@@ -513,6 +516,47 @@ above shows `FilterPopover` open; every variant has its own story.
513
516
 
514
517
  ---
515
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
+
516
560
  ## Pagination
517
561
 
518
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