@nxgt/material-vue 0.28.0 → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/{Button-D1uzdbOJ.js → Button-CNbJT5qV.js} +5 -5
  3. package/dist/{HoverCardTrigger-DaM5d4hE.js → HoverCardTrigger-Ci1iT9-I.js} +1 -1
  4. package/dist/{camera-CxXijySa.js → camera-BFnqY3CN.js} +3 -3
  5. package/dist/components/theme-tokens.css +2 -2
  6. package/dist/{components-Db9OdMfQ.js → components-kGJbzQYZ.js} +10249 -10213
  7. package/dist/components.js +5 -5
  8. package/dist/dnd.js +1 -1
  9. package/dist/{form-scope-BILi3ke-.js → form-scope-DHnmoR2r.js} +1 -1
  10. package/dist/{icon-button-D60G5B_Z.js → icon-button-DXXjxBgr.js} +6 -6
  11. package/dist/lib/components/ui/feedback/toast/index.d.ts +2 -1
  12. package/dist/lib/components/ui/feedback/toast/toast-data.d.ts +23 -0
  13. package/dist/lib/components/ui/feedback/toast/toast.vue.d.ts +11 -4
  14. package/dist/lib/components/ui/feedback/toast/toasts.d.ts +26 -6
  15. package/dist/main.js +5 -5
  16. package/dist/map.js +3 -3
  17. package/dist/material-vue.css +1 -1
  18. package/dist/{pdf-outline-sidebar-BXGTDISI.js → pdf-outline-sidebar-Bll123U-.js} +1 -1
  19. package/dist/{pdf-page-BR4G03kN.js → pdf-page-DEi2b6dz.js} +1 -1
  20. package/dist/{pdf-page-list-bjQm6_kf.js → pdf-page-list-eQ0uLV6i.js} +2 -2
  21. package/dist/{pdf-reader-DGVEFNc0.js → pdf-reader-CWQbdM31.js} +7 -7
  22. package/dist/{pdf-sidebar-CiM6dwAm.js → pdf-sidebar-Dv2PY_bB.js} +2 -2
  23. package/dist/{pdf-thumbnail-sidebar-fM3DGJzD.js → pdf-thumbnail-sidebar-3RBdIUuk.js} +2 -2
  24. package/dist/{pdf-toolbar-mWlGTWU1.js → pdf-toolbar-Z5YML7a-.js} +3 -3
  25. package/dist/pdf.js +1 -1
  26. package/dist/{sortable-provider-Dml11nQY.js → sortable-provider-Cb3tm9Cy.js} +1 -1
  27. package/dist/{stx-player-BS7-CXFx.js → stx-player-DVTFb2Oe.js} +1 -1
  28. package/docs/components/feedback-and-status.md +35 -6
  29. package/docs/roadmap.md +5 -0
  30. package/docs/troubleshooting.md +50 -2
  31. package/lib/components/theme-tokens.css +2 -2
  32. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
2
  import { t } from "./utils-CykWQ0iJ.js";
3
- import { Ef as n } from "./components-Db9OdMfQ.js";
3
+ import { Ef as n } from "./components-kGJbzQYZ.js";
4
4
  import { t as r } from "./use-material-translation-Do6ztdtV.js";
5
5
  import { Fragment as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, defineComponent as u, normalizeClass as d, normalizeStyle as f, openBlock as p, ref as m, renderList as h, toDisplayString as g, unref as _, withCtx as v } from "vue";
6
6
  //#region lib/components/ui/media/pdf-viewer/partials/pdf-outline-row.vue?vue&type=script&setup=true&lang.ts
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./utils-CykWQ0iJ.js";
2
- import { kp as t } from "./components-Db9OdMfQ.js";
2
+ import { kp as t } from "./components-kGJbzQYZ.js";
3
3
  import { computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, defineComponent as s, nextTick as c, normalizeClass as l, normalizeStyle as u, onBeforeUnmount as d, openBlock as f, ref as p, shallowRef as m, unref as h, watch as g } from "vue";
4
4
  import { DEFAULT_PAGE_SIZE as _, escapeHtml as v, findTextMatches as y, highlightItemHtml as b, placeholderSize as x, rotatedSize as S } from "@nxgt/material-core/pdf-viewer";
5
5
  //#region lib/components/ui/media/pdf-viewer/pdf-note-icons.ts
@@ -1,6 +1,6 @@
1
1
  import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { Ef as t } from "./components-Db9OdMfQ.js";
3
- import { t as n } from "./pdf-page-BR4G03kN.js";
2
+ import { Ef as t } from "./components-kGJbzQYZ.js";
3
+ import { t as n } from "./pdf-page-DEi2b6dz.js";
4
4
  import { Fragment as r, createBlock as i, createElementBlock as a, createElementVNode as o, defineComponent as s, openBlock as c, renderList as l, withCtx as u } from "vue";
5
5
  //#region lib/components/ui/media/pdf-viewer/partials/pdf-page-list.vue?vue&type=script&setup=true&lang.ts
6
6
  var d = { class: "flex flex-col items-center gap-4 px-4 py-4" }, f = /*@__PURE__*/ s({
@@ -1,12 +1,12 @@
1
1
  import { t as e } from "./utils-CykWQ0iJ.js";
2
- import { On as t } from "./components-Db9OdMfQ.js";
2
+ import { On as t } from "./components-kGJbzQYZ.js";
3
3
  import { t as n } from "./use-material-translation-Do6ztdtV.js";
4
- import { t as r } from "./Button-D1uzdbOJ.js";
5
- import { o as i } from "./HoverCardTrigger-DaM5d4hE.js";
6
- import { n as a } from "./pdf-page-BR4G03kN.js";
7
- import { t as o } from "./pdf-page-list-bjQm6_kf.js";
8
- import { t as s } from "./pdf-sidebar-CiM6dwAm.js";
9
- import { t as c } from "./pdf-toolbar-mWlGTWU1.js";
4
+ import { t as r } from "./Button-CNbJT5qV.js";
5
+ import { o as i } from "./HoverCardTrigger-Ci1iT9-I.js";
6
+ import { n as a } from "./pdf-page-DEi2b6dz.js";
7
+ import { t as o } from "./pdf-page-list-eQ0uLV6i.js";
8
+ import { t as s } from "./pdf-sidebar-Dv2PY_bB.js";
9
+ import { t as c } from "./pdf-toolbar-Z5YML7a-.js";
10
10
  import { computed as l, createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createTextVNode as m, createVNode as h, defineComponent as g, nextTick as _, normalizeClass as v, onBeforeUnmount as y, onMounted as b, openBlock as x, reactive as S, ref as C, shallowRef as w, toDisplayString as T, toRef as E, unref as D, useId as O, watch as k, withCtx as A } from "vue";
11
11
  import { AlertCircle as j, FileX2 as M, KeyRound as N, Loader2 as P } from "@lucide/vue";
12
12
  import { pdfSourceKey as F, toPdfjsParams as I } from "@nxgt/material-core/pdf-source";
@@ -1,8 +1,8 @@
1
1
  import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
2
  import { t } from "./utils-CykWQ0iJ.js";
3
3
  import { t as n } from "./use-material-translation-Do6ztdtV.js";
4
- import { t as r } from "./pdf-outline-sidebar-BXGTDISI.js";
5
- import { t as i } from "./pdf-thumbnail-sidebar-fM3DGJzD.js";
4
+ import { t as r } from "./pdf-outline-sidebar-Bll123U-.js";
5
+ import { t as i } from "./pdf-thumbnail-sidebar-3RBdIUuk.js";
6
6
  import { createElementBlock as a, createElementVNode as o, createVNode as s, defineComponent as c, normalizeClass as l, openBlock as u, toDisplayString as d, unref as f, useId as p, useTemplateRef as m } from "vue";
7
7
  //#region lib/components/ui/media/pdf-viewer/partials/pdf-sidebar.vue?vue&type=script&setup=true&lang.ts
8
8
  var h = ["aria-label"], g = ["aria-label"], _ = [
@@ -1,8 +1,8 @@
1
1
  import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
2
  import { t } from "./utils-CykWQ0iJ.js";
3
- import { Ef as n } from "./components-Db9OdMfQ.js";
3
+ import { Ef as n } from "./components-kGJbzQYZ.js";
4
4
  import { t as r } from "./use-material-translation-Do6ztdtV.js";
5
- import { t as i } from "./pdf-page-BR4G03kN.js";
5
+ import { t as i } from "./pdf-page-DEi2b6dz.js";
6
6
  import { Fragment as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createVNode as l, defineComponent as u, normalizeClass as d, openBlock as f, renderList as p, toDisplayString as m, unref as h, withCtx as g } from "vue";
7
7
  //#region lib/components/ui/media/pdf-viewer/partials/pdf-thumbnail-sidebar.vue?vue&type=script&setup=true&lang.ts
8
8
  var _ = ["aria-label"], v = {
@@ -1,10 +1,10 @@
1
1
  import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
2
  import { t } from "./utils-CykWQ0iJ.js";
3
3
  import { t as n } from "./use-material-translation-Do6ztdtV.js";
4
- import { d as r } from "./Button-D1uzdbOJ.js";
5
- import { t as i } from "./icon-button-D60G5B_Z.js";
4
+ import { d as r } from "./Button-CNbJT5qV.js";
5
+ import { t as i } from "./icon-button-DXXjxBgr.js";
6
6
  import { a, i as o, n as s, o as c, r as l, t as u } from "./DropdownMenuTrigger-BsuyNVzV.js";
7
- import { o as d } from "./HoverCardTrigger-DaM5d4hE.js";
7
+ import { o as d } from "./HoverCardTrigger-Ci1iT9-I.js";
8
8
  import { Fragment as f, computed as p, createBlock as m, createCommentVNode as h, createElementBlock as g, createElementVNode as _, createTextVNode as v, createVNode as y, defineComponent as b, nextTick as x, normalizeClass as S, openBlock as C, ref as w, renderList as T, toDisplayString as E, unref as D, useTemplateRef as O, watch as k, withCtx as A } from "vue";
9
9
  import { ChevronDown as j, ChevronLeft as M, ChevronRight as N, ChevronUp as P, Download as F, Maximize2 as I, Minimize2 as L, Moon as R, Printer as z, RotateCw as B, Search as V, Sidebar as H, ZoomIn as U, ZoomOut as W } from "@lucide/vue";
10
10
  //#region lib/components/ui/media/pdf-viewer/partials/pdf-toolbar-search.vue?vue&type=script&setup=true&lang.ts
package/dist/pdf.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { n as e, t } from "./use-material-translation-Do6ztdtV.js";
2
- import { t as n } from "./Button-D1uzdbOJ.js";
2
+ import { t as n } from "./Button-CNbJT5qV.js";
3
3
  import { computed as r, createBlock as i, createTextVNode as a, defineComponent as o, getCurrentInstance as s, nextTick as c, onMounted as l, onScopeDispose as u, openBlock as d, ref as f, renderSlot as p, shallowRef as m, toDisplayString as ee, toValue as h, unref as g, watch as te, withCtx as ne } from "vue";
4
4
  import { contentDisposition as re, pdfBytesResponse as ie, toWebStream as ae } from "@nxgt/material-core/pdf/http";
5
5
  import { badge as oe, dataTable as se, defaultPdfTheme as ce, definePdfDocument as _, divider as v, header as y, heading as b, image as x, keyValue as S, keyValueOf as C, link as w, metric as T, page as E, pageBreak as D, pageNumber as O, pdfDocument as k, resolvePdfColor as A, resolvePdfTheme as j, row as M, section as N, spacer as P, stack as F, table as I, text as L, totals as R } from "@nxgt/material-core/pdf/model";
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-CykWQ0iJ.js";
2
2
  import { t } from "./use-material-translation-Do6ztdtV.js";
3
- import { t as n } from "./icon-button-D60G5B_Z.js";
3
+ import { t as n } from "./icon-button-DXXjxBgr.js";
4
4
  import { Teleport as r, computed as i, createBlock as a, createCommentVNode as o, createElementBlock as s, createVNode as c, defineComponent as l, inject as u, mergeProps as d, normalizeStyle as f, onUnmounted as p, openBlock as m, provide as h, reactive as g, ref as _, renderSlot as v, toValue as y, unref as b, useAttrs as x, watch as S, watchEffect as C, withCtx as w, withModifiers as T } from "vue";
5
5
  import { GripVertical as E } from "@lucide/vue";
6
6
  import { Primitive as D } from "reka-ui";
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./utils-CykWQ0iJ.js";
2
- import { $t as t, Jt as n, Mp as r, Qt as i, Yt as a, Zt as o, en as s, qt as c } from "./components-Db9OdMfQ.js";
2
+ import { $t as t, Jt as n, Mp as r, Qt as i, Yt as a, Zt as o, en as s, qt as c } from "./components-kGJbzQYZ.js";
3
3
  import { t as l } from "./use-material-translation-Do6ztdtV.js";
4
4
  import { createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createTextVNode as m, createVNode as h, defineComponent as g, normalizeClass as _, openBlock as v, toDisplayString as y, unref as b, withCtx as x } from "vue";
5
5
  //#region lib/components/ui/media/stx-player/partials/stx-player-frame.vue?vue&type=script&setup=true&lang.ts
@@ -572,7 +572,7 @@ async function upload() {
572
572
  | --- | --- | --- | --- |
573
573
  | `title` / `description` | `string` | preset title for `success`, `error`, `loading` | toast text |
574
574
  | `icon` | a VNode (`toast`) · icon name (`toasts.*`) | preset icon | leading icon |
575
- | `action` | `{ label, onClick? }` or `(dismiss) => VNode` | a translated “Close” for `success`, `info`, `error`; a preset keeps the caller's own | trailing button: `onClick`, then the toast closes; or what the function renders, given `dismiss`. Brings the X button and a persistent toast, see below |
575
+ | `action` | `{ label, onClick? }` (`label`: a string or a component) or `(dismiss) => VNode` | a translated “Close” for `success`, `info`, `error`; every preset keeps the caller's own, in either call | trailing button: `onClick` (given the click event, optional when you call it yourself), then the toast closes; or what the function renders, given `dismiss`. Brings the X button and a persistent toast, see below |
576
576
  | `dismissLabel` | `string` | the translated “Close” when an `action` is given | accessible name of the X icon button beside the action; `''` hides it |
577
577
  | `role` | `'status' \| 'alert'` | none (`toasts.error`: `'alert'`) | live-region role. Toasts are already announced politely by the `Toaster`'s region; `alert` interrupts, and may be read twice by some screen readers |
578
578
  | `options` | vue-sonner `ExternalToast` | `duration: 5000` for presets, `Infinity` for `loading` and for any toast with your own `action` (a preset's fallback "Close" still times out at 5000) unless a `duration` is passed | passed to Sonner (`id`, `duration`, `position`…) |
@@ -586,7 +586,7 @@ stylesheet comes with this package's (`styles.css`, or the compiled
586
586
  stylesheet). `Toast` is the component each toast renders, and `sonnerToast`
587
587
  is vue-sonner's own `toast`, for anything the presets do not cover.
588
588
 
589
- **Types:** `ToasterProps` (vue-sonner's), from `@nxgt/material-vue/components`.
589
+ **Types:** `ToastAction`, `ToastProps`, `ToastMethodProps`, `ToastData`, `ToastArgs`, `PresetProps` (the props of `success`, `warning`, `info` and `error`: use it, not `Parameters<typeof toasts.success>[0]`, which is now a union with the `(message, data)` form), and `ToasterProps` (vue-sonner's), from `@nxgt/material-vue/components`.
590
590
 
591
591
  **On a phone** (under 600px wide, where vue-sonner lays toasts out across the
592
592
  screen), a `Toaster` with no `position` shows its toasts at the top
@@ -603,6 +603,27 @@ raise its `top` when a sticky header must stay visible:
603
603
  <Toaster position="bottom-center" /> <!-- bottom-center everywhere -->
604
604
  ```
605
605
 
606
+ **vue-sonner's call works too.** Every preset (`custom`, `success`, `info`,
607
+ `warning`, `error`, `loading`) also takes vue-sonner's own `(message, data)`: the
608
+ message (a string or a component) is the title, `data.description` and `data.action` are shown, and the
609
+ rest of `data` (`id`, `duration`, `onDismiss`…) is passed to vue-sonner as the
610
+ options. `data` is typed `ToastData`, vue-sonner's `ExternalToast` without `icon`
611
+ (a preset draws its own) and `cancel` (the X button stands for it): passing
612
+ either is a type error rather than a silent no-op.
613
+
614
+ ```ts
615
+ toasts.success('Staff member restored', {
616
+ description: 'They can sign in again.',
617
+ action: { label: 'Send an invitation', onClick: openInvite },
618
+ });
619
+ // the same as
620
+ toasts.success({
621
+ title: 'Staff member restored',
622
+ description: 'They can sign in again.',
623
+ action: { label: 'Send an invitation', onClick: openInvite },
624
+ });
625
+ ```
626
+
606
627
  **An action keeps the toast open.** `toast()` itself does it, so a preset and a
607
628
  direct call behave alike: any toast with an `action` is persistent by default
608
629
  (`options.duration: Infinity`, WCAG 2.2.1: a timed toast can vanish before a
@@ -620,10 +641,18 @@ elsewhere) is ignored, so a tapped toast still goes after its duration. On a
620
641
  touch screen a tap no longer fans out a stack of two or more toasts either: pass
621
642
  `expand` to keep the stack open. Sonner does not close a toast on Escape (it
622
643
  only collapses the stack); this `Toast` does when focus is inside it, with or
623
- without an action. The close button is reached with Tab. **Focus after a
624
- dismiss:** the dismissed toast leaves the page with the focused control in it,
625
- so focus falls back to `document.body`; move it yourself (`onClick`, or after
626
- `toasts.dismiss()`) when the flow needs it elsewhere.
644
+ without an action. The close button is reached with Tab.
645
+
646
+ **Focus after an action.** A click on a toast's action first gives the focus
647
+ back to the control that had it before the focus entered the toast, then runs
648
+ your `onClick`, then closes the toast; a function action's `dismiss` does the
649
+ same before it closes. So an action that opens a `Dialog` (or moves the focus
650
+ anywhere else) keeps it there: the dialog holds the control it focused once
651
+ the toast has gone, and gives the focus back to that earlier control when it
652
+ closes (WCAG 2.4.3). An action that moves the focus nowhere leaves it on that
653
+ earlier control. A toast closed by its X or by Escape takes its focused
654
+ control with it, so the focus falls back to `document.body`; move it yourself
655
+ (after `toasts.dismiss()`) when the flow needs it elsewhere.
627
656
 
628
657
  **Announced to screen readers:** `Toaster` renders a polite live region
629
658
  (`<section aria-live="polite">`) that is in the page before the first toast,
package/docs/roadmap.md CHANGED
@@ -95,6 +95,11 @@ Nothing in progress right now; see Next.
95
95
 
96
96
  ## Shipped
97
97
 
98
+ - **Toast actions that work everywhere** — `toasts.success(message, { action })`
99
+ and every other preset take sonner's own call shape and keep their action,
100
+ and a dialog a toast's action opens keeps the focus, then gives it back to
101
+ where it was before the toast. 0.29.0.
102
+
98
103
  - **Tabs in two looks** — `underline`, the new default, whose bar slides to
99
104
  the active tab, and a neutral `segmented` pill; a list that scrolls
100
105
  sideways on a phone instead of widening the page, right-to-left, a visible
@@ -54,6 +54,8 @@ words in your error.
54
54
  - [A toast covers the form's button on a phone](#a-toast-covers-the-forms-button-on-a-phone)
55
55
  - [A toast never goes away after a tap](#a-toast-never-goes-away-after-a-tap)
56
56
  - [A toast's action cannot be clicked while a dialog is open](#a-toasts-action-cannot-be-clicked-while-a-dialog-is-open)
57
+ - [`toasts.success(message, { action })` shows no action button](#toastssuccessmessage--action--shows-no-action-button)
58
+ - [The focus leaves a dialog that a toast's action opened](#the-focus-leaves-a-dialog-that-a-toasts-action-opened)
57
59
  - [A `ConfirmationDialog` reopened at once stays closed](#a-confirmationdialog-reopened-at-once-stays-closed)
58
60
  - [The first Escape after closing a nested dialog does nothing](#the-first-escape-after-closing-a-nested-dialog-does-nothing)
59
61
 
@@ -914,8 +916,8 @@ In the dark theme, a filled `secondary` `Button` gave its near-white text
914
916
  `success`, `info` or `warning` one 3.5:1, 2.5:1 and 3.4:1. The dark
915
917
  `--secondary` is brighter (`oklch(0.66 ...)`, 6.5:1 as text on
916
918
  `--background`), and the filled `secondary`, `success`, `info` and `warning`
917
- `Button`s and `IconButton`s are tinted in the dark theme
918
- (`dark:bg-secondary/70`, `dark:bg-success/60`, …) so their text keeps 4.5:1.
919
+ `Button`s and `IconButton`s are filled in the dark theme with an opaque mix
920
+ toward `--background` (about 70 %), so their text keeps 4.5:1 over any backdrop.
919
921
  A filled button given a background of your own through `className` loses the
920
922
  tint in dark mode: add a matching `dark:` one.
921
923
 
@@ -1139,6 +1141,52 @@ counted a pointer down on a toast as outside the dialog.
1139
1141
  inside the `Toaster` as inside, so the action runs and the dialog stays open.
1140
1142
  Sonner's own `Toaster` keeps the old behaviour.
1141
1143
 
1144
+ ### `toasts.success(message, { action })` shows no action button
1145
+
1146
+ **When:** a preset is called the way vue-sonner's own `toast.success` is, with a
1147
+ message and a `data` object: `toasts.success('Staff member restored', {
1148
+ action: { label: 'Send an invitation', onClick } })`. The toast shows the
1149
+ preset's default title ("Success") and its "Close" button, not your message,
1150
+ description or action.
1151
+ **Why:** the presets took one props object only (`{ title, description,
1152
+ action, options }`): a string first argument was read as that object, and
1153
+ the second argument was ignored.
1154
+ **Fix:** update `@nxgt/material-vue`: every preset (`custom`, `success`, `info`,
1155
+ `warning`, `error`, `loading`) now takes `(message, data)` too, the message as
1156
+ the title and `data.description` and `data.action` shown, the rest of `data`
1157
+ as vue-sonner's options. The props object works as before:
1158
+
1159
+ ```ts
1160
+ toasts.success('Staff member restored', { action: { label: 'Send an invitation', onClick } });
1161
+ toasts.success({ title: 'Staff member restored', action: { label: 'Send an invitation', onClick } });
1162
+ ```
1163
+
1164
+ `data` takes no `icon` (a preset draws its own) and no `cancel` (the X button
1165
+ beside the action stands for it).
1166
+
1167
+ ### The focus leaves a dialog that a toast's action opened
1168
+
1169
+ **When:** a toast's action opens a `Dialog` (or an `AlertDialog`, a `Sheet`,
1170
+ a `Drawer`). Closing the dialog leaves the focus on `document.body`, not on
1171
+ the control that had it before the toast, and a keyboard user starts again
1172
+ from the top of the page.
1173
+ **Why:** the toast's button had the focus when the action ran, so the
1174
+ dialog took it as the control to give the focus back to; that button left
1175
+ the page with its toast, and the focus fell to `document.body`. A keyboard
1176
+ user reaches a toast through the list item around it, and vue-sonner
1177
+ restores nothing when the focus leaves the list (its `blur` does not bubble
1178
+ from the toast's buttons), so nothing else gave the focus back. With several
1179
+ toasts, a toast reached from another one never had the focus from the page:
1180
+ the `Toaster` remembers where the focus entered it for that case.
1181
+ **Fix:** update `@nxgt/material-vue` and give the toast an `action` (a `{ label,
1182
+ onClick }`, or a function that calls the `dismiss` it is given): the action
1183
+ gives the focus back to where it was before the toast first, then runs. The
1184
+ dialog keeps its control, and gives the focus back to that earlier control
1185
+ when it closes. A workaround that blurs the button and opens the dialog on
1186
+ the next frame can go. A button you render in a function action and that
1187
+ opens a dialog without calling `dismiss` is not covered: call `dismiss()`
1188
+ before opening the dialog.
1189
+
1142
1190
  ### A `ConfirmationDialog` reopened at once stays closed
1143
1191
 
1144
1192
  **When:** a `ConfirmationDialog` with `v-model:open` (or `:open` and
@@ -70,8 +70,8 @@
70
70
  --primary: oklch(46% 0.1135 276.35);
71
71
  --primary-foreground: oklch(0.984 0.003 247.858);
72
72
  /* Brighter than the light one: it is read as text on the dark surfaces (6.5:1
73
- on --background, 5.8:1 on --card); a filled secondary surface tints it
74
- (dark:bg-secondary/70) to keep 5.2:1 under its near-white text. */
73
+ on --background, 5.8:1 on --card); a filled secondary surface mixes it toward --background
74
+ (the opaque 70 % mix) to keep 5.2:1 under its near-white text. */
75
75
  --secondary: oklch(0.66 0.1135 245.65);
76
76
  --secondary-foreground: oklch(0.984 0.003 247.858);
77
77
  --muted: oklch(0.279 0.041 260.031);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxgt/material-vue",
3
- "version": "0.28.0",
3
+ "version": "0.29.1",
4
4
  "license": "MIT",
5
5
  "bugs": {
6
6
  "email": "stevegires@gmail.com"
@@ -119,7 +119,7 @@
119
119
  "docs:previews": "vitest run --project previews"
120
120
  },
121
121
  "dependencies": {
122
- "@nxgt/material-core": "^0.6.0",
122
+ "@nxgt/material-core": "^0.7.0",
123
123
  "@floating-ui/dom": "^1.8.0",
124
124
  "@fortawesome/fontawesome-common-types": "7.3.1",
125
125
  "@lucide/vue": "^1.45.0",