@nuxt/ui 3.0.2 → 3.1.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 (220) hide show
  1. package/.nuxt/ui/accordion.ts +25 -4
  2. package/.nuxt/ui/alert.ts +52 -31
  3. package/.nuxt/ui/avatar-group.ts +24 -3
  4. package/.nuxt/ui/avatar.ts +26 -5
  5. package/.nuxt/ui/badge.ts +56 -35
  6. package/.nuxt/ui/breadcrumb.ts +28 -7
  7. package/.nuxt/ui/button-group.ts +23 -2
  8. package/.nuxt/ui/button.ts +66 -45
  9. package/.nuxt/ui/calendar.ts +39 -18
  10. package/.nuxt/ui/card.ts +28 -7
  11. package/.nuxt/ui/carousel.ts +29 -8
  12. package/.nuxt/ui/checkbox-group.ts +82 -0
  13. package/.nuxt/ui/checkbox.ts +163 -29
  14. package/.nuxt/ui/chip.ts +31 -10
  15. package/.nuxt/ui/collapsible.ts +23 -2
  16. package/.nuxt/ui/color-picker.ts +26 -5
  17. package/.nuxt/ui/command-palette.ts +37 -16
  18. package/.nuxt/ui/container.ts +23 -2
  19. package/.nuxt/ui/context-menu.ts +56 -35
  20. package/.nuxt/ui/drawer.ts +33 -12
  21. package/.nuxt/ui/dropdown-menu.ts +57 -36
  22. package/.nuxt/ui/form-field.ts +29 -8
  23. package/.nuxt/ui/form.ts +23 -2
  24. package/.nuxt/ui/index.ts +1 -0
  25. package/.nuxt/ui/input-menu.ts +65 -44
  26. package/.nuxt/ui/input-number.ts +43 -22
  27. package/.nuxt/ui/input.ts +46 -25
  28. package/.nuxt/ui/kbd.ts +27 -6
  29. package/.nuxt/ui/link.ts +26 -5
  30. package/.nuxt/ui/modal.ts +28 -7
  31. package/.nuxt/ui/navigation-menu.ts +102 -83
  32. package/.nuxt/ui/pagination.ts +23 -2
  33. package/.nuxt/ui/pin-input.ts +43 -22
  34. package/.nuxt/ui/popover.ts +25 -4
  35. package/.nuxt/ui/progress.ts +40 -19
  36. package/.nuxt/ui/radio-group.ts +273 -37
  37. package/.nuxt/ui/select-menu.ts +59 -35
  38. package/.nuxt/ui/select.ts +55 -34
  39. package/.nuxt/ui/separator.ts +31 -10
  40. package/.nuxt/ui/skeleton.ts +24 -3
  41. package/.nuxt/ui/slideover.ts +27 -6
  42. package/.nuxt/ui/slider.ts +39 -18
  43. package/.nuxt/ui/stepper.ts +41 -20
  44. package/.nuxt/ui/switch.ts +43 -22
  45. package/.nuxt/ui/table.ts +38 -17
  46. package/.nuxt/ui/tabs.ts +55 -34
  47. package/.nuxt/ui/textarea.ts +63 -37
  48. package/.nuxt/ui/toast.ts +47 -26
  49. package/.nuxt/ui/toaster.ts +23 -2
  50. package/.nuxt/ui/tooltip.ts +25 -4
  51. package/.nuxt/ui/tree.ts +41 -20
  52. package/.nuxt/ui.css +56 -12
  53. package/README.md +11 -0
  54. package/cli/templates.mjs +18 -17
  55. package/dist/module.json +5 -5
  56. package/dist/module.mjs +11 -7
  57. package/dist/runtime/components/Accordion.vue +36 -93
  58. package/dist/runtime/components/Accordion.vue.d.ts +91 -0
  59. package/dist/runtime/components/Alert.vue +37 -100
  60. package/dist/runtime/components/Alert.vue.d.ts +96 -0
  61. package/dist/runtime/components/App.vue +28 -34
  62. package/dist/runtime/components/App.vue.d.ts +24 -0
  63. package/dist/runtime/components/Avatar.vue +42 -75
  64. package/dist/runtime/components/Avatar.vue.d.ts +60 -0
  65. package/dist/runtime/components/AvatarGroup.vue +40 -77
  66. package/dist/runtime/components/AvatarGroup.vue.d.ts +40 -0
  67. package/dist/runtime/components/Badge.vue +33 -62
  68. package/dist/runtime/components/Badge.vue.d.ts +62 -0
  69. package/dist/runtime/components/Breadcrumb.vue +37 -90
  70. package/dist/runtime/components/Breadcrumb.vue.d.ts +82 -0
  71. package/dist/runtime/components/Button.vue +95 -104
  72. package/dist/runtime/components/Button.vue.d.ts +73 -0
  73. package/dist/runtime/components/ButtonGroup.vue +20 -46
  74. package/dist/runtime/components/ButtonGroup.vue.d.ts +55 -0
  75. package/dist/runtime/components/Calendar.vue +67 -150
  76. package/dist/runtime/components/Calendar.vue.d.ts +107 -0
  77. package/dist/runtime/components/Card.vue +18 -40
  78. package/dist/runtime/components/Card.vue.d.ts +38 -0
  79. package/dist/runtime/components/Carousel.vue +112 -234
  80. package/dist/runtime/components/Carousel.vue.d.ts +120 -0
  81. package/dist/runtime/components/Checkbox.vue +52 -93
  82. package/dist/runtime/components/Checkbox.vue.d.ts +76 -0
  83. package/dist/runtime/components/CheckboxGroup.vue +121 -0
  84. package/dist/runtime/components/CheckboxGroup.vue.d.ts +75 -0
  85. package/dist/runtime/components/Chip.vue +26 -69
  86. package/dist/runtime/components/Chip.vue.d.ts +71 -0
  87. package/dist/runtime/components/Collapsible.vue +22 -41
  88. package/dist/runtime/components/Collapsible.vue.d.ts +50 -0
  89. package/dist/runtime/components/ColorPicker.vue +111 -197
  90. package/dist/runtime/components/ColorPicker.vue.d.ts +63 -0
  91. package/dist/runtime/components/CommandPalette.vue +96 -237
  92. package/dist/runtime/components/CommandPalette.vue.d.ts +173 -0
  93. package/dist/runtime/components/Container.vue +15 -28
  94. package/dist/runtime/components/Container.vue.d.ts +27 -0
  95. package/dist/runtime/components/ContextMenu.vue +34 -133
  96. package/dist/runtime/components/ContextMenu.vue.d.ts +127 -0
  97. package/dist/runtime/components/ContextMenuContent.vue +73 -81
  98. package/dist/runtime/components/ContextMenuContent.vue.d.ts +105 -0
  99. package/dist/runtime/components/Drawer.vue +49 -83
  100. package/dist/runtime/components/Drawer.vue.d.ts +88 -0
  101. package/dist/runtime/components/DropdownMenu.vue +39 -142
  102. package/dist/runtime/components/DropdownMenu.vue.d.ts +141 -0
  103. package/dist/runtime/components/DropdownMenuContent.vue +78 -88
  104. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +55 -0
  105. package/dist/runtime/components/Form.vue +135 -220
  106. package/dist/runtime/components/Form.vue.d.ts +66 -0
  107. package/dist/runtime/components/FormField.vue +35 -77
  108. package/dist/runtime/components/FormField.vue.d.ts +70 -0
  109. package/dist/runtime/components/Icon.vue +12 -19
  110. package/dist/runtime/components/Icon.vue.d.ts +17 -0
  111. package/dist/runtime/components/Input.vue +82 -140
  112. package/dist/runtime/components/Input.vue.d.ts +91 -0
  113. package/dist/runtime/components/InputMenu.vue +185 -332
  114. package/dist/runtime/components/InputMenu.vue.d.ts +312 -0
  115. package/dist/runtime/components/InputNumber.vue +71 -133
  116. package/dist/runtime/components/InputNumber.vue.d.ts +193 -0
  117. package/dist/runtime/components/Kbd.vue +20 -46
  118. package/dist/runtime/components/Kbd.vue.d.ts +55 -0
  119. package/dist/runtime/components/Link.vue +98 -176
  120. package/dist/runtime/components/Link.vue.d.ts +124 -0
  121. package/dist/runtime/components/LinkBase.vue +33 -42
  122. package/dist/runtime/components/LinkBase.vue.d.ts +48 -0
  123. package/dist/runtime/components/Modal.vue +53 -116
  124. package/dist/runtime/components/Modal.vue.d.ts +109 -0
  125. package/dist/runtime/components/NavigationMenu.vue +77 -209
  126. package/dist/runtime/components/NavigationMenu.vue.d.ts +159 -0
  127. package/dist/runtime/components/OverlayProvider.vue +14 -18
  128. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -0
  129. package/dist/runtime/components/Pagination.vue +46 -140
  130. package/dist/runtime/components/Pagination.vue.d.ts +143 -0
  131. package/dist/runtime/components/PinInput.vue +61 -78
  132. package/dist/runtime/components/PinInput.vue.d.ts +68 -0
  133. package/dist/runtime/components/Popover.vue +47 -84
  134. package/dist/runtime/components/Popover.vue.d.ts +80 -0
  135. package/dist/runtime/components/Progress.vue +70 -131
  136. package/dist/runtime/components/Progress.vue.d.ts +97 -0
  137. package/dist/runtime/components/RadioGroup.vue +70 -132
  138. package/dist/runtime/components/RadioGroup.vue.d.ts +88 -0
  139. package/dist/runtime/components/Select.vue +110 -224
  140. package/dist/runtime/components/Select.vue.d.ts +139 -0
  141. package/dist/runtime/components/SelectMenu.vue +161 -310
  142. package/dist/runtime/components/SelectMenu.vue.d.ts +184 -0
  143. package/dist/runtime/components/Separator.vue +29 -71
  144. package/dist/runtime/components/Separator.vue.d.ts +75 -0
  145. package/dist/runtime/components/Skeleton.vue +21 -23
  146. package/dist/runtime/components/Skeleton.vue.d.ts +26 -0
  147. package/dist/runtime/components/Slideover.vue +53 -120
  148. package/dist/runtime/components/Slideover.vue.d.ts +111 -0
  149. package/dist/runtime/components/Slider.vue +46 -84
  150. package/dist/runtime/components/Slider.vue.d.ts +71 -0
  151. package/dist/runtime/components/Stepper.vue +45 -115
  152. package/dist/runtime/components/Stepper.vue.d.ts +89 -0
  153. package/dist/runtime/components/Switch.vue +45 -93
  154. package/dist/runtime/components/Switch.vue.d.ts +73 -0
  155. package/dist/runtime/components/Table.vue +163 -267
  156. package/dist/runtime/components/Table.vue.d.ts +183 -0
  157. package/dist/runtime/components/Tabs.vue +41 -107
  158. package/dist/runtime/components/Tabs.vue.d.ts +104 -0
  159. package/dist/runtime/components/Textarea.vue +113 -158
  160. package/dist/runtime/components/Textarea.vue.d.ts +95 -0
  161. package/dist/runtime/components/Toast.vue +49 -110
  162. package/dist/runtime/components/Toast.vue.d.ts +95 -0
  163. package/dist/runtime/components/Toaster.vue +70 -107
  164. package/dist/runtime/components/Toaster.vue.d.ts +63 -0
  165. package/dist/runtime/components/Tooltip.vue +38 -65
  166. package/dist/runtime/components/Tooltip.vue.d.ts +65 -0
  167. package/dist/runtime/components/Tree.vue +59 -166
  168. package/dist/runtime/components/Tree.vue.d.ts +128 -0
  169. package/dist/runtime/composables/defineShortcuts.d.ts +1 -1
  170. package/dist/runtime/composables/useAvatarGroup.d.ts +1 -1
  171. package/dist/runtime/composables/useButtonGroup.d.ts +2 -2
  172. package/dist/runtime/composables/useFormField.d.ts +2 -2
  173. package/dist/runtime/composables/useOverlay.d.ts +14 -7
  174. package/dist/runtime/composables/useOverlay.js +14 -6
  175. package/dist/runtime/composables/usePortal.d.ts +6 -0
  176. package/dist/runtime/composables/usePortal.js +17 -0
  177. package/dist/runtime/index.css +1 -1
  178. package/dist/runtime/inertia/components/Link.vue +146 -0
  179. package/dist/runtime/inertia/components/Link.vue.d.ts +92 -0
  180. package/dist/runtime/inertia/stubs.d.ts +43 -0
  181. package/dist/runtime/inertia/stubs.js +82 -0
  182. package/dist/runtime/locale/bg.d.ts +3 -0
  183. package/dist/runtime/locale/bg.js +54 -0
  184. package/dist/runtime/locale/index.d.ts +5 -1
  185. package/dist/runtime/locale/index.js +5 -1
  186. package/dist/runtime/locale/kk.d.ts +3 -0
  187. package/dist/runtime/locale/kk.js +54 -0
  188. package/dist/runtime/locale/tj.d.ts +3 -0
  189. package/dist/runtime/locale/tj.js +54 -0
  190. package/dist/runtime/locale/ug_cn.d.ts +3 -0
  191. package/dist/runtime/locale/ug_cn.js +55 -0
  192. package/dist/runtime/types/form.d.ts +4 -1
  193. package/dist/runtime/types/index.d.ts +1 -0
  194. package/dist/runtime/types/index.js +1 -0
  195. package/dist/runtime/types/utils.d.ts +47 -7
  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 +14 -0
  201. package/dist/runtime/vue/components/Link.vue +118 -202
  202. package/dist/runtime/vue/components/Link.vue.d.ts +124 -0
  203. package/dist/runtime/vue/stubs.d.ts +2 -2
  204. package/dist/shared/{ui.BkNUP964.mjs → ui.D7lOOabO.mjs} +621 -362
  205. package/dist/types.d.mts +3 -5
  206. package/dist/unplugin.d.mts +4 -0
  207. package/dist/unplugin.mjs +25 -4
  208. package/dist/vite.mjs +1 -1
  209. package/package.json +94 -53
  210. package/dist/module.cjs +0 -62
  211. package/dist/module.d.cts +0 -45
  212. package/dist/module.d.ts +0 -45
  213. package/dist/shared/ui.BL-XB3u1.cjs +0 -3555
  214. package/dist/types.d.ts +0 -7
  215. package/dist/unplugin.cjs +0 -232
  216. package/dist/unplugin.d.cts +0 -62
  217. package/dist/unplugin.d.ts +0 -62
  218. package/dist/vite.cjs +0 -23
  219. package/dist/vite.d.cts +0 -15
  220. package/dist/vite.d.ts +0 -15
@@ -0,0 +1,95 @@
1
+ import type { ToastRootProps, ToastRootEmits } from 'reka-ui';
2
+ import type { AppConfig } from '@nuxt/schema';
3
+ import theme from '#build/ui/toast';
4
+ import type { AvatarProps, ButtonProps } from '../types';
5
+ import type { StringOrVNode, ComponentConfig } from '../types/utils';
6
+ type Toast = ComponentConfig<typeof theme, AppConfig, 'toast'>;
7
+ export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open' | 'type' | 'duration'> {
8
+ /**
9
+ * The element or component this component should render as.
10
+ * @defaultValue 'li'
11
+ */
12
+ as?: any;
13
+ title?: StringOrVNode;
14
+ description?: StringOrVNode;
15
+ /**
16
+ * @IconifyIcon
17
+ */
18
+ icon?: string;
19
+ avatar?: AvatarProps;
20
+ /**
21
+ * @defaultValue 'primary'
22
+ */
23
+ color?: Toast['variants']['color'];
24
+ /**
25
+ * The orientation between the content and the actions.
26
+ * @defaultValue 'vertical'
27
+ */
28
+ orientation?: Toast['variants']['orientation'];
29
+ /**
30
+ * Display a list of actions:
31
+ * - under the title and description when orientation is `vertical`
32
+ * - next to the close button when orientation is `horizontal`
33
+ * `{ size: 'xs' }`{lang="ts-type"}
34
+ */
35
+ actions?: ButtonProps[];
36
+ /**
37
+ * Display a close button to dismiss the toast.
38
+ * `{ size: 'md', color: 'neutral', variant: 'link' }`{lang="ts-type"}
39
+ * @defaultValue true
40
+ */
41
+ close?: boolean | Partial<ButtonProps>;
42
+ /**
43
+ * The icon displayed in the close button.
44
+ * @defaultValue appConfig.ui.icons.close
45
+ * @IconifyIcon
46
+ */
47
+ closeIcon?: string;
48
+ class?: any;
49
+ ui?: Toast['slots'];
50
+ }
51
+ export interface ToastEmits extends ToastRootEmits {
52
+ }
53
+ export interface ToastSlots {
54
+ leading(props?: {}): any;
55
+ title(props?: {}): any;
56
+ description(props?: {}): any;
57
+ actions(props?: {}): any;
58
+ close(props: {
59
+ ui: {
60
+ [K in keyof Required<Toast['slots']>]: (props?: Record<string, any>) => string;
61
+ };
62
+ }): any;
63
+ }
64
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<ToastProps>, {
65
+ close: boolean;
66
+ orientation: string;
67
+ }>>, {
68
+ height: import("vue").Ref<number, number>;
69
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, any, string, import("vue").PublicProps, any, {
70
+ close: boolean | Partial<ButtonProps>;
71
+ orientation: Toast["variants"]["orientation"];
72
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, Readonly<ToastSlots> & ToastSlots>;
73
+ export default _default;
74
+ type __VLS_WithDefaults<P, D> = {
75
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
76
+ default: D[K];
77
+ }> : P[K];
78
+ };
79
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
80
+ type __VLS_TypePropsToOption<T> = {
81
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
82
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
83
+ } : {
84
+ type: import('vue').PropType<T[K]>;
85
+ required: true;
86
+ };
87
+ };
88
+ type __VLS_WithTemplateSlots<T, S> = T & {
89
+ new (): {
90
+ $slots: S;
91
+ };
92
+ };
93
+ type __VLS_PrettifyLocal<T> = {
94
+ [K in keyof T]: T[K];
95
+ } & {};
@@ -1,104 +1,67 @@
1
- <script lang="ts">
2
- import type { VariantProps } from 'tailwind-variants'
3
- import type { ToastProviderProps } from 'reka-ui'
4
- import type { AppConfig } from '@nuxt/schema'
5
- import _appConfig from '#build/app.config'
6
- import theme from '#build/ui/toaster'
7
- import { tv } from '../utils/tv'
8
-
9
- const appConfigToaster = _appConfig as AppConfig & { ui: { toaster: Partial<typeof theme> } }
10
-
11
- const toaster = tv({ extend: tv(theme), ...(appConfigToaster.ui?.toaster || {}) })
12
-
13
- type ToasterVariants = VariantProps<typeof toaster>
14
-
15
- export interface ToasterProps extends Omit<ToastProviderProps, 'swipeDirection'> {
16
- /**
17
- * The position on the screen to display the toasts.
18
- * @defaultValue 'bottom-right'
19
- */
20
- position?: ToasterVariants['position']
21
- /**
22
- * Expand the toasts to show multiple toasts at once.
23
- * @defaultValue true
24
- */
25
- expand?: boolean
26
- /**
27
- * Render the toaster in a portal.
28
- * @defaultValue true
29
- */
30
- portal?: boolean
31
- class?: any
32
- ui?: Partial<typeof toaster.slots>
33
- }
34
-
35
- export interface ToasterSlots {
36
- default(props?: {}): any
37
- }
38
-
1
+ <script>
2
+ import theme from "#build/ui/toaster";
39
3
  export default {
40
- name: 'Toaster'
41
- }
4
+ name: "Toaster"
5
+ };
42
6
  </script>
43
7
 
44
- <script setup lang="ts">
45
- import { ref, computed } from 'vue'
46
- import { ToastProvider, ToastViewport, ToastPortal, useForwardProps } from 'reka-ui'
47
- import { reactivePick } from '@vueuse/core'
48
- import { useToast } from '../composables/useToast'
49
- import { omit } from '../utils'
50
- import UToast from './Toast.vue'
51
-
52
- const props = withDefaults(defineProps<ToasterProps>(), {
53
- expand: true,
54
- portal: true,
55
- duration: 5000
56
- })
57
- defineSlots<ToasterSlots>()
58
-
59
- const providerProps = useForwardProps(reactivePick(props, 'duration', 'label', 'swipeThreshold'))
60
-
61
- const { toasts, remove } = useToast()
62
-
8
+ <script setup>
9
+ import { ref, computed, toRef } from "vue";
10
+ import { ToastProvider, ToastViewport, ToastPortal, useForwardProps } from "reka-ui";
11
+ import { reactivePick } from "@vueuse/core";
12
+ import { useAppConfig } from "#imports";
13
+ import { useToast } from "../composables/useToast";
14
+ import { usePortal } from "../composables/usePortal";
15
+ import { omit } from "../utils";
16
+ import { tv } from "../utils/tv";
17
+ import UToast from "./Toast.vue";
18
+ const props = defineProps({
19
+ position: { type: null, required: false },
20
+ expand: { type: Boolean, required: false, default: true },
21
+ portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
22
+ class: { type: null, required: false },
23
+ ui: { type: null, required: false },
24
+ label: { type: String, required: false },
25
+ duration: { type: Number, required: false, default: 5e3 },
26
+ swipeThreshold: { type: Number, required: false }
27
+ });
28
+ defineSlots();
29
+ const { toasts, remove } = useToast();
30
+ const appConfig = useAppConfig();
31
+ const providerProps = useForwardProps(reactivePick(props, "duration", "label", "swipeThreshold"));
32
+ const portalProps = usePortal(toRef(() => props.portal));
63
33
  const swipeDirection = computed(() => {
64
34
  switch (props.position) {
65
- case 'top-center':
66
- return 'up'
67
- case 'top-right':
68
- case 'bottom-right':
69
- return 'right'
70
- case 'bottom-center':
71
- return 'down'
72
- case 'top-left':
73
- case 'bottom-left':
74
- return 'left'
35
+ case "top-center":
36
+ return "up";
37
+ case "top-right":
38
+ case "bottom-right":
39
+ return "right";
40
+ case "bottom-center":
41
+ return "down";
42
+ case "top-left":
43
+ case "bottom-left":
44
+ return "left";
75
45
  }
76
- return 'right'
77
- })
78
-
79
- const ui = computed(() => toaster({
46
+ return "right";
47
+ });
48
+ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.toaster || {} })({
80
49
  position: props.position,
81
50
  swipeDirection: swipeDirection.value
82
- }))
83
-
84
- function onUpdateOpen(value: boolean, id: string | number) {
51
+ }));
52
+ function onUpdateOpen(value, id) {
85
53
  if (value) {
86
- return
54
+ return;
87
55
  }
88
-
89
- remove(id)
56
+ remove(id);
90
57
  }
91
-
92
- const hovered = ref(false)
93
- const expanded = computed(() => props.expand || hovered.value)
94
-
95
- const refs = ref<{ height: number }[]>([])
96
-
97
- const height = computed(() => refs.value.reduce((acc, { height }) => acc + height + 16, 0))
98
- const frontHeight = computed(() => refs.value[refs.value.length - 1]?.height || 0)
99
-
100
- function getOffset(index: number) {
101
- return refs.value.slice(index + 1).reduce((acc, { height }) => acc + height + 16, 0)
58
+ const hovered = ref(false);
59
+ const expanded = computed(() => props.expand || hovered.value);
60
+ const refs = ref([]);
61
+ const height = computed(() => refs.value.reduce((acc, { height: height2 }) => acc + height2 + 16, 0));
62
+ const frontHeight = computed(() => refs.value[refs.value.length - 1]?.height || 0);
63
+ function getOffset(index) {
64
+ return refs.value.slice(index + 1).reduce((acc, { height: height2 }) => acc + height2 + 16, 0);
102
65
  }
103
66
  </script>
104
67
 
@@ -111,35 +74,35 @@ function getOffset(index: number) {
111
74
  :key="toast.id"
112
75
  ref="refs"
113
76
  v-bind="omit(toast, ['id', 'close'])"
114
- :close="(toast.close as boolean)"
77
+ :close="toast.close"
115
78
  :data-expanded="expanded"
116
79
  :data-front="!expanded && index === toasts.length - 1"
117
80
  :style="{
118
- '--index': (index - toasts.length) + toasts.length,
119
- '--before': toasts.length - 1 - index,
120
- '--offset': getOffset(index),
121
- '--scale': expanded ? '1' : 'calc(1 - var(--before) * var(--scale-factor))',
122
- '--translate': expanded ? 'calc(var(--offset) * var(--translate-factor))' : 'calc(var(--before) * var(--gap))',
123
- '--transform': 'translateY(var(--translate)) scale(var(--scale))'
124
- }"
81
+ '--index': index - toasts.length + toasts.length,
82
+ '--before': toasts.length - 1 - index,
83
+ '--offset': getOffset(index),
84
+ '--scale': expanded ? '1' : 'calc(1 - var(--before) * var(--scale-factor))',
85
+ '--translate': expanded ? 'calc(var(--offset) * var(--translate-factor))' : 'calc(var(--before) * var(--gap))',
86
+ '--transform': 'translateY(var(--translate)) scale(var(--scale))'
87
+ }"
125
88
  :class="[ui.base(), {
126
- 'cursor-pointer': !!toast.onClick
127
- }]"
89
+ 'cursor-pointer': !!toast.onClick
90
+ }]"
128
91
  @update:open="onUpdateOpen($event, toast.id)"
129
92
  @click="toast.onClick && toast.onClick(toast)"
130
93
  />
131
94
 
132
- <ToastPortal :disabled="!portal">
95
+ <ToastPortal v-bind="portalProps">
133
96
  <ToastViewport
134
97
  :data-expanded="expanded"
135
98
  :class="ui.viewport({ class: [props.class, props.ui?.viewport] })"
136
99
  :style="{
137
- '--scale-factor': '0.05',
138
- '--translate-factor': position?.startsWith('top') ? '1px' : '-1px',
139
- '--gap': position?.startsWith('top') ? '16px' : '-16px',
140
- '--front-height': `${frontHeight}px`,
141
- '--height': `${height}px`
142
- }"
100
+ '--scale-factor': '0.05',
101
+ '--translate-factor': position?.startsWith('top') ? '1px' : '-1px',
102
+ '--gap': position?.startsWith('top') ? '16px' : '-16px',
103
+ '--front-height': `${frontHeight}px`,
104
+ '--height': `${height}px`
105
+ }"
143
106
  @mouseenter="hovered = true"
144
107
  @mouseleave="hovered = false"
145
108
  />
@@ -0,0 +1,63 @@
1
+ import type { ToastProviderProps } from 'reka-ui';
2
+ import type { AppConfig } from '@nuxt/schema';
3
+ import theme from '#build/ui/toaster';
4
+ import type { ComponentConfig } from '../types/utils';
5
+ type Toaster = ComponentConfig<typeof theme, AppConfig, 'toaster'>;
6
+ export interface ToasterProps extends Omit<ToastProviderProps, 'swipeDirection'> {
7
+ /**
8
+ * The position on the screen to display the toasts.
9
+ * @defaultValue 'bottom-right'
10
+ */
11
+ position?: Toaster['variants']['position'];
12
+ /**
13
+ * Expand the toasts to show multiple toasts at once.
14
+ * @defaultValue true
15
+ */
16
+ expand?: boolean;
17
+ /**
18
+ * Render the toaster in a portal.
19
+ * @defaultValue true
20
+ */
21
+ portal?: boolean | string | HTMLElement;
22
+ class?: any;
23
+ ui?: Toaster['slots'];
24
+ }
25
+ export interface ToasterSlots {
26
+ default(props?: {}): any;
27
+ }
28
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<ToasterProps>, {
29
+ expand: boolean;
30
+ portal: boolean;
31
+ duration: number;
32
+ }>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<ToasterProps>, {
33
+ expand: boolean;
34
+ portal: boolean;
35
+ duration: number;
36
+ }>>> & Readonly<{}>, {
37
+ duration: number;
38
+ expand: boolean;
39
+ portal: boolean | string | HTMLElement;
40
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, Readonly<ToasterSlots> & ToasterSlots>;
41
+ export default _default;
42
+ type __VLS_WithDefaults<P, D> = {
43
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
44
+ default: D[K];
45
+ }> : P[K];
46
+ };
47
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
48
+ type __VLS_TypePropsToOption<T> = {
49
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
50
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
51
+ } : {
52
+ type: import('vue').PropType<T[K]>;
53
+ required: true;
54
+ };
55
+ };
56
+ type __VLS_WithTemplateSlots<T, S> = T & {
57
+ new (): {
58
+ $slots: S;
59
+ };
60
+ };
61
+ type __VLS_PrettifyLocal<T> = {
62
+ [K in keyof T]: T[K];
63
+ } & {};
@@ -1,69 +1,42 @@
1
- <script lang="ts">
2
- import type { TooltipRootProps, TooltipRootEmits, TooltipContentProps, TooltipContentEmits, TooltipArrowProps } from 'reka-ui'
3
- import type { AppConfig } from '@nuxt/schema'
4
- import _appConfig from '#build/app.config'
5
- import theme from '#build/ui/tooltip'
6
- import { tv } from '../utils/tv'
7
- import type { KbdProps } from '../types'
8
- import type { EmitsToProps } from '../types/utils'
9
-
10
- const appConfigTooltip = _appConfig as AppConfig & { ui: { tooltip: Partial<typeof theme> } }
11
-
12
- const tooltip = tv({ extend: tv(theme), ...(appConfigTooltip.ui?.tooltip || {}) })
13
-
14
- export interface TooltipProps extends TooltipRootProps {
15
- /** The text content of the tooltip. */
16
- text?: string
17
- /** The keyboard keys to display in the tooltip. */
18
- kbds?: KbdProps['value'][] | KbdProps[]
19
- /**
20
- * The content of the tooltip.
21
- * @defaultValue { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
22
- */
23
- content?: Omit<TooltipContentProps, 'as' | 'asChild'> & Partial<EmitsToProps<TooltipContentEmits>>
24
- /**
25
- * Display an arrow alongside the tooltip.
26
- * @defaultValue false
27
- */
28
- arrow?: boolean | Omit<TooltipArrowProps, 'as' | 'asChild'>
29
- /**
30
- * Render the tooltip in a portal.
31
- * @defaultValue true
32
- */
33
- portal?: boolean
34
- class?: any
35
- ui?: Partial<typeof tooltip.slots>
36
- }
37
-
38
- export interface TooltipEmits extends TooltipRootEmits {}
39
-
40
- export interface TooltipSlots {
41
- default(props: { open: boolean }): any
42
- content(props?: {}): any
43
- }
1
+ <script>
2
+ import theme from "#build/ui/tooltip";
44
3
  </script>
45
4
 
46
- <script setup lang="ts">
47
- import { computed, toRef } from 'vue'
48
- import { defu } from 'defu'
49
- import { TooltipRoot, TooltipTrigger, TooltipPortal, TooltipContent, TooltipArrow, useForwardPropsEmits } from 'reka-ui'
50
- import { reactivePick } from '@vueuse/core'
51
- import UKbd from './Kbd.vue'
52
-
53
- const props = withDefaults(defineProps<TooltipProps>(), {
54
- portal: true
55
- })
56
- const emits = defineEmits<TooltipEmits>()
57
- const slots = defineSlots<TooltipSlots>()
58
-
59
- const rootProps = useForwardPropsEmits(reactivePick(props, 'defaultOpen', 'open', 'delayDuration', 'disableHoverableContent', 'disableClosingTrigger', 'disabled', 'ignoreNonKeyboardFocus'), emits)
60
- const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8, collisionPadding: 8 }) as TooltipContentProps)
61
- const arrowProps = toRef(() => props.arrow as TooltipArrowProps)
62
-
63
- // eslint-disable-next-line vue/no-dupe-keys
64
- const ui = computed(() => tooltip({
5
+ <script setup>
6
+ import { computed, toRef } from "vue";
7
+ import { defu } from "defu";
8
+ import { TooltipRoot, TooltipTrigger, TooltipPortal, TooltipContent, TooltipArrow, useForwardPropsEmits } from "reka-ui";
9
+ import { reactivePick } from "@vueuse/core";
10
+ import { useAppConfig } from "#imports";
11
+ import { usePortal } from "../composables/usePortal";
12
+ import { tv } from "../utils/tv";
13
+ import UKbd from "./Kbd.vue";
14
+ const props = defineProps({
15
+ text: { type: String, required: false },
16
+ kbds: { type: Array, required: false },
17
+ content: { type: Object, required: false },
18
+ arrow: { type: [Boolean, Object], required: false },
19
+ portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
20
+ class: { type: null, required: false },
21
+ ui: { type: null, required: false },
22
+ defaultOpen: { type: Boolean, required: false },
23
+ open: { type: Boolean, required: false },
24
+ delayDuration: { type: Number, required: false },
25
+ disableHoverableContent: { type: Boolean, required: false },
26
+ disableClosingTrigger: { type: Boolean, required: false },
27
+ disabled: { type: Boolean, required: false },
28
+ ignoreNonKeyboardFocus: { type: Boolean, required: false }
29
+ });
30
+ const emits = defineEmits(["update:open"]);
31
+ const slots = defineSlots();
32
+ const appConfig = useAppConfig();
33
+ const rootProps = useForwardPropsEmits(reactivePick(props, "defaultOpen", "open", "delayDuration", "disableHoverableContent", "disableClosingTrigger", "disabled", "ignoreNonKeyboardFocus"), emits);
34
+ const portalProps = usePortal(toRef(() => props.portal));
35
+ const contentProps = toRef(() => defu(props.content, { side: "bottom", sideOffset: 8, collisionPadding: 8 }));
36
+ const arrowProps = toRef(() => props.arrow);
37
+ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.tooltip || {} })({
65
38
  side: contentProps.value.side
66
- }))
39
+ }));
67
40
  </script>
68
41
 
69
42
  <template>
@@ -72,13 +45,13 @@ const ui = computed(() => tooltip({
72
45
  <slot :open="open" />
73
46
  </TooltipTrigger>
74
47
 
75
- <TooltipPortal :disabled="!portal">
48
+ <TooltipPortal v-bind="portalProps">
76
49
  <TooltipContent v-bind="contentProps" :class="ui.content({ class: [!slots.default && props.class, props.ui?.content] })">
77
50
  <slot name="content">
78
51
  <span v-if="text" :class="ui.text({ class: props.ui?.text })">{{ text }}</span>
79
52
 
80
53
  <span v-if="kbds?.length" :class="ui.kbds({ class: props.ui?.kbds })">
81
- <UKbd v-for="(kbd, index) in kbds" :key="index" :size="((props.ui?.kbdsSize || ui.kbdsSize()) as KbdProps['size'])" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
54
+ <UKbd v-for="(kbd, index) in kbds" :key="index" :size="props.ui?.kbdsSize || ui.kbdsSize()" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
82
55
  </span>
83
56
  </slot>
84
57
 
@@ -0,0 +1,65 @@
1
+ import type { TooltipRootProps, TooltipRootEmits, TooltipContentProps, TooltipContentEmits, TooltipArrowProps } from 'reka-ui';
2
+ import type { AppConfig } from '@nuxt/schema';
3
+ import theme from '#build/ui/tooltip';
4
+ import type { KbdProps } from '../types';
5
+ import type { EmitsToProps, ComponentConfig } from '../types/utils';
6
+ type Tooltip = ComponentConfig<typeof theme, AppConfig, 'tooltip'>;
7
+ export interface TooltipProps extends TooltipRootProps {
8
+ /** The text content of the tooltip. */
9
+ text?: string;
10
+ /** The keyboard keys to display in the tooltip. */
11
+ kbds?: KbdProps['value'][] | KbdProps[];
12
+ /**
13
+ * The content of the tooltip.
14
+ * @defaultValue { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
15
+ */
16
+ content?: Omit<TooltipContentProps, 'as' | 'asChild'> & Partial<EmitsToProps<TooltipContentEmits>>;
17
+ /**
18
+ * Display an arrow alongside the tooltip.
19
+ * @defaultValue false
20
+ */
21
+ arrow?: boolean | Omit<TooltipArrowProps, 'as' | 'asChild'>;
22
+ /**
23
+ * Render the tooltip in a portal.
24
+ * @defaultValue true
25
+ */
26
+ portal?: boolean | string | HTMLElement;
27
+ class?: any;
28
+ ui?: Tooltip['slots'];
29
+ }
30
+ export interface TooltipEmits extends TooltipRootEmits {
31
+ }
32
+ export interface TooltipSlots {
33
+ default(props: {
34
+ open: boolean;
35
+ }): any;
36
+ content(props?: {}): any;
37
+ }
38
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<TooltipProps>, {
39
+ portal: boolean;
40
+ }>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, any, string, import("vue").PublicProps, any, {
41
+ portal: boolean | string | HTMLElement;
42
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, Readonly<TooltipSlots> & TooltipSlots>;
43
+ export default _default;
44
+ type __VLS_WithDefaults<P, D> = {
45
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
46
+ default: D[K];
47
+ }> : P[K];
48
+ };
49
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
50
+ type __VLS_TypePropsToOption<T> = {
51
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
52
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
53
+ } : {
54
+ type: import('vue').PropType<T[K]>;
55
+ required: true;
56
+ };
57
+ };
58
+ type __VLS_WithTemplateSlots<T, S> = T & {
59
+ new (): {
60
+ $slots: S;
61
+ };
62
+ };
63
+ type __VLS_PrettifyLocal<T> = {
64
+ [K in keyof T]: T[K];
65
+ } & {};