@byyuurin/ui 0.0.10 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/README.md +170 -58
  2. package/dist/module.d.mts +4 -13
  3. package/dist/module.json +4 -4
  4. package/dist/module.mjs +54 -20
  5. package/dist/runtime/components/Accordion.vue +48 -72
  6. package/dist/runtime/components/Accordion.vue.d.ts +74 -0
  7. package/dist/runtime/components/Alert.vue +65 -83
  8. package/dist/runtime/components/Alert.vue.d.ts +71 -0
  9. package/dist/runtime/components/App.vue +28 -42
  10. package/dist/runtime/components/App.vue.d.ts +26 -0
  11. package/dist/runtime/components/Avatar.vue +82 -58
  12. package/dist/runtime/components/Avatar.vue.d.ts +39 -0
  13. package/dist/runtime/components/AvatarGroup.vue +43 -70
  14. package/dist/runtime/components/AvatarGroup.vue.d.ts +30 -0
  15. package/dist/runtime/components/Badge.vue +70 -64
  16. package/dist/runtime/components/Badge.vue.d.ts +45 -0
  17. package/dist/runtime/components/Breadcrumb.vue +56 -76
  18. package/dist/runtime/components/Breadcrumb.vue.d.ts +79 -0
  19. package/dist/runtime/components/Button.vue +150 -78
  20. package/dist/runtime/components/Button.vue.d.ts +45 -0
  21. package/dist/runtime/components/Calendar.vue +99 -125
  22. package/dist/runtime/components/Calendar.vue.d.ts +102 -0
  23. package/dist/runtime/components/Card.vue +33 -46
  24. package/dist/runtime/components/Card.vue.d.ts +34 -0
  25. package/dist/runtime/components/Carousel.vue +164 -237
  26. package/dist/runtime/components/Carousel.vue.d.ts +125 -0
  27. package/dist/runtime/components/Checkbox.vue +86 -88
  28. package/dist/runtime/components/Checkbox.vue.d.ts +63 -0
  29. package/dist/runtime/components/Chip.vue +44 -58
  30. package/dist/runtime/components/Chip.vue.d.ts +48 -0
  31. package/dist/runtime/components/Collapsible.vue +29 -33
  32. package/dist/runtime/components/Collapsible.vue.d.ts +34 -0
  33. package/dist/runtime/components/Drawer.vue +110 -150
  34. package/dist/runtime/components/Drawer.vue.d.ts +103 -0
  35. package/dist/runtime/components/DropdownMenu.vue +49 -120
  36. package/dist/runtime/components/DropdownMenu.vue.d.ts +140 -0
  37. package/dist/runtime/components/DropdownMenuContent.vue +177 -143
  38. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +51 -0
  39. package/dist/runtime/components/FieldGroup.vue +33 -0
  40. package/dist/runtime/components/FieldGroup.vue.d.ts +33 -0
  41. package/dist/runtime/components/Form.vue +245 -275
  42. package/dist/runtime/components/Form.vue.d.ts +103 -0
  43. package/dist/runtime/components/FormField.vue +108 -0
  44. package/dist/runtime/components/FormField.vue.d.ts +63 -0
  45. package/dist/runtime/components/Icon.vue +20 -0
  46. package/dist/runtime/components/Icon.vue.d.ts +9 -0
  47. package/dist/runtime/components/Input.vue +125 -156
  48. package/dist/runtime/components/Input.vue.d.ts +76 -0
  49. package/dist/runtime/components/InputNumber.vue +103 -130
  50. package/dist/runtime/components/InputNumber.vue.d.ts +191 -0
  51. package/dist/runtime/components/Kbd.vue +24 -39
  52. package/dist/runtime/components/Kbd.vue.d.ts +34 -0
  53. package/dist/runtime/components/Link.vue +105 -337
  54. package/dist/runtime/components/Link.vue.d.ts +95 -0
  55. package/dist/runtime/components/LinkBase.vue +31 -71
  56. package/dist/runtime/components/LinkBase.vue.d.ts +33 -0
  57. package/dist/runtime/components/Modal.vue +82 -103
  58. package/dist/runtime/components/Modal.vue.d.ts +96 -0
  59. package/dist/runtime/components/NavigationMenu.vue +336 -0
  60. package/dist/runtime/components/NavigationMenu.vue.d.ts +181 -0
  61. package/dist/runtime/components/OverlayProvider.vue +12 -16
  62. package/dist/runtime/components/OverlayProvider.vue.d.ts +3 -0
  63. package/dist/runtime/components/Pagination.vue +65 -139
  64. package/dist/runtime/components/Pagination.vue.d.ts +116 -0
  65. package/dist/runtime/components/PinInput.vue +78 -73
  66. package/dist/runtime/components/PinInput.vue.d.ts +54 -0
  67. package/dist/runtime/components/Popover.vue +60 -75
  68. package/dist/runtime/components/Popover.vue.d.ts +70 -0
  69. package/dist/runtime/components/Progress.vue +79 -126
  70. package/dist/runtime/components/Progress.vue.d.ts +63 -0
  71. package/dist/runtime/components/RadioGroup.vue +109 -140
  72. package/dist/runtime/components/RadioGroup.vue.d.ts +96 -0
  73. package/dist/runtime/components/ScrollArea.vue +50 -48
  74. package/dist/runtime/components/ScrollArea.vue.d.ts +21 -0
  75. package/dist/runtime/components/Select.vue +221 -221
  76. package/dist/runtime/components/Select.vue.d.ts +260 -0
  77. package/dist/runtime/components/Separator.vue +55 -47
  78. package/dist/runtime/components/Separator.vue.d.ts +48 -0
  79. package/dist/runtime/components/Skeleton.vue +25 -22
  80. package/dist/runtime/components/Skeleton.vue.d.ts +19 -0
  81. package/dist/runtime/components/Slider.vue +73 -77
  82. package/dist/runtime/components/Slider.vue.d.ts +52 -0
  83. package/dist/runtime/components/Switch.vue +66 -77
  84. package/dist/runtime/components/Switch.vue.d.ts +58 -0
  85. package/dist/runtime/components/Table.vue +357 -215
  86. package/dist/runtime/components/Table.vue.d.ts +234 -0
  87. package/dist/runtime/components/Tabs.vue +90 -88
  88. package/dist/runtime/components/Tabs.vue.d.ts +97 -0
  89. package/dist/runtime/components/Textarea.vue +147 -146
  90. package/dist/runtime/components/Textarea.vue.d.ts +76 -0
  91. package/dist/runtime/components/Toast.vue +108 -90
  92. package/dist/runtime/components/Toast.vue.d.ts +152 -0
  93. package/dist/runtime/components/ToastProvider.vue +82 -109
  94. package/dist/runtime/components/ToastProvider.vue.d.ts +51 -0
  95. package/dist/runtime/components/Tooltip.vue +54 -53
  96. package/dist/runtime/components/Tooltip.vue.d.ts +53 -0
  97. package/dist/runtime/composables/defineShortcuts.d.ts +16 -0
  98. package/dist/runtime/composables/defineShortcuts.js +129 -0
  99. package/dist/runtime/composables/useAvatarGroup.d.ts +8 -3
  100. package/dist/runtime/composables/useAvatarGroup.js +10 -3
  101. package/dist/runtime/composables/useComponentIcons.d.ts +9 -6
  102. package/dist/runtime/composables/useComponentIcons.js +4 -4
  103. package/dist/runtime/composables/useFieldGroup.d.ts +8 -0
  104. package/dist/runtime/composables/useFieldGroup.js +14 -0
  105. package/dist/runtime/composables/useFormField.d.ts +62 -0
  106. package/dist/runtime/composables/useFormField.js +99 -0
  107. package/dist/runtime/composables/useKbd.d.ts +3 -2
  108. package/dist/runtime/composables/useKbd.js +3 -2
  109. package/dist/runtime/composables/useLocale.d.ts +68 -5
  110. package/dist/runtime/composables/useLocale.js +11 -11
  111. package/dist/runtime/composables/useOverlay.d.ts +51 -15
  112. package/dist/runtime/composables/useOverlay.js +44 -30
  113. package/dist/runtime/composables/usePortal.d.ts +6 -0
  114. package/dist/runtime/composables/usePortal.js +17 -0
  115. package/dist/runtime/composables/useToast.d.ts +12 -5
  116. package/dist/runtime/composables/useToast.js +12 -7
  117. package/dist/runtime/locale/en.d.ts +30 -1
  118. package/dist/runtime/locale/en.js +2 -1
  119. package/dist/runtime/locale/index.d.ts +2 -2
  120. package/dist/runtime/locale/index.js +1 -1
  121. package/dist/runtime/locale/zh_tw.d.ts +31 -0
  122. package/dist/runtime/locale/{zh-tw.js → zh_tw.js} +2 -1
  123. package/dist/runtime/plugins/colors.d.ts +2 -0
  124. package/dist/runtime/plugins/colors.js +50 -0
  125. package/dist/runtime/types/app.config.d.ts +6 -0
  126. package/dist/runtime/types/form.d.ts +58 -17
  127. package/dist/runtime/types/form.js +11 -0
  128. package/dist/runtime/types/index.d.ts +51 -8
  129. package/dist/runtime/types/index.js +45 -2
  130. package/dist/runtime/types/input.d.ts +8 -0
  131. package/dist/runtime/types/locale.d.ts +5 -0
  132. package/dist/runtime/types/style.d.ts +33 -0
  133. package/dist/runtime/types/style.js +0 -0
  134. package/dist/runtime/types/unocss.d.ts +4 -0
  135. package/dist/runtime/types/utils.d.ts +38 -37
  136. package/dist/runtime/utils/form.d.ts +5 -1
  137. package/dist/runtime/utils/form.js +49 -0
  138. package/dist/runtime/utils/index.d.ts +10 -13
  139. package/dist/runtime/utils/index.js +41 -48
  140. package/dist/runtime/utils/link.d.ts +5 -6
  141. package/dist/runtime/utils/link.js +16 -2
  142. package/dist/runtime/utils/locale.d.ts +5 -0
  143. package/dist/runtime/utils/locale.js +10 -0
  144. package/dist/runtime/utils/style.d.ts +94 -0
  145. package/dist/runtime/utils/style.js +37 -0
  146. package/dist/runtime/vue/components/Icon.vue +15 -0
  147. package/dist/runtime/vue/components/Icon.vue.d.ts +7 -0
  148. package/dist/runtime/vue/components/Link.vue +163 -0
  149. package/dist/runtime/vue/components/Link.vue.d.ts +95 -0
  150. package/dist/runtime/vue/composables/useAppConfig.d.ts +1 -0
  151. package/dist/runtime/vue/composables/useAppConfig.js +4 -0
  152. package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
  153. package/dist/runtime/vue/plugins/color-mode.js +6 -0
  154. package/dist/runtime/vue/plugins/head.d.ts +4 -0
  155. package/dist/runtime/vue/plugins/head.js +9 -0
  156. package/dist/runtime/vue/stubs.d.ts +16 -1
  157. package/dist/runtime/vue/stubs.js +32 -1
  158. package/dist/setup.d.mts +13 -0
  159. package/dist/setup.mjs +12 -0
  160. package/dist/shared/ui.CzIlLITK.mjs +51 -0
  161. package/dist/shared/ui.DSyJHSTk.mjs +3787 -0
  162. package/dist/shared/ui.DpbffTXs.d.mts +84 -0
  163. package/dist/shared/ui.IulR-OYx.d.mts +64 -0
  164. package/dist/types.d.mts +3 -1
  165. package/dist/unocss.d.mts +12 -52
  166. package/dist/unocss.mjs +144 -253
  167. package/dist/unplugin.d.mts +13 -26
  168. package/dist/unplugin.mjs +193 -18
  169. package/dist/vite.d.mts +10 -1
  170. package/dist/vite.mjs +12 -3
  171. package/package.json +156 -87
  172. package/vue-plugin.d.ts +5 -0
  173. package/dist/module.cjs +0 -5
  174. package/dist/module.d.ts +0 -13
  175. package/dist/module.mjs.map +0 -1
  176. package/dist/runtime/app/injections.d.ts +0 -9307
  177. package/dist/runtime/app/injections.js +0 -61
  178. package/dist/runtime/components/ButtonGroup.vue +0 -46
  179. package/dist/runtime/components/FormItem.vue +0 -129
  180. package/dist/runtime/composables/useButtonGroup.d.ts +0 -5
  181. package/dist/runtime/composables/useButtonGroup.js +0 -9
  182. package/dist/runtime/composables/useFormItem.d.ts +0 -27
  183. package/dist/runtime/composables/useFormItem.js +0 -64
  184. package/dist/runtime/composables/useTheme.d.ts +0 -9
  185. package/dist/runtime/composables/useTheme.js +0 -23
  186. package/dist/runtime/index.d.ts +0 -44
  187. package/dist/runtime/index.js +0 -44
  188. package/dist/runtime/locale/zh-tw.d.ts +0 -2
  189. package/dist/runtime/theme/accordion.d.ts +0 -56
  190. package/dist/runtime/theme/accordion.js +0 -28
  191. package/dist/runtime/theme/alert.d.ts +0 -125
  192. package/dist/runtime/theme/alert.js +0 -47
  193. package/dist/runtime/theme/app.d.ts +0 -19
  194. package/dist/runtime/theme/app.js +0 -19
  195. package/dist/runtime/theme/avatar-group.d.ts +0 -52
  196. package/dist/runtime/theme/avatar-group.js +0 -32
  197. package/dist/runtime/theme/avatar.d.ts +0 -56
  198. package/dist/runtime/theme/avatar.js +0 -34
  199. package/dist/runtime/theme/badge.d.ts +0 -82
  200. package/dist/runtime/theme/badge.js +0 -92
  201. package/dist/runtime/theme/breadcrumb.d.ts +0 -67
  202. package/dist/runtime/theme/breadcrumb.js +0 -44
  203. package/dist/runtime/theme/button-group.d.ts +0 -66
  204. package/dist/runtime/theme/button-group.js +0 -42
  205. package/dist/runtime/theme/button.d.ts +0 -190
  206. package/dist/runtime/theme/button.js +0 -164
  207. package/dist/runtime/theme/calendar.d.ts +0 -56
  208. package/dist/runtime/theme/calendar.js +0 -69
  209. package/dist/runtime/theme/card.d.ts +0 -62
  210. package/dist/runtime/theme/card.js +0 -37
  211. package/dist/runtime/theme/carousel.d.ts +0 -113
  212. package/dist/runtime/theme/carousel.js +0 -43
  213. package/dist/runtime/theme/checkbox.d.ts +0 -88
  214. package/dist/runtime/theme/checkbox.js +0 -54
  215. package/dist/runtime/theme/chip.d.ts +0 -67
  216. package/dist/runtime/theme/chip.js +0 -66
  217. package/dist/runtime/theme/collapsible.d.ts +0 -38
  218. package/dist/runtime/theme/collapsible.js +0 -10
  219. package/dist/runtime/theme/drawer.d.ts +0 -148
  220. package/dist/runtime/theme/drawer.js +0 -113
  221. package/dist/runtime/theme/dropdown-menu.d.ts +0 -71
  222. package/dist/runtime/theme/dropdown-menu.js +0 -83
  223. package/dist/runtime/theme/form-item.d.ts +0 -76
  224. package/dist/runtime/theme/form-item.js +0 -34
  225. package/dist/runtime/theme/form.d.ts +0 -8
  226. package/dist/runtime/theme/form.js +0 -7
  227. package/dist/runtime/theme/index.d.ts +0 -41
  228. package/dist/runtime/theme/index.js +0 -41
  229. package/dist/runtime/theme/input-number.d.ts +0 -121
  230. package/dist/runtime/theme/input-number.js +0 -95
  231. package/dist/runtime/theme/input.d.ts +0 -178
  232. package/dist/runtime/theme/input.js +0 -151
  233. package/dist/runtime/theme/kbd.d.ts +0 -39
  234. package/dist/runtime/theme/kbd.js +0 -26
  235. package/dist/runtime/theme/link.d.ts +0 -44
  236. package/dist/runtime/theme/link.js +0 -26
  237. package/dist/runtime/theme/modal.d.ts +0 -48
  238. package/dist/runtime/theme/modal.js +0 -55
  239. package/dist/runtime/theme/pagination.d.ts +0 -80
  240. package/dist/runtime/theme/pagination.js +0 -17
  241. package/dist/runtime/theme/pinInput.d.ts +0 -100
  242. package/dist/runtime/theme/pinInput.js +0 -111
  243. package/dist/runtime/theme/popover.d.ts +0 -38
  244. package/dist/runtime/theme/popover.js +0 -13
  245. package/dist/runtime/theme/progress.d.ts +0 -186
  246. package/dist/runtime/theme/progress.js +0 -95
  247. package/dist/runtime/theme/radio-group.d.ts +0 -110
  248. package/dist/runtime/theme/radio-group.js +0 -61
  249. package/dist/runtime/theme/scroll-area.d.ts +0 -73
  250. package/dist/runtime/theme/scroll-area.js +0 -33
  251. package/dist/runtime/theme/select.d.ts +0 -192
  252. package/dist/runtime/theme/select.js +0 -173
  253. package/dist/runtime/theme/separator.d.ts +0 -80
  254. package/dist/runtime/theme/separator.js +0 -53
  255. package/dist/runtime/theme/skeleton.d.ts +0 -8
  256. package/dist/runtime/theme/skeleton.js +0 -7
  257. package/dist/runtime/theme/slider.d.ts +0 -76
  258. package/dist/runtime/theme/slider.js +0 -52
  259. package/dist/runtime/theme/switch.d.ts +0 -122
  260. package/dist/runtime/theme/switch.js +0 -78
  261. package/dist/runtime/theme/table.d.ts +0 -92
  262. package/dist/runtime/theme/table.js +0 -36
  263. package/dist/runtime/theme/tabs.d.ts +0 -135
  264. package/dist/runtime/theme/tabs.js +0 -146
  265. package/dist/runtime/theme/textarea.d.ts +0 -96
  266. package/dist/runtime/theme/textarea.js +0 -116
  267. package/dist/runtime/theme/toast-provider.d.ts +0 -122
  268. package/dist/runtime/theme/toast-provider.js +0 -97
  269. package/dist/runtime/theme/toast.d.ts +0 -89
  270. package/dist/runtime/theme/toast.js +0 -35
  271. package/dist/runtime/theme/tooltip.d.ts +0 -44
  272. package/dist/runtime/theme/tooltip.js +0 -11
  273. package/dist/runtime/types/components.d.ts +0 -42
  274. package/dist/runtime/utils/extend-theme.d.ts +0 -9
  275. package/dist/runtime/utils/extend-theme.js +0 -27
  276. package/dist/runtime/utils/styler.d.ts +0 -4
  277. package/dist/runtime/utils/styler.js +0 -10
  278. package/dist/runtime/utils/translator.d.ts +0 -18
  279. package/dist/runtime/utils/translator.js +0 -8
  280. package/dist/shared/ui.3e7fad19.mjs +0 -5
  281. package/dist/shared/ui.3e7fad19.mjs.map +0 -1
  282. package/dist/types.d.ts +0 -1
  283. package/dist/unocss.d.ts +0 -52
  284. package/dist/unocss.mjs.map +0 -1
  285. package/dist/unplugin.d.ts +0 -26
  286. package/dist/unplugin.mjs.map +0 -1
  287. package/dist/vite.d.ts +0 -9
  288. package/dist/vite.mjs.map +0 -1
  289. /package/dist/runtime/types/{components.js → input.js} +0 -0
@@ -1,308 +1,235 @@
1
- <script lang="ts">
2
- import type { VariantProps } from '@byyuurin/ui-kit'
3
- import type { EmblaCarouselType, EmblaOptionsType, EmblaPluginType } from 'embla-carousel'
4
- import type { AutoHeightOptionsType } from 'embla-carousel-auto-height'
5
- import type { AutoScrollOptionsType } from 'embla-carousel-auto-scroll'
6
- import type { AutoplayOptionsType } from 'embla-carousel-autoplay'
7
- import type { ClassNamesOptionsType } from 'embla-carousel-class-names'
8
- import type { FadeOptionsType } from 'embla-carousel-fade'
9
- import type { WheelGesturesPluginOptions } from 'embla-carousel-wheel-gestures'
10
- import type { AcceptableValue, PrimitiveProps } from 'reka-ui'
11
- import type { carousel } from '../theme'
12
- import type { ButtonProps, ComponentAttrs } from '../types'
13
-
14
- export type CarouselItem = AcceptableValue
15
-
16
- export interface CarouselSlots<T extends CarouselItem = CarouselItem> {
17
- default?: (props: { item: T, index: number }) => any
18
- }
19
-
20
- type CarouselVariants = VariantProps<typeof carousel>
21
-
22
- export interface CarouselProps<T extends CarouselItem = CarouselItem> extends ComponentAttrs<typeof carousel>, Omit<EmblaOptionsType, 'axis' | 'container' | 'slides' | 'direction'> {
23
- /**
24
- * The element or component this component should render as.
25
- * @default "div"
26
- */
27
- as?: PrimitiveProps['as']
28
- /**
29
- * Configure the prev button when arrows are enabled.
30
- * @default { size: 'md', variant: 'link' }
31
- */
32
- prev?: ButtonProps
33
- /**
34
- * The icon displayed in the prev button.
35
- * @default app.icons.chevronLeft
36
- */
37
- prevIcon?: string
38
- /**
39
- * Configure the next button when arrows are enabled.
40
- * @default { size: 'md', variant: 'link' }
41
- */
42
- next?: ButtonProps
43
- /**
44
- * The icon displayed in the next button.
45
- * @default app.icons.chevronRight
46
- */
47
- nextIcon?: string
48
- /**
49
- * Display prev and next buttons to scroll the carousel.
50
- * @default false
51
- */
52
- arrows?: boolean
53
- /**
54
- * Display dots to scroll to a specific slide.
55
- * @default false
56
- */
57
- dots?: boolean
58
- orientation?: CarouselVariants['orientation']
59
- items?: T[]
60
- /**
61
- * Enable Autoplay plugin
62
- * @link https://www.embla-carousel.com/plugins/autoplay/
63
- */
64
- autoplay?: boolean | AutoplayOptionsType
65
- /**
66
- * Enable Auto Scroll plugin
67
- * @link https://www.embla-carousel.com/plugins/auto-scroll/
68
- */
69
- autoScroll?: boolean | AutoScrollOptionsType
70
- /**
71
- * Enable Auto Height plugin
72
- * @link https://www.embla-carousel.com/plugins/auto-height/
73
- */
74
- autoHeight?: boolean | AutoHeightOptionsType
75
- /**
76
- * Enable Class Names plugin
77
- * @link https://www.embla-carousel.com/plugins/class-names/
78
- */
79
- classNames?: boolean | ClassNamesOptionsType
80
- /**
81
- * Enable Fade plugin
82
- * @link https://www.embla-carousel.com/plugins/fade/
83
- */
84
- fade?: boolean | FadeOptionsType
85
- /**
86
- * Enable Wheel Gestures plugin
87
- * @link https://www.embla-carousel.com/plugins/wheel-gestures/
88
- */
89
- wheelGestures?: boolean | WheelGesturesPluginOptions
90
- }
1
+ <script>
2
+ import theme from "#build/ui/carousel";
91
3
  </script>
92
4
 
93
- <script setup lang="ts" generic="T extends CarouselItem">
94
- import { computedAsync, reactivePick } from '@vueuse/core'
95
- import useEmblaCarousel from 'embla-carousel-vue'
96
- import { Primitive, useForwardProps } from 'reka-ui'
97
- import { computed, onMounted, ref, watch } from 'vue'
98
- import { useLocale } from '../composables/useLocale'
99
- import { useTheme } from '../composables/useTheme'
100
- import Button from './Button.vue'
101
-
102
- const props = withDefaults(defineProps<CarouselProps<T>>(), {
103
- orientation: 'horizontal',
104
- arrows: false,
105
- dots: false,
106
-
107
- // Embla Options
108
- active: true,
109
- align: 'center',
110
- breakpoints: () => ({}),
111
- containScroll: 'trimSnaps',
112
- dragFree: false,
113
- dragThreshold: 10,
114
- duration: 25,
115
- inViewThreshold: 0,
116
- loop: false,
117
- skipSnaps: false,
118
- slidesToScroll: 1,
119
- startIndex: 0,
120
- watchDrag: true,
121
- watchResize: true,
122
- watchSlides: true,
123
- watchFocus: true,
124
-
125
- // Embla Plugins
126
- autoplay: false,
127
- autoScroll: false,
128
- autoHeight: false,
129
- classNames: false,
130
- fade: false,
131
- wheelGestures: false,
132
- })
133
- defineSlots<CarouselSlots<T>>()
134
-
135
- const rootProps = useForwardProps(reactivePick(props, 'active', 'align', 'breakpoints', 'containScroll', 'dragFree', 'dragThreshold', 'duration', 'inViewThreshold', 'loop', 'skipSnaps', 'slidesToScroll', 'startIndex', 'watchDrag', 'watchResize', 'watchSlides', 'watchFocus'))
136
-
137
- const { t, dir } = useLocale()
138
- const { theme, generateStyle } = useTheme()
139
- const style = computed(() => generateStyle('carousel', props))
140
-
141
- const prevIcon = computed(() => props.prevIcon || (dir.value === 'rtl' ? theme.value.app.icons.chevronRight : theme.value.app.icons.chevronLeft))
142
- const nextIcon = computed(() => props.nextIcon || (dir.value === 'rtl' ? theme.value.app.icons.chevronLeft : theme.value.app.icons.chevronRight))
143
-
144
- const options = computed<EmblaOptionsType>(() => ({
145
- ...(props.fade ? { align: 'center', containScroll: false } : {}),
5
+ <script setup>
6
+ import { reactivePick } from "@vueuse/core";
7
+ import useEmblaCarousel from "embla-carousel-vue";
8
+ import { Primitive, useForwardProps } from "reka-ui";
9
+ import { computed, onBeforeMount, onMounted, ref, watch } from "vue";
10
+ import { useAppConfig } from "#imports";
11
+ import { useLocale } from "../composables/useLocale";
12
+ import { cv, merge } from "../utils/style";
13
+ import Button from "./Button.vue";
14
+ const props = defineProps({
15
+ as: { type: null, required: false },
16
+ prev: { type: Object, required: false },
17
+ prevIcon: { type: String, required: false },
18
+ next: { type: Object, required: false },
19
+ nextIcon: { type: String, required: false },
20
+ arrows: { type: Boolean, required: false, default: false },
21
+ dots: { type: Boolean, required: false, default: false },
22
+ orientation: { type: null, required: false, default: "horizontal" },
23
+ items: { type: Array, required: false },
24
+ autoplay: { type: [Boolean, Object], required: false, default: false },
25
+ autoScroll: { type: [Boolean, Object], required: false, default: false },
26
+ autoHeight: { type: [Boolean, Object], required: false, default: false },
27
+ classNames: { type: [Boolean, Object], required: false, default: false },
28
+ fade: { type: [Boolean, Object], required: false, default: false },
29
+ wheelGestures: { type: [Boolean, Object], required: false, default: false },
30
+ ui: { type: null, required: false },
31
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
32
+ align: { type: [String, Function], required: false, default: "center" },
33
+ containScroll: { type: [Boolean, String], required: false, default: "trimSnaps" },
34
+ slidesToScroll: { type: [String, Number], required: false, default: 1 },
35
+ dragFree: { type: Boolean, required: false, default: false },
36
+ dragThreshold: { type: Number, required: false, default: 10 },
37
+ inViewThreshold: { type: null, required: false, default: 0 },
38
+ loop: { type: Boolean, required: false, default: false },
39
+ skipSnaps: { type: Boolean, required: false, default: false },
40
+ duration: { type: Number, required: false, default: 25 },
41
+ startIndex: { type: Number, required: false, default: 0 },
42
+ watchDrag: { type: [Boolean, Function], required: false, default: true },
43
+ watchResize: { type: [Boolean, Function], required: false, default: true },
44
+ watchSlides: { type: [Boolean, Function], required: false, default: true },
45
+ watchFocus: { type: [Boolean, Function], required: false, default: true },
46
+ active: { type: Boolean, required: false, default: true },
47
+ breakpoints: { type: Object, required: false, default: () => ({}) }
48
+ });
49
+ const emit = defineEmits(["select"]);
50
+ defineSlots();
51
+ const { t, dir } = useLocale();
52
+ const appConfig = useAppConfig();
53
+ const ui = computed(() => {
54
+ const styler = cv(merge(theme, appConfig.ui.carousel));
55
+ return styler(props);
56
+ });
57
+ const rootProps = useForwardProps(reactivePick(props, "active", "align", "breakpoints", "containScroll", "dragFree", "dragThreshold", "duration", "inViewThreshold", "loop", "skipSnaps", "slidesToScroll", "startIndex", "watchDrag", "watchResize", "watchSlides", "watchFocus"));
58
+ const prevIcon = computed(() => props.prevIcon || (dir.value === "rtl" ? appConfig.ui.icons.chevronRight : appConfig.ui.icons.chevronLeft));
59
+ const nextIcon = computed(() => props.nextIcon || (dir.value === "rtl" ? appConfig.ui.icons.chevronLeft : appConfig.ui.icons.chevronRight));
60
+ const options = computed(() => ({
61
+ ...props.fade ? { align: "center", containScroll: false } : {},
146
62
  ...rootProps.value,
147
- axis: props.orientation === 'horizontal' ? 'x' : 'y',
148
- direction: dir.value === 'rtl' ? 'rtl' : 'ltr',
149
- }))
150
-
151
- const plugins = computedAsync<EmblaPluginType[]>(async () => {
152
- const plugins: EmblaPluginType[] = []
153
-
63
+ axis: props.orientation === "horizontal" ? "x" : "y",
64
+ direction: dir.value === "rtl" ? "rtl" : "ltr"
65
+ }));
66
+ const plugins = ref([]);
67
+ async function loadPlugins() {
68
+ const emblaPlugins = [];
154
69
  if (props.autoplay) {
155
- const AutoplayPlugin = await import('embla-carousel-autoplay').then((r) => r.default)
156
- plugins.push(AutoplayPlugin(typeof props.autoplay === 'boolean' ? {} : props.autoplay))
70
+ const AutoplayPlugin = await import("embla-carousel-autoplay").then((r) => r.default);
71
+ emblaPlugins.push(AutoplayPlugin(typeof props.autoplay === "boolean" ? {} : props.autoplay));
157
72
  }
158
-
159
73
  if (props.autoScroll) {
160
- const AutoScrollPlugin = await import('embla-carousel-auto-scroll').then((r) => r.default)
161
- plugins.push(AutoScrollPlugin(typeof props.autoScroll === 'boolean' ? {} : props.autoScroll))
74
+ const AutoScrollPlugin = await import("embla-carousel-auto-scroll").then((r) => r.default);
75
+ emblaPlugins.push(AutoScrollPlugin(typeof props.autoScroll === "boolean" ? {} : props.autoScroll));
162
76
  }
163
-
164
77
  if (props.autoHeight) {
165
- const AutoHeightPlugin = await import('embla-carousel-auto-height').then((r) => r.default)
166
- plugins.push(AutoHeightPlugin(typeof props.autoHeight === 'boolean' ? {} : props.autoHeight))
78
+ const AutoHeightPlugin = await import("embla-carousel-auto-height").then((r) => r.default);
79
+ emblaPlugins.push(AutoHeightPlugin(typeof props.autoHeight === "boolean" ? {} : props.autoHeight));
167
80
  }
168
-
169
81
  if (props.classNames) {
170
- const ClassNamesPlugin = await import('embla-carousel-class-names').then((r) => r.default)
171
- plugins.push(ClassNamesPlugin(typeof props.classNames === 'boolean' ? {} : props.classNames))
82
+ const ClassNamesPlugin = await import("embla-carousel-class-names").then((r) => r.default);
83
+ emblaPlugins.push(ClassNamesPlugin(typeof props.classNames === "boolean" ? {} : props.classNames));
172
84
  }
173
-
174
85
  if (props.fade) {
175
- const FadePlugin = await import('embla-carousel-fade').then((r) => r.default)
176
- plugins.push(FadePlugin(typeof props.fade === 'boolean' ? {} : props.fade))
86
+ const FadePlugin = await import("embla-carousel-fade").then((r) => r.default);
87
+ emblaPlugins.push(FadePlugin(typeof props.fade === "boolean" ? {} : props.fade));
177
88
  }
178
-
179
89
  if (props.wheelGestures) {
180
- const { WheelGesturesPlugin } = await import('embla-carousel-wheel-gestures')
181
- plugins.push(WheelGesturesPlugin(typeof props.wheelGestures === 'boolean' ? {} : props.wheelGestures))
90
+ const { WheelGesturesPlugin } = await import("embla-carousel-wheel-gestures");
91
+ emblaPlugins.push(WheelGesturesPlugin(typeof props.wheelGestures === "boolean" ? {} : props.wheelGestures));
182
92
  }
183
-
184
- return plugins
185
- })
186
-
187
- const [emblaRef, emblaApi] = useEmblaCarousel(options.value, plugins.value)
188
-
189
- watch([options, plugins], () => {
190
- emblaApi.value?.reInit(options.value, plugins.value)
191
- })
192
-
93
+ plugins.value = emblaPlugins;
94
+ }
95
+ watch(() => [props.autoplay, props.autoScroll, props.autoHeight, props.classNames, props.fade, props.wheelGestures], async () => {
96
+ await loadPlugins();
97
+ emblaApi.value?.reInit(options.value, plugins.value);
98
+ }, { immediate: true });
99
+ const [emblaRef, emblaApi] = useEmblaCarousel(options, plugins);
100
+ watch(options, () => {
101
+ emblaApi.value?.reInit(options.value, plugins.value);
102
+ }, { flush: "post" });
193
103
  function scrollPrev() {
194
- emblaApi.value?.scrollPrev()
104
+ emblaApi.value?.scrollPrev();
195
105
  }
196
-
197
106
  function scrollNext() {
198
- emblaApi.value?.scrollNext()
107
+ emblaApi.value?.scrollNext();
199
108
  }
200
-
201
- function scrollTo(index: number) {
202
- emblaApi.value?.scrollTo(index)
109
+ function scrollTo(index) {
110
+ emblaApi.value?.scrollTo(index);
203
111
  }
204
-
205
- function onKeyDown(event: KeyboardEvent) {
206
- const prevKey = props.orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft'
207
- const nextKey = props.orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight'
208
-
112
+ function onKeyDown(event) {
113
+ let prevKey;
114
+ let nextKey;
115
+ if (props.orientation === "horizontal") {
116
+ prevKey = dir.value === "ltr" ? "ArrowLeft" : "ArrowRight";
117
+ nextKey = dir.value === "ltr" ? "ArrowRight" : "ArrowLeft";
118
+ } else {
119
+ prevKey = "ArrowUp";
120
+ nextKey = "ArrowDown";
121
+ }
209
122
  if (event.key === prevKey) {
210
- event.preventDefault()
211
- scrollPrev()
212
-
213
- return
123
+ event.preventDefault();
124
+ scrollPrev();
125
+ return;
214
126
  }
215
-
216
127
  if (event.key === nextKey) {
217
- event.preventDefault()
218
- scrollNext()
128
+ event.preventDefault();
129
+ scrollNext();
219
130
  }
220
131
  }
221
-
222
- const canScrollNext = ref(false)
223
- const canScrollPrev = ref(false)
224
- const selectedIndex = ref<number>(0)
225
- const scrollSnaps = ref<number[]>([])
226
-
227
- function onInit(api: EmblaCarouselType) {
228
- scrollSnaps.value = api?.scrollSnapList() || []
132
+ const canScrollNext = ref(false);
133
+ const canScrollPrev = ref(false);
134
+ const selectedIndex = ref(0);
135
+ const scrollSnaps = ref([]);
136
+ function onInit(api) {
137
+ scrollSnaps.value = api?.scrollSnapList() || [];
229
138
  }
230
-
231
- function onSelect(api: EmblaCarouselType) {
232
- canScrollNext.value = api?.canScrollNext() || false
233
- canScrollPrev.value = api?.canScrollPrev() || false
234
- selectedIndex.value = api?.selectedScrollSnap() || 0
139
+ function onSelect(api) {
140
+ canScrollNext.value = api?.canScrollNext() || false;
141
+ canScrollPrev.value = api?.canScrollPrev() || false;
142
+ selectedIndex.value = api?.selectedScrollSnap() || 0;
143
+ emit("select", selectedIndex.value);
144
+ }
145
+ function isCarouselItem(item) {
146
+ return typeof item === "object" && item !== null;
235
147
  }
236
-
237
148
  onMounted(() => {
238
149
  if (!emblaApi.value)
239
- return
240
-
241
- emblaApi.value?.on('init', onInit)
242
- emblaApi.value?.on('init', onSelect)
243
- emblaApi.value?.on('reInit', onInit)
244
- emblaApi.value?.on('reInit', onSelect)
245
- emblaApi.value?.on('select', onSelect)
246
- })
247
-
150
+ return;
151
+ emblaApi.value.on("init", onInit);
152
+ emblaApi.value.on("init", onSelect);
153
+ emblaApi.value.on("reInit", onInit);
154
+ emblaApi.value.on("reInit", onSelect);
155
+ emblaApi.value.on("select", onSelect);
156
+ });
157
+ onBeforeMount(() => {
158
+ if (!emblaApi.value)
159
+ return;
160
+ emblaApi.value.off("init", onInit);
161
+ emblaApi.value.off("init", onSelect);
162
+ emblaApi.value.off("reInit", onInit);
163
+ emblaApi.value.off("reInit", onSelect);
164
+ emblaApi.value.off("select", onSelect);
165
+ });
248
166
  defineExpose({
249
167
  emblaRef,
250
- emblaApi,
251
- })
168
+ emblaApi
169
+ });
252
170
  </script>
253
171
 
254
172
  <template>
255
173
  <Primitive
256
174
  :as="props.as"
257
175
  role="region"
258
- aria-roledescription="carousel"
259
176
  tabindex="0"
260
- :class="style.root({ class: [props.class, props.ui?.root] })"
177
+ :class="ui.root({ class: [props.class, props.ui?.root] })"
178
+ aria-roledescription="carousel"
179
+ :data-orientation="props.orientation"
180
+ data-part="root"
261
181
  @keydown="onKeyDown"
262
182
  >
263
- <div ref="emblaRef" :class="style.viewport({ class: props.ui?.viewport })">
264
- <div :class="style.container({ class: props.ui?.container })">
183
+ <div ref="emblaRef" :class="ui.viewport({ class: props.ui?.viewport })" data-part="viewport">
184
+ <div :class="ui.container({ class: props.ui?.container })" data-part="container">
265
185
  <div
266
186
  v-for="(item, index) in props.items"
267
187
  :key="index"
268
- role="group"
269
- aria-roledescription="slide"
270
- :class="style.item({ class: props.ui?.item })"
188
+ v-bind="props.dots ? { role: 'tabpanel' } : { 'role': 'group', 'aria-roledescription': 'slide' }"
189
+ :class="ui.item({ class: [props.ui?.item, ...isCarouselItem(item) ? [item.ui?.item, item.class] : []] })"
190
+ data-part="item"
271
191
  >
272
192
  <slot :item="item" :index="index"></slot>
273
193
  </div>
274
194
  </div>
275
195
  </div>
276
196
 
277
- <div v-if="props.arrows || props.dots" :class="style.controls({ class: props.ui?.controls })">
278
- <div v-if="props.arrows" :class="style.arrows({ class: props.ui?.arrows })">
197
+ <div v-if="props.arrows || props.dots" :class="ui.controls({ class: props.ui?.controls })" data-part="controls">
198
+ <div v-if="props.arrows" :class="ui.arrows({ class: props.ui?.arrows })" data-part="arrows">
279
199
  <Button
280
200
  :disabled="!canScrollPrev"
281
201
  :icon="prevIcon"
282
- size="md"
202
+ color="neutral"
283
203
  variant="outline"
284
204
  :aria-label="t('carousel.prev')"
285
- v-bind="typeof props.prev === 'object' ? props.prev : undefined"
286
- :class="style.prev({ class: props.ui?.prev })"
205
+ v-bind="typeof props.prev === 'object' ? props.prev : void 0"
206
+ :class="ui.prev({ class: props.ui?.prev })"
207
+ data-part="prev"
287
208
  @click="scrollPrev"
288
209
  />
289
210
  <Button
290
211
  :disabled="!canScrollNext"
291
212
  :icon="nextIcon"
292
- size="md"
213
+ color="neutral"
293
214
  variant="outline"
294
215
  :aria-label="t('carousel.next')"
295
- v-bind="typeof props.next === 'object' ? props.next : undefined"
296
- :class="style.next({ class: props.ui?.next })"
216
+ v-bind="typeof props.next === 'object' ? props.next : void 0"
217
+ :class="ui.next({ class: props.ui?.next })"
218
+ data-part="next"
297
219
  @click="scrollNext"
298
220
  />
299
221
  </div>
300
222
 
301
- <div v-if="props.dots" :class="style.dots({ class: props.ui?.dots })">
223
+ <div v-if="props.dots" role="tablist" :aria-label="t('carousel.dots')" :class="ui.dots({ class: props.ui?.dots })" data-part="dots">
302
224
  <template v-for="(_, index) in scrollSnaps" :key="index">
303
225
  <button
226
+ type="button"
227
+ role="tab"
304
228
  :aria-label="t('carousel.goto', { page: index + 1 })"
305
- :class="style.dot({ class: props.ui?.dot, active: selectedIndex === index })"
229
+ :aria-selected="selectedIndex === index"
230
+ :class="ui.dot({ class: props.ui?.dot, active: selectedIndex === index })"
231
+ data-part="dot"
232
+ :data-state="selectedIndex === index ? 'active' : void 0"
306
233
  @click="scrollTo(index)"
307
234
  ></button>
308
235
  </template>
@@ -0,0 +1,125 @@
1
+ import type { VariantProps } from '@byyuurin/ui-kit';
2
+ import type { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel';
3
+ import type { AutoHeightOptionsType } from 'embla-carousel-auto-height';
4
+ import type { AutoScrollOptionsType } from 'embla-carousel-auto-scroll';
5
+ import type { AutoplayOptionsType } from 'embla-carousel-autoplay';
6
+ import type { ClassNamesOptionsType } from 'embla-carousel-class-names';
7
+ import type { FadeOptionsType } from 'embla-carousel-fade';
8
+ import type { WheelGesturesPluginOptions } from 'embla-carousel-wheel-gestures';
9
+ import type { PrimitiveProps } from 'reka-ui';
10
+ import theme from '#build/ui/carousel';
11
+ import type { ButtonProps, ComponentBaseProps, ComponentUIProps } from '../types';
12
+ import type { AcceptableValue, StaticSlot } from '../types/utils';
13
+ export type CarouselValue = AcceptableValue;
14
+ export type CarouselItem = AcceptableValue | {
15
+ class?: ComponentBaseProps['class'];
16
+ ui?: Pick<ComponentUIProps<typeof theme>, 'item'>;
17
+ [key: string]: any;
18
+ };
19
+ type ThemeVariants = VariantProps<typeof theme>;
20
+ export interface CarouselProps<T extends CarouselItem = CarouselItem> extends ComponentBaseProps, Omit<EmblaOptionsType, 'axis' | 'container' | 'slides' | 'direction'> {
21
+ /**
22
+ * The element or component this component should render as.
23
+ * @default "div"
24
+ */
25
+ as?: PrimitiveProps['as'];
26
+ /**
27
+ * Configure the prev button when arrows are enabled.
28
+ * @default { size: 'md', variant: 'link' }
29
+ */
30
+ prev?: ButtonProps;
31
+ /**
32
+ * The icon displayed in the prev button.
33
+ * @default app.icons.chevronLeft
34
+ */
35
+ prevIcon?: string;
36
+ /**
37
+ * Configure the next button when arrows are enabled.
38
+ * @default { size: 'md', variant: 'link' }
39
+ */
40
+ next?: ButtonProps;
41
+ /**
42
+ * The icon displayed in the next button.
43
+ * @default app.icons.chevronRight
44
+ */
45
+ nextIcon?: string;
46
+ /**
47
+ * Display prev and next buttons to scroll the carousel.
48
+ * @default false
49
+ */
50
+ arrows?: boolean;
51
+ /**
52
+ * Display dots to scroll to a specific slide.
53
+ * @default false
54
+ */
55
+ dots?: boolean;
56
+ /**
57
+ * The orientation of the carousel.
58
+ * @default "horizontal"
59
+ */
60
+ orientation?: ThemeVariants['orientation'];
61
+ items?: T[];
62
+ /**
63
+ * Enable Autoplay plugin
64
+ * @see https://www.embla-carousel.com/plugins/autoplay/
65
+ */
66
+ autoplay?: boolean | AutoplayOptionsType;
67
+ /**
68
+ * Enable Auto Scroll plugin
69
+ * @see https://www.embla-carousel.com/plugins/auto-scroll/
70
+ */
71
+ autoScroll?: boolean | AutoScrollOptionsType;
72
+ /**
73
+ * Enable Auto Height plugin
74
+ * @see https://www.embla-carousel.com/plugins/auto-height/
75
+ */
76
+ autoHeight?: boolean | AutoHeightOptionsType;
77
+ /**
78
+ * Enable Class Names plugin
79
+ * @see https://www.embla-carousel.com/plugins/class-names/
80
+ */
81
+ classNames?: boolean | ClassNamesOptionsType;
82
+ /**
83
+ * Enable Fade plugin
84
+ * @see https://www.embla-carousel.com/plugins/fade/
85
+ */
86
+ fade?: boolean | FadeOptionsType;
87
+ /**
88
+ * Enable Wheel Gestures plugin
89
+ * @see https://www.embla-carousel.com/plugins/wheel-gestures/
90
+ */
91
+ wheelGestures?: boolean | WheelGesturesPluginOptions;
92
+ ui?: ComponentUIProps<typeof theme>;
93
+ }
94
+ export interface CarouselEmits {
95
+ /**
96
+ * Emitted when the selected slide changes
97
+ * @param selectedIndex The index of the selected slide
98
+ */
99
+ select: [selectedIndex: number];
100
+ }
101
+ export interface CarouselSlots<T extends CarouselItem = CarouselItem> {
102
+ default: StaticSlot<{
103
+ item: T;
104
+ index: number;
105
+ }>;
106
+ }
107
+ declare const __VLS_export: <T extends CarouselItem>(__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<{
108
+ props: __VLS_PrettifyLocal<CarouselProps<T> & {
109
+ onSelect?: ((selectedIndex: number) => any) | undefined;
110
+ }> & import("vue").PublicProps;
111
+ expose: (exposed: import("vue").ShallowUnwrapRef<{
112
+ emblaRef: import("vue").Ref<HTMLElement | undefined, HTMLElement | undefined>;
113
+ emblaApi: import("vue").Ref<EmblaCarouselType | undefined, EmblaCarouselType | undefined>;
114
+ }>) => void;
115
+ attrs: any;
116
+ slots: CarouselSlots<T>;
117
+ emit: (evt: "select", selectedIndex: number) => void;
118
+ }>) => import("vue").VNode & {
119
+ __ctx?: Awaited<typeof __VLS_setup>;
120
+ };
121
+ declare const _default: typeof __VLS_export;
122
+ export default _default;
123
+ type __VLS_PrettifyLocal<T> = {
124
+ [K in keyof T as K]: T[K];
125
+ } & {};