@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,174 +1,175 @@
1
- <script lang="ts">
2
- import type { VariantProps } from '@byyuurin/ui-kit'
3
- import type { PrimitiveProps } from 'reka-ui'
4
- import type { textarea } from '../theme'
5
- import type { ComponentAttrs } from '../types'
6
-
7
- export interface TextareaEmits {
8
- 'update:modelValue': [payload: string]
9
- 'blur': [event: FocusEvent]
10
- 'change': [event: Event]
11
- }
12
-
13
- export interface TextareaSlots {
14
- default?: (props?: {}) => any
15
- }
16
-
17
- type TextareaVariants = VariantProps<typeof textarea>
18
-
19
- export interface TextareaProps extends ComponentAttrs<typeof textarea> {
20
- /**
21
- * The element or component this component should render as.
22
- * @default "div"
23
- */
24
- as?: PrimitiveProps['as']
25
- id?: string
26
- name?: string
27
- placeholder?: string
28
- size?: TextareaVariants['size']
29
- variant?: TextareaVariants['variant']
30
- highlight?: boolean
31
- underline?: boolean
32
- required?: boolean
33
- autofocus?: boolean
34
- autofocusDelay?: number
35
- disabled?: boolean
36
- rows?: number
37
- maxRows?: number
38
- autoResize?: boolean
39
- }
1
+ <script>
2
+ import theme from "#build/ui/textarea";
40
3
  </script>
41
4
 
42
- <script setup lang="ts">
43
- import { Primitive } from 'reka-ui'
44
- import { computed, nextTick, onMounted, useTemplateRef, watch } from 'vue'
45
- import { useFormItem } from '../composables/useFormItem'
46
- import { useTheme } from '../composables/useTheme'
47
-
48
- defineOptions({
49
- inheritAttrs: false,
50
- })
51
-
52
- const props = withDefaults(defineProps<TextareaProps>(), {
53
- variant: 'outline',
54
- rows: 3,
55
- maxRows: 0,
56
- autofocusDelay: 0,
57
- })
58
-
59
- const emit = defineEmits<TextareaEmits>()
60
- defineSlots<TextareaSlots>()
61
- const [modelValue, modelModifiers] = defineModel<string | number>()
62
-
63
- const textareaRef = useTemplateRef('textareaRef')
64
-
65
- const { id, name, size, highlight, disabled, ariaAttrs, emitFormInput, emitFormChange, emitFormBlur, emitFormFocus } = useFormItem<TextareaProps>(props)
66
- const { generateStyle } = useTheme()
67
- const style = computed(() => generateStyle('textarea', {
68
- ...props,
69
- size: size.value,
70
- highlight: highlight.value,
71
- }))
72
-
73
- function autoFocus() {
74
- if (props.autofocus)
75
- textareaRef.value?.focus()
5
+ <script setup>
6
+ import { useVModel } from "@vueuse/core";
7
+ import { Primitive } from "reka-ui";
8
+ import { computed, nextTick, onMounted, shallowRef, watch } from "vue";
9
+ import { useAppConfig } from "#imports";
10
+ import { useComponentIcons } from "../composables/useComponentIcons";
11
+ import { useFormField } from "../composables/useFormField";
12
+ import { looseToNumber } from "../utils";
13
+ import { cv, merge } from "../utils/style";
14
+ import Avatar from "./Avatar.vue";
15
+ import Icon from "./Icon.vue";
16
+ defineOptions({ inheritAttrs: false });
17
+ const props = defineProps({
18
+ as: { type: null, required: false },
19
+ id: { type: String, required: false },
20
+ name: { type: String, required: false },
21
+ placeholder: { type: String, required: false },
22
+ size: { type: null, required: false },
23
+ color: { type: null, required: false },
24
+ variant: { type: null, required: false },
25
+ highlight: { type: Boolean, required: false },
26
+ required: { type: Boolean, required: false },
27
+ autofocus: { type: Boolean, required: false },
28
+ autofocusDelay: { type: Number, required: false, default: 0 },
29
+ disabled: { type: Boolean, required: false },
30
+ rows: { type: Number, required: false, default: 3 },
31
+ maxRows: { type: Number, required: false, default: 0 },
32
+ autoresize: { type: Boolean, required: false },
33
+ autoresizeDelay: { type: Number, required: false, default: 0 },
34
+ modelValue: { type: null, required: false },
35
+ defaultValue: { type: null, required: false },
36
+ modelModifiers: { type: Object, required: false },
37
+ ui: { type: null, required: false },
38
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
39
+ icon: { type: [String, Object], required: false },
40
+ avatar: { type: Object, required: false },
41
+ leading: { type: Boolean, required: false },
42
+ leadingIcon: { type: [String, Object], required: false },
43
+ trailing: { type: Boolean, required: false },
44
+ trailingIcon: { type: [String, Object], required: false },
45
+ loading: { type: Boolean, required: false },
46
+ loadingIcon: { type: [String, Object], required: false }
47
+ });
48
+ const emit = defineEmits(["update:modelValue", "blur", "change"]);
49
+ const slots = defineSlots();
50
+ const modelValue = useVModel(props, "modelValue", emit, { defaultValue: props.defaultValue });
51
+ const { id, name, size, color, highlight, disabled, ariaAttrs, emitFormInput, emitFormChange, emitFormBlur, emitFormFocus } = useFormField(props);
52
+ const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(props);
53
+ const appConfig = useAppConfig();
54
+ const ui = computed(() => {
55
+ const styler = cv(merge(theme, appConfig.ui.textarea));
56
+ return styler({
57
+ ...props,
58
+ size: size.value,
59
+ color: color.value,
60
+ highlight: highlight.value,
61
+ leading: isLeading.value || !!props.avatar || !!slots.leading,
62
+ trailing: isTrailing.value || !!slots.trailing
63
+ });
64
+ });
65
+ const textareaRef = shallowRef(null);
66
+ function updateInput(value) {
67
+ if (props.modelModifiers?.trim)
68
+ value = value?.trim() ?? null;
69
+ if (props.modelModifiers?.number)
70
+ value = looseToNumber(value);
71
+ if (props.modelModifiers?.nullable)
72
+ value ||= null;
73
+ if (props.modelModifiers?.optional)
74
+ value ||= void 0;
75
+ modelValue.value = value;
76
+ emitFormInput();
76
77
  }
77
-
78
- function updateInput(value: string) {
79
- if (modelModifiers.trim)
80
- value = value.trim()
81
-
82
- modelValue.value = value
83
- emitFormInput()
78
+ function onInput(event) {
79
+ autoResize();
80
+ if (!props.modelModifiers?.lazy)
81
+ updateInput(event.target.value);
84
82
  }
85
-
86
- function onInput(event: Event) {
87
- autoResize()
88
-
89
- if (!modelModifiers.lazy)
90
- updateInput((event.target as HTMLInputElement).value)
83
+ function onChange(event) {
84
+ const value = event.target.value;
85
+ if (props.modelModifiers?.lazy)
86
+ updateInput(value);
87
+ if (props.modelModifiers?.trim)
88
+ event.target.value = value.trim();
89
+ emitFormChange();
90
+ emit("change", event);
91
91
  }
92
-
93
- function onChange(event: Event) {
94
- const value = (event.target as HTMLInputElement).value
95
-
96
- if (modelModifiers.lazy)
97
- updateInput(value)
98
-
99
- if (modelModifiers.trim)
100
- (event.target as HTMLInputElement).value = value.trim()
101
-
102
- emit('change', event)
103
- emitFormChange()
92
+ function onBlur(event) {
93
+ emitFormBlur();
94
+ emit("blur", event);
104
95
  }
105
-
106
- function onBlur(event: FocusEvent) {
107
- emit('blur', event)
108
- emitFormBlur()
96
+ function autoFocus() {
97
+ if (props.autofocus)
98
+ textareaRef.value?.focus();
109
99
  }
110
-
111
100
  function autoResize() {
112
- if (!props.autoResize)
113
- return
114
-
115
- if (!textareaRef.value)
116
- return
117
-
118
- textareaRef.value.rows = props.rows
119
-
120
- const overflow = textareaRef.value.style.overflow
121
- textareaRef.value.style.overflow = 'hidden'
122
-
123
- const styles = window.getComputedStyle(textareaRef.value)
124
- const paddingTop = Number.parseInt(styles.paddingTop)
125
- const paddingBottom = Number.parseInt(styles.paddingBottom)
126
- const padding = paddingTop + paddingBottom
127
- const lineHeight = Number.parseInt(styles.lineHeight)
128
- const { scrollHeight } = textareaRef.value
129
- const newRows = Math.ceil((scrollHeight - padding) / lineHeight)
130
-
101
+ if (!props.autoresize || !textareaRef.value)
102
+ return;
103
+ textareaRef.value.rows = props.rows;
104
+ const overflow = textareaRef.value.style.overflow;
105
+ textareaRef.value.style.overflow = "hidden";
106
+ const styles = window.getComputedStyle(textareaRef.value);
107
+ const paddingTop = Number.parseInt(styles.paddingTop);
108
+ const paddingBottom = Number.parseInt(styles.paddingBottom);
109
+ const padding = paddingTop + paddingBottom;
110
+ const lineHeight = Number.parseInt(styles.lineHeight);
111
+ const { scrollHeight } = textareaRef.value;
112
+ const newRows = (scrollHeight - padding) / lineHeight;
131
113
  if (newRows > props.rows)
132
- textareaRef.value.rows = props.maxRows ? Math.min(newRows, props.maxRows) : newRows
133
-
134
- textareaRef.value.style.overflow = overflow
114
+ textareaRef.value.rows = props.maxRows ? Math.min(newRows, props.maxRows) : newRows;
115
+ textareaRef.value.style.overflow = overflow;
135
116
  }
136
-
137
- watch(modelValue, () => {
138
- nextTick(autoResize)
139
- })
140
-
141
- defineExpose({
142
- textareaRef,
143
- })
144
-
117
+ watch(modelValue, () => nextTick(autoResize));
145
118
  onMounted(() => {
146
- setTimeout(() => {
147
- autoFocus()
148
- }, props.autofocusDelay)
149
- })
119
+ setTimeout(() => autoFocus(), props.autofocusDelay);
120
+ setTimeout(() => autoResize(), props.autoresizeDelay);
121
+ });
122
+ defineExpose({
123
+ textareaRef
124
+ });
150
125
  </script>
151
126
 
152
127
  <template>
153
- <Primitive
154
- :as="props.as"
155
- :class="style.root({ class: [props.class, props.ui?.root] })"
156
- :aria-disabled="disabled ? true : undefined"
157
- >
128
+ <Primitive :as="props.as" :class="ui.root({ class: [props.ui?.root, props.class] })" data-part="root">
129
+ <span v-if="isLeading || props.avatar || !!slots.leading" :class="ui.leading({ class: props.ui?.leading })" data-part="leading">
130
+ <slot name="leading" :ui="ui">
131
+ <Icon
132
+ v-if="isLeading && leadingIconName"
133
+ :name="leadingIconName"
134
+ :class="ui.leadingIcon({ class: props.ui?.leadingIcon })"
135
+ data-part="leading-icon"
136
+ />
137
+ <Avatar
138
+ v-else-if="props.avatar"
139
+ :size="props.ui?.leadingAvatarSize || ui.leadingAvatarSize()"
140
+ v-bind="props.avatar"
141
+ :class="ui.leadingAvatar({ class: props.ui?.leadingAvatar })"
142
+ data-part="leading-avatar"
143
+ />
144
+ </slot>
145
+ </span>
146
+
158
147
  <textarea
159
148
  ref="textareaRef"
160
- :class="style.base({ class: props.ui?.base })"
161
149
  :value="modelValue"
162
150
  :rows="props.rows"
163
151
  :placeholder="props.placeholder"
164
152
  :required="props.required"
165
- v-bind="{ ...$attrs, ...ariaAttrs, id, name, disabled }"
153
+ v-bind="{ id, name, disabled, ...$attrs, ...ariaAttrs }"
154
+ :class="ui.base({ class: props.ui?.base })"
155
+ data-part="base"
166
156
  @input="onInput"
167
157
  @blur="onBlur"
168
158
  @change="onChange"
169
159
  @focus="emitFormFocus"
170
160
  ></textarea>
171
161
 
172
- <slot></slot>
162
+ <slot :ui="ui"></slot>
163
+
164
+ <span v-if="isTrailing || !!slots.trailing" :class="ui.trailing({ class: props.ui?.trailing })" data-part="trailing">
165
+ <slot name="trailing" :ui="ui">
166
+ <Icon
167
+ v-if="trailingIconName"
168
+ :name="trailingIconName"
169
+ :class="ui.trailingIcon({ class: props.ui?.trailingIcon })"
170
+ data-part="trailing-icon"
171
+ />
172
+ </slot>
173
+ </span>
173
174
  </Primitive>
174
175
  </template>
@@ -0,0 +1,76 @@
1
+ import type { VariantProps } from '@byyuurin/ui-kit';
2
+ import type { PrimitiveProps } from 'reka-ui';
3
+ import theme from '#build/ui/textarea';
4
+ import type { UseComponentIconsProps } from '../composables/useComponentIcons';
5
+ import type { ComponentBaseProps, ComponentStyler, ComponentUIProps } from '../types';
6
+ import type { ModelModifiers } from '../types/input';
7
+ import type { MaybeNull, StaticSlot } from '../types/utils';
8
+ type TextareaValue = MaybeNull<string | number>;
9
+ type ThemeVariants = VariantProps<typeof theme>;
10
+ export interface TextareaProps<T extends TextareaValue = TextareaValue> extends ComponentBaseProps, UseComponentIconsProps {
11
+ /**
12
+ * The element or component this component should render as.
13
+ * @default "div"
14
+ */
15
+ as?: PrimitiveProps['as'];
16
+ id?: string;
17
+ name?: string;
18
+ /** The placeholder text when the textarea is empty. */
19
+ placeholder?: string;
20
+ /** @default "sm" */
21
+ size?: ThemeVariants['size'];
22
+ /** @default "primary" */
23
+ color?: ThemeVariants['color'];
24
+ /** @default "outline" */
25
+ variant?: ThemeVariants['variant'];
26
+ /** Highlight the ring color like a focus state. */
27
+ highlight?: boolean;
28
+ required?: boolean;
29
+ autofocus?: boolean;
30
+ autofocusDelay?: number;
31
+ disabled?: boolean;
32
+ rows?: number;
33
+ maxRows?: number;
34
+ autoresize?: boolean;
35
+ autoresizeDelay?: number;
36
+ modelValue?: T;
37
+ defaultValue?: T;
38
+ modelModifiers?: ModelModifiers;
39
+ ui?: ComponentUIProps<typeof theme>;
40
+ }
41
+ export interface TextareaEmits<T extends TextareaValue = TextareaValue> {
42
+ 'update:modelValue': [payload: T];
43
+ 'blur': [event: FocusEvent];
44
+ 'change': [event: Event];
45
+ }
46
+ export interface TextareaSlots {
47
+ default: StaticSlot<{
48
+ ui: ComponentStyler<typeof theme>;
49
+ }>;
50
+ leading: StaticSlot<{
51
+ ui: ComponentStyler<typeof theme>;
52
+ }>;
53
+ trailing: StaticSlot<{
54
+ ui: ComponentStyler<typeof theme>;
55
+ }>;
56
+ }
57
+ declare const __VLS_export: <T extends TextareaValue>(__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<{
58
+ props: __VLS_PrettifyLocal<TextareaProps<T> & {
59
+ onChange?: ((event: Event) => any) | undefined;
60
+ onBlur?: ((event: FocusEvent) => any) | undefined;
61
+ "onUpdate:modelValue"?: ((payload: TextareaValue) => any) | undefined;
62
+ }> & import("vue").PublicProps;
63
+ expose: (exposed: import("vue").ShallowUnwrapRef<{
64
+ textareaRef: import("vue").ShallowRef<MaybeNull<HTMLTextAreaElement>, MaybeNull<HTMLTextAreaElement>>;
65
+ }>) => void;
66
+ attrs: any;
67
+ slots: TextareaSlots;
68
+ emit: ((evt: "change", event: Event) => void) & ((evt: "blur", event: FocusEvent) => void) & ((evt: "update:modelValue", payload: TextareaValue) => void);
69
+ }>) => import("vue").VNode & {
70
+ __ctx?: Awaited<typeof __VLS_setup>;
71
+ };
72
+ declare const _default: typeof __VLS_export;
73
+ export default _default;
74
+ type __VLS_PrettifyLocal<T> = {
75
+ [K in keyof T as K]: T[K];
76
+ } & {};
@@ -1,137 +1,155 @@
1
- <script lang="ts">
2
- import type { VariantProps } from '@byyuurin/ui-kit'
3
- import type { PrimitiveProps, ToastRootEmits, ToastRootProps } from 'reka-ui'
4
- import type { toast } from '../theme'
5
- import type { ButtonProps, ComponentAttrs } from '../types'
6
-
7
- export interface ToastEmits extends ToastRootEmits {}
8
-
9
- export interface ToastSlots {
10
- icon?: (props?: {}) => any
11
- title?: (props?: {}) => any
12
- description?: (props?: {}) => any
13
- actions?: (props?: {}) => any
14
- close?: (props: { ui: ComponentAttrs<typeof toast>['ui'] }) => any
15
- }
16
-
17
- type ToastVariants = VariantProps<typeof toast>
18
-
19
- export interface ToastProps extends ComponentAttrs<typeof toast>, Pick<ToastRootProps, 'defaultOpen' | 'open' | 'type' | 'duration'> {
20
- /** @default "li" */
21
- as?: PrimitiveProps['as']
22
- title?: string
23
- description?: string
24
- icon?: string
25
- orientation?: ToastVariants['orientation']
26
- /**
27
- * Display a list of actions:
28
- * - under the title and description when orientation is `vertical`
29
- * - next to the close button when orientation is `horizontal`
30
- */
31
- actions?: ButtonProps[]
32
- /**
33
- * Display a close button to dismiss the toast.
34
- * @default true
35
- */
36
- close?: ButtonProps | boolean
37
- /** @default app.icons.close */
38
- closeIcon?: string
39
- }
1
+ <script>
2
+ import theme from "#build/ui/toast";
40
3
  </script>
41
4
 
42
- <script setup lang="ts">
43
- import { reactivePick, useElementBounding } from '@vueuse/core'
44
- import { ToastAction, ToastClose, ToastDescription, ToastRoot, ToastTitle, useForwardPropsEmits } from 'reka-ui'
45
- import { computed, ref } from 'vue'
46
- import { useLocale } from '../composables/useLocale'
47
- import { useTheme } from '../composables/useTheme'
48
- import Button from './Button.vue'
49
-
50
- const props = withDefaults(defineProps<ToastProps>(), {
51
- orientation: 'vertical',
52
- close: true,
53
- })
54
-
55
- const emit = defineEmits<ToastEmits>()
56
- const slots = defineSlots<ToastSlots>()
57
-
58
- const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'defaultOpen', 'open', 'duration', 'type'), emit)
59
-
60
- const el = ref<InstanceType<typeof ToastRoot>>()
61
- const { height } = useElementBounding(() => el.value?.$el.getBoundingClientRect ? el.value.$el : undefined)
62
-
63
- const { t } = useLocale()
64
- const { theme, generateStyle } = useTheme()
65
- const style = computed(() => generateStyle('toast', {
66
- ...props,
67
- title: !!(props.title || slots.title),
68
- }))
69
-
5
+ <script setup>
6
+ import { reactivePick } from "@vueuse/core";
7
+ import { ToastAction, ToastClose, ToastDescription, ToastRoot, ToastTitle, useForwardPropsEmits } from "reka-ui";
8
+ import { computed, nextTick, onMounted, shallowRef } from "vue";
9
+ import { useAppConfig } from "#imports";
10
+ import { useLocale } from "../composables/useLocale";
11
+ import { cv, merge } from "../utils/style";
12
+ import Avatar from "./Avatar.vue";
13
+ import Button from "./Button.vue";
14
+ import Icon from "./Icon.vue";
15
+ import Progress from "./Progress.vue";
16
+ const props = defineProps({
17
+ as: { type: null, required: false },
18
+ title: { type: [String, Object, Function], required: false },
19
+ description: { type: [String, Object, Function], required: false },
20
+ icon: { type: [String, Object], required: false },
21
+ avatar: { type: Object, required: false },
22
+ color: { type: null, required: false },
23
+ orientation: { type: null, required: false, default: "vertical" },
24
+ actions: { type: Array, required: false },
25
+ close: { type: [Boolean, Object], required: false, default: true },
26
+ closeIcon: { type: [String, Object], required: false },
27
+ progress: { type: [Boolean, Object], required: false, default: true },
28
+ ui: { type: null, required: false },
29
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
30
+ defaultOpen: { type: Boolean, required: false },
31
+ open: { type: Boolean, required: false },
32
+ type: { type: String, required: false },
33
+ duration: { type: Number, required: false }
34
+ });
35
+ const emit = defineEmits(["escapeKeyDown", "pause", "resume", "swipeStart", "swipeMove", "swipeCancel", "swipeEnd", "update:open"]);
36
+ const slots = defineSlots();
37
+ const rootProps = useForwardPropsEmits(reactivePick(props, "as", "defaultOpen", "open", "duration", "type"), emit);
38
+ const { t } = useLocale();
39
+ const appConfig = useAppConfig();
40
+ const ui = computed(() => {
41
+ const styler = cv(merge(theme, appConfig.ui.toast));
42
+ return styler({
43
+ ...props,
44
+ title: !!props.title || !!slots.title
45
+ });
46
+ });
47
+ const el = shallowRef();
48
+ const height = shallowRef(0);
49
+ onMounted(() => {
50
+ if (!el.value)
51
+ return;
52
+ nextTick(() => {
53
+ height.value = el.value?.$el?.getBoundingClientRect()?.height;
54
+ });
55
+ });
70
56
  defineExpose({
71
- height,
72
- })
57
+ height
58
+ });
73
59
  </script>
74
60
 
75
61
  <template>
76
62
  <ToastRoot
77
63
  ref="el"
78
- v-slot="{ remaining, duration }"
64
+ v-slot="{ remaining, duration, open }"
79
65
  v-bind="rootProps"
80
- :class="style.root({ class: [props.class, props.ui?.root] })"
66
+ :class="ui.root({ class: [props.ui?.root, props.class] })"
67
+ :data-orientation="props.orientation"
68
+ data-part="root"
81
69
  :style="{ '--height': height }"
82
70
  >
83
- <slot name="icon">
84
- <span v-if="props.icon" :class="style.icon({ class: [props.icon, props.ui?.icon] })"></span>
71
+ <slot name="leading" :ui="ui">
72
+ <Avatar
73
+ v-if="props.avatar"
74
+ :size="props.ui?.avatarSize || ui.avatarSize()"
75
+ v-bind="props.avatar"
76
+ :class="ui.avatar({ class: props.ui?.avatar })"
77
+ data-part="avatar"
78
+ />
79
+ <Icon
80
+ v-else-if="props.icon"
81
+ :name="props.icon"
82
+ :class="ui.icon({ class: props.ui?.icon })"
83
+ data-part="icon"
84
+ />
85
85
  </slot>
86
86
 
87
- <div :class="style.wrapper({ class: props.ui?.wrapper })">
88
- <ToastTitle v-if="props.title || !!slots.title" :class="style.title({ class: props.ui?.title })">
87
+ <div :class="ui.wrapper({ class: props.ui?.wrapper })" data-part="wrapper">
88
+ <ToastTitle v-if="props.title || !!slots.title" :class="ui.title({ class: props.ui?.title })" data-part="title">
89
89
  <slot name="title">
90
- {{ props.title }}
90
+ <component :is="props.title()" v-if="typeof props.title === 'function'" />
91
+ <component :is="props.title" v-else-if="typeof props.title === 'object'" />
92
+ <template v-else>
93
+ {{ props.title }}
94
+ </template>
91
95
  </slot>
92
96
  </ToastTitle>
93
- <ToastDescription v-if="props.description || !!slots.description" :class="style.description({ class: props.ui?.description })">
97
+ <ToastDescription v-if="props.description || !!slots.description" :class="ui.description({ class: props.ui?.description })" data-part="description">
94
98
  <slot name="description">
95
- {{ props.description }}
99
+ <component :is="props.description()" v-if="typeof props.description === 'function'" />
100
+ <component :is="props.description" v-else-if="typeof props.description === 'object'" />
101
+ <template v-else>
102
+ {{ props.description }}
103
+ </template>
96
104
  </slot>
97
105
  </ToastDescription>
98
106
 
99
- <div v-if="props.orientation === 'vertical' && actions?.length" :class="style.actions({ class: props.ui?.actions })">
107
+ <div v-if="props.orientation === 'vertical' && (props.actions?.length || slots.actions)" :class="ui.actions({ class: props.ui?.actions })" data-part="actions">
100
108
  <slot name="actions">
101
109
  <ToastAction v-for="(action, index) in props.actions" :key="index" :alt-text="action.label || 'Action'" as-child @click.stop>
102
- <Button size="xs" v-bind="action" />
110
+ <Button size="xs" :color="props.color" v-bind="action" />
103
111
  </ToastAction>
104
112
  </slot>
105
113
  </div>
106
114
  </div>
107
115
 
108
116
  <div
109
- v-if="(props.orientation === 'horizontal' && actions?.length) || props.close || slots.close"
110
- :class="style.actions({ class: props.ui?.actions })"
117
+ v-if="props.orientation === 'horizontal' && (props.actions?.length || !!slots.actions) || props.close"
118
+ :class="ui.actions({ class: props.ui?.actions })"
119
+ data-part="actions"
111
120
  >
112
121
  <template v-if="props.orientation === 'horizontal'">
113
122
  <slot name="actions">
114
123
  <ToastAction v-for="(action, index) in props.actions" :key="index" :alt-text="action.label || 'Action'" as-child @click.stop>
115
- <Button size="xs" v-bind="action" />
124
+ <Button size="xs" :color="props.color" v-bind="action" />
116
125
  </ToastAction>
117
126
  </slot>
118
127
  </template>
119
128
 
120
- <ToastClose v-if="props.close || slots.close" as-child>
121
- <slot name="close" :ui="props.ui">
129
+ <ToastClose v-if="props.close || !!slots.close" as-child>
130
+ <slot name="close" :ui="ui">
122
131
  <Button
123
- :icon="props.closeIcon || theme.app.icons.close"
124
- size="sm"
132
+ v-if="props.close"
133
+ :icon="props.closeIcon || appConfig.ui.icons.close"
134
+ color="neutral"
125
135
  variant="link"
126
136
  :aria-label="t('toast.close')"
127
- v-bind="typeof close === 'object' ? close : undefined"
128
- :class="style.close({ class: props.ui?.close })"
137
+ v-bind="typeof props.close === 'object' ? props.close : {}"
138
+ :class="ui.close({ class: props.ui?.close })"
139
+ data-part="close"
129
140
  @click.stop
130
141
  />
131
142
  </slot>
132
143
  </ToastClose>
133
144
  </div>
134
145
 
135
- <div v-if="remaining >= 0 && duration" :class="style.progress({ class: props.ui?.progress })" :style="{ width: `${remaining / duration * 100}%` }"></div>
146
+ <Progress
147
+ v-if="props.progress && open && remaining >= 0 && duration"
148
+ :model-value="remaining / duration * 100"
149
+ :color="props.color"
150
+ v-bind="typeof props.progress === 'object' ? props.progress : {}"
151
+ size="sm"
152
+ :class="ui.progress({ class: props.ui?.progress })"
153
+ />
136
154
  </ToastRoot>
137
155
  </template>