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