@nuxt/ui 3.0.1 → 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 (228) 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 +24 -3
  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 +103 -84
  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 +44 -23
  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.d.mts +2 -1
  56. package/dist/module.json +5 -5
  57. package/dist/module.mjs +11 -7
  58. package/dist/runtime/components/Accordion.vue +36 -92
  59. package/dist/runtime/components/Accordion.vue.d.ts +91 -0
  60. package/dist/runtime/components/Alert.vue +37 -100
  61. package/dist/runtime/components/Alert.vue.d.ts +96 -0
  62. package/dist/runtime/components/App.vue +28 -34
  63. package/dist/runtime/components/App.vue.d.ts +24 -0
  64. package/dist/runtime/components/Avatar.vue +47 -78
  65. package/dist/runtime/components/Avatar.vue.d.ts +60 -0
  66. package/dist/runtime/components/AvatarGroup.vue +40 -77
  67. package/dist/runtime/components/AvatarGroup.vue.d.ts +40 -0
  68. package/dist/runtime/components/Badge.vue +33 -62
  69. package/dist/runtime/components/Badge.vue.d.ts +62 -0
  70. package/dist/runtime/components/Breadcrumb.vue +36 -88
  71. package/dist/runtime/components/Breadcrumb.vue.d.ts +82 -0
  72. package/dist/runtime/components/Button.vue +96 -105
  73. package/dist/runtime/components/Button.vue.d.ts +73 -0
  74. package/dist/runtime/components/ButtonGroup.vue +20 -46
  75. package/dist/runtime/components/ButtonGroup.vue.d.ts +55 -0
  76. package/dist/runtime/components/Calendar.vue +73 -127
  77. package/dist/runtime/components/Calendar.vue.d.ts +107 -0
  78. package/dist/runtime/components/Card.vue +18 -40
  79. package/dist/runtime/components/Card.vue.d.ts +38 -0
  80. package/dist/runtime/components/Carousel.vue +112 -230
  81. package/dist/runtime/components/Carousel.vue.d.ts +120 -0
  82. package/dist/runtime/components/Checkbox.vue +52 -93
  83. package/dist/runtime/components/Checkbox.vue.d.ts +76 -0
  84. package/dist/runtime/components/CheckboxGroup.vue +121 -0
  85. package/dist/runtime/components/CheckboxGroup.vue.d.ts +75 -0
  86. package/dist/runtime/components/Chip.vue +26 -69
  87. package/dist/runtime/components/Chip.vue.d.ts +71 -0
  88. package/dist/runtime/components/Collapsible.vue +22 -41
  89. package/dist/runtime/components/Collapsible.vue.d.ts +50 -0
  90. package/dist/runtime/components/ColorPicker.vue +111 -197
  91. package/dist/runtime/components/ColorPicker.vue.d.ts +63 -0
  92. package/dist/runtime/components/CommandPalette.vue +94 -234
  93. package/dist/runtime/components/CommandPalette.vue.d.ts +173 -0
  94. package/dist/runtime/components/Container.vue +15 -28
  95. package/dist/runtime/components/Container.vue.d.ts +27 -0
  96. package/dist/runtime/components/ContextMenu.vue +32 -119
  97. package/dist/runtime/components/ContextMenu.vue.d.ts +127 -0
  98. package/dist/runtime/components/ContextMenuContent.vue +71 -72
  99. package/dist/runtime/components/ContextMenuContent.vue.d.ts +105 -0
  100. package/dist/runtime/components/Drawer.vue +49 -87
  101. package/dist/runtime/components/Drawer.vue.d.ts +88 -0
  102. package/dist/runtime/components/DropdownMenu.vue +37 -129
  103. package/dist/runtime/components/DropdownMenu.vue.d.ts +141 -0
  104. package/dist/runtime/components/DropdownMenuContent.vue +76 -79
  105. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +55 -0
  106. package/dist/runtime/components/Form.vue +135 -219
  107. package/dist/runtime/components/Form.vue.d.ts +66 -0
  108. package/dist/runtime/components/FormField.vue +36 -77
  109. package/dist/runtime/components/FormField.vue.d.ts +70 -0
  110. package/dist/runtime/components/Icon.vue +12 -19
  111. package/dist/runtime/components/Icon.vue.d.ts +17 -0
  112. package/dist/runtime/components/Input.vue +82 -140
  113. package/dist/runtime/components/Input.vue.d.ts +91 -0
  114. package/dist/runtime/components/InputMenu.vue +193 -302
  115. package/dist/runtime/components/InputMenu.vue.d.ts +312 -0
  116. package/dist/runtime/components/InputNumber.vue +71 -133
  117. package/dist/runtime/components/InputNumber.vue.d.ts +193 -0
  118. package/dist/runtime/components/Kbd.vue +20 -46
  119. package/dist/runtime/components/Kbd.vue.d.ts +55 -0
  120. package/dist/runtime/components/Link.vue +98 -173
  121. package/dist/runtime/components/Link.vue.d.ts +124 -0
  122. package/dist/runtime/components/LinkBase.vue +33 -41
  123. package/dist/runtime/components/LinkBase.vue.d.ts +48 -0
  124. package/dist/runtime/components/Modal.vue +53 -116
  125. package/dist/runtime/components/Modal.vue.d.ts +109 -0
  126. package/dist/runtime/components/NavigationMenu.vue +78 -186
  127. package/dist/runtime/components/NavigationMenu.vue.d.ts +159 -0
  128. package/dist/runtime/components/OverlayProvider.vue +14 -18
  129. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -0
  130. package/dist/runtime/components/Pagination.vue +46 -140
  131. package/dist/runtime/components/Pagination.vue.d.ts +143 -0
  132. package/dist/runtime/components/PinInput.vue +61 -78
  133. package/dist/runtime/components/PinInput.vue.d.ts +68 -0
  134. package/dist/runtime/components/Popover.vue +47 -84
  135. package/dist/runtime/components/Popover.vue.d.ts +80 -0
  136. package/dist/runtime/components/Progress.vue +70 -131
  137. package/dist/runtime/components/Progress.vue.d.ts +97 -0
  138. package/dist/runtime/components/RadioGroup.vue +75 -126
  139. package/dist/runtime/components/RadioGroup.vue.d.ts +88 -0
  140. package/dist/runtime/components/Select.vue +115 -202
  141. package/dist/runtime/components/Select.vue.d.ts +139 -0
  142. package/dist/runtime/components/SelectMenu.vue +167 -281
  143. package/dist/runtime/components/SelectMenu.vue.d.ts +184 -0
  144. package/dist/runtime/components/Separator.vue +29 -71
  145. package/dist/runtime/components/Separator.vue.d.ts +75 -0
  146. package/dist/runtime/components/Skeleton.vue +21 -23
  147. package/dist/runtime/components/Skeleton.vue.d.ts +26 -0
  148. package/dist/runtime/components/Slideover.vue +53 -120
  149. package/dist/runtime/components/Slideover.vue.d.ts +111 -0
  150. package/dist/runtime/components/Slider.vue +46 -84
  151. package/dist/runtime/components/Slider.vue.d.ts +71 -0
  152. package/dist/runtime/components/Stepper.vue +44 -113
  153. package/dist/runtime/components/Stepper.vue.d.ts +89 -0
  154. package/dist/runtime/components/Switch.vue +45 -93
  155. package/dist/runtime/components/Switch.vue.d.ts +73 -0
  156. package/dist/runtime/components/Table.vue +165 -264
  157. package/dist/runtime/components/Table.vue.d.ts +183 -0
  158. package/dist/runtime/components/Tabs.vue +40 -105
  159. package/dist/runtime/components/Tabs.vue.d.ts +104 -0
  160. package/dist/runtime/components/Textarea.vue +113 -158
  161. package/dist/runtime/components/Textarea.vue.d.ts +95 -0
  162. package/dist/runtime/components/Toast.vue +49 -110
  163. package/dist/runtime/components/Toast.vue.d.ts +95 -0
  164. package/dist/runtime/components/Toaster.vue +70 -107
  165. package/dist/runtime/components/Toaster.vue.d.ts +63 -0
  166. package/dist/runtime/components/Tooltip.vue +38 -65
  167. package/dist/runtime/components/Tooltip.vue.d.ts +65 -0
  168. package/dist/runtime/components/Tree.vue +57 -150
  169. package/dist/runtime/components/Tree.vue.d.ts +128 -0
  170. package/dist/runtime/composables/defineShortcuts.d.ts +1 -1
  171. package/dist/runtime/composables/defineShortcuts.js +0 -1
  172. package/dist/runtime/composables/useAvatarGroup.d.ts +1 -1
  173. package/dist/runtime/composables/useButtonGroup.d.ts +2 -2
  174. package/dist/runtime/composables/useFormField.d.ts +2 -2
  175. package/dist/runtime/composables/useFormField.js +1 -1
  176. package/dist/runtime/composables/useOverlay.d.ts +16 -8
  177. package/dist/runtime/composables/useOverlay.js +14 -6
  178. package/dist/runtime/composables/usePortal.d.ts +6 -0
  179. package/dist/runtime/composables/usePortal.js +17 -0
  180. package/dist/runtime/index.css +1 -1
  181. package/dist/runtime/inertia/components/Link.vue +146 -0
  182. package/dist/runtime/inertia/components/Link.vue.d.ts +92 -0
  183. package/dist/runtime/inertia/stubs.d.ts +43 -0
  184. package/dist/runtime/inertia/stubs.js +82 -0
  185. package/dist/runtime/locale/bg.d.ts +3 -0
  186. package/dist/runtime/locale/bg.js +54 -0
  187. package/dist/runtime/locale/hy.d.ts +3 -0
  188. package/dist/runtime/locale/hy.js +54 -0
  189. package/dist/runtime/locale/index.d.ts +6 -1
  190. package/dist/runtime/locale/index.js +6 -1
  191. package/dist/runtime/locale/kk.d.ts +3 -0
  192. package/dist/runtime/locale/kk.js +54 -0
  193. package/dist/runtime/locale/tj.d.ts +3 -0
  194. package/dist/runtime/locale/tj.js +54 -0
  195. package/dist/runtime/locale/ug_cn.d.ts +3 -0
  196. package/dist/runtime/locale/ug_cn.js +55 -0
  197. package/dist/runtime/types/form.d.ts +5 -1
  198. package/dist/runtime/types/index.d.ts +2 -0
  199. package/dist/runtime/types/index.js +2 -0
  200. package/dist/runtime/types/utils.d.ts +70 -10
  201. package/dist/runtime/utils/index.d.ts +1 -0
  202. package/dist/runtime/utils/index.js +3 -0
  203. package/dist/runtime/utils/link.d.ts +4 -27
  204. package/dist/runtime/utils/link.js +32 -1
  205. package/dist/runtime/utils/tv.js +2 -2
  206. package/dist/runtime/vue/components/Icon.vue +7 -8
  207. package/dist/runtime/vue/components/Icon.vue.d.ts +14 -0
  208. package/dist/runtime/vue/components/Link.vue +118 -199
  209. package/dist/runtime/vue/components/Link.vue.d.ts +124 -0
  210. package/dist/runtime/vue/stubs.d.ts +5 -0
  211. package/dist/runtime/vue/stubs.js +11 -2
  212. package/dist/shared/{ui.BCaWD5Ek.mjs → ui.D7lOOabO.mjs} +623 -364
  213. package/dist/types.d.mts +5 -1
  214. package/dist/unplugin.d.mts +6 -1
  215. package/dist/unplugin.mjs +25 -4
  216. package/dist/vite.mjs +1 -1
  217. package/package.json +122 -64
  218. package/dist/module.cjs +0 -62
  219. package/dist/module.d.cts +0 -44
  220. package/dist/module.d.ts +0 -44
  221. package/dist/shared/ui.C6uTSFTI.cjs +0 -3555
  222. package/dist/types.d.ts +0 -1
  223. package/dist/unplugin.cjs +0 -232
  224. package/dist/unplugin.d.cts +0 -61
  225. package/dist/unplugin.d.ts +0 -61
  226. package/dist/vite.cjs +0 -23
  227. package/dist/vite.d.cts +0 -15
  228. 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
+ } & {};