@byyuurin/ui 0.0.10 → 0.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 (289) hide show
  1. package/README.md +170 -58
  2. package/dist/module.d.mts +4 -13
  3. package/dist/module.json +4 -4
  4. package/dist/module.mjs +54 -20
  5. package/dist/runtime/components/Accordion.vue +48 -72
  6. package/dist/runtime/components/Accordion.vue.d.ts +74 -0
  7. package/dist/runtime/components/Alert.vue +65 -83
  8. package/dist/runtime/components/Alert.vue.d.ts +71 -0
  9. package/dist/runtime/components/App.vue +28 -42
  10. package/dist/runtime/components/App.vue.d.ts +26 -0
  11. package/dist/runtime/components/Avatar.vue +82 -58
  12. package/dist/runtime/components/Avatar.vue.d.ts +39 -0
  13. package/dist/runtime/components/AvatarGroup.vue +43 -70
  14. package/dist/runtime/components/AvatarGroup.vue.d.ts +30 -0
  15. package/dist/runtime/components/Badge.vue +70 -64
  16. package/dist/runtime/components/Badge.vue.d.ts +45 -0
  17. package/dist/runtime/components/Breadcrumb.vue +56 -76
  18. package/dist/runtime/components/Breadcrumb.vue.d.ts +79 -0
  19. package/dist/runtime/components/Button.vue +150 -78
  20. package/dist/runtime/components/Button.vue.d.ts +45 -0
  21. package/dist/runtime/components/Calendar.vue +99 -125
  22. package/dist/runtime/components/Calendar.vue.d.ts +102 -0
  23. package/dist/runtime/components/Card.vue +33 -46
  24. package/dist/runtime/components/Card.vue.d.ts +34 -0
  25. package/dist/runtime/components/Carousel.vue +164 -237
  26. package/dist/runtime/components/Carousel.vue.d.ts +125 -0
  27. package/dist/runtime/components/Checkbox.vue +86 -88
  28. package/dist/runtime/components/Checkbox.vue.d.ts +63 -0
  29. package/dist/runtime/components/Chip.vue +44 -58
  30. package/dist/runtime/components/Chip.vue.d.ts +48 -0
  31. package/dist/runtime/components/Collapsible.vue +29 -33
  32. package/dist/runtime/components/Collapsible.vue.d.ts +34 -0
  33. package/dist/runtime/components/Drawer.vue +110 -150
  34. package/dist/runtime/components/Drawer.vue.d.ts +103 -0
  35. package/dist/runtime/components/DropdownMenu.vue +49 -120
  36. package/dist/runtime/components/DropdownMenu.vue.d.ts +140 -0
  37. package/dist/runtime/components/DropdownMenuContent.vue +177 -143
  38. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +51 -0
  39. package/dist/runtime/components/FieldGroup.vue +33 -0
  40. package/dist/runtime/components/FieldGroup.vue.d.ts +33 -0
  41. package/dist/runtime/components/Form.vue +245 -275
  42. package/dist/runtime/components/Form.vue.d.ts +103 -0
  43. package/dist/runtime/components/FormField.vue +108 -0
  44. package/dist/runtime/components/FormField.vue.d.ts +63 -0
  45. package/dist/runtime/components/Icon.vue +20 -0
  46. package/dist/runtime/components/Icon.vue.d.ts +9 -0
  47. package/dist/runtime/components/Input.vue +125 -156
  48. package/dist/runtime/components/Input.vue.d.ts +76 -0
  49. package/dist/runtime/components/InputNumber.vue +103 -130
  50. package/dist/runtime/components/InputNumber.vue.d.ts +191 -0
  51. package/dist/runtime/components/Kbd.vue +24 -39
  52. package/dist/runtime/components/Kbd.vue.d.ts +34 -0
  53. package/dist/runtime/components/Link.vue +105 -337
  54. package/dist/runtime/components/Link.vue.d.ts +95 -0
  55. package/dist/runtime/components/LinkBase.vue +31 -71
  56. package/dist/runtime/components/LinkBase.vue.d.ts +33 -0
  57. package/dist/runtime/components/Modal.vue +82 -103
  58. package/dist/runtime/components/Modal.vue.d.ts +96 -0
  59. package/dist/runtime/components/NavigationMenu.vue +336 -0
  60. package/dist/runtime/components/NavigationMenu.vue.d.ts +181 -0
  61. package/dist/runtime/components/OverlayProvider.vue +12 -16
  62. package/dist/runtime/components/OverlayProvider.vue.d.ts +3 -0
  63. package/dist/runtime/components/Pagination.vue +65 -139
  64. package/dist/runtime/components/Pagination.vue.d.ts +116 -0
  65. package/dist/runtime/components/PinInput.vue +78 -73
  66. package/dist/runtime/components/PinInput.vue.d.ts +54 -0
  67. package/dist/runtime/components/Popover.vue +60 -75
  68. package/dist/runtime/components/Popover.vue.d.ts +70 -0
  69. package/dist/runtime/components/Progress.vue +79 -126
  70. package/dist/runtime/components/Progress.vue.d.ts +63 -0
  71. package/dist/runtime/components/RadioGroup.vue +109 -140
  72. package/dist/runtime/components/RadioGroup.vue.d.ts +96 -0
  73. package/dist/runtime/components/ScrollArea.vue +50 -48
  74. package/dist/runtime/components/ScrollArea.vue.d.ts +21 -0
  75. package/dist/runtime/components/Select.vue +221 -221
  76. package/dist/runtime/components/Select.vue.d.ts +260 -0
  77. package/dist/runtime/components/Separator.vue +55 -47
  78. package/dist/runtime/components/Separator.vue.d.ts +48 -0
  79. package/dist/runtime/components/Skeleton.vue +25 -22
  80. package/dist/runtime/components/Skeleton.vue.d.ts +19 -0
  81. package/dist/runtime/components/Slider.vue +73 -77
  82. package/dist/runtime/components/Slider.vue.d.ts +52 -0
  83. package/dist/runtime/components/Switch.vue +66 -77
  84. package/dist/runtime/components/Switch.vue.d.ts +58 -0
  85. package/dist/runtime/components/Table.vue +357 -215
  86. package/dist/runtime/components/Table.vue.d.ts +234 -0
  87. package/dist/runtime/components/Tabs.vue +90 -88
  88. package/dist/runtime/components/Tabs.vue.d.ts +97 -0
  89. package/dist/runtime/components/Textarea.vue +147 -146
  90. package/dist/runtime/components/Textarea.vue.d.ts +76 -0
  91. package/dist/runtime/components/Toast.vue +108 -90
  92. package/dist/runtime/components/Toast.vue.d.ts +152 -0
  93. package/dist/runtime/components/ToastProvider.vue +82 -109
  94. package/dist/runtime/components/ToastProvider.vue.d.ts +51 -0
  95. package/dist/runtime/components/Tooltip.vue +54 -53
  96. package/dist/runtime/components/Tooltip.vue.d.ts +53 -0
  97. package/dist/runtime/composables/defineShortcuts.d.ts +16 -0
  98. package/dist/runtime/composables/defineShortcuts.js +129 -0
  99. package/dist/runtime/composables/useAvatarGroup.d.ts +8 -3
  100. package/dist/runtime/composables/useAvatarGroup.js +10 -3
  101. package/dist/runtime/composables/useComponentIcons.d.ts +9 -6
  102. package/dist/runtime/composables/useComponentIcons.js +4 -4
  103. package/dist/runtime/composables/useFieldGroup.d.ts +8 -0
  104. package/dist/runtime/composables/useFieldGroup.js +14 -0
  105. package/dist/runtime/composables/useFormField.d.ts +62 -0
  106. package/dist/runtime/composables/useFormField.js +99 -0
  107. package/dist/runtime/composables/useKbd.d.ts +3 -2
  108. package/dist/runtime/composables/useKbd.js +3 -2
  109. package/dist/runtime/composables/useLocale.d.ts +68 -5
  110. package/dist/runtime/composables/useLocale.js +11 -11
  111. package/dist/runtime/composables/useOverlay.d.ts +51 -15
  112. package/dist/runtime/composables/useOverlay.js +44 -30
  113. package/dist/runtime/composables/usePortal.d.ts +6 -0
  114. package/dist/runtime/composables/usePortal.js +17 -0
  115. package/dist/runtime/composables/useToast.d.ts +12 -5
  116. package/dist/runtime/composables/useToast.js +12 -7
  117. package/dist/runtime/locale/en.d.ts +30 -1
  118. package/dist/runtime/locale/en.js +2 -1
  119. package/dist/runtime/locale/index.d.ts +2 -2
  120. package/dist/runtime/locale/index.js +1 -1
  121. package/dist/runtime/locale/zh_tw.d.ts +31 -0
  122. package/dist/runtime/locale/{zh-tw.js → zh_tw.js} +2 -1
  123. package/dist/runtime/plugins/colors.d.ts +2 -0
  124. package/dist/runtime/plugins/colors.js +50 -0
  125. package/dist/runtime/types/app.config.d.ts +6 -0
  126. package/dist/runtime/types/form.d.ts +58 -17
  127. package/dist/runtime/types/form.js +11 -0
  128. package/dist/runtime/types/index.d.ts +51 -8
  129. package/dist/runtime/types/index.js +45 -2
  130. package/dist/runtime/types/input.d.ts +8 -0
  131. package/dist/runtime/types/locale.d.ts +5 -0
  132. package/dist/runtime/types/style.d.ts +33 -0
  133. package/dist/runtime/types/style.js +0 -0
  134. package/dist/runtime/types/unocss.d.ts +4 -0
  135. package/dist/runtime/types/utils.d.ts +38 -37
  136. package/dist/runtime/utils/form.d.ts +5 -1
  137. package/dist/runtime/utils/form.js +49 -0
  138. package/dist/runtime/utils/index.d.ts +10 -13
  139. package/dist/runtime/utils/index.js +41 -48
  140. package/dist/runtime/utils/link.d.ts +5 -6
  141. package/dist/runtime/utils/link.js +16 -2
  142. package/dist/runtime/utils/locale.d.ts +5 -0
  143. package/dist/runtime/utils/locale.js +10 -0
  144. package/dist/runtime/utils/style.d.ts +94 -0
  145. package/dist/runtime/utils/style.js +37 -0
  146. package/dist/runtime/vue/components/Icon.vue +15 -0
  147. package/dist/runtime/vue/components/Icon.vue.d.ts +7 -0
  148. package/dist/runtime/vue/components/Link.vue +163 -0
  149. package/dist/runtime/vue/components/Link.vue.d.ts +95 -0
  150. package/dist/runtime/vue/composables/useAppConfig.d.ts +1 -0
  151. package/dist/runtime/vue/composables/useAppConfig.js +4 -0
  152. package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
  153. package/dist/runtime/vue/plugins/color-mode.js +6 -0
  154. package/dist/runtime/vue/plugins/head.d.ts +4 -0
  155. package/dist/runtime/vue/plugins/head.js +9 -0
  156. package/dist/runtime/vue/stubs.d.ts +16 -1
  157. package/dist/runtime/vue/stubs.js +32 -1
  158. package/dist/setup.d.mts +13 -0
  159. package/dist/setup.mjs +12 -0
  160. package/dist/shared/ui.CzIlLITK.mjs +51 -0
  161. package/dist/shared/ui.DSyJHSTk.mjs +3787 -0
  162. package/dist/shared/ui.DpbffTXs.d.mts +84 -0
  163. package/dist/shared/ui.IulR-OYx.d.mts +64 -0
  164. package/dist/types.d.mts +3 -1
  165. package/dist/unocss.d.mts +12 -52
  166. package/dist/unocss.mjs +144 -253
  167. package/dist/unplugin.d.mts +13 -26
  168. package/dist/unplugin.mjs +193 -18
  169. package/dist/vite.d.mts +10 -1
  170. package/dist/vite.mjs +12 -3
  171. package/package.json +156 -87
  172. package/vue-plugin.d.ts +5 -0
  173. package/dist/module.cjs +0 -5
  174. package/dist/module.d.ts +0 -13
  175. package/dist/module.mjs.map +0 -1
  176. package/dist/runtime/app/injections.d.ts +0 -9307
  177. package/dist/runtime/app/injections.js +0 -61
  178. package/dist/runtime/components/ButtonGroup.vue +0 -46
  179. package/dist/runtime/components/FormItem.vue +0 -129
  180. package/dist/runtime/composables/useButtonGroup.d.ts +0 -5
  181. package/dist/runtime/composables/useButtonGroup.js +0 -9
  182. package/dist/runtime/composables/useFormItem.d.ts +0 -27
  183. package/dist/runtime/composables/useFormItem.js +0 -64
  184. package/dist/runtime/composables/useTheme.d.ts +0 -9
  185. package/dist/runtime/composables/useTheme.js +0 -23
  186. package/dist/runtime/index.d.ts +0 -44
  187. package/dist/runtime/index.js +0 -44
  188. package/dist/runtime/locale/zh-tw.d.ts +0 -2
  189. package/dist/runtime/theme/accordion.d.ts +0 -56
  190. package/dist/runtime/theme/accordion.js +0 -28
  191. package/dist/runtime/theme/alert.d.ts +0 -125
  192. package/dist/runtime/theme/alert.js +0 -47
  193. package/dist/runtime/theme/app.d.ts +0 -19
  194. package/dist/runtime/theme/app.js +0 -19
  195. package/dist/runtime/theme/avatar-group.d.ts +0 -52
  196. package/dist/runtime/theme/avatar-group.js +0 -32
  197. package/dist/runtime/theme/avatar.d.ts +0 -56
  198. package/dist/runtime/theme/avatar.js +0 -34
  199. package/dist/runtime/theme/badge.d.ts +0 -82
  200. package/dist/runtime/theme/badge.js +0 -92
  201. package/dist/runtime/theme/breadcrumb.d.ts +0 -67
  202. package/dist/runtime/theme/breadcrumb.js +0 -44
  203. package/dist/runtime/theme/button-group.d.ts +0 -66
  204. package/dist/runtime/theme/button-group.js +0 -42
  205. package/dist/runtime/theme/button.d.ts +0 -190
  206. package/dist/runtime/theme/button.js +0 -164
  207. package/dist/runtime/theme/calendar.d.ts +0 -56
  208. package/dist/runtime/theme/calendar.js +0 -69
  209. package/dist/runtime/theme/card.d.ts +0 -62
  210. package/dist/runtime/theme/card.js +0 -37
  211. package/dist/runtime/theme/carousel.d.ts +0 -113
  212. package/dist/runtime/theme/carousel.js +0 -43
  213. package/dist/runtime/theme/checkbox.d.ts +0 -88
  214. package/dist/runtime/theme/checkbox.js +0 -54
  215. package/dist/runtime/theme/chip.d.ts +0 -67
  216. package/dist/runtime/theme/chip.js +0 -66
  217. package/dist/runtime/theme/collapsible.d.ts +0 -38
  218. package/dist/runtime/theme/collapsible.js +0 -10
  219. package/dist/runtime/theme/drawer.d.ts +0 -148
  220. package/dist/runtime/theme/drawer.js +0 -113
  221. package/dist/runtime/theme/dropdown-menu.d.ts +0 -71
  222. package/dist/runtime/theme/dropdown-menu.js +0 -83
  223. package/dist/runtime/theme/form-item.d.ts +0 -76
  224. package/dist/runtime/theme/form-item.js +0 -34
  225. package/dist/runtime/theme/form.d.ts +0 -8
  226. package/dist/runtime/theme/form.js +0 -7
  227. package/dist/runtime/theme/index.d.ts +0 -41
  228. package/dist/runtime/theme/index.js +0 -41
  229. package/dist/runtime/theme/input-number.d.ts +0 -121
  230. package/dist/runtime/theme/input-number.js +0 -95
  231. package/dist/runtime/theme/input.d.ts +0 -178
  232. package/dist/runtime/theme/input.js +0 -151
  233. package/dist/runtime/theme/kbd.d.ts +0 -39
  234. package/dist/runtime/theme/kbd.js +0 -26
  235. package/dist/runtime/theme/link.d.ts +0 -44
  236. package/dist/runtime/theme/link.js +0 -26
  237. package/dist/runtime/theme/modal.d.ts +0 -48
  238. package/dist/runtime/theme/modal.js +0 -55
  239. package/dist/runtime/theme/pagination.d.ts +0 -80
  240. package/dist/runtime/theme/pagination.js +0 -17
  241. package/dist/runtime/theme/pinInput.d.ts +0 -100
  242. package/dist/runtime/theme/pinInput.js +0 -111
  243. package/dist/runtime/theme/popover.d.ts +0 -38
  244. package/dist/runtime/theme/popover.js +0 -13
  245. package/dist/runtime/theme/progress.d.ts +0 -186
  246. package/dist/runtime/theme/progress.js +0 -95
  247. package/dist/runtime/theme/radio-group.d.ts +0 -110
  248. package/dist/runtime/theme/radio-group.js +0 -61
  249. package/dist/runtime/theme/scroll-area.d.ts +0 -73
  250. package/dist/runtime/theme/scroll-area.js +0 -33
  251. package/dist/runtime/theme/select.d.ts +0 -192
  252. package/dist/runtime/theme/select.js +0 -173
  253. package/dist/runtime/theme/separator.d.ts +0 -80
  254. package/dist/runtime/theme/separator.js +0 -53
  255. package/dist/runtime/theme/skeleton.d.ts +0 -8
  256. package/dist/runtime/theme/skeleton.js +0 -7
  257. package/dist/runtime/theme/slider.d.ts +0 -76
  258. package/dist/runtime/theme/slider.js +0 -52
  259. package/dist/runtime/theme/switch.d.ts +0 -122
  260. package/dist/runtime/theme/switch.js +0 -78
  261. package/dist/runtime/theme/table.d.ts +0 -92
  262. package/dist/runtime/theme/table.js +0 -36
  263. package/dist/runtime/theme/tabs.d.ts +0 -135
  264. package/dist/runtime/theme/tabs.js +0 -146
  265. package/dist/runtime/theme/textarea.d.ts +0 -96
  266. package/dist/runtime/theme/textarea.js +0 -116
  267. package/dist/runtime/theme/toast-provider.d.ts +0 -122
  268. package/dist/runtime/theme/toast-provider.js +0 -97
  269. package/dist/runtime/theme/toast.d.ts +0 -89
  270. package/dist/runtime/theme/toast.js +0 -35
  271. package/dist/runtime/theme/tooltip.d.ts +0 -44
  272. package/dist/runtime/theme/tooltip.js +0 -11
  273. package/dist/runtime/types/components.d.ts +0 -42
  274. package/dist/runtime/utils/extend-theme.d.ts +0 -9
  275. package/dist/runtime/utils/extend-theme.js +0 -27
  276. package/dist/runtime/utils/styler.d.ts +0 -4
  277. package/dist/runtime/utils/styler.js +0 -10
  278. package/dist/runtime/utils/translator.d.ts +0 -18
  279. package/dist/runtime/utils/translator.js +0 -8
  280. package/dist/shared/ui.3e7fad19.mjs +0 -5
  281. package/dist/shared/ui.3e7fad19.mjs.map +0 -1
  282. package/dist/types.d.ts +0 -1
  283. package/dist/unocss.d.ts +0 -52
  284. package/dist/unocss.mjs.map +0 -1
  285. package/dist/unplugin.d.ts +0 -26
  286. package/dist/unplugin.mjs.map +0 -1
  287. package/dist/vite.d.ts +0 -9
  288. package/dist/vite.mjs.map +0 -1
  289. /package/dist/runtime/types/{components.js → input.js} +0 -0
@@ -0,0 +1,140 @@
1
+ import type { VariantProps } from '@byyuurin/ui-kit';
2
+ import type { DropdownMenuArrowProps, DropdownMenuContentEmits, DropdownMenuContentProps, DropdownMenuRootEmits, DropdownMenuRootProps } from 'reka-ui';
3
+ import theme from '#build/ui/dropdown-menu';
4
+ import type { AvatarProps, ComponentBaseProps, ComponentStyler, ComponentUIProps, IconProps, KbdProps, LinkProps } from '../types';
5
+ import type { ArrayOrNested, DynamicSlots, EmitsToProps, GetItemKeys, MergeTypes, NestedItem, StaticSlot } from '../types/utils';
6
+ export interface DropdownMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
7
+ label?: string;
8
+ description?: string;
9
+ icon?: IconProps['name'];
10
+ color?: ThemeVariants['color'];
11
+ avatar?: AvatarProps;
12
+ content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>;
13
+ kbds?: KbdProps['value'][] | KbdProps[];
14
+ /**
15
+ * The item type.
16
+ * @default "link"
17
+ */
18
+ type?: 'label' | 'separator' | 'link' | 'checkbox';
19
+ slot?: string;
20
+ loading?: boolean;
21
+ disabled?: boolean;
22
+ checked?: boolean;
23
+ open?: boolean;
24
+ defaultOpen?: boolean;
25
+ children?: ArrayOrNested<DropdownMenuItem>;
26
+ onSelect?: (e: Event) => void;
27
+ onUpdateChecked?: (checked: boolean) => void;
28
+ ui?: Pick<ComponentUIProps<typeof theme>, 'item' | 'label' | 'separator' | 'itemLeadingIcon' | 'itemLeadingAvatarSize' | 'itemLeadingAvatar' | 'itemWrapper' | 'itemLabel' | 'itemDescription' | 'itemLabelExternalIcon' | 'itemTrailing' | 'itemTrailingIcon' | 'itemTrailingKbds' | 'itemTrailingKbdsSize'>;
29
+ [key: string]: any;
30
+ }
31
+ type ThemeVariants = VariantProps<typeof theme>;
32
+ export interface DropdownMenuProps<T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>> extends ComponentBaseProps, Omit<DropdownMenuRootProps, 'dir'> {
33
+ /** @default "md" */
34
+ size?: ThemeVariants['size'];
35
+ items?: T;
36
+ /**
37
+ * The icon displayed when an item is checked.
38
+ * @default app.icons.check
39
+ */
40
+ checkedIcon?: IconProps['name'];
41
+ /**
42
+ * The icon displayed when an item is loading.
43
+ * @default app.icons.loading
44
+ */
45
+ loadingIcon?: IconProps['name'];
46
+ /**
47
+ * The icon displayed when the item is an external link.
48
+ *
49
+ * Set to `false` to hide the external icon.
50
+ * @default app.icons.external
51
+ */
52
+ externalIcon?: boolean | IconProps['name'];
53
+ /**
54
+ * The content of the menu.
55
+ * @default { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
56
+ */
57
+ content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>;
58
+ /**
59
+ * Display an arrow alongside the menu.
60
+ * @default false
61
+ */
62
+ arrow?: boolean | Omit<DropdownMenuArrowProps, 'as' | 'asChild'>;
63
+ /**
64
+ * Render the menu in a portal.
65
+ * @default true
66
+ */
67
+ portal?: boolean | string | HTMLElement;
68
+ /**
69
+ * The key used to get the label from the item.
70
+ * @default "label"
71
+ */
72
+ labelKey?: GetItemKeys<T>;
73
+ /**
74
+ * The key used to get the description from the item.
75
+ * @default "description"
76
+ */
77
+ descriptionKey?: GetItemKeys<T>;
78
+ disabled?: boolean;
79
+ ui?: ComponentUIProps<typeof theme>;
80
+ }
81
+ export interface DropdownMenuEmits extends DropdownMenuRootEmits {
82
+ }
83
+ export type DropdownMenuSlots<A extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>, T extends NestedItem<A> = NestedItem<A>> = {
84
+ 'default': StaticSlot<{
85
+ open: boolean;
86
+ }>;
87
+ 'item': StaticSlot<{
88
+ item: T;
89
+ active?: boolean;
90
+ index: number;
91
+ ui: ComponentStyler<typeof theme>;
92
+ }>;
93
+ 'item-leading': StaticSlot<{
94
+ item: T;
95
+ active?: boolean;
96
+ index: number;
97
+ ui: ComponentStyler<typeof theme>;
98
+ }>;
99
+ 'item-label': StaticSlot<{
100
+ item: T;
101
+ active?: boolean;
102
+ index: number;
103
+ }>;
104
+ 'item-description': StaticSlot<{
105
+ item: T;
106
+ active?: boolean;
107
+ index: number;
108
+ }>;
109
+ 'item-trailing': StaticSlot<{
110
+ item: T;
111
+ active?: boolean;
112
+ index: number;
113
+ ui: ComponentStyler<typeof theme>;
114
+ }>;
115
+ 'content-top': StaticSlot;
116
+ 'content-bottom': StaticSlot;
117
+ } & DynamicSlots<MergeTypes<T>, 'label' | 'description', {
118
+ active?: boolean;
119
+ index: number;
120
+ }> & DynamicSlots<MergeTypes<T>, 'leading' | 'trailing', {
121
+ active?: boolean;
122
+ index: number;
123
+ ui: ComponentStyler<typeof theme>;
124
+ }>;
125
+ declare const __VLS_export: <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<{
126
+ props: __VLS_PrettifyLocal<DropdownMenuProps<T> & {
127
+ "onUpdate:open"?: ((payload: boolean) => any) | undefined;
128
+ }> & import("vue").PublicProps;
129
+ expose: (exposed: {}) => void;
130
+ attrs: any;
131
+ slots: DropdownMenuSlots<T, NestedItem<T>>;
132
+ emit: (evt: "update:open", payload: boolean) => void;
133
+ }>) => import("vue").VNode & {
134
+ __ctx?: Awaited<typeof __VLS_setup>;
135
+ };
136
+ declare const _default: typeof __VLS_export;
137
+ export default _default;
138
+ type __VLS_PrettifyLocal<T> = {
139
+ [K in keyof T as K]: T[K];
140
+ } & {};
@@ -1,188 +1,222 @@
1
- <script lang="ts">
2
- import type { VariantProps } from '@byyuurin/ui-kit'
3
- import type { DropdownMenuContentEmits as RekaDropdownMenuContentEmits, DropdownMenuContentProps as RekaDropdownMenuContentProps } from 'reka-ui'
4
- import type { dropdownMenu } from '../theme'
5
- import type { ArrayOrNested, ComponentAttrs, DropdownMenuItem, DropdownMenuSlots, NestedItem } from '../types'
1
+ <script>
6
2
 
7
- type ExtractItem<T extends ArrayOrNested<any>> = Extract<NestedItem<T>, { slot: string }>
8
-
9
- export type DropdownMenuContentSlots<T extends ArrayOrNested<DropdownMenuItem>> = Omit<DropdownMenuSlots<T>, 'default'> & {
10
- default?: any
11
- }
12
-
13
- export interface DropdownMenuContentEmits extends RekaDropdownMenuContentEmits {}
14
-
15
- type DropdownMenuVariants = VariantProps<typeof dropdownMenu>
16
-
17
- export interface DropdownMenuContentProps<T extends ArrayOrNested<DropdownMenuItem>> extends ComponentAttrs<typeof dropdownMenu>, Omit<RekaDropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> {
18
- size?: DropdownMenuVariants['size']
19
- items?: T
20
- portal?: boolean
21
- sub?: boolean
22
- labelKey: keyof NestedItem<T>
23
- checkedIcon?: string
24
- loadingIcon?: string
25
- externalIcon?: boolean | string
26
- }
27
3
  </script>
28
4
 
29
- <script setup lang="ts" generic="T extends ArrayOrNested<DropdownMenuItem>">
30
- import { createReusableTemplate, reactiveOmit } from '@vueuse/core'
31
- import { useForwardPropsEmits } from 'reka-ui'
32
- import { DropdownMenu } from 'reka-ui/namespaced'
33
- import { computed } from 'vue'
34
- import { useTheme } from '../composables/useTheme'
35
- import { get, isArrayOfArray, omit } from '../utils'
36
- import { pickLinkProps } from '../utils/link'
37
- import Avatar from './Avatar.vue'
38
- // eslint-disable-next-line import/no-self-import
39
- import DropdownMenuContent from './DropdownMenuContent.vue'
40
- import Kbd from './Kbd.vue'
41
- import Link from './Link.vue'
42
- import LinkBase from './LinkBase.vue'
43
-
44
- const props = defineProps<DropdownMenuContentProps<T>>()
45
- const emit = defineEmits<DropdownMenuContentEmits>()
46
- const slots = defineSlots<DropdownMenuContentSlots<T>>()
47
-
48
- const contentProps = useForwardPropsEmits(reactiveOmit(props, 'sub', 'items', 'portal', 'labelKey', 'checkedIcon', 'loadingIcon', 'externalIcon', 'class', 'ui'), emit)
49
- // @ts-expect-error pass check
50
- const proxySlots = omit(slots, ['default']) as Record<string, DropdownMenuContentSlots<T>[string]>
51
-
52
- const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate<{ item: DropdownMenuItem, active?: boolean, index: number }>()
53
-
5
+ <script setup>
6
+ import { createReusableTemplate, reactiveOmit } from "@vueuse/core";
7
+ import { useForwardPropsEmits } from "reka-ui";
8
+ import { DropdownMenu } from "reka-ui/namespaced";
9
+ import { computed, toRef } from "vue";
10
+ import { useAppConfig } from "#imports";
11
+ import { useLocale } from "../composables/useLocale";
12
+ import { usePortal } from "../composables/usePortal";
13
+ import { get, isArrayOfArray, omit } from "../utils";
14
+ import { pickLinkProps } from "../utils/link";
15
+ import Avatar from "./Avatar.vue";
16
+ import DropdownMenuContent from "./DropdownMenuContent.vue";
17
+ import Icon from "./Icon.vue";
18
+ import Kbd from "./Kbd.vue";
19
+ import Link from "./Link.vue";
20
+ import LinkBase from "./LinkBase.vue";
21
+ defineOptions({ inheritAttrs: false });
22
+ const props = defineProps({
23
+ size: { type: null, required: false },
24
+ items: { type: null, required: false },
25
+ portal: { type: [Boolean, String], required: false, skipCheck: true },
26
+ sub: { type: Boolean, required: false },
27
+ labelKey: { type: null, required: true },
28
+ descriptionKey: { type: null, required: true },
29
+ checkedIcon: { type: [String, Object], required: false },
30
+ loadingIcon: { type: [String, Object], required: false },
31
+ externalIcon: { type: [Boolean, String, Object], required: false },
32
+ ui: { type: null, required: true },
33
+ uiOverride: { type: null, required: false },
34
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
35
+ loop: { type: Boolean, required: false },
36
+ side: { type: null, required: false },
37
+ sideOffset: { type: Number, required: false },
38
+ sideFlip: { type: Boolean, required: false },
39
+ align: { type: null, required: false },
40
+ alignOffset: { type: Number, required: false },
41
+ alignFlip: { type: Boolean, required: false },
42
+ avoidCollisions: { type: Boolean, required: false },
43
+ collisionBoundary: { type: null, required: false },
44
+ collisionPadding: { type: [Number, Object], required: false },
45
+ arrowPadding: { type: Number, required: false },
46
+ sticky: { type: String, required: false },
47
+ hideWhenDetached: { type: Boolean, required: false },
48
+ positionStrategy: { type: String, required: false },
49
+ updatePositionStrategy: { type: String, required: false },
50
+ disableUpdateOnLayoutShift: { type: Boolean, required: false },
51
+ prioritizePosition: { type: Boolean, required: false },
52
+ reference: { type: null, required: false }
53
+ });
54
+ const emit = defineEmits(["escapeKeyDown", "pointerDownOutside", "focusOutside", "interactOutside", "closeAutoFocus"]);
55
+ const slots = defineSlots();
56
+ const portalProps = usePortal(toRef(() => props.portal));
57
+ const contentProps = useForwardPropsEmits(reactiveOmit(props, "sub", "items", "portal", "labelKey", "descriptionKey", "checkedIcon", "loadingIcon", "externalIcon", "class", "ui", "uiOverride"), emit);
58
+ const getProxySlots = () => omit(slots, ["default"]);
59
+ const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate();
60
+ const { dir } = useLocale();
61
+ const appConfig = useAppConfig();
62
+ const childrenIcon = computed(() => dir.value === "rtl" ? appConfig.ui.icons.chevronLeft : appConfig.ui.icons.chevronRight);
54
63
  const groups = computed(
55
- () => props.items?.length
56
- ? isArrayOfArray(props.items) ? props.items : [props.items]
57
- : [],
58
- )
59
-
60
- const { theme, generateStyle } = useTheme()
61
- const style = computed(() => generateStyle('dropdownMenu', props))
64
+ () => props.items?.length ? isArrayOfArray(props.items) ? props.items : [props.items] : []
65
+ );
62
66
  </script>
63
67
 
64
68
  <template>
65
69
  <DefineItemTemplate v-slot="{ item, active, index }">
66
- <slot :name="((item.slot || 'item') as keyof DropdownMenuContentSlots<T>)" :item="(item as ExtractItem<T>)" :index="index">
67
- <slot :name="(`${item.slot || 'item'}-leading` as keyof DropdownMenuContentSlots<T>)" :item="(item as ExtractItem<T>)" :active="active" :index="index">
68
- <span
70
+ <slot :name="item.slot || 'item'" :item="item" :index="index" :ui="ui">
71
+ <slot :name="`${item.slot || 'item'}-leading`" :item="item" :active="active" :index="index" :ui="ui">
72
+ <Icon
69
73
  v-if="item.loading"
70
- :class="style.itemLeadingIcon({ class: [loadingIcon || theme.app.icons.loading, props.ui?.itemLeadingIcon], loading: true })"
71
- ></span>
72
- <span
74
+ :name="loadingIcon || appConfig.ui.icons.loading"
75
+ :class="props.ui.itemLeadingIcon({ class: [props.uiOverride?.itemLeadingIcon, item.ui?.itemLeadingIcon], color: item.color, loading: true })"
76
+ data-part="item-leading-icon"
77
+ />
78
+ <Icon
73
79
  v-else-if="item.icon"
74
- :class="style.itemLeadingIcon({ class: [item.icon, props.ui?.itemLeadingIcon], active })"
75
- ></span>
80
+ :name="item.icon"
81
+ :class="props.ui.itemLeadingIcon({ class: [props.uiOverride?.itemLeadingIcon, item.ui?.itemLeadingIcon], color: item.color, active })"
82
+ data-part="item-leading-icon"
83
+ />
76
84
  <Avatar
77
85
  v-else-if="item.avatar"
78
86
  v-bind="item.avatar"
79
87
  :size="item.avatar.size || props.size"
80
- :class="style.itemLeadingAvatar({ class: props.ui?.itemLeadingAvatar, active })"
88
+ :class="props.ui.itemLeadingAvatar({ class: [props.uiOverride?.itemLeadingAvatar, item.ui?.itemLeadingAvatar], active })"
89
+ data-part="item-leading-avatar"
81
90
  />
82
91
  </slot>
83
92
 
84
93
  <span
85
- v-if="get(item, props.labelKey as string) || !!slots[(`${item.slot || 'item'}-label` as keyof DropdownMenuContentSlots<T>)]"
86
- :class="style.itemLabel({ class: props.ui?.itemLabel, active })"
94
+ v-if="get(item, props.labelKey) || !!slots[`${item.slot || 'item'}-label`] || (get(item, props.descriptionKey) || !!slots[`${item.slot || 'item'}-description`])"
95
+ :class="props.ui.itemWrapper({ class: [props.uiOverride?.itemWrapper, item.ui?.itemWrapper] })"
96
+ data-part="item-wrapper"
87
97
  >
88
- <slot :name="(`${item.slot || 'item'}-label` as keyof DropdownMenuContentSlots<T>)" :item="(item as ExtractItem<T>)" :active="active" :index="index">
89
- {{ get(item, props.labelKey as string) }}
90
- </slot>
91
-
92
98
  <span
93
- v-if="item.target === '_blank' && externalIcon !== false"
94
- :class="style.itemLabelExternalIcon({ class: [typeof externalIcon === 'string' ? externalIcon : theme.app.icons.external, props.ui?.itemLabelExternalIcon], active })"
95
- ></span>
99
+ v-if="get(item, props.labelKey) || !!slots[`${item.slot || 'item'}-label`]"
100
+ :class="props.ui.itemLabel({ class: [props.uiOverride?.itemLabel, item.ui?.itemLabel], active })"
101
+ data-part="item-label"
102
+ >
103
+ <slot :name="`${item.slot || 'item'}-label`" :item="item" :active="active" :index="index">
104
+ {{ get(item, props.labelKey) }}
105
+ </slot>
106
+
107
+ <Icon
108
+ v-if="item.target === '_blank' && props.externalIcon !== false"
109
+ :name="typeof props.externalIcon === 'string' ? props.externalIcon : appConfig.ui.icons.external"
110
+ :class="props.ui.itemLabelExternalIcon({ class: [props.uiOverride?.itemLabelExternalIcon, item.ui?.itemLabelExternalIcon], color: item.color, active })"
111
+ data-part="item-label-external-icon"
112
+ />
113
+ </span>
114
+
115
+ <span v-if="get(item, props.descriptionKey)" :class="props.ui.itemDescription({ class: [props.uiOverride?.itemDescription, item.ui?.itemDescription] })" data-part="item-description">
116
+ <slot :name="`${item.slot || 'item'}-description`" :item="item" :active="active" :index="index">
117
+ {{ get(item, props.descriptionKey) }}
118
+ </slot>
119
+ </span>
96
120
  </span>
97
121
 
98
- <span :class="style.itemTrailing({ class: props.ui?.itemTrailing })">
99
- <slot :name="(`${item.slot || 'item'}-trailing` as keyof DropdownMenuContentSlots<T>)" :item="(item as ExtractItem<T>)" :active="active" :index="index">
100
- <span v-if="item.children?.length" :class="style.itemTrailingIcon({ class: [theme.app.icons.chevronRight, props.ui?.itemTrailingIcon], active })"></span>
101
- <span v-else-if="item.kbds?.length" :class="style.itemTrailingKbds({ class: props.ui?.itemTrailingKbds })">
122
+ <span :class="props.ui.itemTrailing({ class: [props.uiOverride?.itemTrailing, item.ui?.itemTrailing] })" data-part="item-trailing">
123
+ <slot :name="`${item.slot || 'item'}-trailing`" :item="item" :active="active" :index="index" :ui="ui">
124
+ <Icon v-if="item.children?.length" :name="childrenIcon" :class="props.ui.itemTrailingIcon({ class: [props.uiOverride?.itemTrailingIcon, item.ui?.itemTrailingIcon], color: item.color, active })" data-part="item-trailing-icon" />
125
+ <span v-else-if="item.kbds?.length" :class="props.ui.itemTrailingKbds({ class: [props.uiOverride?.itemTrailingKbds, item.ui?.itemTrailingKbds] })" data-part="item-trailing-kbds">
102
126
  <Kbd
103
127
  v-for="(kbd, kbdIndex) in item.kbds"
104
128
  :key="kbdIndex"
129
+ :size="item.ui?.itemTrailingKbdsSize || props.uiOverride?.itemTrailingKbdsSize || ui.itemTrailingKbdsSize()"
105
130
  v-bind="typeof kbd === 'string' ? { value: kbd } : kbd"
106
- :size="props.size"
107
131
  />
108
132
  </span>
109
133
  </slot>
110
134
 
111
135
  <DropdownMenu.ItemIndicator as-child>
112
- <span :class="style.itemTrailingIcon({ class: [checkedIcon || theme.app.icons.check, props.ui?.itemTrailingIcon] })"></span>
136
+ <Icon :name="props.checkedIcon || appConfig.ui.icons.check" :class="props.ui.itemTrailingIcon({ class: [props.uiOverride?.itemTrailingIcon, item.ui?.itemTrailingIcon], color: item.color })" data-part="item-trailing-icon" />
113
137
  </DropdownMenu.ItemIndicator>
114
138
  </span>
115
139
  </slot>
116
140
  </DefineItemTemplate>
117
141
 
118
- <DropdownMenu.Portal :disabled="!portal">
119
- <component :is="sub ? DropdownMenu.SubContent : DropdownMenu.Content" :class="props.class" v-bind="contentProps">
120
- <DropdownMenu.Group v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="style.group({ class: props.ui?.group })">
121
- <template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
122
- <DropdownMenu.Label v-if="item.type === 'label'" :class="style.label({ class: props.ui?.label })">
123
- <ReuseItemTemplate :item="item" :index="index" />
124
- </DropdownMenu.Label>
125
- <DropdownMenu.Separator v-else-if="item.type === 'separator'" :class="style.separator({ class: props.ui?.separator })" />
126
- <DropdownMenu.Sub v-else-if="item?.children?.length" :open="item.open" :default-open="item.defaultOpen">
127
- <DropdownMenu.SubTrigger
128
- as="button"
129
- type="button"
142
+ <DropdownMenu.Portal v-bind="portalProps">
143
+ <component :is="props.sub ? DropdownMenu.SubContent : DropdownMenu.Content" v-bind="{ ...contentProps, ...$attrs }" :class="props.class">
144
+ <slot name="content-top"></slot>
145
+
146
+ <div role="presentation" :class="props.ui.viewport({ class: props.uiOverride?.viewport })" data-part="viewport">
147
+ <DropdownMenu.Group v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="props.ui.group({ class: props.uiOverride?.group })" data-part="group">
148
+ <template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
149
+ <DropdownMenu.Label v-if="item.type === 'label'" :class="props.ui.label({ class: [props.uiOverride?.label, item.ui?.label, item.class] })" data-part="label">
150
+ <ReuseItemTemplate :item="item" :index="index" />
151
+ </DropdownMenu.Label>
152
+ <DropdownMenu.Separator v-else-if="item.type === 'separator'" :class="props.ui.separator({ class: [props.uiOverride?.separator, item.ui?.separator, item.class] })" data-part="separator" />
153
+ <DropdownMenu.Sub v-else-if="item?.children?.length" :open="item.open" :default-open="item.defaultOpen">
154
+ <DropdownMenu.SubTrigger
155
+ as="button"
156
+ type="button"
157
+ :disabled="item.disabled"
158
+ :text-value="get(item, props.labelKey)"
159
+ :class="props.ui.item({ class: [props.uiOverride?.item, item.ui?.item, item.class], color: item.color })"
160
+ data-part="item"
161
+ >
162
+ <ReuseItemTemplate :item="item" :index="index" />
163
+ </DropdownMenu.SubTrigger>
164
+
165
+ <DropdownMenuContent
166
+ sub
167
+ :class="props.class"
168
+ :ui="props.ui"
169
+ :ui-override="props.uiOverride"
170
+ :portal="props.portal"
171
+ :items="item.children"
172
+ side="right"
173
+ align="start"
174
+ :align-offset="-4"
175
+ :side-offset="3"
176
+ :label-key="props.labelKey"
177
+ :description-key="props.descriptionKey"
178
+ :checked-icon="props.checkedIcon"
179
+ :loading-icon="props.loadingIcon"
180
+ :external-icon="props.externalIcon"
181
+ v-bind="item.content"
182
+ >
183
+ <template v-for="(_, name) in getProxySlots()" #[name]="slotProps">
184
+ <slot :name="name" v-bind="slotProps"></slot>
185
+ </template>
186
+ </DropdownMenuContent>
187
+ </DropdownMenu.Sub>
188
+ <DropdownMenu.CheckboxItem
189
+ v-else-if="item.type === 'checkbox'"
190
+ :model-value="item.checked"
130
191
  :disabled="item.disabled"
131
- :text-value="get(item, props.labelKey as string)"
132
- :class="style.item({ class: props.ui?.item })"
192
+ :text-value="get(item, props.labelKey)"
193
+ :class="props.ui.item({ class: [props.uiOverride?.item, item.ui?.item, item.class], color: item.color })"
194
+ data-part="item"
195
+ @update:model-value="item.onUpdateChecked"
196
+ @select="item.onSelect"
133
197
  >
134
198
  <ReuseItemTemplate :item="item" :index="index" />
135
- </DropdownMenu.SubTrigger>
136
-
137
- <DropdownMenuContent
138
- sub
139
- :class="props.class"
140
- :ui="props.ui"
141
- :portal="props.portal"
142
- :items="item.children"
143
- side="right"
144
- align="start"
145
- :align-offset="-4"
146
- :side-offset="3"
147
- :label-key="labelKey"
148
- :checked-icon="checkedIcon"
149
- :loading-icon="loadingIcon"
150
- :external-icon="externalIcon"
151
- v-bind="item.content"
199
+ </DropdownMenu.CheckboxItem>
200
+ <DropdownMenu.Item
201
+ v-else
202
+ as-child
203
+ :disabled="item.disabled"
204
+ :text-value="get(item, props.labelKey)"
205
+ @select="item.onSelect"
152
206
  >
153
- <template v-for="(_, name) in proxySlots" #[name]="slotProps">
154
- <slot :name="(name as keyof DropdownMenuContentSlots<T>)" v-bind="slotProps"></slot>
155
- </template>
156
- </DropdownMenuContent>
157
- </DropdownMenu.Sub>
158
- <DropdownMenu.CheckboxItem
159
- v-else-if="item.type === 'checkbox'"
160
- :model-value="item.checked"
161
- :disabled="item.disabled"
162
- :text-value="get(item, props.labelKey as string)"
163
- :class="style.item({ class: [props.ui?.item, item.class] })"
164
- @update:model-value="item.onUpdateChecked"
165
- @select="item.onSelect"
166
- >
167
- <ReuseItemTemplate :item="item" :index="index" />
168
- </DropdownMenu.CheckboxItem>
169
- <DropdownMenu.Item
170
- v-else
171
- as-child
172
- :disabled="item.disabled"
173
- :text-value="get(item, props.labelKey as string)"
174
- @select="item.onSelect"
175
- >
176
- <Link v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item as Omit<DropdownMenuItem, 'type'>)" custom>
177
- <LinkBase v-bind="slotProps" :class="style.item({ class: [props.ui?.item, item.class], active })">
178
- <ReuseItemTemplate :item="item" :active="active" :index="index" />
179
- </LinkBase>
180
- </Link>
181
- </DropdownMenu.Item>
182
- </template>
183
- </DropdownMenu.Group>
207
+ <Link v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item)" custom>
208
+ <LinkBase v-bind="slotProps" :class="props.ui.item({ class: [props.uiOverride?.item, item.ui?.item, item.class], color: item.color, active })" data-part="item">
209
+ <ReuseItemTemplate :item="item" :active="active" :index="index" />
210
+ </LinkBase>
211
+ </Link>
212
+ </DropdownMenu.Item>
213
+ </template>
214
+ </DropdownMenu.Group>
215
+ </div>
184
216
 
185
217
  <slot></slot>
218
+
219
+ <slot name="content-bottom"></slot>
186
220
  </component>
187
221
  </DropdownMenu.Portal>
188
222
  </template>
@@ -0,0 +1,51 @@
1
+ import type { VariantProps } from '@byyuurin/ui-kit';
2
+ import type { DropdownMenuContentEmits as RekaDropdownMenuContentEmits, DropdownMenuContentProps as RekaDropdownMenuContentProps } from 'reka-ui';
3
+ import type theme from '#build/ui/dropdown-menu';
4
+ import type { ComponentBaseProps, ComponentStyler, ComponentUIProps, DropdownMenuItem, DropdownMenuSlots, IconProps } from '../types';
5
+ import type { ArrayOrNested, DynamicSlots, GetItemKeys, MergeTypes, NestedItem, StaticSlot } from '../types/utils';
6
+ type ThemeVariants = VariantProps<typeof theme>;
7
+ export interface DropdownMenuContentProps<T extends ArrayOrNested<DropdownMenuItem>> extends ComponentBaseProps, Omit<RekaDropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> {
8
+ size?: ThemeVariants['size'];
9
+ items?: T;
10
+ portal?: boolean | string | HTMLElement;
11
+ sub?: boolean;
12
+ labelKey: GetItemKeys<T>;
13
+ descriptionKey: GetItemKeys<T>;
14
+ checkedIcon?: IconProps['name'];
15
+ loadingIcon?: IconProps['name'];
16
+ externalIcon?: boolean | IconProps['name'];
17
+ ui: ComponentStyler<typeof theme>;
18
+ uiOverride?: ComponentUIProps<typeof theme>;
19
+ }
20
+ export interface DropdownMenuContentEmits extends RekaDropdownMenuContentEmits {
21
+ }
22
+ export type DropdownMenuContentSlots<A extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>, T extends NestedItem<A> = NestedItem<A>> = Pick<DropdownMenuSlots<A>, 'item' | 'item-leading' | 'item-label' | 'item-description' | 'item-trailing' | 'content-top' | 'content-bottom'> & {
23
+ default: StaticSlot;
24
+ } & DynamicSlots<MergeTypes<T>, 'label' | 'description', {
25
+ active: boolean;
26
+ index: number;
27
+ }> & DynamicSlots<MergeTypes<T>, 'leading' | 'trailing', {
28
+ active: boolean;
29
+ index: number;
30
+ ui: ComponentStyler<typeof theme>;
31
+ }>;
32
+ declare const __VLS_export: <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<{
33
+ props: __VLS_PrettifyLocal<DropdownMenuContentProps<T> & {
34
+ onEscapeKeyDown?: ((event: KeyboardEvent) => any) | undefined;
35
+ onPointerDownOutside?: ((event: import("reka-ui").PointerDownOutsideEvent) => any) | undefined;
36
+ onFocusOutside?: ((event: import("reka-ui").FocusOutsideEvent) => any) | undefined;
37
+ onInteractOutside?: ((event: import("reka-ui").PointerDownOutsideEvent | import("reka-ui").FocusOutsideEvent) => any) | undefined;
38
+ onCloseAutoFocus?: ((event: Event) => any) | undefined;
39
+ }> & import("vue").PublicProps;
40
+ expose: (exposed: {}) => void;
41
+ attrs: any;
42
+ slots: DropdownMenuContentSlots<T, NestedItem<T>>;
43
+ emit: ((evt: "escapeKeyDown", event: KeyboardEvent) => void) & ((evt: "pointerDownOutside", event: import("reka-ui").PointerDownOutsideEvent) => void) & ((evt: "focusOutside", event: import("reka-ui").FocusOutsideEvent) => void) & ((evt: "interactOutside", event: import("reka-ui").PointerDownOutsideEvent | import("reka-ui").FocusOutsideEvent) => void) & ((evt: "closeAutoFocus", event: Event) => void);
44
+ }>) => import("vue").VNode & {
45
+ __ctx?: Awaited<typeof __VLS_setup>;
46
+ };
47
+ declare const _default: typeof __VLS_export;
48
+ export default _default;
49
+ type __VLS_PrettifyLocal<T> = {
50
+ [K in keyof T as K]: T[K];
51
+ } & {};
@@ -0,0 +1,33 @@
1
+ <script>
2
+ import theme from "#build/ui/field-group";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { Primitive } from "reka-ui";
7
+ import { computed } from "vue";
8
+ import { useAppConfig } from "#imports";
9
+ import { provideFieldGroup } from "../composables/useFieldGroup";
10
+ import { cv, merge } from "../utils/style";
11
+ const props = defineProps({
12
+ as: { type: null, required: false },
13
+ size: { type: null, required: false },
14
+ orientation: { type: null, required: false, default: "horizontal" },
15
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true }
16
+ });
17
+ defineSlots();
18
+ const appConfig = useAppConfig();
19
+ const ui = computed(() => {
20
+ const styler = cv(merge(theme, appConfig.ui.fieldGroup));
21
+ return styler(props);
22
+ });
23
+ provideFieldGroup(computed(() => ({
24
+ orientation: props.orientation,
25
+ size: props.size
26
+ })));
27
+ </script>
28
+
29
+ <template>
30
+ <Primitive :as="props.as" :class="ui.base({ class: props.class })" :data-orientation="props.orientation" data-part="base">
31
+ <slot></slot>
32
+ </Primitive>
33
+ </template>
@@ -0,0 +1,33 @@
1
+ import type { VariantProps } from '@byyuurin/ui-kit';
2
+ import type { PrimitiveProps } from 'reka-ui';
3
+ import theme from '#build/ui/field-group';
4
+ import type { ComponentBaseProps } from '../types';
5
+ import type { StaticSlot } from '../types/utils';
6
+ type ThemeVariant = VariantProps<typeof theme>;
7
+ export interface FieldGroupProps extends ComponentBaseProps {
8
+ /**
9
+ * The element or component this component should render as.
10
+ * @default "div"
11
+ */
12
+ as?: PrimitiveProps['as'];
13
+ /** @default "md" */
14
+ size?: ThemeVariant['size'];
15
+ /**
16
+ * The orientation the buttons are laid out.
17
+ * @default "horizontal"
18
+ */
19
+ orientation?: ThemeVariant['orientation'];
20
+ }
21
+ export interface FieldGroupSlots {
22
+ default: StaticSlot;
23
+ }
24
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FieldGroupProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FieldGroupProps> & Readonly<{}>, {
25
+ orientation: "horizontal" | "vertical";
26
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, FieldGroupSlots>;
27
+ declare const _default: typeof __VLS_export;
28
+ export default _default;
29
+ type __VLS_WithSlots<T, S> = T & {
30
+ new (): {
31
+ $slots: S;
32
+ };
33
+ };