@nxgt/material-vue 0.25.0 → 0.25.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,1628 @@
1
+ # @nxgt/material-vue
2
+
3
+ ## 0.25.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#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
8
+ `softistx/nxgt-material` repository is now a Claude Code plugin marketplace
9
+ for apps that use the libraries — `nxgt-material` for React apps,
10
+ `nxgt-material-vue` for Vue and Nuxt apps — each with a skill that reads the
11
+ installed package's docs, a screen-builder agent, an upgrade-assistant agent
12
+ and an advisory hook that names the component a file hand-rolls. Install
13
+ with `/plugin marketplace add softistx/nxgt-material`, then
14
+ `/plugin install nxgt-material@nxgt-material` (or
15
+ `nxgt-material-vue@nxgt-material`); the repository is private, so this needs
16
+ GitHub access. Nothing in the package itself changed.
17
+
18
+ - [#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
19
+ version are in `node_modules/<package>/CHANGELOG.md` next to the docs, for
20
+ reading offline and for the upgrade agents of the Claude Code plugins.
21
+ The getting-started pages of `@nxgt/material` and `@nxgt/material-vue`
22
+ list it among the tarball's contents.
23
+ - Updated dependencies [[`13c3eda`](https://github.com/softistx/nxgt-material/commit/13c3edad01f08656ca196aca7c37a21e8c003466)]:
24
+ - @nxgt/material-core@0.3.2
25
+
26
+ ## 0.25.1
27
+
28
+ ### Patch Changes
29
+
30
+ - [#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`.
31
+ - Updated dependencies [[`d4e953f`](https://github.com/softistx/nxgt-material/commit/d4e953fd4fc147b366c5d9d70ebfb1aa3a3c0ba7)]:
32
+ - @nxgt/material-core@0.3.1
33
+
34
+ ## 0.25.0
35
+
36
+ ### Minor Changes
37
+
38
+ - [#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`,
39
+ `min-date` and `max-date`, as `@nxgt/material`'s. `presets` lists one-click
40
+ ranges beside the calendar: built-in ids (`DATE_RANGE_PRESET_IDS`: `today`,
41
+ `yesterday`, `last-7-days`, `last-30-days`, `this-month`, `last-month`,
42
+ `this-year`) and `{ label, range }` of your own, where `range` may be
43
+ `(now) => range`. A preset is a toggle button in a group named "Presets",
44
+ pressed when its days are the value's, and disabled when its range starts
45
+ before `min-date`, ends after `max-date`, either end is one of
46
+ `disabled-days`, or (a preset of your own) its end comes before its start.
47
+ Picking one closes the popover, except with `with-time`, where OK closes it. `min-date` / `max-date` are
48
+ the first and last day the calendar lets you pick (Reka's `minValue` /
49
+ `maxValue`). `with-time` adds a start and an end `TimePicker` under the
50
+ calendar, each disabled until its end has a day, and an OK button; the
51
+ popover then stays open until OK (it no longer closes on the second day),
52
+ the trigger shows each end's time, a day picked on the calendar keeps the
53
+ time its end had (a new start 00:00, a new end 23:59, as the built-in
54
+ presets end), and an end set before the start on the same day becomes the
55
+ start time. Without `with-time`, a picked day still carries the current
56
+ time of day (`@nxgt/material` gives it 00:00). The built-in presets use the
57
+ current date (there is no `now` prop). `DATE_RANGE_PRESET_IDS` and the types
58
+ `DateRangePreset`, `DateRangePresetId`, `DateRangePresetOption` and
59
+ `DayRange` are exported from `@nxgt/material-vue/components` (from
60
+ `@nxgt/material-core/date-range`).
61
+
62
+ New `material.*` keys: `material.date-range-field.presets`,
63
+ `material.date-range-field.preset.today`, `.yesterday`, `.last-7-days`,
64
+ `.last-30-days`, `.this-month`, `.last-month`, `.this-year`,
65
+ `material.date-range-field.start-time`, `material.date-range-field.end-time`,
66
+ `material.time-picker.hours` and `material.time-picker.minutes`.
67
+
68
+ `TimePicker` fix, as in `@nxgt/material`: AM / PM follows the `date` it is
69
+ given, switching it always moves the time into that half of the day, a click
70
+ on the pressed half changes nothing, and the hours and minutes inputs are
71
+ named "Hours" and "Minutes".
72
+
73
+ - [#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
74
+ previewed by its MIME type, else its extension. `file` is a `File`, a `Blob`
75
+ or a URL, with optional `type` and `name` overriding what the file says. An
76
+ image is an `<img>` whose alt text is the file name; a PDF opens in
77
+ `PdfReader`, imported the first time a PDF is previewed, and falls back to
78
+ the file card when the viewer cannot be loaded; a video or audio file gets
79
+ the browser's `<video controls>` / `<audio controls>`; a text, JSON, CSV or
80
+ Markdown file is read up to `max-text-bytes` (256 KB by default) and shown in
81
+ a scrolling `<pre>`, JSON in `JsonViewer` and Markdown rendered, with
82
+ "Showing the first … of this file." when it was cut; anything else is a
83
+ `FileCard` with its size and type and a Download link. A text is decoded
84
+ with the `charset` of the response's `Content-Type` when the browser supports
85
+ it, else as UTF-8. A URL must be `http(s):`, relative, `blob:`, or a
86
+ `data:` URL of an image, video, audio, plain text, CSV, Markdown, JSON or PDF: any other (`javascript:`, `data:text/html`, and
87
+ also a `data:` URL of XML, TSV or YAML) is never linked, loaded or fetched,
88
+ and shows the error state with no Download link and a
89
+ `FilePreviewUnsafeUrlError` ("Refused to preview a URL with an unsafe scheme") for `@error`. A PDF the reader fails to open
90
+ stays `ready`: `PdfReader` shows its own error. The scrolling text and
91
+ Markdown are regions named "Contents of {name}", and "Loading preview…" is
92
+ announced from a live region that stays mounted. A `File` or `Blob` is
93
+ shown through an object URL, revoked on change and on unmount. On the server,
94
+ and until mounted, it renders an empty placeholder (`data-state="pending"`):
95
+ no object URL, no fetch, nothing to mismatch on hydration. Then `loading`,
96
+ `ready` or `error` ("This file could not be previewed.", with a Download
97
+ link), and it emits `error`. Also exported from
98
+ `@nxgt/material-vue/components`: `fileKind`, `FilePreviewHttpError`,
99
+ `FilePreviewUnsafeUrlError`, `TEXT_PREVIEW_MAX_BYTES` and the types `FileKind`, `FilePreviewSource`,
100
+ `FilePreviewProps` and `FilePreviewStatus` (from
101
+ `@nxgt/material-core/file-preview`). The Nuxt module registers
102
+ `FilePreview`.
103
+
104
+ New `material.*` keys: `material.file-preview.label`,
105
+ `material.file-preview.untitled`, `material.file-preview.loading`,
106
+ `material.file-preview.error`, `material.file-preview.download`,
107
+ `material.file-preview.truncated` and `material.file-preview.content`.
108
+
109
+ `useImagePreview` (public) now goes through `useBlobUrl` and cleans up with
110
+ `onScopeDispose`, so it also works inside an effect scope.
111
+
112
+ - [#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.
113
+
114
+ - `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.
115
+ - 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}".
116
+ - `searchable` adds a filter above the tree; each match stays under its ancestors, which open.
117
+ - 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).
118
+ - 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.
119
+ - `TreeSelectFormField` binds it to react-hook-form (`control`, `name`, `multiple`) or vee-validate (`name`, `multiple`), touched when focus leaves the trigger and its popover.
120
+ - New copy under `material.tree-select-field.*` (`placeholder`, `search`, `empty`, `selected`), in English and French.
121
+
122
+ **`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`.
123
+
124
+ - [#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:
125
+
126
+ - `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.
127
+ - `FilesFormField`: a free-solo autocomplete of file URLs bound to vee-validate, with image thumbnails (`image`, `image-link-builder`).
128
+ - `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).
129
+ - `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.
130
+ - `SliderField` `ticks`, `leading` and `trailing` (props, or `#leading` / `#trailing` slots).
131
+ - `Avatar` `status` and `status-pulse`: a presence dot named Online, Away, Busy, Offline or Active.
132
+ - `QRCode` `#logo` slot (the default slot still works).
133
+ - `AccordionCard` `#header`, `#title` and `#content` slots.
134
+ - `SelectField` `#option` slot.
135
+ - `CodeEditor` `options`: Monaco's own construction options, passed through (`CodeEditorOptions` is exported). Monaco stays client-only.
136
+ - `Tabs` `variant="line"` (`TabsVariant` is exported).
137
+
138
+ `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.
139
+
140
+ `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.
141
+
142
+ `@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.
143
+
144
+ ### Patch Changes
145
+
146
+ - [#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
147
+ at 12:00 AM and end at 11:59 PM.
148
+
149
+ - [#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`,
150
+ `next`, `page` and `more` (`@nxgt/material`); `InlineEdit` says where focus
151
+ goes when the editor closes, and its Vue props table lists `label` and
152
+ `name`; the Vue `DocLink` paragraph says that without `@navigate` it and the
153
+ sidebar are plain anchors that load the page.
154
+ The Vue i18n guide also names `material.slider.value`, `minimum` and
155
+ `maximum`, which label the slider readout.
156
+
157
+ - [#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
158
+ slow device. The placement scroll could land after the scroll spy's hold had
159
+ run out, and near the end of the document it read as the last page. While
160
+ the view stays where the opening page's pin put it (that page at the top,
161
+ or the page area at its end with that page not above the top), a scroll is the reader's own and is not
162
+ reported; a scroll that moves the view elsewhere — the user's, find in page,
163
+ a screen reader's cursor — lets go of the pin and is reported. A wheel,
164
+ touch, pointer or key in the page area also ends the hold on the reader's
165
+ own scroll, so the scrolling after it is reported at once. In
166
+ `@nxgt/material-core/pdf-viewer`, `pinToPage` takes an optional `onRelease`,
167
+ called once when the pin lets go, and `pinHolds(node)` tells whether the view
168
+ is still where the pin puts it.
169
+
170
+ - [#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).
171
+
172
+ - [#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
173
+ input that is a part of a larger field. The `material.slider.value` key is
174
+ added to keep the bundles in step with `@nxgt/material`, whose single-value
175
+ `Slider` readout input it names.
176
+ - 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)]:
177
+ - @nxgt/material-core@0.3.0
178
+
179
+ ## 0.24.0
180
+
181
+ ### Minor Changes
182
+
183
+ - [#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
184
+ (`Skeleton`), one cell per visible column, as many as the page size or
185
+ `loadingRows`; with rows already shown, they stay in place, dimmed and
186
+ `inert`, so a refresh does not move the page. The table is `aria-busy` and a
187
+ visually hidden status says "Loading data…" (`material.table.loading`, en and
188
+ fr: translate it if you override the bundles or ship another language).
189
+ Sorting (`DataTableColumnHeader`), the `select` column's "Select all", the
190
+ toolbar's native controls and pagination (`DataTablePagination`'s new
191
+ `disabled`) are disabled meanwhile; the toolbar is now a `<fieldset>`.
192
+
193
+ An `#empty="{ filtered }"` slot replaces the "No data available" row, inside
194
+ a `TableEmpty` spanning every visible column; `filtered` is `true` when rows
195
+ exist but none matches the column filters. The default empty row is a
196
+ `TableEmpty` too, and spans the visible columns rather than every defined
197
+ one, as an expanded row now does. A slot that renders nothing gets the
198
+ default. New type: `DataTableEmptyState`.
199
+
200
+ `Table` now puts the attributes you pass (`aria-*`, `id`, `style`,
201
+ listeners) on the `<table>`, as `@nxgt/material` does, instead of on its
202
+ scrolling container; `class` was already the table's. A `style="max-height:…"`
203
+ or a `@scroll` on `<Table>` therefore no longer limits or follows the
204
+ scrolling: put the height limit on a wrapper of your own (see "A `Table`'s
205
+ `id`, `aria-*` or `style` is no longer on its scrolling container" in
206
+ troubleshooting).
207
+
208
+ The table body's `max-h-[300px] overflow-auto` is gone: a table row group is
209
+ neither clipped nor scrolled, so it never had an effect (the wrapper's
210
+ `max-h-[400px]` still scrolls the table).
211
+
212
+ - [#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
213
+ same names:
214
+
215
+ - `Checkbox` takes `label` and `helper-text` (or the `#label` and
216
+ `#helper-text` slots) and then renders the box in a labelled row. Without
217
+ them it is the same bare Reka UI box as before. `CheckboxFormField` is its
218
+ vee-validate wrapper: an unset value shows as indeterminate, and an
219
+ indeterminate value is written as `null`.
220
+ - `InlineEditFormField` (the value changes on save) and `CodeEditorFormField`
221
+ (Monaco still loads in the browser only).
222
+ - `PaginationBar` (`v-model:page`, `page-count`, `sibling-count`), the
223
+ `paginationItems` window it renders, and `PaginationLink`.
224
+ - `CopyValue`, a value in a monospace chip with its copy button.
225
+ - `MermaidDiagram`, one mermaid chart rendered in the browser only.
226
+ - The `Doc` parts `DocArticle`, `DocNav`, `DocLink`, `DefaultDocLink` and
227
+ `DocCopyPage`, with the `DocArticleProps`, `DocNavProps` and `DocLinkProps`
228
+ types, to build a documentation shell of your own.
229
+
230
+ Fixed in `Doc`: a parent's `@navigate` runs once per click (it ran twice);
231
+ without a navigate handler the links are plain anchors again, instead of
232
+ links that went nowhere; and the shell follows later `pathname`, `items`,
233
+ `toc`, `previous` and `next` changes, so the active entry tracks the route.
234
+
235
+ The Nuxt module registers the new components. In `@nxgt/material`, the README
236
+ and component pages name these Vue equivalents and list what is still
237
+ React-only.
238
+
239
+ ### Patch Changes
240
+
241
+ - [#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
242
+ alert instead of overflowing it, and the `#icon` slot keeps its size. The
243
+ text column now shrinks (`min-w-0`) and breaks long words, as `Banner`'s
244
+ text column does, and the icon sits in a `shrink-0` wrapper.
245
+
246
+ - [#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` /
247
+ `aria-labelledby`) is now `aria-hidden`, so the button is announced "Add"
248
+ instead of "Icon plus Add". A `Button` holding only an `Icon` still reads it,
249
+ and so does one whose only other text is `aria-hidden` (a decorative count).
250
+ If a test of yours found such a button by "Icon {name} …", select it by its
251
+ text — see "A button named "Icon plus Add" is now named "Add"" in
252
+ `docs/troubleshooting.md`.
253
+
254
+ - [#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
255
+ `InlineEdit`:
256
+
257
+ - `ColorField` without `v-model`: text that is not a hex stayed in the field
258
+ and painted the swatch; it now puts the last valid color back, as with
259
+ `v-model`.
260
+ - `InlineEdit`: Enter emitted `save` (and `update:modelValue`) twice, and
261
+ Escape emitted it with the old text — removing the focused input fired its
262
+ blur, which saved again. It no longer does. Closing the editor with Enter,
263
+ Escape, Save or Cancel now returns focus to the field instead of `<body>`,
264
+ and reopening it focuses the input every time (it relied on `autofocus`,
265
+ which a browser honours once per document).
266
+
267
+ - [#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`.
268
+
269
+ - `ListTile`: a long title or an unbroken URL wraps inside the tile instead
270
+ of scrolling sideways, and the `leading` / `trailing` pieces keep their
271
+ size (a trailing chevron was squeezed to a sliver).
272
+ - `StatCard`: a long label, value or hint wraps inside the card instead of
273
+ running out of it; the icon and the delta keep their size.
274
+ - `Banner`: a long title or description wraps instead of scrolling sideways;
275
+ the icon keeps its size.
276
+ - `Stepper`: a long step title or label truncates with an ellipsis instead of
277
+ scrolling inside its step.
278
+
279
+ - [#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
280
+ (and described by its description and error), so two range filters no longer
281
+ read as "Min", "Max", "Min", "Max"; the inputs keep "Min" and "Max" as their
282
+ part names, as `DurationField` does. A `slider-range` field now shows its
283
+ label and description (it rendered the bare slider, with thumbs named only
284
+ "Minimum" and "Maximum") through `SliderField`, with its readout text ("20 – 70"), as
285
+ `@nxgt/material` does, and
286
+ a labelled range `SliderField` is a group named by its label. The
287
+ `material.slider.minimum` / `maximum` keys are added to keep the bundles in
288
+ step with `@nxgt/material`.
289
+
290
+ - [#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:
291
+
292
+ - **`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.
293
+ - **`NativeSelect`**, `NativeSelectOption` and `NativeSelectOptGroup`: the browser's own `<select>`, styled; an invalid one uses the `error` colour.
294
+ - **`InputOTP`**, `InputOTPGroup`, `InputOTPSlot` and `InputOTPSeparator`, the parts `OtpField` is built from. `InputOTPSeparator` now has `role="separator"` and takes children.
295
+ - **`PaginationFirst`** and **`PaginationLast`** (double chevrons), **`TableEmpty`**, **`DialogScrollContent`**, and the **`ToastAction`** type.
296
+ - **`Button` `size`**: `xs`, `sm`, `default`, `lg`, and the square `icon-xs`, `icon-sm`, `icon` and `icon-lg`. A button without `size` renders as before.
297
+ - **`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.
298
+
299
+ `@nxgt/material-vue`:
300
+
301
+ - An `icon*` `Button` holding an icon is square again: the base `has-[>svg]:px-3` padding no longer survives the icon sizes.
302
+ - An invalid `NativeSelect` uses the library's `error` colour instead of `destructive`.
303
+ - `PaginationFirst` and `PaginationLast` show double chevrons, so they no longer look like Previous and Next when their text is hidden on a narrow screen.
304
+ - Its README and component pages name the new React counterparts.
305
+
306
+ - [#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
307
+ in progress, the exports and options shared with `@nxgt/material`, and the
308
+ `DateRangeField` presets, `TreeSelectField`, `DataTable` loading and empty
309
+ states and `FilePreview` to follow. The `Combobox` primitive family is recorded
310
+ as not planned, with its reason.
311
+
312
+ - [#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
313
+ (`bg-background`) instead of `bg-white`, so it no longer shows as a white
314
+ disc in dark mode, as in `@nxgt/material`.
315
+
316
+ - [#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"`
317
+ follows the foreground colour. The variant listed `default` twice, so
318
+ `default` rendered white and `light` had no colour, which made a spinner on a
319
+ dark surface (the player's buffering indicator) look static. A filled
320
+ `Button` with `spinnerVariant="1"` gets a white loading spinner again too.
321
+
322
+ - [#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
323
+ assistive tech.
324
+
325
+ - Each step's `id` was a static `step-N`, so two steppers on one page
326
+ produced duplicate ids. It is now prefixed with Vue's `useId`.
327
+ **Note:** if a test or stylesheet of yours targets `#step-N`, select the
328
+ step by `data-pw` instead (`step-N`, or `<name>-step-N`, now on every step
329
+ as in `@nxgt/material`) — see "A `Stepper` step selected by `#step-N` stops
330
+ matching" in `docs/troubleshooting.md`.
331
+ - The steps are an `<ol>` of `<li>`; the current step's button carries
332
+ `aria-current="step"`; a completed or failed step adds visually hidden text
333
+ (`material.stepper.completed`, `material.stepper.error`) so a screen reader
334
+ does not depend on the icon.
335
+ - A long step title no longer widens its column or pushes the next step: the
336
+ columns are `minmax(0, 1fr)` and the title truncates with an ellipsis.
337
+
338
+ ## 0.23.4
339
+
340
+ ### Patch Changes
341
+
342
+ - [#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
343
+ now sits at the right edge of the card instead of the left, as it does with
344
+ an icon and in `variant="sm"`.
345
+ The `md` indicator also gets the `sm` one's look: a bordered circle when
346
+ inactive, and the same transition.
347
+
348
+ ## 0.23.3
349
+
350
+ ### Patch Changes
351
+
352
+ - [#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
353
+ runs for Nitro's trace now come from `@nxgt/material-core`
354
+ (`/format-file-size`, `/pdfkit-fonts`), shared with `@nxgt/material`, instead
355
+ of a copy in this package. No API change: `formatFileSize` is still exported
356
+ by name, and the module adds the same files to `nitro.externals.traceInclude`.
357
+ When some fonts cannot be resolved, `nuxi build` now prints one
358
+ `pdf fonts:` warning naming every failure, instead of one per font.
359
+ - Updated dependencies [[`bf43a14`](https://github.com/softistx/nxgt-material/commit/bf43a14abb147e6dcd2bcac5f1e0e359b0aae6a2), [`b890457`](https://github.com/softistx/nxgt-material/commit/b8904573f18dc6d0cdd16f62146183ff0b7aef18)]:
360
+ - @nxgt/material-core@0.2.0
361
+
362
+ ## 0.23.2
363
+
364
+ ### Patch Changes
365
+
366
+ - [#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:
367
+ `material.buttons.save` read « Sauvegarder » while every component's own `save`
368
+ key already read « Enregistrer ». Consumers who assert on the French label in
369
+ their own tests will now see « Enregistrer ».
370
+
371
+ - [#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
372
+ …", the drop zone's "Max 2.0 MB") and the chat composer's attachment chip now
373
+ format sizes with the exported `formatFileSize`, as `FileList` and `FileCard`
374
+ already did. A negative, `NaN` or infinite size now shows nothing instead of
375
+ `NaN undefined` or `Infinity GB`; every other size reads as before.
376
+
377
+ ## 0.23.1
378
+
379
+ ### Patch Changes
380
+
381
+ - [#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
382
+ `TypeError: Cannot read properties of null (reading 'naturalHeight')` when
383
+ they are closed or unmounted while the photo is still loading. The error came
384
+ from the cropper's stencil preview and was uncaught, so it surfaced in
385
+ whatever ran next.
386
+
387
+ - [#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
388
+ into `.output/server/node_modules`. Before, a production build rendered no
389
+ PDF on the server: every `pdfResponse` route answered HTTP 500 with
390
+ `Cannot find module '…/pdfkit/js/standard-fonts/Helvetica.cjs'`, because
391
+ pdfkit loads those files with a runtime `require` Nitro's tracer never sees.
392
+ `nuxi dev` and servers built with `pdf.bundleStandardFonts` under
393
+ `noExternals` were not affected. `@nxgt/material-core` needs nothing more:
394
+ Nitro traces it like any dependency, or inlines it under `noExternals`.
395
+
396
+ - [#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.
397
+ - Updated dependencies [[`1abb908`](https://github.com/softistx/nxgt-material/commit/1abb90800ec213d8ec98abd7df5dda9f65c14204), [`b4e5770`](https://github.com/softistx/nxgt-material/commit/b4e5770922ad4582a1ad2dcca439f7c8c999a0c7)]:
398
+ - @nxgt/material-core@0.1.1
399
+
400
+ ## 0.23.0
401
+
402
+ ### Minor Changes
403
+
404
+ - [#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`,
405
+ which your install adds on its own: there is nothing to change in your
406
+ `package.json`, your imports or your Nuxt config.
407
+
408
+ `@nxgt/material-core` holds the code `@nxgt/material-vue` and
409
+ `@nxgt/material` used to ship as two identical copies: the PDF document model
410
+ and its renderer, the print formatters (`formatAmount`, `formatDate`,
411
+ `createFormatters`), the column and value helpers of `/pdf`, the PDF file
412
+ helpers behind `PdfReader` and `usePdf`, the page geometry, scroll spy and
413
+ text search inside `PdfReader`, the decimals of `CurrencyField`, the rule that
414
+ keeps a field from blurring while focus is in its own popover, and
415
+ `pdfkitStandardFonts()`.
416
+ `@nxgt/material-vue/pdf`, `/lib`, `/vite`, `/components` and the other
417
+ entries export exactly the same names as before, with the same types, and now
418
+ import that code from `@nxgt/material-core` instead of bundling it. `react`
419
+ and `@react-pdf/renderer` stay optional peers, loaded only when a PDF is
420
+ rendered.
421
+
422
+ One case to check: a server bundled into a single file and run **without**
423
+ `node_modules` must bundle `@nxgt/material-core` too, like any other
424
+ dependency of `@nxgt/material-vue` — a bundler that inlines everything
425
+ already does. A server that keeps `node_modules` loads it from there. With Vite, list both:
426
+ `ssr: { noExternal: ['@nxgt/material-vue', '@nxgt/material-core'] }`. Without it
427
+ the server fails at boot with `Cannot find package '@nxgt/material-core'`
428
+ ([troubleshooting](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/troubleshooting.md#cannot-find-package-nxgtmaterial-core)).
429
+
430
+ ### Patch Changes
431
+
432
+ - [#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.
433
+ - Updated dependencies [[`deaf0c4`](https://github.com/softistx/nxgt-material/commit/deaf0c49cbc2268fd20e9e2272104dbd27e4ce7f)]:
434
+ - @nxgt/material-core@0.1.0
435
+
436
+ ## 0.22.0
437
+
438
+ ### Minor Changes
439
+
440
+ - [#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
441
+
442
+ - `AttributesField` read `attributes` once, on mount, so a form `resetForm()`
443
+ or `setFieldValue()` on an `AttributesFormField` did not change the list on
444
+ screen. It now follows the prop when its value changes, without echoing the
445
+ change back through `onChange`. A new array with the same content (a list
446
+ rebuilt on each render) is not a change and does not undo the user's edits.
447
+ Edits no longer mutate the array you passed in place.
448
+ - `AttributesField` gains `error` and `helperText`. `AttributesFormField`
449
+ passes its error through them and gains a `helperText` prop, shown when
450
+ there is no error.
451
+
452
+ - [#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
453
+ amount is shown with the currency's own decimals by default (ISO 4217: `JPY`
454
+ 0, `EUR` 2, `KWD` 3), the rule `formatAmount` already follows; it always
455
+ showed two before. Pass `:fraction-digits="2"` to keep two decimals whatever
456
+ the currency; it is clamped to 0–20 (the range every `Intl.NumberFormat`
457
+ accepts), and `NaN` or `Infinity` counts as not given. The emitted number is
458
+ unchanged.
459
+
460
+ The helpers guide now says which formatter to use: `useFormatters()`'s
461
+ `formatAmount` for money, `useNumberFormatter()` for the other
462
+ `Intl.NumberFormat` styles.
463
+
464
+ - [#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.
465
+
466
+ - [#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
467
+
468
+ - Components rendered without an `I18nProvider` no longer show raw ICU
469
+ placeholders: the JsonViewer reads `3 items` (not `{count} items`), the
470
+ Kanban WIP badge `3/5`, and so on.
471
+ `useMaterialTranslation().t(key, fallback, values)` now formats the fallback
472
+ with `values`, with or without a provider, and on a server. A fallback that
473
+ cannot be formatted (a stray `{`) is shown as written, with a
474
+ `[@nxgt/material-vue] Could not format the fallback` warning in development
475
+ only. Plain fallbacks are not parsed at all, and parsed messages are cached.
476
+ - `zodLocaleError()`'s `invalid_type` messages were French in the English
477
+ bundle. They are English now (`This value must be a number.`), and a type
478
+ with no message of its own gets `This value has the wrong type.` instead of
479
+ its raw key.
480
+ - `zodLocaleError()` no longer throws on a server or when storage is blocked:
481
+ it writes English. It takes optional `{ storageKey, language, translate }`
482
+ (`ZodLocaleErrorOptions`) so it can read the `storageKey` you gave
483
+ `I18nProvider`, follow a language you pass, and format through your own
484
+ merged translator so your `material.zod.*` overrides apply. Calling it with
485
+ no argument behaves as before.
486
+
487
+ - [#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`
488
+
489
+ 82 keys join the `material` bundles, in English and French, with the same
490
+ names and the same French as `@nxgt/material`:
491
+
492
+ - `material.rich-text-editor.*` (47): the slash menu's group, item titles and
493
+ descriptions (`slash-menu.*`), the font menu (`font-default`, `font-sans`,
494
+ `font-serif`, `font-mono`) and the table-caption alignment choices
495
+ (`table-align-left` / `-center` / `-right`).
496
+ - `material.filter.*` (19): `min`, `max`, and the presets menu and dialog
497
+ (`presets.*`).
498
+ - `material.calendar.*` (9): the previous/next month buttons' labels, on
499
+ `Calendar` and `DateRangeField`, use two;
500
+ the others (year paging, `Go to Today`, the caption button) are React's,
501
+ kept so both bundles stay identical.
502
+ - `material.table.labels.select-all` / `select-row`,
503
+ `material.upload.retry` / `remove`, `material.spinner.loading`,
504
+ `material['scroll-to-top'].label`, `material.map.you-are-here`.
505
+
506
+ The slash menu filters on the translated title and description and on the
507
+ English ones, accent-insensitively; `RichTextEditor` hands the menu its own
508
+ translator, so there is nothing to wire.
509
+
510
+ Without a provider the English is unchanged. An explicit `aria-label` on
511
+ `Spinner`, `ScrollToTop`, `CalendarPrevButton` or `CalendarNextButton` still
512
+ wins.
513
+ `LocationMarker` now shows `You are here` as its tooltip by default, as the
514
+ React marker does; fill its `#tooltip` slot to replace it.
515
+
516
+ - [#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
517
+ same document model and renderer as `@nxgt/material/print` (byte for byte, so
518
+ a document template written for one library renders identically in the
519
+ other).
520
+
521
+ - Builders (`pdfDocument`, `page`, `header`, `text`, `table`, `dataTable`,
522
+ `keyValueOf`, `metric`, …) produce a plain `PdfDocument`, serialisable and
523
+ usable on the server.
524
+ - `renderPdfBlob`, `renderPdfBuffer`, `renderPdfStream`, `pdfResponse` (a
525
+ `Response` with the right headers, for a Nitro/H3 route), `downloadPdf`,
526
+ `openPdf`, and `contentDisposition` for a response of your own.
527
+ - `usePdf(source, { fileName, immediate })` returns `{ blob, url, loading,
528
+ error, refresh, download }` and does nothing on the server; `download()`
529
+ saves the document `source` holds when it is called, waiting for its render.
530
+ `PdfDownloadButton` renders one document on click, emits `error`, and
531
+ rethrows a failure when nothing listens to `@error` (it reaches
532
+ `app.config.errorHandler`, else the console).
533
+ - A `definePdfDocument` template annotates its data parameter, and its other
534
+ parameters may take defaults (`(invoice: Invoice, language = 'en') => …`).
535
+ - The print table and value helpers are exported here too:
536
+ `definePrintColumns`, `resolvePrintTable`, `resolvePrintFields`,
537
+ `toPrintValue`, `formatPrintValue`, `isEmptyPrintValue` and the
538
+ `PrintColumn` / `PrintValue` types. A `'sum'` total over amounts in more
539
+ than one currency is left empty, and a `Date` cell prints as a date.
540
+ - The theme (`defaultPdfTheme`, `resolvePdfTheme`, `resolvePdfColor`) and
541
+ `PdfPeerMissingError`.
542
+ - Built-in strings (page numbers, totals, the empty table) follow the
543
+ library's i18n, in English and French.
544
+
545
+ `react` (`^18.2.0 || ^19.0.0`) and `@react-pdf/renderer` (`^4.9.0`) are
546
+ **optional peers**, loaded on the first render: nothing changes for an app
547
+ that does not import `/pdf`. An app that does installs them with
548
+ `bun add react @react-pdf/renderer@^4.9`; without them, rendering throws
549
+ `PdfPeerMissingError` with that command.
550
+
551
+ Also new: `@nxgt/material-vue/vite` exports `pdfkitStandardFonts()`, and the
552
+ Nuxt module takes `pdf: { bundleStandardFonts: true }` to add it to Nitro, for
553
+ a server whose runtime image has no `node_modules` (pdfkit loads its fonts
554
+ from a specifier no bundler resolves).
555
+
556
+ - [#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),
557
+ an `ArrayBuffer` or a `Uint8Array`, a `URL`, or
558
+ `{ url, httpHeaders, withCredentials }` for a URL that needs a token, as well
559
+ as a URL string. The new `PdfSource` and `PdfUrlSource` types are exported.
560
+
561
+ - Bytes are copied: pdf.js empties the buffer it is given, and yours stays
562
+ usable after the reader opened it.
563
+ - The document reloads only when it changes: a URL with the same headers, even
564
+ in a new object on each render, keeps the view; a Blob or a buffer is
565
+ compared by identity.
566
+ - Download and print fetch a URL source with its headers, and save a Blob or
567
+ bytes as they are. When that fetch fails, a URL with headers is not opened
568
+ in a new tab, which would load it without them. With no `fileName`, a
569
+ `File`'s name or a URL segment, it is named "document.pdf", translated
570
+ (`material.pdf-reader.default-file-name`).
571
+ - The headers are part of what identifies the document: new headers (a
572
+ renewed token) load it again, from `initialPage`.
573
+
574
+ - [#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
575
+ attached before its click and the object URL is revoked a minute later, not
576
+ right away. A new `fileName` prop names the saved file, and a URL document is
577
+ named after its last path segment instead of always `document.pdf` (`.pdf` is
578
+ added when missing). A URL document is saved from the bytes already loaded,
579
+ so a cross-origin one downloads instead of navigating. Print uses a
580
+ same-origin copy too, and opens a new tab instead of throwing `SecurityError`
581
+ when the browser refuses.
582
+
583
+ - [#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' |
584
+ '_top'`, default `'_blank'`): a link to a website inside the PDF opens in a new
585
+ tab by default, whatever the PDF asks; `'_self'` opens it in place.
586
+ `rel` stays `noopener noreferrer nofollow`.
587
+
588
+ `toPdfjsSource` and `toPdfjsParams` are exported beside `usePdfReader` (with
589
+ the `PdfjsSourceParams` / `PdfjsUrlParams` types), so a layout of your own
590
+ loads bytes with pdf.js without detaching your buffer.
591
+
592
+ `TooltipContent` takes `to`, where the tooltip is teleported.
593
+
594
+ - [#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:
595
+ a link to another page goes to it, and a link to a website opens in a new tab
596
+ by default, with `rel="noopener noreferrer nofollow"` (`externalLinkTarget`
597
+ picks another target).
598
+
599
+ Its zoom menu is a `DropdownMenu`: it opens from the keyboard (Enter or Space,
600
+ the arrows move, Escape closes and gives focus back), its button is named after
601
+ the current zoom ("Zoom level 150%", `material.pdf-reader.zoom-menu`), and in
602
+ fullscreen it opens inside the reader. Keys pressed in the menu no longer turn
603
+ pages. An outline entry without a title reads "Untitled" in the reader's
604
+ language (`material.pdf-reader.untitled`).
605
+
606
+ `DropdownMenuContent` takes `to`, the element the menu is teleported into
607
+ (`body` by default): pass the fullscreen element, read when the menu opens,
608
+ for a menu opened in fullscreen.
609
+
610
+ - [#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
611
+ `@nxgt/material-vue/lib` (as in `@nxgt/material`), and `useFormatters()` /
612
+ `createFormatters()` bind them.
613
+
614
+ - `formatAmount(value, currency?, { locale?, fractionDigits? })` and
615
+ `formatDate(value, { locale?, timeZone?, dateStyle?, timeStyle? })`. Without a
616
+ `locale` they still use the runtime's (a deterministic default is planned for
617
+ 1.0). `formatDate` also accepts a `Date` or an epoch number.
618
+ - They are exported from `/lib`, as in `@nxgt/material`; `/components` and
619
+ the root barrel still export them.
620
+ - `useFormatters({ locale?, timeZone? })` from `@nxgt/material-vue/composables`
621
+ (auto-imported by the Nuxt module) binds both to the `I18nProvider` language
622
+ (`en` without a provider), so a server render and the browser print the same
623
+ string (for a date with a time, pass `timeZone`). `locale` and `timeZone` may be refs or getters; the language and the
624
+ options are read on each call, so a template follows them.
625
+ - `createFormatters({ locale?, timeZone? })` from `/lib` binds them outside a
626
+ component: a Nuxt server route.
627
+
628
+ **Changed output.** Amounts use their currency's own decimals (ISO 4217):
629
+ `formatAmount(1234.5, 'JPY')` is now `¥1,235` (was `¥1,234.50`), KWD, BHD and
630
+ OMR show three decimals. EUR, USD, GBP and the other two-decimal currencies do
631
+ not change, nor does an amount without a currency. To keep two decimals, pass
632
+ `{ fractionDigits: 2 }`. `fractionDigits` is clamped to 0–20, as in
633
+ `CurrencyField`, and `NaN` or `Infinity` counts as not given.
634
+
635
+ **Fixed.** A date-only string (`'2026-03-01'`) keeps its calendar day in every
636
+ time zone; west of UTC it used to show the day before.
637
+
638
+ - [#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
639
+
640
+ - **`PrintHeader`**: a `logo` image (URL or data URL, or
641
+ `{ src, width, height }` in points) with its `logoAlt` (empty, so
642
+ decorative, by default), a `subtitle` and a `referencePrefix` (`'#'` by
643
+ default). **Changed:** with no `logo` and no `logoText` it no
644
+ longer draws a grey "LOGO" placeholder, and with no `qrDataUrl` no empty
645
+ QR box; the title stays centred. Pass `logo-text="LOGO"` to keep the old
646
+ box. Same props and behaviour as `@nxgt/material`'s `PrintHeader`.
647
+ - **`translateMaterial(language, key, fallback, values)`**
648
+ (`@nxgt/material-vue/i18n`): the package's own strings for a language given
649
+ as a value, with no plugin and no composable — for a PDF's page-number
650
+ callback or a server. `useMaterialTranslation().t` now goes through it.
651
+ - New i18n keys `material.print.page-of` ("Page {page} of {pages}" / "Page
652
+ {page} sur {pages}") and `material.print.page`, in English and French, for
653
+ the new `@nxgt/material-vue/pdf`.
654
+ - `@nxgt/material-vue/pdf` exports `PrintValue` and `formatPrintValue`, with
655
+ the same behaviour as in `@nxgt/material`.
656
+
657
+ - [#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
658
+
659
+ - New keys `material.print.table.total` ("Total") and
660
+ `material.print.table.empty` ("No rows" / "Aucune ligne"), in English and
661
+ French, for the tables of the new `@nxgt/material-vue/pdf`.
662
+ - `@nxgt/material-vue/pdf` exports `definePrintColumns`, `resolvePrintTable`,
663
+ `resolvePrintFields` and `toPrintValue`, which resolve columns and rows the
664
+ way `@nxgt/material`'s `PrintDataTable`, `PrintKeyValue` and `PrintMetric`
665
+ do.
666
+
667
+ - [#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
668
+ `error` items, editor mention items, ThemeToggle
669
+
670
+ - `CodeBlock scheme="dark"` showed a dark header over a light code area: the
671
+ global `pre` / `code` rules (`bg-muted`, padding, radius) painted over its
672
+ body. CodeBlock now resets them on its own `<pre>` and `<code>`; a plain
673
+ `<pre>` elsewhere keeps its styling.
674
+ - `ButtonGroup`: an active tonal button painted `bg-primary` under its
675
+ `text-primary` label, so the label disappeared. The active button now uses
676
+ the primary foreground for its text and icons.
677
+ - `AvatarGroup`: the initials inherited the page's font size and ran under
678
+ the next avatar. Each size now sets the initials' size, and the overlap is
679
+ smaller so they fit (`-space-x-0.5` / `-1` / `-1.5`).
680
+ - `MenubarItem`, `ContextMenuItem` and `DropdownMenuItem` accept
681
+ `variant="error"`, as in `@nxgt/material`. `'destructive'` is deprecated and
682
+ kept as an alias; both render `data-variant="error"`, so a selector on
683
+ `[data-variant=destructive]` stops matching. `MenubarItem` and
684
+ `ContextMenuItem` used `text-destructive-foreground`, a colour the theme does
685
+ not define, so their destructive items were not red at all; they are now.
686
+ - `RichTextEditor` `options.mentions.suggestions` accepts
687
+ `(string | MentionItem)[]`. Strings become `{ id, label }`; choosing an item
688
+ inserts its `id` and shows its `label`. `filterMentions` takes
689
+ `{ match: 'prefix' | 'substring' }` (default `'substring'`, unchanged;
690
+ `FilterMentionsOptions`), and the editor uses `'prefix'`, as before.
691
+ - `ThemeToggle` no longer freezes on the choice it mounted with: it
692
+ destructured `useTheme()`'s getters, so its selected item never followed a
693
+ click.
694
+
695
+ ### Patch Changes
696
+
697
+ - [#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
698
+ label, and once a file hides the drop zone (or it is disabled: `maxFiles`
699
+ reached, or `disabled`) the group carries the error (the `helper-text`, or a
700
+ hidden "This value is not valid."), which nothing said before. `ImageField`: a
701
+ failed upload with no message of its own is described as not valid, not only
702
+ outlined in red.
703
+
704
+ `AppBreadcrumb`: the home crumb is a link named "Home" rather than a
705
+ `<button>` inside a link.
706
+
707
+ `QRCode`: `aria-label` is a declared prop that names the `<svg role="img">`
708
+ (and wins over `title`), instead of falling through to the wrapper `div`.
709
+
710
+ - [#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
711
+ `event.preventDefault()`: focus stays where it was, as it does on
712
+ `DialogContent`, `SheetContent` and `DrawerContent`. reka focused the
713
+ `AlertDialogCancel` a tick later regardless, and its focus trap kept focus
714
+ there. Opening without the opt-out still focuses the Cancel (or the first
715
+ control when there is none).
716
+
717
+ - [#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
718
+ overlay — a `SelectFormField` list opened by pressing the mouse on its
719
+ trigger, which takes focus without the trigger ever having it — marks the
720
+ field touched (and validates it) as it is left. It used to count that overlay
721
+ as the field's own and wait until the list handed focus back to its trigger.
722
+ A field's own list also stays its overlay when it opened before focus reached
723
+ the field, as long as a control of the field names it (`aria-controls`), like
724
+ `@nxgt/material`.
725
+
726
+ - [#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
727
+ the current params filled in (`/users/42`), not to the record's pattern
728
+ (`/users/:id`, which vue-router rendered as a literal `:id`). Home and every
729
+ crumb keep going through the router's history base.
730
+
731
+ `CheckboxGroup` / `RadioGroupField`: the group element carries its `id` (yours,
732
+ or the generated one its option ids start with), as React's groups do; it
733
+ had none.
734
+
735
+ - [#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
736
+ "Reporting a bug" section of the troubleshooting page, linked from the README.
737
+
738
+ - [#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
739
+ the `label` it was not showing. The ✕ is now named after the text the chip
740
+ shows: the default slot's when one is given (`Remove Lyon`), else `label`; with
741
+ no text it keeps "Remove". The same rule as `@nxgt/material`'s `Chip`.
742
+
743
+ - [#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
744
+ and "My position" buttons, follow `I18nProvider` (`material.buttons.close`,
745
+ `material.map.zoom-in`, `material.map.zoom-out`, `material.map.my-position`,
746
+ the same keys as `@nxgt/material`): they were English in every language.
747
+
748
+ - [#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
749
+ the components need, which reached only the compiled stylesheet before:
750
+ KaTeX (`Markdown` maths), highlight.js (`RichTextEditor` code blocks),
751
+ vue-sonner (`Toaster`), vue-advanced-cropper (`ImageCropper`), the `Spinner`
752
+ animation, the `ImageCropper` handles, and the stylesheets of `ButtonGroup`,
753
+ `ContactItem`, `OpeningHoursItem`, `AttributeForm` and `AttributeValuesForm`,
754
+ which were CSS modules and are global `nxgt-*` classes now.
755
+ The compiled stylesheet gains vue-advanced-cropper's stylesheet, which it
756
+ was missing.
757
+
758
+ - [#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
759
+
760
+ - The README catalogue has a **Preview** column, and each name links to its
761
+ entry in `docs/components/`. Its rows and categories are the same as
762
+ `@nxgt/material`'s.
763
+ - `docs/` now ships in the package:
764
+ - one page per category: preview, example, options;
765
+ - the component gallery;
766
+ - getting started;
767
+ - guides for forms (vee-validate and Zod), i18n, the app shell, theming,
768
+ printing, maps, SSR and Nuxt, and the helpers;
769
+ - troubleshooting;
770
+ - the roadmap.
771
+ - File names, headings and preview names match `@nxgt/material`'s docs, so a
772
+ link keeps working when you switch framework.
773
+ - The README's long sections moved to those guides.
774
+
775
+ - [#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
776
+ (`id`, `aria-describedby`, `data-*`, listeners) to the trigger: their root is a
777
+ popover (or a dialog), which renders no element, so they were dropped. An `id`
778
+ becomes the popover trigger's id, which also labels the open calendar
779
+ (`PopoverTrigger` now honours an `id`). `TimeField` renders the desktop trigger
780
+ on the server (`useMediaQuery` with `ssrWidth`), as a desktop client's first
781
+ render does, so SSR pages hydrate without a mismatch; a phone switches to the
782
+ dialog once mounted.
783
+
784
+ `UploadField`: its file input is visually hidden instead of `hidden`, so a
785
+ `required` field with no file stops the submit with the browser's message
786
+ instead of a console-only "An invalid form control … is not focusable".
787
+ Without a trailing button, that input is now the field's tab stop.
788
+ `UploadField`, `ImageField`, `FileListField` and the `NetworkUploadField` /
789
+ `S3UploadField` drop zone no longer put `aria-invalid` on a `group` or a
790
+ `button`: the error text describes them, and the outline comes from
791
+ `data-invalid` (give an `error` its `helper-text`).
792
+
793
+ - [#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
794
+ `data-slot` passed to `ScrollProgress`, `Pager`, `Toc` or `SeeAlso`, now reach
795
+ the element. They were declared as props under their kebab-case names, which
796
+ Vue stores camelized, so the component always fell back to its default (for
797
+ `Icon`, `Icon <name>`). `DocProgress` had the same bug.
798
+
799
+ Inside `Doc`, `DocToc`, `DocPager`, `DocSeeAlso` and `DocProgress` now render
800
+ their own `data-slot` (`doc-toc`, `doc-pager`, `doc-see-also`,
801
+ `doc-progress`) instead of the inner component's (`toc`, `pager`, `see-also`,
802
+ `scroll-progress`).
803
+
804
+ - [#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
805
+ buttons: the `FileListField` row badge, the `NetworkUploadField` file preview,
806
+ the `EntityHeader`, `ConfirmationDialog` and `AppSidebar` icons, the `Stepper`
807
+ info icon and the `AccordionCard` chevron (a button nested in the trigger
808
+ button; it now turns when open). Each was a nameless `<button>` (focusable, except the disabled upload preview); each is now a `<span>`
809
+ (`as="span"`) with `aria-hidden="true"` and the same look. The row badges of
810
+ `Contacts`, `OpeningHours`, `PostalAddress` and `AttributesList`, already
811
+ `<div>`s, are hidden too; a `Contacts` badge is `role="img"`, named by the
812
+ contact type.
813
+
814
+ An `Icon` inside a named `IconButton` (and so `InputGroupButton` and
815
+ `IconLinkButton`) is `aria-hidden` instead of `role="img"` named
816
+ "Icon {name}", so a screen reader reads "Delete", not "Delete, Icon trash". An
817
+ `aria-label` you give the `Icon` still wins; an `Icon` anywhere else keeps its
818
+ "Icon {name}" default. See troubleshooting for the selectors this changes.
819
+
820
+ - [#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
821
+ `never`. With `never`, the template compiled and the error appeared only
822
+ where the template was called (`Argument of type 'Invoice' is not assignable
823
+ to parameter of type 'never'`); now reading a property of it fails in the
824
+ template itself. Annotated parameters and defaults (`language = 'en'`) are
825
+ typed as before.
826
+
827
+ - [#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`.
828
+
829
+ - [#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
830
+
831
+ - `CustomDialog` (and `ConfirmationDialog`, through it) no longer wraps its
832
+ `#trigger` slot in a second `<button>`: the trigger is merged into the
833
+ slotted element (`as-child`), so a `Button` there is the dialog trigger
834
+ itself instead of a button nested in a button.
835
+ - `ConfirmDialog` awaits `@confirm` (now typed `onConfirm: () => void |
836
+ Promise<void>`). It stays open while the handler runs (both buttons
837
+ disabled, "Processing..."), closes on success, and on a throw or rejection
838
+ stays open and shows the error's message instead of closing. Before, it
839
+ closed on click whatever the handler did. The pending label and the message
840
+ for an error without one are translated
841
+ (`material.confirm-dialog.processing`, `material.confirm-dialog.failed`, en
842
+ and fr). A plain `@confirm="open = false"` keeps working.
843
+
844
+ - [#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
845
+ the drawer opened: the button of yours that opened a controlled `Drawer` (no
846
+ `DrawerTrigger`) gets it back, where focus used to fall to `<body>`. Focus
847
+ that already went elsewhere stays there, and an `@close-auto-focus` that calls
848
+ `event.preventDefault()` opts out. `Dialog`, `Sheet` and `AlertDialog`
849
+ already did this.
850
+
851
+ - [#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
852
+ data. None was reachable from an entry point, so no import changes.
853
+
854
+ - [#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
855
+ are no longer inside the trigger button (a `<label>` in a `<button>` is
856
+ invalid, and the helper text was read as part of the value). They sit beside
857
+ it in the field's root `div`, which takes `class`; the trigger is named by the
858
+ label (`aria-labelledby`) and described by the helper text, then your
859
+ `aria-describedby` ids. The label is `for` the trigger (yours, else a
860
+ generated id), so a click on it opens the picker, and the open popover (or
861
+ `TimeField`'s dialog on a phone) is labelled by the trigger. The label and
862
+ the helper text are still not dimmed with a disabled trigger.
863
+
864
+ `Slider`: an `aria-label` or `aria-labelledby` names every thumb (a vertical
865
+ slider had nameless thumbs), and `aria-invalid` (`SliderField`'s `error`) goes
866
+ on the thumbs rather than on the root `span`.
867
+
868
+ `DurationField`: a `group` named by its label and described by its helper
869
+ text; the inputs are named "Hours" and "Minutes"
870
+ (`material.duration-field.hours-label` / `minutes-label`, en and fr, the same
871
+ keys and strings as `@nxgt/material` 2.2.0). The minutes input had no name. `NumberField` takes an
872
+ `aria-label`.
873
+
874
+ `CodeEditor`: Monaco's textarea is named by the field's label (`ariaLabel`),
875
+ and follows it when it changes.
876
+
877
+ - [#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
878
+ "Filters2": the count badge is hidden from assistive technology and the count
879
+ is announced through `material.filter.active-count` (en, fr), as in
880
+ `@nxgt/material`.
881
+
882
+ - [#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`.
883
+
884
+ - [#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
885
+ sets `aria-expanded`: it said whether the label was showing, so screen readers
886
+ announced a button that controls nothing as "collapsed". Used as a popover,
887
+ drawer or menu trigger (the `Filter` trigger), it still carries the trigger's
888
+ own `aria-expanded`, as in `@nxgt/material`.
889
+
890
+ `Switch`: the row's text is now the switch's `<label>`, with a generated `id`
891
+ when none is given, so a switch with a `label` has an accessible name and
892
+ clicking the text toggles it. An uncontrolled switch's row (`default-value`)
893
+ is tinted while it is on and follows each toggle; before, only `v-model`
894
+ tinted it.
895
+
896
+ - [#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.
897
+
898
+ - [#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.
899
+
900
+ - [#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).
901
+
902
+ - [#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.
903
+
904
+ - [#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).
905
+
906
+ - [#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
907
+ their `label`: the `radiogroup` (and `CheckboxGroup`'s wrapper, now a
908
+ `role="group"`) carries `aria-labelledby` to the label and `aria-describedby`
909
+ to the helper or error text, so a screen reader announces the question, not
910
+ only the first option. The `radiogroup` carries `aria-invalid` while `error`;
911
+ a `CheckboxGroup` error without text is described by a visually hidden "This
912
+ value is not valid.", and so is a `CheckboxGroupFormField` in error with no
913
+ message that shows the caller's `helper-text` (through `CheckboxGroup`'s new
914
+ `#helper-text` slot, so the hint stays inside the description). A caller's
915
+ `aria-label` / `aria-labelledby` wins and its `aria-describedby` ids are kept;
916
+ on `RadioGroupField` attributes other than `class` and `style` now land on the
917
+ `radiogroup` rather than the layout wrapper, and `CheckboxGroup` drops an
918
+ `aria-invalid` passed to it.
919
+
920
+ Option ids are now `` `${id}-${index}` `` instead of `` `${id}-${value}` ``, as
921
+ in `@nxgt/material`: a value with a space gave an invalid id and a label that
922
+ pointed nowhere. A selector such as `#<id>-<value>` must move to the index, or
923
+ better to role and name — see the troubleshooting entry.
924
+
925
+ - [#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`
926
+
927
+ 30 keys join the `material` bundles, in English and French, with the same
928
+ names and French as `@nxgt/material`, and a few existing keys are now used
929
+ where the text was hard-coded:
930
+
931
+ - Pagination: the buttons' names and text, which reka-ui left in English
932
+ ("First Page", "Page 2"…), the ellipsis's "More pages" and the `nav`'s
933
+ name (`pagination.first`, `previous`, `next`, `last`, `page`, `more`,
934
+ `label`). The buttons are now named by their text in English too:
935
+ "First", "Previous", "Next", "Last", as in `@nxgt/material`.
936
+ - `CommandDialog`'s default title and description (`command.*`), the
937
+ carousel's `aria-roledescription` (`carousel.roledescription` / `slide`) and
938
+ the attribute options' "Add option" (`attributes.buttons.add-option`).
939
+ - The filter's empty state, `+N more` chip and the Yes/No, From, Until and Up
940
+ to of its chips (`filter.empty`, `filter.more`, `filter.value.*`);
941
+ `Breadcrumb`'s name and ellipsis, `DocHeader`'s breadcrumb
942
+ (`breadcrumb.*`, `doc.breadcrumb`); `MessageCard`'s "Unread"
943
+ (`cards.unread`); the network upload field's "Replace {name}", "Upload
944
+ failed" and its type, size and count errors (`upload.*`); the editor's
945
+ placeholder and emoji buttons; `CircularProgress`'s label, `StxPlayer`'s
946
+ "Media player", `PaneLayoutPane`'s sheet title, `JsonViewer`'s "Empty JSON"
947
+ and `TimePicker`'s AM/PM.
948
+
949
+ The editor's default placeholder now follows a language change without
950
+ rebuilding the editor, as does a new `placeholder`. `formatFilterValue` takes
951
+ the chip words as an optional third argument, typed `FilterValueWords`, with
952
+ the English in the newly exported `FILTER_VALUE_WORDS`; `getValidationMessage`
953
+ / `getUploadErrorMessage` take `t` (typed `UploadMessageTranslate`) as an
954
+ optional last argument. Without them the English is unchanged, except that the
955
+ count error reads "Maximum of 1 file reached" for a single file.
956
+ `parseJsonSource` marks a blank source with `empty: true`. Your
957
+ `placeholder`, `sheetTitle`, `title`, `description` and `aria-label` still win.
958
+
959
+ - [#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
960
+ their icon's name ("Icon chevron-down", "Icon trash"), now have a name,
961
+ translated under `I18nProvider`: the `Sidebar` toggle ("Toggle sidebar",
962
+ `material.sidebar.toggle`, with `aria-expanded`), the data table's `expand`
963
+ column ("Toggle row details", `material.table.labels.toggle-row`, with
964
+ `aria-expanded`), and the delete button of the deprecated `ContactItem` /
965
+ `OpeningHoursItem` (the existing `material.contacts.buttons.remove` /
966
+ `material.opening-hours.buttons.remove`).
967
+
968
+ A `Chip`'s remove button, and so each `Autocomplete` chip's, is named after the
969
+ text the chip shows: "Remove {label}" (`material.chip.dismiss-label`)
970
+ instead of "Remove" for every chip. The `LocationPreview` default trigger is
971
+ "Preview {name}" / "Preview location" (`material.map.preview-named` /
972
+ `preview`), translated, instead of the bare place name or an English string.
973
+ A disabled `Autocomplete` now disables its chips' remove buttons, and the
974
+ `Sidebar` toggle also shows while focus is inside the sidebar, so the keyboard
975
+ can reach it (it used to appear on hover only).
976
+
977
+ - [#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
978
+ in `@nxgt/material`: a required field was named "Email*" or read "Email star".
979
+ The field's own `required` / `aria-required` says it, which every field of the
980
+ library now sets. A test that found a field by a name ending in `*` finds it by
981
+ the label alone: see the troubleshooting page.
982
+
983
+ - [#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
984
+ describes the switch through `aria-describedby`, beside the row text and any
985
+ `aria-describedby` you pass, as in `@nxgt/material`.
986
+
987
+ `SwitchField` used without `v-model` now toggles: it used to hold the switch
988
+ off.
989
+
990
+ `Label` no longer renders `withasterisk="false"` / `"true"` as an HTML
991
+ attribute on the `<label>`.
992
+
993
+ - [#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
994
+ close X. The extra `DialogClose` had no content, since Vue's `DialogClose` only
995
+ renders its slot.
996
+
997
+ - [#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`
998
+
999
+ - `LocationField` (`@nxgt/material-vue/map`) with a `null` value showed
1000
+ `5.44087 - 10.06843` (Yaoundé) and a hover preview there. It now shows an
1001
+ empty input with a translated placeholder and no preview. The dialog's pin
1002
+ still starts at that position, and OK on an empty field commits the position
1003
+ the pin shows: the last one dragged to, or the start. Without `v-model`, OK
1004
+ no longer drops the drag.
1005
+ - Its placeholder, dialog title and OK button are translated, with new
1006
+ `material.location-field.{placeholder,dialog-title,confirm}` keys (en and
1007
+ fr). `dialogTitle`, `closeLabel` and `placeholder` still win.
1008
+ - `IconButton` dropped its `aria-label`. Icon buttons given an `aria-label` (and no `tooltip`) had no
1009
+ accessible name; they now have it.
1010
+
1011
+ - [#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"`.
1012
+
1013
+ - [#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
1014
+ map had loaded no longer throws `Map container not found.` as an unhandled
1015
+ rejection. `@vue-leaflet/vue-leaflet` builds the map, its layers and controls in
1016
+ async `onMounted` hooks; once the map is unmounting, errors from them are
1017
+ ignored.
1018
+
1019
+ `DateRangeField`: the trigger button carries `data-slot="date-range-field-trigger"`
1020
+ (instead of `popover-trigger`) and the default `data-pw` (`name`, or
1021
+ `date-range-field`), as `DateField`'s does; `data-pw` was on the box inside it.
1022
+
1023
+ The package no longer ships `docs/previews/form-fields-switchfield.webp`, a
1024
+ preview no page linked to (`SwitchField` is pictured by the Switch preview).
1025
+
1026
+ - [#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
1027
+ (`ResponsiveButton`, `AppHeader`, `AppBreadcrumb`, `DataTable`, `Stepper`,
1028
+ `ThemeToggle`, `CodeBlock`, `CodeDiff`, `JsonViewer`, `CodeEditor`) now give
1029
+ the server an answer for their media query, as `TimeField` already did: the
1030
+ server and the first client render answer for `provideSSRWidth()`'s width, or
1031
+ a 1024 px desktop, and a light color scheme, then the client switches. A phone
1032
+ or a dark-mode browser no longer hits `Hydration completed but contains
1033
+ mismatches.` on those components.
1034
+
1035
+ - [#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`:
1036
+
1037
+ - A page's own `/Rotate` is honoured: a page the PDF shows landscape is drawn,
1038
+ thumbnailed, placed and fitted landscape (it was drawn at rotation 0).
1039
+ `PdfPageSize` gains an optional `rotate`.
1040
+ - Fit width and fit page use the first 25 pages, read together when the
1041
+ document opens, so the zoom no longer moves as later page sizes arrive
1042
+ (still read 25 pages at a time); the fit stops at 500%.
1043
+ - `@page-change` also reports the page the reader moves to itself: an
1044
+ `initialPage` clamped to the last page, and `initialPage` again after a new
1045
+ `file`.
1046
+ - The password field is named "Password" (new key
1047
+ `material.pdf-reader.password-label`), not after the "Password protected"
1048
+ heading.
1049
+ - The first search renders the pages once per 25 pages read, not once per
1050
+ page.
1051
+ - Notes show their icon and open their popup, and shapes are styled, with
1052
+ nothing to add to your imports.
1053
+
1054
+ `TooltipContent` (and so every `tooltip` on a `Button` or `IconButton`) opens
1055
+ inside the element in fullscreen while there is one: `PdfReader`'s toolbar
1056
+ tooltips show in fullscreen.
1057
+
1058
+ - [#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
1059
+ event. They ran twice, because the reader called the handler as a declared
1060
+ prop and emitted the event too. The `onPageChange`, `onLoadSuccess` and
1061
+ `onLoadError` props are deprecated in favour of the events and go in 1.0;
1062
+ passing them (`:on-page-change="fn"`) still works and runs once.
1063
+
1064
+ - [#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
1065
+ assuming US Letter, fitting the widest and tallest page with one zoom, so A4
1066
+ and landscape pages no longer overflow or leave a gap. Placeholders and
1067
+ thumbnails take their page's shape before it draws. `PdfPageList`,
1068
+ `PdfSidebar` and `PdfThumbnailSidebar` take an optional `pageSizes`, and the
1069
+ `PdfPageSize` type is exported.
1070
+
1071
+ - [#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
1072
+ `material.pdf-reader.password-incorrect`, en and fr), marks the field
1073
+ `aria-invalid`, announces it and focuses the field again. Escape is handled
1074
+ only when the search bar is open, so a `Dialog` around the reader closes on
1075
+ Escape again. `@page-change` reports a page inside the document, and only when
1076
+ it changes.
1077
+
1078
+ - [#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
1079
+ never scrolled to (past the end, it opens the last page; a new `file` opens on
1080
+ `initialPage` again). The page number follows scrolling, and `@page-change`
1081
+ reports the page most on screen; a page you ask for is reported once, not each
1082
+ page passed on the way.
1083
+
1084
+ - [#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,
1085
+ and counts as you type. It finds every match, including one split across text
1086
+ runs, and ignores case, accents, ligatures and the width of white space.
1087
+ Moving to a match shows its page and marks it. `PdfPageList` takes an optional
1088
+ `highlight`, which `PdfReader` passes it, and the `PdfSearchHighlight` type is
1089
+ exported. A page asked to redraw while it was still drawing (a zoom or the
1090
+ page sizes arriving during the first render) now redraws; it used to keep its
1091
+ first drawing.
1092
+
1093
+ - [#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.
1094
+
1095
+ - [#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
1096
+ element a screen reader lands on, not only with the `*`, as in
1097
+ `@nxgt/material`:
1098
+
1099
+ - `DateField`, `DateRangeField`, `TimeField`: the trigger is a `combobox`
1100
+ (a `button` may not carry `aria-required`) named by an `aria-label` /
1101
+ `aria-labelledby` you pass, else by the label, else by `placeholder` (a
1102
+ picker with no label needs one of them), with `aria-required` (and
1103
+ `aria-invalid` with `error`).
1104
+ - `DurationField`: `required` on both inputs.
1105
+ - `SliderField`: `aria-required` on every thumb, and each thumb is named by
1106
+ the label ("Price Minimum" / "Price Maximum" for a range). The bare `Slider`
1107
+ takes `label-id` and `required` for the same.
1108
+ - `RatingField`: the stars are a `radiogroup`, named by the label, with
1109
+ `aria-required`.
1110
+ - `RichTextEditor`: the editable area is a multi-line `textbox` named by the
1111
+ label, with `aria-required`. `CodeEditor`: Monaco's `ariaRequired`; its
1112
+ `disabled` (Monaco's `readOnly`) now also reaches the editor when it
1113
+ changes after mount.
1114
+ - `TransferList`: `aria-required` on the Selected listbox, and both panes are
1115
+ named by the label, then their title ("Team Selected"); the label no longer
1116
+ points its `for` at nothing. `SortableList`: the
1117
+ listbox is named by the label, with `aria-required`.
1118
+ - `ComboboxField`: `aria-required` on its `combobox` trigger. `Autocomplete`:
1119
+ `aria-required` on its input.
1120
+ - `ImageField`, `FileListField`, `UploadField` (a file picker is a button, and
1121
+ their file input is hidden): the field is a `group` named by the label and
1122
+ described by a visually hidden "This field is required."
1123
+ - Tests that found a picker by the `button` role, or a thumb or a pane by its
1124
+ old exact name: see the troubleshooting page.
1125
+
1126
+ - [#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
1127
+ center", "Align right" and "Justify" without an `I18nProvider`, instead of the
1128
+ raw values `left`, `center`, `right`, `justify`.
1129
+
1130
+ - [#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
1131
+ `Slider` does: it goes on every thumb and wins over `error`. It used to land
1132
+ on the field's root `div`, where it is not allowed and nothing reads it.
1133
+
1134
+ - [#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
1135
+ (before paint) instead of in the first render, so a stored `dark` no longer
1136
+ makes `ThemeToggle` or the code blocks mismatch the server HTML. Outside a
1137
+ component it still reads the storage straight away.
1138
+
1139
+ `PaneLayout` and `ListDetailsLayout` answer their width query through the
1140
+ same helper as `useIsMobile()` (`Doc` too, for its desktop-only sidebar
1141
+ reset, which renders nothing): on the server they follow
1142
+ `provideSSRWidth()` (a 1024 px desktop when the app provides none) instead of
1143
+ always rendering the desktop layout, and the client switches once mounted.
1144
+
1145
+ - [#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
1146
+ to `provideSSRWidth()` — through your own server and client entries, or
1147
+ `useState` in Nuxt — so a phone layout rendered on the server hydrates
1148
+ without a mismatch.
1149
+
1150
+ - [#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
1151
+ mismatch: while hydrating, the store renders step 0, as the server does, and
1152
+ resumes at the stored step once mounted. A plain client mount still shows the
1153
+ stored step from its first render, and `reset()` still clears it.
1154
+
1155
+ - [#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`,
1156
+ where it is not allowed. An invalid `Switch` says so on the `switch` itself,
1157
+ which it did not do at all before, and its bordered row shows it with a red
1158
+ border; an invalid `Autocomplete` says so on its input, and the chips box
1159
+ shows it with a red border. An `aria-invalid` you pass the `Switch` still wins.
1160
+
1161
+ - [#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
1162
+ `label` explicitly (`aria-labelledby`) and takes the row text as its
1163
+ description (`aria-describedby`), as `@nxgt/material` does. An `aria-label` /
1164
+ `aria-labelledby` you pass still wins.
1165
+
1166
+ The row now carries `data-checked="true"` / `"false"`, the same values as
1167
+ `@nxgt/material`. `data-filed` (misspelt) is still present while on and is
1168
+ deprecated; it is removed in 1.0.
1169
+
1170
+ - [#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
1171
+ switch, as in `@nxgt/material`: it is announced as required (`aria-required`),
1172
+ and with a `name` inside a `<form>` its hidden input is `required`, so an
1173
+ unchecked required switch now blocks the browser's native submit, like a
1174
+ required checkbox. It used to show only the label's asterisk.
1175
+
1176
+ - [#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
1177
+ trigger, where it is not allowed: that box shows an error with a red border
1178
+ now, and the trigger `combobox` alone says the field is invalid.
1179
+
1180
+ - [#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,
1181
+ why it happened up to 0.21.0, and how to hand it back on an older version.
1182
+
1183
+ - [#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
1184
+ files") follows the language like the rest of the field
1185
+ (`material.upload.dropzone.max-size` / `max-files`, with French), and says
1186
+ "Up to 1 file" instead of "Up to 1 files".
1187
+
1188
+ - [#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
1189
+ text, and the drop zone no longer is as well (a screen reader read it on
1190
+ entering the group and again on the drop zone). `ImageField`,
1191
+ `FileListField`, `UploadField` with a trailing button, and the
1192
+ `NetworkUploadField` / `S3UploadField` drop zone, in error without
1193
+ `helper-text`, are described by a visually hidden "This value is
1194
+ not valid." (`material.zod.default`, translated) instead of being only a red
1195
+ outline.
1196
+
1197
+ ## 0.21.0
1198
+
1199
+ ### Minor Changes
1200
+
1201
+ - [#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`
1202
+
1203
+ `Map`, `Marker`, `LocationMarker`, `LocationPreview`, `MapActions`,
1204
+ `LocationField`, `LocationFormField` and `useGeolocation`, in an entry of its own
1205
+ with `leaflet` and `@vue-leaflet/vue-leaflet` as **optional peers** — an app that
1206
+ renders no map never has leaflet in its tree.
1207
+
1208
+ ```sh
1209
+ bun add leaflet @vue-leaflet/vue-leaflet
1210
+ ```
1211
+
1212
+ ```vue
1213
+ <script setup lang="ts">
1214
+ import "@nxgt/material-vue/map.css";
1215
+ import { LocationFormField } from "@nxgt/material-vue/map";
1216
+ </script>
1217
+ ```
1218
+
1219
+ `useGeolocation` wraps `@vueuse/core`'s — already a peer — rather than adding a
1220
+ second geolocation dependency, and normalises `coords` to
1221
+ `{ latitude, longitude } | null` so `NaN` before the first fix does not read as a
1222
+ position. `LocationFormField` uses `useField` from vee-validate, like every other
1223
+ `*FormField` here.
1224
+
1225
+ **Not auto-registered by the Nuxt module**, deliberately: auto-registration would
1226
+ make leaflet resolvable from an app that never renders a map.
1227
+
1228
+ **SSR.** `@vue-leaflet/vue-leaflet` loads leaflet with `import()` on mount, so
1229
+ this entry can be imported in a server process — the React mirror's cannot, since
1230
+ `react-leaflet` imports leaflet statically. Leaflet still initialises in the
1231
+ browser only, so wrap it in `<ClientOnly>` under Nuxt. `verify:ssr` gained an
1232
+ `ENTRY_ONLY` check: no entry but `map.js` may reach either package.
1233
+
1234
+ `MinimapControl` is not ported — it is built on `@react-leaflet/core` internals
1235
+ with no Vue counterpart. An arbitrary marker is `LIcon`'s slot rather than a
1236
+ component-marker dependency.
1237
+
1238
+ ## 0.20.0
1239
+
1240
+ ### Minor Changes
1241
+
1242
+ - [#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
1243
+
1244
+ `postbuild` runs `verify:ssr`, which imports all eight built entries in a runtime
1245
+ with **no DOM** — the same thing a Nuxt server does at boot — and then fails if
1246
+ any entry **statically** reaches a dependency that must stay behind `import()`
1247
+ (`pdfjs-dist` today). Until now this repo only bundled; the modules were never
1248
+ executed, and AGENTS.md said so: "the check is the consumer, not this repo".
1249
+
1250
+ Nothing in the package changed: all eight entries pass both halves today. The
1251
+ check is there so the next barrel change cannot quietly take a consumer's server
1252
+ down at boot — and so the failure is named here rather than diagnosed there.
1253
+
1254
+ Also declares `"sideEffects": ["**/*.css"]`. It is true, not a fix: measured in
1255
+ the React sibling, it changes nothing about what a consumer bundles, because
1256
+ tree-shaking keeps a module whose own package does not promise to be
1257
+ side-effect-free. The CSS entry is not decoration — a bare `false` lets a bundler
1258
+ drop `dist/material-vue.css`.
1259
+
1260
+ ## 0.19.4
1261
+
1262
+ ### Patch Changes
1263
+
1264
+ - [#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`.
1265
+
1266
+ ## 0.19.3
1267
+
1268
+ ### Patch Changes
1269
+
1270
+ - [#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.
1271
+
1272
+ ## 0.19.2
1273
+
1274
+ ### Patch Changes
1275
+
1276
+ - [#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.
1277
+
1278
+ ## 0.19.1
1279
+
1280
+ ### Patch Changes
1281
+
1282
+ - [#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.
1283
+
1284
+ ## 0.19.0
1285
+
1286
+ ### Minor Changes
1287
+
1288
+ - [#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.
1289
+
1290
+ ## 0.18.0
1291
+
1292
+ ### Minor Changes
1293
+
1294
+ - [#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.
1295
+
1296
+ - [#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.
1297
+
1298
+ ## 0.17.0
1299
+
1300
+ ### Minor Changes
1301
+
1302
+ - [#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.
1303
+
1304
+ ### Patch Changes
1305
+
1306
+ - [#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.
1307
+
1308
+ - [#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.
1309
+
1310
+ ## 0.16.0
1311
+
1312
+ ### Minor Changes
1313
+
1314
+ - [#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.
1315
+
1316
+ ## 0.15.3
1317
+
1318
+ ### Patch Changes
1319
+
1320
+ - [#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.
1321
+
1322
+ ## 0.15.2
1323
+
1324
+ ### Patch Changes
1325
+
1326
+ - [#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.
1327
+
1328
+ ## 0.15.1
1329
+
1330
+ ### Patch Changes
1331
+
1332
+ - [#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.
1333
+
1334
+ - [#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.
1335
+
1336
+ ## 0.15.0
1337
+
1338
+ ### Minor Changes
1339
+
1340
+ - [#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.
1341
+
1342
+ ## 0.14.0
1343
+
1344
+ ### Minor Changes
1345
+
1346
+ - [#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.
1347
+
1348
+ ## 0.13.0
1349
+
1350
+ ### Minor Changes
1351
+
1352
+ - [#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.
1353
+
1354
+ ## 0.12.0
1355
+
1356
+ ### Minor Changes
1357
+
1358
+ - [#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.
1359
+
1360
+ ## 0.11.0
1361
+
1362
+ ### Minor Changes
1363
+
1364
+ - [#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.
1365
+
1366
+ ## 0.10.0
1367
+
1368
+ ### Minor Changes
1369
+
1370
+ - [#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.
1371
+
1372
+ - [#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.
1373
+
1374
+ ## 0.9.0
1375
+
1376
+ ### Minor Changes
1377
+
1378
+ - [#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.
1379
+
1380
+ ## 0.8.0
1381
+
1382
+ ### Minor Changes
1383
+
1384
+ - [#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.
1385
+
1386
+ ## 0.7.0
1387
+
1388
+ ### Minor Changes
1389
+
1390
+ - [#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.
1391
+
1392
+ ### Patch Changes
1393
+
1394
+ - [#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.
1395
+
1396
+ ## 0.6.0
1397
+
1398
+ ### Minor Changes
1399
+
1400
+ - [#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.
1401
+
1402
+ ## 0.5.0
1403
+
1404
+ ### Minor Changes
1405
+
1406
+ - [#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.
1407
+
1408
+ ### Patch Changes
1409
+
1410
+ - [#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.
1411
+
1412
+ ## 0.4.0
1413
+
1414
+ ### Minor Changes
1415
+
1416
+ - [#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.
1417
+
1418
+ - [#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.
1419
+
1420
+ - [#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).
1421
+
1422
+ - [#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.
1423
+
1424
+ - [#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.
1425
+
1426
+ - [#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.
1427
+
1428
+ - [#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.
1429
+
1430
+ - [#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.
1431
+
1432
+ - [#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.
1433
+
1434
+ - [#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.
1435
+
1436
+ - [#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.
1437
+
1438
+ - [#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.
1439
+
1440
+ - [#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.
1441
+
1442
+ - [#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).
1443
+
1444
+ - [#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.
1445
+
1446
+ - [#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).
1447
+
1448
+ - [#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.
1449
+
1450
+ - [#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.
1451
+
1452
+ ### Patch Changes
1453
+
1454
+ - [#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.
1455
+
1456
+ - [#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.
1457
+
1458
+ - [#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).
1459
+
1460
+ - [#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.
1461
+
1462
+ - [#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.
1463
+
1464
+ - [#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.
1465
+
1466
+ - [#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.
1467
+
1468
+ - [#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.
1469
+
1470
+ - [#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.
1471
+
1472
+ - [#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 `[` / `]`.
1473
+
1474
+ - [#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.
1475
+
1476
+ - [#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.
1477
+
1478
+ - [#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).
1479
+
1480
+ - [#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.
1481
+
1482
+ ## 0.3.2
1483
+
1484
+ ### Patch Changes
1485
+
1486
+ - [#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.
1487
+
1488
+ - [#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.
1489
+
1490
+ ## 0.3.1
1491
+
1492
+ ### Patch Changes
1493
+
1494
+ - [#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.
1495
+
1496
+ ## 0.3.0
1497
+
1498
+ ### Minor Changes
1499
+
1500
+ - [#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.
1501
+
1502
+ ## 0.2.0
1503
+
1504
+ ### Minor Changes
1505
+
1506
+ - [#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.
1507
+
1508
+ ### Patch Changes
1509
+
1510
+ - [#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.
1511
+
1512
+ - [#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.
1513
+
1514
+ ## 0.1.0
1515
+
1516
+ ### Minor Changes
1517
+
1518
+ - [#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).
1519
+
1520
+ - [#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.
1521
+
1522
+ - [#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.
1523
+
1524
+ - [#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.
1525
+
1526
+ - [#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.
1527
+
1528
+ - [#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).
1529
+
1530
+ - [#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.
1531
+
1532
+ - [#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.
1533
+
1534
+ - [#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.
1535
+
1536
+ - [#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.
1537
+
1538
+ - [#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.
1539
+
1540
+ - [#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.
1541
+
1542
+ - [#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.
1543
+
1544
+ - [#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.
1545
+
1546
+ - [#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.
1547
+
1548
+ - [#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.
1549
+
1550
+ - [#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.
1551
+
1552
+ - [#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.
1553
+
1554
+ - [#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.
1555
+
1556
+ - [#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.
1557
+
1558
+ - [#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.
1559
+
1560
+ - [#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.
1561
+
1562
+ - [#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.
1563
+
1564
+ - [#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.
1565
+
1566
+ - [#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.
1567
+
1568
+ - [#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.
1569
+
1570
+ - [#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.
1571
+
1572
+ - [#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.
1573
+
1574
+ - [#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.
1575
+
1576
+ - [#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.
1577
+
1578
+ - [#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.
1579
+
1580
+ - [#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.
1581
+
1582
+ - [#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.
1583
+
1584
+ - [#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.
1585
+
1586
+ - [#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.
1587
+
1588
+ - [#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.
1589
+
1590
+ - [#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.
1591
+
1592
+ - [#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.
1593
+
1594
+ - [#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.
1595
+
1596
+ - [#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.
1597
+
1598
+ ### Patch Changes
1599
+
1600
+ - [#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.
1601
+
1602
+ - [#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.
1603
+
1604
+ - [#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.
1605
+
1606
+ - [#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.
1607
+
1608
+ - [#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.
1609
+
1610
+ - [#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.
1611
+
1612
+ - [#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.
1613
+
1614
+ - [#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.
1615
+
1616
+ - [#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.
1617
+
1618
+ - [#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.
1619
+
1620
+ - [#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.
1621
+
1622
+ - [#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.
1623
+
1624
+ - [#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.
1625
+
1626
+ - [#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.
1627
+
1628
+ - [#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.