@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
@@ -0,0 +1,216 @@
1
+ import type { MaybeArray, VariantProps } from '@byyuurin/ui-kit';
2
+ import type { AccordionRootProps, NavigationMenuContentEmits, NavigationMenuContentProps, NavigationMenuRootProps } from 'reka-ui';
3
+ import theme from '#build/ui/navigation-menu';
4
+ import type { AvatarProps, BadgeProps, ComponentBaseProps, ComponentStyler, ComponentUIProps, IconProps, LinkProps, PopoverProps, TooltipProps } from '../types';
5
+ import type { ArrayOrNested, DynamicSlots, EmitsToProps, GetItemKeys, MergeTypes, NestedItem, StaticSlot } from '../types/utils';
6
+ export interface NavigationMenuChildItem extends Omit<NavigationMenuItem, 'type' | 'ui'> {
7
+ /** Description is only used when `orientation` is `horizontal`. */
8
+ description?: string;
9
+ [key: string]: any;
10
+ }
11
+ export interface NavigationMenuItem extends ComponentBaseProps, Omit<LinkProps, 'type' | 'raw' | 'custom'> {
12
+ label?: string;
13
+ icon?: IconProps['name'];
14
+ avatar?: AvatarProps;
15
+ /**
16
+ * Display a chip on the item.
17
+ * `{ size: 'xs', variant: 'outline' }`
18
+ */
19
+ badge?: string | number | BadgeProps;
20
+ /**
21
+ * Display a tooltip on the item when the menu is collapsed with the label of the item.
22
+ *
23
+ * This has priority over the global `tooltip` prop.
24
+ */
25
+ tooltip?: boolean | TooltipProps;
26
+ /**
27
+ * Display a popover on the item when the menu is collapsed with the children list.
28
+ *
29
+ * This has priority over the global `popover` prop.
30
+ */
31
+ popover?: boolean | PopoverProps;
32
+ trailingIcon?: IconProps['name'];
33
+ /**
34
+ * The type of the item.
35
+ *
36
+ * The `label` type is only displayed in `vertical` orientation.
37
+ *
38
+ * The `trigger` type is used to force the item to be collapsible when its a link in `vertical` orientation.
39
+ * @default "link"
40
+ */
41
+ type?: 'label' | 'trigger' | 'link';
42
+ slot?: string;
43
+ /**
44
+ * The value of the item. Avoid using `index` as the value to prevent conflicts in horizontal orientation with Reka UI.
45
+ * @default `item-${index}`
46
+ */
47
+ value?: string;
48
+ children?: NavigationMenuChildItem[];
49
+ defaultOpen?: boolean;
50
+ open?: boolean;
51
+ onSelect?: (e: Event) => void;
52
+ ui?: Pick<ComponentUIProps<typeof theme>, 'item' | 'linkLeadingAvatarSize' | 'linkLeadingAvatar' | 'linkLeadingIcon' | 'linkLabel' | 'linkLabelExternalIcon' | 'linkTrailing' | 'linkTrailingBadgeSize' | 'linkTrailingBadge' | 'linkTrailingIcon' | 'label' | 'link' | 'content' | 'childList' | 'childLabel' | 'childItem' | 'childLink' | 'childLinkIcon' | 'childLinkWrapper' | 'childLinkLabel' | 'childLinkLabelExternalIcon' | 'childLinkDescription'>;
53
+ [key: string]: any;
54
+ }
55
+ type ThemeVariants = VariantProps<typeof theme>;
56
+ type SingleOrMultipleType = 'single' | 'multiple';
57
+ type Orientation = ThemeVariants['orientation'];
58
+ type NavigationMenuModelValue<K extends SingleOrMultipleType = SingleOrMultipleType, O extends Orientation = Orientation> = O extends 'horizontal' ? string : K extends 'single' ? string : K extends 'multiple' ? string[] : MaybeArray<string>;
59
+ export interface NavigationMenuProps<T extends ArrayOrNested<NavigationMenuItem> = ArrayOrNested<NavigationMenuItem>, K extends SingleOrMultipleType = SingleOrMultipleType, O extends Orientation = Orientation> extends ComponentBaseProps, Pick<NavigationMenuRootProps, 'delayDuration' | 'disableClickTrigger' | 'disableHoverTrigger' | 'skipDelayDuration' | 'disablePointerLeaveClose' | 'unmountOnHide'>, Pick<AccordionRootProps, 'disabled' | 'type' | 'collapsible'> {
60
+ /**
61
+ * The element or component this component should render as.
62
+ * @default "div"
63
+ */
64
+ as?: NavigationMenuRootProps['as'];
65
+ /**
66
+ * Determines whether a "single" or "multiple" items can be selected at a time.
67
+ *
68
+ * Only works when `orientation` is `vertical`.
69
+ * @default "multiple"
70
+ */
71
+ type?: K;
72
+ /**
73
+ * The controlled value of the active item(s).
74
+ * - In horizontal orientation: always `string`
75
+ * - In vertical orientation with `type="single"`: `string`
76
+ * - In vertical orientation with `type="multiple"`: `string[]`
77
+ *
78
+ * Use this when you need to control the state of the items. Can be binded with `v-model`
79
+ */
80
+ modelValue?: NavigationMenuModelValue<K, O>;
81
+ /**
82
+ * The default active value of the item(s).
83
+ * - In horizontal orientation: always `string`
84
+ * - In vertical orientation with `type="single"`: `string`
85
+ * - In vertical orientation with `type="multiple"`: `string[]`
86
+ *
87
+ * Use when you do not need to control the state of the item(s).
88
+ */
89
+ defaultValue?: NavigationMenuModelValue<K, O>;
90
+ /**
91
+ * The icon displayed to open the menu.
92
+ * @default app.icons.chevronDown
93
+ */
94
+ trailingIcon?: IconProps['name'];
95
+ /**
96
+ * The icon displayed when the item is an external link.
97
+ * Set to `false` to hide the external icon.
98
+ * @default app.icons.external
99
+ */
100
+ externalIcon?: boolean | IconProps['name'];
101
+ items?: T;
102
+ /** @default "primary" */
103
+ color?: ThemeVariants['color'];
104
+ /** @default "pill" */
105
+ variant?: ThemeVariants['variant'];
106
+ /**
107
+ * The orientation of the menu.
108
+ * @default "horizontal"
109
+ */
110
+ orientation?: O;
111
+ /**
112
+ * Collapse the navigation menu to only show icons.
113
+ * Only works when `orientation` is `vertical`.
114
+ * @default false
115
+ */
116
+ collapsed?: boolean;
117
+ /**
118
+ * Display a tooltip on the items when the menu is collapsed with the label of the item.
119
+ * @default true
120
+ */
121
+ tooltip?: boolean | TooltipProps;
122
+ /**
123
+ * Display a popover on the items when the menu is collapsed with the children list.
124
+ * @default true
125
+ */
126
+ popover?: boolean | PopoverProps;
127
+ /** Display a line next to the active item. */
128
+ highlight?: boolean;
129
+ /** @default "primary" */
130
+ highlightColor?: ThemeVariants['color'];
131
+ /** The content of the menu. */
132
+ content?: Omit<NavigationMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<NavigationMenuContentEmits>>;
133
+ /**
134
+ * The orientation of the content.
135
+ * Only works when `orientation` is `horizontal`.
136
+ * @default "horizontal"
137
+ */
138
+ contentOrientation?: ThemeVariants['contentOrientation'];
139
+ /**
140
+ * Display an arrow alongside the menu.
141
+ * @default false
142
+ */
143
+ arrow?: boolean;
144
+ /**
145
+ * The key used to get the label from the item.
146
+ * @default "label"
147
+ */
148
+ labelKey?: GetItemKeys<T>;
149
+ ui?: ComponentUIProps<typeof theme>;
150
+ }
151
+ export interface NavigationMenuEmits<K extends SingleOrMultipleType = SingleOrMultipleType, O extends Orientation = Orientation> {
152
+ /**
153
+ * Event handler called when the value changes.
154
+ * - In horizontal orientation: emits `string`
155
+ * - In vertical orientation with `type="single"`: emits `string | undefined`
156
+ * - In vertical orientation with `type="multiple"`: emits `string[] | undefined`
157
+ */
158
+ 'update:modelValue': [value: NavigationMenuModelValue<K, O> | undefined];
159
+ }
160
+ export type NavigationMenuSlots<A extends ArrayOrNested<NavigationMenuItem> = ArrayOrNested<NavigationMenuItem>, T extends NestedItem<A> = NestedItem<A>> = {
161
+ 'item': StaticSlot<{
162
+ item: T;
163
+ index: number;
164
+ active: boolean;
165
+ ui: ComponentStyler<typeof theme>;
166
+ }>;
167
+ 'item-leading': StaticSlot<{
168
+ item: T;
169
+ index: number;
170
+ active: boolean;
171
+ ui: ComponentStyler<typeof theme>;
172
+ }>;
173
+ 'item-label': StaticSlot<{
174
+ item: T;
175
+ index: number;
176
+ active: boolean;
177
+ }>;
178
+ 'item-trailing': StaticSlot<{
179
+ item: T;
180
+ index: number;
181
+ active: boolean;
182
+ ui: ComponentStyler<typeof theme>;
183
+ }>;
184
+ 'item-content': StaticSlot<{
185
+ item: T;
186
+ index: number;
187
+ active: boolean;
188
+ ui: ComponentStyler<typeof theme>;
189
+ close: () => void;
190
+ }>;
191
+ 'list-leading': StaticSlot;
192
+ 'list-trailing': StaticSlot;
193
+ } & DynamicSlots<MergeTypes<T>, 'label', {
194
+ index: number;
195
+ active: boolean;
196
+ }> & DynamicSlots<MergeTypes<T>, 'leading' | 'trailing' | 'content', {
197
+ index: number;
198
+ active: boolean;
199
+ ui: ComponentStyler<typeof theme>;
200
+ }>;
201
+ declare const __VLS_export: <T extends ArrayOrNested<NavigationMenuItem>, K extends SingleOrMultipleType = SingleOrMultipleType, O extends Orientation = Orientation>(__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<{
202
+ props: __VLS_PrettifyLocal<NavigationMenuProps<T, K, O> & {
203
+ "onUpdate:modelValue"?: ((value: NavigationMenuModelValue<K, O> | undefined) => any) | undefined;
204
+ }> & import("vue").PublicProps;
205
+ expose: (exposed: {}) => void;
206
+ attrs: any;
207
+ slots: NavigationMenuSlots<T, NestedItem<T>>;
208
+ emit: (evt: "update:modelValue", value: NavigationMenuModelValue<K, O> | undefined) => void;
209
+ }>) => import("vue").VNode & {
210
+ __ctx?: Awaited<typeof __VLS_setup>;
211
+ };
212
+ declare const _default: typeof __VLS_export;
213
+ export default _default;
214
+ type __VLS_PrettifyLocal<T> = {
215
+ [K in keyof T as K]: T[K];
216
+ } & {};
@@ -3,7 +3,7 @@ import { computed } from "vue";
3
3
  import { useOverlay } from "../composables/useOverlay";
4
4
  const { overlays, unmount, close } = useOverlay();
5
5
  const mountedOverlays = computed(() => overlays.filter((overlay) => overlay.isMounted));
6
- function onOverlayUnmount(id) {
6
+ function onAfterLeave(id) {
7
7
  close(id);
8
8
  unmount(id);
9
9
  }
@@ -18,8 +18,8 @@ function onClose(id, value) {
18
18
  v-for="overlay in mountedOverlays"
19
19
  :key="overlay.id"
20
20
  v-bind="overlay.props"
21
- v-model:open="overlay.modelValue"
21
+ v-model:open="overlay.isOpen"
22
22
  @close="onClose(overlay.id, $event)"
23
- @after-leave="onOverlayUnmount(overlay.id)"
23
+ @after-leave="onAfterLeave(overlay.id)"
24
24
  />
25
25
  </template>
@@ -1,2 +1,3 @@
1
- declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
2
3
  export default _default;
@@ -1,28 +1,31 @@
1
1
  <script>
2
-
2
+ import theme from "#build/ui/pagination";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
6
  import { reactivePick } from "@vueuse/core";
7
7
  import { PaginationEllipsis, PaginationFirst, PaginationLast, PaginationList, PaginationListItem, PaginationNext, PaginationPrev, PaginationRoot, useForwardPropsEmits } from "reka-ui";
8
8
  import { computed } from "vue";
9
+ import { useAppConfig } from "#imports";
9
10
  import { useLocale } from "../composables/useLocale";
10
- import { useTheme } from "../composables/useTheme";
11
+ import { cv, merge } from "../utils/style";
11
12
  import Button from "./Button.vue";
12
13
  const props = defineProps({
13
- firstIcon: { type: String, required: false },
14
- lastIcon: { type: String, required: false },
15
- prevIcon: { type: String, required: false },
16
- nextIcon: { type: String, required: false },
17
- ellipsisIcon: { type: String, required: false },
14
+ as: { type: null, required: false },
15
+ firstIcon: { type: [String, Object], required: false },
16
+ lastIcon: { type: [String, Object], required: false },
17
+ prevIcon: { type: [String, Object], required: false },
18
+ nextIcon: { type: [String, Object], required: false },
19
+ ellipsisIcon: { type: [String, Object], required: false },
20
+ color: { type: null, required: false, default: "neutral" },
21
+ activeColor: { type: null, required: false, default: "primary" },
18
22
  size: { type: null, required: false },
19
23
  variant: { type: null, required: false, default: "outline" },
20
24
  activeVariant: { type: null, required: false, default: "solid" },
21
25
  showControls: { type: Boolean, required: false, default: true },
22
26
  to: { type: Function, required: false },
23
- class: { type: null, required: false },
24
27
  ui: { type: null, required: false },
25
- as: { type: null, required: false },
28
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
26
29
  defaultPage: { type: Number, required: false },
27
30
  disabled: { type: Boolean, required: false },
28
31
  itemsPerPage: { type: Number, required: true, default: 10 },
@@ -35,72 +38,61 @@ const emit = defineEmits(["update:page"]);
35
38
  const slots = defineSlots();
36
39
  const rootProps = useForwardPropsEmits(reactivePick(props, "as", "defaultPage", "disabled", "itemsPerPage", "page", "showEdges", "siblingCount", "total"), emit);
37
40
  const { dir } = useLocale();
38
- const { theme, generateStyle } = useTheme();
39
- const style = computed(() => generateStyle("pagination", props));
40
- const firstIcon = computed(() => props.firstIcon || (dir.value === "rtl" ? theme.value.app.icons.chevronDoubleRight : theme.value.app.icons.chevronDoubleLeft));
41
- const prevIcon = computed(() => props.prevIcon || (dir.value === "rtl" ? theme.value.app.icons.chevronRight : theme.value.app.icons.chevronLeft));
42
- const nextIcon = computed(() => props.nextIcon || (dir.value === "rtl" ? theme.value.app.icons.chevronLeft : theme.value.app.icons.chevronRight));
43
- const lastIcon = computed(() => props.lastIcon || (dir.value === "rtl" ? theme.value.app.icons.chevronDoubleLeft : theme.value.app.icons.chevronDoubleRight));
44
- const ellipsisIcon = computed(() => props.ellipsisIcon || theme.value.app.icons.ellipsis);
41
+ const appConfig = useAppConfig();
42
+ const ui = computed(() => {
43
+ const styler = cv(merge(theme, appConfig.ui.pagination));
44
+ return styler(props);
45
+ });
46
+ const firstIcon = computed(() => props.firstIcon || (dir.value === "rtl" ? appConfig.ui.icons.chevronDoubleRight : appConfig.ui.icons.chevronDoubleLeft));
47
+ const prevIcon = computed(() => props.prevIcon || (dir.value === "rtl" ? appConfig.ui.icons.chevronRight : appConfig.ui.icons.chevronLeft));
48
+ const nextIcon = computed(() => props.nextIcon || (dir.value === "rtl" ? appConfig.ui.icons.chevronLeft : appConfig.ui.icons.chevronRight));
49
+ const lastIcon = computed(() => props.lastIcon || (dir.value === "rtl" ? appConfig.ui.icons.chevronDoubleLeft : appConfig.ui.icons.chevronDoubleRight));
45
50
  </script>
46
51
 
47
52
  <template>
48
- <PaginationRoot v-slot="{ page, pageCount }" v-bind="rootProps" :class="style.root({ class: [props.class, props.ui?.root] })" data-part="root">
49
- <PaginationList v-slot="{ items }" :class="style.list({ class: props.ui?.list })" data-part="list">
50
- <PaginationFirst v-if="props.showControls || !!slots.first" :class="style.first({ class: props.ui?.first })" data-part="first" as-child>
53
+ <PaginationRoot v-slot="{ page, pageCount }" v-bind="rootProps" :class="ui.root({ class: [props.ui?.root, props.class] })" data-part="root">
54
+ <PaginationList v-slot="{ items }" :class="ui.list({ class: props.ui?.list })" data-part="list">
55
+ <PaginationFirst v-if="props.showControls || !!slots.first" :class="ui.first({ class: props.ui?.first })" as-child data-part="first">
51
56
  <slot name="first">
52
- <Button :variant="props.variant" :size="props.size" :icon="firstIcon" :to="props.to?.(1)" />
57
+ <Button :color="props.color" :variant="props.variant" :size="props.size" :icon="firstIcon" :to="props.to?.(1)" />
53
58
  </slot>
54
59
  </PaginationFirst>
55
- <PaginationPrev v-if="props.showControls || !!slots.prev" :class="style.prev({ class: props.ui?.prev })" data-part="perv" as-child>
60
+ <PaginationPrev v-if="props.showControls || !!slots.prev" :class="ui.prev({ class: props.ui?.prev })" as-child data-part="perv">
56
61
  <slot name="prev">
57
- <Button :variant="props.variant" :size="props.size" :icon="prevIcon" :to="page > 1 ? props.to?.(page - 1) : void 0" />
62
+ <Button :color="props.color" :variant="props.variant" :size="props.size" :icon="prevIcon" :to="page > 1 ? props.to?.(page - 1) : void 0" />
58
63
  </slot>
59
64
  </PaginationPrev>
60
65
 
61
- <template v-for="(item, index) in items">
62
- <PaginationListItem v-if="item.type === 'page'" :key="index" :value="item.value" :class="style.item({ class: props.ui?.item })" data-part="item" as-child>
66
+ <template v-for="(item, index) in items" :key="index">
67
+ <PaginationListItem v-if="item.type === 'page'" :value="item.value" :class="ui.item({ class: props.ui?.item })" as-child data-part="item">
63
68
  <slot name="item" v-bind="{ item, index, page, pageCount }">
64
69
  <Button
70
+ :color="props.page === item.value ? props.activeColor : props.color"
65
71
  :variant="props.page === item.value ? props.activeVariant : props.variant"
66
72
  :size="props.size"
67
73
  :label="String(item.value)"
68
74
  :to="props.to?.(item.value)"
69
- :ui="{ label: style.label({ class: props.ui?.label }) }"
75
+ :ui="{ label: ui.label({ class: props.ui?.label }) }"
76
+ square
70
77
  />
71
78
  </slot>
72
79
  </PaginationListItem>
73
80
 
74
- <PaginationEllipsis
75
- v-else
76
- :key="item.type"
77
- :index="index"
78
- :disabled="props.disabled"
79
- :class="[
80
- style.item({ class: props.ui?.item }),
81
- style.ellipsis({ class: props.ui?.ellipsis })
82
- ]"
83
- data-part="ellipsis"
84
- as-child
85
- >
86
- <slot name="ellipsis">
87
- <Button
88
- :variant="props.variant"
89
- :size="props.size"
90
- :icon="ellipsisIcon"
91
- />
81
+ <PaginationEllipsis v-else :class="ui.ellipsis({ class: props.ui?.ellipsis })" as-child data-part="ellipsis">
82
+ <slot name="ellipsis" :ui="ui">
83
+ <Button as="div" :color="props.color" :variant="props.variant" :size="props.size" :icon="ellipsisIcon || appConfig.ui.icons.ellipsis" />
92
84
  </slot>
93
85
  </PaginationEllipsis>
94
86
  </template>
95
87
 
96
- <PaginationNext v-if="props.showControls || !!slots.next" :class="style.next({ class: props.ui?.next })" data-part="next" as-child>
88
+ <PaginationNext v-if="props.showControls || !!slots.next" :class="ui.next({ class: props.ui?.next })" as-child data-part="next">
97
89
  <slot name="next">
98
- <Button :variant="props.variant" :size="props.size" :icon="nextIcon" :to="page < pageCount ? props.to?.(page + 1) : void 0" />
90
+ <Button :color="props.color" :variant="props.variant" :size="props.size" :icon="nextIcon" :to="page < pageCount ? props.to?.(page + 1) : void 0" />
99
91
  </slot>
100
92
  </PaginationNext>
101
- <PaginationLast v-if="props.showControls || !!slots.last" :class="style.last({ class: props.ui?.last })" data-part="last" as-child>
93
+ <PaginationLast v-if="props.showControls || !!slots.last" :class="ui.last({ class: props.ui?.last })" as-child data-part="last">
102
94
  <slot name="last">
103
- <Button :variant="props.variant" :size="props.size" :icon="lastIcon" :to="props.to?.(pageCount)" />
95
+ <Button :color="props.color" :variant="props.variant" :size="props.size" :icon="lastIcon" :to="props.to?.(pageCount)" />
104
96
  </slot>
105
97
  </PaginationLast>
106
98
  </PaginationList>
@@ -1,52 +1,48 @@
1
1
  import type { PaginationRootEmits, PaginationRootProps } from 'reka-ui';
2
- import type { pagination } from '../theme/index.js';
3
- import type { ButtonProps, ComponentAttrs } from '../types/index.js';
4
- export interface PaginationEmits extends PaginationRootEmits {
5
- }
6
- export interface PaginationSlots {
7
- first?: (props?: {}) => any;
8
- prev?: (props?: {}) => any;
9
- next?: (props?: {}) => any;
10
- last?: (props?: {}) => any;
11
- ellipsis?: (props?: {}) => any;
12
- item?: (props: {
13
- page: number;
14
- pageCount: number;
15
- item: {
16
- type: 'ellipsis';
17
- } | {
18
- type: 'page';
19
- value: number;
20
- };
21
- index: number;
22
- }) => any;
23
- }
24
- export interface PaginationProps extends ComponentAttrs<typeof pagination>, Pick<PaginationRootProps, 'as' | 'defaultPage' | 'disabled' | 'itemsPerPage' | 'page' | 'showEdges' | 'siblingCount' | 'total'> {
2
+ import theme from '#build/ui/pagination';
3
+ import type { ButtonProps, ComponentBaseProps, ComponentStyler, ComponentUIProps, IconProps } from '../types';
4
+ import type { StaticSlot } from '../types/utils';
5
+ export interface PaginationProps extends ComponentBaseProps, Pick<PaginationRootProps, 'defaultPage' | 'disabled' | 'itemsPerPage' | 'page' | 'showEdges' | 'siblingCount' | 'total'> {
6
+ /**
7
+ * The element or component this component should render as.
8
+ * @default "div"
9
+ */
10
+ as?: PaginationRootProps['as'];
25
11
  /**
26
12
  * The icon to use for the first page control.
27
13
  * @default app.icons.doubleLeft
28
14
  */
29
- firstIcon?: string;
15
+ firstIcon?: IconProps['name'];
30
16
  /**
31
17
  * The icon to use for the last page control.
32
18
  * @default app.icons.doubleRight
33
19
  */
34
- lastIcon?: string;
20
+ lastIcon?: IconProps['name'];
35
21
  /**
36
22
  * The icon to use for the previous page control.
37
23
  * @default app.icons.chevronLeft
38
24
  */
39
- prevIcon?: string;
25
+ prevIcon?: IconProps['name'];
40
26
  /**
41
27
  * The icon to use for the next page control.
42
28
  * @default app.icons.chevronRight
43
29
  */
44
- nextIcon?: string;
30
+ nextIcon?: IconProps['name'];
45
31
  /**
46
32
  * The icon to use for the ellipsis control.
47
33
  * @default app.icons.ellipsis
48
34
  */
49
- ellipsisIcon?: string;
35
+ ellipsisIcon?: IconProps['name'];
36
+ /**
37
+ * The color of the pagination controls.
38
+ * @default "neutral"
39
+ */
40
+ color?: ButtonProps['color'];
41
+ /**
42
+ * The color of the active pagination control.
43
+ * @default "primary"
44
+ */
45
+ activeColor?: ButtonProps['color'];
50
46
  /**
51
47
  * The size of the pagination controls.
52
48
  * @default "md"
@@ -69,22 +65,49 @@ export interface PaginationProps extends ComponentAttrs<typeof pagination>, Pick
69
65
  showControls?: boolean;
70
66
  /**
71
67
  * A function to render page controls as links.
68
+ * @param page The page number to navigate to.
72
69
  */
73
70
  to?: (page: number) => ButtonProps['to'];
71
+ ui?: ComponentUIProps<typeof theme>;
72
+ }
73
+ export interface PaginationEmits extends PaginationRootEmits {
74
+ }
75
+ export interface PaginationSlots {
76
+ first: StaticSlot;
77
+ prev: StaticSlot;
78
+ next: StaticSlot;
79
+ last: StaticSlot;
80
+ ellipsis: StaticSlot<{
81
+ ui: ComponentStyler<typeof theme>;
82
+ }>;
83
+ item: StaticSlot<{
84
+ page: number;
85
+ pageCount: number;
86
+ item: {
87
+ type: 'ellipsis';
88
+ } | {
89
+ type: 'page';
90
+ value: number;
91
+ };
92
+ index: number;
93
+ }>;
74
94
  }
75
- declare const _default: __VLS_WithSlots<import("vue").DefineComponent<PaginationProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
95
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<PaginationProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
76
96
  "update:page": (value: number) => any;
77
97
  }, string, import("vue").PublicProps, Readonly<PaginationProps> & Readonly<{
78
98
  "onUpdate:page"?: ((value: number) => any) | undefined;
79
99
  }>, {
80
- variant: "solid" | "outline" | "soft" | "soft-outline" | "link" | "ghost";
100
+ color: "error" | "info" | "primary" | "secondary" | "success" | "warning" | "neutral";
101
+ variant: "link" | "solid" | "outline" | "soft" | "subtle" | "ghost";
102
+ activeVariant: "link" | "solid" | "outline" | "soft" | "subtle" | "ghost";
103
+ activeColor: "error" | "info" | "primary" | "secondary" | "success" | "warning" | "neutral";
81
104
  itemsPerPage: number;
82
105
  showEdges: boolean;
83
106
  siblingCount: number;
84
107
  total: number;
85
- activeVariant: "solid" | "outline" | "soft" | "soft-outline" | "link" | "ghost";
86
108
  showControls: boolean;
87
109
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, PaginationSlots>;
110
+ declare const _default: typeof __VLS_export;
88
111
  export default _default;
89
112
  type __VLS_WithSlots<T, S> = T & {
90
113
  new (): {
@@ -1,23 +1,26 @@
1
1
  <script>
2
-
2
+ import theme from "#build/ui/pin-input";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
6
  import { reactivePick } from "@vueuse/core";
7
7
  import { PinInputInput, PinInputRoot, useForwardPropsEmits } from "reka-ui";
8
- import { computed, ref } from "vue";
9
- import { useFormItem } from "../composables/useFormItem";
10
- import { useTheme } from "../composables/useTheme";
8
+ import { computed, onMounted, ref } from "vue";
9
+ import { useAppConfig } from "#imports";
10
+ import { useFormField } from "../composables/useFormField";
11
11
  import { looseToNumber } from "../utils";
12
+ import { cv, merge } from "../utils/style";
12
13
  const props = defineProps({
13
- variant: { type: null, required: false, default: "outline" },
14
+ as: { type: null, required: false },
15
+ variant: { type: null, required: false },
14
16
  size: { type: null, required: false },
17
+ color: { type: null, required: false },
15
18
  length: { type: [Number, String], required: false, default: 5 },
16
- underline: { type: Boolean, required: false },
19
+ autofocus: { type: Boolean, required: false },
20
+ autofocusDelay: { type: Number, required: false, default: 0 },
17
21
  highlight: { type: Boolean, required: false },
18
- class: { type: null, required: false },
19
22
  ui: { type: null, required: false },
20
- as: { type: null, required: false },
23
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
21
24
  defaultValue: { type: Array, required: false },
22
25
  disabled: { type: Boolean, required: false },
23
26
  id: { type: String, required: false },
@@ -30,15 +33,20 @@ const props = defineProps({
30
33
  type: { type: null, required: false, default: "text" }
31
34
  });
32
35
  const emit = defineEmits(["update:modelValue", "complete", "change", "blur"]);
33
- const rootProps = useForwardPropsEmits(reactivePick(props, "defaultValue", "disabled", "id", "mask", "modelValue", "name", "otp", "required", "type"), emit);
36
+ const rootProps = useForwardPropsEmits(reactivePick(props, "disabled", "id", "mask", "name", "otp", "required", "type"), emit);
37
+ const { id, name, size, color, highlight, disabled, ariaAttrs, emitFormInput, emitFormChange, emitFormFocus, emitFormBlur } = useFormField(props);
38
+ const appConfig = useAppConfig();
39
+ const ui = computed(() => {
40
+ const styler = cv(merge(theme, appConfig.ui.pinInput));
41
+ return styler({
42
+ ...props,
43
+ size: size.value,
44
+ color: color.value,
45
+ highlight: highlight.value
46
+ });
47
+ });
48
+ const inputsRef = ref([]);
34
49
  const completed = ref(false);
35
- const { id, name, size, highlight, disabled, ariaAttrs, emitFormInput, emitFormChange, emitFormFocus, emitFormBlur } = useFormItem(props);
36
- const { generateStyle } = useTheme();
37
- const style = computed(() => generateStyle("pinInput", {
38
- ...props,
39
- size: size.value,
40
- highlight: highlight.value
41
- }));
42
50
  function onComplete(value) {
43
51
  const event = new Event("change", { target: { value } });
44
52
  emit("change", event);
@@ -50,33 +58,39 @@ function onBlur(event) {
50
58
  emitFormBlur();
51
59
  }
52
60
  }
61
+ function autoFocus() {
62
+ if (props.autofocus)
63
+ inputsRef.value[0]?.$el?.focus();
64
+ }
65
+ onMounted(() => {
66
+ setTimeout(() => autoFocus(), props.autofocusDelay);
67
+ });
68
+ defineExpose({
69
+ inputsRef
70
+ });
53
71
  </script>
54
72
 
55
73
  <template>
56
74
  <PinInputRoot
57
75
  v-bind="{ ...rootProps, ...ariaAttrs, id, name }"
58
76
  :placeholder="props.placeholder"
59
- :class="style.root({ class: [props.class, props.ui?.root] })"
77
+ :model-value="modelValue"
78
+ :default-value="props.defaultValue"
79
+ :class="ui.root({ class: [props.ui?.root, props.class] })"
60
80
  data-part="root"
61
81
  @update:model-value="emitFormInput"
62
82
  @complete="onComplete"
63
83
  >
64
- <span
84
+ <PinInputInput
65
85
  v-for="(ids, index) in looseToNumber(props.length)"
66
86
  :key="ids"
67
- :aria-disabled="disabled ? true : void 0"
68
- :class="style.container({ class: props.ui?.container })"
69
- data-part="container"
70
- >
71
- <PinInputInput
72
- v-bind="$attrs"
73
- :index="index"
74
- :disabled="disabled"
75
- :class="style.base({ class: props.ui?.base })"
76
- data-part="base"
77
- @blur="onBlur"
78
- @focus="emitFormFocus"
79
- />
80
- </span>
87
+ :ref="(el) => inputsRef[index] = el"
88
+ :index="index"
89
+ :disabled="disabled"
90
+ :class="ui.base({ class: props.ui?.base })"
91
+ data-part="base"
92
+ @blur="onBlur"
93
+ @focus="emitFormFocus"
94
+ />
81
95
  </PinInputRoot>
82
96
  </template>