@byyuurin/ui 0.0.11 → 0.2.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 (297) 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 +50 -43
  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 +99 -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/CheckboxGroup.vue +131 -0
  30. package/dist/runtime/components/CheckboxGroup.vue.d.ts +89 -0
  31. package/dist/runtime/components/Chip.vue +35 -32
  32. package/dist/runtime/components/Chip.vue.d.ts +33 -15
  33. package/dist/runtime/components/Collapsible.vue +13 -9
  34. package/dist/runtime/components/Collapsible.vue.d.ts +16 -8
  35. package/dist/runtime/components/Drawer.vue +80 -70
  36. package/dist/runtime/components/Drawer.vue.d.ts +51 -28
  37. package/dist/runtime/components/DropdownMenu.vue +23 -16
  38. package/dist/runtime/components/DropdownMenu.vue.d.ts +77 -36
  39. package/dist/runtime/components/DropdownMenuContent.vue +136 -106
  40. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +38 -26
  41. package/dist/runtime/components/FieldGroup.vue +33 -0
  42. package/dist/runtime/components/FieldGroup.vue.d.ts +33 -0
  43. package/dist/runtime/components/Form.vue +172 -88
  44. package/dist/runtime/components/Form.vue.d.ts +69 -44
  45. package/dist/runtime/components/FormField.vue +108 -0
  46. package/dist/runtime/components/FormField.vue.d.ts +63 -0
  47. package/dist/runtime/components/Icon.vue +20 -0
  48. package/dist/runtime/components/Icon.vue.d.ts +9 -0
  49. package/dist/runtime/components/Input.vue +84 -79
  50. package/dist/runtime/components/Input.vue.d.ts +55 -43
  51. package/dist/runtime/components/InputNumber.vue +66 -52
  52. package/dist/runtime/components/InputNumber.vue.d.ts +50 -109
  53. package/dist/runtime/components/InputTags.vue +155 -0
  54. package/dist/runtime/components/InputTags.vue.d.ts +85 -0
  55. package/dist/runtime/components/Kbd.vue +11 -5
  56. package/dist/runtime/components/Kbd.vue.d.ts +17 -11
  57. package/dist/runtime/components/Link.vue +54 -197
  58. package/dist/runtime/components/Link.vue.d.ts +17 -17
  59. package/dist/runtime/components/LinkBase.vue +11 -33
  60. package/dist/runtime/components/LinkBase.vue.d.ts +8 -3
  61. package/dist/runtime/components/Marquee.vue +38 -0
  62. package/dist/runtime/components/Marquee.vue.d.ts +54 -0
  63. package/dist/runtime/components/Modal.vue +53 -39
  64. package/dist/runtime/components/Modal.vue.d.ts +64 -34
  65. package/dist/runtime/components/NavigationMenu.vue +345 -0
  66. package/dist/runtime/components/NavigationMenu.vue.d.ts +216 -0
  67. package/dist/runtime/components/OverlayProvider.vue +3 -3
  68. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -1
  69. package/dist/runtime/components/Pagination.vue +39 -47
  70. package/dist/runtime/components/Pagination.vue.d.ts +54 -31
  71. package/dist/runtime/components/PinInput.vue +46 -32
  72. package/dist/runtime/components/PinInput.vue.d.ts +40 -21
  73. package/dist/runtime/components/Popover.vue +33 -19
  74. package/dist/runtime/components/Popover.vue.d.ts +57 -32
  75. package/dist/runtime/components/Progress.vue +31 -26
  76. package/dist/runtime/components/Progress.vue.d.ts +32 -23
  77. package/dist/runtime/components/RadioGroup.vue +75 -48
  78. package/dist/runtime/components/RadioGroup.vue.d.ts +58 -36
  79. package/dist/runtime/components/ScrollArea.vue +33 -31
  80. package/dist/runtime/components/ScrollArea.vue.d.ts +9 -5
  81. package/dist/runtime/components/Select.vue +166 -76
  82. package/dist/runtime/components/Select.vue.d.ts +206 -65
  83. package/dist/runtime/components/Separator.vue +42 -16
  84. package/dist/runtime/components/Separator.vue.d.ts +35 -14
  85. package/dist/runtime/components/Skeleton.vue +18 -6
  86. package/dist/runtime/components/Skeleton.vue.d.ts +4 -4
  87. package/dist/runtime/components/Slider.vue +42 -24
  88. package/dist/runtime/components/Slider.vue.d.ts +43 -27
  89. package/dist/runtime/components/Switch.vue +40 -31
  90. package/dist/runtime/components/Switch.vue.d.ts +36 -27
  91. package/dist/runtime/components/Table.vue +329 -79
  92. package/dist/runtime/components/Table.vue.d.ts +152 -66
  93. package/dist/runtime/components/Tabs.vue +70 -23
  94. package/dist/runtime/components/Tabs.vue.d.ts +61 -29
  95. package/dist/runtime/components/Textarea.vue +102 -54
  96. package/dist/runtime/components/Textarea.vue.d.ts +57 -41
  97. package/dist/runtime/components/Timeline.vue +102 -0
  98. package/dist/runtime/components/Timeline.vue.d.ts +74 -0
  99. package/dist/runtime/components/Toast.vue +84 -38
  100. package/dist/runtime/components/Toast.vue.d.ts +48 -27
  101. package/dist/runtime/components/ToastProvider.vue +31 -22
  102. package/dist/runtime/components/ToastProvider.vue.d.ts +30 -17
  103. package/dist/runtime/components/Tooltip.vue +33 -21
  104. package/dist/runtime/components/Tooltip.vue.d.ts +37 -15
  105. package/dist/runtime/composables/defineShortcuts.d.ts +16 -0
  106. package/dist/runtime/composables/defineShortcuts.js +129 -0
  107. package/dist/runtime/composables/useAvatarGroup.d.ts +8 -3
  108. package/dist/runtime/composables/useAvatarGroup.js +10 -3
  109. package/dist/runtime/composables/useComponentIcons.d.ts +9 -6
  110. package/dist/runtime/composables/useComponentIcons.js +4 -4
  111. package/dist/runtime/composables/useFieldGroup.d.ts +8 -0
  112. package/dist/runtime/composables/useFieldGroup.js +14 -0
  113. package/dist/runtime/composables/useFormField.d.ts +62 -0
  114. package/dist/runtime/composables/useFormField.js +99 -0
  115. package/dist/runtime/composables/useKbd.d.ts +3 -2
  116. package/dist/runtime/composables/useKbd.js +3 -2
  117. package/dist/runtime/composables/useLocale.d.ts +68 -5
  118. package/dist/runtime/composables/useLocale.js +11 -11
  119. package/dist/runtime/composables/useOverlay.d.ts +51 -15
  120. package/dist/runtime/composables/useOverlay.js +44 -30
  121. package/dist/runtime/composables/usePortal.d.ts +6 -0
  122. package/dist/runtime/composables/usePortal.js +17 -0
  123. package/dist/runtime/composables/useToast.d.ts +12 -5
  124. package/dist/runtime/composables/useToast.js +12 -7
  125. package/dist/runtime/locale/en.d.ts +30 -1
  126. package/dist/runtime/locale/en.js +2 -1
  127. package/dist/runtime/locale/index.d.ts +2 -2
  128. package/dist/runtime/locale/index.js +1 -1
  129. package/dist/runtime/locale/zh_tw.d.ts +31 -0
  130. package/dist/runtime/locale/{zh-tw.js → zh_tw.js} +2 -1
  131. package/dist/runtime/plugins/colors.d.ts +2 -0
  132. package/dist/runtime/plugins/colors.js +50 -0
  133. package/dist/runtime/types/app.config.d.ts +6 -0
  134. package/dist/runtime/types/form.d.ts +58 -17
  135. package/dist/runtime/types/form.js +11 -0
  136. package/dist/runtime/types/index.d.ts +56 -8
  137. package/dist/runtime/types/index.js +49 -1
  138. package/dist/runtime/types/input.d.ts +8 -0
  139. package/dist/runtime/types/locale.d.ts +5 -0
  140. package/dist/runtime/types/style.d.ts +33 -0
  141. package/dist/runtime/types/style.js +0 -0
  142. package/dist/runtime/types/unocss.d.ts +4 -0
  143. package/dist/runtime/types/utils.d.ts +41 -37
  144. package/dist/runtime/utils/form.d.ts +5 -1
  145. package/dist/runtime/utils/form.js +49 -0
  146. package/dist/runtime/utils/index.d.ts +10 -13
  147. package/dist/runtime/utils/index.js +41 -48
  148. package/dist/runtime/utils/link.d.ts +3 -2
  149. package/dist/runtime/utils/link.js +16 -2
  150. package/dist/runtime/utils/locale.d.ts +5 -0
  151. package/dist/runtime/utils/locale.js +10 -0
  152. package/dist/runtime/utils/style.d.ts +94 -0
  153. package/dist/runtime/utils/style.js +37 -0
  154. package/dist/runtime/vue/components/Icon.vue +15 -0
  155. package/dist/runtime/vue/components/Icon.vue.d.ts +7 -0
  156. package/dist/runtime/vue/components/Link.vue +163 -0
  157. package/dist/runtime/vue/components/Link.vue.d.ts +95 -0
  158. package/dist/runtime/vue/composables/useAppConfig.d.ts +1 -0
  159. package/dist/runtime/vue/composables/useAppConfig.js +4 -0
  160. package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
  161. package/dist/runtime/vue/plugins/color-mode.js +6 -0
  162. package/dist/runtime/vue/plugins/head.d.ts +4 -0
  163. package/dist/runtime/vue/plugins/head.js +9 -0
  164. package/dist/runtime/vue/stubs.d.ts +16 -1
  165. package/dist/runtime/vue/stubs.js +32 -1
  166. package/dist/setup.d.mts +13 -0
  167. package/dist/setup.mjs +12 -0
  168. package/dist/shared/ui.CzIlLITK.mjs +51 -0
  169. package/dist/shared/ui.DLOxhmP0.mjs +4242 -0
  170. package/dist/shared/ui.DpbffTXs.d.mts +84 -0
  171. package/dist/shared/ui.IulR-OYx.d.mts +64 -0
  172. package/dist/types.d.mts +3 -1
  173. package/dist/unocss.d.mts +12 -52
  174. package/dist/unocss.mjs +144 -254
  175. package/dist/unplugin.d.mts +13 -26
  176. package/dist/unplugin.mjs +193 -18
  177. package/dist/vite.d.mts +10 -1
  178. package/dist/vite.mjs +12 -3
  179. package/package.json +154 -87
  180. package/vue-plugin.d.ts +5 -0
  181. package/dist/module.d.ts +0 -13
  182. package/dist/module.mjs.map +0 -1
  183. package/dist/runtime/app/injections.d.ts +0 -9331
  184. package/dist/runtime/app/injections.js +0 -61
  185. package/dist/runtime/components/ButtonGroup.vue +0 -26
  186. package/dist/runtime/components/ButtonGroup.vue.d.ts +0 -26
  187. package/dist/runtime/components/FormItem.vue +0 -90
  188. package/dist/runtime/components/FormItem.vue.d.ts +0 -60
  189. package/dist/runtime/composables/useButtonGroup.d.ts +0 -5
  190. package/dist/runtime/composables/useButtonGroup.js +0 -9
  191. package/dist/runtime/composables/useFormItem.d.ts +0 -27
  192. package/dist/runtime/composables/useFormItem.js +0 -64
  193. package/dist/runtime/composables/useTheme.d.ts +0 -9
  194. package/dist/runtime/composables/useTheme.js +0 -23
  195. package/dist/runtime/index.d.ts +0 -44
  196. package/dist/runtime/index.js +0 -44
  197. package/dist/runtime/locale/zh-tw.d.ts +0 -2
  198. package/dist/runtime/theme/accordion.d.ts +0 -50
  199. package/dist/runtime/theme/accordion.js +0 -28
  200. package/dist/runtime/theme/alert.d.ts +0 -119
  201. package/dist/runtime/theme/alert.js +0 -47
  202. package/dist/runtime/theme/app.d.ts +0 -19
  203. package/dist/runtime/theme/app.js +0 -19
  204. package/dist/runtime/theme/avatar-group.d.ts +0 -46
  205. package/dist/runtime/theme/avatar-group.js +0 -32
  206. package/dist/runtime/theme/avatar.d.ts +0 -50
  207. package/dist/runtime/theme/avatar.js +0 -34
  208. package/dist/runtime/theme/badge.d.ts +0 -76
  209. package/dist/runtime/theme/badge.js +0 -92
  210. package/dist/runtime/theme/breadcrumb.d.ts +0 -61
  211. package/dist/runtime/theme/breadcrumb.js +0 -44
  212. package/dist/runtime/theme/button-group.d.ts +0 -60
  213. package/dist/runtime/theme/button-group.js +0 -42
  214. package/dist/runtime/theme/button.d.ts +0 -184
  215. package/dist/runtime/theme/button.js +0 -164
  216. package/dist/runtime/theme/calendar.d.ts +0 -58
  217. package/dist/runtime/theme/calendar.js +0 -86
  218. package/dist/runtime/theme/card.d.ts +0 -56
  219. package/dist/runtime/theme/card.js +0 -37
  220. package/dist/runtime/theme/carousel.d.ts +0 -107
  221. package/dist/runtime/theme/carousel.js +0 -43
  222. package/dist/runtime/theme/checkbox.d.ts +0 -82
  223. package/dist/runtime/theme/checkbox.js +0 -54
  224. package/dist/runtime/theme/chip.d.ts +0 -61
  225. package/dist/runtime/theme/chip.js +0 -66
  226. package/dist/runtime/theme/collapsible.d.ts +0 -32
  227. package/dist/runtime/theme/collapsible.js +0 -10
  228. package/dist/runtime/theme/drawer.d.ts +0 -142
  229. package/dist/runtime/theme/drawer.js +0 -113
  230. package/dist/runtime/theme/dropdown-menu.d.ts +0 -65
  231. package/dist/runtime/theme/dropdown-menu.js +0 -83
  232. package/dist/runtime/theme/form-item.d.ts +0 -70
  233. package/dist/runtime/theme/form-item.js +0 -34
  234. package/dist/runtime/theme/form.d.ts +0 -2
  235. package/dist/runtime/theme/form.js +0 -7
  236. package/dist/runtime/theme/index.d.ts +0 -41
  237. package/dist/runtime/theme/index.js +0 -41
  238. package/dist/runtime/theme/input-number.d.ts +0 -115
  239. package/dist/runtime/theme/input-number.js +0 -95
  240. package/dist/runtime/theme/input.d.ts +0 -172
  241. package/dist/runtime/theme/input.js +0 -151
  242. package/dist/runtime/theme/kbd.d.ts +0 -33
  243. package/dist/runtime/theme/kbd.js +0 -26
  244. package/dist/runtime/theme/link.d.ts +0 -38
  245. package/dist/runtime/theme/link.js +0 -26
  246. package/dist/runtime/theme/modal.d.ts +0 -42
  247. package/dist/runtime/theme/modal.js +0 -55
  248. package/dist/runtime/theme/pagination.d.ts +0 -74
  249. package/dist/runtime/theme/pagination.js +0 -17
  250. package/dist/runtime/theme/pinInput.d.ts +0 -94
  251. package/dist/runtime/theme/pinInput.js +0 -111
  252. package/dist/runtime/theme/popover.d.ts +0 -32
  253. package/dist/runtime/theme/popover.js +0 -13
  254. package/dist/runtime/theme/progress.d.ts +0 -180
  255. package/dist/runtime/theme/progress.js +0 -95
  256. package/dist/runtime/theme/radio-group.d.ts +0 -104
  257. package/dist/runtime/theme/radio-group.js +0 -61
  258. package/dist/runtime/theme/scroll-area.d.ts +0 -67
  259. package/dist/runtime/theme/scroll-area.js +0 -33
  260. package/dist/runtime/theme/select.d.ts +0 -186
  261. package/dist/runtime/theme/select.js +0 -173
  262. package/dist/runtime/theme/separator.d.ts +0 -74
  263. package/dist/runtime/theme/separator.js +0 -53
  264. package/dist/runtime/theme/skeleton.d.ts +0 -2
  265. package/dist/runtime/theme/skeleton.js +0 -7
  266. package/dist/runtime/theme/slider.d.ts +0 -70
  267. package/dist/runtime/theme/slider.js +0 -52
  268. package/dist/runtime/theme/switch.d.ts +0 -116
  269. package/dist/runtime/theme/switch.js +0 -78
  270. package/dist/runtime/theme/table.d.ts +0 -86
  271. package/dist/runtime/theme/table.js +0 -36
  272. package/dist/runtime/theme/tabs.d.ts +0 -129
  273. package/dist/runtime/theme/tabs.js +0 -146
  274. package/dist/runtime/theme/textarea.d.ts +0 -90
  275. package/dist/runtime/theme/textarea.js +0 -116
  276. package/dist/runtime/theme/toast-provider.d.ts +0 -116
  277. package/dist/runtime/theme/toast-provider.js +0 -97
  278. package/dist/runtime/theme/toast.d.ts +0 -83
  279. package/dist/runtime/theme/toast.js +0 -35
  280. package/dist/runtime/theme/tooltip.d.ts +0 -38
  281. package/dist/runtime/theme/tooltip.js +0 -11
  282. package/dist/runtime/types/components.d.ts +0 -42
  283. package/dist/runtime/utils/extend-theme.d.ts +0 -9
  284. package/dist/runtime/utils/extend-theme.js +0 -27
  285. package/dist/runtime/utils/styler.d.ts +0 -4
  286. package/dist/runtime/utils/styler.js +0 -10
  287. package/dist/runtime/utils/translator.d.ts +0 -18
  288. package/dist/runtime/utils/translator.js +0 -8
  289. package/dist/shared/ui.D1BTWZFB.mjs +0 -5
  290. package/dist/shared/ui.D1BTWZFB.mjs.map +0 -1
  291. package/dist/unocss.d.ts +0 -52
  292. package/dist/unocss.mjs.map +0 -1
  293. package/dist/unplugin.d.ts +0 -26
  294. package/dist/unplugin.mjs.map +0 -1
  295. package/dist/vite.d.ts +0 -9
  296. package/dist/vite.mjs.map +0 -1
  297. /package/dist/runtime/types/{components.js → input.js} +0 -0
@@ -1,46 +1,53 @@
1
1
  <script>
2
-
2
+ import theme from "#build/ui/select";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
6
  import { reactivePick } from "@vueuse/core";
7
7
  import { defu } from "defu";
8
- import { SelectArrow, SelectContent, SelectGroup, SelectItem, SelectItemIndicator, SelectItemText, SelectLabel, SelectPortal, SelectRoot, SelectSeparator, SelectTrigger, SelectViewport, useForwardPropsEmits } from "reka-ui";
9
- import { computed, toRef } from "vue";
10
- import { useButtonGroup } from "../composables/useButtonGroup";
8
+ import { SelectArrow, SelectContent, SelectGroup, SelectItem as RekaSelectItem, SelectItemIndicator, SelectItemText, SelectLabel, SelectPortal, SelectRoot, SelectSeparator, SelectTrigger, useForwardPropsEmits } from "reka-ui";
9
+ import { computed, onMounted, shallowRef, toRef } from "vue";
10
+ import { useAppConfig } from "#imports";
11
11
  import { useComponentIcons } from "../composables/useComponentIcons";
12
- import { useFormItem } from "../composables/useFormItem";
13
- import { useTheme } from "../composables/useTheme";
14
- import { compare, get, isArrayOfArray } from "../utils";
15
- defineOptions({
16
- inheritAttrs: false
17
- });
12
+ import { useFieldGroup } from "../composables/useFieldGroup";
13
+ import { useFormField } from "../composables/useFormField";
14
+ import { usePortal } from "../composables/usePortal";
15
+ import { get, getDisplayValue, isArrayOfArray } from "../utils";
16
+ import { cv, merge } from "../utils/style";
17
+ import Avatar from "./Avatar.vue";
18
+ import Chip from "./Chip.vue";
19
+ import Icon from "./Icon.vue";
20
+ defineOptions({ inheritAttrs: false });
18
21
  const props = defineProps({
19
22
  id: { type: String, required: false },
20
23
  placeholder: { type: String, required: false },
21
24
  variant: { type: null, required: false },
22
25
  size: { type: null, required: false },
23
- trailingIcon: { type: String, required: false },
24
- selectedIcon: { type: String, required: false },
26
+ color: { type: null, required: false },
27
+ trailingIcon: { type: [String, Object], required: false },
28
+ selectedIcon: { type: [String, Object], required: false },
25
29
  content: { type: Object, required: false },
26
30
  arrow: { type: [Boolean, Object], required: false },
27
- portal: { type: Boolean, required: false, default: true },
31
+ portal: { type: [Boolean, String], required: false, skipCheck: true, default: true },
28
32
  valueKey: { type: null, required: false, default: "value" },
29
33
  labelKey: { type: null, required: false, default: "label" },
30
- options: { type: null, required: false },
34
+ descriptionKey: { type: null, required: false, default: "description" },
35
+ items: { type: null, required: false },
31
36
  defaultValue: { type: null, required: false },
32
37
  modelValue: { type: null, required: false },
33
38
  multiple: { type: Boolean, required: false },
34
39
  highlight: { type: Boolean, required: false },
35
- underline: { type: Boolean, required: false },
36
- class: { type: null, required: false },
40
+ autofocus: { type: Boolean, required: false },
41
+ autofocusDelay: { type: Number, required: false, default: 0 },
37
42
  ui: { type: null, required: false },
38
- icon: { type: String, required: false },
43
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
44
+ icon: { type: [String, Object], required: false },
45
+ avatar: { type: Object, required: false },
39
46
  leading: { type: Boolean, required: false },
40
- leadingIcon: { type: String, required: false },
47
+ leadingIcon: { type: [String, Object], required: false },
41
48
  trailing: { type: Boolean, required: false },
42
49
  loading: { type: Boolean, required: false },
43
- loadingIcon: { type: String, required: false },
50
+ loadingIcon: { type: [String, Object], required: false },
44
51
  open: { type: Boolean, required: false },
45
52
  defaultOpen: { type: Boolean, required: false },
46
53
  autocomplete: { type: String, required: false },
@@ -51,35 +58,55 @@ const props = defineProps({
51
58
  const emit = defineEmits(["update:open", "change", "blur", "focus", "update:modelValue"]);
52
59
  const slots = defineSlots();
53
60
  const rootProps = useForwardPropsEmits(reactivePick(props, "open", "defaultOpen", "disabled", "autocomplete", "required", "multiple"), emit);
61
+ const portalProps = usePortal(toRef(() => props.portal));
54
62
  const contentProps = toRef(() => defu(props.content, { side: "bottom", sideOffset: 8, collisionPadding: 8, position: "popper" }));
55
63
  const arrowProps = toRef(() => props.arrow);
56
- const { id, name, size: formItemSize, highlight, disabled, ariaAttrs, emitFormChange, emitFormInput, emitFormBlur, emitFormFocus } = useFormItem(props);
57
- const { size: buttonGroupSize, orientation } = useButtonGroup(props);
58
- const { theme, generateStyle } = useTheme();
64
+ const { id, name, size: formFieldSize, color, highlight, disabled, ariaAttrs, emitFormChange, emitFormInput, emitFormBlur, emitFormFocus } = useFormField(props);
65
+ const { size: fieldGroupSize, orientation } = useFieldGroup(props);
66
+ const appConfig = useAppConfig();
59
67
  const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(toRef(() => defu(props, {
60
- trailingIcon: theme.value.app.icons.chevronDown
68
+ trailingIcon: appConfig.ui.icons.chevronDown
61
69
  })));
62
- const style = computed(() => generateStyle("select", {
63
- ...props,
64
- groupOrientation: orientation.value,
65
- size: buttonGroupSize.value || formItemSize.value,
66
- highlight: highlight.value,
67
- leading: isLeading.value,
68
- trailing: isTrailing.value
69
- }));
70
+ const ui = computed(() => {
71
+ const styler = cv(merge(theme, appConfig.ui.select));
72
+ return styler({
73
+ ...props,
74
+ fieldGroup: orientation.value,
75
+ size: fieldGroupSize.value || formFieldSize.value,
76
+ color: color.value,
77
+ highlight: highlight.value,
78
+ leading: isLeading.value || !!props.avatar || !!slots.leading,
79
+ trailing: isTrailing.value || !!slots.trailing
80
+ });
81
+ });
70
82
  const groups = computed(
71
- () => props.options?.length ? isArrayOfArray(props.options) ? props.options : [props.options] : []
83
+ () => props.items?.length ? isArrayOfArray(props.items) ? props.items : [props.items] : []
72
84
  );
73
85
  const items = computed(() => groups.value.flat());
74
86
  function displayValue(value) {
75
- if (props.multiple && Array.isArray(value))
76
- return value.map((v) => displayValue(v)).filter(Boolean).join(", ");
77
- const item = items.value.find((item2) => compare(typeof item2 === "object" ? get(item2, props.valueKey) : item2, value));
78
- return item != null && (typeof item === "object" ? get(item, props.labelKey) : String(item));
87
+ if (props.multiple && Array.isArray(value)) {
88
+ const displayedValues = value.map((item) => getDisplayValue(items.value, item, {
89
+ labelKey: props.labelKey,
90
+ valueKey: props.valueKey
91
+ })).filter((v) => v != null && v !== "");
92
+ return displayedValues.length > 0 ? displayedValues.join(", ") : void 0;
93
+ }
94
+ return getDisplayValue(items.value, value, {
95
+ labelKey: props.labelKey,
96
+ valueKey: props.valueKey
97
+ });
79
98
  }
80
- function isSelectItem(item) {
81
- return typeof item === "object" && item !== null;
99
+ const triggerRef = shallowRef(null);
100
+ function autoFocus() {
101
+ if (props.autofocus) {
102
+ triggerRef.value?.$el?.focus({
103
+ focusVisible: true
104
+ });
105
+ }
82
106
  }
107
+ onMounted(() => {
108
+ setTimeout(() => autoFocus(), props.autofocusDelay);
109
+ });
83
110
  function onUpdate(value) {
84
111
  const event = new Event("change", { target: { value } });
85
112
  emit("change", event);
@@ -97,87 +124,150 @@ function onUpdateOpen(value) {
97
124
  emitFormBlur();
98
125
  }
99
126
  }
127
+ function isSelectItem(item) {
128
+ return typeof item === "object" && item !== null;
129
+ }
130
+ defineExpose({
131
+ triggerRef
132
+ });
100
133
  </script>
101
134
 
102
135
  <template>
103
136
  <SelectRoot
104
- v-slot="{ modelValue: innerValue, open }"
105
- v-bind="rootProps"
137
+ v-slot="{ modelValue, open }"
106
138
  :name="name"
139
+ v-bind="rootProps"
140
+ :default-value="defaultValue"
141
+ :model-value="modelValue"
107
142
  :autocomplete="props.autocomplete"
108
143
  :disabled="disabled"
109
- :default-value="props.defaultValue"
110
- :model-value="props.modelValue"
111
144
  @update:model-value="onUpdate"
112
145
  @update:open="onUpdateOpen"
113
146
  >
114
- <SelectTrigger v-bind="{ ...$attrs, ...ariaAttrs, id }" :class="style.base({ class: [props.class, props.ui?.base] })" data-part="base">
115
- <span v-if="isLeading || slots.leading" :class="style.leading({ class: props.ui?.leading })" data-part="leading">
116
- <slot name="leading" :model-value="innerValue" :open="open" :ui="props.ui">
117
- <span v-if="isLeading && leadingIconName" :class="style.leadingIcon({ class: [leadingIconName, props.ui?.leadingIcon] })" data-part="leading-icon"></span>
147
+ <SelectTrigger
148
+ ref="triggerRef"
149
+ v-bind="{ id, ...$attrs, ...ariaAttrs }"
150
+ :class="ui.base({ class: [props.ui?.base, props.class] })"
151
+ data-part="base"
152
+ >
153
+ <span v-if="isLeading || !!props.avatar || slots.leading" :class="ui.leading({ class: props.ui?.leading })" data-part="leading">
154
+ <slot name="leading" :model-value="modelValue" :open="open" :ui="ui">
155
+ <Icon
156
+ v-if="isLeading && leadingIconName"
157
+ :name="leadingIconName"
158
+ :class="ui.leadingIcon({ class: props.ui?.leadingIcon })"
159
+ data-part="leadingIcon"
160
+ />
161
+ <Avatar
162
+ v-else-if="props.avatar"
163
+ :size="props.ui?.itemLeadingChipSize || ui.itemLeadingAvatarSize()"
164
+ v-bind="props.avatar"
165
+ :class="ui.leadingAvatar({ class: props.ui?.leadingAvatar })"
166
+ data-part="leadingAvatar"
167
+ />
118
168
  </slot>
119
169
  </span>
120
170
 
121
- <slot :model-value="innerValue" :open="open">
122
- <template v-for="displayedModelValue in [displayValue(innerValue)]" :key="displayedModelValue">
123
- <span v-if="displayedModelValue" :class="style.value({ class: props.ui?.value })" data-part="value">
171
+ <slot :model-value="modelValue" :open="open" :ui="ui">
172
+ <template v-for="displayedModelValue in [displayValue(modelValue)]" :key="displayedModelValue">
173
+ <span v-if="displayedModelValue != null" :class="ui.value({ class: props.ui?.value })" data-part="value">
124
174
  {{ displayedModelValue }}
125
175
  </span>
126
- <span v-else :class="style.placeholder({ class: props.ui?.placeholder })" data-part="placeholder">
127
- {{ placeholder }}&nbsp;
176
+ <span v-else :class="ui.placeholder({ class: props.ui?.placeholder })" data-part="placeholder">
177
+ <template v-if="props.placeholder">{{ props.placeholder }}</template>
178
+ <template v-else>&nbsp;</template>
128
179
  </span>
129
180
  </template>
130
181
  </slot>
131
182
 
132
- <span v-if="isTrailing || !!slots.trailing" :class="style.trailing({ class: props.ui?.trailing })" data-part="trailing">
133
- <slot name="trailing" :model-value="innerValue" :open="open" :ui="props.ui">
134
- <span v-if="trailingIconName" :class="style.trailingIcon({ class: [trailingIconName, props.ui?.trailingIcon] })" data-part="trailing-icon"></span>
183
+ <span v-if="isTrailing || !!slots.trailing" :class="ui.trailing({ class: props.ui?.trailing })" data-part="trailing">
184
+ <slot name="trailing" :model-value="modelValue" :open="open" :ui="ui">
185
+ <Icon v-if="trailingIconName" :name="trailingIconName" :class="ui.trailingIcon({ class: props.ui?.trailingIcon })" data-part="trailingIcon" />
135
186
  </slot>
136
187
  </span>
137
188
  </SelectTrigger>
138
189
 
139
- <SelectPortal :disabled="!props.portal">
140
- <SelectContent v-bind="contentProps" :class="style.content({ class: props.ui?.content })" data-part="content">
141
- <SelectViewport :class="style.viewport({ class: props.ui?.viewport })" data-part="viewport">
142
- <SelectGroup v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="style.group({ class: props.ui?.group })" data-part="group">
190
+ <SelectPortal v-bind="portalProps">
191
+ <SelectContent v-bind="contentProps" :class="ui.content({ class: props.ui?.content })" data-part="content">
192
+ <slot name="content-top"></slot>
193
+
194
+ <div role="presentation" :class="ui.viewport({ class: props.ui?.viewport })" data-part="viewport">
195
+ <SelectGroup v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })" data-part="group">
143
196
  <template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
144
- <SelectLabel v-if="isSelectItem(item) && item.type === 'label'" :class="style.label({ class: props.ui?.label })" data-part="label">
197
+ <SelectLabel v-if="isSelectItem(item) && item.type === 'label'" :class="ui.label({ class: [props.ui?.label, item.ui?.label, item.class] })" data-part="label">
145
198
  {{ get(item, props.labelKey) }}
146
199
  </SelectLabel>
147
- <SelectSeparator v-else-if="isSelectItem(item) && item.type === 'separator'" :class="style.separator({ class: props.ui?.separator })" data-part="separator" />
148
200
 
149
- <SelectItem
201
+ <SelectSeparator v-else-if="isSelectItem(item) && item.type === 'separator'" :class="ui.separator({ class: [props.ui?.separator, item.ui?.separator, item.class] })" data-part="separator" />
202
+
203
+ <RekaSelectItem
150
204
  v-else
151
205
  :value="isSelectItem(item) ? get(item, props.valueKey) : item"
152
206
  :disabled="isSelectItem(item) && item.disabled"
153
- :class="style.item({ class: props.ui?.item })"
207
+ :class="ui.item({ class: [props.ui?.item, ...isSelectItem(item) ? [item.ui?.item, item.class] : []] })"
154
208
  data-part="item"
209
+ @select="isSelectItem(item) && item.onSelect?.($event)"
155
210
  >
156
- <slot name="item" :item="item" :index="index">
157
- <slot name="item-leading" :item="item" :index="index">
158
- <span v-if="isSelectItem(item) && item.icon" :class="style.itemLeadingIcon({ class: [item.icon, props.ui?.itemLeadingIcon] })" data-part="item-leading-icon"></span>
211
+ <slot name="item" :item="item" :index="index" :ui="ui">
212
+ <slot name="item-leading" :item="item" :index="index" :ui="ui">
213
+ <Icon
214
+ v-if="isSelectItem(item) && item.icon"
215
+ :name="item.icon"
216
+ :class="ui.itemLeadingIcon({ class: [props.ui?.itemLeadingIcon, item.ui?.itemLeadingIcon] })"
217
+ data-part="itemLeadingIcon"
218
+ />
219
+ <Avatar
220
+ v-else-if="isSelectItem(item) && item.avatar"
221
+ :size="item.ui?.itemLeadingAvatarSize || props.ui?.itemLeadingAvatarSize || ui.itemLeadingAvatarSize()"
222
+ v-bind="item.avatar"
223
+ :class="ui.itemLeadingAvatar({ class: [props.ui?.leadingAvatar, item.ui?.itemLeadingAvatar] })"
224
+ data-part="itemLeadingAvatar"
225
+ />
226
+ <Chip
227
+ v-else-if="isSelectItem(item) && item.chip"
228
+ :size="item.ui?.itemLeadingChipSize || props.ui?.itemLeadingChipSize || ui.itemLeadingChipSize()"
229
+ inset
230
+ standalone
231
+ v-bind="item.chip"
232
+ :class="ui.itemLeadingChip({ class: [props.ui?.itemLeadingChip, item.ui?.itemLeadingChip] })"
233
+ data-part="itemLeadingChip"
234
+ />
159
235
  </slot>
160
236
 
161
- <SelectItemText :class="style.itemLabel({ class: props.ui?.itemLabel })" data-part="item-label">
162
- <slot name="item-label" :item="item" :index="index">
163
- {{ isSelectItem(item) ? get(item, props.labelKey) : item }}
164
- </slot>
165
- </SelectItemText>
237
+ <span :class="ui.itemWrapper({ class: [props.ui?.itemWrapper, ...isSelectItem(item) ? [item.ui?.itemWrapper] : []] })" data-part="itemWrapper">
238
+ <SelectItemText :class="ui.itemLabel({ class: [props.ui?.itemLabel, isSelectItem(item) && item.ui?.itemLabel] })" data-part="itemLabel">
239
+ <slot name="item-label" :item="item" :index="index">
240
+ {{ isSelectItem(item) ? get(item, props.labelKey) : item }}
241
+ </slot>
242
+ </SelectItemText>
243
+
244
+ <span
245
+ v-if="isSelectItem(item) && get(item, props.descriptionKey) || !!slots['item-description']"
246
+ :class="ui.itemDescription({ class: [props.ui?.itemDescription, ...isSelectItem(item) ? [item.ui?.itemDescription] : []] })"
247
+ data-part="itemDescription"
248
+ >
249
+ <slot name="item-description" :item="item" :index="index">
250
+ {{ isSelectItem(item) ? get(item, props.descriptionKey) : "" }}
251
+ </slot>
252
+ </span>
253
+ </span>
166
254
 
167
- <span :class="style.itemTrailing({ class: props.ui?.itemTrailing })" data-part="item-trailing">
168
- <slot name="item-trailing" :item="item" :index="index"></slot>
255
+ <span :class="ui.itemTrailing({ class: [props.ui?.itemTrailing, isSelectItem(item) && item.ui?.itemTrailing] })" data-part="itemTrailing">
256
+ <slot name="item-trailing" :item="item" :index="index" :ui="ui"></slot>
169
257
 
170
258
  <SelectItemIndicator as-child>
171
- <span :class="style.itemTrailingIcon({ class: [props.selectedIcon || theme.app.icons.check, props.ui?.itemTrailingIcon] })" data-part="item-trailing-icon"></span>
259
+ <Icon :name="props.selectedIcon || appConfig.ui.icons.check" :class="ui.itemTrailingIcon({ class: [props.ui?.itemTrailingIcon, isSelectItem(item) && item.ui?.itemTrailingIcon] })" data-part="itemTrailingIcon" />
172
260
  </SelectItemIndicator>
173
261
  </span>
174
262
  </slot>
175
- </SelectItem>
263
+ </RekaSelectItem>
176
264
  </template>
177
265
  </SelectGroup>
178
- </SelectViewport>
266
+ </div>
267
+
268
+ <slot name="content-bottom"></slot>
179
269
 
180
- <SelectArrow v-if="!!props.arrow" v-bind="arrowProps" :class="style.arrow({ class: props.ui?.arrow })" data-part="arrow" />
270
+ <SelectArrow v-if="props.arrow" v-bind="arrowProps" :class="ui.arrow({ class: props.ui?.arrow })" data-part="arrow" />
181
271
  </SelectContent>
182
272
  </SelectPortal>
183
273
  </SelectRoot>