@nxgt/material-vue 0.25.1 → 0.26.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 (52) hide show
  1. package/CHANGELOG.md +1650 -0
  2. package/README.md +25 -3
  3. package/dist/{Button-C1aaI0Gw.js → Button-16J7vTpE.js} +1 -1
  4. package/dist/{HoverCardTrigger-JtHn0IFQ.js → HoverCardTrigger-C41002JS.js} +2 -2
  5. package/dist/{camera-BacVyXl0.js → camera-DvKuqT4L.js} +4 -4
  6. package/dist/{components-DRBKkOqk.js → components-CCWod7cJ.js} +10461 -10194
  7. package/dist/components.js +8 -8
  8. package/dist/composables.js +2 -2
  9. package/dist/dnd.js +1 -1
  10. package/dist/{form-scope-VxlJuvFe.js → form-scope-x-7TYn2s.js} +1 -1
  11. package/dist/{i18n-provider-D0oYv0XS.js → i18n-provider-CaaZCmaR.js} +1 -1
  12. package/dist/i18n.js +4 -4
  13. package/dist/{icon-button-B2FQtIHS.js → icon-button-CDdNsZuZ.js} +1 -1
  14. package/dist/lib/components/ui/collections/data-table/data-table-server-footer.vue.d.ts +35 -0
  15. package/dist/lib/components/ui/collections/data-table/data-table.vue.d.ts +18 -30
  16. package/dist/lib/components/ui/collections/data-table/index.d.ts +3 -1
  17. package/dist/lib/components/ui/collections/data-table/partials/data-table-body.vue.d.ts +4 -0
  18. package/dist/lib/components/ui/collections/data-table/partials/data-table-page-control.vue.d.ts +15 -0
  19. package/dist/lib/components/ui/collections/data-table/partials/data-table-row.vue.d.ts +31 -0
  20. package/dist/lib/components/ui/collections/data-table/types.d.ts +66 -0
  21. package/dist/lib/components/ui/collections/data-table/use-data-table.d.ts +13 -3
  22. package/dist/lib/components/ui/fields/contacts/consts.d.ts +1 -1
  23. package/dist/lib/i18n/resources/en/en.d.ts +5 -0
  24. package/dist/lib/i18n/resources/en/material.json.d.ts +6 -1
  25. package/dist/lib/i18n/resources/fr/fr.d.ts +5 -0
  26. package/dist/lib/i18n/resources/fr/material.json.d.ts +6 -1
  27. package/dist/lib/i18n/resources/resources.d.ts +10 -0
  28. package/dist/lib/i18n/translator.d.ts +1 -1
  29. package/dist/lib/nuxt/component-names.d.ts +1 -1
  30. package/dist/lib.js +2 -2
  31. package/dist/main.js +17 -17
  32. package/dist/map.js +4 -4
  33. package/dist/material-vue.css +1 -1
  34. package/dist/{pdf-outline-sidebar-jJfhNjnN.js → pdf-outline-sidebar-D3vq2qfS.js} +2 -2
  35. package/dist/{pdf-page-BW1hXzPu.js → pdf-page-BrJbyjQj.js} +1 -1
  36. package/dist/{pdf-page-list-D277RtWS.js → pdf-page-list-BCgYEszV.js} +2 -2
  37. package/dist/{pdf-reader-BReUTsn_.js → pdf-reader-BAzevSJU.js} +8 -8
  38. package/dist/{pdf-sidebar-Bk6PowY1.js → pdf-sidebar-DSh2Mend.js} +3 -3
  39. package/dist/{pdf-thumbnail-sidebar-BcNDFsks.js → pdf-thumbnail-sidebar-D_EMcbKF.js} +3 -3
  40. package/dist/{pdf-toolbar-CHjaMhH9.js → pdf-toolbar-BcL7HlfS.js} +4 -4
  41. package/dist/pdf.js +2 -2
  42. package/dist/{sortable-provider-C83VBfGl.js → sortable-provider-DMpmM7Ke.js} +2 -2
  43. package/dist/{stored-language-CC_vdcCN.js → stored-language-Bxhsx4iB.js} +12 -2
  44. package/dist/{stx-player-BMQ1D2Li.js → stx-player-MldK_ZAZ.js} +17 -17
  45. package/dist/{translator-B-X_1taI.js → translator-CLI_7Crg.js} +1 -1
  46. package/dist/{use-heading-spy-C_ySuvTl.js → use-heading-spy-VPuFj2Gt.js} +1 -1
  47. package/dist/{use-material-translation-B6sIk0mF.js → use-material-translation-CONqD9wJ.js} +3 -3
  48. package/docs/components/data-table-filter-and-lists.md +173 -5
  49. package/docs/getting-started.md +2 -2
  50. package/docs/roadmap.md +6 -0
  51. package/lib/nuxt/component-names.ts +1 -0
  52. package/package.json +3 -2
package/CHANGELOG.md ADDED
@@ -0,0 +1,1650 @@
1
+ # @nxgt/material-vue
2
+
3
+ ## 0.26.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#431](https://github.com/softistx/nxgt-material/pull/431) [`bd58a6f`](https://github.com/softistx/nxgt-material/commit/bd58a6f67bdc25d4b4d0d7d88c52784869ad1529) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `DataTable` renders server-side data: one page from a loader, with the query in the URL. Everything is opt-in; a table that sets none of the new props renders and behaves as before.
8
+
9
+ - `manual`: `data` is one server page, rendered as given — no client paging, sorting or filtering — and the footer becomes `DataTableServerFooter` (exported).
10
+ - `pagination={{ totalCount, offset, previous, next }}`: the server footer's range ("41–60 of 133", `material.table.pagination.range`) and Previous / Next, each an href (a real link, `rel="prev"` / `rel="next"`, that works with no JavaScript) or a callback (a button); disabled when absent and while `loading`.
11
+ - Controlled sorting: `sorting` + `onSortingChange(sorting)` in React, `v-model:sorting` in Vue. The headers show the sorting they are given; the callback receives the new `SortingState`, not an updater.
12
+ - `getRowId(row, index)` and controlled selection by id: `rowSelection` + `onRowSelectionChange(selection)` in React, `v-model:row-selection` in Vue. Ids of other pages are kept, and the server footer counts them all.
13
+ - `getRowHref(row)`: the first data cell becomes a link to the row's page, and a click anywhere else on the row (but on a control, in a portal, or at the end of a text selection) follows it. `onRowClick(row, event)` (`@row-click` in Vue) makes the row focusable and activatable with Enter.
14
+ - `linkComponent`: the link rendered for row and page links, given `href` (wrap React Router's `Link` or vue-router's `RouterLink`, which take `to`). Default: a plain `<a>`.
15
+ - `footer`: a render function (React, Vue) or the `#footer` slot (Vue) replaces the footer; `footer={false}` removes it.
16
+ - New `material.table.pagination.*` strings, in English and French: `label`, `range`, `range-open`, `total`, `selected`.
17
+
18
+ `@nxgt/material-core` gains `/row-activation` (`isRowActivation`, `followRowLink`, `ROW_CONTROL_SELECTOR`, `ROW_LINK_SELECTOR`, `RowClick`): the clickable-row rule both libraries' `DataTable` use.
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies [[`bd58a6f`](https://github.com/softistx/nxgt-material/commit/bd58a6f67bdc25d4b4d0d7d88c52784869ad1529)]:
23
+ - @nxgt/material-core@0.4.0
24
+
25
+ ## 0.25.2
26
+
27
+ ### Patch Changes
28
+
29
+ - [#429](https://github.com/softistx/nxgt-material/pull/429) [`89c1e07`](https://github.com/softistx/nxgt-material/commit/89c1e078eec9ab7368882b6a90f53ebe9ed7951b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: the README has a "Using with Claude Code" section. The
30
+ `softistx/nxgt-material` repository is now a Claude Code plugin marketplace
31
+ for apps that use the libraries — `nxgt-material` for React apps,
32
+ `nxgt-material-vue` for Vue and Nuxt apps — each with a skill that reads the
33
+ installed package's docs, a screen-builder agent, an upgrade-assistant agent
34
+ and an advisory hook that names the component a file hand-rolls. Install
35
+ with `/plugin marketplace add softistx/nxgt-material`, then
36
+ `/plugin install nxgt-material@nxgt-material` (or
37
+ `nxgt-material-vue@nxgt-material`); the repository is private, so this needs
38
+ GitHub access. Nothing in the package itself changed.
39
+
40
+ - [#429](https://github.com/softistx/nxgt-material/pull/429) [`13c3eda`](https://github.com/softistx/nxgt-material/commit/13c3edad01f08656ca196aca7c37a21e8c003466) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The package ships its `CHANGELOG.md` (now in `files`), so the notes of every
41
+ version are in `node_modules/<package>/CHANGELOG.md` next to the docs, for
42
+ reading offline and for the upgrade agents of the Claude Code plugins.
43
+ The getting-started pages of `@nxgt/material` and `@nxgt/material-vue`
44
+ list it among the tarball's contents.
45
+ - Updated dependencies [[`13c3eda`](https://github.com/softistx/nxgt-material/commit/13c3edad01f08656ca196aca7c37a21e8c003466)]:
46
+ - @nxgt/material-core@0.3.2
47
+
48
+ ## 0.25.1
49
+
50
+ ### Patch Changes
51
+
52
+ - [#427](https://github.com/softistx/nxgt-material/pull/427) [`d4e953f`](https://github.com/softistx/nxgt-material/commit/d4e953fd4fc147b366c5d9d70ebfb1aa3a3c0ba7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: the roadmap lists what 0.25.0 shipped (`TreeSelectField`, the same options as `@nxgt/material`, `DateRangeField` presets and time, `FilePreview`) under Shipped. Troubleshooting has a new entry for `TimePicker`'s AM / PM fix — it moves the time into that half once (it could add 12 hours twice) and a click on the pressed half emits nothing — and the `FilePreview` entry quotes the HTTP error `@error` receives, `Could not read …: HTTP 404`.
53
+ - Updated dependencies [[`d4e953f`](https://github.com/softistx/nxgt-material/commit/d4e953fd4fc147b366c5d9d70ebfb1aa3a3c0ba7)]:
54
+ - @nxgt/material-core@0.3.1
55
+
56
+ ## 0.25.0
57
+
58
+ ### Minor Changes
59
+
60
+ - [#424](https://github.com/softistx/nxgt-material/pull/424) [`d90a68b`](https://github.com/softistx/nxgt-material/commit/d90a68b8f16759b44929effc426b6c3964e92a4c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `DateRangeField` (and `DateRangeFormField`) take `presets`, `with-time`,
61
+ `min-date` and `max-date`, as `@nxgt/material`'s. `presets` lists one-click
62
+ ranges beside the calendar: built-in ids (`DATE_RANGE_PRESET_IDS`: `today`,
63
+ `yesterday`, `last-7-days`, `last-30-days`, `this-month`, `last-month`,
64
+ `this-year`) and `{ label, range }` of your own, where `range` may be
65
+ `(now) => range`. A preset is a toggle button in a group named "Presets",
66
+ pressed when its days are the value's, and disabled when its range starts
67
+ before `min-date`, ends after `max-date`, either end is one of
68
+ `disabled-days`, or (a preset of your own) its end comes before its start.
69
+ Picking one closes the popover, except with `with-time`, where OK closes it. `min-date` / `max-date` are
70
+ the first and last day the calendar lets you pick (Reka's `minValue` /
71
+ `maxValue`). `with-time` adds a start and an end `TimePicker` under the
72
+ calendar, each disabled until its end has a day, and an OK button; the
73
+ popover then stays open until OK (it no longer closes on the second day),
74
+ the trigger shows each end's time, a day picked on the calendar keeps the
75
+ time its end had (a new start 00:00, a new end 23:59, as the built-in
76
+ presets end), and an end set before the start on the same day becomes the
77
+ start time. Without `with-time`, a picked day still carries the current
78
+ time of day (`@nxgt/material` gives it 00:00). The built-in presets use the
79
+ current date (there is no `now` prop). `DATE_RANGE_PRESET_IDS` and the types
80
+ `DateRangePreset`, `DateRangePresetId`, `DateRangePresetOption` and
81
+ `DayRange` are exported from `@nxgt/material-vue/components` (from
82
+ `@nxgt/material-core/date-range`).
83
+
84
+ New `material.*` keys: `material.date-range-field.presets`,
85
+ `material.date-range-field.preset.today`, `.yesterday`, `.last-7-days`,
86
+ `.last-30-days`, `.this-month`, `.last-month`, `.this-year`,
87
+ `material.date-range-field.start-time`, `material.date-range-field.end-time`,
88
+ `material.time-picker.hours` and `material.time-picker.minutes`.
89
+
90
+ `TimePicker` fix, as in `@nxgt/material`: AM / PM follows the `date` it is
91
+ given, switching it always moves the time into that half of the day, a click
92
+ on the pressed half changes nothing, and the hours and minutes inputs are
93
+ named "Hours" and "Minutes".
94
+
95
+ - [#426](https://github.com/softistx/nxgt-material/pull/426) [`812c101`](https://github.com/softistx/nxgt-material/commit/812c10115278480852852084ddf06b016239e6d4) Thanks [@SteveGT96](https://github.com/SteveGT96)! - New `FilePreview` (Media & files), as in `@nxgt/material`: one file
96
+ previewed by its MIME type, else its extension. `file` is a `File`, a `Blob`
97
+ or a URL, with optional `type` and `name` overriding what the file says. An
98
+ image is an `<img>` whose alt text is the file name; a PDF opens in
99
+ `PdfReader`, imported the first time a PDF is previewed, and falls back to
100
+ the file card when the viewer cannot be loaded; a video or audio file gets
101
+ the browser's `<video controls>` / `<audio controls>`; a text, JSON, CSV or
102
+ Markdown file is read up to `max-text-bytes` (256 KB by default) and shown in
103
+ a scrolling `<pre>`, JSON in `JsonViewer` and Markdown rendered, with
104
+ "Showing the first … of this file." when it was cut; anything else is a
105
+ `FileCard` with its size and type and a Download link. A text is decoded
106
+ with the `charset` of the response's `Content-Type` when the browser supports
107
+ it, else as UTF-8. A URL must be `http(s):`, relative, `blob:`, or a
108
+ `data:` URL of an image, video, audio, plain text, CSV, Markdown, JSON or PDF: any other (`javascript:`, `data:text/html`, and
109
+ also a `data:` URL of XML, TSV or YAML) is never linked, loaded or fetched,
110
+ and shows the error state with no Download link and a
111
+ `FilePreviewUnsafeUrlError` ("Refused to preview a URL with an unsafe scheme") for `@error`. A PDF the reader fails to open
112
+ stays `ready`: `PdfReader` shows its own error. The scrolling text and
113
+ Markdown are regions named "Contents of {name}", and "Loading preview…" is
114
+ announced from a live region that stays mounted. A `File` or `Blob` is
115
+ shown through an object URL, revoked on change and on unmount. On the server,
116
+ and until mounted, it renders an empty placeholder (`data-state="pending"`):
117
+ no object URL, no fetch, nothing to mismatch on hydration. Then `loading`,
118
+ `ready` or `error` ("This file could not be previewed.", with a Download
119
+ link), and it emits `error`. Also exported from
120
+ `@nxgt/material-vue/components`: `fileKind`, `FilePreviewHttpError`,
121
+ `FilePreviewUnsafeUrlError`, `TEXT_PREVIEW_MAX_BYTES` and the types `FileKind`, `FilePreviewSource`,
122
+ `FilePreviewProps` and `FilePreviewStatus` (from
123
+ `@nxgt/material-core/file-preview`). The Nuxt module registers
124
+ `FilePreview`.
125
+
126
+ New `material.*` keys: `material.file-preview.label`,
127
+ `material.file-preview.untitled`, `material.file-preview.loading`,
128
+ `material.file-preview.error`, `material.file-preview.download`,
129
+ `material.file-preview.truncated` and `material.file-preview.content`.
130
+
131
+ `useImagePreview` (public) now goes through `useBlobUrl` and cleans up with
132
+ `onScopeDispose`, so it also works inside an effect scope.
133
+
134
+ - [#418](https://github.com/softistx/nxgt-material/pull/418) [`01d96ca`](https://github.com/softistx/nxgt-material/commit/01d96ca739bb9565c841c7944294df24eb378e07) Thanks [@SteveGT96](https://github.com/SteveGT96)! - **`TreeSelectField`** and **`TreeSelectFormField`**, in both libraries under the same names: a form field that opens the `Tree` in a popover.
135
+
136
+ - `items` takes `Tree`'s nodes. The value is the picked node's id (`string | null`), or the ids with `multiple` (`string[]`): `value` / `onValueChange` in `@nxgt/material`, `v-model` in `@nxgt/material-vue`. The field is controlled only: it holds no value of its own.
137
+ - Single: a pick closes the popover and the trigger shows the node's label. `multiple`: checkboxes in the tree, and each pick is a dismissible `Chip` beside the trigger, its remove button named "Remove {label}".
138
+ - `searchable` adds a filter above the tree; each match stays under its ancestors, which open.
139
+ - Removing a chip hands focus to the next chip, else the previous one, else the trigger, so a keyboard user is not dropped to the page (nor the form field touched).
140
+ - The trigger is a `combobox` named by the label, with `aria-expanded` and `aria-controls`, and the popover is named by the label too; the tree keeps its own keys, and Escape closes the popover and returns focus to the trigger. `id`, `aria-describedby` and `data-*` attributes go on the trigger. It renders on the server.
141
+ - `TreeSelectFormField` binds it to react-hook-form (`control`, `name`, `multiple`) or vee-validate (`name`, `multiple`), touched when focus leaves the trigger and its popover.
142
+ - New copy under `material.tree-select-field.*` (`placeholder`, `search`, `empty`, `selected`), in English and French.
143
+
144
+ **`Tree`**: when its nodes change (a filter) or a branch folds and the row that had the keyboard is no longer shown, the first visible row takes `tabindex="0"`, so Tab still reaches the tree. `useTree` returns that row as `tabbableId`, in both libraries. In `@nxgt/material`, mounting a `Tree` no longer moves focus into it: focus follows the keyboard only, as in `@nxgt/material-vue`.
145
+
146
+ - [#420](https://github.com/softistx/nxgt-material/pull/420) [`f4ca69b`](https://github.com/softistx/nxgt-material/commit/f4ca69ba5dd7b80f92cdd5374cf6fd01f155784d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `@nxgt/material-vue` takes the remaining options of `@nxgt/material`, under the same names. Nothing renders differently for code that does not use them; the one change in behaviour, `toAttributeFormSchema`'s error paths, is described after this list:
147
+
148
+ - `Autocomplete` and `AutocompleteFormField` are generic: `options` takes your own option type, read by `get-option-value` / `get-option-label`, and the `#option`, `#selected-leading` and `#actions` slots (React's `renderOption`, `renderSelectedLeading`, `actions`) receive it. `free-solo-label` names the free-solo button.
149
+ - `FilesFormField`: a free-solo autocomplete of file URLs bound to vee-validate, with image thumbnails (`image`, `image-link-builder`).
150
+ - `ConfirmationDialog` `form-options`: a Zod 4 schema (or any Standard Schema, or a vee-validate typed schema) and its `defaultValues`; the `#form` slot renders the fields, confirm waits for a valid form, and `@confirm` receives the parsed values. The form's code (and vee-validate) loads only for a dialog with `form-options`; if it cannot load, after one retry, the dialog says so (`material.confirm-dialog.form-failed`, also added to `@nxgt/material`'s bundles so the keys stay the same).
151
+ - `DateField` and `DateRangeField` `disabled-days`: React's day rules (a day, a list, a range, before / after, days of the week, a function, or a list of those). `DayMatcher` and `DisabledDays` are exported.
152
+ - `SliderField` `ticks`, `leading` and `trailing` (props, or `#leading` / `#trailing` slots).
153
+ - `Avatar` `status` and `status-pulse`: a presence dot named Online, Away, Busy, Offline or Active.
154
+ - `QRCode` `#logo` slot (the default slot still works).
155
+ - `AccordionCard` `#header`, `#title` and `#content` slots.
156
+ - `SelectField` `#option` slot.
157
+ - `CodeEditor` `options`: Monaco's own construction options, passed through (`CodeEditorOptions` is exported). Monaco stays client-only.
158
+ - `Tabs` `variant="line"` (`TabsVariant` is exported).
159
+
160
+ `Autocomplete`, `AutocompleteFormField`, `ConfirmationDialog` and `FilesFormField` are generic components now (`<script setup generic>`): templates infer the option and schema types, but `InstanceType<typeof Autocomplete>` no longer type-checks; use `ComponentExposed` from `vue-component-type-helpers` instead if you need the instance type.
161
+
162
+ `toAttributeFormSchema` (exported from `@nxgt/material-vue`) now goes through the same Standard Schema adapter as `ConfirmationDialog`: an option's error is reported at `options[0]` rather than `options.0`, and each field has one entry holding all its messages.
163
+
164
+ `@nxgt/material`'s README and component pages name these Vue counterparts, and its `SliderField` reads its tick positions from `@nxgt/material-core/slider-ticks`, the same code as before.
165
+
166
+ ### Patch Changes
167
+
168
+ - [#425](https://github.com/softistx/nxgt-material/pull/425) [`8092210`](https://github.com/softistx/nxgt-material/commit/80922105439dcac15b9564864c8945e5edd64aa8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The `DateRangeField` `with-time` story picks two days and checks they start
169
+ at 12:00 AM and end at 11:59 PM.
170
+
171
+ - [#419](https://github.com/softistx/nxgt-material/pull/419) [`02efc3e`](https://github.com/softistx/nxgt-material/commit/02efc3e57a60b533596fd644ebbfc856186664f8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: the i18n guide names the pagination keys `material.pagination.previous`,
172
+ `next`, `page` and `more` (`@nxgt/material`); `InlineEdit` says where focus
173
+ goes when the editor closes, and its Vue props table lists `label` and
174
+ `name`; the Vue `DocLink` paragraph says that without `@navigate` it and the
175
+ sidebar are plain anchors that load the page.
176
+ The Vue i18n guide also names `material.slider.value`, `minimum` and
177
+ `maximum`, which label the slider readout.
178
+
179
+ - [#419](https://github.com/softistx/nxgt-material/pull/419) [`99878c9`](https://github.com/softistx/nxgt-material/commit/99878c9bdb0d4c33fd6a777970c4f3735bd5ef3b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader`: opening on an `initialPage` no longer reports another page on a
180
+ slow device. The placement scroll could land after the scroll spy's hold had
181
+ run out, and near the end of the document it read as the last page. While
182
+ the view stays where the opening page's pin put it (that page at the top,
183
+ or the page area at its end with that page not above the top), a scroll is the reader's own and is not
184
+ reported; a scroll that moves the view elsewhere — the user's, find in page,
185
+ a screen reader's cursor — lets go of the pin and is reported. A wheel,
186
+ touch, pointer or key in the page area also ends the hold on the reader's
187
+ own scroll, so the scrolling after it is reported at once. In
188
+ `@nxgt/material-core/pdf-viewer`, `pinToPage` takes an optional `onRelease`,
189
+ called once when the pin lets go, and `pinHolds(node)` tells whether the view
190
+ is still where the pin puts it.
191
+
192
+ - [#421](https://github.com/softistx/nxgt-material/pull/421) [`0cf0b4f`](https://github.com/softistx/nxgt-material/commit/0cf0b4f3d5fd5e7f9ff33b5c8ba80174d22f563b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The roadmap lists what 0.24.0 shipped under Shipped, and the troubleshooting entry for `Table` attributes names the version it applies from (0.24.0).
193
+
194
+ - [#419](https://github.com/softistx/nxgt-material/pull/419) [`2a41ae1`](https://github.com/softistx/nxgt-material/commit/2a41ae13664b425c6c7d37b921e95914eabb2552) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `NumberField` takes an `aria-labelledby`, as `@nxgt/material`'s does, for an
195
+ input that is a part of a larger field. The `material.slider.value` key is
196
+ added to keep the bundles in step with `@nxgt/material`, whose single-value
197
+ `Slider` readout input it names.
198
+ - Updated dependencies [[`d90a68b`](https://github.com/softistx/nxgt-material/commit/d90a68b8f16759b44929effc426b6c3964e92a4c), [`812c101`](https://github.com/softistx/nxgt-material/commit/812c10115278480852852084ddf06b016239e6d4), [`f4ca69b`](https://github.com/softistx/nxgt-material/commit/f4ca69ba5dd7b80f92cdd5374cf6fd01f155784d), [`99878c9`](https://github.com/softistx/nxgt-material/commit/99878c9bdb0d4c33fd6a777970c4f3735bd5ef3b)]:
199
+ - @nxgt/material-core@0.3.0
200
+
201
+ ## 0.24.0
202
+
203
+ ### Minor Changes
204
+
205
+ - [#417](https://github.com/softistx/nxgt-material/pull/417) [`920e6d5`](https://github.com/softistx/nxgt-material/commit/920e6d5f176ba3050ecb8f0ae390ce9d915cf4f7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `DataTable`: a `loading` prop. With no row to show, the body is skeleton rows
206
+ (`Skeleton`), one cell per visible column, as many as the page size or
207
+ `loadingRows`; with rows already shown, they stay in place, dimmed and
208
+ `inert`, so a refresh does not move the page. The table is `aria-busy` and a
209
+ visually hidden status says "Loading data…" (`material.table.loading`, en and
210
+ fr: translate it if you override the bundles or ship another language).
211
+ Sorting (`DataTableColumnHeader`), the `select` column's "Select all", the
212
+ toolbar's native controls and pagination (`DataTablePagination`'s new
213
+ `disabled`) are disabled meanwhile; the toolbar is now a `<fieldset>`.
214
+
215
+ An `#empty="{ filtered }"` slot replaces the "No data available" row, inside
216
+ a `TableEmpty` spanning every visible column; `filtered` is `true` when rows
217
+ exist but none matches the column filters. The default empty row is a
218
+ `TableEmpty` too, and spans the visible columns rather than every defined
219
+ one, as an expanded row now does. A slot that renders nothing gets the
220
+ default. New type: `DataTableEmptyState`.
221
+
222
+ `Table` now puts the attributes you pass (`aria-*`, `id`, `style`,
223
+ listeners) on the `<table>`, as `@nxgt/material` does, instead of on its
224
+ scrolling container; `class` was already the table's. A `style="max-height:…"`
225
+ or a `@scroll` on `<Table>` therefore no longer limits or follows the
226
+ scrolling: put the height limit on a wrapper of your own (see "A `Table`'s
227
+ `id`, `aria-*` or `style` is no longer on its scrolling container" in
228
+ troubleshooting).
229
+
230
+ The table body's `max-h-[300px] overflow-auto` is gone: a table row group is
231
+ neither clipped nor scrolled, so it never had an effect (the wrapper's
232
+ `max-h-[400px]` still scrolls the table).
233
+
234
+ - [#415](https://github.com/softistx/nxgt-material/pull/415) [`19c92f3`](https://github.com/softistx/nxgt-material/commit/19c92f348664ed7d49810006748a494fbeed5b60) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `@nxgt/material-vue` gains the exports `@nxgt/material` already had, under the
235
+ same names:
236
+
237
+ - `Checkbox` takes `label` and `helper-text` (or the `#label` and
238
+ `#helper-text` slots) and then renders the box in a labelled row. Without
239
+ them it is the same bare Reka UI box as before. `CheckboxFormField` is its
240
+ vee-validate wrapper: an unset value shows as indeterminate, and an
241
+ indeterminate value is written as `null`.
242
+ - `InlineEditFormField` (the value changes on save) and `CodeEditorFormField`
243
+ (Monaco still loads in the browser only).
244
+ - `PaginationBar` (`v-model:page`, `page-count`, `sibling-count`), the
245
+ `paginationItems` window it renders, and `PaginationLink`.
246
+ - `CopyValue`, a value in a monospace chip with its copy button.
247
+ - `MermaidDiagram`, one mermaid chart rendered in the browser only.
248
+ - The `Doc` parts `DocArticle`, `DocNav`, `DocLink`, `DefaultDocLink` and
249
+ `DocCopyPage`, with the `DocArticleProps`, `DocNavProps` and `DocLinkProps`
250
+ types, to build a documentation shell of your own.
251
+
252
+ Fixed in `Doc`: a parent's `@navigate` runs once per click (it ran twice);
253
+ without a navigate handler the links are plain anchors again, instead of
254
+ links that went nowhere; and the shell follows later `pathname`, `items`,
255
+ `toc`, `previous` and `next` changes, so the active entry tracks the route.
256
+
257
+ The Nuxt module registers the new components. In `@nxgt/material`, the README
258
+ and component pages name these Vue equivalents and list what is still
259
+ React-only.
260
+
261
+ ### Patch Changes
262
+
263
+ - [#413](https://github.com/softistx/nxgt-material/pull/413) [`5933ad4`](https://github.com/softistx/nxgt-material/commit/5933ad4d63473935a7a7fcf84113940af763314d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Alert`: a long word or URL in the title or description wraps inside the
264
+ alert instead of overflowing it, and the `#icon` slot keeps its size. The
265
+ text column now shrinks (`min-w-0`) and breaks long words, as `Banner`'s
266
+ text column does, and the icon sits in a `shrink-0` wrapper.
267
+
268
+ - [#416](https://github.com/softistx/nxgt-material/pull/416) [`7656bd3`](https://github.com/softistx/nxgt-material/commit/7656bd39810ae873685444177a1265ac3d546022) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Button`: an `Icon` inside a button that has text (or an `aria-label` /
269
+ `aria-labelledby`) is now `aria-hidden`, so the button is announced "Add"
270
+ instead of "Icon plus Add". A `Button` holding only an `Icon` still reads it,
271
+ and so does one whose only other text is `aria-hidden` (a decorative count).
272
+ If a test of yours found such a button by "Icon {name} …", select it by its
273
+ text — see "A button named "Icon plus Add" is now named "Add"" in
274
+ `docs/troubleshooting.md`.
275
+
276
+ - [#416](https://github.com/softistx/nxgt-material/pull/416) [`5f5cd1a`](https://github.com/softistx/nxgt-material/commit/5f5cd1a9fddd01af0b5d13673d8c2b614ee7609f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Fixes found by new interaction tests for `NumberField`, `ColorField` and
277
+ `InlineEdit`:
278
+
279
+ - `ColorField` without `v-model`: text that is not a hex stayed in the field
280
+ and painted the swatch; it now puts the last valid color back, as with
281
+ `v-model`.
282
+ - `InlineEdit`: Enter emitted `save` (and `update:modelValue`) twice, and
283
+ Escape emitted it with the old text — removing the focused input fired its
284
+ blur, which saved again. It no longer does. Closing the editor with Enter,
285
+ Escape, Save or Cancel now returns focus to the field instead of `<body>`,
286
+ and reopening it focuses the input every time (it relied on `autofocus`,
287
+ which a browser honours once per document).
288
+
289
+ - [#416](https://github.com/softistx/nxgt-material/pull/416) [`1c60b25`](https://github.com/softistx/nxgt-material/commit/1c60b25281900c4a34a9b57d742b3d213031b170) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Long content no longer breaks `ListTile`, `StatCard`, `Banner` or `Stepper`.
290
+
291
+ - `ListTile`: a long title or an unbroken URL wraps inside the tile instead
292
+ of scrolling sideways, and the `leading` / `trailing` pieces keep their
293
+ size (a trailing chevron was squeezed to a sliver).
294
+ - `StatCard`: a long label, value or hint wraps inside the card instead of
295
+ running out of it; the icon and the delta keep their size.
296
+ - `Banner`: a long title or description wraps instead of scrolling sideways;
297
+ the icon keeps its size.
298
+ - `Stepper`: a long step title or label truncates with an ellipsis instead of
299
+ scrolling inside its step.
300
+
301
+ - [#413](https://github.com/softistx/nxgt-material/pull/413) [`9894685`](https://github.com/softistx/nxgt-material/commit/9894685ef7a805c9af7cf01f2edb4bc36174a9af) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Filter`: a `number-range` field is now a `role="group"` named by its label
302
+ (and described by its description and error), so two range filters no longer
303
+ read as "Min", "Max", "Min", "Max"; the inputs keep "Min" and "Max" as their
304
+ part names, as `DurationField` does. A `slider-range` field now shows its
305
+ label and description (it rendered the bare slider, with thumbs named only
306
+ "Minimum" and "Maximum") through `SliderField`, with its readout text ("20 – 70"), as
307
+ `@nxgt/material` does, and
308
+ a labelled range `SliderField` is a group named by its label. The
309
+ `material.slider.minimum` / `maximum` keys are added to keep the bundles in
310
+ step with `@nxgt/material`.
311
+
312
+ - [#414](https://github.com/softistx/nxgt-material/pull/414) [`79887f0`](https://github.com/softistx/nxgt-material/commit/79887f0554ff018c71969d623d06adc56ac1ebd2) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `@nxgt/material` gains components and helpers `@nxgt/material-vue` already had, under the same public names unless noted:
313
+
314
+ - **`Camera`** is exported, with `useCamera`, `useCameraContext`, `capturePhotoFromVideo`, `isCameraSupported`, `requestCameraPermissions`, `getCameraDevices` and their types. `createCameraStore` is React's counterpart to Vue's `useCameraStore`. `Camera` renders in the browser only, after mount, so it is safe in an SSR page, and each `Camera` keeps its own state.
315
+ - **`NativeSelect`**, `NativeSelectOption` and `NativeSelectOptGroup`: the browser's own `<select>`, styled; an invalid one uses the `error` colour.
316
+ - **`InputOTP`**, `InputOTPGroup`, `InputOTPSlot` and `InputOTPSeparator`, the parts `OtpField` is built from. `InputOTPSeparator` now has `role="separator"` and takes children.
317
+ - **`PaginationFirst`** and **`PaginationLast`** (double chevrons), **`TableEmpty`**, **`DialogScrollContent`**, and the **`ToastAction`** type.
318
+ - **`Button` `size`**: `xs`, `sm`, `default`, `lg`, and the square `icon-xs`, `icon-sm`, `icon` and `icon-lg`. A button without `size` renders as before.
319
+ - **`RadioGroupField`, `SliderField` and `SwitchField`**: aliases of `RadioGroup`, `Slider` and `Switch` (with `*FieldProps`), so code reads the same in both libraries. Nothing is renamed or deprecated; the full naming alignment is planned for 3.0.
320
+
321
+ `@nxgt/material-vue`:
322
+
323
+ - An `icon*` `Button` holding an icon is square again: the base `has-[>svg]:px-3` padding no longer survives the icon sizes.
324
+ - An invalid `NativeSelect` uses the library's `error` colour instead of `destructive`.
325
+ - `PaginationFirst` and `PaginationLast` show double chevrons, so they no longer look like Previous and Next when their text is hidden on a narrow screen.
326
+ - Its README and component pages name the new React counterparts.
327
+
328
+ - [#411](https://github.com/softistx/nxgt-material/pull/411) [`c346b2b`](https://github.com/softistx/nxgt-material/commit/c346b2be2acae80990ae3b8e937b652db30c240b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The roadmap (`docs/roadmap.md`) lists the upcoming component work: the fixes
329
+ in progress, the exports and options shared with `@nxgt/material`, and the
330
+ `DateRangeField` presets, `TreeSelectField`, `DataTable` loading and empty
331
+ states and `FilePreview` to follow. The `Combobox` primitive family is recorded
332
+ as not planned, with its reason.
333
+
334
+ - [#413](https://github.com/softistx/nxgt-material/pull/413) [`f4b1edf`](https://github.com/softistx/nxgt-material/commit/f4b1edf209c4c5c21304b599b84eee924777fca0) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Slider` / `SliderField`: the thumb takes the theme's background colour
335
+ (`bg-background`) instead of `bg-white`, so it no longer shows as a white
336
+ disc in dark mode, as in `@nxgt/material`.
337
+
338
+ - [#413](https://github.com/softistx/nxgt-material/pull/413) [`95576c4`](https://github.com/softistx/nxgt-material/commit/95576c44ae76dac1b21e556b21b39443b1359b0b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Spinner` (`variant="1"`): `color="light"` is white again and `color="default"`
339
+ follows the foreground colour. The variant listed `default` twice, so
340
+ `default` rendered white and `light` had no colour, which made a spinner on a
341
+ dark surface (the player's buffering indicator) look static. A filled
342
+ `Button` with `spinnerVariant="1"` gets a white loading spinner again too.
343
+
344
+ - [#416](https://github.com/softistx/nxgt-material/pull/416) [`8265d9a`](https://github.com/softistx/nxgt-material/commit/8265d9af7aaf9715e1a96d56de2bf62324c21f06) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Stepper`: step ids are unique per stepper, and the steps say their state to
345
+ assistive tech.
346
+
347
+ - Each step's `id` was a static `step-N`, so two steppers on one page
348
+ produced duplicate ids. It is now prefixed with Vue's `useId`.
349
+ **Note:** if a test or stylesheet of yours targets `#step-N`, select the
350
+ step by `data-pw` instead (`step-N`, or `<name>-step-N`, now on every step
351
+ as in `@nxgt/material`) — see "A `Stepper` step selected by `#step-N` stops
352
+ matching" in `docs/troubleshooting.md`.
353
+ - The steps are an `<ol>` of `<li>`; the current step's button carries
354
+ `aria-current="step"`; a completed or failed step adds visually hidden text
355
+ (`material.stepper.completed`, `material.stepper.error`) so a screen reader
356
+ does not depend on the icon.
357
+ - A long step title no longer widens its column or pushes the next step: the
358
+ columns are `minmax(0, 1fr)` and the title truncates with an ellipsis.
359
+
360
+ ## 0.23.4
361
+
362
+ ### Patch Changes
363
+
364
+ - [#409](https://github.com/softistx/nxgt-material/pull/409) [`a31ce5f`](https://github.com/softistx/nxgt-material/commit/a31ce5f1db0a6feae418c49d14b845321957cbbc) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `ActionCard` (`variant="md"`): without an `#icon` slot, the check indicator
365
+ now sits at the right edge of the card instead of the left, as it does with
366
+ an icon and in `variant="sm"`.
367
+ The `md` indicator also gets the `sm` one's look: a bordered circle when
368
+ inactive, and the same transition.
369
+
370
+ ## 0.23.3
371
+
372
+ ### Patch Changes
373
+
374
+ - [#406](https://github.com/softistx/nxgt-material/pull/406) [`b890457`](https://github.com/softistx/nxgt-material/commit/b8904573f18dc6d0cdd16f62146183ff0b7aef18) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Internal: `formatFileSize` and the pdfkit font resolution the Nuxt module
375
+ runs for Nitro's trace now come from `@nxgt/material-core`
376
+ (`/format-file-size`, `/pdfkit-fonts`), shared with `@nxgt/material`, instead
377
+ of a copy in this package. No API change: `formatFileSize` is still exported
378
+ by name, and the module adds the same files to `nitro.externals.traceInclude`.
379
+ When some fonts cannot be resolved, `nuxi build` now prints one
380
+ `pdf fonts:` warning naming every failure, instead of one per font.
381
+ - Updated dependencies [[`bf43a14`](https://github.com/softistx/nxgt-material/commit/bf43a14abb147e6dcd2bcac5f1e0e359b0aae6a2), [`b890457`](https://github.com/softistx/nxgt-material/commit/b8904573f18dc6d0cdd16f62146183ff0b7aef18)]:
382
+ - @nxgt/material-core@0.2.0
383
+
384
+ ## 0.23.2
385
+
386
+ ### Patch Changes
387
+
388
+ - [#403](https://github.com/softistx/nxgt-material/pull/403) [`6a4938e`](https://github.com/softistx/nxgt-material/commit/6a4938e8624fbb5802a9835bc510e441d5fee4de) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The French UI now says « Enregistrer » for the save action everywhere:
389
+ `material.buttons.save` read « Sauvegarder » while every component's own `save`
390
+ key already read « Enregistrer ». Consumers who assert on the French label in
391
+ their own tests will now see « Enregistrer ».
392
+
393
+ - [#402](https://github.com/softistx/nxgt-material/pull/402) [`6fe042b`](https://github.com/softistx/nxgt-material/commit/6fe042b212896c58bdfd831cc663fa2806d7d657) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `NetworkUploadField`, its size-limit messages ("File exceeds maximum size of
394
+ …", the drop zone's "Max 2.0 MB") and the chat composer's attachment chip now
395
+ format sizes with the exported `formatFileSize`, as `FileList` and `FileCard`
396
+ already did. A negative, `NaN` or infinite size now shows nothing instead of
397
+ `NaN undefined` or `Infinity GB`; every other size reads as before.
398
+
399
+ ## 0.23.1
400
+
401
+ ### Patch Changes
402
+
403
+ - [#398](https://github.com/softistx/nxgt-material/pull/398) [`dac4ddf`](https://github.com/softistx/nxgt-material/commit/dac4ddf2d15190a904ae55b56ea3e31b9616990d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `ImageCropper` and `ImageCropperDialog` no longer throw
404
+ `TypeError: Cannot read properties of null (reading 'naturalHeight')` when
405
+ they are closed or unmounted while the photo is still loading. The error came
406
+ from the cropper's stencil preview and was uncaught, so it surfaced in
407
+ whatever ran next.
408
+
409
+ - [#399](https://github.com/softistx/nxgt-material/pull/399) [`448b036`](https://github.com/softistx/nxgt-material/commit/448b0360ee21de7ec750e134941bcb3e0d519a24) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The Nuxt module now adds pdfkit's standard-font files to what Nitro copies
410
+ into `.output/server/node_modules`. Before, a production build rendered no
411
+ PDF on the server: every `pdfResponse` route answered HTTP 500 with
412
+ `Cannot find module '…/pdfkit/js/standard-fonts/Helvetica.cjs'`, because
413
+ pdfkit loads those files with a runtime `require` Nitro's tracer never sees.
414
+ `nuxi dev` and servers built with `pdf.bundleStandardFonts` under
415
+ `noExternals` were not affected. `@nxgt/material-core` needs nothing more:
416
+ Nitro traces it like any dependency, or inlines it under `noExternals`.
417
+
418
+ - [#398](https://github.com/softistx/nxgt-material/pull/398) [`b4e5770`](https://github.com/softistx/nxgt-material/commit/b4e5770922ad4582a1ad2dcca439f7c8c999a0c7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: the roadmap's Shipped list now has 0.23.0 — the framework-free code comes from `@nxgt/material-core`, with the same imports as before.
419
+ - Updated dependencies [[`1abb908`](https://github.com/softistx/nxgt-material/commit/1abb90800ec213d8ec98abd7df5dda9f65c14204), [`b4e5770`](https://github.com/softistx/nxgt-material/commit/b4e5770922ad4582a1ad2dcca439f7c8c999a0c7)]:
420
+ - @nxgt/material-core@0.1.1
421
+
422
+ ## 0.23.0
423
+
424
+ ### Minor Changes
425
+
426
+ - [#391](https://github.com/softistx/nxgt-material/pull/391) [`deaf0c4`](https://github.com/softistx/nxgt-material/commit/deaf0c49cbc2268fd20e9e2272104dbd27e4ce7f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `@nxgt/material-vue` now depends on a new package, `@nxgt/material-core`,
427
+ which your install adds on its own: there is nothing to change in your
428
+ `package.json`, your imports or your Nuxt config.
429
+
430
+ `@nxgt/material-core` holds the code `@nxgt/material-vue` and
431
+ `@nxgt/material` used to ship as two identical copies: the PDF document model
432
+ and its renderer, the print formatters (`formatAmount`, `formatDate`,
433
+ `createFormatters`), the column and value helpers of `/pdf`, the PDF file
434
+ helpers behind `PdfReader` and `usePdf`, the page geometry, scroll spy and
435
+ text search inside `PdfReader`, the decimals of `CurrencyField`, the rule that
436
+ keeps a field from blurring while focus is in its own popover, and
437
+ `pdfkitStandardFonts()`.
438
+ `@nxgt/material-vue/pdf`, `/lib`, `/vite`, `/components` and the other
439
+ entries export exactly the same names as before, with the same types, and now
440
+ import that code from `@nxgt/material-core` instead of bundling it. `react`
441
+ and `@react-pdf/renderer` stay optional peers, loaded only when a PDF is
442
+ rendered.
443
+
444
+ One case to check: a server bundled into a single file and run **without**
445
+ `node_modules` must bundle `@nxgt/material-core` too, like any other
446
+ dependency of `@nxgt/material-vue` — a bundler that inlines everything
447
+ already does. A server that keeps `node_modules` loads it from there. With Vite, list both:
448
+ `ssr: { noExternal: ['@nxgt/material-vue', '@nxgt/material-core'] }`. Without it
449
+ the server fails at boot with `Cannot find package '@nxgt/material-core'`
450
+ ([troubleshooting](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/troubleshooting.md#cannot-find-package-nxgtmaterial-core)).
451
+
452
+ ### Patch Changes
453
+
454
+ - [#388](https://github.com/softistx/nxgt-material/pull/388) [`a3dae5c`](https://github.com/softistx/nxgt-material/commit/a3dae5c66b76e6ab31f591fddefdd0723a640152) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The README now links to the upgrade notes in Getting started, which list what to check when moving to each version.
455
+ - Updated dependencies [[`deaf0c4`](https://github.com/softistx/nxgt-material/commit/deaf0c49cbc2268fd20e9e2272104dbd27e4ce7f)]:
456
+ - @nxgt/material-core@0.1.0
457
+
458
+ ## 0.22.0
459
+
460
+ ### Minor Changes
461
+
462
+ - [#157](https://github.com/softistx/nxgt-material-vue/pull/157) [`be1264a`](https://github.com/softistx/nxgt-material-vue/commit/be1264a9d9fec18e22a7f3f8a272df6eb53773e3) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `AttributesField` follows its `attributes`, and shows helper text
463
+
464
+ - `AttributesField` read `attributes` once, on mount, so a form `resetForm()`
465
+ or `setFieldValue()` on an `AttributesFormField` did not change the list on
466
+ screen. It now follows the prop when its value changes, without echoing the
467
+ change back through `onChange`. A new array with the same content (a list
468
+ rebuilt on each render) is not a change and does not undo the user's edits.
469
+ Edits no longer mutate the array you passed in place.
470
+ - `AttributesField` gains `error` and `helperText`. `AttributesFormField`
471
+ passes its error through them and gains a `helperText` prop, shown when
472
+ there is no error.
473
+
474
+ - [#223](https://github.com/softistx/nxgt-material-vue/pull/223) [`58ee698`](https://github.com/softistx/nxgt-material-vue/commit/58ee698e4bbc4bc10204fb507ae7adeb756d565f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `CurrencyField` / `CurrencyFormField`: new `fraction-digits` option. The
475
+ amount is shown with the currency's own decimals by default (ISO 4217: `JPY`
476
+ 0, `EUR` 2, `KWD` 3), the rule `formatAmount` already follows; it always
477
+ showed two before. Pass `:fraction-digits="2"` to keep two decimals whatever
478
+ the currency; it is clamped to 0–20 (the range every `Intl.NumberFormat`
479
+ accepts), and `NaN` or `Infinity` counts as not given. The emitted number is
480
+ unchanged.
481
+
482
+ The helpers guide now says which formatter to use: `useFormatters()`'s
483
+ `formatAmount` for money, `useNumberFormatter()` for the other
484
+ `Intl.NumberFormat` styles.
485
+
486
+ - [#200](https://github.com/softistx/nxgt-material-vue/pull/200) [`eb82839`](https://github.com/softistx/nxgt-material-vue/commit/eb828391bc6dee29108fbd95dfbee5069ecc3a0c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Every `*FormField` now marks its field touched when focus leaves it **and validates it then**, so a required field's error appears as the user moves past it rather than only on submit — as vee-validate's `<Field>` does by default (`validateOnBlur: true`). Until now no wrapper but `RichTextEditorFormField` and `FilterFormField` called `handleBlur`, so `meta.touched` stayed `false` until submit and "show errors once touched" never showed anything. Moving between a field's own controls, or into the popover or dialog it opened, is not leaving it: a picker is touched when focus leaves its trigger and its popover. `RichTextEditorFormField` now counts its toolbar as part of the field, and validates on blur too. `FilterFormField` is unchanged (touched when applied). Validation on value change and on submit is unchanged.
487
+
488
+ - [#157](https://github.com/softistx/nxgt-material-vue/pull/157) [`351fc37`](https://github.com/softistx/nxgt-material-vue/commit/351fc37dce0639078225fa47bce0451ef531e550) Thanks [@SteveGT96](https://github.com/SteveGT96)! - i18n fallbacks are formatted, and Zod messages are English in English
489
+
490
+ - Components rendered without an `I18nProvider` no longer show raw ICU
491
+ placeholders: the JsonViewer reads `3 items` (not `{count} items`), the
492
+ Kanban WIP badge `3/5`, and so on.
493
+ `useMaterialTranslation().t(key, fallback, values)` now formats the fallback
494
+ with `values`, with or without a provider, and on a server. A fallback that
495
+ cannot be formatted (a stray `{`) is shown as written, with a
496
+ `[@nxgt/material-vue] Could not format the fallback` warning in development
497
+ only. Plain fallbacks are not parsed at all, and parsed messages are cached.
498
+ - `zodLocaleError()`'s `invalid_type` messages were French in the English
499
+ bundle. They are English now (`This value must be a number.`), and a type
500
+ with no message of its own gets `This value has the wrong type.` instead of
501
+ its raw key.
502
+ - `zodLocaleError()` no longer throws on a server or when storage is blocked:
503
+ it writes English. It takes optional `{ storageKey, language, translate }`
504
+ (`ZodLocaleErrorOptions`) so it can read the `storageKey` you gave
505
+ `I18nProvider`, follow a language you pass, and format through your own
506
+ merged translator so your `material.zod.*` overrides apply. Calling it with
507
+ no argument behaves as before.
508
+
509
+ - [#182](https://github.com/softistx/nxgt-material-vue/pull/182) [`690ec8a`](https://github.com/softistx/nxgt-material-vue/commit/690ec8a12ce42639c27a3ec46388aedf6211b009) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The calendar, data table, filter, spinner, scroll-to-top, network upload, map marker and the editor's slash menu, fonts and table alignment follow `I18nProvider`
510
+
511
+ 82 keys join the `material` bundles, in English and French, with the same
512
+ names and the same French as `@nxgt/material`:
513
+
514
+ - `material.rich-text-editor.*` (47): the slash menu's group, item titles and
515
+ descriptions (`slash-menu.*`), the font menu (`font-default`, `font-sans`,
516
+ `font-serif`, `font-mono`) and the table-caption alignment choices
517
+ (`table-align-left` / `-center` / `-right`).
518
+ - `material.filter.*` (19): `min`, `max`, and the presets menu and dialog
519
+ (`presets.*`).
520
+ - `material.calendar.*` (9): the previous/next month buttons' labels, on
521
+ `Calendar` and `DateRangeField`, use two;
522
+ the others (year paging, `Go to Today`, the caption button) are React's,
523
+ kept so both bundles stay identical.
524
+ - `material.table.labels.select-all` / `select-row`,
525
+ `material.upload.retry` / `remove`, `material.spinner.loading`,
526
+ `material['scroll-to-top'].label`, `material.map.you-are-here`.
527
+
528
+ The slash menu filters on the translated title and description and on the
529
+ English ones, accent-insensitively; `RichTextEditor` hands the menu its own
530
+ translator, so there is nothing to wire.
531
+
532
+ Without a provider the English is unchanged. An explicit `aria-label` on
533
+ `Spinner`, `ScrollToTop`, `CalendarPrevButton` or `CalendarNextButton` still
534
+ wins.
535
+ `LocationMarker` now shows `You are here` as its tooltip by default, as the
536
+ React marker does; fill its `#tooltip` slot to replace it.
537
+
538
+ - [#207](https://github.com/softistx/nxgt-material-vue/pull/207) [`08a7e81`](https://github.com/softistx/nxgt-material-vue/commit/08a7e816ce285048bcc8fba03807c08503af3506) Thanks [@SteveGT96](https://github.com/SteveGT96)! - New entry `@nxgt/material-vue/pdf`: PDF documents from plain data, with the
539
+ same document model and renderer as `@nxgt/material/print` (byte for byte, so
540
+ a document template written for one library renders identically in the
541
+ other).
542
+
543
+ - Builders (`pdfDocument`, `page`, `header`, `text`, `table`, `dataTable`,
544
+ `keyValueOf`, `metric`, …) produce a plain `PdfDocument`, serialisable and
545
+ usable on the server.
546
+ - `renderPdfBlob`, `renderPdfBuffer`, `renderPdfStream`, `pdfResponse` (a
547
+ `Response` with the right headers, for a Nitro/H3 route), `downloadPdf`,
548
+ `openPdf`, and `contentDisposition` for a response of your own.
549
+ - `usePdf(source, { fileName, immediate })` returns `{ blob, url, loading,
550
+ error, refresh, download }` and does nothing on the server; `download()`
551
+ saves the document `source` holds when it is called, waiting for its render.
552
+ `PdfDownloadButton` renders one document on click, emits `error`, and
553
+ rethrows a failure when nothing listens to `@error` (it reaches
554
+ `app.config.errorHandler`, else the console).
555
+ - A `definePdfDocument` template annotates its data parameter, and its other
556
+ parameters may take defaults (`(invoice: Invoice, language = 'en') => …`).
557
+ - The print table and value helpers are exported here too:
558
+ `definePrintColumns`, `resolvePrintTable`, `resolvePrintFields`,
559
+ `toPrintValue`, `formatPrintValue`, `isEmptyPrintValue` and the
560
+ `PrintColumn` / `PrintValue` types. A `'sum'` total over amounts in more
561
+ than one currency is left empty, and a `Date` cell prints as a date.
562
+ - The theme (`defaultPdfTheme`, `resolvePdfTheme`, `resolvePdfColor`) and
563
+ `PdfPeerMissingError`.
564
+ - Built-in strings (page numbers, totals, the empty table) follow the
565
+ library's i18n, in English and French.
566
+
567
+ `react` (`^18.2.0 || ^19.0.0`) and `@react-pdf/renderer` (`^4.9.0`) are
568
+ **optional peers**, loaded on the first render: nothing changes for an app
569
+ that does not import `/pdf`. An app that does installs them with
570
+ `bun add react @react-pdf/renderer@^4.9`; without them, rendering throws
571
+ `PdfPeerMissingError` with that command.
572
+
573
+ Also new: `@nxgt/material-vue/vite` exports `pdfkitStandardFonts()`, and the
574
+ Nuxt module takes `pdf: { bundleStandardFonts: true }` to add it to Nitro, for
575
+ a server whose runtime image has no `node_modules` (pdfkit loads its fonts
576
+ from a specifier no bundler resolves).
577
+
578
+ - [#202](https://github.com/softistx/nxgt-material-vue/pull/202) [`68a1295`](https://github.com/softistx/nxgt-material-vue/commit/68a129571f713ecc60291251bc4de18237b8b0f1) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader` opens any source: `file` takes a `Blob` (a `File`, a fetched PDF),
579
+ an `ArrayBuffer` or a `Uint8Array`, a `URL`, or
580
+ `{ url, httpHeaders, withCredentials }` for a URL that needs a token, as well
581
+ as a URL string. The new `PdfSource` and `PdfUrlSource` types are exported.
582
+
583
+ - Bytes are copied: pdf.js empties the buffer it is given, and yours stays
584
+ usable after the reader opened it.
585
+ - The document reloads only when it changes: a URL with the same headers, even
586
+ in a new object on each render, keeps the view; a Blob or a buffer is
587
+ compared by identity.
588
+ - Download and print fetch a URL source with its headers, and save a Blob or
589
+ bytes as they are. When that fetch fails, a URL with headers is not opened
590
+ in a new tab, which would load it without them. With no `fileName`, a
591
+ `File`'s name or a URL segment, it is named "document.pdf", translated
592
+ (`material.pdf-reader.default-file-name`).
593
+ - The headers are part of what identifies the document: new headers (a
594
+ renewed token) load it again, from `initialPage`.
595
+
596
+ - [#197](https://github.com/softistx/nxgt-material-vue/pull/197) [`64db655`](https://github.com/softistx/nxgt-material-vue/commit/64db655efd464bd3fdef4a8be94e71bf319d4f5e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader`: Download now finishes in Firefox and Safari too. The link is
597
+ attached before its click and the object URL is revoked a minute later, not
598
+ right away. A new `fileName` prop names the saved file, and a URL document is
599
+ named after its last path segment instead of always `document.pdf` (`.pdf` is
600
+ added when missing). A URL document is saved from the bytes already loaded,
601
+ so a cross-origin one downloads instead of navigating. Print uses a
602
+ same-origin copy too, and opens a new tab instead of throwing `SecurityError`
603
+ when the browser refuses.
604
+
605
+ - [#222](https://github.com/softistx/nxgt-material-vue/pull/222) [`9014823`](https://github.com/softistx/nxgt-material-vue/commit/90148230c7fb9b9b3587d6a8e77eb62868de71ed) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader` takes `externalLinkTarget` (`'_blank' | '_self' | '_parent' |
606
+ '_top'`, default `'_blank'`): a link to a website inside the PDF opens in a new
607
+ tab by default, whatever the PDF asks; `'_self'` opens it in place.
608
+ `rel` stays `noopener noreferrer nofollow`.
609
+
610
+ `toPdfjsSource` and `toPdfjsParams` are exported beside `usePdfReader` (with
611
+ the `PdfjsSourceParams` / `PdfjsUrlParams` types), so a layout of your own
612
+ loads bytes with pdf.js without detaching your buffer.
613
+
614
+ `TooltipContent` takes `to`, where the tooltip is teleported.
615
+
616
+ - [#202](https://github.com/softistx/nxgt-material-vue/pull/202) [`6b30301`](https://github.com/softistx/nxgt-material-vue/commit/6b303018afb00568a40030f661e311a837a793f4) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader` makes the links inside the PDF clickable, as `@nxgt/material` does:
617
+ a link to another page goes to it, and a link to a website opens in a new tab
618
+ by default, with `rel="noopener noreferrer nofollow"` (`externalLinkTarget`
619
+ picks another target).
620
+
621
+ Its zoom menu is a `DropdownMenu`: it opens from the keyboard (Enter or Space,
622
+ the arrows move, Escape closes and gives focus back), its button is named after
623
+ the current zoom ("Zoom level 150%", `material.pdf-reader.zoom-menu`), and in
624
+ fullscreen it opens inside the reader. Keys pressed in the menu no longer turn
625
+ pages. An outline entry without a title reads "Untitled" in the reader's
626
+ language (`material.pdf-reader.untitled`).
627
+
628
+ `DropdownMenuContent` takes `to`, the element the menu is teleported into
629
+ (`body` by default): pass the fullscreen element, read when the menu opens,
630
+ for a menu opened in fullscreen.
631
+
632
+ - [#202](https://github.com/softistx/nxgt-material-vue/pull/202) [`c4b7965`](https://github.com/softistx/nxgt-material-vue/commit/c4b7965667131469b0645c3a526885393bf230f5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `formatAmount` and `formatDate` take a locale and a time zone, move to
633
+ `@nxgt/material-vue/lib` (as in `@nxgt/material`), and `useFormatters()` /
634
+ `createFormatters()` bind them.
635
+
636
+ - `formatAmount(value, currency?, { locale?, fractionDigits? })` and
637
+ `formatDate(value, { locale?, timeZone?, dateStyle?, timeStyle? })`. Without a
638
+ `locale` they still use the runtime's (a deterministic default is planned for
639
+ 1.0). `formatDate` also accepts a `Date` or an epoch number.
640
+ - They are exported from `/lib`, as in `@nxgt/material`; `/components` and
641
+ the root barrel still export them.
642
+ - `useFormatters({ locale?, timeZone? })` from `@nxgt/material-vue/composables`
643
+ (auto-imported by the Nuxt module) binds both to the `I18nProvider` language
644
+ (`en` without a provider), so a server render and the browser print the same
645
+ string (for a date with a time, pass `timeZone`). `locale` and `timeZone` may be refs or getters; the language and the
646
+ options are read on each call, so a template follows them.
647
+ - `createFormatters({ locale?, timeZone? })` from `/lib` binds them outside a
648
+ component: a Nuxt server route.
649
+
650
+ **Changed output.** Amounts use their currency's own decimals (ISO 4217):
651
+ `formatAmount(1234.5, 'JPY')` is now `¥1,235` (was `¥1,234.50`), KWD, BHD and
652
+ OMR show three decimals. EUR, USD, GBP and the other two-decimal currencies do
653
+ not change, nor does an amount without a currency. To keep two decimals, pass
654
+ `{ fractionDigits: 2 }`. `fractionDigits` is clamped to 0–20, as in
655
+ `CurrencyField`, and `NaN` or `Infinity` counts as not given.
656
+
657
+ **Fixed.** A date-only string (`'2026-03-01'`) keeps its calendar day in every
658
+ time zone; west of UTC it used to show the day before.
659
+
660
+ - [#207](https://github.com/softistx/nxgt-material-vue/pull/207) [`c67631c`](https://github.com/softistx/nxgt-material-vue/commit/c67631c5e3859a2d0e55218f3efb0aaa6236450f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PrintHeader` takes a logo image; `translateMaterial()` for strings outside a component
661
+
662
+ - **`PrintHeader`**: a `logo` image (URL or data URL, or
663
+ `{ src, width, height }` in points) with its `logoAlt` (empty, so
664
+ decorative, by default), a `subtitle` and a `referencePrefix` (`'#'` by
665
+ default). **Changed:** with no `logo` and no `logoText` it no
666
+ longer draws a grey "LOGO" placeholder, and with no `qrDataUrl` no empty
667
+ QR box; the title stays centred. Pass `logo-text="LOGO"` to keep the old
668
+ box. Same props and behaviour as `@nxgt/material`'s `PrintHeader`.
669
+ - **`translateMaterial(language, key, fallback, values)`**
670
+ (`@nxgt/material-vue/i18n`): the package's own strings for a language given
671
+ as a value, with no plugin and no composable — for a PDF's page-number
672
+ callback or a server. `useMaterialTranslation().t` now goes through it.
673
+ - New i18n keys `material.print.page-of` ("Page {page} of {pages}" / "Page
674
+ {page} sur {pages}") and `material.print.page`, in English and French, for
675
+ the new `@nxgt/material-vue/pdf`.
676
+ - `@nxgt/material-vue/pdf` exports `PrintValue` and `formatPrintValue`, with
677
+ the same behaviour as in `@nxgt/material`.
678
+
679
+ - [#207](https://github.com/softistx/nxgt-material-vue/pull/207) [`1e578d4`](https://github.com/softistx/nxgt-material-vue/commit/1e578d4502a80485a9a4e93418c2888d925d2c43) Thanks [@SteveGT96](https://github.com/SteveGT96)! - i18n keys for printed tables
680
+
681
+ - New keys `material.print.table.total` ("Total") and
682
+ `material.print.table.empty` ("No rows" / "Aucune ligne"), in English and
683
+ French, for the tables of the new `@nxgt/material-vue/pdf`.
684
+ - `@nxgt/material-vue/pdf` exports `definePrintColumns`, `resolvePrintTable`,
685
+ `resolvePrintFields` and `toPrintValue`, which resolve columns and rows the
686
+ way `@nxgt/material`'s `PrintDataTable`, `PrintKeyValue` and `PrintMetric`
687
+ do.
688
+
689
+ - [#157](https://github.com/softistx/nxgt-material-vue/pull/157) [`2c378f7`](https://github.com/softistx/nxgt-material-vue/commit/2c378f7dc16f9eb99eb101d292a9f4834f0991cf) Thanks [@SteveGT96](https://github.com/SteveGT96)! - CodeBlock dark body, ButtonGroup active label, AvatarGroup initials, menu
690
+ `error` items, editor mention items, ThemeToggle
691
+
692
+ - `CodeBlock scheme="dark"` showed a dark header over a light code area: the
693
+ global `pre` / `code` rules (`bg-muted`, padding, radius) painted over its
694
+ body. CodeBlock now resets them on its own `<pre>` and `<code>`; a plain
695
+ `<pre>` elsewhere keeps its styling.
696
+ - `ButtonGroup`: an active tonal button painted `bg-primary` under its
697
+ `text-primary` label, so the label disappeared. The active button now uses
698
+ the primary foreground for its text and icons.
699
+ - `AvatarGroup`: the initials inherited the page's font size and ran under
700
+ the next avatar. Each size now sets the initials' size, and the overlap is
701
+ smaller so they fit (`-space-x-0.5` / `-1` / `-1.5`).
702
+ - `MenubarItem`, `ContextMenuItem` and `DropdownMenuItem` accept
703
+ `variant="error"`, as in `@nxgt/material`. `'destructive'` is deprecated and
704
+ kept as an alias; both render `data-variant="error"`, so a selector on
705
+ `[data-variant=destructive]` stops matching. `MenubarItem` and
706
+ `ContextMenuItem` used `text-destructive-foreground`, a colour the theme does
707
+ not define, so their destructive items were not red at all; they are now.
708
+ - `RichTextEditor` `options.mentions.suggestions` accepts
709
+ `(string | MentionItem)[]`. Strings become `{ id, label }`; choosing an item
710
+ inserts its `id` and shows its `label`. `filterMentions` takes
711
+ `{ match: 'prefix' | 'substring' }` (default `'substring'`, unchanged;
712
+ `FilterMentionsOptions`), and the editor uses `'prefix'`, as before.
713
+ - `ThemeToggle` no longer freezes on the choice it mounted with: it
714
+ destructured `useTheme()`'s getters, so its selected item never followed a
715
+ click.
716
+
717
+ ### Patch Changes
718
+
719
+ - [#205](https://github.com/softistx/nxgt-material-vue/pull/205) [`85be906`](https://github.com/softistx/nxgt-material-vue/commit/85be906c78a0518e6bc99d45392913c4b9e94758) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `NetworkUploadField` / `S3UploadField`: the field is a `group` named by its
720
+ label, and once a file hides the drop zone (or it is disabled: `maxFiles`
721
+ reached, or `disabled`) the group carries the error (the `helper-text`, or a
722
+ hidden "This value is not valid."), which nothing said before. `ImageField`: a
723
+ failed upload with no message of its own is described as not valid, not only
724
+ outlined in red.
725
+
726
+ `AppBreadcrumb`: the home crumb is a link named "Home" rather than a
727
+ `<button>` inside a link.
728
+
729
+ `QRCode`: `aria-label` is a declared prop that names the `<svg role="img">`
730
+ (and wins over `title`), instead of falling through to the wrapper `div`.
731
+
732
+ - [#225](https://github.com/softistx/nxgt-material-vue/pull/225) [`e0de943`](https://github.com/softistx/nxgt-material-vue/commit/e0de9432c03922518c3b652b66033fcbeb8df3df) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `AlertDialogContent` honours an `@open-auto-focus` that calls
733
+ `event.preventDefault()`: focus stays where it was, as it does on
734
+ `DialogContent`, `SheetContent` and `DrawerContent`. reka focused the
735
+ `AlertDialogCancel` a tick later regardless, and its focus trap kept focus
736
+ there. Opening without the opt-out still focuses the Cancel (or the first
737
+ control when there is none).
738
+
739
+ - [#223](https://github.com/softistx/nxgt-material-vue/pull/223) [`319fc46`](https://github.com/softistx/nxgt-material-vue/commit/319fc46ae60a20830ed4ef017c963deb2a014bf7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Form wrappers: leaving a field straight into another field's freshly opened
740
+ overlay — a `SelectFormField` list opened by pressing the mouse on its
741
+ trigger, which takes focus without the trigger ever having it — marks the
742
+ field touched (and validates it) as it is left. It used to count that overlay
743
+ as the field's own and wait until the list handed focus back to its trigger.
744
+ A field's own list also stays its overlay when it opened before focus reached
745
+ the field, as long as a control of the field names it (`aria-controls`), like
746
+ `@nxgt/material`.
747
+
748
+ - [#208](https://github.com/softistx/nxgt-material-vue/pull/208) [`1b0d117`](https://github.com/softistx/nxgt-material-vue/commit/1b0d117083e592fbed6188ab3fd1388e4f46cf00) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `AppBreadcrumb`: a crumb on a route record with params links to its path with
749
+ the current params filled in (`/users/42`), not to the record's pattern
750
+ (`/users/:id`, which vue-router rendered as a literal `:id`). Home and every
751
+ crumb keep going through the router's history base.
752
+
753
+ `CheckboxGroup` / `RadioGroupField`: the group element carries its `id` (yours,
754
+ or the generated one its option ids start with), as React's groups do; it
755
+ had none.
756
+
757
+ - [#228](https://github.com/softistx/nxgt-material-vue/pull/228) [`e9aafcc`](https://github.com/softistx/nxgt-material-vue/commit/e9aafccc69a1b225060cfcf753ab13663a21c8ff) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Bug reports have an address: `bugs.email` in `package.json`, and the
758
+ "Reporting a bug" section of the troubleshooting page, linked from the README.
759
+
760
+ - [#216](https://github.com/softistx/nxgt-material-vue/pull/216) [`357360a`](https://github.com/softistx/nxgt-material-vue/commit/357360ad855577d1acedb83ef7be12c5e5d4aeb5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - A dismissible `Chip` given both a `label` and a default slot named its ✕ after
761
+ the `label` it was not showing. The ✕ is now named after the text the chip
762
+ shows: the default slot's when one is given (`Remove Lyon`), else `label`; with
763
+ no text it keeps "Remove". The same rule as `@nxgt/material`'s `Chip`.
764
+
765
+ - [#184](https://github.com/softistx/nxgt-material-vue/pull/184) [`d70cc8a`](https://github.com/softistx/nxgt-material-vue/commit/d70cc8a21893e64a112d3e34b2877e9317301c2f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The close buttons of dialogs, sheets and `DialogFooter`, and the map's zoom
766
+ and "My position" buttons, follow `I18nProvider` (`material.buttons.close`,
767
+ `material.map.zoom-in`, `material.map.zoom-out`, `material.map.my-position`,
768
+ the same keys as `@nxgt/material`): they were English in every language.
769
+
770
+ - [#227](https://github.com/softistx/nxgt-material-vue/pull/227) [`7283634`](https://github.com/softistx/nxgt-material-vue/commit/72836342d91ce23af594ed0bb66ff226985f02c8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - A Tailwind app that imports `@nxgt/material-vue/styles.css` now gets the CSS
771
+ the components need, which reached only the compiled stylesheet before:
772
+ KaTeX (`Markdown` maths), highlight.js (`RichTextEditor` code blocks),
773
+ vue-sonner (`Toaster`), vue-advanced-cropper (`ImageCropper`), the `Spinner`
774
+ animation, the `ImageCropper` handles, and the stylesheets of `ButtonGroup`,
775
+ `ContactItem`, `OpeningHoursItem`, `AttributeForm` and `AttributeValuesForm`,
776
+ which were CSS modules and are global `nxgt-*` classes now.
777
+ The compiled stylesheet gains vue-advanced-cropper's stylesheet, which it
778
+ was missing.
779
+
780
+ - [#159](https://github.com/softistx/nxgt-material-vue/pull/159) [`292a111`](https://github.com/softistx/nxgt-material-vue/commit/292a111f476f8d6c24be1326cd37f9105e006e89) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Documentation with a preview of every component
781
+
782
+ - The README catalogue has a **Preview** column, and each name links to its
783
+ entry in `docs/components/`. Its rows and categories are the same as
784
+ `@nxgt/material`'s.
785
+ - `docs/` now ships in the package:
786
+ - one page per category: preview, example, options;
787
+ - the component gallery;
788
+ - getting started;
789
+ - guides for forms (vee-validate and Zod), i18n, the app shell, theming,
790
+ printing, maps, SSR and Nuxt, and the helpers;
791
+ - troubleshooting;
792
+ - the roadmap.
793
+ - File names, headings and preview names match `@nxgt/material`'s docs, so a
794
+ link keeps working when you switch framework.
795
+ - The README's long sections moved to those guides.
796
+
797
+ - [#190](https://github.com/softistx/nxgt-material-vue/pull/190) [`240b28e`](https://github.com/softistx/nxgt-material-vue/commit/240b28e3fb3758f5b4501b29cedb1d170cb19860) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `DateField`, `DateRangeField` and `TimeField` pass the attributes you give them
798
+ (`id`, `aria-describedby`, `data-*`, listeners) to the trigger: their root is a
799
+ popover (or a dialog), which renders no element, so they were dropped. An `id`
800
+ becomes the popover trigger's id, which also labels the open calendar
801
+ (`PopoverTrigger` now honours an `id`). `TimeField` renders the desktop trigger
802
+ on the server (`useMediaQuery` with `ssrWidth`), as a desktop client's first
803
+ render does, so SSR pages hydrate without a mismatch; a phone switches to the
804
+ dialog once mounted.
805
+
806
+ `UploadField`: its file input is visually hidden instead of `hidden`, so a
807
+ `required` field with no file stops the submit with the browser's message
808
+ instead of a console-only "An invalid form control … is not focusable".
809
+ Without a trailing button, that input is now the field's tab stop.
810
+ `UploadField`, `ImageField`, `FileListField` and the `NetworkUploadField` /
811
+ `S3UploadField` drop zone no longer put `aria-invalid` on a `group` or a
812
+ `button`: the error text describes them, and the outline comes from
813
+ `data-invalid` (give an `error` its `helper-text`).
814
+
815
+ - [#192](https://github.com/softistx/nxgt-material-vue/pull/192) [`acc86c6`](https://github.com/softistx/nxgt-material-vue/commit/acc86c698a6a7687b5e23cdfe4461c9b60870484) Thanks [@SteveGT96](https://github.com/SteveGT96)! - An `aria-label` passed to `Icon`, `ScrollProgress`, `FileList` or `Tree`, and a
816
+ `data-slot` passed to `ScrollProgress`, `Pager`, `Toc` or `SeeAlso`, now reach
817
+ the element. They were declared as props under their kebab-case names, which
818
+ Vue stores camelized, so the component always fell back to its default (for
819
+ `Icon`, `Icon <name>`). `DocProgress` had the same bug.
820
+
821
+ Inside `Doc`, `DocToc`, `DocPager`, `DocSeeAlso` and `DocProgress` now render
822
+ their own `data-slot` (`doc-toc`, `doc-pager`, `doc-see-also`,
823
+ `doc-progress`) instead of the inner component's (`toc`, `pager`, `see-also`,
824
+ `scroll-progress`).
825
+
826
+ - [#194](https://github.com/softistx/nxgt-material-vue/pull/194) [`2cc0785`](https://github.com/softistx/nxgt-material-vue/commit/2cc07857497baba6e2b4657374672b28d9f3d704) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Icon badges that looked like an `IconButton` but did nothing are no longer
827
+ buttons: the `FileListField` row badge, the `NetworkUploadField` file preview,
828
+ the `EntityHeader`, `ConfirmationDialog` and `AppSidebar` icons, the `Stepper`
829
+ info icon and the `AccordionCard` chevron (a button nested in the trigger
830
+ button; it now turns when open). Each was a nameless `<button>` (focusable, except the disabled upload preview); each is now a `<span>`
831
+ (`as="span"`) with `aria-hidden="true"` and the same look. The row badges of
832
+ `Contacts`, `OpeningHours`, `PostalAddress` and `AttributesList`, already
833
+ `<div>`s, are hidden too; a `Contacts` badge is `role="img"`, named by the
834
+ contact type.
835
+
836
+ An `Icon` inside a named `IconButton` (and so `InputGroupButton` and
837
+ `IconLinkButton`) is `aria-hidden` instead of `role="img"` named
838
+ "Icon {name}", so a screen reader reads "Delete", not "Delete, Icon trash". An
839
+ `aria-label` you give the `Icon` still wins; an `Icon` anywhere else keeps its
840
+ "Icon {name}" default. See troubleshooting for the selectors this changes.
841
+
842
+ - [#223](https://github.com/softistx/nxgt-material-vue/pull/223) [`e748a8f`](https://github.com/softistx/nxgt-material-vue/commit/e748a8f9d6675373f9fbd45f869423617deff309) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `definePdfDocument`: an unannotated data parameter is typed `unknown`, not
843
+ `never`. With `never`, the template compiled and the error appeared only
844
+ where the template was called (`Argument of type 'Invoice' is not assignable
845
+ to parameter of type 'never'`); now reading a property of it fails in the
846
+ template itself. Annotated parameters and defaults (`language = 'en'`) are
847
+ typed as before.
848
+
849
+ - [#166](https://github.com/softistx/nxgt-material-vue/pull/166) [`c87b446`](https://github.com/softistx/nxgt-material-vue/commit/c87b4469b2af4113d4a4006f4901bf576983ec70) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `ContactItem` and `OpeningHoursItem` (and their props types) are deprecated, as in `@nxgt/material`, and will be removed in 1.0: use `ContactsFormField` and `OpeningHoursFormField`.
850
+
851
+ - [#157](https://github.com/softistx/nxgt-material-vue/pull/157) [`82db5a2`](https://github.com/softistx/nxgt-material-vue/commit/82db5a24d1be1c34615670552b33b241e0944c3a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Dialog fixes
852
+
853
+ - `CustomDialog` (and `ConfirmationDialog`, through it) no longer wraps its
854
+ `#trigger` slot in a second `<button>`: the trigger is merged into the
855
+ slotted element (`as-child`), so a `Button` there is the dialog trigger
856
+ itself instead of a button nested in a button.
857
+ - `ConfirmDialog` awaits `@confirm` (now typed `onConfirm: () => void |
858
+ Promise<void>`). It stays open while the handler runs (both buttons
859
+ disabled, "Processing..."), closes on success, and on a throw or rejection
860
+ stays open and shows the error's message instead of closing. Before, it
861
+ closed on click whatever the handler did. The pending label and the message
862
+ for an error without one are translated
863
+ (`material.confirm-dialog.processing`, `material.confirm-dialog.failed`, en
864
+ and fr). A plain `@confirm="open = false"` keeps working.
865
+
866
+ - [#224](https://github.com/softistx/nxgt-material-vue/pull/224) [`bed9e08`](https://github.com/softistx/nxgt-material-vue/commit/bed9e08d86c8b29dc96f56369fe85e8439507130) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `DrawerContent` hands focus back, on close, to the element that had it when
867
+ the drawer opened: the button of yours that opened a controlled `Drawer` (no
868
+ `DrawerTrigger`) gets it back, where focus used to fall to `<body>`. Focus
869
+ that already went elsewhere stays there, and an `@close-auto-focus` that calls
870
+ `event.preventDefault()` opts out. `Dialog`, `Sheet` and `AlertDialog`
871
+ already did this.
872
+
873
+ - [#191](https://github.com/softistx/nxgt-material-vue/pull/191) [`8104999`](https://github.com/softistx/nxgt-material-vue/commit/8104999a2fadc09aa621fc7718438f53154da6e1) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The package no longer ships type declarations for story helpers and story
874
+ data. None was reachable from an entry point, so no import changes.
875
+
876
+ - [#221](https://github.com/softistx/nxgt-material-vue/pull/221) [`3025a37`](https://github.com/softistx/nxgt-material-vue/commit/3025a37a6ccc225de0f6963d003685be05edcb49) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `DateField`, `DateRangeField` and `TimeField`: the label and the helper text
877
+ are no longer inside the trigger button (a `<label>` in a `<button>` is
878
+ invalid, and the helper text was read as part of the value). They sit beside
879
+ it in the field's root `div`, which takes `class`; the trigger is named by the
880
+ label (`aria-labelledby`) and described by the helper text, then your
881
+ `aria-describedby` ids. The label is `for` the trigger (yours, else a
882
+ generated id), so a click on it opens the picker, and the open popover (or
883
+ `TimeField`'s dialog on a phone) is labelled by the trigger. The label and
884
+ the helper text are still not dimmed with a disabled trigger.
885
+
886
+ `Slider`: an `aria-label` or `aria-labelledby` names every thumb (a vertical
887
+ slider had nameless thumbs), and `aria-invalid` (`SliderField`'s `error`) goes
888
+ on the thumbs rather than on the root `span`.
889
+
890
+ `DurationField`: a `group` named by its label and described by its helper
891
+ text; the inputs are named "Hours" and "Minutes"
892
+ (`material.duration-field.hours-label` / `minutes-label`, en and fr, the same
893
+ keys and strings as `@nxgt/material` 2.2.0). The minutes input had no name. `NumberField` takes an
894
+ `aria-label`.
895
+
896
+ `CodeEditor`: Monaco's textarea is named by the field's label (`ariaLabel`),
897
+ and follows it when it changes.
898
+
899
+ - [#169](https://github.com/softistx/nxgt-material-vue/pull/169) [`e643e39`](https://github.com/softistx/nxgt-material-vue/commit/e643e39dd2617154b7eb4e4183a1c50ecadfa9ea) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The filter trigger's accessible name reads "Filters, 2 active" instead of
900
+ "Filters2": the count badge is hidden from assistive technology and the count
901
+ is announced through `material.filter.active-count` (en, fr), as in
902
+ `@nxgt/material`.
903
+
904
+ - [#165](https://github.com/softistx/nxgt-material-vue/pull/165) [`56c3349`](https://github.com/softistx/nxgt-material-vue/commit/56c334903673a20894c64c036407a9cb9723e79e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `LinkButton`, `IconLinkButton` and `ResponsiveLinkButton` render one link styled as a button instead of a `<button>` inside an `<a>`. `Steps` numbers its `StepsItem`s by position when they have no `index`, as in `@nxgt/material`. A collapsed `ResponsiveButton` keeps its label as screen-reader text, so the `Filter` popover trigger (and any icon-only responsive button) has an accessible name. The doc examples import icons from `@lucide/vue`.
905
+
906
+ - [#172](https://github.com/softistx/nxgt-material-vue/pull/172) [`c930ab4`](https://github.com/softistx/nxgt-material-vue/commit/c930ab47c66a4c24ce46b7870ae1fbf6472348dd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `ResponsiveButton` (and `ResponsiveLinkButton`, `LoadMoreButton`) no longer
907
+ sets `aria-expanded`: it said whether the label was showing, so screen readers
908
+ announced a button that controls nothing as "collapsed". Used as a popover,
909
+ drawer or menu trigger (the `Filter` trigger), it still carries the trigger's
910
+ own `aria-expanded`, as in `@nxgt/material`.
911
+
912
+ `Switch`: the row's text is now the switch's `<label>`, with a generated `id`
913
+ when none is given, so a switch with a `label` has an accessible name and
914
+ clicking the text toggles it. An uncontrolled switch's row (`default-value`)
915
+ is tinted while it is on and follows each toggle; before, only `v-model`
916
+ tinted it.
917
+
918
+ - [#164](https://github.com/softistx/nxgt-material-vue/pull/164) [`45ff37f`](https://github.com/softistx/nxgt-material-vue/commit/45ff37fea19330c1a3cf8562f4c13c4c03295df4) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `HeatmapChart` cells take the theme colours instead of rendering black: chart colours resolve to `rgb()` (the `--chart-*` tokens are `oklch()`, which ECharts' visualMap cannot interpolate), and `colors` accepts any CSS colour. `toast()` hands `Toast` its real id, so the action button dismisses the toast and Vue no longer warns about the `id` prop. `Markdown` typesets `$$` display math and `$` inline math instead of showing escaped KaTeX markup, and leaves `$` inside code alone. `Table` is `table-auto`, as in `@nxgt/material`, so `ParamTable` and the other tables size their columns to their content instead of clipping them.
919
+
920
+ - [#160](https://github.com/softistx/nxgt-material-vue/pull/160) [`65e3995`](https://github.com/softistx/nxgt-material-vue/commit/65e3995d9df2359484b10cf28148d64fcef245cd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `CheckboxGroup` shows and toggles its checked options (it bound `checked`, which Reka's `CheckboxRoot` does not read). `ToggleGroup` items follow a `size`, `variant` or `spacing` that changes after mount. `Switch` shows `helperText` without a `placeholder`, under the row or the bare switch.
921
+
922
+ - [#163](https://github.com/softistx/nxgt-material-vue/pull/163) [`5b5a4a5`](https://github.com/softistx/nxgt-material-vue/commit/5b5a4a5d217c77dfb09da2e989f3da052be4d22f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `useTranslation()` from `createTypedTranslation` follows `changeLanguage`: `t` and `i18n.language` read the provider's language on every call instead of a setup-time copy. `defineStepFormStore` resumes from what `updateStep` stored under its `name` (and `reset()` clears it). The Nuxt module registers every component `/components` exports, including `PdfReader` and its parts, `Camera`, `StxPlayer`, `VideoPlayer`, `PaneLayout` / `ListDetailsLayout` and their parts, the `Filter` parts and `SortableHandle`, and no longer registers rich-text-editor internals the barrel does not export. `ConfirmDialog` and `ConfirmationDialog` translate their default button labels (`material.confirm-dialog.confirm` / `.cancel`, English and French).
923
+
924
+ - [#162](https://github.com/softistx/nxgt-material-vue/pull/162) [`e7231c2`](https://github.com/softistx/nxgt-material-vue/commit/e7231c220ffe9da2e0f2ab2c1ebca507abe4cf8c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - A `Map` without `center` opens on its default position again: `useGeolocation().coords` is `null` until the first fix, so `LocationMarker` and "My position" also wait for a real position. Print `tw()` writes every length with a unit (points for the scale, radii and tracking, 1 px borders, arbitrary values as written), and `border-b` draws the bottom side only, so the `Print*` blocks get their padding and hairlines in the browser without a stylesheet workaround.
925
+
926
+ - [#161](https://github.com/softistx/nxgt-material-vue/pull/161) [`2d36932`](https://github.com/softistx/nxgt-material-vue/commit/2d369329956eae03662b261e4e29212a08286915) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Optional boolean props no longer turn into `false` when omitted. Vue casts an absent `Boolean` prop to `false`, which overrode the documented defaults: `RichTextEditor` (and `RichTextEditorFormField`) was read-only without `editable`; `Notifications`, `Gallery`, `ImageCropperDialog` and `PaneLayout` could not run uncontrolled (`default-open` and the trigger were ignored); charts never showed their empty state for empty data, and `AreaChart` dropped `#emptyState`; `DataTable` hid its header row; `ResponsiveButton` / `ResponsiveLinkButton` stayed icon-only on desktop; `TextareaField` did not count from `max-length` alone; `DocPage` hid the copy buttons; `Filter` hid the inline actions and the trigger label; and `RatingFormField`, `SliderFormField`, `TextareaFormField`, `SortableListFormField`, `TransferListFormField` and `FilterFormField` switched off their field's `true` defaults (clear, readout, search, drag, select all, transfer all).
927
+
928
+ - [#210](https://github.com/softistx/nxgt-material-vue/pull/210) [`f38ecc5`](https://github.com/softistx/nxgt-material-vue/commit/f38ecc5f0d68e52adfe7239afb826c3223312b49) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `RadioGroupField`, `CheckboxGroup` and their form wrappers are now named by
929
+ their `label`: the `radiogroup` (and `CheckboxGroup`'s wrapper, now a
930
+ `role="group"`) carries `aria-labelledby` to the label and `aria-describedby`
931
+ to the helper or error text, so a screen reader announces the question, not
932
+ only the first option. The `radiogroup` carries `aria-invalid` while `error`;
933
+ a `CheckboxGroup` error without text is described by a visually hidden "This
934
+ value is not valid.", and so is a `CheckboxGroupFormField` in error with no
935
+ message that shows the caller's `helper-text` (through `CheckboxGroup`'s new
936
+ `#helper-text` slot, so the hint stays inside the description). A caller's
937
+ `aria-label` / `aria-labelledby` wins and its `aria-describedby` ids are kept;
938
+ on `RadioGroupField` attributes other than `class` and `style` now land on the
939
+ `radiogroup` rather than the layout wrapper, and `CheckboxGroup` drops an
940
+ `aria-invalid` passed to it.
941
+
942
+ Option ids are now `` `${id}-${index}` `` instead of `` `${id}-${value}` ``, as
943
+ in `@nxgt/material`: a value with a space gave an invalid id and a label that
944
+ pointed nowhere. A selector such as `#<id>-<value>` must move to the index, or
945
+ better to role and name — see the troubleshooting entry.
946
+
947
+ - [#206](https://github.com/softistx/nxgt-material-vue/pull/206) [`3d6a67f`](https://github.com/softistx/nxgt-material-vue/commit/3d6a67fc2b1c33cdeffae1a4a1981a0c948b1318) Thanks [@SteveGT96](https://github.com/SteveGT96)! - More built-in labels follow `I18nProvider`
948
+
949
+ 30 keys join the `material` bundles, in English and French, with the same
950
+ names and French as `@nxgt/material`, and a few existing keys are now used
951
+ where the text was hard-coded:
952
+
953
+ - Pagination: the buttons' names and text, which reka-ui left in English
954
+ ("First Page", "Page 2"…), the ellipsis's "More pages" and the `nav`'s
955
+ name (`pagination.first`, `previous`, `next`, `last`, `page`, `more`,
956
+ `label`). The buttons are now named by their text in English too:
957
+ "First", "Previous", "Next", "Last", as in `@nxgt/material`.
958
+ - `CommandDialog`'s default title and description (`command.*`), the
959
+ carousel's `aria-roledescription` (`carousel.roledescription` / `slide`) and
960
+ the attribute options' "Add option" (`attributes.buttons.add-option`).
961
+ - The filter's empty state, `+N more` chip and the Yes/No, From, Until and Up
962
+ to of its chips (`filter.empty`, `filter.more`, `filter.value.*`);
963
+ `Breadcrumb`'s name and ellipsis, `DocHeader`'s breadcrumb
964
+ (`breadcrumb.*`, `doc.breadcrumb`); `MessageCard`'s "Unread"
965
+ (`cards.unread`); the network upload field's "Replace {name}", "Upload
966
+ failed" and its type, size and count errors (`upload.*`); the editor's
967
+ placeholder and emoji buttons; `CircularProgress`'s label, `StxPlayer`'s
968
+ "Media player", `PaneLayoutPane`'s sheet title, `JsonViewer`'s "Empty JSON"
969
+ and `TimePicker`'s AM/PM.
970
+
971
+ The editor's default placeholder now follows a language change without
972
+ rebuilding the editor, as does a new `placeholder`. `formatFilterValue` takes
973
+ the chip words as an optional third argument, typed `FilterValueWords`, with
974
+ the English in the newly exported `FILTER_VALUE_WORDS`; `getValidationMessage`
975
+ / `getUploadErrorMessage` take `t` (typed `UploadMessageTranslate`) as an
976
+ optional last argument. Without them the English is unchanged, except that the
977
+ count error reads "Maximum of 1 file reached" for a single file.
978
+ `parseJsonSource` marks a blank source with `empty: true`. Your
979
+ `placeholder`, `sheetTitle`, `title`, `description` and `aria-label` still win.
980
+
981
+ - [#188](https://github.com/softistx/nxgt-material-vue/pull/188) [`6a476f3`](https://github.com/softistx/nxgt-material-vue/commit/6a476f3e2bc54a6fdbf8d01ceab3bbac4779c2ce) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Icon-only buttons that screen readers announced as a bare "button", or by
982
+ their icon's name ("Icon chevron-down", "Icon trash"), now have a name,
983
+ translated under `I18nProvider`: the `Sidebar` toggle ("Toggle sidebar",
984
+ `material.sidebar.toggle`, with `aria-expanded`), the data table's `expand`
985
+ column ("Toggle row details", `material.table.labels.toggle-row`, with
986
+ `aria-expanded`), and the delete button of the deprecated `ContactItem` /
987
+ `OpeningHoursItem` (the existing `material.contacts.buttons.remove` /
988
+ `material.opening-hours.buttons.remove`).
989
+
990
+ A `Chip`'s remove button, and so each `Autocomplete` chip's, is named after the
991
+ text the chip shows: "Remove {label}" (`material.chip.dismiss-label`)
992
+ instead of "Remove" for every chip. The `LocationPreview` default trigger is
993
+ "Preview {name}" / "Preview location" (`material.map.preview-named` /
994
+ `preview`), translated, instead of the bare place name or an English string.
995
+ A disabled `Autocomplete` now disables its chips' remove buttons, and the
996
+ `Sidebar` toggle also shows while focus is inside the sidebar, so the keyboard
997
+ can reach it (it used to appear on hover only).
998
+
999
+ - [#187](https://github.com/softistx/nxgt-material-vue/pull/187) [`4cb61a7`](https://github.com/softistx/nxgt-material-vue/commit/4cb61a73c81488631e4a31dccb4df2e4d3f1ede8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Label`'s required asterisk is hidden from screen readers (`aria-hidden`), as
1000
+ in `@nxgt/material`: a required field was named "Email*" or read "Email star".
1001
+ The field's own `required` / `aria-required` says it, which every field of the
1002
+ library now sets. A test that found a field by a name ending in `*` finds it by
1003
+ the label alone: see the troubleshooting page.
1004
+
1005
+ - [#179](https://github.com/softistx/nxgt-material-vue/pull/179) [`52be74e`](https://github.com/softistx/nxgt-material-vue/commit/52be74e00e81a4e6befdc38cfc2726890c0ea02d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Switch`'s `helper-text` (the validation message under `SwitchFormField`) now
1006
+ describes the switch through `aria-describedby`, beside the row text and any
1007
+ `aria-describedby` you pass, as in `@nxgt/material`.
1008
+
1009
+ `SwitchField` used without `v-model` now toggles: it used to hold the switch
1010
+ off.
1011
+
1012
+ `Label` no longer renders `withasterisk="false"` / `"true"` as an HTML
1013
+ attribute on the `<label>`.
1014
+
1015
+ - [#185](https://github.com/softistx/nxgt-material-vue/pull/185) [`b0c787a`](https://github.com/softistx/nxgt-material-vue/commit/b0c787a382246e446c69dd849f501df69eaacc7b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `LocationField`'s dialog no longer renders an empty, unnamed button beside its
1016
+ close X. The extra `DialogClose` had no content, since Vue's `DialogClose` only
1017
+ renders its slot.
1018
+
1019
+ - [#157](https://github.com/softistx/nxgt-material-vue/pull/157) [`81dc973`](https://github.com/softistx/nxgt-material-vue/commit/81dc9732db253f23a9d52acd023a6d4ca921f674) Thanks [@SteveGT96](https://github.com/SteveGT96)! - LocationField empty state and labels; IconButton `aria-label`
1020
+
1021
+ - `LocationField` (`@nxgt/material-vue/map`) with a `null` value showed
1022
+ `5.44087 - 10.06843` (Yaoundé) and a hover preview there. It now shows an
1023
+ empty input with a translated placeholder and no preview. The dialog's pin
1024
+ still starts at that position, and OK on an empty field commits the position
1025
+ the pin shows: the last one dragged to, or the start. Without `v-model`, OK
1026
+ no longer drops the drag.
1027
+ - Its placeholder, dialog title and OK button are translated, with new
1028
+ `material.location-field.{placeholder,dialog-title,confirm}` keys (en and
1029
+ fr). `dialogTitle`, `closeLabel` and `placeholder` still win.
1030
+ - `IconButton` dropped its `aria-label`. Icon buttons given an `aria-label` (and no `tooltip`) had no
1031
+ accessible name; they now have it.
1032
+
1033
+ - [#171](https://github.com/softistx/nxgt-material-vue/pull/171) [`35c0227`](https://github.com/softistx/nxgt-material-vue/commit/35c022782fbb99b174b0f10c8038eae8408c7652) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Icons come from `@lucide/vue` only; the deprecated `lucide-vue-next` is no longer a dependency. `@lucide/vue` was already a dependency and stays one, so there is nothing to install. Lucide 1.x redrew some glyphs the components use (among them `Calendar`, `Clock`, `CircleCheck`, `File`/`FileText`, `Trash`, `Bookmark`), and a Lucide icon without `aria-label` or `title` now renders with `aria-hidden="true"`.
1034
+
1035
+ - [#215](https://github.com/softistx/nxgt-material-vue/pull/215) [`d9cb581`](https://github.com/softistx/nxgt-material-vue/commit/d9cb581e71f9182d28344cbe8db85c36092246e8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Map` (`@nxgt/material-vue/map`): closing a `LocationField` dialog before the
1036
+ map had loaded no longer throws `Map container not found.` as an unhandled
1037
+ rejection. `@vue-leaflet/vue-leaflet` builds the map, its layers and controls in
1038
+ async `onMounted` hooks; once the map is unmounting, errors from them are
1039
+ ignored.
1040
+
1041
+ `DateRangeField`: the trigger button carries `data-slot="date-range-field-trigger"`
1042
+ (instead of `popover-trigger`) and the default `data-pw` (`name`, or
1043
+ `date-range-field`), as `DateField`'s does; `data-pw` was on the box inside it.
1044
+
1045
+ The package no longer ships `docs/previews/form-fields-switchfield.webp`, a
1046
+ preview no page linked to (`SwitchField` is pictured by the Switch preview).
1047
+
1048
+ - [#195](https://github.com/softistx/nxgt-material-vue/pull/195) [`c0bcd56`](https://github.com/softistx/nxgt-material-vue/commit/c0bcd560cd7171b827014858968a45ebf8c44e3a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `useIsMobile`, `useTheme`, and every component that reads them
1049
+ (`ResponsiveButton`, `AppHeader`, `AppBreadcrumb`, `DataTable`, `Stepper`,
1050
+ `ThemeToggle`, `CodeBlock`, `CodeDiff`, `JsonViewer`, `CodeEditor`) now give
1051
+ the server an answer for their media query, as `TimeField` already did: the
1052
+ server and the first client render answer for `provideSSRWidth()`'s width, or
1053
+ a 1024 px desktop, and a light color scheme, then the client switches. A phone
1054
+ or a dark-mode browser no longer hits `Hydration completed but contains
1055
+ mismatches.` on those components.
1056
+
1057
+ - [#222](https://github.com/softistx/nxgt-material-vue/pull/222) [`9014823`](https://github.com/softistx/nxgt-material-vue/commit/90148230c7fb9b9b3587d6a8e77eb62868de71ed) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader`:
1058
+
1059
+ - A page's own `/Rotate` is honoured: a page the PDF shows landscape is drawn,
1060
+ thumbnailed, placed and fitted landscape (it was drawn at rotation 0).
1061
+ `PdfPageSize` gains an optional `rotate`.
1062
+ - Fit width and fit page use the first 25 pages, read together when the
1063
+ document opens, so the zoom no longer moves as later page sizes arrive
1064
+ (still read 25 pages at a time); the fit stops at 500%.
1065
+ - `@page-change` also reports the page the reader moves to itself: an
1066
+ `initialPage` clamped to the last page, and `initialPage` again after a new
1067
+ `file`.
1068
+ - The password field is named "Password" (new key
1069
+ `material.pdf-reader.password-label`), not after the "Password protected"
1070
+ heading.
1071
+ - The first search renders the pages once per 25 pages read, not once per
1072
+ page.
1073
+ - Notes show their icon and open their popup, and shapes are styled, with
1074
+ nothing to add to your imports.
1075
+
1076
+ `TooltipContent` (and so every `tooltip` on a `Button` or `IconButton`) opens
1077
+ inside the element in fullscreen while there is one: `PdfReader`'s toolbar
1078
+ tooltips show in fullscreen.
1079
+
1080
+ - [#181](https://github.com/softistx/nxgt-material-vue/pull/181) [`84b59c4`](https://github.com/softistx/nxgt-material-vue/commit/84b59c4f7f5ef04c2e49ccfe4775a923d2a6173f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader`: `@page-change`, `@load-success` and `@load-error` run once per
1081
+ event. They ran twice, because the reader called the handler as a declared
1082
+ prop and emitted the event too. The `onPageChange`, `onLoadSuccess` and
1083
+ `onLoadError` props are deprecated in favour of the events and go in 1.0;
1084
+ passing them (`:on-page-change="fn"`) still works and runs once.
1085
+
1086
+ - [#197](https://github.com/softistx/nxgt-material-vue/pull/197) [`0f2a280`](https://github.com/softistx/nxgt-material-vue/commit/0f2a2800bdea292c211cab95127324efaf9c2d0f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader`: fit width and fit page use each page's real size instead of
1087
+ assuming US Letter, fitting the widest and tallest page with one zoom, so A4
1088
+ and landscape pages no longer overflow or leave a gap. Placeholders and
1089
+ thumbnails take their page's shape before it draws. `PdfPageList`,
1090
+ `PdfSidebar` and `PdfThumbnailSidebar` take an optional `pageSizes`, and the
1091
+ `PdfPageSize` type is exported.
1092
+
1093
+ - [#197](https://github.com/softistx/nxgt-material-vue/pull/197) [`a734547`](https://github.com/softistx/nxgt-material-vue/commit/a734547379c06a8f9e0f6564a8def74f82204c43) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader`: a wrong password says "Incorrect password. Try again." (new key
1094
+ `material.pdf-reader.password-incorrect`, en and fr), marks the field
1095
+ `aria-invalid`, announces it and focuses the field again. Escape is handled
1096
+ only when the search bar is open, so a `Dialog` around the reader closes on
1097
+ Escape again. `@page-change` reports a page inside the document, and only when
1098
+ it changes.
1099
+
1100
+ - [#197](https://github.com/softistx/nxgt-material-vue/pull/197) [`7891491`](https://github.com/softistx/nxgt-material-vue/commit/7891491f1a42411f066cf16aa2576bdb6ddbb4c7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader`: opens on `initialPage`, which it showed in the page field but
1101
+ never scrolled to (past the end, it opens the last page; a new `file` opens on
1102
+ `initialPage` again). The page number follows scrolling, and `@page-change`
1103
+ reports the page most on screen; a page you ask for is reported once, not each
1104
+ page passed on the way.
1105
+
1106
+ - [#197](https://github.com/softistx/nxgt-material-vue/pull/197) [`e9c10d1`](https://github.com/softistx/nxgt-material-vue/commit/e9c10d1478c22a9b9c695ebd71c704fb42e7d374) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `PdfReader`: search covers the whole document, pages not drawn yet included,
1107
+ and counts as you type. It finds every match, including one split across text
1108
+ runs, and ignores case, accents, ligatures and the width of white space.
1109
+ Moving to a match shows its page and marks it. `PdfPageList` takes an optional
1110
+ `highlight`, which `PdfReader` passes it, and the `PdfSearchHighlight` type is
1111
+ exported. A page asked to redraw while it was still drawing (a zoom or the
1112
+ page sizes arriving during the first render) now redraws; it used to keep its
1113
+ first drawing.
1114
+
1115
+ - [#211](https://github.com/softistx/nxgt-material-vue/pull/211) [`5d15b44`](https://github.com/softistx/nxgt-material-vue/commit/5d15b4491856ac1d7d2b71642606f798b0d9f14e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The tarball no longer ships `lib/nuxt`'s test files.
1116
+
1117
+ - [#187](https://github.com/softistx/nxgt-material-vue/pull/187) [`49ee618`](https://github.com/softistx/nxgt-material-vue/commit/49ee618a47f538026b08489a437307eba903a6ee) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Every field that shows the required asterisk now says "required" on the
1118
+ element a screen reader lands on, not only with the `*`, as in
1119
+ `@nxgt/material`:
1120
+
1121
+ - `DateField`, `DateRangeField`, `TimeField`: the trigger is a `combobox`
1122
+ (a `button` may not carry `aria-required`) named by an `aria-label` /
1123
+ `aria-labelledby` you pass, else by the label, else by `placeholder` (a
1124
+ picker with no label needs one of them), with `aria-required` (and
1125
+ `aria-invalid` with `error`).
1126
+ - `DurationField`: `required` on both inputs.
1127
+ - `SliderField`: `aria-required` on every thumb, and each thumb is named by
1128
+ the label ("Price Minimum" / "Price Maximum" for a range). The bare `Slider`
1129
+ takes `label-id` and `required` for the same.
1130
+ - `RatingField`: the stars are a `radiogroup`, named by the label, with
1131
+ `aria-required`.
1132
+ - `RichTextEditor`: the editable area is a multi-line `textbox` named by the
1133
+ label, with `aria-required`. `CodeEditor`: Monaco's `ariaRequired`; its
1134
+ `disabled` (Monaco's `readOnly`) now also reaches the editor when it
1135
+ changes after mount.
1136
+ - `TransferList`: `aria-required` on the Selected listbox, and both panes are
1137
+ named by the label, then their title ("Team Selected"); the label no longer
1138
+ points its `for` at nothing. `SortableList`: the
1139
+ listbox is named by the label, with `aria-required`.
1140
+ - `ComboboxField`: `aria-required` on its `combobox` trigger. `Autocomplete`:
1141
+ `aria-required` on its input.
1142
+ - `ImageField`, `FileListField`, `UploadField` (a file picker is a button, and
1143
+ their file input is hidden): the field is a `group` named by the label and
1144
+ described by a visually hidden "This field is required."
1145
+ - Tests that found a picker by the `button` role, or a thumb or a pane by its
1146
+ old exact name: see the troubleshooting page.
1147
+
1148
+ - [#173](https://github.com/softistx/nxgt-material-vue/pull/173) [`a5984d3`](https://github.com/softistx/nxgt-material-vue/commit/a5984d3f1f93f25c87c34cfdd819bb66825875d3) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The rich text editor's alignment buttons are named "Align left", "Align
1149
+ center", "Align right" and "Justify" without an `I18nProvider`, instead of the
1150
+ raw values `left`, `center`, `right`, `justify`.
1151
+
1152
+ - [#224](https://github.com/softistx/nxgt-material-vue/pull/224) [`10a0860`](https://github.com/softistx/nxgt-material-vue/commit/10a0860db3d56c5eb811d3787293030de6792912) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `SliderField` honours an `aria-invalid` you pass, as `@nxgt/material`'s
1153
+ `Slider` does: it goes on every thumb and wins over `error`. It used to land
1154
+ on the field's root `div`, where it is not allowed and nothing reads it.
1155
+
1156
+ - [#198](https://github.com/softistx/nxgt-material-vue/pull/198) [`b0e17dc`](https://github.com/softistx/nxgt-material-vue/commit/b0e17dca58b7a1d57ed71441a8d7eb935b5cae44) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `useTheme()` reads the stored preference once the component has mounted
1157
+ (before paint) instead of in the first render, so a stored `dark` no longer
1158
+ makes `ThemeToggle` or the code blocks mismatch the server HTML. Outside a
1159
+ component it still reads the storage straight away.
1160
+
1161
+ `PaneLayout` and `ListDetailsLayout` answer their width query through the
1162
+ same helper as `useIsMobile()` (`Doc` too, for its desktop-only sidebar
1163
+ reset, which renders nothing): on the server they follow
1164
+ `provideSSRWidth()` (a 1024 px desktop when the app provides none) instead of
1165
+ always rendering the desktop layout, and the client switches once mounted.
1166
+
1167
+ - [#223](https://github.com/softistx/nxgt-material-vue/pull/223) [`4ca2585`](https://github.com/softistx/nxgt-material-vue/commit/4ca25858c83b223d553fb8c76ad2c213ac4e337d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: the SSR guide shows how to give the client the width the server passed
1168
+ to `provideSSRWidth()` — through your own server and client entries, or
1169
+ `useState` in Nuxt — so a phone layout rendered on the server hydrates
1170
+ without a mismatch.
1171
+
1172
+ - [#216](https://github.com/softistx/nxgt-material-vue/pull/216) [`e40d733`](https://github.com/softistx/nxgt-material-vue/commit/e40d733fe0986420cc1cb0d3a6361f154ba6eab5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - A server-rendered wizard built on `defineStepFormStore` hydrates without a
1173
+ mismatch: while hydrating, the store renders step 0, as the server does, and
1174
+ resumes at the stored step once mounted. A plain client mount still shows the
1175
+ stored step from its first render, and `reset()` still clears it.
1176
+
1177
+ - [#227](https://github.com/softistx/nxgt-material-vue/pull/227) [`75cc4e8`](https://github.com/softistx/nxgt-material-vue/commit/75cc4e8de709d4265e83c796338bed9f0b8a1dc8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Switch` and `Autocomplete` no longer put `aria-invalid` on a plain `div`,
1178
+ where it is not allowed. An invalid `Switch` says so on the `switch` itself,
1179
+ which it did not do at all before, and its bordered row shows it with a red
1180
+ border; an invalid `Autocomplete` says so on its input, and the chips box
1181
+ shows it with a red border. An `aria-invalid` you pass the `Switch` still wins.
1182
+
1183
+ - [#174](https://github.com/softistx/nxgt-material-vue/pull/174) [`e632322`](https://github.com/softistx/nxgt-material-vue/commit/e632322811e73725ddcdb9d45e21ae437aacef9d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Switch` with both a `label` and a `placeholder` now names itself from the
1184
+ `label` explicitly (`aria-labelledby`) and takes the row text as its
1185
+ description (`aria-describedby`), as `@nxgt/material` does. An `aria-label` /
1186
+ `aria-labelledby` you pass still wins.
1187
+
1188
+ The row now carries `data-checked="true"` / `"false"`, the same values as
1189
+ `@nxgt/material`. `data-filed` (misspelt) is still present while on and is
1190
+ deprecated; it is removed in 1.0.
1191
+
1192
+ - [#175](https://github.com/softistx/nxgt-material-vue/pull/175) [`56de732`](https://github.com/softistx/nxgt-material-vue/commit/56de732117698aa49cd71cc890cb37d81182960d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Switch` (and `SwitchField`, `SwitchFormField`) now forwards `required` to the
1193
+ switch, as in `@nxgt/material`: it is announced as required (`aria-required`),
1194
+ and with a `name` inside a `<form>` its hidden input is `required`, so an
1195
+ unchecked required switch now blocks the browser's native submit, like a
1196
+ required checkbox. It used to show only the label's asterisk.
1197
+
1198
+ - [#224](https://github.com/softistx/nxgt-material-vue/pull/224) [`b65a5fe`](https://github.com/softistx/nxgt-material-vue/commit/b65a5fe501add96a80223f2a220ba50bd69392c6) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `TimeField` no longer puts `aria-invalid` on the plain `div` inside its
1199
+ trigger, where it is not allowed: that box shows an error with a red border
1200
+ now, and the trigger `combobox` alone says the field is invalid.
1201
+
1202
+ - [#227](https://github.com/softistx/nxgt-material-vue/pull/227) [`383e526`](https://github.com/softistx/nxgt-material-vue/commit/383e5262d870888213727dbc014080aa08ca4735) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Troubleshooting: focus falling to `<body>` when a controlled `Drawer` closes,
1203
+ why it happened up to 0.21.0, and how to hand it back on an older version.
1204
+
1205
+ - [#220](https://github.com/softistx/nxgt-material-vue/pull/220) [`a380465`](https://github.com/softistx/nxgt-material-vue/commit/a380465c513cf7ee23c3e5364130848e072f8d2a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `NetworkUploadField`: the drop zone's limits line ("Max 2.0 MB · Up to 3
1206
+ files") follows the language like the rest of the field
1207
+ (`material.upload.dropzone.max-size` / `max-files`, with French), and says
1208
+ "Up to 1 file" instead of "Up to 1 files".
1209
+
1210
+ - [#196](https://github.com/softistx/nxgt-material-vue/pull/196) [`7237aac`](https://github.com/softistx/nxgt-material-vue/commit/7237aac58895c05e99359766311af3204d481437) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `FileListField` says its error once: the field group is described by the error
1211
+ text, and the drop zone no longer is as well (a screen reader read it on
1212
+ entering the group and again on the drop zone). `ImageField`,
1213
+ `FileListField`, `UploadField` with a trailing button, and the
1214
+ `NetworkUploadField` / `S3UploadField` drop zone, in error without
1215
+ `helper-text`, are described by a visually hidden "This value is
1216
+ not valid." (`material.zod.default`, translated) instead of being only a red
1217
+ outline.
1218
+
1219
+ ## 0.21.0
1220
+
1221
+ ### Minor Changes
1222
+
1223
+ - [#154](https://github.com/softistx/nxgt-material-vue/pull/154) [`f654936`](https://github.com/softistx/nxgt-material-vue/commit/f6549360ad197993787b57708ca1eef31d302112) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `@nxgt/material-vue/map` — the leaflet map, mirroring `@nxgt/material/map`
1224
+
1225
+ `Map`, `Marker`, `LocationMarker`, `LocationPreview`, `MapActions`,
1226
+ `LocationField`, `LocationFormField` and `useGeolocation`, in an entry of its own
1227
+ with `leaflet` and `@vue-leaflet/vue-leaflet` as **optional peers** — an app that
1228
+ renders no map never has leaflet in its tree.
1229
+
1230
+ ```sh
1231
+ bun add leaflet @vue-leaflet/vue-leaflet
1232
+ ```
1233
+
1234
+ ```vue
1235
+ <script setup lang="ts">
1236
+ import "@nxgt/material-vue/map.css";
1237
+ import { LocationFormField } from "@nxgt/material-vue/map";
1238
+ </script>
1239
+ ```
1240
+
1241
+ `useGeolocation` wraps `@vueuse/core`'s — already a peer — rather than adding a
1242
+ second geolocation dependency, and normalises `coords` to
1243
+ `{ latitude, longitude } | null` so `NaN` before the first fix does not read as a
1244
+ position. `LocationFormField` uses `useField` from vee-validate, like every other
1245
+ `*FormField` here.
1246
+
1247
+ **Not auto-registered by the Nuxt module**, deliberately: auto-registration would
1248
+ make leaflet resolvable from an app that never renders a map.
1249
+
1250
+ **SSR.** `@vue-leaflet/vue-leaflet` loads leaflet with `import()` on mount, so
1251
+ this entry can be imported in a server process — the React mirror's cannot, since
1252
+ `react-leaflet` imports leaflet statically. Leaflet still initialises in the
1253
+ browser only, so wrap it in `<ClientOnly>` under Nuxt. `verify:ssr` gained an
1254
+ `ENTRY_ONLY` check: no entry but `map.js` may reach either package.
1255
+
1256
+ `MinimapControl` is not ported — it is built on `@react-leaflet/core` internals
1257
+ with no Vue counterpart. An arbitrary marker is `LIcon`'s slot rather than a
1258
+ component-marker dependency.
1259
+
1260
+ ## 0.20.0
1261
+
1262
+ ### Minor Changes
1263
+
1264
+ - [#152](https://github.com/softistx/nxgt-material-vue/pull/152) [`5f72f54`](https://github.com/softistx/nxgt-material-vue/commit/5f72f54b0775f3376503c711c5846b340c4ac88f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `bun run build` now verifies what a consumer's server will do with the bundle
1265
+
1266
+ `postbuild` runs `verify:ssr`, which imports all eight built entries in a runtime
1267
+ with **no DOM** — the same thing a Nuxt server does at boot — and then fails if
1268
+ any entry **statically** reaches a dependency that must stay behind `import()`
1269
+ (`pdfjs-dist` today). Until now this repo only bundled; the modules were never
1270
+ executed, and AGENTS.md said so: "the check is the consumer, not this repo".
1271
+
1272
+ Nothing in the package changed: all eight entries pass both halves today. The
1273
+ check is there so the next barrel change cannot quietly take a consumer's server
1274
+ down at boot — and so the failure is named here rather than diagnosed there.
1275
+
1276
+ Also declares `"sideEffects": ["**/*.css"]`. It is true, not a fix: measured in
1277
+ the React sibling, it changes nothing about what a consumer bundles, because
1278
+ tree-shaking keeps a module whose own package does not promise to be
1279
+ side-effect-free. The CSS entry is not decoration — a bare `false` lets a bundler
1280
+ drop `dist/material-vue.css`.
1281
+
1282
+ ## 0.19.4
1283
+
1284
+ ### Patch Changes
1285
+
1286
+ - [#150](https://github.com/softistx/nxgt-material-vue/pull/150) [`cabe6d7`](https://github.com/softistx/nxgt-material-vue/commit/cabe6d7f74b91505282688d424a4330038e9fd46) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Fit gallery lightbox media to the viewport instead of cropping it: tiles keep the uniform `object-cover` crop, while the lightbox renders the whole media with `object-contain`.
1287
+
1288
+ ## 0.19.3
1289
+
1290
+ ### Patch Changes
1291
+
1292
+ - [#148](https://github.com/softistx/nxgt-material-vue/pull/148) [`220999c`](https://github.com/softistx/nxgt-material-vue/commit/220999c2f30ed98cd108fdf996f2ec4c8df31e17) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Crop gallery media to a uniform aspect and restyle carousel controls.
1293
+
1294
+ ## 0.19.2
1295
+
1296
+ ### Patch Changes
1297
+
1298
+ - [#146](https://github.com/softistx/nxgt-material-vue/pull/146) [`4f78749`](https://github.com/softistx/nxgt-material-vue/commit/4f7874990468d7cf16dba4654a2c27b4ea265bc3) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Close the chat composer mention list when a suggestion is selected.
1299
+
1300
+ ## 0.19.1
1301
+
1302
+ ### Patch Changes
1303
+
1304
+ - [#144](https://github.com/softistx/nxgt-material-vue/pull/144) [`c156dc4`](https://github.com/softistx/nxgt-material-vue/commit/c156dc4c671d9410433df5d0942b54c897f6f2c5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Modernise the emoji picker and add stories for emoji, mentions, chat, markdown and the editor.
1305
+
1306
+ ## 0.19.0
1307
+
1308
+ ### Minor Changes
1309
+
1310
+ - [#142](https://github.com/softistx/nxgt-material-vue/pull/142) [`8e7187d`](https://github.com/softistx/nxgt-material-vue/commit/8e7187dfa5e9a16a999ac667dd5b12aaaaefd819) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add MentionList (items + local search) for chat and the rich text editor.
1311
+
1312
+ ## 0.18.0
1313
+
1314
+ ### Minor Changes
1315
+
1316
+ - [#141](https://github.com/softistx/nxgt-material-vue/pull/141) [`7fe0ba2`](https://github.com/softistx/nxgt-material-vue/commit/7fe0ba2ddbff30b69d5936ce9b9632a72b4c0ab0) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Extract EmojiPicker for chat, markdown shortcodes, and the rich text editor.
1317
+
1318
+ - [#139](https://github.com/softistx/nxgt-material-vue/pull/139) [`25eca3c`](https://github.com/softistx/nxgt-material-vue/commit/25eca3ceb2459ad84dec9f0bebf51b40d2bbc9fe) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Terminal, a display-only prompt and log with copy.
1319
+
1320
+ ## 0.17.0
1321
+
1322
+ ### Minor Changes
1323
+
1324
+ - [#138](https://github.com/softistx/nxgt-material-vue/pull/138) [`d196132`](https://github.com/softistx/nxgt-material-vue/commit/d196132c9f50adcda4333b55443e1d1e4e90a70d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Markdown (GFM, KaTeX, mermaid) and route ChatMarkdown through it.
1325
+
1326
+ ### Patch Changes
1327
+
1328
+ - [#135](https://github.com/softistx/nxgt-material-vue/pull/135) [`ed66431`](https://github.com/softistx/nxgt-material-vue/commit/ed66431569df540b574901b60b8893dd2f510ba4) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Make EntityHeader a container: stack on small cards, wrap actions.
1329
+
1330
+ - [#136](https://github.com/softistx/nxgt-material-vue/pull/136) [`0f3f6d3`](https://github.com/softistx/nxgt-material-vue/commit/0f3f6d3bab7a1975eaaac41a776d29b00cb329eb) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Kanban columns use bg-background and rounded; add a 390px Phone story.
1331
+
1332
+ ## 0.16.0
1333
+
1334
+ ### Minor Changes
1335
+
1336
+ - [#133](https://github.com/softistx/nxgt-material-vue/pull/133) [`7a67eab`](https://github.com/softistx/nxgt-material-vue/commit/7a67eab8e5ee3183ecf11bdbef872aa1b888ad5a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Rebuild Quiz and QuestionCard on Card, ActionCard, GaugeCard and ChecklistCard.
1337
+
1338
+ ## 0.15.3
1339
+
1340
+ ### Patch Changes
1341
+
1342
+ - [#131](https://github.com/softistx/nxgt-material-vue/pull/131) [`3e55bca`](https://github.com/softistx/nxgt-material-vue/commit/3e55bca0adb87295cb771e97a1505964812f9675) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Fix ChatInbox desktop layout: side-by-side from @md via a nested container.
1343
+
1344
+ ## 0.15.2
1345
+
1346
+ ### Patch Changes
1347
+
1348
+ - [#129](https://github.com/softistx/nxgt-material-vue/pull/129) [`e0634d8`](https://github.com/softistx/nxgt-material-vue/commit/e0634d8d0320a0165fbcf090f06f903561eca4a7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Drop bg-muted gallery wells and wrap lightbox chrome on small viewports.
1349
+
1350
+ ## 0.15.1
1351
+
1352
+ ### Patch Changes
1353
+
1354
+ - [#127](https://github.com/softistx/nxgt-material-vue/pull/127) [`06435ae`](https://github.com/softistx/nxgt-material-vue/commit/06435aefc5eb940f06d6ab751ac0dcc9e4af9115) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Let the PDF toolbar wrap on small containers instead of overflowing a 48px bar.
1355
+
1356
+ - [#125](https://github.com/softistx/nxgt-material-vue/pull/125) [`5ede4ea`](https://github.com/softistx/nxgt-material-vue/commit/5ede4ea0ecd6600a763578cb9f8c2b79b360c0e5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Make Quiz container-query responsive and show results on a GaugeCard.
1357
+
1358
+ ## 0.15.0
1359
+
1360
+ ### Minor Changes
1361
+
1362
+ - [#124](https://github.com/softistx/nxgt-material-vue/pull/124) [`4d7582e`](https://github.com/softistx/nxgt-material-vue/commit/4d7582e9126c7e21a4781d77fd720a1afdb7244a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add ChatInbox (list + thread, container queries) and fix assistant bubbles in dark.
1363
+
1364
+ ## 0.14.0
1365
+
1366
+ ### Minor Changes
1367
+
1368
+ - [#122](https://github.com/softistx/nxgt-material-vue/pull/122) [`7600881`](https://github.com/softistx/nxgt-material-vue/commit/7600881938c68b989077779382c895869e7b39bf) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add EmptyState offline, search and maintenance presets, and drop bg-muted on not-found.
1369
+
1370
+ ## 0.13.0
1371
+
1372
+ ### Minor Changes
1373
+
1374
+ - [#120](https://github.com/softistx/nxgt-material-vue/pull/120) [`1136c40`](https://github.com/softistx/nxgt-material-vue/commit/1136c40179f69d2570abf872a063828734c264b9) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add ScoreCard, ShortcutCard, ChecklistCard, PaceCard and HistogramCard presets.
1375
+
1376
+ ## 0.12.0
1377
+
1378
+ ### Minor Changes
1379
+
1380
+ - [#118](https://github.com/softistx/nxgt-material-vue/pull/118) [`d242ffc`](https://github.com/softistx/nxgt-material-vue/commit/d242ffc81d51810574fd6a9203fbc9fd6bcb750a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add PlaceCard, FileCard, StatusCard, RatioCard and ThresholdCard presets.
1381
+
1382
+ ## 0.11.0
1383
+
1384
+ ### Minor Changes
1385
+
1386
+ - [#116](https://github.com/softistx/nxgt-material-vue/pull/116) [`0d910a6`](https://github.com/softistx/nxgt-material-vue/commit/0d910a660cddb86d3650fbae743d8d39351477dd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add ReceiptCard, ReviewCard, OfferCard, BandCard and LatencyCard presets.
1387
+
1388
+ ## 0.10.0
1389
+
1390
+ ### Minor Changes
1391
+
1392
+ - [#115](https://github.com/softistx/nxgt-material-vue/pull/115) [`4f20cce`](https://github.com/softistx/nxgt-material-vue/commit/4f20cce91630f564bfc39beb3bc818854949320b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add AlbumCard, TagCard and DeltaListCard presets.
1393
+
1394
+ - [#113](https://github.com/softistx/nxgt-material-vue/pull/113) [`f6eb240`](https://github.com/softistx/nxgt-material-vue/commit/f6eb240c6c1216ee06939fdcae3882838daa034e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add LinkCard and SparkbarCard presets.
1395
+
1396
+ ## 0.9.0
1397
+
1398
+ ### Minor Changes
1399
+
1400
+ - [#111](https://github.com/softistx/nxgt-material-vue/pull/111) [`35ea2af`](https://github.com/softistx/nxgt-material-vue/commit/35ea2af1af716c7fb4698b7051578ff8d06c0469) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add EventCard and StackCard presets.
1401
+
1402
+ ## 0.8.0
1403
+
1404
+ ### Minor Changes
1405
+
1406
+ - [#109](https://github.com/softistx/nxgt-material-vue/pull/109) [`cd5402a`](https://github.com/softistx/nxgt-material-vue/commit/cd5402a9bfdea7a583f86e18e811c18acca5bfd5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add MessageCard and GaugeCard presets.
1407
+
1408
+ ## 0.7.0
1409
+
1410
+ ### Minor Changes
1411
+
1412
+ - [#108](https://github.com/softistx/nxgt-material-vue/pull/108) [`587463c`](https://github.com/softistx/nxgt-material-vue/commit/587463c35ca13c8620ceaf7a3964b13e0e31dff1) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add TimelineCard and FunnelCard presets.
1413
+
1414
+ ### Patch Changes
1415
+
1416
+ - [#105](https://github.com/softistx/nxgt-material-vue/pull/105) [`5a9212b`](https://github.com/softistx/nxgt-material-vue/commit/5a9212ba0c691c621871b1679ed69db6a3c3cf40) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Tree rows are full-width rounded bars, including indent.
1417
+
1418
+ ## 0.6.0
1419
+
1420
+ ### Minor Changes
1421
+
1422
+ - [#104](https://github.com/softistx/nxgt-material-vue/pull/104) [`216c354`](https://github.com/softistx/nxgt-material-vue/commit/216c354742f853aacd6a051f90604929ca69773c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add CompareCard and HeatweekCard dashboard tiles.
1423
+
1424
+ ## 0.5.0
1425
+
1426
+ ### Minor Changes
1427
+
1428
+ - [#101](https://github.com/softistx/nxgt-material-vue/pull/101) [`9c41e63`](https://github.com/softistx/nxgt-material-vue/commit/9c41e63a8b23ff765c7640ab25f773c05959834b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add SplitCard, TicketCard and NoticeCard presets.
1429
+
1430
+ ### Patch Changes
1431
+
1432
+ - [#102](https://github.com/softistx/nxgt-material-vue/pull/102) [`897f72e`](https://github.com/softistx/nxgt-material-vue/commit/897f72e35ba44110d091571101cc80c2d245ba81) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Tree rows are rounded pills that hug the label; indent is empty gutter, not a full-width bar.
1433
+
1434
+ ## 0.4.0
1435
+
1436
+ ### Minor Changes
1437
+
1438
+ - [#73](https://github.com/softistx/nxgt-material-vue/pull/73) [`4dd1961`](https://github.com/softistx/nxgt-material-vue/commit/4dd1961b4c3368ea557480dde34115a375e05d91) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add ApiOperation: method + path, optional ParamTable, optional example CodeGroup.
1439
+
1440
+ - [#100](https://github.com/softistx/nxgt-material-vue/pull/100) [`65bb526`](https://github.com/softistx/nxgt-material-vue/commit/65bb5262501acafda2c2c4995a9eaeebadf83413) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add OverlayCard, SpotlightCard and CrewCard presets.
1441
+
1442
+ - [#95](https://github.com/softistx/nxgt-material-vue/pull/95) [`63f729c`](https://github.com/softistx/nxgt-material-vue/commit/63f729c0a855ae6ea39185446ce419550fa362bc) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add FeatureCard and MediaCard presets (responsive, compose Card).
1443
+
1444
+ - [#96](https://github.com/softistx/nxgt-material-vue/pull/96) [`2c87cc9`](https://github.com/softistx/nxgt-material-vue/commit/2c87cc9186af19f9922961591a51386a75e48d6a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add PricingCard and ProfileCard presets.
1445
+
1446
+ - [#97](https://github.com/softistx/nxgt-material-vue/pull/97) [`421335e`](https://github.com/softistx/nxgt-material-vue/commit/421335e0dbc6884fbf565418769f6fa10ba0f7e6) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add QuoteCard and a responsive UI/Cards Gallery story.
1447
+
1448
+ - [#69](https://github.com/softistx/nxgt-material-vue/pull/69) [`4a45429`](https://github.com/softistx/nxgt-material-vue/commit/4a454294e715552c0ca66169bc95820fdbc3a506) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add ParamTable, AnchorHeading, a reading-progress bar, copy-page on DocHeader, and DocChildCards for section landings.
1449
+
1450
+ - [#67](https://github.com/softistx/nxgt-material-vue/pull/67) [`66a6d37`](https://github.com/softistx/nxgt-material-vue/commit/66a6d3742c30f7768aee2c8ad11dc47eed8e0a2f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Port the documentation shell (`Doc`) and the generic `CodeGroup`, `ApiEndpoint`, `Steps`, `Hero` and `Figure` widgets from `@nxgt/material`. Repo-sync now covers adding and improving catalog components, not only shared-contract fixes.
1451
+
1452
+ - [#70](https://github.com/softistx/nxgt-material-vue/pull/70) [`47f381c`](https://github.com/softistx/nxgt-material-vue/commit/47f381ce3b622c2e82e3486e39a6108486510bf5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Doc sidebar can filter pages in place. `[` / `]` move to the previous / next page. Skip-to-content link and hash restore after navigation.
1453
+
1454
+ - [#72](https://github.com/softistx/nxgt-material-vue/pull/72) [`13c133e`](https://github.com/softistx/nxgt-material-vue/commit/13c133e78553bac28b3312dfbdf7e1e718e515c8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - DocPage lists sibling pages in a See also block before the pager.
1455
+
1456
+ - [#78](https://github.com/softistx/nxgt-material-vue/pull/78) [`24cc0ae`](https://github.com/softistx/nxgt-material-vue/commit/24cc0aeab94ee8cbd9c19bd5c27f0352627f4a1d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - EmptyState uses a tinted icon well and tighter type. DocEmpty is the docs 404/empty slot.
1457
+
1458
+ - [#94](https://github.com/softistx/nxgt-material-vue/pull/94) [`5bc03da`](https://github.com/softistx/nxgt-material-vue/commit/5bc03da362b281d5e867c32e2eea4f48db579cf3) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add useHeadingSpy (vueuse useIntersectionObserver). Doc chrome uses it for the on-this-page active heading.
1459
+
1460
+ - [#93](https://github.com/softistx/nxgt-material-vue/pull/93) [`1f68eee`](https://github.com/softistx/nxgt-material-vue/commit/1f68eee8fd177d603186854328d3b35dcf6d08d0) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add HighlightText and splitMatch. Doc search hits highlight the query.
1461
+
1462
+ - [#99](https://github.com/softistx/nxgt-material-vue/pull/99) [`e277b94`](https://github.com/softistx/nxgt-material-vue/commit/e277b944b5bf6082bf7b9433d09ebc6a8e041a1a) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add BreakdownCard and RankCard, plus a UI/Metrics Dashboard gallery.
1463
+
1464
+ - [#98](https://github.com/softistx/nxgt-material-vue/pull/98) [`9fbd6b2`](https://github.com/softistx/nxgt-material-vue/commit/9fbd6b2d01fcb33f49a11c6b196ceff3706fde83) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add TrendCard and GoalCard dashboard tiles (metrics folder).
1465
+
1466
+ - [#87](https://github.com/softistx/nxgt-material-vue/pull/87) [`407d0b0`](https://github.com/softistx/nxgt-material-vue/commit/407d0b02f57440c031b0f8dc193da3376e94e727) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Extract Pager from the doc shell. isExternalHref lives on @nxgt/material-vue/lib.
1467
+
1468
+ - [#86](https://github.com/softistx/nxgt-material-vue/pull/86) [`d44ebaf`](https://github.com/softistx/nxgt-material-vue/commit/d44ebafb684ea8640a528e55a75274f5bec96fc7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Extract ScrollProgress and SkipLink from the doc shell. Scroll chrome uses @vueuse/core (useScroll / useWindowScroll).
1469
+
1470
+ - [#89](https://github.com/softistx/nxgt-material-vue/pull/89) [`1ad4155`](https://github.com/softistx/nxgt-material-vue/commit/1ad4155ff8bc0cab3c74405c7ef1c5d6de29dc10) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Extract SeeAlso from the doc shell. Rows use a dark-safe hover, not bg-muted.
1471
+
1472
+ - [#88](https://github.com/softistx/nxgt-material-vue/pull/88) [`3a23832`](https://github.com/softistx/nxgt-material-vue/commit/3a238324626da8e69f2ce7e7035e9c13ebab91e5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Extract Toc from the doc shell. DocToc composes it with DocLink and the active heading.
1473
+
1474
+ ### Patch Changes
1475
+
1476
+ - [#90](https://github.com/softistx/nxgt-material-vue/pull/90) [`785a944`](https://github.com/softistx/nxgt-material-vue/commit/785a94492625b74d75e025fb5b9f1b36c126453e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - CopyButton uses @vueuse/core useClipboard. Doc copy actions compose it.
1477
+
1478
+ - [#81](https://github.com/softistx/nxgt-material-vue/pull/81) [`998e97b`](https://github.com/softistx/nxgt-material-vue/commit/998e97b1b0067b4ac495b023cab83f6a606cb18c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Document the Storybook UI/Doc/Api recipe: DocPage with AnchorHeading, ApiOperation, ParamTable and CodeGroup.
1479
+
1480
+ - [#71](https://github.com/softistx/nxgt-material-vue/pull/71) [`5e0e3df`](https://github.com/softistx/nxgt-material-vue/commit/5e0e3df3e1c595a5b5aa5ff6bc4dac2871e6dd9b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - DocHeader can copy the page as markdown (`markdown` prop, or the article text as a fallback).
1481
+
1482
+ - [#85](https://github.com/softistx/nxgt-material-vue/pull/85) [`5b14b64`](https://github.com/softistx/nxgt-material-vue/commit/5b14b64b69f65519052a5e4ead4e06b6ea6aaa69) Thanks [@SteveGT96](https://github.com/SteveGT96)! - DocHeader editHref shows a pencil and an outbound icon on external links.
1483
+
1484
+ - [#84](https://github.com/softistx/nxgt-material-vue/pull/84) [`462185f`](https://github.com/softistx/nxgt-material-vue/commit/462185fcfc57f9e6034734fce8dabc53a3ea9890) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Sidebar filter empty uses a compact well, and nav icon wells use bg-background.
1485
+
1486
+ - [#80](https://github.com/softistx/nxgt-material-vue/pull/80) [`283dd79`](https://github.com/softistx/nxgt-material-vue/commit/283dd7935297e4cc0082fb3a958d684d68c3949f) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Pager and See also show an outbound icon on external hrefs, same as the sidebar.
1487
+
1488
+ - [#82](https://github.com/softistx/nxgt-material-vue/pull/82) [`37d6361`](https://github.com/softistx/nxgt-material-vue/commit/37d636115bc796fcec80d6d38c452fc0167b4141) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Doc search hits are airier: icon well, snippet, outbound icon, compact empty, and a kbd footer.
1489
+
1490
+ - [#76](https://github.com/softistx/nxgt-material-vue/pull/76) [`7c19c7e`](https://github.com/softistx/nxgt-material-vue/commit/7c19c7e4b1f9b141423571a4e598e40eb39ecf02) Thanks [@SteveGT96](https://github.com/SteveGT96)! - On this page: per-item primary marker (transparent when idle), active row bg-primary/10 and text-primary.
1491
+
1492
+ - [#77](https://github.com/softistx/nxgt-material-vue/pull/77) [`39a886f`](https://github.com/softistx/nxgt-material-vue/commit/39a886fac5b0737e32968392c7a30ea402222a92) Thanks [@SteveGT96](https://github.com/SteveGT96)! - On this page uses `rounded` on the rail panel, items, and marker.
1493
+
1494
+ - [#74](https://github.com/softistx/nxgt-material-vue/pull/74) [`622f206`](https://github.com/softistx/nxgt-material-vue/commit/622f206fe665fb826812a89860568f739a6517c8) Thanks [@SteveGT96](https://github.com/SteveGT96)! - On this page items each have a left bar (primary when active) so the indicator stays on the text. Search hits show descriptions; pager cards show `[` / `]`.
1495
+
1496
+ - [#92](https://github.com/softistx/nxgt-material-vue/pull/92) [`8cc183f`](https://github.com/softistx/nxgt-material-vue/commit/8cc183f584f7aa7d06ab63c8051e08f353e6186c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Doc topbar search chip uses bg-background and rounded, not bg-muted.
1497
+
1498
+ - [#79](https://github.com/softistx/nxgt-material-vue/pull/79) [`4daf75f`](https://github.com/softistx/nxgt-material-vue/commit/4daf75f12672c314d9b4995edfb3a8ab8f9341e6) Thanks [@SteveGT96](https://github.com/SteveGT96)! - DocHeader accepts a Date for `updatedAt` and renders it with RelativeTime.
1499
+
1500
+ - [#91](https://github.com/softistx/nxgt-material-vue/pull/91) [`17f1f4d`](https://github.com/softistx/nxgt-material-vue/commit/17f1f4d9c2b092c00573ec5215025d6a6eade263) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Doc chrome uses @vueuse/core for keydown (useEventListener) and the md breakpoint (useMediaQuery).
1501
+
1502
+ - [#75](https://github.com/softistx/nxgt-material-vue/pull/75) [`99efd7f`](https://github.com/softistx/nxgt-material-vue/commit/99efd7feb204cb25d82725154b7b0ff1fa05bca9) Thanks [@SteveGT96](https://github.com/SteveGT96)! - ThemeToggle and ToggleGroup use bg-background so dark-mode icons stay visible.
1503
+
1504
+ ## 0.3.2
1505
+
1506
+ ### Patch Changes
1507
+
1508
+ - [#65](https://github.com/softistx/nxgt-material-vue/pull/65) [`8b08c05`](https://github.com/softistx/nxgt-material-vue/commit/8b08c05901808cb759599ae4be183e14b2fbd779) Thanks [@SteveGT96](https://github.com/SteveGT96)! - README: "At a glance" overview, full component catalogue with React equivalents, and a helpers reference for every subpath.
1509
+
1510
+ - [#65](https://github.com/softistx/nxgt-material-vue/pull/65) [`8b08c05`](https://github.com/softistx/nxgt-material-vue/commit/8b08c05901808cb759599ae4be183e14b2fbd779) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Ship type declarations at the paths `package.json` points to (`dist/lib/main.d.ts`, `dist/lib/components/index.d.ts`, …), so TypeScript resolves the package's types. The Nuxt module now auto-imports `useNavigationHandler`, `useNavigationHandlers` and `createTypedTranslation` instead of names that do not exist. `AppSidebar`'s default brand is the icon alone. Licensed under MIT.
1511
+
1512
+ ## 0.3.1
1513
+
1514
+ ### Patch Changes
1515
+
1516
+ - [#63](https://github.com/softistx/nxgt-material-vue/pull/63) [`8c54295`](https://github.com/softistx/nxgt-material-vue/commit/8c54295f941527290503f7930bde8835c376f79e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Keep the `ActionCard` icon box square and cap its height (`max-h-16 aspect-square`) so tall content no longer stretches it.
1517
+
1518
+ ## 0.3.0
1519
+
1520
+ ### Minor Changes
1521
+
1522
+ - [#61](https://github.com/softistx/nxgt-material-vue/pull/61) [`3a41f84`](https://github.com/softistx/nxgt-material-vue/commit/3a41f84419741fc159f5499d3feeeb8b1d62fbba) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Remove the Nuxt CSS auto-injection and the `css` module option: import `@nxgt/material-vue/styles.css` explicitly after `@import "tailwindcss"` (one `@theme` graph, and Tailwind IntelliSense can read the tokens). `styles.css` declares `@source "../dist"` so component utilities are generated by the consumer build. Pre-bundle `jsbarcode` in the Nuxt module (CommonJS default export), and stop passing `undefined` options to JsBarcode so barcodes no longer render 0×0.
1523
+
1524
+ ## 0.2.0
1525
+
1526
+ ### Minor Changes
1527
+
1528
+ - [#57](https://github.com/softistx/nxgt-material-vue/pull/57) [`c00cf7c`](https://github.com/softistx/nxgt-material-vue/commit/c00cf7c1c2d888a3615217fb81cdb906c4cf4f67) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Port the remaining Feedback catalog (Alert, empty state, confirm dialogs, toasts, progress field) and composed skeleton variants from @nxgt/material.
1529
+
1530
+ ### Patch Changes
1531
+
1532
+ - [#58](https://github.com/softistx/nxgt-material-vue/pull/58) [`0ade7fe`](https://github.com/softistx/nxgt-material-vue/commit/0ade7fe0ee04300fc3dd6c5d8b4b8a327404b9a7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Inject material styles into the app Tailwind CSS entry so @theme tokens apply without a manual @import.
1533
+
1534
+ - [#60](https://github.com/softistx/nxgt-material-vue/pull/60) [`858bb9c`](https://github.com/softistx/nxgt-material-vue/commit/858bb9c69913fdea94843d2f3851df7ae95457d6) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Keep icon buttons from collapsing (RTE toolbar) and resolve JsBarcode so barcodes paint on canvas.
1535
+
1536
+ ## 0.1.0
1537
+
1538
+ ### Minor Changes
1539
+
1540
+ - [#18](https://github.com/softistx/nxgt-material-vue/pull/18) [`dd2a076`](https://github.com/softistx/nxgt-material-vue/commit/dd2a076315798015608768f74684090d5d5a9e9e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Sidebar, AppBar, Background, and AppShell (ActivityLayout, vue-router breadcrumbs).
1541
+
1542
+ - [#30](https://github.com/softistx/nxgt-material-vue/pull/30) [`8834bb4`](https://github.com/softistx/nxgt-material-vue/commit/8834bb40469015742e8ca517281e42a6cf9e0e21) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add AttributesField, AttributeForm, AttributeValuesForm, and vee-validate wrappers.
1543
+
1544
+ - [#11](https://github.com/softistx/nxgt-material-vue/pull/11) [`3074832`](https://github.com/softistx/nxgt-material-vue/commit/3074832e34cc6e79f0f48f76d2c4613331e2b3d2) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Port ButtonGroup, LinkButton, ResponsiveButton, and SplitButton.
1545
+
1546
+ - [#44](https://github.com/softistx/nxgt-material-vue/pull/44) [`338be4b`](https://github.com/softistx/nxgt-material-vue/commit/338be4b834bb51f43bcc8813c0fa8e6dee9a1e0d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Camera, StxPlayer, and a deprecated VideoPlayer re-export.
1547
+
1548
+ - [#27](https://github.com/softistx/nxgt-material-vue/pull/27) [`769af7b`](https://github.com/softistx/nxgt-material-vue/commit/769af7b7361b7765d88b6e1864cdea158e914675) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Carousel, QRCode, and Barecode.
1549
+
1550
+ - [#32](https://github.com/softistx/nxgt-material-vue/pull/32) [`eff1b1d`](https://github.com/softistx/nxgt-material-vue/commit/eff1b1d5f089b08c96618d8a272f7b602dd614fc) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add ECharts chart components (Bar, Line, Area, Pie, Radar, Scatter, Heatmap, Funnel).
1551
+
1552
+ - [#43](https://github.com/softistx/nxgt-material-vue/pull/43) [`8f923d7`](https://github.com/softistx/nxgt-material-vue/commit/8f923d76468fa4e8d061827fe9f6cb71d8e07c27) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Chat thread, composer, markdown, and message primitives.
1553
+
1554
+ - [#19](https://github.com/softistx/nxgt-material-vue/pull/19) [`2af1269`](https://github.com/softistx/nxgt-material-vue/commit/2af12699088bb76101a04a586de90d68298e69b3) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add typography, kbd, list-tile, chrome toggles, banner, cards, avatar-group, switcher, layouts, and related overlays.
1555
+
1556
+ - [#45](https://github.com/softistx/nxgt-material-vue/pull/45) [`e3d3168`](https://github.com/softistx/nxgt-material-vue/commit/e3d316871940369e1f8eaf42409b84e104688221) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add CodeEditor (Monaco via dynamic import) and mark the Vue catalog overlays complete on the roadmap.
1557
+
1558
+ - [#20](https://github.com/softistx/nxgt-material-vue/pull/20) [`37a3b64`](https://github.com/softistx/nxgt-material-vue/commit/37a3b64b28c48231cb852497e6ec765e6405788c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add ComboboxField, TimezoneField, SelectCardField, CheckCardField, SliderField, and vee-validate wrappers.
1559
+
1560
+ - [#26](https://github.com/softistx/nxgt-material-vue/pull/26) [`8585bff`](https://github.com/softistx/nxgt-material-vue/commit/8585bff3049461d37b370a3197c330f26e1b50a1) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Contacts, PostalAddress, and OpeningHours display widgets, dialogs, and vee-validate form fields.
1561
+
1562
+ - [#36](https://github.com/softistx/nxgt-material-vue/pull/36) [`883f340`](https://github.com/softistx/nxgt-material-vue/commit/883f34026280f800df3318ba07002fe8f1ea37f6) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add ImageCropper, ImageCropperDialog, and print document primitives.
1563
+
1564
+ - [#24](https://github.com/softistx/nxgt-material-vue/pull/24) [`76a0acd`](https://github.com/softistx/nxgt-material-vue/commit/76a0acd89ad391ebdf9c589cc40245395742617e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add DataTable with sorting, pagination, column visibility, row selection, and expandable rows.
1565
+
1566
+ - [#14](https://github.com/softistx/nxgt-material-vue/pull/14) [`bbb7f46`](https://github.com/softistx/nxgt-material-vue/commit/bbb7f4622a937f5204f0b3c2e287f7f84cb52fff) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add DateField, TimeField, TimePicker, SwitchField, RadioGroupField, and vee-validate wrappers.
1567
+
1568
+ - [#33](https://github.com/softistx/nxgt-material-vue/pull/33) [`3239025`](https://github.com/softistx/nxgt-material-vue/commit/3239025925519e3c334837123c0c63616154ac42) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add pointer-based DnD primitives and SortableList with a vee-validate form wrapper.
1569
+
1570
+ - [#41](https://github.com/softistx/nxgt-material-vue/pull/41) [`64ee793`](https://github.com/softistx/nxgt-material-vue/commit/64ee793f34a0cdcd25abe7778a6b8e721e08ef5e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add QuestionCard and Quiz education components.
1571
+
1572
+ - [#38](https://github.com/softistx/nxgt-material-vue/pull/38) [`8f344b6`](https://github.com/softistx/nxgt-material-vue/commit/8f344b64d26fb6b0b95bf34d984587f35423d419) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add EventCalendar with month, week, workweek, day, and agenda views.
1573
+
1574
+ - [#46](https://github.com/softistx/nxgt-material-vue/pull/46) [`7c119c7`](https://github.com/softistx/nxgt-material-vue/commit/7c119c776129d930b889b5bf843910e419048f05) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add the Field config dispatcher that renders nxgt field overlays from a typed config.
1575
+
1576
+ - [#10](https://github.com/softistx/nxgt-material-vue/pull/10) [`9979e9c`](https://github.com/softistx/nxgt-material-vue/commit/9979e9c8f3413fe8ffb9eac60fcadf1ebc064b9c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add TextField, TextareaField, NumberField and vee-validate form wrappers.
1577
+
1578
+ - [#13](https://github.com/softistx/nxgt-material-vue/pull/13) [`39cdb63`](https://github.com/softistx/nxgt-material-vue/commit/39cdb63f682087947a8997f2d60a840c6d9854a1) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add EmailField, UrlField, PasswordField, OtpField, SelectField, CheckboxGroup, CopyButton, and vee-validate wrappers.
1579
+
1580
+ - [#28](https://github.com/softistx/nxgt-material-vue/pull/28) [`8d59fd4`](https://github.com/softistx/nxgt-material-vue/commit/8d59fd4f553495f35e3a2e63c54b2c65ef1366a6) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add FileList, FileListField, ImageField, Tree, and their vee-validate form wrappers.
1581
+
1582
+ - [#37](https://github.com/softistx/nxgt-material-vue/pull/37) [`c8482cd`](https://github.com/softistx/nxgt-material-vue/commit/c8482cdfa3bf01207f7609905bd0c11451abbf71) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Filter composite with Pinia local store, layout variants, and vee-validate wrapper.
1583
+
1584
+ - [#4](https://github.com/softistx/nxgt-material-vue/pull/4) [`d6963ce`](https://github.com/softistx/nxgt-material-vue/commit/d6963ce4166480987f86e4777f277e3577178413) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Port utils, i18n, composables, and RTK slice helpers from nxgt-material.
1585
+
1586
+ - [#42](https://github.com/softistx/nxgt-material-vue/pull/42) [`7dd8f54`](https://github.com/softistx/nxgt-material-vue/commit/7dd8f5451fed6f82a87961dbf1a22034de0cea56) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Gallery, LightboxGallery, and MiniGallery with layout presets and lightbox chrome.
1587
+
1588
+ - [#15](https://github.com/softistx/nxgt-material-vue/pull/15) [`80e2ea9`](https://github.com/softistx/nxgt-material-vue/commit/80e2ea9f0d338371ac81d59585e5e0051c6efe2c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add InputGroup, InputGroupField, PhoneField (E.164 via libphonenumber-js), and vee-validate wrappers.
1589
+
1590
+ - [#35](https://github.com/softistx/nxgt-material-vue/pull/35) [`c6fa1bd`](https://github.com/softistx/nxgt-material-vue/commit/c6fa1bd11c0dd9361d4360f484203af268cd943c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Kanban with column and card reorder, groups, WIP limits, and keyboard moves.
1591
+
1592
+ - [#29](https://github.com/softistx/nxgt-material-vue/pull/29) [`ce35547`](https://github.com/softistx/nxgt-material-vue/commit/ce35547b79956344ec99e50738d1fb45849271c9) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Notifications, CodeBlock, CodeDiff, and JsonViewer.
1593
+
1594
+ - [#48](https://github.com/softistx/nxgt-material-vue/pull/48) [`da702eb`](https://github.com/softistx/nxgt-material-vue/commit/da702eb10260741ff011bf39cc2342007e40aad6) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add a Nuxt module (`@nxgt/material-vue/nuxt`) that injects CSS and auto-imports components and composables.
1595
+
1596
+ - [#9](https://github.com/softistx/nxgt-material-vue/pull/9) [`8966fe9`](https://github.com/softistx/nxgt-material-vue/commit/8966fe9c7977e0bdd422c3c8a161c5320d6bef31) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Port nxgt Button variants, Icon, Spinner, IconButton, Chip, CountBadge, HelperText.
1597
+
1598
+ - [#23](https://github.com/softistx/nxgt-material-vue/pull/23) [`9c3a10c`](https://github.com/softistx/nxgt-material-vue/commit/9c3a10c519c746b589febf19a1fb08d0cae499df) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add PaneLayout and ListDetailsLayout.
1599
+
1600
+ - [#40](https://github.com/softistx/nxgt-material-vue/pull/40) [`30577eb`](https://github.com/softistx/nxgt-material-vue/commit/30577eb885a3171d3f603ed50f570d042a1b7e29) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add PdfReader, a client-only PDF viewer with toolbar, thumbnails, outline, search, and zoom.
1601
+
1602
+ - [#7](https://github.com/softistx/nxgt-material-vue/pull/7) [`b1b49d8`](https://github.com/softistx/nxgt-material-vue/commit/b1b49d84d14660d2b287159d5992c413e44ecca2) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Replace Redux Toolkit slices with Pinia local stores for component chrome.
1603
+
1604
+ - [#22](https://github.com/softistx/nxgt-material-vue/pull/22) [`85c479a`](https://github.com/softistx/nxgt-material-vue/commit/85c479a97ac7529053597c04b605d908a8ad3ce9) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Autocomplete, CountryField, SelectChipField, DateRangeField, EventChip, and vee-validate wrappers.
1605
+
1606
+ - [#39](https://github.com/softistx/nxgt-material-vue/pull/39) [`d3c7f4f`](https://github.com/softistx/nxgt-material-vue/commit/d3c7f4f3b93e1744e4464f84c45d5a926d0db975) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add RichTextEditor with TipTap Vue 3, custom nodes, and a vee-validate form field.
1607
+
1608
+ - [#1](https://github.com/softistx/nxgt-material-vue/pull/1) [`b4ba98f`](https://github.com/softistx/nxgt-material-vue/commit/b4ba98fe65843ba86424d1e6845e851cd1a23ffd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Scaffold the Vue library: Vite, shadcn-vue, Storybook, CI, and changesets.
1609
+
1610
+ - [#5](https://github.com/softistx/nxgt-material-vue/pull/5) [`9713868`](https://github.com/softistx/nxgt-material-vue/commit/9713868226f86969fbb73cb1a24010f96c9d218c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add shadcn-vue (Reka UI) primitives: button, inputs, overlays, data display.
1611
+
1612
+ - [#21](https://github.com/softistx/nxgt-material-vue/pull/21) [`16dd940`](https://github.com/softistx/nxgt-material-vue/commit/16dd940cd1016ce83b570b21aa060c7ec3319c38) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Stepper, Timeline, RelativeTime, and InlineEdit.
1613
+
1614
+ - [#34](https://github.com/softistx/nxgt-material-vue/pull/34) [`09c7160`](https://github.com/softistx/nxgt-material-vue/commit/09c7160171d09ecda94651a553b388f8a40f558e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add TransferList dual-pane selector with Pinia chrome, drag-and-drop, and a vee-validate wrapper.
1615
+
1616
+ - [#31](https://github.com/softistx/nxgt-material-vue/pull/31) [`fba155e`](https://github.com/softistx/nxgt-material-vue/commit/fba155ebf547e4a6ac62ae45ed54f0dac5d6dffd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add UploadField, NetworkUploadField, S3UploadField, and their vee-validate form wrappers.
1617
+
1618
+ - [#17](https://github.com/softistx/nxgt-material-vue/pull/17) [`5ac1a31`](https://github.com/softistx/nxgt-material-vue/commit/5ac1a31fab52ec8c1132f26eaf343992f80a16ba) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add PercentField, DurationField, CurrencyField, RatingField, SearchField, ColorField, and vee-validate wrappers.
1619
+
1620
+ ### Patch Changes
1621
+
1622
+ - [#12](https://github.com/softistx/nxgt-material-vue/pull/12) [`349678d`](https://github.com/softistx/nxgt-material-vue/commit/349678dd607cc8953c6ece69c444555f7e98b2bf) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Require kebab-case on new nxgt files and make the code-reviewer run tsc/tests, not only reciting AGENTS.md.
1623
+
1624
+ - [#2](https://github.com/softistx/nxgt-material-vue/pull/2) [`1c547fb`](https://github.com/softistx/nxgt-material-vue/commit/1c547fbd3412adc565480e5f4fcd3684784ca010) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Vue-patched agent docs, Claude skills, and shadcn-vue MCP config.
1625
+
1626
+ - [#51](https://github.com/softistx/nxgt-material-vue/pull/51) [`2dce802`](https://github.com/softistx/nxgt-material-vue/commit/2dce802534c953ca4476586ccbf747bc8a43e271) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Keep DateField and DateRangeField pickers at 280px with 2rem day cells so the popover no longer stretches with the input.
1627
+
1628
+ - [#52](https://github.com/softistx/nxgt-material-vue/pull/52) [`817f0a7`](https://github.com/softistx/nxgt-material-vue/commit/817f0a7ee2fbbd03612254913c2b7809106fd7d5) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Give charts a real CSS height (numeric px) and load vue-sonner styles on the Toaster.
1629
+
1630
+ - [#8](https://github.com/softistx/nxgt-material-vue/pull/8) [`cf2f154`](https://github.com/softistx/nxgt-material-vue/commit/cf2f154216d939aaf635f99b840da9ce743fe7a4) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add Claude project agents (roadmap, docs, review, catalog porter, SSR audit) and ROADMAP.md.
1631
+
1632
+ - [#53](https://github.com/softistx/nxgt-material-vue/pull/53) [`2b52939`](https://github.com/softistx/nxgt-material-vue/commit/2b52939c40835b1ebda30280b330f193719d5afc) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Align CodeBlock lines to the top-left, render barcodes on canvas, match Switch to nxgt-material, and group Storybook stories by role.
1633
+
1634
+ - [#47](https://github.com/softistx/nxgt-material-vue/pull/47) [`f6842a1`](https://github.com/softistx/nxgt-material-vue/commit/f6842a1963543e6da7d3c9b3bdfec64bc1881d74) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Rebuild Autocomplete (inline chips + typeahead) and DateRangeField (single trigger + range calendar). Stretch ActionCard content so the indicator sits at the end.
1635
+
1636
+ - [#16](https://github.com/softistx/nxgt-material-vue/pull/16) [`78bc6e7`](https://github.com/softistx/nxgt-material-vue/commit/78bc6e7904b05b0cae155d4b818ab06810b18f07) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Forward InputGroupField error and disabled onto the control so the invalid ring and addon opacity apply.
1637
+
1638
+ - [#56](https://github.com/softistx/nxgt-material-vue/pull/56) [`5f8db40`](https://github.com/softistx/nxgt-material-vue/commit/5f8db40fd924173e694a03283b5c97d6ca697e86) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Point the package style export at dist/material-vue.css, the file Vite actually emits.
1639
+
1640
+ - [#6](https://github.com/softistx/nxgt-material-vue/pull/6) [`53ec953`](https://github.com/softistx/nxgt-material-vue/commit/53ec953c8beb795bd5e0ab098c337b35282276a7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Pin CI Biome to 2.5.5 and format vite.config.ts so biome ci passes.
1641
+
1642
+ - [#11](https://github.com/softistx/nxgt-material-vue/pull/11) [`3074832`](https://github.com/softistx/nxgt-material-vue/commit/3074832e34cc6e79f0f48f76d2c4613331e2b3d2) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Update ROADMAP after chrome, fields batch 1, and the remaining button family.
1643
+
1644
+ - [#54](https://github.com/softistx/nxgt-material-vue/pull/54) [`1a145ec`](https://github.com/softistx/nxgt-material-vue/commit/1a145ec8a758c19a676af3ea99a2f597ba02b8f7) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Add fill-available size utilities and stretch the split-button chevron to the control height.
1645
+
1646
+ - [#49](https://github.com/softistx/nxgt-material-vue/pull/49) [`b51ab16`](https://github.com/softistx/nxgt-material-vue/commit/b51ab162bd2aff05cca0894d06c4b0c7ca59f3bf) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Switch Storybook Vue docgen from deprecated vue-docgen-api to vue-component-meta so the preview builds.
1647
+
1648
+ - [#50](https://github.com/softistx/nxgt-material-vue/pull/50) [`1266198`](https://github.com/softistx/nxgt-material-vue/commit/1266198b4e0a006da85ad5944b30ecef555c473d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Move Vue SFC type aliases and re-exports into .ts modules so Storybook docgen can parse every component.
1649
+
1650
+ - [#55](https://github.com/softistx/nxgt-material-vue/pull/55) [`ad0f6ba`](https://github.com/softistx/nxgt-material-vue/commit/ad0f6bafdeceef9fda202fe7367ff8d59eb9d997) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Ship code-moonlight.css next to the published stylesheet so Nuxt can resolve the relative import.