@nuxt/ui 3.0.2 → 3.1.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 (221) hide show
  1. package/.nuxt/ui/accordion.ts +2 -2
  2. package/.nuxt/ui/alert.ts +29 -29
  3. package/.nuxt/ui/avatar-group.ts +1 -1
  4. package/.nuxt/ui/avatar.ts +3 -3
  5. package/.nuxt/ui/badge.ts +33 -33
  6. package/.nuxt/ui/breadcrumb.ts +5 -5
  7. package/.nuxt/ui/button.ts +43 -43
  8. package/.nuxt/ui/calendar.ts +17 -17
  9. package/.nuxt/ui/card.ts +5 -5
  10. package/.nuxt/ui/carousel.ts +6 -6
  11. package/.nuxt/ui/checkbox-group.ts +61 -0
  12. package/.nuxt/ui/checkbox.ts +140 -27
  13. package/.nuxt/ui/chip.ts +8 -8
  14. package/.nuxt/ui/color-picker.ts +3 -3
  15. package/.nuxt/ui/command-palette.ts +14 -14
  16. package/.nuxt/ui/context-menu.ts +33 -33
  17. package/.nuxt/ui/drawer.ts +10 -10
  18. package/.nuxt/ui/dropdown-menu.ts +34 -34
  19. package/.nuxt/ui/form-field.ts +6 -6
  20. package/.nuxt/ui/index.ts +1 -0
  21. package/.nuxt/ui/input-menu.ts +42 -42
  22. package/.nuxt/ui/input-number.ts +20 -20
  23. package/.nuxt/ui/input.ts +23 -23
  24. package/.nuxt/ui/kbd.ts +4 -4
  25. package/.nuxt/ui/link.ts +3 -3
  26. package/.nuxt/ui/modal.ts +5 -5
  27. package/.nuxt/ui/navigation-menu.ts +78 -80
  28. package/.nuxt/ui/pin-input.ts +20 -20
  29. package/.nuxt/ui/popover.ts +2 -2
  30. package/.nuxt/ui/progress.ts +17 -17
  31. package/.nuxt/ui/radio-group.ts +250 -35
  32. package/.nuxt/ui/select-menu.ts +36 -33
  33. package/.nuxt/ui/select.ts +32 -32
  34. package/.nuxt/ui/separator.ts +8 -8
  35. package/.nuxt/ui/skeleton.ts +1 -1
  36. package/.nuxt/ui/slideover.ts +4 -4
  37. package/.nuxt/ui/slider.ts +16 -16
  38. package/.nuxt/ui/stepper.ts +18 -18
  39. package/.nuxt/ui/switch.ts +20 -20
  40. package/.nuxt/ui/table.ts +15 -15
  41. package/.nuxt/ui/tabs.ts +32 -32
  42. package/.nuxt/ui/textarea.ts +40 -35
  43. package/.nuxt/ui/toast.ts +24 -24
  44. package/.nuxt/ui/tooltip.ts +2 -2
  45. package/.nuxt/ui/tree.ts +18 -18
  46. package/.nuxt/ui.css +63 -12
  47. package/README.md +15 -0
  48. package/cli/templates.mjs +18 -17
  49. package/dist/module.json +5 -5
  50. package/dist/module.mjs +12 -7
  51. package/dist/runtime/components/Accordion.vue +36 -93
  52. package/dist/runtime/components/Accordion.vue.d.ts +75 -0
  53. package/dist/runtime/components/Alert.vue +37 -100
  54. package/dist/runtime/components/Alert.vue.d.ts +81 -0
  55. package/dist/runtime/components/App.vue +28 -34
  56. package/dist/runtime/components/App.vue.d.ts +24 -0
  57. package/dist/runtime/components/Avatar.vue +42 -75
  58. package/dist/runtime/components/Avatar.vue.d.ts +39 -0
  59. package/dist/runtime/components/AvatarGroup.vue +40 -77
  60. package/dist/runtime/components/AvatarGroup.vue.d.ts +31 -0
  61. package/dist/runtime/components/Badge.vue +33 -62
  62. package/dist/runtime/components/Badge.vue.d.ts +41 -0
  63. package/dist/runtime/components/Breadcrumb.vue +37 -90
  64. package/dist/runtime/components/Breadcrumb.vue.d.ts +64 -0
  65. package/dist/runtime/components/Button.vue +95 -104
  66. package/dist/runtime/components/Button.vue.d.ts +48 -0
  67. package/dist/runtime/components/ButtonGroup.vue +20 -46
  68. package/dist/runtime/components/ButtonGroup.vue.d.ts +34 -0
  69. package/dist/runtime/components/Calendar.vue +67 -150
  70. package/dist/runtime/components/Calendar.vue.d.ts +111 -0
  71. package/dist/runtime/components/Card.vue +18 -40
  72. package/dist/runtime/components/Card.vue.d.ts +29 -0
  73. package/dist/runtime/components/Carousel.vue +112 -234
  74. package/dist/runtime/components/Carousel.vue.d.ts +122 -0
  75. package/dist/runtime/components/Checkbox.vue +52 -93
  76. package/dist/runtime/components/Checkbox.vue.d.ts +73 -0
  77. package/dist/runtime/components/CheckboxGroup.vue +121 -0
  78. package/dist/runtime/components/CheckboxGroup.vue.d.ts +78 -0
  79. package/dist/runtime/components/Chip.vue +26 -69
  80. package/dist/runtime/components/Chip.vue.d.ts +57 -0
  81. package/dist/runtime/components/Collapsible.vue +22 -41
  82. package/dist/runtime/components/Collapsible.vue.d.ts +35 -0
  83. package/dist/runtime/components/ColorPicker.vue +111 -197
  84. package/dist/runtime/components/ColorPicker.vue.d.ts +48 -0
  85. package/dist/runtime/components/CommandPalette.vue +96 -237
  86. package/dist/runtime/components/CommandPalette.vue.d.ts +161 -0
  87. package/dist/runtime/components/Container.vue +15 -28
  88. package/dist/runtime/components/Container.vue.d.ts +18 -0
  89. package/dist/runtime/components/ContextMenu.vue +34 -133
  90. package/dist/runtime/components/ContextMenu.vue.d.ts +107 -0
  91. package/dist/runtime/components/ContextMenuContent.vue +73 -81
  92. package/dist/runtime/components/ContextMenuContent.vue.d.ts +65 -0
  93. package/dist/runtime/components/Drawer.vue +49 -83
  94. package/dist/runtime/components/Drawer.vue.d.ts +78 -0
  95. package/dist/runtime/components/DropdownMenu.vue +39 -142
  96. package/dist/runtime/components/DropdownMenu.vue.d.ts +117 -0
  97. package/dist/runtime/components/DropdownMenuContent.vue +78 -88
  98. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +68 -0
  99. package/dist/runtime/components/Form.vue +135 -220
  100. package/dist/runtime/components/Form.vue.d.ts +69 -0
  101. package/dist/runtime/components/FormField.vue +35 -77
  102. package/dist/runtime/components/FormField.vue.d.ts +61 -0
  103. package/dist/runtime/components/Icon.vue +12 -19
  104. package/dist/runtime/components/Icon.vue.d.ts +8 -0
  105. package/dist/runtime/components/Input.vue +82 -140
  106. package/dist/runtime/components/Input.vue.d.ts +76 -0
  107. package/dist/runtime/components/InputMenu.vue +185 -332
  108. package/dist/runtime/components/InputMenu.vue.d.ts +324 -0
  109. package/dist/runtime/components/InputNumber.vue +71 -133
  110. package/dist/runtime/components/InputNumber.vue.d.ts +182 -0
  111. package/dist/runtime/components/Kbd.vue +20 -46
  112. package/dist/runtime/components/Kbd.vue.d.ts +34 -0
  113. package/dist/runtime/components/Link.vue +98 -176
  114. package/dist/runtime/components/Link.vue.d.ts +93 -0
  115. package/dist/runtime/components/LinkBase.vue +33 -42
  116. package/dist/runtime/components/LinkBase.vue.d.ts +25 -0
  117. package/dist/runtime/components/Modal.vue +53 -116
  118. package/dist/runtime/components/Modal.vue.d.ts +93 -0
  119. package/dist/runtime/components/NavigationMenu.vue +77 -209
  120. package/dist/runtime/components/NavigationMenu.vue.d.ts +139 -0
  121. package/dist/runtime/components/OverlayProvider.vue +14 -18
  122. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -0
  123. package/dist/runtime/components/Pagination.vue +46 -140
  124. package/dist/runtime/components/Pagination.vue.d.ts +119 -0
  125. package/dist/runtime/components/PinInput.vue +61 -78
  126. package/dist/runtime/components/PinInput.vue.d.ts +57 -0
  127. package/dist/runtime/components/Popover.vue +47 -84
  128. package/dist/runtime/components/Popover.vue.d.ts +63 -0
  129. package/dist/runtime/components/Progress.vue +70 -131
  130. package/dist/runtime/components/Progress.vue.d.ts +66 -0
  131. package/dist/runtime/components/RadioGroup.vue +70 -132
  132. package/dist/runtime/components/RadioGroup.vue.d.ts +91 -0
  133. package/dist/runtime/components/Select.vue +110 -224
  134. package/dist/runtime/components/Select.vue.d.ts +145 -0
  135. package/dist/runtime/components/SelectMenu.vue +161 -310
  136. package/dist/runtime/components/SelectMenu.vue.d.ts +196 -0
  137. package/dist/runtime/components/Separator.vue +29 -71
  138. package/dist/runtime/components/Separator.vue.d.ts +54 -0
  139. package/dist/runtime/components/Skeleton.vue +21 -23
  140. package/dist/runtime/components/Skeleton.vue.d.ts +17 -0
  141. package/dist/runtime/components/Slideover.vue +53 -120
  142. package/dist/runtime/components/Slideover.vue.d.ts +94 -0
  143. package/dist/runtime/components/Slider.vue +46 -84
  144. package/dist/runtime/components/Slider.vue.d.ts +52 -0
  145. package/dist/runtime/components/Stepper.vue +45 -115
  146. package/dist/runtime/components/Stepper.vue.d.ts +83 -0
  147. package/dist/runtime/components/Switch.vue +45 -93
  148. package/dist/runtime/components/Switch.vue.d.ts +70 -0
  149. package/dist/runtime/components/Table.vue +163 -267
  150. package/dist/runtime/components/Table.vue.d.ts +183 -0
  151. package/dist/runtime/components/Tabs.vue +41 -107
  152. package/dist/runtime/components/Tabs.vue.d.ts +88 -0
  153. package/dist/runtime/components/Textarea.vue +113 -158
  154. package/dist/runtime/components/Textarea.vue.d.ts +78 -0
  155. package/dist/runtime/components/Toast.vue +49 -110
  156. package/dist/runtime/components/Toast.vue.d.ts +157 -0
  157. package/dist/runtime/components/Toaster.vue +70 -107
  158. package/dist/runtime/components/Toaster.vue.d.ts +38 -0
  159. package/dist/runtime/components/Tooltip.vue +38 -65
  160. package/dist/runtime/components/Tooltip.vue.d.ts +50 -0
  161. package/dist/runtime/components/Tree.vue +59 -166
  162. package/dist/runtime/components/Tree.vue.d.ts +111 -0
  163. package/dist/runtime/composables/defineShortcuts.d.ts +1 -1
  164. package/dist/runtime/composables/defineShortcuts.js +6 -0
  165. package/dist/runtime/composables/useAvatarGroup.d.ts +1 -1
  166. package/dist/runtime/composables/useButtonGroup.d.ts +2 -2
  167. package/dist/runtime/composables/useFormField.d.ts +2 -2
  168. package/dist/runtime/composables/useKbd.d.ts +1 -0
  169. package/dist/runtime/composables/useKbd.js +4 -3
  170. package/dist/runtime/composables/useOverlay.d.ts +14 -8
  171. package/dist/runtime/composables/useOverlay.js +20 -7
  172. package/dist/runtime/composables/usePortal.d.ts +6 -0
  173. package/dist/runtime/composables/usePortal.js +17 -0
  174. package/dist/runtime/index.css +1 -1
  175. package/dist/runtime/inertia/components/Link.vue +146 -0
  176. package/dist/runtime/inertia/components/Link.vue.d.ts +63 -0
  177. package/dist/runtime/inertia/stubs.d.ts +43 -0
  178. package/dist/runtime/inertia/stubs.js +82 -0
  179. package/dist/runtime/locale/bg.d.ts +3 -0
  180. package/dist/runtime/locale/bg.js +54 -0
  181. package/dist/runtime/locale/index.d.ts +5 -1
  182. package/dist/runtime/locale/index.js +5 -1
  183. package/dist/runtime/locale/kk.d.ts +3 -0
  184. package/dist/runtime/locale/kk.js +54 -0
  185. package/dist/runtime/locale/tj.d.ts +3 -0
  186. package/dist/runtime/locale/tj.js +54 -0
  187. package/dist/runtime/locale/ug_cn.d.ts +3 -0
  188. package/dist/runtime/locale/ug_cn.js +55 -0
  189. package/dist/runtime/types/form.d.ts +4 -1
  190. package/dist/runtime/types/index.d.ts +1 -0
  191. package/dist/runtime/types/index.js +1 -0
  192. package/dist/runtime/types/tv.d.ts +53 -0
  193. package/dist/runtime/types/tv.js +0 -0
  194. package/dist/runtime/types/utils.d.ts +7 -17
  195. package/dist/runtime/types/utils.js +1 -0
  196. package/dist/runtime/utils/link.d.ts +3 -3
  197. package/dist/runtime/utils/link.js +1 -0
  198. package/dist/runtime/utils/tv.js +2 -2
  199. package/dist/runtime/vue/components/Icon.vue +7 -8
  200. package/dist/runtime/vue/components/Icon.vue.d.ts +5 -0
  201. package/dist/runtime/vue/components/Link.vue +118 -202
  202. package/dist/runtime/vue/components/Link.vue.d.ts +93 -0
  203. package/dist/runtime/vue/stubs.d.ts +2 -2
  204. package/dist/shared/{ui.BkNUP964.mjs → ui.CbtTMMzt.mjs} +631 -366
  205. package/dist/types.d.mts +3 -5
  206. package/dist/unplugin.d.mts +6 -2
  207. package/dist/unplugin.mjs +25 -4
  208. package/dist/vite.d.mts +1 -1
  209. package/dist/vite.mjs +2 -2
  210. package/package.json +96 -54
  211. package/dist/module.cjs +0 -62
  212. package/dist/module.d.cts +0 -45
  213. package/dist/module.d.ts +0 -45
  214. package/dist/shared/ui.BL-XB3u1.cjs +0 -3555
  215. package/dist/types.d.ts +0 -7
  216. package/dist/unplugin.cjs +0 -232
  217. package/dist/unplugin.d.cts +0 -62
  218. package/dist/unplugin.d.ts +0 -62
  219. package/dist/vite.cjs +0 -23
  220. package/dist/vite.d.cts +0 -15
  221. package/dist/vite.d.ts +0 -15
@@ -0,0 +1,93 @@
1
+ import type { ButtonHTMLAttributes } from 'vue';
2
+ import type { RouterLinkProps, RouteLocationRaw } from 'vue-router';
3
+ interface NuxtLinkProps extends Omit<RouterLinkProps, 'to'> {
4
+ /**
5
+ * Route Location the link should navigate to when clicked on.
6
+ */
7
+ to?: RouteLocationRaw;
8
+ /**
9
+ * An alias for `to`. If used with `to`, `href` will be ignored
10
+ */
11
+ href?: NuxtLinkProps['to'];
12
+ /**
13
+ * Forces the link to be considered as external (true) or internal (false). This is helpful to handle edge-cases
14
+ */
15
+ external?: boolean;
16
+ /**
17
+ * Where to display the linked URL, as the name for a browsing context.
18
+ */
19
+ target?: '_blank' | '_parent' | '_self' | '_top' | (string & {}) | null;
20
+ /**
21
+ * A rel attribute value to apply on the link. Defaults to "noopener noreferrer" for external links.
22
+ */
23
+ rel?: 'noopener' | 'noreferrer' | 'nofollow' | 'sponsored' | 'ugc' | (string & {}) | null;
24
+ /**
25
+ * If set to true, no rel attribute will be added to the link
26
+ */
27
+ noRel?: boolean;
28
+ /**
29
+ * A class to apply to links that have been prefetched.
30
+ */
31
+ prefetchedClass?: string;
32
+ /**
33
+ * When enabled will prefetch middleware, layouts and payloads of links in the viewport.
34
+ */
35
+ prefetch?: boolean;
36
+ /**
37
+ * Allows controlling when to prefetch links. By default, prefetch is triggered only on visibility.
38
+ */
39
+ prefetchOn?: 'visibility' | 'interaction' | Partial<{
40
+ visibility: boolean;
41
+ interaction: boolean;
42
+ }>;
43
+ /**
44
+ * Escape hatch to disable `prefetch` attribute.
45
+ */
46
+ noPrefetch?: boolean;
47
+ }
48
+ export interface LinkProps extends NuxtLinkProps {
49
+ /**
50
+ * The element or component this component should render as when not a link.
51
+ * @defaultValue 'button'
52
+ */
53
+ as?: any;
54
+ /**
55
+ * The type of the button when not a link.
56
+ * @defaultValue 'button'
57
+ */
58
+ type?: ButtonHTMLAttributes['type'];
59
+ disabled?: boolean;
60
+ /** Force the link to be active independent of the current route. */
61
+ active?: boolean;
62
+ /** Will only be active if the current route is an exact match. */
63
+ exact?: boolean;
64
+ /** Allows controlling how the current route query sets the link as active. */
65
+ exactQuery?: boolean | 'partial';
66
+ /** Will only be active if the current route hash is an exact match. */
67
+ exactHash?: boolean;
68
+ /** The class to apply when the link is inactive. */
69
+ inactiveClass?: string;
70
+ custom?: boolean;
71
+ /** When `true`, only styles from `class`, `activeClass`, and `inactiveClass` will be applied. */
72
+ raw?: boolean;
73
+ class?: any;
74
+ }
75
+ export interface LinkSlots {
76
+ default(props: {
77
+ active: boolean;
78
+ }): any;
79
+ }
80
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<LinkProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<LinkProps> & Readonly<{}>, {
81
+ type: "reset" | "submit" | "button";
82
+ as: any;
83
+ activeClass: string;
84
+ ariaCurrentValue: "page" | "step" | "location" | "date" | "time" | "true" | "false";
85
+ active: boolean;
86
+ inactiveClass: string;
87
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, LinkSlots>;
88
+ export default _default;
89
+ type __VLS_WithSlots<T, S> = T & {
90
+ new (): {
91
+ $slots: S;
92
+ };
93
+ };
@@ -1,43 +1,34 @@
1
- <script lang="ts">
2
- import type { LinkProps } from '../types'
1
+ <script>
3
2
 
4
- export interface LinkBaseProps {
5
- as?: string
6
- type?: string
7
- disabled?: boolean
8
- onClick?: ((e: MouseEvent) => void | Promise<void>) | Array<((e: MouseEvent) => void | Promise<void>)>
9
- href?: string
10
- navigate?: (e: MouseEvent) => void
11
- target?: LinkProps['target']
12
- rel?: LinkProps['rel']
13
- active?: boolean
14
- isExternal?: boolean
15
- }
16
3
  </script>
17
4
 
18
- <script setup lang="ts">
19
- import { Primitive } from 'reka-ui'
20
-
21
- const props = withDefaults(defineProps<LinkBaseProps>(), {
22
- as: 'button',
23
- type: 'button'
24
- })
25
-
26
- function onClickWrapper(e: MouseEvent) {
5
+ <script setup>
6
+ import { Primitive } from "reka-ui";
7
+ const props = defineProps({
8
+ as: { type: String, required: false, default: "button" },
9
+ type: { type: String, required: false, default: "button" },
10
+ disabled: { type: Boolean, required: false },
11
+ onClick: { type: [Function, Array], required: false },
12
+ href: { type: String, required: false },
13
+ navigate: { type: Function, required: false },
14
+ target: { type: [String, Object, null], required: false },
15
+ rel: { type: [String, Object, null], required: false },
16
+ active: { type: Boolean, required: false },
17
+ isExternal: { type: Boolean, required: false }
18
+ });
19
+ function onClickWrapper(e) {
27
20
  if (props.disabled) {
28
- e.stopPropagation()
29
- e.preventDefault()
30
- return
21
+ e.stopPropagation();
22
+ e.preventDefault();
23
+ return;
31
24
  }
32
-
33
25
  if (props.onClick) {
34
26
  for (const onClick of Array.isArray(props.onClick) ? props.onClick : [props.onClick]) {
35
- onClick(e)
27
+ onClick(e);
36
28
  }
37
29
  }
38
-
39
30
  if (props.href && props.navigate && !props.isExternal) {
40
- props.navigate(e)
31
+ props.navigate(e);
41
32
  }
42
33
  }
43
34
  </script>
@@ -45,18 +36,18 @@ function onClickWrapper(e: MouseEvent) {
45
36
  <template>
46
37
  <Primitive
47
38
  v-bind="href ? {
48
- 'as': 'a',
49
- 'href': disabled ? undefined : href,
50
- 'aria-disabled': disabled ? 'true' : undefined,
51
- 'role': disabled ? 'link' : undefined,
52
- 'tabindex': disabled ? -1 : undefined
53
- } : as === 'button' ? {
54
- as,
55
- type,
56
- disabled
57
- } : {
58
- as
59
- }"
39
+ 'as': 'a',
40
+ 'href': disabled ? void 0 : href,
41
+ 'aria-disabled': disabled ? 'true' : void 0,
42
+ 'role': disabled ? 'link' : void 0,
43
+ 'tabindex': disabled ? -1 : void 0
44
+ } : as === 'button' ? {
45
+ as,
46
+ type,
47
+ disabled
48
+ } : {
49
+ as
50
+ }"
60
51
  :rel="rel"
61
52
  :target="target"
62
53
  @click="onClickWrapper"
@@ -0,0 +1,25 @@
1
+ import type { LinkProps } from '../types';
2
+ export interface LinkBaseProps {
3
+ as?: string;
4
+ type?: string;
5
+ disabled?: boolean;
6
+ onClick?: ((e: MouseEvent) => void | Promise<void>) | Array<((e: MouseEvent) => void | Promise<void>)>;
7
+ href?: string;
8
+ navigate?: (e: MouseEvent) => void;
9
+ target?: LinkProps['target'];
10
+ rel?: LinkProps['rel'];
11
+ active?: boolean;
12
+ isExternal?: boolean;
13
+ }
14
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<LinkBaseProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<LinkBaseProps> & Readonly<{}>, {
15
+ type: string;
16
+ as: string;
17
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
18
+ default?: (props: {}) => any;
19
+ }>;
20
+ export default _default;
21
+ type __VLS_WithSlots<T, S> = T & {
22
+ new (): {
23
+ $slots: S;
24
+ };
25
+ };
@@ -1,123 +1,60 @@
1
- <script lang="ts">
2
- import type { DialogRootProps, DialogRootEmits, DialogContentProps, DialogContentEmits } from 'reka-ui'
3
- import type { AppConfig } from '@nuxt/schema'
4
- import _appConfig from '#build/app.config'
5
- import theme from '#build/ui/modal'
6
- import { tv } from '../utils/tv'
7
- import type { ButtonProps } from '../types'
8
- import type { EmitsToProps } from '../types/utils'
9
-
10
- const appConfigModal = _appConfig as AppConfig & { ui: { modal: Partial<typeof theme> } }
11
-
12
- const modal = tv({ extend: tv(theme), ...(appConfigModal.ui?.modal || {}) })
13
-
14
- export interface ModalProps extends DialogRootProps {
15
- title?: string
16
- description?: string
17
- /** The content of the modal. */
18
- content?: Omit<DialogContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DialogContentEmits>>
19
- /**
20
- * Render an overlay behind the modal.
21
- * @defaultValue true
22
- */
23
- overlay?: boolean
24
- /**
25
- * Animate the modal when opening or closing.
26
- * @defaultValue true
27
- */
28
- transition?: boolean
29
- /**
30
- * When `true`, the modal will take up the full screen.
31
- * @defaultValue false
32
- */
33
- fullscreen?: boolean
34
- /**
35
- * Render the modal in a portal.
36
- * @defaultValue true
37
- */
38
- portal?: boolean
39
- /**
40
- * Display a close button to dismiss the modal.
41
- * `{ size: 'md', color: 'neutral', variant: 'ghost' }`{lang="ts-type"}
42
- * @defaultValue true
43
- */
44
- close?: boolean | Partial<ButtonProps>
45
- /**
46
- * The icon displayed in the close button.
47
- * @defaultValue appConfig.ui.icons.close
48
- * @IconifyIcon
49
- */
50
- closeIcon?: string
51
- /**
52
- * When `false`, the modal will not close when clicking outside or pressing escape.
53
- * @defaultValue true
54
- */
55
- dismissible?: boolean
56
- class?: any
57
- ui?: Partial<typeof modal.slots>
58
- }
59
-
60
- export interface ModalEmits extends DialogRootEmits {
61
- 'after:leave': []
62
- }
63
-
64
- export interface ModalSlots {
65
- default(props: { open: boolean }): any
66
- content(props?: {}): any
67
- header(props?: {}): any
68
- title(props?: {}): any
69
- description(props?: {}): any
70
- close(props: { ui: ReturnType<typeof modal> }): any
71
- body(props?: {}): any
72
- footer(props?: {}): any
73
- }
1
+ <script>
2
+ import theme from "#build/ui/modal";
74
3
  </script>
75
4
 
76
- <script setup lang="ts">
77
- import { computed, toRef } from 'vue'
78
- import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose, VisuallyHidden, useForwardPropsEmits } from 'reka-ui'
79
- import { reactivePick } from '@vueuse/core'
80
- import { useAppConfig } from '#imports'
81
- import { useLocale } from '../composables/useLocale'
82
- import UButton from './Button.vue'
83
-
84
- const props = withDefaults(defineProps<ModalProps>(), {
85
- close: true,
86
- portal: true,
87
- overlay: true,
88
- transition: true,
89
- modal: true,
90
- dismissible: true
91
- })
92
- const emits = defineEmits<ModalEmits>()
93
- const slots = defineSlots<ModalSlots>()
94
-
95
- const { t } = useLocale()
96
- const appConfig = useAppConfig()
97
-
98
- const rootProps = useForwardPropsEmits(reactivePick(props, 'open', 'defaultOpen', 'modal'), emits)
99
- const contentProps = toRef(() => props.content)
5
+ <script setup>
6
+ import { computed, toRef } from "vue";
7
+ import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose, VisuallyHidden, useForwardPropsEmits } from "reka-ui";
8
+ import { reactivePick } from "@vueuse/core";
9
+ import { useAppConfig } from "#imports";
10
+ import { useLocale } from "../composables/useLocale";
11
+ import { usePortal } from "../composables/usePortal";
12
+ import { tv } from "../utils/tv";
13
+ import UButton from "./Button.vue";
14
+ const props = defineProps({
15
+ title: { type: String, required: false },
16
+ description: { type: String, required: false },
17
+ content: { type: Object, required: false },
18
+ overlay: { type: Boolean, required: false, default: true },
19
+ transition: { type: Boolean, required: false, default: true },
20
+ fullscreen: { type: Boolean, required: false },
21
+ portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
22
+ close: { type: [Boolean, Object], required: false, default: true },
23
+ closeIcon: { type: String, required: false },
24
+ dismissible: { type: Boolean, required: false, default: true },
25
+ class: { type: null, required: false },
26
+ ui: { type: null, required: false },
27
+ open: { type: Boolean, required: false },
28
+ defaultOpen: { type: Boolean, required: false },
29
+ modal: { type: Boolean, required: false, default: true }
30
+ });
31
+ const emits = defineEmits(["after:leave", "close:prevent", "update:open"]);
32
+ const slots = defineSlots();
33
+ const { t } = useLocale();
34
+ const appConfig = useAppConfig();
35
+ const rootProps = useForwardPropsEmits(reactivePick(props, "open", "defaultOpen", "modal"), emits);
36
+ const portalProps = usePortal(toRef(() => props.portal));
37
+ const contentProps = toRef(() => props.content);
100
38
  const contentEvents = computed(() => {
101
- const events = {
102
- closeAutoFocus: (e: Event) => e.preventDefault()
103
- }
104
-
39
+ const defaultEvents = {
40
+ closeAutoFocus: (e) => e.preventDefault()
41
+ };
105
42
  if (!props.dismissible) {
106
- return {
107
- pointerDownOutside: (e: Event) => e.preventDefault(),
108
- interactOutside: (e: Event) => e.preventDefault(),
109
- escapeKeyDown: (e: Event) => e.preventDefault(),
110
- ...events
111
- }
43
+ const events = ["pointerDownOutside", "interactOutside", "escapeKeyDown", "closeAutoFocus"];
44
+ return events.reduce((acc, curr) => {
45
+ acc[curr] = (e) => {
46
+ e.preventDefault();
47
+ emits("close:prevent");
48
+ };
49
+ return acc;
50
+ }, {});
112
51
  }
113
-
114
- return events
115
- })
116
-
117
- const ui = computed(() => modal({
52
+ return defaultEvents;
53
+ });
54
+ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.modal || {} })({
118
55
  transition: props.transition,
119
56
  fullscreen: props.fullscreen
120
- }))
57
+ }));
121
58
  </script>
122
59
 
123
60
  <template>
@@ -126,11 +63,11 @@ const ui = computed(() => modal({
126
63
  <slot :open="open" />
127
64
  </DialogTrigger>
128
65
 
129
- <DialogPortal :disabled="!portal">
66
+ <DialogPortal v-bind="portalProps">
130
67
  <DialogOverlay v-if="overlay" :class="ui.overlay({ class: props.ui?.overlay })" />
131
68
 
132
69
  <DialogContent :class="ui.content({ class: [!slots.default && props.class, props.ui?.content] })" v-bind="contentProps" @after-leave="emits('after:leave')" v-on="contentEvents">
133
- <VisuallyHidden v-if="!!slots.content && ((title || !!slots.title) || (description || !!slots.description))">
70
+ <VisuallyHidden v-if="!!slots.content && (title || !!slots.title || (description || !!slots.description))">
134
71
  <DialogTitle v-if="title || !!slots.title">
135
72
  <slot name="title">
136
73
  {{ title }}
@@ -170,7 +107,7 @@ const ui = computed(() => modal({
170
107
  color="neutral"
171
108
  variant="ghost"
172
109
  :aria-label="t('modal.close')"
173
- v-bind="(typeof close === 'object' ? close as Partial<ButtonProps> : {})"
110
+ v-bind="typeof close === 'object' ? close : {}"
174
111
  :class="ui.close({ class: props.ui?.close })"
175
112
  />
176
113
  </slot>
@@ -0,0 +1,93 @@
1
+ import type { DialogRootProps, DialogRootEmits, DialogContentProps, DialogContentEmits } from 'reka-ui';
2
+ import type { AppConfig } from '@nuxt/schema';
3
+ import theme from '#build/ui/modal';
4
+ import type { ButtonProps } from '../types';
5
+ import type { EmitsToProps, ComponentConfig } from '../types/utils';
6
+ type Modal = ComponentConfig<typeof theme, AppConfig, 'modal'>;
7
+ export interface ModalProps extends DialogRootProps {
8
+ title?: string;
9
+ description?: string;
10
+ /** The content of the modal. */
11
+ content?: Omit<DialogContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DialogContentEmits>>;
12
+ /**
13
+ * Render an overlay behind the modal.
14
+ * @defaultValue true
15
+ */
16
+ overlay?: boolean;
17
+ /**
18
+ * Animate the modal when opening or closing.
19
+ * @defaultValue true
20
+ */
21
+ transition?: boolean;
22
+ /**
23
+ * When `true`, the modal will take up the full screen.
24
+ * @defaultValue false
25
+ */
26
+ fullscreen?: boolean;
27
+ /**
28
+ * Render the modal in a portal.
29
+ * @defaultValue true
30
+ */
31
+ portal?: boolean | string | HTMLElement;
32
+ /**
33
+ * Display a close button to dismiss the modal.
34
+ * `{ size: 'md', color: 'neutral', variant: 'ghost' }`{lang="ts-type"}
35
+ * @defaultValue true
36
+ */
37
+ close?: boolean | Partial<ButtonProps>;
38
+ /**
39
+ * The icon displayed in the close button.
40
+ * @defaultValue appConfig.ui.icons.close
41
+ * @IconifyIcon
42
+ */
43
+ closeIcon?: string;
44
+ /**
45
+ * When `false`, the modal will not close when clicking outside or pressing escape.
46
+ * @defaultValue true
47
+ */
48
+ dismissible?: boolean;
49
+ class?: any;
50
+ ui?: Modal['slots'];
51
+ }
52
+ export interface ModalEmits extends DialogRootEmits {
53
+ 'after:leave': [];
54
+ 'close:prevent': [];
55
+ }
56
+ export interface ModalSlots {
57
+ default(props: {
58
+ open: boolean;
59
+ }): any;
60
+ content(props?: {}): any;
61
+ header(props?: {}): any;
62
+ title(props?: {}): any;
63
+ description(props?: {}): any;
64
+ close(props: {
65
+ ui: {
66
+ [K in keyof Required<Modal['slots']>]: (props?: Record<string, any>) => string;
67
+ };
68
+ }): any;
69
+ body(props?: {}): any;
70
+ footer(props?: {}): any;
71
+ }
72
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<ModalProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
73
+ "update:open": (value: boolean) => any;
74
+ "after:leave": () => any;
75
+ "close:prevent": () => any;
76
+ }, string, import("vue").PublicProps, Readonly<ModalProps> & Readonly<{
77
+ "onUpdate:open"?: ((value: boolean) => any) | undefined;
78
+ "onAfter:leave"?: (() => any) | undefined;
79
+ "onClose:prevent"?: (() => any) | undefined;
80
+ }>, {
81
+ close: boolean | Partial<ButtonProps>;
82
+ modal: boolean;
83
+ portal: boolean | string | HTMLElement;
84
+ overlay: boolean;
85
+ transition: boolean;
86
+ dismissible: boolean;
87
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, ModalSlots>;
88
+ export default _default;
89
+ type __VLS_WithSlots<T, S> = T & {
90
+ new (): {
91
+ $slots: S;
92
+ };
93
+ };