@nxgt/material-vue 0.40.1 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +3 -2
  3. package/dist/{Button-teS2p_af.js → Button-CWmzvv9p.js} +132 -94
  4. package/dist/{HoverCardTrigger-BEzEsgBo.js → HoverCardTrigger-C5AbAyHE.js} +2 -2
  5. package/dist/{camera-1QRTmpnM.js → camera-C-9slBUV.js} +4 -4
  6. package/dist/components/base-content.css +14 -4
  7. package/dist/{components-XJ95qxB1.js → components-DX4EycMi.js} +10131 -9800
  8. package/dist/components.js +8 -8
  9. package/dist/composables.js +2 -2
  10. package/dist/dnd.js +1 -1
  11. package/dist/{form-scope-BtEP6yC2.js → form-scope-CN68PTXc.js} +1 -1
  12. package/dist/{i18n-provider-BpNC9SxV.js → i18n-provider-DmZSTBnp.js} +1 -1
  13. package/dist/i18n.js +4 -4
  14. package/dist/{icon-button-Vz4NECf1.js → icon-button-DErh1aJS.js} +43 -5
  15. package/dist/lib/components/ui/actions/button/Button.vue.d.ts +1 -1
  16. package/dist/lib/components/ui/actions/button/button.compound-variants.d.ts +28 -0
  17. package/dist/lib/components/ui/actions/button/button.variants.d.ts +8 -2
  18. package/dist/lib/components/ui/actions/copy-button/copy-button.vue.d.ts +1 -1
  19. package/dist/lib/components/ui/actions/copy-button/use-copy-status.d.ts +3 -1
  20. package/dist/lib/components/ui/actions/icon-button/icon-button.compound-variants.d.ts +28 -0
  21. package/dist/lib/components/ui/actions/icon-button/icon-button.variants.d.ts +8 -2
  22. package/dist/lib/components/ui/actions/icon-button/icon-button.vue.d.ts +1 -1
  23. package/dist/lib/components/ui/actions/link/icon-link-button.vue.d.ts +1 -1
  24. package/dist/lib/components/ui/actions/link/link-button.vue.d.ts +1 -1
  25. package/dist/lib/components/ui/actions/link/responsive-link-button.vue.d.ts +1 -1
  26. package/dist/lib/components/ui/actions/load-more-button/load-more-button.vue.d.ts +1 -1
  27. package/dist/lib/components/ui/actions/scroll-to-top/scroll-to-top.vue.d.ts +1 -1
  28. package/dist/lib/components/ui/display/cards/cards.gallery.d.ts +3 -3
  29. package/dist/lib/components/ui/display/chip/chip.utils.d.ts +1 -1
  30. package/dist/lib/components/ui/display/enrolment-secret/enrolment-secret.vue.d.ts +17 -1
  31. package/dist/lib/components/ui/display/qrcode/qrcode.vue.d.ts +6 -0
  32. package/dist/lib/components/ui/display/recovery-codes/index.d.ts +1 -1
  33. package/dist/lib/components/ui/display/recovery-codes/partials/recovery-codes-actions.vue.d.ts +20 -2
  34. package/dist/lib/components/ui/display/recovery-codes/recovery-codes.vue.d.ts +9 -1
  35. package/dist/lib/components/ui/display/recovery-codes/types.d.ts +4 -0
  36. package/dist/lib/components/ui/display/recovery-codes/use-recovery-codes-labels.d.ts +1 -0
  37. package/dist/lib/components/ui/fields/contacts/consts.d.ts +1 -1
  38. package/dist/lib/components/ui/fields/otp-field/otp-field.vue.d.ts +2 -0
  39. package/dist/lib/components/ui/layout/account-menu/account-menu-avatar.vue.d.ts +9 -0
  40. package/dist/lib/components/ui/layout/account-menu/account-menu.vue.d.ts +38 -0
  41. package/dist/lib/components/ui/layout/account-menu/index.d.ts +3 -0
  42. package/dist/lib/components/ui/layout/account-menu/types.d.ts +10 -0
  43. package/dist/lib/components/ui/layout/app-shell/activity-layout.vue.d.ts +21 -5
  44. package/dist/lib/components/ui/layout/app-shell/app-brand-logo.vue.d.ts +20 -0
  45. package/dist/lib/components/ui/layout/app-shell/app-brand.vue.d.ts +30 -0
  46. package/dist/lib/components/ui/layout/app-shell/app-header.vue.d.ts +13 -5
  47. package/dist/lib/components/ui/layout/app-shell/app-sidebar.vue.d.ts +12 -2
  48. package/dist/lib/components/ui/layout/app-shell/index.d.ts +1 -1
  49. package/dist/lib/components/ui/layout/app-shell/types.d.ts +10 -0
  50. package/dist/lib/components/ui/layout/index.d.ts +1 -0
  51. package/dist/lib/components/ui/layout/stepper/stepper.vue.d.ts +7 -2
  52. package/dist/lib/components/ui/media/carousel/carousel-next.vue.d.ts +1 -1
  53. package/dist/lib/components/ui/media/carousel/carousel-previous.vue.d.ts +1 -1
  54. package/dist/lib/components/ui/primitives/input-group/input-group-button.vue.d.ts +1 -1
  55. package/dist/lib/i18n/resources/en/en.d.ts +5 -0
  56. package/dist/lib/i18n/resources/en/material.json.d.ts +5 -0
  57. package/dist/lib/i18n/resources/fr/fr.d.ts +5 -0
  58. package/dist/lib/i18n/resources/fr/material.json.d.ts +7 -2
  59. package/dist/lib/i18n/resources/resources.d.ts +10 -0
  60. package/dist/lib/i18n/translator.d.ts +1 -1
  61. package/dist/lib/nuxt/component-names.d.ts +1 -1
  62. package/dist/lib.js +1 -1
  63. package/dist/main.js +17 -17
  64. package/dist/map.js +4 -4
  65. package/dist/material-vue.css +1 -1
  66. package/dist/{pdf-outline-sidebar-DINCjWKk.js → pdf-outline-sidebar-BU4o_hBI.js} +2 -2
  67. package/dist/{pdf-page-BLJ0xkS3.js → pdf-page-anNe78Lc.js} +1 -1
  68. package/dist/{pdf-page-list-BNUPVA9x.js → pdf-page-list-CSY76HH6.js} +2 -2
  69. package/dist/{pdf-reader-BcB_Kd_F.js → pdf-reader-BhZNrW7R.js} +8 -8
  70. package/dist/{pdf-sidebar-B7WgcY77.js → pdf-sidebar-DcIpG7eh.js} +3 -3
  71. package/dist/{pdf-thumbnail-sidebar-BRtyyBPt.js → pdf-thumbnail-sidebar-CUC0V4if.js} +3 -3
  72. package/dist/{pdf-toolbar-_CBHSMnH.js → pdf-toolbar-C373S-ul.js} +4 -4
  73. package/dist/pdf.js +2 -2
  74. package/dist/{print-format.utils-k5W0GBRF.js → print-format.utils-C81c0weJ.js} +2 -2
  75. package/dist/{sortable-provider-Dw9TBAlq.js → sortable-provider-CL2UGGn8.js} +2 -2
  76. package/dist/{stored-language-DEyPmUzl.js → stored-language-Wtcj2HsU.js} +12 -2
  77. package/dist/{stx-player-CgwzX7_k.js → stx-player-CMmM3F5Z.js} +12 -12
  78. package/dist/{translator-B62GlCBp.js → translator-D5Dp-dob.js} +1 -1
  79. package/dist/{use-heading-spy-T94lNeNA.js → use-heading-spy-BIBHtUXN.js} +1 -1
  80. package/dist/{use-material-translation-DxU51--g.js → use-material-translation-COoBTGpB.js} +3 -3
  81. package/docs/components/README.md +2 -1
  82. package/docs/components/buttons-and-actions.md +2 -2
  83. package/docs/components/data-display.md +14 -7
  84. package/docs/components/data-table-filter-and-lists.md +3 -1
  85. package/docs/components/feedback-and-status.md +7 -2
  86. package/docs/components/form-fields.md +2 -1
  87. package/docs/components/navigation-and-layout.md +62 -2
  88. package/docs/guides/app-shell.md +99 -19
  89. package/docs/guides/forms.md +10 -4
  90. package/docs/guides/i18n.md +1 -1
  91. package/docs/previews/navigation-layout-accountmenu.webp +0 -0
  92. package/docs/roadmap.md +9 -0
  93. package/docs/troubleshooting.md +31 -0
  94. package/lib/components/base-content.css +14 -4
  95. package/lib/nuxt/component-names.ts +1 -0
  96. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
1
  # @nxgt/material-vue
2
2
 
3
+ ## 0.42.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#624](https://github.com/softistx/nxgt-material/pull/624) [`94a77a7`](https://github.com/softistx/nxgt-material/commit/94a77a76b54834bda18d1e2acc494d5a089d245d) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The app bar gets a leading title and a reusable account menu ([#585](https://github.com/softistx/nxgt-material/issues/585)). `ActivityLayout` takes `headerTitle` (the `#header-title` slot in Vue): the context the app is in, an organisation's name say, right after the phone's menu button and truncated with an ellipsis when long, so the avatar stays on screen. `AccountMenu` is new, for `ActivityLayout`'s `avatar` (`#avatar`): an avatar button named "Account menu, <name>" (the picture, else the initials on `bg-primary`) that opens a menu aligned to its end, headed by the avatar, the name and `secondary` (the e-mail), then the app's `items` (links) and a destructive Sign out with a busy state (`signingOut`; `onSignOut` in React, the `sign-out` event in Vue). New strings: `material.account-menu.trigger` and `material.account-menu.sign-out`, in English and French. `AppHeader`'s default slot no longer stops its content from shrinking (`min-w-0`), which is what lets a long title truncate. To adopt: replace a hand-rolled user menu in `avatar` with `<AccountMenu name={user.name} secondary={user.email} src={user.picture} items={…} onSignOut={signOut} />`, and move a title placed in `headerActions` to `headerTitle`.
8
+
9
+ - [#624](https://github.com/softistx/nxgt-material/pull/624) [`d8addd6`](https://github.com/softistx/nxgt-material/commit/d8addd6e12a58aad08b321321bb6aac2fa50646b) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The app shell shows the app's logo and name ([#581](https://github.com/softistx/nxgt-material/issues/581)). `ActivityLayout`, `AppSidebar` and `AppHeader` take `logo` (an image URL, `{ src, alt }`, or a node; in Vue a node goes in the `#logo` slot) and `name` (already translated). The collapsed rail shows the logo alone, named by `name`, which also shows as a tooltip; the expanded sidebar and the phone's menu sheet show the logo and the name side by side. The phone's menu sheet now honours `brand` (the `#brand` slot in Vue) too: it used to show the default atom badge whatever the app passed. `brand` is unchanged otherwise, still the full override, and wins over `logo` and `name`. To adopt: replace `brand={<img src="/logo.svg" alt="Acme" />}` (`<template #brand>` in Vue) with `logo="/logo.svg" name="Acme"`. Two things follow from `brand` reaching the sheet: a link inside `brand` (a home link around the logo) is now the sheet's first focusable element and takes the focus when it opens, and `brand` is rendered twice (the rail stays in the page, hidden, on a phone), so an `id` inside it appears twice while the sheet is open: drop ids from `brand`.
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [[`94a77a7`](https://github.com/softistx/nxgt-material/commit/94a77a76b54834bda18d1e2acc494d5a089d245d)]:
14
+ - @nxgt/material-core@0.12.0
15
+
16
+ ## 0.41.0
17
+
18
+ ### Minor Changes
19
+
20
+ - [#623](https://github.com/softistx/nxgt-material/pull/623) [`619cc13`](https://github.com/softistx/nxgt-material/commit/619cc13af84048938718a4c3a3bbca2b15ed6650) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Placeholders now read as placeholders ([#587](https://github.com/softistx/nxgt-material/issues/587)). `Select`/`SelectField`, `DateField`, `TimeField`, `DateRangeField` and `TreeSelectField` draw their empty state in the muted foreground, as a text input does, instead of the value's colour (still at least 4.5:1 in light and dark); Vue's `Autocomplete` input too. `OtpField` takes a `placeholder`: a format hint such as `"123456"`, one character per slot, drawn muted in the empty slots until the first character is typed (`InputOTP` takes it as well, and `InputOTPSlot` shows it).
21
+
22
+ - [#619](https://github.com/softistx/nxgt-material/pull/619) [`d281bc2`](https://github.com/softistx/nxgt-material/commit/d281bc26437dcd6902458523ff73a8db68aca5dd) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `RecoveryCodes` and `EnrolmentSecret` get the feedback, icons and QR margin a
23
+ sighted user and a themed app need:
24
+
25
+ - **Copy result visible** ([#558](https://github.com/softistx/nxgt-material/issues/558)): `RecoveryCodes` writes "Codes copied" or
26
+ "Copy failed. Download or print the codes instead." beside the buttons (it
27
+ stays a polite status region; a refusal stays until the next copy or action), and the copy button's icon turns into a check
28
+ or a cross for a moment. New `onCopy(result)` prop (Vue: `@copy`) with
29
+ `'copied' | 'failed'`, so the app can toast it. New label `copyFailedHint`
30
+ (English and French built in).
31
+ - **Replaceable icons** ([#559](https://github.com/softistx/nxgt-material/issues/559)): React `RecoveryCodes` takes `icons={{ copy,
32
+ download, print }}` and `EnrolmentSecret` takes `copyIcon`; Vue has the slots
33
+ `copy-icon`, `download-icon`, `print-icon` and, on `EnrolmentSecret`,
34
+ `copy-icon`. An app on Font Awesome through `<Icon>` no longer mixes in
35
+ Lucide.
36
+ - **QR quiet zone** ([#560](https://github.com/softistx/nxgt-material/issues/560)): `QRCode` takes `quietZone` (in modules) and
37
+ `EnrolmentSecret` takes `qrQuietZone`, default `4` as the QR spec asks, so
38
+ the margin follows the size and the density instead of a fixed `p-4`. It is
39
+ drawn inside the SVG (no inline `style`, so a strict CSP is untouched). The
40
+ QR tile of `EnrolmentSecret` is therefore a little wider or narrower than
41
+ before; `QRCode` alone is unchanged unless `quietZone` is set. React adds
42
+ `qrcode-generator` (already installed through `react-qr-code`) as a direct
43
+ dependency to draw the code with a quiet zone.
44
+
45
+ - [#617](https://github.com/softistx/nxgt-material/pull/617) [`9140735`](https://github.com/softistx/nxgt-material/commit/91407355cb9b5d95aed906c4a9f34f9072702aea) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Stepper` takes `orientation="responsive"` ([#517](https://github.com/softistx/nxgt-material/issues/517)): below `sm` (640px) every step is listed in a column, with the current one marked `aria-current="step"`, instead of the compact single-step bar; from `sm` the steps sit in a row. `'horizontal'` stays the default and renders as before.
46
+
47
+ ### Patch Changes
48
+
49
+ - [#616](https://github.com/softistx/nxgt-material/pull/616) [`5a0b2d4`](https://github.com/softistx/nxgt-material/commit/5a0b2d48c28f70aa9825d70b98f8ceab0b95a42c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - On a phone, a Banner action that is a `ghost` or `link` button (a `LinkButton` too) now starts at the text's edge ([#613](https://github.com/softistx/nxgt-material/issues/613)). It used to sit one button padding (about 16px) to the inline end of the text, because it has no fill or border to show its box. From `sm` up nothing changes. The React `Button` also renders `data-size`, as the Vue one already did.
50
+
51
+ - [#620](https://github.com/softistx/nxgt-material/pull/620) [`a693a0c`](https://github.com/softistx/nxgt-material/commit/a693a0c75b67491659f93e4cb70e40edb601605c) Thanks [@SteveGT96](https://github.com/SteveGT96)! - The sticky `[data-slot="form-actions"]` of a `.form-grid-layout` pads its bottom for the safe area (`max(1rem, env(safe-area-inset-bottom))`), so in an installed app with `viewport-fit=cover` it no longer sits under the home indicator ([#609](https://github.com/softistx/nxgt-material/issues/609)). The default clearance that keeps a tabbed-to field above the actions is now 8rem on a phone (6rem elsewhere), which covers actions whose label wraps over two lines plus a field's error line, and it grows with the safe-area inset. `--form-actions-clearance` still overrides it; an app that set 8rem for this can drop it.
52
+
53
+ - [#622](https://github.com/softistx/nxgt-material/pull/622) [`cb9b6c8`](https://github.com/softistx/nxgt-material/commit/cb9b6c859f2700be0303dd153ea750e87b69ffcb) Thanks [@SteveGT96](https://github.com/SteveGT96)! - `Button` and `IconButton` with `variant="ghost"` now honour `color` ([#610](https://github.com/softistx/nxgt-material/issues/610)): in `secondary`, `success`, `info`, `warning` or `error` the text (and icon) takes that colour, with a tint of it on hover, focus and press, at 4.5:1 on the page and on a card in both themes, as `link` does. In `primary` (the default), `default`, or with `color={null}`, a ghost button looks as before. What is drawn with the Button's classes follows: a ghost `Chip`, and an `AlertDialogAction` or `AlertDialogCancel` given `variant="ghost"` and a colour, now show it. So do the library's own ghost buttons that name a colour: `InlineEdit`'s save (success), and the remove or retry buttons of `FilterPresets`, `FileList` and the rich-text editor's repeating blocks (error).
54
+
55
+ In `@nxgt/material`, a `ConfirmDialog` (or any `AlertDialog`, `Dialog`, `Sheet` or `Drawer`) opened from a `DropdownMenuItem`, a submenu's included, now hands the focus back to the menu's trigger when it closes, instead of losing it to the page; `@nxgt/material-vue` already did, and now has stories that prove it.
56
+
57
+ - [#622](https://github.com/softistx/nxgt-material/pull/622) [`deb9af0`](https://github.com/softistx/nxgt-material/commit/deb9af08d4dcee4f03247a4687d8a4a80a180f73) Thanks [@SteveGT96](https://github.com/SteveGT96)! - A sorted `DataTable` column now says so ([#612](https://github.com/softistx/nxgt-material/issues/612)): its header cell carries `aria-sort="ascending"` or `"descending"` (none while unsorted, nor on a grouped header's placeholder), as the WAI-ARIA sortable table pattern has it. The `DataTableColumnHeader` button keeps its name, the column's title. In French the sort menu reads "Croissant" / "Décroissant" instead of "Asc" / "Desc"; a French test that clicked "Asc" needs "Croissant".
58
+
59
+ The troubleshooting guide explains axe's `target-size` on a control half under a form's sticky actions, and how to scan with the actions in the flow.
60
+
61
+ - [#620](https://github.com/softistx/nxgt-material/pull/620) [`505349a`](https://github.com/softistx/nxgt-material/commit/505349a572afedcc174c7956baf69ab9ee371c5e) Thanks [@SteveGT96](https://github.com/SteveGT96)! - A toast with an action no longer breaks its message in the middle of a word on desktop ([#515](https://github.com/softistx/nxgt-material/issues/515)). The title and description used `overflow-wrap: anywhere`, which let the text column shrink to a single character beside the action and the X; they now use `overflow-wrap: break-word`, so the column keeps the room of its longest word and the text wraps between words.
62
+
3
63
  ## 0.40.1
4
64
 
5
65
  ### Patch Changes
package/README.md CHANGED
@@ -323,7 +323,7 @@ Each area a consumer starts from has its own page under `docs/guides/`.
323
323
  | --- | --- |
324
324
  | [Forms](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/guides/forms.md) | wiring fields to vee-validate and Zod, composite values (contacts, opening hours), config-driven `Field`, server errors, what each field emits |
325
325
  | [i18n](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/guides/i18n.md) | adding your strings next to the package's, switching language, translated Zod messages, SSR without a text mismatch |
326
- | [App shell](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/guides/app-shell.md) | laying out an app with `ActivityLayout`, its `items` (rendered as links; `link-component` to pass your own), the active entry and breadcrumbs (vue-router), the `<main>` landmark, the `h1` title and document scrolling |
326
+ | [App shell](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/guides/app-shell.md) | laying out an app with `ActivityLayout`, its `items` (rendered as links; `link-component` to pass your own), the brand (`logo`, `name`), the header's title and `AccountMenu`, the active entry and breadcrumbs (vue-router), the `<main>` landmark, the `h1` title and document scrolling |
327
327
  | [Theming](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/guides/theming.md) | changing colours, radius or fonts, dark mode, using the compiled CSS without Tailwind |
328
328
  | [Printing](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/guides/printing.md) | printable documents built from the `Print*` components |
329
329
  | [PDF documents](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/guides/pdf.md) | PDF files from data with `@nxgt/material-vue/pdf`: builders, `usePdf`, `PdfDownloadButton`, a Nitro route with `pdfResponse`, fonts on an inlined server |
@@ -490,7 +490,7 @@ React-only for now: `StepperIndicator` ([roadmap](https://cdn.jsdelivr.net/npm/@
490
490
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/data-display-qrcode.webp" width="120" alt="QRCode"> | [`QRCode`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/data-display.md#qrcode) | QR code on a padded tile, with an optional centred logo in its `#logo` slot. | `QRCode` |
491
491
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/data-display-barecode.webp" width="120" alt="Barecode"> | [`Barecode`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/data-display.md#barecode) | 1D barcode. | `Barecode` |
492
492
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/data-display-enrolmentsecret.webp" width="120" alt="EnrolmentSecret"> | [`EnrolmentSecret`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/data-display.md#enrolmentsecret), `groupSecret` | A TOTP enrolment: the `otpauth://` QR code, the URI as a link to the authenticator app, and the key grouped by four, copyable, wrapping on a phone. | `EnrolmentSecret` |
493
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/data-display-recoverycodes.webp" width="120" alt="RecoveryCodes"> | [`RecoveryCodes`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/data-display.md#recoverycodes), `recoveryCodesText`, `downloadText` | One-time recovery codes: a list, copy (announced), download, print of the card alone, and an "I have saved these codes" confirmation before Done. | `RecoveryCodes` |
493
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/data-display-recoverycodes.webp" width="120" alt="RecoveryCodes"> | [`RecoveryCodes`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/data-display.md#recoverycodes), `recoveryCodesText`, `downloadText` | One-time recovery codes: a list, copy (its result shown and announced), download, print of the card alone, and an "I have saved these codes" confirmation before Done. | `RecoveryCodes` |
494
494
 
495
495
  ### Data table, filter & lists
496
496
 
@@ -509,6 +509,7 @@ React-only for now: `StepperIndicator` ([roadmap](https://cdn.jsdelivr.net/npm/@
509
509
  | Preview | Component | What it does | @nxgt/material |
510
510
  | --- | --- | --- | --- |
511
511
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/navigation-layout-appshell.webp" width="120" alt="ActivityLayout"> | [`ActivityLayout`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/navigation-and-layout.md#activitylayout), `ActivityContent`, `AppSidebar`, `AppHeader`, `AppBreadcrumb` | App shell: sidebar built from `items`, a header with a mobile sheet, route breadcrumbs and a titled page; entries are real links, and `link-component` swaps the link. See the [app shell guide](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/guides/app-shell.md). | `ActivityLayout`, `ActivityContent`, `AppSidebar`, `AppHeader`, `AppBreadcrumb` |
512
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/navigation-layout-accountmenu.webp" width="120" alt="AccountMenu"> | [`AccountMenu`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/navigation-and-layout.md#accountmenu) | The app bar's avatar menu: named after the account, the name and e-mail, the app's links, then a destructive Sign out with a busy state. | `AccountMenu` |
512
513
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/navigation-layout-authcard.webp" width="120" alt="AuthCard"> | [`AuthCard`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/navigation-and-layout.md#authcard) | The frame of a signed-out page: one `main`, a centred card whose title is the `h1` (focusable on an end state), a status or alert notice, a brand and toolbar row, safe-area padding. | `AuthCard` |
513
514
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/navigation-layout-sidebar.webp" width="120" alt="Sidebar"> | [`Sidebar`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/navigation-and-layout.md#sidebar), `SidebarHeader`, `SidebarContent`, `SidebarFooter`, `SidebarMenuItem`, `SidebarMenuLabel` | Collapsible navigation sidebar with icons, tooltips and active items. | `Sidebar` (same parts) |
514
515
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/previews/navigation-layout-topappbar.webp" width="120" alt="TopAppBar"> | [`TopAppBar`](https://cdn.jsdelivr.net/npm/@nxgt/material-vue@0/docs/components/navigation-and-layout.md#topappbar), `BottomAppBar` | Top bar surface, and a bottom bar of icon actions with an active state. | `TopAppBar`, `BottomAppBar` |
@@ -1,12 +1,12 @@
1
1
  import { t as e } from "./utils-CykWQ0iJ.js";
2
- import { t } from "./use-material-translation-DxU51--g.js";
3
- import { Comment as n, Fragment as r, Text as i, computed as a, createBlock as o, createElementBlock as s, createElementVNode as c, createTextVNode as l, createVNode as u, defineComponent as d, guardReactiveProps as f, h as p, inject as ee, isVNode as m, mergeProps as h, normalizeClass as g, normalizeProps as _, onBeforeUnmount as v, openBlock as y, provide as b, ref as x, renderSlot as S, shallowRef as C, unref as w, useAttrs as te, useSlots as ne, watch as T, withCtx as E } from "vue";
4
- import { Primitive as D, TooltipArrow as O, TooltipContent as k, TooltipPortal as A, TooltipProvider as re, TooltipRoot as j, TooltipTrigger as M, useForwardPropsEmits as N } from "reka-ui";
2
+ import { t } from "./use-material-translation-COoBTGpB.js";
3
+ import { Comment as n, Fragment as r, Text as i, computed as a, createBlock as o, createElementBlock as s, createElementVNode as c, createTextVNode as l, createVNode as u, defineComponent as d, guardReactiveProps as f, h as p, inject as ee, isVNode as m, mergeProps as h, normalizeClass as g, normalizeProps as _, onBeforeUnmount as v, openBlock as y, provide as te, ref as b, renderSlot as x, shallowRef as S, unref as C, useAttrs as ne, useSlots as w, watch as T, withCtx as E } from "vue";
4
+ import { Primitive as re, TooltipArrow as D, TooltipContent as O, TooltipPortal as k, TooltipProvider as A, TooltipRoot as j, TooltipTrigger as M, useForwardPropsEmits as N } from "reka-ui";
5
5
  import { cva as P } from "class-variance-authority";
6
- import { createSharedComposable as F, defaultDocument as I, reactiveOmit as ie, useEventListener as ae } from "@vueuse/core";
6
+ import { createSharedComposable as ie, defaultDocument as F, reactiveOmit as ae, useEventListener as oe } from "@vueuse/core";
7
7
  //#endregion
8
8
  //#region lib/components/ui/feedback/spinner/spinner.variants.ts
9
- var L = P("transition-all duration-500", {
9
+ var I = P("transition-all duration-500", {
10
10
  variants: {
11
11
  variant: {
12
12
  1: "",
@@ -191,11 +191,11 @@ var L = P("transition-all duration-500", {
191
191
  class: "stroke-white"
192
192
  }
193
193
  ]
194
- }), oe = [
194
+ }), se = [
195
195
  "data-variant",
196
196
  "data-color",
197
197
  "aria-label"
198
- ], se = ["data-variant", "data-color"], R = /* @__PURE__ */ d({
198
+ ], ce = ["data-variant", "data-color"], L = /* @__PURE__ */ d({
199
199
  __name: "spinner",
200
200
  props: {
201
201
  variant: { default: "1" },
@@ -218,10 +218,10 @@ var L = P("transition-all duration-500", {
218
218
  "data-color": n.color,
219
219
  xmlns: "http://www.w3.org/2000/svg",
220
220
  role: "img",
221
- "aria-label": w(i)("material.spinner.loading", "Loading..."),
222
- class: g(w(e)("size-14", r.class))
221
+ "aria-label": C(i)("material.spinner.loading", "Loading..."),
222
+ class: g(C(e)("size-14", r.class))
223
223
  }, [c("circle", {
224
- class: g(["spin2", w(L)({
224
+ class: g(["spin2", C(I)({
225
225
  variant: n.variant,
226
226
  color: n.color
227
227
  })]),
@@ -232,18 +232,18 @@ var L = P("transition-all duration-500", {
232
232
  "stroke-width": "50",
233
233
  "stroke-dasharray": "700 1400",
234
234
  "stroke-linecap": "round"
235
- }, null, 2)], 10, oe)) : (y(), s("div", {
235
+ }, null, 2)], 10, se)) : (y(), s("div", {
236
236
  key: 1,
237
237
  "data-slot": "spinner",
238
238
  "data-variant": n.variant,
239
239
  "data-color": n.color,
240
- class: g(w(e)("size-12 border-[2px] rounded-full animate-spin", w(L)({
240
+ class: g(C(e)("size-12 border-[2px] rounded-full animate-spin", C(I)({
241
241
  variant: n.variant,
242
242
  color: n.color
243
243
  }), r.class))
244
- }, null, 10, se));
244
+ }, null, 10, ce));
245
245
  }
246
- }), z = /* @__PURE__ */ d({
246
+ }), R = /* @__PURE__ */ d({
247
247
  __name: "Tooltip",
248
248
  props: {
249
249
  defaultOpen: { type: Boolean },
@@ -257,28 +257,28 @@ var L = P("transition-all duration-500", {
257
257
  emits: ["update:open"],
258
258
  setup(e, { emit: t }) {
259
259
  let n = N(e, t);
260
- return (e, t) => (y(), o(w(j), h({ "data-slot": "tooltip" }, w(n)), {
261
- default: E((t) => [S(e.$slots, "default", _(f(t)))]),
260
+ return (e, t) => (y(), o(C(j), h({ "data-slot": "tooltip" }, C(n)), {
261
+ default: E((t) => [x(e.$slots, "default", _(f(t)))]),
262
262
  _: 3
263
263
  }, 16));
264
264
  }
265
- }), B = /* @__PURE__ */ new Set([
265
+ }), z = /* @__PURE__ */ new Set([
266
266
  "VIDEO",
267
267
  "IFRAME",
268
268
  "CANVAS",
269
269
  "IMG",
270
270
  "EMBED"
271
271
  ]);
272
- function V(e) {
272
+ function B(e) {
273
273
  let t = e?.fullscreenElement;
274
- return !t || typeof HTMLElement > "u" || !(t instanceof HTMLElement) || B.has(t.tagName) ? null : t;
274
+ return !t || typeof HTMLElement > "u" || !(t instanceof HTMLElement) || z.has(t.tagName) ? null : t;
275
275
  }
276
- var H = F(() => {
277
- let e = C(V(I));
278
- return ae(I, "fullscreenchange", () => {
279
- e.value = V(I);
276
+ var V = ie(() => {
277
+ let e = S(B(F));
278
+ return oe(F, "fullscreenchange", () => {
279
+ e.value = B(F);
280
280
  }), e;
281
- }), U = /* @__PURE__ */ d({
281
+ }), H = /* @__PURE__ */ d({
282
282
  inheritAttrs: !1,
283
283
  __name: "TooltipContent",
284
284
  props: {
@@ -309,19 +309,19 @@ var H = F(() => {
309
309
  },
310
310
  emits: ["escapeKeyDown", "pointerDownOutside"],
311
311
  setup(t, { emit: n }) {
312
- let r = t, i = n, a = H(), s = N(ie(r, "class", "to"), i);
313
- return (n, i) => (y(), o(w(A), { to: t.to ?? w(a) ?? void 0 }, {
314
- default: E(() => [u(w(k), h({ "data-slot": "tooltip-content" }, {
315
- ...w(s),
312
+ let r = t, i = n, a = V(), s = N(ae(r, "class", "to"), i);
313
+ return (n, i) => (y(), o(C(k), { to: t.to ?? C(a) ?? void 0 }, {
314
+ default: E(() => [u(C(O), h({ "data-slot": "tooltip-content" }, {
315
+ ...C(s),
316
316
  ...n.$attrs
317
- }, { class: w(e)("bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance", r.class) }), {
318
- default: E(() => [S(n.$slots, "default"), u(w(O), { class: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-xs" })]),
317
+ }, { class: C(e)("bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance", r.class) }), {
318
+ default: E(() => [x(n.$slots, "default"), u(C(D), { class: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-xs" })]),
319
319
  _: 3
320
320
  }, 16, ["class"])]),
321
321
  _: 3
322
322
  }, 8, ["to"]));
323
323
  }
324
- }), W = /* @__PURE__ */ d({
324
+ }), U = /* @__PURE__ */ d({
325
325
  __name: "TooltipProvider",
326
326
  props: {
327
327
  delayDuration: { default: 0 },
@@ -334,12 +334,12 @@ var H = F(() => {
334
334
  },
335
335
  setup(e) {
336
336
  let t = e;
337
- return (e, n) => (y(), o(w(re), _(f(t)), {
338
- default: E(() => [S(e.$slots, "default")]),
337
+ return (e, n) => (y(), o(C(A), _(f(t)), {
338
+ default: E(() => [x(e.$slots, "default")]),
339
339
  _: 3
340
340
  }, 16));
341
341
  }
342
- }), G = /* @__PURE__ */ d({
342
+ }), W = /* @__PURE__ */ d({
343
343
  __name: "TooltipTrigger",
344
344
  props: {
345
345
  reference: {},
@@ -348,12 +348,12 @@ var H = F(() => {
348
348
  },
349
349
  setup(e) {
350
350
  let t = e;
351
- return (e, n) => (y(), o(w(M), h({ "data-slot": "tooltip-trigger" }, t), {
352
- default: E(() => [S(e.$slots, "default")]),
351
+ return (e, n) => (y(), o(C(M), h({ "data-slot": "tooltip-trigger" }, t), {
352
+ default: E(() => [x(e.$slots, "default")]),
353
353
  _: 3
354
354
  }, 16));
355
355
  }
356
- }), K = Symbol("named-control"), q = {
356
+ }), G = Symbol("named-control"), K = {
357
357
  primary: "text-primary dark:text-[color-mix(in_oklab,var(--color-primary)_40%,white)]",
358
358
  secondary: "text-secondary",
359
359
  success: "text-success dark:text-[color-mix(in_oklab,var(--color-success)_85%,white)]",
@@ -361,7 +361,7 @@ var H = F(() => {
361
361
  warning: "text-[color-mix(in_oklab,var(--color-warning)_85%,black)] dark:text-[color-mix(in_oklab,var(--color-warning)_85%,white)]",
362
362
  error: "text-[color-mix(in_oklab,var(--color-error)_85%,black)] dark:text-[color-mix(in_oklab,var(--color-error)_70%,white)]",
363
363
  default: "text-foreground"
364
- }, J = {
364
+ }, q = {
365
365
  primary: "[&_svg]:data-[slot=icon]:text-primary dark:[&_svg]:data-[slot=icon]:text-[color-mix(in_oklab,var(--color-primary)_40%,white)]",
366
366
  secondary: "[&_svg]:data-[slot=icon]:text-secondary",
367
367
  success: "[&_svg]:data-[slot=icon]:text-success dark:[&_svg]:data-[slot=icon]:text-[color-mix(in_oklab,var(--color-success)_85%,white)]",
@@ -369,7 +369,7 @@ var H = F(() => {
369
369
  warning: "[&_svg]:data-[slot=icon]:text-[color-mix(in_oklab,var(--color-warning)_85%,black)] dark:[&_svg]:data-[slot=icon]:text-[color-mix(in_oklab,var(--color-warning)_85%,white)]",
370
370
  error: "[&_svg]:data-[slot=icon]:text-[color-mix(in_oklab,var(--color-error)_85%,black)] dark:[&_svg]:data-[slot=icon]:text-[color-mix(in_oklab,var(--color-error)_70%,white)]",
371
371
  default: "[&_svg]:data-[slot=icon]:text-foreground"
372
- }, ce = {
372
+ }, le = {
373
373
  primary: "[&_svg]:stroke-primary dark:[&_svg]:stroke-[color-mix(in_oklab,var(--color-primary)_40%,white)]",
374
374
  secondary: "[&_svg]:stroke-secondary",
375
375
  success: "[&_svg]:stroke-success dark:[&_svg]:stroke-[color-mix(in_oklab,var(--color-success)_85%,white)]",
@@ -377,12 +377,12 @@ var H = F(() => {
377
377
  warning: "[&_svg]:stroke-[color-mix(in_oklab,var(--color-warning)_85%,black)] dark:[&_svg]:stroke-[color-mix(in_oklab,var(--color-warning)_85%,white)]",
378
378
  error: "[&_svg]:stroke-[color-mix(in_oklab,var(--color-error)_85%,black)] dark:[&_svg]:stroke-[color-mix(in_oklab,var(--color-error)_70%,white)]",
379
379
  default: "[&_svg]:stroke-foreground"
380
- }, Y = P("inline-flex center truncate **:truncate gap-2 h-min cursor-pointer whitespace-nowrap rounded-full text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 aria-busy:cursor-progress [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-error/20 dark:aria-invalid:ring-error/40 aria-invalid:border-error px-4 py-2 has-[>svg]:px-3", {
380
+ }, ue = P("inline-flex center truncate **:truncate gap-2 h-min cursor-pointer whitespace-nowrap rounded-full text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 aria-busy:cursor-progress [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-error/20 dark:aria-invalid:ring-error/40 aria-invalid:border-error px-4 py-2 has-[>svg]:px-3", {
381
381
  variants: {
382
382
  variant: {
383
383
  filled: "shadow-xs",
384
384
  tonal: "shadow-xs",
385
- ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
385
+ ghost: "",
386
386
  outlined: "border shadow-xs",
387
387
  link: "focus:underline underline-offset-4 hover:underline"
388
388
  },
@@ -449,134 +449,172 @@ var H = F(() => {
449
449
  {
450
450
  variant: "tonal",
451
451
  color: "primary",
452
- class: `${q.primary} ${J.primary} bg-primary/15 hover:bg-primary/10 active:bg-primary/5 focus:bg-primary/10`
452
+ class: `${K.primary} ${q.primary} bg-primary/15 hover:bg-primary/10 active:bg-primary/5 focus:bg-primary/10`
453
453
  },
454
454
  {
455
455
  variant: "tonal",
456
456
  color: "secondary",
457
- class: `${q.secondary} ${J.secondary} bg-secondary/15 hover:bg-secondary/10 active:bg-secondary/5 focus:bg-secondary/10`
457
+ class: `${K.secondary} ${q.secondary} bg-secondary/15 hover:bg-secondary/10 active:bg-secondary/5 focus:bg-secondary/10`
458
458
  },
459
459
  {
460
460
  variant: "tonal",
461
461
  color: "info",
462
- class: `${q.info} ${J.info} bg-info/15 hover:bg-info/10 active:bg-info/5 focus:bg-info/10`
462
+ class: `${K.info} ${q.info} bg-info/15 hover:bg-info/10 active:bg-info/5 focus:bg-info/10`
463
463
  },
464
464
  {
465
465
  variant: "tonal",
466
466
  color: "success",
467
- class: `${q.success} ${J.success} bg-success/15 hover:bg-success/10 active:bg-success/5 focus:bg-success/10`
467
+ class: `${K.success} ${q.success} bg-success/15 hover:bg-success/10 active:bg-success/5 focus:bg-success/10`
468
468
  },
469
469
  {
470
470
  variant: "tonal",
471
471
  color: "warning",
472
- class: `${q.warning} ${J.warning} bg-warning/15 hover:bg-warning/10 active:bg-warning/5 focus:bg-warning/10`
472
+ class: `${K.warning} ${q.warning} bg-warning/15 hover:bg-warning/10 active:bg-warning/5 focus:bg-warning/10`
473
473
  },
474
474
  {
475
475
  variant: "tonal",
476
476
  color: "error",
477
- class: `${q.error} ${J.error} bg-error/15 hover:bg-error/10 active:bg-error/5 focus:bg-error/10`
477
+ class: `${K.error} ${q.error} bg-error/15 hover:bg-error/10 active:bg-error/5 focus:bg-error/10`
478
478
  },
479
479
  {
480
480
  variant: "tonal",
481
481
  color: "default",
482
- class: `${q.default} ${J.default} bg-foreground/15 hover:bg-foreground/10 active:bg-muted focus:bg-muted`
482
+ class: `${K.default} ${q.default} bg-foreground/15 hover:bg-foreground/10 active:bg-muted focus:bg-muted`
483
+ },
484
+ {
485
+ variant: "ghost",
486
+ color: "primary",
487
+ class: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50"
488
+ },
489
+ {
490
+ variant: "ghost",
491
+ color: "default",
492
+ class: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50"
493
+ },
494
+ {
495
+ variant: "ghost",
496
+ color: "secondary",
497
+ class: `${K.secondary} ${q.secondary} hover:bg-secondary/10 active:bg-secondary/5 focus:bg-secondary/15`
498
+ },
499
+ {
500
+ variant: "ghost",
501
+ color: "success",
502
+ class: `${K.success} ${q.success} hover:bg-success/10 active:bg-success/5 focus:bg-success/15`
503
+ },
504
+ {
505
+ variant: "ghost",
506
+ color: "info",
507
+ class: `${K.info} ${q.info} hover:bg-info/10 active:bg-info/5 focus:bg-info/15`
508
+ },
509
+ {
510
+ variant: "ghost",
511
+ color: "warning",
512
+ class: `${K.warning} ${q.warning} hover:bg-warning/10 active:bg-warning/5 focus:bg-warning/15`
513
+ },
514
+ {
515
+ variant: "ghost",
516
+ color: "error",
517
+ class: `${K.error} ${q.error} hover:bg-error/10 active:bg-error/5 focus:bg-error/15`
483
518
  },
484
519
  {
485
520
  variant: "outlined",
486
521
  color: "primary",
487
- class: `${q.primary} ${J.primary} border-primary/50 focus:bg-primary/15 hover:bg-primary/10`
522
+ class: `${K.primary} ${q.primary} border-primary/50 focus:bg-primary/15 hover:bg-primary/10`
488
523
  },
489
524
  {
490
525
  variant: "outlined",
491
526
  color: "secondary",
492
- class: `${q.secondary} ${J.secondary} border-secondary/50 focus:bg-secondary/15 hover:bg-secondary/10`
527
+ class: `${K.secondary} ${q.secondary} border-secondary/50 focus:bg-secondary/15 hover:bg-secondary/10`
493
528
  },
494
529
  {
495
530
  variant: "outlined",
496
531
  color: "info",
497
- class: `${q.info} ${J.info} border-info/50 focus:bg-info/15 hover:bg-info/10`
532
+ class: `${K.info} ${q.info} border-info/50 focus:bg-info/15 hover:bg-info/10`
498
533
  },
499
534
  {
500
535
  variant: "outlined",
501
536
  color: "success",
502
- class: `${q.success} ${J.success} border-success/50 focus:bg-success/15 hover:bg-success/10`
537
+ class: `${K.success} ${q.success} border-success/50 focus:bg-success/15 hover:bg-success/10`
503
538
  },
504
539
  {
505
540
  variant: "outlined",
506
541
  color: "warning",
507
- class: `${q.warning} ${J.warning} border-warning/50 focus:bg-warning/15 hover:bg-warning/10`
542
+ class: `${K.warning} ${q.warning} border-warning/50 focus:bg-warning/15 hover:bg-warning/10`
508
543
  },
509
544
  {
510
545
  variant: "outlined",
511
546
  color: "error",
512
- class: `${q.error} ${J.error} border-error/50 focus:bg-error/15 hover:bg-error/10`
547
+ class: `${K.error} ${q.error} border-error/50 focus:bg-error/15 hover:bg-error/10`
513
548
  },
514
549
  {
515
550
  variant: "outlined",
516
551
  color: "default",
517
- class: `${q.default} ${J.default} border-foreground/50 focus:bg-foreground/15 hover:bg-foreground/10`
552
+ class: `${K.default} ${q.default} border-foreground/50 focus:bg-foreground/15 hover:bg-foreground/10`
518
553
  },
519
554
  {
520
555
  variant: "link",
521
556
  color: "primary",
522
- class: `${q.primary} ${J.primary} hover:bg-primary/10 active:bg-primary/5 focus:bg-primary/15`
557
+ class: `${K.primary} ${q.primary} hover:bg-primary/10 active:bg-primary/5 focus:bg-primary/15`
523
558
  },
524
559
  {
525
560
  variant: "link",
526
561
  color: "secondary",
527
- class: `${q.secondary} ${J.secondary} hover:bg-secondary/10 active:bg-secondary/5 focus:bg-secondary/15`
562
+ class: `${K.secondary} ${q.secondary} hover:bg-secondary/10 active:bg-secondary/5 focus:bg-secondary/15`
528
563
  },
529
564
  {
530
565
  variant: "link",
531
566
  color: "success",
532
- class: `${q.success} ${J.success} hover:bg-success/10 active:bg-success/5 focus:bg-success/15`
567
+ class: `${K.success} ${q.success} hover:bg-success/10 active:bg-success/5 focus:bg-success/15`
533
568
  },
534
569
  {
535
570
  variant: "link",
536
571
  color: "info",
537
- class: `${q.info} ${J.info} hover:bg-info/10 active:bg-info/5 focus:bg-info/15`
572
+ class: `${K.info} ${q.info} hover:bg-info/10 active:bg-info/5 focus:bg-info/15`
538
573
  },
539
574
  {
540
575
  variant: "link",
541
576
  color: "warning",
542
- class: `${q.warning} ${J.warning} hover:bg-warning/10 active:bg-warning/5 focus:bg-warning/15`
577
+ class: `${K.warning} ${q.warning} hover:bg-warning/10 active:bg-warning/5 focus:bg-warning/15`
543
578
  },
544
579
  {
545
580
  variant: "link",
546
581
  color: "error",
547
- class: `${q.error} ${J.error} hover:bg-error/10 active:bg-error/5 focus:bg-error/15`
582
+ class: `${K.error} ${q.error} hover:bg-error/10 active:bg-error/5 focus:bg-error/15`
548
583
  },
549
584
  {
550
585
  variant: "link",
551
586
  color: "default",
552
- class: `${q.default} ${J.default} hover:bg-foreground/10 active:bg-muted focus:bg-foreground/15`
587
+ class: `${K.default} ${q.default} hover:bg-foreground/10 active:bg-muted focus:bg-foreground/15`
553
588
  }
554
589
  ]
555
- }), le = {
590
+ }), J = ((e) => ue(e?.variant === "ghost" && e.color === null ? {
591
+ ...e,
592
+ color: void 0
593
+ } : e)), de = {
556
594
  xs: "min-h-6",
557
595
  sm: "min-h-8",
558
596
  default: "min-h-9",
559
597
  lg: "min-h-10"
560
598
  };
561
- function ue(e, t) {
562
- return !e || t?.startsWith("icon") ? !1 : `h-auto ${t ? le[t] : ""} whitespace-normal **:whitespace-normal text-center`;
599
+ function fe(e, t) {
600
+ return !e || t?.startsWith("icon") ? !1 : `h-auto ${t ? de[t] : ""} whitespace-normal **:whitespace-normal text-center`;
563
601
  }
564
602
  //#endregion
565
603
  //#region lib/components/ui/actions/button/has-text-content.ts
566
- function X(e) {
604
+ function Y(e) {
567
605
  if (e == null || typeof e == "boolean") return !1;
568
606
  if (typeof e == "string" || typeof e == "number") return String(e).trim() !== "";
569
- if (Array.isArray(e)) return e.some(X);
607
+ if (Array.isArray(e)) return e.some(Y);
570
608
  if (!m(e) || e.type === n) return !1;
571
609
  if (e.type === i) return String(e.children ?? "").trim() !== "";
572
- if (de(e.props?.["aria-hidden"] ?? e.props?.ariaHidden)) return !1;
610
+ if (X(e.props?.["aria-hidden"] ?? e.props?.ariaHidden)) return !1;
573
611
  let { children: t } = e;
574
612
  if (typeof t == "string") return t.trim() !== "";
575
- if (Array.isArray(t)) return X(t);
613
+ if (Array.isArray(t)) return Y(t);
576
614
  let r = t?.default;
577
- return typeof r == "function" && X(r());
615
+ return typeof r == "function" && Y(r());
578
616
  }
579
- function de(e) {
617
+ function X(e) {
580
618
  return e === "" || !!e && e !== "false";
581
619
  }
582
620
  //#endregion
@@ -595,7 +633,7 @@ function Z(e) {
595
633
  }
596
634
  return a(), t;
597
635
  }
598
- var fe = (e, { slots: t }) => Z(t.default?.() ?? []), Q = (e) => e.flatMap((e) => e.type === r && Array.isArray(e.children) ? Q(e.children) : [e]), $ = (e, { attrs: t, slots: r }) => {
636
+ var pe = (e, { slots: t }) => Z(t.default?.() ?? []), Q = (e) => e.flatMap((e) => e.type === r && Array.isArray(e.children) ? Q(e.children) : [e]), $ = (e, { attrs: t, slots: r }) => {
599
637
  let i = Q(r.default?.() ?? []), a = i.find((e) => e.type !== n);
600
638
  if (!a) return i;
601
639
  let o = h(t, a.props ?? {});
@@ -616,16 +654,16 @@ var fe = (e, { slots: t }) => Z(t.default?.() ?? []), Q = (e) => e.flatMap((e) =
616
654
  $.props = ["leading"], $.inheritAttrs = !1;
617
655
  //#endregion
618
656
  //#region lib/components/ui/actions/button/use-click-lock.ts
619
- var pe = 1e3;
620
- function me(e, t) {
621
- let n = x(!1), r = !1, i;
657
+ var me = 1e3;
658
+ function he(e, t) {
659
+ let n = b(!1), r = !1, i;
622
660
  function a() {
623
661
  n.value = !1, r = !1, clearTimeout(i);
624
662
  }
625
663
  function o() {
626
664
  e() && (n.value = !0, clearTimeout(i), i = setTimeout(() => {
627
665
  r || a();
628
- }, pe));
666
+ }, me));
629
667
  }
630
668
  return T(t, (e) => {
631
669
  n.value && (e ? r = !0 : r && a());
@@ -636,7 +674,7 @@ function me(e, t) {
636
674
  }
637
675
  //#endregion
638
676
  //#region lib/components/ui/actions/button/Button.vue
639
- var he = /* @__PURE__ */ d({
677
+ var ge = /* @__PURE__ */ d({
640
678
  inheritAttrs: !1,
641
679
  __name: "Button",
642
680
  props: {
@@ -660,9 +698,9 @@ var he = /* @__PURE__ */ d({
660
698
  tooltip: {}
661
699
  },
662
700
  setup(t) {
663
- let n = t, i = te(), c = ne(), l = ee(K, void 0);
664
- b(K, a(() => !!l?.value || !!(i["aria-label"] || i["aria-labelledby"]) || X(c.default?.())));
665
- let d = me(() => n.lockOnClick, () => !!n.loading), f = a(() => !!(n.loading || d.locked.value)), m = (e) => f.value || i[e];
701
+ let n = t, i = ne(), c = w(), l = ee(G, void 0);
702
+ te(G, a(() => !!l?.value || !!(i["aria-label"] || i["aria-labelledby"]) || Y(c.default?.())));
703
+ let d = he(() => n.lockOnClick, () => !!n.loading), f = a(() => !!(n.loading || d.locked.value)), m = (e) => f.value || i[e];
666
704
  function g(e) {
667
705
  if (f.value) {
668
706
  e.preventDefault(), e.stopImmediatePropagation();
@@ -670,19 +708,19 @@ var he = /* @__PURE__ */ d({
670
708
  }
671
709
  d.lock();
672
710
  }
673
- let _ = () => p(R, {
711
+ let _ = () => p(L, {
674
712
  variant: n.spinnerVariant,
675
713
  color: n.variant === "filled" ? "light" : n.color,
676
714
  class: e("starting:scale-0 duration-500", n.spinnerVariant === "4" ? "size-7.5" : "size-4.5")
677
- }), v = () => f.value ? _() : null, x = (e, { slots: t }) => e.text ? p(W, () => p(z, () => [p(G, { asChild: !0 }, t.default), p(U, () => e.text)])) : t.default?.()[0];
678
- x.props = ["text"];
679
- let C = a(() => n.as !== "button" || n.asChild ? i.type : i.type ?? "button"), T = a(() => !!n.size?.startsWith("icon")), O = a(() => e("justify-center duration-500", !T.value && "w-fit max-w-full truncate line-clamp-1 text-ellipsis", Y({
715
+ }), v = () => f.value ? _() : null, b = (e, { slots: t }) => e.text ? p(U, () => p(R, () => [p(W, { asChild: !0 }, t.default), p(H, () => e.text)])) : t.default?.()[0];
716
+ b.props = ["text"];
717
+ let S = a(() => n.as !== "button" || n.asChild ? i.type : i.type ?? "button"), T = a(() => !!n.size?.startsWith("icon")), D = a(() => e("justify-center duration-500", !T.value && "w-fit max-w-full truncate line-clamp-1 text-ellipsis", J({
680
718
  variant: n.variant,
681
719
  color: n.color,
682
720
  size: n.size
683
- }), ue(n.wrap, n.size), n.class));
684
- return (e, n) => (y(), o(x, { text: t.tooltip }, {
685
- default: E(() => [u(w(D), h(e.$attrs, {
721
+ }), fe(n.wrap, n.size), n.class));
722
+ return (e, n) => (y(), o(b, { text: t.tooltip }, {
723
+ default: E(() => [u(C(re), h(e.$attrs, {
686
724
  onClickCapture: g,
687
725
  "data-slot": e.$attrs["data-slot"] ?? "button",
688
726
  "data-variant": t.variant,
@@ -690,20 +728,20 @@ var he = /* @__PURE__ */ d({
690
728
  "data-size": t.size,
691
729
  as: t.as,
692
730
  "as-child": t.asChild,
693
- type: C.value,
731
+ type: S.value,
694
732
  disabled: t.disabled,
695
733
  "aria-disabled": m("aria-disabled"),
696
734
  "aria-busy": m("aria-busy"),
697
- class: O.value
735
+ class: D.value
698
736
  }), {
699
- default: E(() => [t.asChild ? (y(), o(w($), {
737
+ default: E(() => [t.asChild ? (y(), o(C($), {
700
738
  key: 0,
701
739
  leading: f.value ? _() : null
702
740
  }, {
703
- default: E(() => [S(e.$slots, "default")]),
741
+ default: E(() => [x(e.$slots, "default")]),
704
742
  _: 3
705
- }, 8, ["leading"])) : (y(), s(r, { key: 1 }, [u(v), u(w(fe), null, {
706
- default: E(() => [S(e.$slots, "default")]),
743
+ }, 8, ["leading"])) : (y(), s(r, { key: 1 }, [u(v), u(C(pe), null, {
744
+ default: E(() => [x(e.$slots, "default")]),
707
745
  _: 3
708
746
  })], 64))]),
709
747
  _: 3
@@ -725,4 +763,4 @@ var he = /* @__PURE__ */ d({
725
763
  }
726
764
  });
727
765
  //#endregion
728
- export { J as a, K as c, U as d, H as f, L as h, Y as i, G as l, R as m, $ as n, ce as o, z as p, X as r, q as s, he as t, W as u };
766
+ export { q as a, G as c, H as d, V as f, I as h, J as i, W as l, L as m, $ as n, le as o, R as p, Y as r, K as s, ge as t, U as u };
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-CykWQ0iJ.js";
2
- import { t } from "./use-material-translation-DxU51--g.js";
3
- import { t as n } from "./Button-teS2p_af.js";
2
+ import { t } from "./use-material-translation-COoBTGpB.js";
3
+ import { t as n } from "./Button-CWmzvv9p.js";
4
4
  import { r, t as i } from "./in-dialog-Blhwwbyb.js";
5
5
  import { t as a } from "./field-name-attribute-Bl7LSVK0.js";
6
6
  import { computed as o, createBlock as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createTextVNode as d, createVNode as f, defineComponent as p, getCurrentInstance as m, guardReactiveProps as h, isRef as g, mergeProps as _, normalizeClass as v, normalizeProps as y, onMounted as ee, onUpdated as b, openBlock as x, renderSlot as S, toDisplayString as C, unref as w, useAttrs as T, useId as E, useTemplateRef as D, vModelText as O, withCtx as k, withDirectives as A } from "vue";