@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,105 @@
1
+ import { ContextMenu } from 'reka-ui/namespaced';
2
+ import type { ContextMenuContentProps as RekaContextMenuContentProps } from 'reka-ui';
3
+ import type { AppConfig } from '@nuxt/schema';
4
+ import type theme from '#build/ui/context-menu';
5
+ import type { ContextMenuItem } from '../types';
6
+ import type { ArrayOrNested, NestedItem, ComponentConfig } from '../types/utils';
7
+ type ContextMenu = ComponentConfig<typeof theme, AppConfig, 'contextMenu'>;
8
+ interface ContextMenuContentProps<T extends ArrayOrNested<ContextMenuItem>> extends Omit<RekaContextMenuContentProps, 'as' | 'asChild' | 'forceMount'> {
9
+ items?: T;
10
+ portal?: boolean | string | HTMLElement;
11
+ sub?: boolean;
12
+ labelKey: keyof NestedItem<T>;
13
+ /**
14
+ * @IconifyIcon
15
+ */
16
+ checkedIcon?: string;
17
+ /**
18
+ * @IconifyIcon
19
+ */
20
+ loadingIcon?: string;
21
+ /**
22
+ * @IconifyIcon
23
+ */
24
+ externalIcon?: boolean | string;
25
+ class?: any;
26
+ ui: {
27
+ [K in keyof Required<ContextMenu['slots']>]: (props?: Record<string, any>) => string;
28
+ };
29
+ uiOverride?: ContextMenu['slots'];
30
+ }
31
+ declare const _default: <T extends ArrayOrNested<ContextMenuItem>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
32
+ props: __VLS_PrettifyLocal<any & ContextMenuContentProps<T> & Partial<{}>> & (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps);
33
+ expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
34
+ attrs: any;
35
+ slots: Readonly<{
36
+ default(props?: {}): any;
37
+ item: (props: {
38
+ item: NestedItem<T>;
39
+ active?: boolean;
40
+ index: number;
41
+ }) => any;
42
+ 'item-leading': (props: {
43
+ item: NestedItem<T>;
44
+ active?: boolean;
45
+ index: number;
46
+ }) => any;
47
+ 'item-label': (props: {
48
+ item: NestedItem<T>;
49
+ active?: boolean;
50
+ index: number;
51
+ }) => any;
52
+ 'item-trailing': (props: {
53
+ item: NestedItem<T>;
54
+ active?: boolean;
55
+ index: number;
56
+ }) => any;
57
+ 'content-top': (props?: {}) => any;
58
+ 'content-bottom': (props?: {}) => any;
59
+ } & import("../types").DynamicSlots<import("../types").MergeTypes<NestedItem<T>>, "trailing" | "leading" | "label", {
60
+ active?: boolean;
61
+ index: number;
62
+ }>> & {
63
+ default(props?: {}): any;
64
+ item: (props: {
65
+ item: NestedItem<T>;
66
+ active?: boolean;
67
+ index: number;
68
+ }) => any;
69
+ 'item-leading': (props: {
70
+ item: NestedItem<T>;
71
+ active?: boolean;
72
+ index: number;
73
+ }) => any;
74
+ 'item-label': (props: {
75
+ item: NestedItem<T>;
76
+ active?: boolean;
77
+ index: number;
78
+ }) => any;
79
+ 'item-trailing': (props: {
80
+ item: NestedItem<T>;
81
+ active?: boolean;
82
+ index: number;
83
+ }) => any;
84
+ 'content-top': (props?: {}) => any;
85
+ 'content-bottom': (props?: {}) => any;
86
+ } & import("../types").DynamicSlots<import("../types").MergeTypes<NestedItem<T>>, "trailing" | "leading" | "label", {
87
+ active?: boolean;
88
+ index: number;
89
+ }>;
90
+ emit: ((evt: "escapeKeyDown", event: KeyboardEvent) => void) & ((evt: "pointerDownOutside", event: CustomEvent<{
91
+ originalEvent: PointerEvent;
92
+ }>) => void) & ((evt: "focusOutside", event: CustomEvent<{
93
+ originalEvent: FocusEvent;
94
+ }>) => void) & ((evt: "interactOutside", event: CustomEvent<{
95
+ originalEvent: PointerEvent;
96
+ }> | CustomEvent<{
97
+ originalEvent: FocusEvent;
98
+ }>) => void) & ((evt: "closeAutoFocus", event: Event) => void);
99
+ }>) => import("vue").VNode & {
100
+ __ctx?: Awaited<typeof __VLS_setup>;
101
+ };
102
+ export default _default;
103
+ type __VLS_PrettifyLocal<T> = {
104
+ [K in keyof T]: T[K];
105
+ } & {};
@@ -1,90 +1,56 @@
1
- <script lang="ts">
2
- import type { DrawerRootProps, DrawerRootEmits } from 'vaul-vue'
3
- import type { DialogContentProps, DialogContentEmits } from 'reka-ui'
4
- import type { AppConfig } from '@nuxt/schema'
5
- import _appConfig from '#build/app.config'
6
- import theme from '#build/ui/drawer'
7
- import { tv } from '../utils/tv'
8
- import type { EmitsToProps } from '../types/utils'
9
-
10
- const appConfigDrawer = _appConfig as AppConfig & { ui: { drawer: Partial<typeof theme> } }
11
-
12
- const drawer = tv({ extend: tv(theme), ...(appConfigDrawer.ui?.drawer || {}) })
13
-
14
- export interface DrawerProps extends Pick<DrawerRootProps, 'activeSnapPoint' | 'closeThreshold' | 'shouldScaleBackground' | 'setBackgroundColorOnScale' | 'scrollLockTimeout' | 'fixed' | 'dismissible' | 'modal' | 'open' | 'defaultOpen' | 'nested' | 'direction' | 'noBodyStyles' | 'handleOnly' | 'preventScrollRestoration' | 'snapPoints'> {
15
- /**
16
- * The element or component this component should render as.
17
- * @defaultValue 'div'
18
- */
19
- as?: any
20
- title?: string
21
- description?: string
22
- /**
23
- * Whether to inset the drawer from the edges.
24
- * @defaultValue false
25
- */
26
- inset?: boolean
27
- /** The content of the drawer. */
28
- content?: Omit<DialogContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DialogContentEmits>>
29
- /**
30
- * Render an overlay behind the drawer.
31
- * @defaultValue true
32
- */
33
- overlay?: boolean
34
- /**
35
- * Render a handle on the drawer.
36
- * @defaultValue true
37
- */
38
- handle?: boolean
39
- /**
40
- * Render the drawer in a portal.
41
- * @defaultValue true
42
- */
43
- portal?: boolean
44
- class?: any
45
- ui?: Partial<typeof drawer.slots>
46
- }
47
-
48
- export interface DrawerEmits extends DrawerRootEmits {}
49
-
50
- export interface DrawerSlots {
51
- default(props?: {}): any
52
- content(props?: {}): any
53
- header(props?: {}): any
54
- title(props?: {}): any
55
- description(props?: {}): any
56
- body(props?: {}): any
57
- footer(props?: {}): any
58
- }
1
+ <script>
2
+ import theme from "#build/ui/drawer";
59
3
  </script>
60
4
 
61
- <script setup lang="ts">
62
- import { computed, toRef } from 'vue'
63
- import { useForwardPropsEmits } from 'reka-ui'
64
- import { DrawerRoot, DrawerTrigger, DrawerPortal, DrawerOverlay, DrawerContent, DrawerTitle, DrawerDescription, DrawerHandle } from 'vaul-vue'
65
- import { reactivePick } from '@vueuse/core'
66
-
67
- const props = withDefaults(defineProps<DrawerProps>(), {
68
- direction: 'bottom',
69
- portal: true,
70
- overlay: true,
71
- handle: true,
72
- modal: true,
73
- dismissible: true
74
- })
75
- const emits = defineEmits<DrawerEmits>()
76
- const slots = defineSlots<DrawerSlots>()
77
-
78
- const rootProps = useForwardPropsEmits(reactivePick(props, 'activeSnapPoint', 'closeThreshold', 'shouldScaleBackground', 'setBackgroundColorOnScale', 'scrollLockTimeout', 'fixed', 'dismissible', 'modal', 'open', 'defaultOpen', 'nested', 'direction', 'noBodyStyles', 'handleOnly', 'preventScrollRestoration', 'snapPoints'), emits)
79
- const contentProps = toRef(() => props.content)
5
+ <script setup>
6
+ import { computed, toRef } from "vue";
7
+ import { useForwardPropsEmits } from "reka-ui";
8
+ import { DrawerRoot, DrawerTrigger, DrawerPortal, DrawerOverlay, DrawerContent, DrawerTitle, DrawerDescription, DrawerHandle } from "vaul-vue";
9
+ import { reactivePick } from "@vueuse/core";
10
+ import { useAppConfig } from "#imports";
11
+ import { usePortal } from "../composables/usePortal";
12
+ import { tv } from "../utils/tv";
13
+ const props = defineProps({
14
+ as: { type: null, required: false },
15
+ title: { type: String, required: false },
16
+ description: { type: String, required: false },
17
+ inset: { type: Boolean, required: false },
18
+ content: { type: Object, required: false },
19
+ overlay: { type: Boolean, required: false, default: true },
20
+ handle: { 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
+ activeSnapPoint: { type: [Number, String, null], required: false },
25
+ closeThreshold: { type: Number, required: false },
26
+ shouldScaleBackground: { type: Boolean, required: false },
27
+ setBackgroundColorOnScale: { type: Boolean, required: false },
28
+ scrollLockTimeout: { type: Number, required: false },
29
+ fixed: { type: Boolean, required: false },
30
+ dismissible: { type: Boolean, required: false, default: true },
31
+ modal: { type: Boolean, required: false, default: true },
32
+ open: { type: Boolean, required: false },
33
+ defaultOpen: { type: Boolean, required: false },
34
+ nested: { type: Boolean, required: false },
35
+ direction: { type: String, required: false, default: "bottom" },
36
+ noBodyStyles: { type: Boolean, required: false },
37
+ handleOnly: { type: Boolean, required: false },
38
+ preventScrollRestoration: { type: Boolean, required: false },
39
+ snapPoints: { type: Array, required: false }
40
+ });
41
+ const emits = defineEmits(["drag", "release", "close", "update:open", "update:activeSnapPoint", "animationEnd"]);
42
+ const slots = defineSlots();
43
+ const appConfig = useAppConfig();
44
+ const rootProps = useForwardPropsEmits(reactivePick(props, "activeSnapPoint", "closeThreshold", "shouldScaleBackground", "setBackgroundColorOnScale", "scrollLockTimeout", "fixed", "dismissible", "modal", "open", "defaultOpen", "nested", "direction", "noBodyStyles", "handleOnly", "preventScrollRestoration", "snapPoints"), emits);
45
+ const portalProps = usePortal(toRef(() => props.portal));
46
+ const contentProps = toRef(() => props.content);
80
47
  const contentEvents = {
81
- closeAutoFocus: (e: Event) => e.preventDefault()
82
- }
83
-
84
- const ui = computed(() => drawer({
48
+ closeAutoFocus: (e) => e.preventDefault()
49
+ };
50
+ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.drawer || {} })({
85
51
  direction: props.direction,
86
52
  inset: props.inset
87
- }))
53
+ }));
88
54
  </script>
89
55
 
90
56
  <template>
@@ -93,7 +59,7 @@ const ui = computed(() => drawer({
93
59
  <slot />
94
60
  </DrawerTrigger>
95
61
 
96
- <DrawerPortal :disabled="!portal">
62
+ <DrawerPortal v-bind="portalProps">
97
63
  <DrawerOverlay v-if="overlay" :class="ui.overlay({ class: props.ui?.overlay })" />
98
64
 
99
65
  <DrawerContent :class="ui.content({ class: [!slots.default && props.class, props.ui?.content] })" v-bind="contentProps" v-on="contentEvents">
@@ -0,0 +1,88 @@
1
+ import type { DrawerRootProps, DrawerRootEmits } from 'vaul-vue';
2
+ import type { DialogContentProps, DialogContentEmits } from 'reka-ui';
3
+ import type { AppConfig } from '@nuxt/schema';
4
+ import theme from '#build/ui/drawer';
5
+ import type { EmitsToProps, ComponentConfig } from '../types/utils';
6
+ type Drawer = ComponentConfig<typeof theme, AppConfig, 'drawer'>;
7
+ export interface DrawerProps extends Pick<DrawerRootProps, 'activeSnapPoint' | 'closeThreshold' | 'shouldScaleBackground' | 'setBackgroundColorOnScale' | 'scrollLockTimeout' | 'fixed' | 'dismissible' | 'modal' | 'open' | 'defaultOpen' | 'nested' | 'direction' | 'noBodyStyles' | 'handleOnly' | 'preventScrollRestoration' | 'snapPoints'> {
8
+ /**
9
+ * The element or component this component should render as.
10
+ * @defaultValue 'div'
11
+ */
12
+ as?: any;
13
+ title?: string;
14
+ description?: string;
15
+ /**
16
+ * Whether to inset the drawer from the edges.
17
+ * @defaultValue false
18
+ */
19
+ inset?: boolean;
20
+ /** The content of the drawer. */
21
+ content?: Omit<DialogContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DialogContentEmits>>;
22
+ /**
23
+ * Render an overlay behind the drawer.
24
+ * @defaultValue true
25
+ */
26
+ overlay?: boolean;
27
+ /**
28
+ * Render a handle on the drawer.
29
+ * @defaultValue true
30
+ */
31
+ handle?: boolean;
32
+ /**
33
+ * Render the drawer in a portal.
34
+ * @defaultValue true
35
+ */
36
+ portal?: boolean | string | HTMLElement;
37
+ class?: any;
38
+ ui?: Drawer['slots'];
39
+ }
40
+ export interface DrawerEmits extends DrawerRootEmits {
41
+ }
42
+ export interface DrawerSlots {
43
+ default(props?: {}): any;
44
+ content(props?: {}): any;
45
+ header(props?: {}): any;
46
+ title(props?: {}): any;
47
+ description(props?: {}): any;
48
+ body(props?: {}): any;
49
+ footer(props?: {}): any;
50
+ }
51
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<DrawerProps>, {
52
+ direction: string;
53
+ portal: boolean;
54
+ overlay: boolean;
55
+ handle: boolean;
56
+ modal: boolean;
57
+ dismissible: boolean;
58
+ }>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, any, string, import("vue").PublicProps, any, {
59
+ modal: boolean;
60
+ portal: boolean | string | HTMLElement;
61
+ overlay: boolean;
62
+ direction: import("vaul-vue").DrawerDirection;
63
+ dismissible: boolean;
64
+ handle: boolean;
65
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, Readonly<DrawerSlots> & DrawerSlots>;
66
+ export default _default;
67
+ type __VLS_WithDefaults<P, D> = {
68
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
69
+ default: D[K];
70
+ }> : P[K];
71
+ };
72
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
73
+ type __VLS_TypePropsToOption<T> = {
74
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
75
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
76
+ } : {
77
+ type: import('vue').PropType<T[K]>;
78
+ required: true;
79
+ };
80
+ };
81
+ type __VLS_WithTemplateSlots<T, S> = T & {
82
+ new (): {
83
+ $slots: S;
84
+ };
85
+ };
86
+ type __VLS_PrettifyLocal<T> = {
87
+ [K in keyof T]: T[K];
88
+ } & {};
@@ -1,146 +1,43 @@
1
- <!-- eslint-disable vue/block-tag-newline -->
2
- <script lang="ts">
3
- import type { VariantProps } from 'tailwind-variants'
4
- import type { DropdownMenuRootProps, DropdownMenuRootEmits, DropdownMenuContentProps, DropdownMenuContentEmits, DropdownMenuArrowProps } from 'reka-ui'
5
- import type { AppConfig } from '@nuxt/schema'
6
- import _appConfig from '#build/app.config'
7
- import theme from '#build/ui/dropdown-menu'
8
- import { tv } from '../utils/tv'
9
- import type { AvatarProps, KbdProps, LinkProps } from '../types'
10
- import type {
11
- ArrayOrNested,
12
- DynamicSlots,
13
- MergeTypes,
14
- NestedItem,
15
- PartialString,
16
- EmitsToProps
17
- } from '../types/utils'
18
-
19
- const appConfigDropdownMenu = _appConfig as AppConfig & { ui: { dropdownMenu: Partial<typeof theme> } }
20
-
21
- const dropdownMenu = tv({ extend: tv(theme), ...(appConfigDropdownMenu.ui?.dropdownMenu || {}) })
22
-
23
- type DropdownMenuVariants = VariantProps<typeof dropdownMenu>
24
-
25
- export interface DropdownMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
26
- label?: string
27
- /**
28
- * @IconifyIcon
29
- */
30
- icon?: string
31
- color?: DropdownMenuVariants['color']
32
- avatar?: AvatarProps
33
- content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>
34
- kbds?: KbdProps['value'][] | KbdProps[]
35
- /**
36
- * The item type.
37
- * @defaultValue 'link'
38
- */
39
- type?: 'label' | 'separator' | 'link' | 'checkbox'
40
- slot?: string
41
- loading?: boolean
42
- disabled?: boolean
43
- checked?: boolean
44
- open?: boolean
45
- defaultOpen?: boolean
46
- children?: ArrayOrNested<DropdownMenuItem>
47
- onSelect?(e: Event): void
48
- onUpdateChecked?(checked: boolean): void
49
- [key: string]: any
50
- }
51
-
52
- export interface DropdownMenuProps<T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>> extends Omit<DropdownMenuRootProps, 'dir'> {
53
- /**
54
- * @defaultValue 'md'
55
- */
56
- size?: DropdownMenuVariants['size']
57
- items?: T
58
- /**
59
- * The icon displayed when an item is checked.
60
- * @defaultValue appConfig.ui.icons.check
61
- * @IconifyIcon
62
- */
63
- checkedIcon?: string
64
- /**
65
- * The icon displayed when an item is loading.
66
- * @defaultValue appConfig.ui.icons.loading
67
- * @IconifyIcon
68
- */
69
- loadingIcon?: string
70
- /**
71
- * The icon displayed when the item is an external link.
72
- * Set to `false` to hide the external icon.
73
- * @defaultValue appConfig.ui.icons.external
74
- * @IconifyIcon
75
- */
76
- externalIcon?: boolean | string
77
- /**
78
- * The content of the menu.
79
- * @defaultValue { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
80
- */
81
- content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>
82
- /**
83
- * Display an arrow alongside the menu.
84
- * @defaultValue false
85
- */
86
- arrow?: boolean | Omit<DropdownMenuArrowProps, 'as' | 'asChild'>
87
- /**
88
- * Render the menu in a portal.
89
- * @defaultValue true
90
- */
91
- portal?: boolean
92
- /**
93
- * The key used to get the label from the item.
94
- * @defaultValue 'label'
95
- */
96
- labelKey?: keyof NestedItem<T>
97
- disabled?: boolean
98
- class?: any
99
- ui?: PartialString<typeof dropdownMenu.slots>
100
- }
101
-
102
- export interface DropdownMenuEmits extends DropdownMenuRootEmits {}
103
-
104
- type SlotProps<T extends DropdownMenuItem> = (props: { item: T, active?: boolean, index: number }) => any
105
-
106
- export type DropdownMenuSlots<
107
- A extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>,
108
- T extends NestedItem<A> = NestedItem<A>
109
- > = {
110
- 'default'(props: { open: boolean }): any
111
- 'item': SlotProps<T>
112
- 'item-leading': SlotProps<T>
113
- 'item-label': SlotProps<T>
114
- 'item-trailing': SlotProps<T>
115
- } & DynamicSlots<MergeTypes<T>, 'leading' | 'label' | 'trailing', { active?: boolean, index: number }>
116
-
1
+ <script>
2
+ import theme from "#build/ui/dropdown-menu";
117
3
  </script>
118
4
 
119
- <script setup lang="ts" generic="T extends ArrayOrNested<DropdownMenuItem>">
120
- import { computed, toRef } from 'vue'
121
- import { defu } from 'defu'
122
- import { DropdownMenuRoot, DropdownMenuTrigger, DropdownMenuArrow, useForwardPropsEmits } from 'reka-ui'
123
- import { reactivePick } from '@vueuse/core'
124
- import { omit } from '../utils'
125
- import UDropdownMenuContent from './DropdownMenuContent.vue'
126
-
127
- const props = withDefaults(defineProps<DropdownMenuProps<T>>(), {
128
- portal: true,
129
- modal: true,
130
- externalIcon: true,
131
- labelKey: 'label'
132
- })
133
- const emits = defineEmits<DropdownMenuEmits>()
134
- const slots = defineSlots<DropdownMenuSlots<T>>()
135
-
136
- const rootProps = useForwardPropsEmits(reactivePick(props, 'defaultOpen', 'open', 'modal'), emits)
137
- const contentProps = toRef(() => defu(props.content, { side: 'bottom', sideOffset: 8, collisionPadding: 8 }) as DropdownMenuContentProps)
138
- const arrowProps = toRef(() => props.arrow as DropdownMenuArrowProps)
139
- const proxySlots = omit(slots, ['default'])
140
-
141
- const ui = computed(() => dropdownMenu({
5
+ <script setup>
6
+ import { computed, toRef } from "vue";
7
+ import { defu } from "defu";
8
+ import { DropdownMenuRoot, DropdownMenuTrigger, DropdownMenuArrow, useForwardPropsEmits } from "reka-ui";
9
+ import { reactivePick } from "@vueuse/core";
10
+ import { useAppConfig } from "#imports";
11
+ import { omit } from "../utils";
12
+ import { tv } from "../utils/tv";
13
+ import UDropdownMenuContent from "./DropdownMenuContent.vue";
14
+ const props = defineProps({
15
+ size: { type: null, required: false },
16
+ items: { type: null, required: false },
17
+ checkedIcon: { type: String, required: false },
18
+ loadingIcon: { type: String, required: false },
19
+ externalIcon: { type: [Boolean, String], required: false, default: true },
20
+ content: { type: Object, required: false },
21
+ arrow: { type: [Boolean, Object], required: false },
22
+ portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
23
+ labelKey: { type: null, required: false, default: "label" },
24
+ disabled: { type: Boolean, required: false },
25
+ class: { type: null, required: false },
26
+ ui: { type: null, required: false },
27
+ defaultOpen: { type: Boolean, required: false },
28
+ open: { type: Boolean, required: false },
29
+ modal: { type: Boolean, required: false, default: true }
30
+ });
31
+ const emits = defineEmits(["update:open"]);
32
+ const slots = defineSlots();
33
+ const appConfig = useAppConfig();
34
+ const rootProps = useForwardPropsEmits(reactivePick(props, "defaultOpen", "open", "modal"), emits);
35
+ const contentProps = toRef(() => defu(props.content, { side: "bottom", sideOffset: 8, collisionPadding: 8 }));
36
+ const arrowProps = toRef(() => props.arrow);
37
+ const proxySlots = omit(slots, ["default"]);
38
+ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.dropdownMenu || {} })({
142
39
  size: props.size
143
- }))
40
+ }));
144
41
  </script>
145
42
 
146
43
  <template>
@@ -156,13 +53,13 @@ const ui = computed(() => dropdownMenu({
156
53
  v-bind="contentProps"
157
54
  :items="items"
158
55
  :portal="portal"
159
- :label-key="(labelKey as keyof NestedItem<T>)"
56
+ :label-key="labelKey"
160
57
  :checked-icon="checkedIcon"
161
58
  :loading-icon="loadingIcon"
162
59
  :external-icon="externalIcon"
163
60
  >
164
61
  <template v-for="(_, name) in proxySlots" #[name]="slotData">
165
- <slot :name="(name as keyof DropdownMenuSlots<T>)" v-bind="slotData" />
62
+ <slot :name="name" v-bind="slotData" />
166
63
  </template>
167
64
 
168
65
  <DropdownMenuArrow v-if="!!arrow" v-bind="arrowProps" :class="ui.arrow({ class: props.ui?.arrow })" />