@nxgt/material-vue 0.23.4 → 0.24.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 (96) hide show
  1. package/README.md +22 -18
  2. package/dist/{Button-CVIR6uLK.js → Button-DOcT4Pej.js} +95 -72
  3. package/dist/{HoverCardTrigger-iAL5ALrL.js → HoverCardTrigger-WQe85PCH.js} +2 -2
  4. package/dist/{camera-Gvg5N956.js → camera-BNbLUPb1.js} +13 -13
  5. package/dist/{components-AScwCcds.js → components-YlYuHLEI.js} +10856 -10379
  6. package/dist/components.js +8 -8
  7. package/dist/composables.js +2 -2
  8. package/dist/dnd.js +1 -1
  9. package/dist/{i18n-provider-BqWxpaKu.js → i18n-provider-DTuxugHO.js} +1 -1
  10. package/dist/i18n.js +4 -4
  11. package/dist/{icon-button-DbEME76t.js → icon-button-DKLuZ2c-.js} +34 -37
  12. package/dist/lib/components/ui/actions/button/has-text-content.d.ts +10 -0
  13. package/dist/lib/components/ui/actions/copy-button/copy-value.vue.d.ts +21 -0
  14. package/dist/lib/components/ui/actions/copy-button/index.d.ts +2 -0
  15. package/dist/lib/components/ui/collections/data-table/data-table-context.d.ts +6 -0
  16. package/dist/lib/components/ui/collections/data-table/data-table-pagination.vue.d.ts +2 -0
  17. package/dist/lib/components/ui/collections/data-table/data-table.vue.d.ts +17 -27
  18. package/dist/lib/components/ui/collections/data-table/index.d.ts +1 -1
  19. package/dist/lib/components/ui/collections/data-table/partials/data-table-body.vue.d.ts +10 -1
  20. package/dist/lib/components/ui/collections/data-table/partials/data-table-empty.vue.d.ts +13 -1
  21. package/dist/lib/components/ui/collections/data-table/partials/data-table-head.vue.d.ts +22 -0
  22. package/dist/lib/components/ui/collections/data-table/partials/data-table-skeleton-rows.vue.d.ts +10 -0
  23. package/dist/lib/components/ui/collections/data-table/use-data-table.d.ts +17 -0
  24. package/dist/lib/components/ui/collections/filter/partials/filter-field-slider-range.vue.d.ts +1 -4
  25. package/dist/lib/components/ui/collections/pagination/index.d.ts +5 -0
  26. package/dist/lib/components/ui/collections/pagination/pagination-bar.vue.d.ts +21 -0
  27. package/dist/lib/components/ui/collections/pagination/pagination-items.d.ts +2 -0
  28. package/dist/lib/components/ui/collections/pagination/pagination-link.vue.d.ts +18 -0
  29. package/dist/lib/components/ui/display/markdown/index.d.ts +18 -0
  30. package/dist/lib/components/ui/feedback/skeleton/skeleton-text.vue.d.ts +1 -1
  31. package/dist/lib/components/ui/feedback/spinner/spinner.compound-variants.d.ts +4 -0
  32. package/dist/lib/components/ui/fields/contacts/consts.d.ts +1 -1
  33. package/dist/lib/components/ui/fields/inline-edit/index.d.ts +1 -0
  34. package/dist/lib/components/ui/fields/inline-edit/inline-edit-form-field.vue.d.ts +7 -0
  35. package/dist/lib/components/ui/layout/doc/doc.vue.d.ts +5 -5
  36. package/dist/lib/components/ui/layout/doc/index.d.ts +8 -1
  37. package/dist/lib/components/ui/layout/doc/partials/default-doc-link.vue.d.ts +14 -0
  38. package/dist/lib/components/ui/layout/doc/partials/doc-copy-page.vue.d.ts +6 -0
  39. package/dist/lib/components/ui/layout/doc/partials/doc-link.vue.d.ts +3 -7
  40. package/dist/lib/components/ui/layout/doc/types.d.ts +6 -1
  41. package/dist/lib/components/ui/media/pdf-viewer/index.d.ts +6 -6
  42. package/dist/lib/components/ui/media/pdf-viewer/pdf-reader.vue.d.ts +2 -2
  43. package/dist/lib/components/ui/primitives/icon/icon-context.d.ts +1 -1
  44. package/dist/lib/components/ui/selection/checkbox/Checkbox.vue.d.ts +21 -5
  45. package/dist/lib/components/ui/selection/checkbox/checkbox-form-field.vue.d.ts +17 -0
  46. package/dist/lib/components/ui/selection/checkbox/index.d.ts +2 -0
  47. package/dist/lib/components/ui/widgets/charts/chart-container.vue.d.ts +1 -1
  48. package/dist/lib/components/ui/widgets/code-editor/code-editor-form-field.vue.d.ts +13 -0
  49. package/dist/lib/components/ui/widgets/code-editor/index.d.ts +1 -0
  50. package/dist/lib/i18n/resources/en/en.d.ts +7 -0
  51. package/dist/lib/i18n/resources/en/material.json.d.ts +8 -1
  52. package/dist/lib/i18n/resources/fr/fr.d.ts +7 -0
  53. package/dist/lib/i18n/resources/fr/material.json.d.ts +8 -1
  54. package/dist/lib/i18n/resources/resources.d.ts +14 -0
  55. package/dist/lib/i18n/translator.d.ts +1 -1
  56. package/dist/lib/nuxt/component-names.d.ts +1 -1
  57. package/dist/lib.js +2 -2
  58. package/dist/main.js +17 -17
  59. package/dist/map.js +4 -4
  60. package/dist/material-vue.css +1 -1
  61. package/dist/{pdf-outline-sidebar-oz9wdBhB.js → pdf-outline-sidebar-0I-LGrgY.js} +2 -2
  62. package/dist/{pdf-page-0rlq1Lo6.js → pdf-page-C74-6lyZ.js} +1 -1
  63. package/dist/{pdf-page-list-DfhjNHoI.js → pdf-page-list-DPsquYPY.js} +2 -2
  64. package/dist/{pdf-reader-Dr8RVcs4.js → pdf-reader-Bkpp7UZ7.js} +8 -8
  65. package/dist/{pdf-sidebar-VXPQbC_R.js → pdf-sidebar-BH-1jvy-.js} +3 -3
  66. package/dist/{pdf-thumbnail-sidebar-BpgXrVBj.js → pdf-thumbnail-sidebar-ByqNaYfz.js} +3 -3
  67. package/dist/{pdf-toolbar-B6gRRcsv.js → pdf-toolbar-BRnmzddi.js} +4 -4
  68. package/dist/pdf.js +2 -2
  69. package/dist/{sortable-provider-oEVjQiCl.js → sortable-provider-CC9eO1nm.js} +2 -2
  70. package/dist/{stored-language-rjOMJkyX.js → stored-language-N_UoPJsY.js} +20 -2
  71. package/dist/{stx-player-DNADkQ31.js → stx-player-BGKIDqNX.js} +22 -22
  72. package/dist/{translator-BCSJSO1-.js → translator-CU0jKvzB.js} +1 -1
  73. package/dist/{use-heading-spy-d50_nxgR.js → use-heading-spy-Bw1LIAkC.js} +1 -1
  74. package/dist/{use-material-translation-C5zPFhbk.js → use-material-translation-8hUB2M-S.js} +3 -3
  75. package/docs/components/buttons-and-actions.md +19 -3
  76. package/docs/components/data-display.md +14 -1
  77. package/docs/components/data-table-filter-and-lists.md +90 -8
  78. package/docs/components/feedback-and-status.md +1 -1
  79. package/docs/components/form-fields.md +7 -5
  80. package/docs/components/media-and-files.md +1 -1
  81. package/docs/components/navigation-and-layout.md +67 -7
  82. package/docs/components/primitives.md +4 -2
  83. package/docs/components/rich-widgets.md +4 -3
  84. package/docs/components/selection-and-choice.md +16 -13
  85. package/docs/guides/forms.md +14 -5
  86. package/docs/guides/i18n.md +6 -2
  87. package/docs/guides/ssr.md +2 -0
  88. package/docs/previews/buttons-actions-copybutton.webp +0 -0
  89. package/docs/previews/data-table-filter-lists-pagination.webp +0 -0
  90. package/docs/previews/form-fields-slider.webp +0 -0
  91. package/docs/previews/navigation-layout-stepper.webp +0 -0
  92. package/docs/previews/selection-choice-checkbox.webp +0 -0
  93. package/docs/roadmap.md +41 -1
  94. package/docs/troubleshooting.md +104 -0
  95. package/lib/nuxt/component-names.ts +12 -0
  96. package/package.json +1 -1
@@ -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 { af as n } from "./components-AScwCcds.js";
4
- import { t as r } from "./use-material-translation-C5zPFhbk.js";
3
+ import { gf as n } from "./components-YlYuHLEI.js";
4
+ import { t as r } from "./use-material-translation-8hUB2M-S.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 { Bc as t } from "./components-AScwCcds.js";
2
+ import { vp as t } from "./components-YlYuHLEI.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 { af as t } from "./components-AScwCcds.js";
3
- import { t as n } from "./pdf-page-0rlq1Lo6.js";
2
+ import { gf as t } from "./components-YlYuHLEI.js";
3
+ import { t as n } from "./pdf-page-C74-6lyZ.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 { wn as t } from "./components-AScwCcds.js";
3
- import { t as n } from "./use-material-translation-C5zPFhbk.js";
4
- import { t as r } from "./Button-CVIR6uLK.js";
5
- import { o as i } from "./HoverCardTrigger-iAL5ALrL.js";
6
- import { n as a } from "./pdf-page-0rlq1Lo6.js";
7
- import { t as o } from "./pdf-page-list-DfhjNHoI.js";
8
- import { t as s } from "./pdf-sidebar-VXPQbC_R.js";
9
- import { t as c } from "./pdf-toolbar-B6gRRcsv.js";
2
+ import { En as t } from "./components-YlYuHLEI.js";
3
+ import { t as n } from "./use-material-translation-8hUB2M-S.js";
4
+ import { t as r } from "./Button-DOcT4Pej.js";
5
+ import { o as i } from "./HoverCardTrigger-WQe85PCH.js";
6
+ import { n as a } from "./pdf-page-C74-6lyZ.js";
7
+ import { t as o } from "./pdf-page-list-DPsquYPY.js";
8
+ import { t as s } from "./pdf-sidebar-BH-1jvy-.js";
9
+ import { t as c } from "./pdf-toolbar-BRnmzddi.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-C5zPFhbk.js";
4
- import { t as r } from "./pdf-outline-sidebar-oz9wdBhB.js";
5
- import { t as i } from "./pdf-thumbnail-sidebar-BpgXrVBj.js";
3
+ import { t as n } from "./use-material-translation-8hUB2M-S.js";
4
+ import { t as r } from "./pdf-outline-sidebar-0I-LGrgY.js";
5
+ import { t as i } from "./pdf-thumbnail-sidebar-ByqNaYfz.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 { af as n } from "./components-AScwCcds.js";
4
- import { t as r } from "./use-material-translation-C5zPFhbk.js";
5
- import { t as i } from "./pdf-page-0rlq1Lo6.js";
3
+ import { gf as n } from "./components-YlYuHLEI.js";
4
+ import { t as r } from "./use-material-translation-8hUB2M-S.js";
5
+ import { t as i } from "./pdf-page-C74-6lyZ.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-C5zPFhbk.js";
4
- import { o as r } from "./Button-CVIR6uLK.js";
5
- import { t as i } from "./icon-button-DbEME76t.js";
3
+ import { t as n } from "./use-material-translation-8hUB2M-S.js";
4
+ import { s as r } from "./Button-DOcT4Pej.js";
5
+ import { t as i } from "./icon-button-DKLuZ2c-.js";
6
6
  import { a, i as o, n as s, o as c, r as l, t as u } from "./DropdownMenuTrigger-BHAhXGUO.js";
7
- import { o as d } from "./HoverCardTrigger-iAL5ALrL.js";
7
+ import { o as d } from "./HoverCardTrigger-WQe85PCH.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-C5zPFhbk.js";
2
- import { t as n } from "./Button-CVIR6uLK.js";
1
+ import { n as e, t } from "./use-material-translation-8hUB2M-S.js";
2
+ import { t as n } from "./Button-DOcT4Pej.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,6 +1,6 @@
1
1
  import { t as e } from "./utils-CykWQ0iJ.js";
2
- import { t } from "./use-material-translation-C5zPFhbk.js";
3
- import { t as n } from "./icon-button-DbEME76t.js";
2
+ import { t } from "./use-material-translation-8hUB2M-S.js";
3
+ import { t as n } from "./icon-button-DKLuZ2c-.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";
@@ -317,6 +317,7 @@ var e = {
317
317
  }
318
318
  },
319
319
  table: {
320
+ loading: "Loading data…",
320
321
  labels: {
321
322
  asc: "Asc",
322
323
  desc: "Desc",
@@ -709,7 +710,11 @@ var e = {
709
710
  invalid: "Enter a valid URL",
710
711
  open: "Open URL"
711
712
  },
712
- stepper: { step: "Step {step}" },
713
+ stepper: {
714
+ step: "Step {step}",
715
+ completed: "Completed",
716
+ error: "Error"
717
+ },
713
718
  "combobox-field": {
714
719
  placeholder: "Search…",
715
720
  empty: "No results"
@@ -1101,6 +1106,10 @@ var e = {
1101
1106
  "back-to-days": "Back to day view"
1102
1107
  },
1103
1108
  spinner: { loading: "Loading..." },
1109
+ slider: {
1110
+ minimum: "Minimum",
1111
+ maximum: "Maximum"
1112
+ },
1104
1113
  "scroll-to-top": { label: "Scroll to top" },
1105
1114
  map: {
1106
1115
  "you-are-here": "You are here",
@@ -1446,6 +1455,7 @@ var e = {
1446
1455
  }
1447
1456
  },
1448
1457
  table: {
1458
+ loading: "Chargement des données…",
1449
1459
  labels: {
1450
1460
  asc: "Asc",
1451
1461
  desc: "Desc",
@@ -1838,7 +1848,11 @@ var e = {
1838
1848
  invalid: "Saisissez une URL valide",
1839
1849
  open: "Ouvrir l’URL"
1840
1850
  },
1841
- stepper: { step: "Étape {step}" },
1851
+ stepper: {
1852
+ step: "Étape {step}",
1853
+ completed: "Terminée",
1854
+ error: "Erreur"
1855
+ },
1842
1856
  "combobox-field": {
1843
1857
  placeholder: "Rechercher…",
1844
1858
  empty: "Aucun résultat"
@@ -2230,6 +2244,10 @@ var e = {
2230
2244
  "back-to-days": "Retour à la vue des jours"
2231
2245
  },
2232
2246
  spinner: { loading: "Chargement..." },
2247
+ slider: {
2248
+ minimum: "Minimum",
2249
+ maximum: "Maximum"
2250
+ },
2233
2251
  "scroll-to-top": { label: "Retour en haut" },
2234
2252
  map: {
2235
2253
  "you-are-here": "Vous êtes ici",
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-CykWQ0iJ.js";
2
- import { Gt as t, Jt as n, Ut as r, Wt as i, Xt as a, Yt as o, lp as s, qt as c } from "./components-AScwCcds.js";
3
- import { t as l } from "./use-material-translation-C5zPFhbk.js";
2
+ import { Gt as t, Kt as n, Qt as r, Xt as i, Yt as a, Zt as o, qt as s, xp as c } from "./components-YlYuHLEI.js";
3
+ import { t as l } from "./use-material-translation-8hUB2M-S.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,38 +19,38 @@ var S = ["data-layout", "aria-label"], C = {
19
19
  Array
20
20
  ] }
21
21
  },
22
- setup(t) {
23
- let { containerRef: g, state: w } = a();
22
+ setup(s) {
23
+ let { containerRef: g, state: w } = r();
24
24
  function T(e) {
25
25
  g.value = e instanceof HTMLElement ? e : null;
26
26
  }
27
27
  let { t: E } = l();
28
- return (a, l) => (v(), f("section", {
28
+ return (r, l) => (v(), f("section", {
29
29
  ref: T,
30
30
  "data-slot": "stx-player",
31
- "data-layout": t.layout,
31
+ "data-layout": s.layout,
32
32
  "aria-label": b(w).current?.title ?? b(E)("material.stx-player.label", "Media player"),
33
- class: _(b(e)("@container rounded outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50", a.$props.class))
34
- }, [t.layout === "mini" ? (v(), u(c, { key: 0 })) : (v(), f("div", {
33
+ class: _(b(e)("@container rounded outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50", r.$props.class))
34
+ }, [s.layout === "mini" ? (v(), u(a, { key: 0 })) : (v(), f("div", {
35
35
  key: 1,
36
- class: _(b(e)("grid gap-3", t.showQueue && "@min-[768px]:grid-cols-[minmax(0,1fr)_18rem] @min-[768px]:items-stretch"))
36
+ class: _(b(e)("grid gap-3", s.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(s, { variant: "title-medium" }, {
38
+ b(w).current?.kind === "audio" ? (v(), f("div", C, [h(c, { variant: "title-medium" }, {
39
39
  default: x(() => [m(y(b(w).current.title), 1)]),
40
40
  _: 1
41
- }), b(w).current.artist ? (v(), u(s, {
41
+ }), b(w).current.artist ? (v(), u(c, {
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(t, null, {
49
49
  default: x(() => [b(w).current?.kind === "audio" ? d("", !0) : (v(), u(o, {
50
50
  key: 0,
51
51
  tone: "overlay"
52
52
  }, {
53
- trailing: x(() => [h(n, { tone: "overlay" })]),
53
+ trailing: x(() => [h(i, { tone: "overlay" })]),
54
54
  _: 1
55
55
  }))]),
56
56
  _: 1
@@ -59,10 +59,10 @@ var S = ["data-layout", "aria-label"], C = {
59
59
  key: 1,
60
60
  tone: "surface"
61
61
  }, {
62
- trailing: x(() => [h(n, { tone: "surface" })]),
62
+ trailing: x(() => [h(i, { tone: "surface" })]),
63
63
  _: 1
64
64
  })) : d("", !0)
65
- ], 2), t.showQueue ? (v(), u(i, {
65
+ ], 2), s.showQueue ? (v(), u(n, {
66
66
  key: 0,
67
67
  class: "min-h-72"
68
68
  })) : d("", !0)], 2))], 10, S));
@@ -97,23 +97,23 @@ var S = ["data-layout", "aria-label"], C = {
97
97
  ] }
98
98
  },
99
99
  emits: ["trackChange"],
100
- setup(e, { emit: n }) {
101
- let r = e, i = n;
102
- function a(e, t) {
103
- r.onTrackChange?.(e, t), i("trackChange", e, t);
100
+ setup(e, { emit: t }) {
101
+ let n = e, r = t;
102
+ function i(e, t) {
103
+ n.onTrackChange?.(e, t), r("trackChange", e, t);
104
104
  }
105
- return (n, i) => (v(), u(t, {
105
+ return (t, r) => (v(), u(s, {
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": a
111
+ "on-track-change": i
112
112
  }, {
113
113
  default: x(() => [h(w, {
114
114
  layout: e.layout,
115
115
  "show-queue": e.showQueue,
116
- class: _(r.class)
116
+ class: _(n.class)
117
117
  }, null, 8, [
118
118
  "layout",
119
119
  "show-queue",
@@ -1,4 +1,4 @@
1
- import { a as e, i as t, r as n, t as r } from "./stored-language-rjOMJkyX.js";
1
+ import { a as e, i as t, r as n, t as r } from "./stored-language-N_UoPJsY.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,4 +1,4 @@
1
- import { a as e } from "./i18n-provider-BqWxpaKu.js";
1
+ import { a as e } from "./i18n-provider-DTuxugHO.js";
2
2
  import { c as t, d as n, f as r, l as i, n as a, u as o } from "./number.utils-Cy1z6qI7.js";
3
3
  import { computed as s, getCurrentInstance as c, onMounted as l, ref as u, toValue as d } from "vue";
4
4
  import { useIntersectionObserver as f, useMediaQuery as p, useSSRWidth as m, useStorage as h } from "@vueuse/core";
@@ -1,6 +1,6 @@
1
- import "./stored-language-rjOMJkyX.js";
2
- import { a as e } from "./i18n-provider-BqWxpaKu.js";
3
- import { i as t, r as n } from "./translator-BCSJSO1-.js";
1
+ import "./stored-language-N_UoPJsY.js";
2
+ import { a as e } from "./i18n-provider-DTuxugHO.js";
3
+ import { i as t, r as n } from "./translator-CU0jKvzB.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]])) {
@@ -319,9 +319,25 @@ import { CopyButton } from '@nxgt/material-vue/components';
319
319
  | `#icon` slot | — | a copy icon | replaces the idle icon |
320
320
  | `variant`, `color` | as `IconButton` | `'ghost'`, `'default'` | the button style |
321
321
 
322
- The check mark stays for 1.5 s. Vue has no `CopyValue`: put the text next to a
323
- `CopyButton` as above. `copyToClipboard(text)` is the same copy without a
324
- button.
322
+ The check mark stays for 1.5 s. `copyToClipboard(text)` is the same copy
323
+ without a button.
324
+
325
+ `CopyValue` shows the value in a monospace chip with the button beside it:
326
+
327
+ ```vue
328
+ <script setup lang="ts">
329
+ import { CopyValue } from '@nxgt/material-vue/components';
330
+ </script>
331
+
332
+ <template>
333
+ <CopyValue value="https://app.example.com/orders/SO-1842" display="SO-1842" />
334
+ </template>
335
+ ```
336
+
337
+ | `CopyValue` prop | Type | Default | Effect |
338
+ | --- | --- | --- | --- |
339
+ | `value` | `string` | — (required) | what is copied, and shown when there is no `display` |
340
+ | `display` / default slot | `string` | `value` | what is shown instead (React's `display` node) |
325
341
 
326
342
  **Storybook:** `Buttons & actions/CopyButton` · **React:** `CopyButton`, `CopyValue`
327
343
 
@@ -656,7 +656,20 @@ left alone. Mermaid diagrams
656
656
  render in the browser only, after mount; on the server the fence is left
657
657
  empty.
658
658
 
659
- **Storybook:** `Data display/Markdown` · **React:** `Markdown`
659
+ `MermaidDiagram` renders one chart outside markdown, the same way: client-only,
660
+ with `mermaid` imported on mount.
661
+
662
+ ```vue
663
+ <script setup lang="ts">
664
+ import { MermaidDiagram } from '@nxgt/material-vue/components';
665
+ </script>
666
+
667
+ <template>
668
+ <MermaidDiagram chart="graph LR&#10; Draft --> Review --> Published" />
669
+ </template>
670
+ ```
671
+
672
+ **Storybook:** `Data display/Markdown` · **React:** `Markdown`, `MermaidDiagram`
660
673
 
661
674
  ---
662
675
 
@@ -23,7 +23,7 @@ each other, so either can be used alone.
23
23
 
24
24
  ![DataTable](../previews/data-table-filter-lists-datatable.webp)
25
25
 
26
- TanStack Table v9 with sorting, filtering, selection, expandable rows, pagination or load-more, and column visibility.
26
+ TanStack Table v9 with sorting, filtering, selection, expandable rows, pagination or load-more, column visibility, skeleton rows while loading and your own empty state.
27
27
 
28
28
  ```vue
29
29
  <script setup lang="ts">
@@ -59,7 +59,8 @@ const columns = columnHelper.columns([
59
59
 
60
60
  Parts: `DataTable`; `DataTableColumnHeader` (a sortable header with a hide
61
61
  action); `DataTablePagination` and `DataTableViewOptions` (used by the table,
62
- exported for a table of your own); `useColumnHelpers<T>()` returns a
62
+ exported for a table of your own; `DataTablePagination` takes `disabled`);
63
+ `useColumnHelpers<T>()` returns a
63
64
  `columnHelper` bound to the table's features and `predefinedColumns()` —
64
65
  `select` (checkboxes) and `expand` (a toggle for the expanded row, named
65
66
  "Toggle row details" (`material.table.labels.toggle-row`) with `aria-expanded`);
@@ -78,6 +79,58 @@ table enables, for typing your own column defs.
78
79
  | `onLoadMore` / `isLoadingMore` | `() => void` / `boolean` | — | adds a "load more" button under the rows |
79
80
  | `options` | `{ showPage?: boolean; showSelected?: boolean }` | both shown | parts of the footer |
80
81
  | `showHeader` | `boolean` | hidden on mobile | header row |
82
+ | `loading` | `boolean` | `false` | skeleton rows, or the current rows dimmed; `aria-busy`; controls disabled |
83
+ | `loadingRows` | `number` | the page size | how many skeleton rows |
84
+ | `#empty="{ filtered }"` | slot | icon and "No data available" | content of the empty row, spanning every visible column |
85
+
86
+ ### Loading and empty states
87
+
88
+ ```vue
89
+ <script setup lang="ts">
90
+ import { DataTable, useColumnHelpers } from '@nxgt/material-vue/components';
91
+
92
+ type Person = { id: string; name: string; email: string };
93
+
94
+ defineProps<{ people: Person[]; isFetching: boolean }>();
95
+
96
+ const { columnHelper } = useColumnHelpers<Person>();
97
+ const columns = columnHelper.columns([
98
+ columnHelper.accessor('name', { header: 'Name' }),
99
+ columnHelper.accessor('email', { header: 'Email' }),
100
+ ]);
101
+ </script>
102
+
103
+ <template>
104
+ <DataTable
105
+ :data="people"
106
+ :columns="columns"
107
+ :loading="isFetching"
108
+ :loading-rows="5"
109
+ >
110
+ <template #empty="{ filtered }">
111
+ {{ filtered ? 'No person matches these filters.' : 'No people yet.' }}
112
+ </template>
113
+ </DataTable>
114
+ </template>
115
+ ```
116
+
117
+ While `loading` is `true`, the table is `aria-busy` and a visually
118
+ hidden status says "Loading data…" (`material.table.loading`). With no row to
119
+ show, the body is `loadingRows` skeleton rows (default: the page size), one
120
+ cell per visible column. With rows already shown — a refresh — the rows stay
121
+ where they are, dimmed and `inert`, rather than being swapped for
122
+ skeletons: the table keeps its height, so nothing below it jumps when the data
123
+ arrives. Sorting (`DataTableColumnHeader`), the `select` column's "Select
124
+ all", the toolbar's native controls (it
125
+ is a disabled `<fieldset>`, so every input or button you render there, a
126
+ filter or an export, is disabled
127
+ too) and pagination are disabled meanwhile.
128
+
129
+ When no row is left after filtering, the empty state is one `TableEmpty`
130
+ cell spanning every visible column: today's icon and "No data available" by
131
+ default, or the `#empty` slot, told whether rows exist but none matches the
132
+ filters (`filtered`); content that renders nothing gets the default.
133
+ `DataTableEmptyState` types the slot props.
81
134
 
82
135
  For the TanStack API itself (column helpers, features, row models), see
83
136
  [TanStack Table v9](https://tanstack.com/table/latest).
@@ -132,7 +185,10 @@ A field's `type` is one of `text`, `number`, `select`, `multi-select`, `date`,
132
185
  `chips-multiple`, `chips-single`, `slider`, `slider-range`, `switch` or
133
186
  `custom` (`render` returns a VNode); `schema.groups` puts fields in
134
187
  collapsible sections. The filter state lives in a Pinia store, so the app
135
- needs `app.use(createPinia())`.
188
+ needs `app.use(createPinia())`. A `number-range` or `slider-range` is a
189
+ `role="group"` named by its `label`, with its inputs named by their part
190
+ ("Min" / "Max", or the slider's "<label> Minimum" / "<label> Maximum"):
191
+ `getByRole('group', { name: 'Price' })`.
136
192
 
137
193
  Parts: `Filter` (one component, `variant` picks the layout);
138
194
  `FilterProvider` + `FilterContent` + `FilterActions` to lay the panel out
@@ -203,7 +259,34 @@ above shows `FilterPopover` open; every variant has its own story.
203
259
 
204
260
  ![Pagination](../previews/data-table-filter-lists-pagination.webp)
205
261
 
206
- Pagination primitives on Reka UI's `Pagination`, with first / last buttons and ellipses.
262
+ Pagination primitives on Reka UI's `Pagination`, with first / last buttons and ellipses. `PaginationBar` adds a sibling window with ellipses.
263
+
264
+ ```vue
265
+ <script setup lang="ts">
266
+ import { ref } from 'vue';
267
+ import { PaginationBar } from '@nxgt/material-vue/components';
268
+
269
+ const page = ref(1);
270
+ </script>
271
+
272
+ <template>
273
+ <PaginationBar v-model:page="page" :page-count="12" />
274
+ </template>
275
+ ```
276
+
277
+ | `PaginationBar` prop / event | Type | Default | Effect |
278
+ | --- | --- | --- | --- |
279
+ | `page` / `v-model:page` | `number` | — (required) | current page, from 1; controlled |
280
+ | `page-count` | `number` | — (required) | number of pages |
281
+ | `sibling-count` | `number` | `1` | pages on each side of the current one before an ellipsis |
282
+ | `disabled` | `boolean` | `false` | disables every button |
283
+ | `@update:page`, `@page-change` | `(page: number) => void` | — | a page was chosen (React's `onPageChange`) |
284
+
285
+ `paginationItems(page, pageCount, siblingCount?)` is the window it renders, as
286
+ `(number | 'ellipsis')[]` (`PaginationItemToken`). `PaginationLink` is a page
287
+ as an anchor (`href`, `is-active`), for server-rendered lists.
288
+
289
+ The parts, composed by hand:
207
290
 
208
291
  ```vue
209
292
  <script setup lang="ts">
@@ -243,9 +326,8 @@ const page = ref(1);
243
326
  Parts: `Pagination` (the root), `PaginationContent` (its slot gives the
244
327
  `items` window), `PaginationItem` (`value`, `is-active`),
245
328
  `PaginationPrevious`, `PaginationNext`, `PaginationFirst`, `PaginationLast`,
246
- `PaginationEllipsis`. There is no `PaginationBar` / `paginationItems` in Vue:
247
- the root computes the window itself. For a table, `DataTablePagination` is
248
- already wired.
329
+ `PaginationEllipsis`. Composed by hand, the root computes the window itself.
330
+ For a table, `DataTablePagination` is already wired.
249
331
 
250
332
  | Prop | Type | Default | Effect |
251
333
  | --- | --- | --- | --- |
@@ -258,7 +340,7 @@ already wired.
258
340
  | `aria-label` | `string` | `'pagination'` (translated) | the `nav`'s name; the buttons are named "First", "Previous", "Next", "Last" and "Page {n}" (`material.pagination.*`). An `aria-label` on a part wins |
259
341
 
260
342
  **Emits:** `update:page` with `number`.
261
- **Storybook:** `Data table, filter & lists/Pagination` · **React:** `Pagination` (parts), `PaginationBar`
343
+ **Storybook:** `Data table, filter & lists/Pagination` · **React:** `Pagination` (parts), `PaginationFirst`, `PaginationLast`, `PaginationLink`, `PaginationBar`, `paginationItems`
262
344
 
263
345
  ---
264
346
 
@@ -523,7 +523,7 @@ compiled stylesheet). `Toast` is the component each toast
523
523
  renders, and `sonnerToast` is vue-sonner's own `toast`, for anything the
524
524
  presets do not cover.
525
525
 
526
- **Storybook:** `Feedback & status/Toast` · **React:** `Toaster`, `toast`, `toasts`, `Toast`
526
+ **Storybook:** `Feedback & status/Toast` · **React:** `Toaster`, `toast`, `toasts`, `Toast` (`ToastAction` type)
527
527
 
528
528
  ---
529
529
 
@@ -529,7 +529,7 @@ const pin = ref('');
529
529
  **Emits:** `update:modelValue` with `string` (the digits typed so far).
530
530
  **Form wrapper:** `OtpFormField` — `name` inside a vee-validate form, see
531
531
  [forms](../guides/forms.md#the-pair) and [what each field emits](../guides/forms.md#what-each-field-emits).
532
- **Storybook:** `Form fields/OtpField` · **React:** `OtpField`, `OtpFormField`
532
+ **Storybook:** `Form fields/OtpField` · **React:** `OtpField`, `OtpFormField`, `InputOTP` (same parts)
533
533
 
534
534
  ---
535
535
 
@@ -605,8 +605,8 @@ const title = ref('Spring catalogue');
605
605
 
606
606
  **Emits:** `update:modelValue` and `save`, both `string`, trimmed, on save
607
607
  only.
608
- **Form wrapper:** none — bind `v-model` to a `useField` value, see
609
- [forms](../guides/forms.md#the-pair).
608
+ **Form wrapper:** `InlineEditFormField` (`name` plus the same props; the form
609
+ value changes on save, not while typing), see [forms](../guides/forms.md#the-pair).
610
610
  **Storybook:** `Form fields/InlineEdit` · **React:** `InlineEdit`, `InlineEditFormField`
611
611
 
612
612
  ---
@@ -750,6 +750,8 @@ in `SliderField`: its readout is text.
750
750
 
751
751
  Each thumb (`role="slider"`) is named by the label; a range's thumbs add
752
752
  "Minimum" and "Maximum": `getByRole('slider', { name: 'Price Minimum' })`.
753
+ A labelled range is also a `role="group"` named by the label, so two range
754
+ sliders are told apart.
753
755
  The bare `Slider` does the same with `label-id` (the id of your label) and
754
756
  `required`, or with an `aria-labelledby` or `aria-label` you pass (they win
755
757
  over `label-id`): a vertical `Slider`, which has no field label, needs one.
@@ -762,7 +764,7 @@ wins over `error` as on React's `Slider`) goes on every thumb, not on the root
762
764
  stores the same — the initial value decides.
763
765
  **Form wrapper:** `SliderFormField` — `name` inside a vee-validate form, see
764
766
  [forms](../guides/forms.md#the-pair) and [what each field emits](../guides/forms.md#what-each-field-emits).
765
- **Storybook:** `Form fields/Slider` · **React:** `Slider`, `SliderFormField`
767
+ **Storybook:** `Form fields/Slider` · **React:** `Slider`, `SliderField` (an alias of `Slider`), `SliderFormField`
766
768
 
767
769
  ---
768
770
 
@@ -835,7 +837,7 @@ const updates = ref(false);
835
837
  **Emits:** `update:modelValue` with `boolean`.
836
838
  **Form wrapper:** `SwitchFormField` — `name` inside a vee-validate form, see
837
839
  [forms](../guides/forms.md#the-pair) and [what each field emits](../guides/forms.md#what-each-field-emits).
838
- **Storybook:** `Form fields/Switch`, `Form fields/SwitchField` · **React:** `Switch`, `SwitchFormField`
840
+ **Storybook:** `Form fields/Switch`, `Form fields/SwitchField` · **React:** `Switch`, `SwitchField` (an alias of `Switch`), `SwitchFormField`
839
841
 
840
842
  ---
841
843
 
@@ -677,7 +677,7 @@ and emits nothing: the capture stays inside the component. The helpers
677
677
  `isCameraSupported`, `getCameraDevices`, `requestCameraPermissions` and
678
678
  `capturePhotoFromVideo` are exported for building your own.
679
679
 
680
- **Storybook:** `Media & files/Camera` · **React:** — (a story only, not exported)
680
+ **Storybook:** `Media & files/Camera` · **React:** `Camera`, `useCamera`, `capturePhotoFromVideo` (`createCameraStore` for the store)
681
681
 
682
682
  ---
683
683