@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,141 @@
1
+ import type { DropdownMenuRootProps, DropdownMenuRootEmits, DropdownMenuContentProps, DropdownMenuContentEmits, DropdownMenuArrowProps } from 'reka-ui';
2
+ import type { AppConfig } from '@nuxt/schema';
3
+ import theme from '#build/ui/dropdown-menu';
4
+ import type { AvatarProps, KbdProps, LinkProps } from '../types';
5
+ import type { ArrayOrNested, DynamicSlots, MergeTypes, NestedItem, EmitsToProps, ComponentConfig } from '../types/utils';
6
+ type DropdownMenu = ComponentConfig<typeof theme, AppConfig, 'dropdownMenu'>;
7
+ export interface DropdownMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
8
+ label?: string;
9
+ /**
10
+ * @IconifyIcon
11
+ */
12
+ icon?: string;
13
+ color?: DropdownMenu['variants']['color'];
14
+ avatar?: AvatarProps;
15
+ content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>;
16
+ kbds?: KbdProps['value'][] | KbdProps[];
17
+ /**
18
+ * The item type.
19
+ * @defaultValue 'link'
20
+ */
21
+ type?: 'label' | 'separator' | 'link' | 'checkbox';
22
+ slot?: string;
23
+ loading?: boolean;
24
+ disabled?: boolean;
25
+ checked?: boolean;
26
+ open?: boolean;
27
+ defaultOpen?: boolean;
28
+ children?: ArrayOrNested<DropdownMenuItem>;
29
+ onSelect?(e: Event): void;
30
+ onUpdateChecked?(checked: boolean): void;
31
+ [key: string]: any;
32
+ }
33
+ export interface DropdownMenuProps<T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>> extends Omit<DropdownMenuRootProps, 'dir'> {
34
+ /**
35
+ * @defaultValue 'md'
36
+ */
37
+ size?: DropdownMenu['variants']['size'];
38
+ items?: T;
39
+ /**
40
+ * The icon displayed when an item is checked.
41
+ * @defaultValue appConfig.ui.icons.check
42
+ * @IconifyIcon
43
+ */
44
+ checkedIcon?: string;
45
+ /**
46
+ * The icon displayed when an item is loading.
47
+ * @defaultValue appConfig.ui.icons.loading
48
+ * @IconifyIcon
49
+ */
50
+ loadingIcon?: string;
51
+ /**
52
+ * The icon displayed when the item is an external link.
53
+ * Set to `false` to hide the external icon.
54
+ * @defaultValue appConfig.ui.icons.external
55
+ * @IconifyIcon
56
+ */
57
+ externalIcon?: boolean | string;
58
+ /**
59
+ * The content of the menu.
60
+ * @defaultValue { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
61
+ */
62
+ content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>;
63
+ /**
64
+ * Display an arrow alongside the menu.
65
+ * @defaultValue false
66
+ */
67
+ arrow?: boolean | Omit<DropdownMenuArrowProps, 'as' | 'asChild'>;
68
+ /**
69
+ * Render the menu in a portal.
70
+ * @defaultValue true
71
+ */
72
+ portal?: boolean | string | HTMLElement;
73
+ /**
74
+ * The key used to get the label from the item.
75
+ * @defaultValue 'label'
76
+ */
77
+ labelKey?: keyof NestedItem<T>;
78
+ disabled?: boolean;
79
+ class?: any;
80
+ ui?: DropdownMenu['slots'];
81
+ }
82
+ export interface DropdownMenuEmits extends DropdownMenuRootEmits {
83
+ }
84
+ type SlotProps<T extends DropdownMenuItem> = (props: {
85
+ item: T;
86
+ active?: boolean;
87
+ index: number;
88
+ }) => any;
89
+ export type DropdownMenuSlots<A extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>, T extends NestedItem<A> = NestedItem<A>> = {
90
+ 'default'(props: {
91
+ open: boolean;
92
+ }): any;
93
+ 'item': SlotProps<T>;
94
+ 'item-leading': SlotProps<T>;
95
+ 'item-label': SlotProps<T>;
96
+ 'item-trailing': SlotProps<T>;
97
+ 'content-top': (props?: {}) => any;
98
+ 'content-bottom': (props?: {}) => any;
99
+ } & DynamicSlots<MergeTypes<T>, 'leading' | 'label' | 'trailing', {
100
+ active?: boolean;
101
+ index: number;
102
+ }>;
103
+ declare const _default: <T extends ArrayOrNested<DropdownMenuItem>>(__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<{
104
+ props: __VLS_PrettifyLocal<any & DropdownMenuProps<T> & Partial<{}>> & (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps);
105
+ expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
106
+ attrs: any;
107
+ slots: Readonly<{
108
+ default(props: {
109
+ open: boolean;
110
+ }): any;
111
+ item: SlotProps<NestedItem<T>>;
112
+ 'item-leading': SlotProps<NestedItem<T>>;
113
+ 'item-label': SlotProps<NestedItem<T>>;
114
+ 'item-trailing': SlotProps<NestedItem<T>>;
115
+ 'content-top': (props?: {}) => any;
116
+ 'content-bottom': (props?: {}) => any;
117
+ } & DynamicSlots<MergeTypes<NestedItem<T>>, "trailing" | "leading" | "label", {
118
+ active?: boolean;
119
+ index: number;
120
+ }>> & {
121
+ default(props: {
122
+ open: boolean;
123
+ }): any;
124
+ item: SlotProps<NestedItem<T>>;
125
+ 'item-leading': SlotProps<NestedItem<T>>;
126
+ 'item-label': SlotProps<NestedItem<T>>;
127
+ 'item-trailing': SlotProps<NestedItem<T>>;
128
+ 'content-top': (props?: {}) => any;
129
+ 'content-bottom': (props?: {}) => any;
130
+ } & DynamicSlots<MergeTypes<NestedItem<T>>, "trailing" | "leading" | "label", {
131
+ active?: boolean;
132
+ index: number;
133
+ }>;
134
+ emit: (evt: "update:open", payload: boolean) => void;
135
+ }>) => import("vue").VNode & {
136
+ __ctx?: Awaited<typeof __VLS_setup>;
137
+ };
138
+ export default _default;
139
+ type __VLS_PrettifyLocal<T> = {
140
+ [K in keyof T]: T[K];
141
+ } & {};
@@ -1,100 +1,87 @@
1
- <!-- eslint-disable vue/block-tag-newline -->
2
- <script lang="ts">
3
- import type { DropdownMenuContentProps as RekaDropdownMenuContentProps, DropdownMenuContentEmits as RekaDropdownMenuContentEmits } from 'reka-ui'
4
- import theme from '#build/ui/dropdown-menu'
5
- import { tv } from '../utils/tv'
6
- import type { KbdProps, AvatarProps, DropdownMenuItem, DropdownMenuSlots } from '../types'
7
- import type { ArrayOrNested, NestedItem } from '../types/utils'
8
-
9
- const _dropdownMenu = tv(theme)()
10
-
11
- interface DropdownMenuContentProps<T extends ArrayOrNested<DropdownMenuItem>> extends Omit<RekaDropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> {
12
- items?: T
13
- portal?: boolean
14
- sub?: boolean
15
- labelKey: keyof NestedItem<T>
16
- /**
17
- * @IconifyIcon
18
- */
19
- checkedIcon?: string
20
- /**
21
- * @IconifyIcon
22
- */
23
- loadingIcon?: string
24
- /**
25
- * @IconifyIcon
26
- */
27
- externalIcon?: boolean | string
28
- class?: any
29
- ui: typeof _dropdownMenu
30
- uiOverride?: any
31
- }
32
-
33
- interface DropdownMenuContentEmits extends RekaDropdownMenuContentEmits {}
34
-
35
- type DropdownMenuContentSlots<T extends ArrayOrNested<DropdownMenuItem>> = Omit<DropdownMenuSlots<T>, 'default'> & {
36
- default(props?: {}): any
37
- }
1
+ <script>
38
2
 
39
3
  </script>
40
4
 
41
- <script setup lang="ts" generic="T extends ArrayOrNested<DropdownMenuItem>">
42
- import { computed } from 'vue'
43
- import { DropdownMenu } from 'reka-ui/namespaced'
44
- import { useForwardPropsEmits } from 'reka-ui'
45
- import { reactiveOmit, createReusableTemplate } from '@vueuse/core'
46
- import { useAppConfig } from '#imports'
47
- import { omit, get, isArrayOfArray } from '../utils'
48
- import { pickLinkProps } from '../utils/link'
49
- import ULinkBase from './LinkBase.vue'
50
- import ULink from './Link.vue'
51
- import UAvatar from './Avatar.vue'
52
- import UIcon from './Icon.vue'
53
- import UKbd from './Kbd.vue'
54
- // eslint-disable-next-line import/no-self-import
55
- import UDropdownMenuContent from './DropdownMenuContent.vue'
56
-
57
- const props = defineProps<DropdownMenuContentProps<T>>()
58
- const emits = defineEmits<DropdownMenuContentEmits>()
59
- const slots = defineSlots<DropdownMenuContentSlots<T>>()
60
-
61
- const appConfig = useAppConfig()
62
- const contentProps = useForwardPropsEmits(reactiveOmit(props, 'sub', 'items', 'portal', 'labelKey', 'checkedIcon', 'loadingIcon', 'externalIcon', 'class', 'ui', 'uiOverride'), emits)
63
- const proxySlots = omit(slots, ['default'])
64
-
65
- const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate<{ item: DropdownMenuItem, active?: boolean, index: number }>()
66
-
67
- const groups = computed<DropdownMenuItem[][]>(() =>
68
- props.items?.length
69
- ? isArrayOfArray(props.items)
70
- ? props.items
71
- : [props.items]
72
- : []
73
- )
5
+ <script setup>
6
+ import { computed, toRef } from "vue";
7
+ import { DropdownMenu } from "reka-ui/namespaced";
8
+ import { useForwardPropsEmits } from "reka-ui";
9
+ import { reactiveOmit, createReusableTemplate } from "@vueuse/core";
10
+ import { useAppConfig } from "#imports";
11
+ import { useLocale } from "../composables/useLocale";
12
+ import { usePortal } from "../composables/usePortal";
13
+ import { omit, get, isArrayOfArray } from "../utils";
14
+ import { pickLinkProps } from "../utils/link";
15
+ import ULinkBase from "./LinkBase.vue";
16
+ import ULink from "./Link.vue";
17
+ import UAvatar from "./Avatar.vue";
18
+ import UIcon from "./Icon.vue";
19
+ import UKbd from "./Kbd.vue";
20
+ import UDropdownMenuContent from "./DropdownMenuContent.vue";
21
+ const props = defineProps({
22
+ items: { type: null, required: false },
23
+ portal: { type: [Boolean, String], required: false, skipCheck: true },
24
+ sub: { type: Boolean, required: false },
25
+ labelKey: { type: null, required: true },
26
+ checkedIcon: { type: String, required: false },
27
+ loadingIcon: { type: String, required: false },
28
+ externalIcon: { type: [Boolean, String], required: false },
29
+ class: { type: null, required: false },
30
+ ui: { type: null, required: true },
31
+ uiOverride: { type: null, required: false },
32
+ loop: { type: Boolean, required: false },
33
+ side: { type: null, required: false },
34
+ sideOffset: { type: Number, required: false },
35
+ align: { type: null, required: false },
36
+ alignOffset: { type: Number, required: false },
37
+ avoidCollisions: { type: Boolean, required: false },
38
+ collisionBoundary: { type: null, required: false },
39
+ collisionPadding: { type: [Number, Object], required: false },
40
+ arrowPadding: { type: Number, required: false },
41
+ sticky: { type: String, required: false },
42
+ hideWhenDetached: { type: Boolean, required: false },
43
+ positionStrategy: { type: String, required: false },
44
+ updatePositionStrategy: { type: String, required: false },
45
+ disableUpdateOnLayoutShift: { type: Boolean, required: false },
46
+ prioritizePosition: { type: Boolean, required: false },
47
+ reference: { type: null, required: false }
48
+ });
49
+ const emits = defineEmits(["escapeKeyDown", "pointerDownOutside", "focusOutside", "interactOutside", "closeAutoFocus"]);
50
+ const slots = defineSlots();
51
+ const { dir } = useLocale();
52
+ const appConfig = useAppConfig();
53
+ const portalProps = usePortal(toRef(() => props.portal));
54
+ const contentProps = useForwardPropsEmits(reactiveOmit(props, "sub", "items", "portal", "labelKey", "checkedIcon", "loadingIcon", "externalIcon", "class", "ui", "uiOverride"), emits);
55
+ const proxySlots = omit(slots, ["default"]);
56
+ const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate();
57
+ const childrenIcon = computed(() => dir.value === "rtl" ? appConfig.ui.icons.chevronLeft : appConfig.ui.icons.chevronRight);
58
+ const groups = computed(
59
+ () => props.items?.length ? isArrayOfArray(props.items) ? props.items : [props.items] : []
60
+ );
74
61
  </script>
75
62
 
76
63
  <template>
77
64
  <DefineItemTemplate v-slot="{ item, active, index }">
78
- <slot :name="((item.slot || 'item') as keyof DropdownMenuContentSlots<T>)" :item="(item as Extract<NestedItem<T>, { slot: string; }>)" :index="index">
79
- <slot :name="((item.slot ? `${item.slot}-leading`: 'item-leading') as keyof DropdownMenuContentSlots<T>)" :item="(item as Extract<NestedItem<T>, { slot: string; }>)" :active="active" :index="index">
65
+ <slot :name="item.slot || 'item'" :item="item" :index="index">
66
+ <slot :name="item.slot ? `${item.slot}-leading` : 'item-leading'" :item="item" :active="active" :index="index">
80
67
  <UIcon v-if="item.loading" :name="loadingIcon || appConfig.ui.icons.loading" :class="ui.itemLeadingIcon({ class: uiOverride?.itemLeadingIcon, color: item?.color, loading: true })" />
81
68
  <UIcon v-else-if="item.icon" :name="item.icon" :class="ui.itemLeadingIcon({ class: uiOverride?.itemLeadingIcon, color: item?.color, active })" />
82
- <UAvatar v-else-if="item.avatar" :size="((props.uiOverride?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()) as AvatarProps['size'])" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: uiOverride?.itemLeadingAvatar, active })" />
69
+ <UAvatar v-else-if="item.avatar" :size="props.uiOverride?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()" v-bind="item.avatar" :class="ui.itemLeadingAvatar({ class: uiOverride?.itemLeadingAvatar, active })" />
83
70
  </slot>
84
71
 
85
- <span v-if="get(item, props.labelKey as string) || !!slots[(item.slot ? `${item.slot}-label`: 'item-label') as keyof DropdownMenuContentSlots<T>]" :class="ui.itemLabel({ class: uiOverride?.itemLabel, active })">
86
- <slot :name="((item.slot ? `${item.slot}-label`: 'item-label') as keyof DropdownMenuContentSlots<T>)" :item="(item as Extract<NestedItem<T>, { slot: string; }>)" :active="active" :index="index">
87
- {{ get(item, props.labelKey as string) }}
72
+ <span v-if="get(item, props.labelKey) || !!slots[item.slot ? `${item.slot}-label` : 'item-label']" :class="ui.itemLabel({ class: uiOverride?.itemLabel, active })">
73
+ <slot :name="item.slot ? `${item.slot}-label` : 'item-label'" :item="item" :active="active" :index="index">
74
+ {{ get(item, props.labelKey) }}
88
75
  </slot>
89
76
 
90
77
  <UIcon v-if="item.target === '_blank' && externalIcon !== false" :name="typeof externalIcon === 'string' ? externalIcon : appConfig.ui.icons.external" :class="ui.itemLabelExternalIcon({ class: uiOverride?.itemLabelExternalIcon, color: item?.color, active })" />
91
78
  </span>
92
79
 
93
80
  <span :class="ui.itemTrailing({ class: uiOverride?.itemTrailing })">
94
- <slot :name="((item.slot ? `${item.slot}-trailing`: 'item-trailing') as keyof DropdownMenuContentSlots<T>)" :item="(item as Extract<NestedItem<T>, { slot: string; }>)" :active="active" :index="index">
95
- <UIcon v-if="item.children?.length" :name="appConfig.ui.icons.chevronRight" :class="ui.itemTrailingIcon({ class: uiOverride?.itemTrailingIcon, color: item?.color, active })" />
81
+ <slot :name="item.slot ? `${item.slot}-trailing` : 'item-trailing'" :item="item" :active="active" :index="index">
82
+ <UIcon v-if="item.children?.length" :name="childrenIcon" :class="ui.itemTrailingIcon({ class: uiOverride?.itemTrailingIcon, color: item?.color, active })" />
96
83
  <span v-else-if="item.kbds?.length" :class="ui.itemTrailingKbds({ class: uiOverride?.itemTrailingKbds })">
97
- <UKbd v-for="(kbd, kbdIndex) in item.kbds" :key="kbdIndex" :size="((props.uiOverride?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()) as KbdProps['size'])" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
84
+ <UKbd v-for="(kbd, kbdIndex) in item.kbds" :key="kbdIndex" :size="props.uiOverride?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
98
85
  </span>
99
86
  </slot>
100
87
 
@@ -105,8 +92,10 @@ const groups = computed<DropdownMenuItem[][]>(() =>
105
92
  </slot>
106
93
  </DefineItemTemplate>
107
94
 
108
- <DropdownMenu.Portal :disabled="!portal">
95
+ <DropdownMenu.Portal v-bind="portalProps">
109
96
  <component :is="sub ? DropdownMenu.SubContent : DropdownMenu.Content" :class="props.class" v-bind="contentProps">
97
+ <slot name="content-top" />
98
+
110
99
  <DropdownMenu.Group v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="ui.group({ class: uiOverride?.group })">
111
100
  <template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
112
101
  <DropdownMenu.Label v-if="item.type === 'label'" :class="ui.label({ class: uiOverride?.label })">
@@ -118,7 +107,7 @@ const groups = computed<DropdownMenuItem[][]>(() =>
118
107
  as="button"
119
108
  type="button"
120
109
  :disabled="item.disabled"
121
- :text-value="get(item, props.labelKey as string)"
110
+ :text-value="get(item, props.labelKey)"
122
111
  :class="ui.item({ class: uiOverride?.item, color: item?.color })"
123
112
  >
124
113
  <ReuseItemTemplate :item="item" :index="index" />
@@ -130,8 +119,7 @@ const groups = computed<DropdownMenuItem[][]>(() =>
130
119
  :ui="ui"
131
120
  :ui-override="uiOverride"
132
121
  :portal="portal"
133
- :items="(item.children as T)"
134
- side="right"
122
+ :items="item.children"
135
123
  align="start"
136
124
  :align-offset="-4"
137
125
  :side-offset="3"
@@ -141,8 +129,8 @@ const groups = computed<DropdownMenuItem[][]>(() =>
141
129
  :external-icon="externalIcon"
142
130
  v-bind="item.content"
143
131
  >
144
- <template v-for="(_, name) in proxySlots" #[name]="slotData: any">
145
- <slot :name="(name as keyof DropdownMenuContentSlots<T>)" v-bind="slotData" />
132
+ <template v-for="(_, name) in proxySlots" #[name]="slotData">
133
+ <slot :name="name" v-bind="slotData" />
146
134
  </template>
147
135
  </UDropdownMenuContent>
148
136
  </DropdownMenu.Sub>
@@ -150,7 +138,7 @@ const groups = computed<DropdownMenuItem[][]>(() =>
150
138
  v-else-if="item.type === 'checkbox'"
151
139
  :model-value="item.checked"
152
140
  :disabled="item.disabled"
153
- :text-value="get(item, props.labelKey as string)"
141
+ :text-value="get(item, props.labelKey)"
154
142
  :class="ui.item({ class: [uiOverride?.item, item.class], color: item?.color })"
155
143
  @update:model-value="item.onUpdateChecked"
156
144
  @select="item.onSelect"
@@ -161,10 +149,10 @@ const groups = computed<DropdownMenuItem[][]>(() =>
161
149
  v-else
162
150
  as-child
163
151
  :disabled="item.disabled"
164
- :text-value="get(item, props.labelKey as string)"
152
+ :text-value="get(item, props.labelKey)"
165
153
  @select="item.onSelect"
166
154
  >
167
- <ULink v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item as Omit<DropdownMenuItem, 'type'>)" custom>
155
+ <ULink v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item)" custom>
168
156
  <ULinkBase v-bind="slotProps" :class="ui.item({ class: [uiOverride?.item, item.class], color: item?.color, active })">
169
157
  <ReuseItemTemplate :item="item" :active="active" :index="index" />
170
158
  </ULinkBase>
@@ -174,6 +162,8 @@ const groups = computed<DropdownMenuItem[][]>(() =>
174
162
  </DropdownMenu.Group>
175
163
 
176
164
  <slot />
165
+
166
+ <slot name="content-bottom" />
177
167
  </component>
178
168
  </DropdownMenu.Portal>
179
169
  </template>
@@ -0,0 +1,55 @@
1
+ import { DropdownMenu } from 'reka-ui/namespaced';
2
+ import type { DropdownMenuContentProps as RekaDropdownMenuContentProps } from 'reka-ui';
3
+ import type { AppConfig } from '@nuxt/schema';
4
+ import type theme from '#build/ui/dropdown-menu';
5
+ import type { DropdownMenuItem, DropdownMenuSlots } from '../types';
6
+ import type { ArrayOrNested, NestedItem, ComponentConfig } from '../types/utils';
7
+ type DropdownMenu = ComponentConfig<typeof theme, AppConfig, 'dropdownMenu'>;
8
+ interface DropdownMenuContentProps<T extends ArrayOrNested<DropdownMenuItem>> extends Omit<RekaDropdownMenuContentProps, '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<DropdownMenu['slots']>]: (props?: Record<string, any>) => string;
28
+ };
29
+ uiOverride?: DropdownMenu['slots'];
30
+ }
31
+ declare const _default: <T extends ArrayOrNested<DropdownMenuItem>>(__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 & DropdownMenuContentProps<T> & Partial<{}>> & (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps);
33
+ expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
34
+ attrs: any;
35
+ slots: Readonly<Omit<DropdownMenuSlots<T>, "default"> & {
36
+ default(props?: {}): any;
37
+ }> & Omit<DropdownMenuSlots<T>, "default"> & {
38
+ default(props?: {}): any;
39
+ };
40
+ emit: ((evt: "escapeKeyDown", event: KeyboardEvent) => void) & ((evt: "pointerDownOutside", event: CustomEvent<{
41
+ originalEvent: PointerEvent;
42
+ }>) => void) & ((evt: "focusOutside", event: CustomEvent<{
43
+ originalEvent: FocusEvent;
44
+ }>) => void) & ((evt: "interactOutside", event: CustomEvent<{
45
+ originalEvent: PointerEvent;
46
+ }> | CustomEvent<{
47
+ originalEvent: FocusEvent;
48
+ }>) => void) & ((evt: "closeAutoFocus", event: Event) => void);
49
+ }>) => import("vue").VNode & {
50
+ __ctx?: Awaited<typeof __VLS_setup>;
51
+ };
52
+ export default _default;
53
+ type __VLS_PrettifyLocal<T> = {
54
+ [K in keyof T]: T[K];
55
+ } & {};