@byyuurin/ui 0.0.11 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/README.md +170 -58
  2. package/dist/module.d.mts +4 -13
  3. package/dist/module.json +4 -4
  4. package/dist/module.mjs +54 -20
  5. package/dist/runtime/components/Accordion.vue +28 -23
  6. package/dist/runtime/components/Accordion.vue.d.ts +51 -29
  7. package/dist/runtime/components/Alert.vue +47 -27
  8. package/dist/runtime/components/Alert.vue.d.ts +37 -25
  9. package/dist/runtime/components/App.vue +9 -8
  10. package/dist/runtime/components/App.vue.d.ts +22 -20
  11. package/dist/runtime/components/Avatar.vue +65 -21
  12. package/dist/runtime/components/Avatar.vue.d.ts +27 -13
  13. package/dist/runtime/components/AvatarGroup.vue +14 -10
  14. package/dist/runtime/components/AvatarGroup.vue.d.ts +12 -9
  15. package/dist/runtime/components/Badge.vue +64 -32
  16. package/dist/runtime/components/Badge.vue.d.ts +30 -29
  17. package/dist/runtime/components/Breadcrumb.vue +40 -22
  18. package/dist/runtime/components/Breadcrumb.vue.d.ts +48 -21
  19. package/dist/runtime/components/Button.vue +113 -52
  20. package/dist/runtime/components/Button.vue.d.ts +36 -20
  21. package/dist/runtime/components/Calendar.vue +50 -43
  22. package/dist/runtime/components/Calendar.vue.d.ts +58 -31
  23. package/dist/runtime/components/Card.vue +18 -14
  24. package/dist/runtime/components/Card.vue.d.ts +18 -14
  25. package/dist/runtime/components/Carousel.vue +99 -46
  26. package/dist/runtime/components/Carousel.vue.d.ts +46 -25
  27. package/dist/runtime/components/Checkbox.vue +60 -35
  28. package/dist/runtime/components/Checkbox.vue.d.ts +35 -28
  29. package/dist/runtime/components/CheckboxGroup.vue +131 -0
  30. package/dist/runtime/components/CheckboxGroup.vue.d.ts +89 -0
  31. package/dist/runtime/components/Chip.vue +35 -32
  32. package/dist/runtime/components/Chip.vue.d.ts +33 -15
  33. package/dist/runtime/components/Collapsible.vue +13 -9
  34. package/dist/runtime/components/Collapsible.vue.d.ts +16 -8
  35. package/dist/runtime/components/Drawer.vue +80 -70
  36. package/dist/runtime/components/Drawer.vue.d.ts +51 -28
  37. package/dist/runtime/components/DropdownMenu.vue +23 -16
  38. package/dist/runtime/components/DropdownMenu.vue.d.ts +77 -36
  39. package/dist/runtime/components/DropdownMenuContent.vue +136 -106
  40. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +38 -26
  41. package/dist/runtime/components/FieldGroup.vue +33 -0
  42. package/dist/runtime/components/FieldGroup.vue.d.ts +33 -0
  43. package/dist/runtime/components/Form.vue +172 -88
  44. package/dist/runtime/components/Form.vue.d.ts +69 -44
  45. package/dist/runtime/components/FormField.vue +108 -0
  46. package/dist/runtime/components/FormField.vue.d.ts +63 -0
  47. package/dist/runtime/components/Icon.vue +20 -0
  48. package/dist/runtime/components/Icon.vue.d.ts +9 -0
  49. package/dist/runtime/components/Input.vue +84 -79
  50. package/dist/runtime/components/Input.vue.d.ts +55 -43
  51. package/dist/runtime/components/InputNumber.vue +66 -52
  52. package/dist/runtime/components/InputNumber.vue.d.ts +50 -109
  53. package/dist/runtime/components/InputTags.vue +155 -0
  54. package/dist/runtime/components/InputTags.vue.d.ts +85 -0
  55. package/dist/runtime/components/Kbd.vue +11 -5
  56. package/dist/runtime/components/Kbd.vue.d.ts +17 -11
  57. package/dist/runtime/components/Link.vue +54 -197
  58. package/dist/runtime/components/Link.vue.d.ts +17 -17
  59. package/dist/runtime/components/LinkBase.vue +11 -33
  60. package/dist/runtime/components/LinkBase.vue.d.ts +8 -3
  61. package/dist/runtime/components/Marquee.vue +38 -0
  62. package/dist/runtime/components/Marquee.vue.d.ts +54 -0
  63. package/dist/runtime/components/Modal.vue +53 -39
  64. package/dist/runtime/components/Modal.vue.d.ts +64 -34
  65. package/dist/runtime/components/NavigationMenu.vue +345 -0
  66. package/dist/runtime/components/NavigationMenu.vue.d.ts +216 -0
  67. package/dist/runtime/components/OverlayProvider.vue +3 -3
  68. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -1
  69. package/dist/runtime/components/Pagination.vue +39 -47
  70. package/dist/runtime/components/Pagination.vue.d.ts +54 -31
  71. package/dist/runtime/components/PinInput.vue +46 -32
  72. package/dist/runtime/components/PinInput.vue.d.ts +40 -21
  73. package/dist/runtime/components/Popover.vue +33 -19
  74. package/dist/runtime/components/Popover.vue.d.ts +57 -32
  75. package/dist/runtime/components/Progress.vue +31 -26
  76. package/dist/runtime/components/Progress.vue.d.ts +32 -23
  77. package/dist/runtime/components/RadioGroup.vue +75 -48
  78. package/dist/runtime/components/RadioGroup.vue.d.ts +58 -36
  79. package/dist/runtime/components/ScrollArea.vue +33 -31
  80. package/dist/runtime/components/ScrollArea.vue.d.ts +9 -5
  81. package/dist/runtime/components/Select.vue +166 -76
  82. package/dist/runtime/components/Select.vue.d.ts +206 -65
  83. package/dist/runtime/components/Separator.vue +42 -16
  84. package/dist/runtime/components/Separator.vue.d.ts +35 -14
  85. package/dist/runtime/components/Skeleton.vue +18 -6
  86. package/dist/runtime/components/Skeleton.vue.d.ts +4 -4
  87. package/dist/runtime/components/Slider.vue +42 -24
  88. package/dist/runtime/components/Slider.vue.d.ts +43 -27
  89. package/dist/runtime/components/Switch.vue +40 -31
  90. package/dist/runtime/components/Switch.vue.d.ts +36 -27
  91. package/dist/runtime/components/Table.vue +329 -79
  92. package/dist/runtime/components/Table.vue.d.ts +152 -66
  93. package/dist/runtime/components/Tabs.vue +70 -23
  94. package/dist/runtime/components/Tabs.vue.d.ts +61 -29
  95. package/dist/runtime/components/Textarea.vue +102 -54
  96. package/dist/runtime/components/Textarea.vue.d.ts +57 -41
  97. package/dist/runtime/components/Timeline.vue +102 -0
  98. package/dist/runtime/components/Timeline.vue.d.ts +74 -0
  99. package/dist/runtime/components/Toast.vue +84 -38
  100. package/dist/runtime/components/Toast.vue.d.ts +48 -27
  101. package/dist/runtime/components/ToastProvider.vue +31 -22
  102. package/dist/runtime/components/ToastProvider.vue.d.ts +30 -17
  103. package/dist/runtime/components/Tooltip.vue +33 -21
  104. package/dist/runtime/components/Tooltip.vue.d.ts +37 -15
  105. package/dist/runtime/composables/defineShortcuts.d.ts +16 -0
  106. package/dist/runtime/composables/defineShortcuts.js +129 -0
  107. package/dist/runtime/composables/useAvatarGroup.d.ts +8 -3
  108. package/dist/runtime/composables/useAvatarGroup.js +10 -3
  109. package/dist/runtime/composables/useComponentIcons.d.ts +9 -6
  110. package/dist/runtime/composables/useComponentIcons.js +4 -4
  111. package/dist/runtime/composables/useFieldGroup.d.ts +8 -0
  112. package/dist/runtime/composables/useFieldGroup.js +14 -0
  113. package/dist/runtime/composables/useFormField.d.ts +62 -0
  114. package/dist/runtime/composables/useFormField.js +99 -0
  115. package/dist/runtime/composables/useKbd.d.ts +3 -2
  116. package/dist/runtime/composables/useKbd.js +3 -2
  117. package/dist/runtime/composables/useLocale.d.ts +68 -5
  118. package/dist/runtime/composables/useLocale.js +11 -11
  119. package/dist/runtime/composables/useOverlay.d.ts +51 -15
  120. package/dist/runtime/composables/useOverlay.js +44 -30
  121. package/dist/runtime/composables/usePortal.d.ts +6 -0
  122. package/dist/runtime/composables/usePortal.js +17 -0
  123. package/dist/runtime/composables/useToast.d.ts +12 -5
  124. package/dist/runtime/composables/useToast.js +12 -7
  125. package/dist/runtime/locale/en.d.ts +30 -1
  126. package/dist/runtime/locale/en.js +2 -1
  127. package/dist/runtime/locale/index.d.ts +2 -2
  128. package/dist/runtime/locale/index.js +1 -1
  129. package/dist/runtime/locale/zh_tw.d.ts +31 -0
  130. package/dist/runtime/locale/{zh-tw.js → zh_tw.js} +2 -1
  131. package/dist/runtime/plugins/colors.d.ts +2 -0
  132. package/dist/runtime/plugins/colors.js +50 -0
  133. package/dist/runtime/types/app.config.d.ts +6 -0
  134. package/dist/runtime/types/form.d.ts +58 -17
  135. package/dist/runtime/types/form.js +11 -0
  136. package/dist/runtime/types/index.d.ts +56 -8
  137. package/dist/runtime/types/index.js +49 -1
  138. package/dist/runtime/types/input.d.ts +8 -0
  139. package/dist/runtime/types/locale.d.ts +5 -0
  140. package/dist/runtime/types/style.d.ts +33 -0
  141. package/dist/runtime/types/style.js +0 -0
  142. package/dist/runtime/types/unocss.d.ts +4 -0
  143. package/dist/runtime/types/utils.d.ts +41 -37
  144. package/dist/runtime/utils/form.d.ts +5 -1
  145. package/dist/runtime/utils/form.js +49 -0
  146. package/dist/runtime/utils/index.d.ts +10 -13
  147. package/dist/runtime/utils/index.js +41 -48
  148. package/dist/runtime/utils/link.d.ts +3 -2
  149. package/dist/runtime/utils/link.js +16 -2
  150. package/dist/runtime/utils/locale.d.ts +5 -0
  151. package/dist/runtime/utils/locale.js +10 -0
  152. package/dist/runtime/utils/style.d.ts +94 -0
  153. package/dist/runtime/utils/style.js +37 -0
  154. package/dist/runtime/vue/components/Icon.vue +15 -0
  155. package/dist/runtime/vue/components/Icon.vue.d.ts +7 -0
  156. package/dist/runtime/vue/components/Link.vue +163 -0
  157. package/dist/runtime/vue/components/Link.vue.d.ts +95 -0
  158. package/dist/runtime/vue/composables/useAppConfig.d.ts +1 -0
  159. package/dist/runtime/vue/composables/useAppConfig.js +4 -0
  160. package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
  161. package/dist/runtime/vue/plugins/color-mode.js +6 -0
  162. package/dist/runtime/vue/plugins/head.d.ts +4 -0
  163. package/dist/runtime/vue/plugins/head.js +9 -0
  164. package/dist/runtime/vue/stubs.d.ts +16 -1
  165. package/dist/runtime/vue/stubs.js +32 -1
  166. package/dist/setup.d.mts +13 -0
  167. package/dist/setup.mjs +12 -0
  168. package/dist/shared/ui.CzIlLITK.mjs +51 -0
  169. package/dist/shared/ui.DLOxhmP0.mjs +4242 -0
  170. package/dist/shared/ui.DpbffTXs.d.mts +84 -0
  171. package/dist/shared/ui.IulR-OYx.d.mts +64 -0
  172. package/dist/types.d.mts +3 -1
  173. package/dist/unocss.d.mts +12 -52
  174. package/dist/unocss.mjs +144 -254
  175. package/dist/unplugin.d.mts +13 -26
  176. package/dist/unplugin.mjs +193 -18
  177. package/dist/vite.d.mts +10 -1
  178. package/dist/vite.mjs +12 -3
  179. package/package.json +154 -87
  180. package/vue-plugin.d.ts +5 -0
  181. package/dist/module.d.ts +0 -13
  182. package/dist/module.mjs.map +0 -1
  183. package/dist/runtime/app/injections.d.ts +0 -9331
  184. package/dist/runtime/app/injections.js +0 -61
  185. package/dist/runtime/components/ButtonGroup.vue +0 -26
  186. package/dist/runtime/components/ButtonGroup.vue.d.ts +0 -26
  187. package/dist/runtime/components/FormItem.vue +0 -90
  188. package/dist/runtime/components/FormItem.vue.d.ts +0 -60
  189. package/dist/runtime/composables/useButtonGroup.d.ts +0 -5
  190. package/dist/runtime/composables/useButtonGroup.js +0 -9
  191. package/dist/runtime/composables/useFormItem.d.ts +0 -27
  192. package/dist/runtime/composables/useFormItem.js +0 -64
  193. package/dist/runtime/composables/useTheme.d.ts +0 -9
  194. package/dist/runtime/composables/useTheme.js +0 -23
  195. package/dist/runtime/index.d.ts +0 -44
  196. package/dist/runtime/index.js +0 -44
  197. package/dist/runtime/locale/zh-tw.d.ts +0 -2
  198. package/dist/runtime/theme/accordion.d.ts +0 -50
  199. package/dist/runtime/theme/accordion.js +0 -28
  200. package/dist/runtime/theme/alert.d.ts +0 -119
  201. package/dist/runtime/theme/alert.js +0 -47
  202. package/dist/runtime/theme/app.d.ts +0 -19
  203. package/dist/runtime/theme/app.js +0 -19
  204. package/dist/runtime/theme/avatar-group.d.ts +0 -46
  205. package/dist/runtime/theme/avatar-group.js +0 -32
  206. package/dist/runtime/theme/avatar.d.ts +0 -50
  207. package/dist/runtime/theme/avatar.js +0 -34
  208. package/dist/runtime/theme/badge.d.ts +0 -76
  209. package/dist/runtime/theme/badge.js +0 -92
  210. package/dist/runtime/theme/breadcrumb.d.ts +0 -61
  211. package/dist/runtime/theme/breadcrumb.js +0 -44
  212. package/dist/runtime/theme/button-group.d.ts +0 -60
  213. package/dist/runtime/theme/button-group.js +0 -42
  214. package/dist/runtime/theme/button.d.ts +0 -184
  215. package/dist/runtime/theme/button.js +0 -164
  216. package/dist/runtime/theme/calendar.d.ts +0 -58
  217. package/dist/runtime/theme/calendar.js +0 -86
  218. package/dist/runtime/theme/card.d.ts +0 -56
  219. package/dist/runtime/theme/card.js +0 -37
  220. package/dist/runtime/theme/carousel.d.ts +0 -107
  221. package/dist/runtime/theme/carousel.js +0 -43
  222. package/dist/runtime/theme/checkbox.d.ts +0 -82
  223. package/dist/runtime/theme/checkbox.js +0 -54
  224. package/dist/runtime/theme/chip.d.ts +0 -61
  225. package/dist/runtime/theme/chip.js +0 -66
  226. package/dist/runtime/theme/collapsible.d.ts +0 -32
  227. package/dist/runtime/theme/collapsible.js +0 -10
  228. package/dist/runtime/theme/drawer.d.ts +0 -142
  229. package/dist/runtime/theme/drawer.js +0 -113
  230. package/dist/runtime/theme/dropdown-menu.d.ts +0 -65
  231. package/dist/runtime/theme/dropdown-menu.js +0 -83
  232. package/dist/runtime/theme/form-item.d.ts +0 -70
  233. package/dist/runtime/theme/form-item.js +0 -34
  234. package/dist/runtime/theme/form.d.ts +0 -2
  235. package/dist/runtime/theme/form.js +0 -7
  236. package/dist/runtime/theme/index.d.ts +0 -41
  237. package/dist/runtime/theme/index.js +0 -41
  238. package/dist/runtime/theme/input-number.d.ts +0 -115
  239. package/dist/runtime/theme/input-number.js +0 -95
  240. package/dist/runtime/theme/input.d.ts +0 -172
  241. package/dist/runtime/theme/input.js +0 -151
  242. package/dist/runtime/theme/kbd.d.ts +0 -33
  243. package/dist/runtime/theme/kbd.js +0 -26
  244. package/dist/runtime/theme/link.d.ts +0 -38
  245. package/dist/runtime/theme/link.js +0 -26
  246. package/dist/runtime/theme/modal.d.ts +0 -42
  247. package/dist/runtime/theme/modal.js +0 -55
  248. package/dist/runtime/theme/pagination.d.ts +0 -74
  249. package/dist/runtime/theme/pagination.js +0 -17
  250. package/dist/runtime/theme/pinInput.d.ts +0 -94
  251. package/dist/runtime/theme/pinInput.js +0 -111
  252. package/dist/runtime/theme/popover.d.ts +0 -32
  253. package/dist/runtime/theme/popover.js +0 -13
  254. package/dist/runtime/theme/progress.d.ts +0 -180
  255. package/dist/runtime/theme/progress.js +0 -95
  256. package/dist/runtime/theme/radio-group.d.ts +0 -104
  257. package/dist/runtime/theme/radio-group.js +0 -61
  258. package/dist/runtime/theme/scroll-area.d.ts +0 -67
  259. package/dist/runtime/theme/scroll-area.js +0 -33
  260. package/dist/runtime/theme/select.d.ts +0 -186
  261. package/dist/runtime/theme/select.js +0 -173
  262. package/dist/runtime/theme/separator.d.ts +0 -74
  263. package/dist/runtime/theme/separator.js +0 -53
  264. package/dist/runtime/theme/skeleton.d.ts +0 -2
  265. package/dist/runtime/theme/skeleton.js +0 -7
  266. package/dist/runtime/theme/slider.d.ts +0 -70
  267. package/dist/runtime/theme/slider.js +0 -52
  268. package/dist/runtime/theme/switch.d.ts +0 -116
  269. package/dist/runtime/theme/switch.js +0 -78
  270. package/dist/runtime/theme/table.d.ts +0 -86
  271. package/dist/runtime/theme/table.js +0 -36
  272. package/dist/runtime/theme/tabs.d.ts +0 -129
  273. package/dist/runtime/theme/tabs.js +0 -146
  274. package/dist/runtime/theme/textarea.d.ts +0 -90
  275. package/dist/runtime/theme/textarea.js +0 -116
  276. package/dist/runtime/theme/toast-provider.d.ts +0 -116
  277. package/dist/runtime/theme/toast-provider.js +0 -97
  278. package/dist/runtime/theme/toast.d.ts +0 -83
  279. package/dist/runtime/theme/toast.js +0 -35
  280. package/dist/runtime/theme/tooltip.d.ts +0 -38
  281. package/dist/runtime/theme/tooltip.js +0 -11
  282. package/dist/runtime/types/components.d.ts +0 -42
  283. package/dist/runtime/utils/extend-theme.d.ts +0 -9
  284. package/dist/runtime/utils/extend-theme.js +0 -27
  285. package/dist/runtime/utils/styler.d.ts +0 -4
  286. package/dist/runtime/utils/styler.js +0 -10
  287. package/dist/runtime/utils/translator.d.ts +0 -18
  288. package/dist/runtime/utils/translator.js +0 -8
  289. package/dist/shared/ui.D1BTWZFB.mjs +0 -5
  290. package/dist/shared/ui.D1BTWZFB.mjs.map +0 -1
  291. package/dist/unocss.d.ts +0 -52
  292. package/dist/unocss.mjs.map +0 -1
  293. package/dist/unplugin.d.ts +0 -26
  294. package/dist/unplugin.mjs.map +0 -1
  295. package/dist/vite.d.ts +0 -9
  296. package/dist/vite.mjs.map +0 -1
  297. /package/dist/runtime/types/{components.js → input.js} +0 -0
@@ -1,77 +1,104 @@
1
1
  <script>
2
-
2
+ import theme from "#build/ui/textarea";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
+ import { useVModel } from "@vueuse/core";
6
7
  import { Primitive } from "reka-ui";
7
- import { computed, nextTick, onMounted, useTemplateRef, watch } from "vue";
8
- import { useFormItem } from "../composables/useFormItem";
9
- import { useTheme } from "../composables/useTheme";
10
- defineOptions({
11
- inheritAttrs: false
12
- });
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 });
13
17
  const props = defineProps({
14
18
  as: { type: null, required: false },
15
19
  id: { type: String, required: false },
16
20
  name: { type: String, required: false },
17
21
  placeholder: { type: String, required: false },
18
22
  size: { type: null, required: false },
19
- variant: { type: null, required: false, default: "outline" },
23
+ color: { type: null, required: false },
24
+ variant: { type: null, required: false },
20
25
  highlight: { type: Boolean, required: false },
21
- underline: { type: Boolean, required: false },
22
26
  required: { type: Boolean, required: false },
23
27
  autofocus: { type: Boolean, required: false },
24
28
  autofocusDelay: { type: Number, required: false, default: 0 },
25
29
  disabled: { type: Boolean, required: false },
26
30
  rows: { type: Number, required: false, default: 3 },
27
31
  maxRows: { type: Number, required: false, default: 0 },
28
- autoResize: { type: Boolean, required: false },
29
- class: { type: null, required: false },
30
- ui: { type: null, required: false }
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 }
31
47
  });
32
48
  const emit = defineEmits(["update:modelValue", "blur", "change"]);
33
- defineSlots();
34
- const [modelValue, modelModifiers] = defineModel({ type: [String, Number] });
35
- const textareaRef = useTemplateRef("textareaRef");
36
- const { id, name, size, highlight, disabled, ariaAttrs, emitFormInput, emitFormChange, emitFormBlur, emitFormFocus } = useFormItem(props);
37
- const { generateStyle } = useTheme();
38
- const style = computed(() => generateStyle("textarea", {
39
- ...props,
40
- size: size.value,
41
- highlight: highlight.value
42
- }));
43
- function autoFocus() {
44
- if (props.autofocus)
45
- textareaRef.value?.focus();
46
- }
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);
47
66
  function updateInput(value) {
48
- if (modelModifiers.trim)
49
- value = value.trim();
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;
50
75
  modelValue.value = value;
51
76
  emitFormInput();
52
77
  }
53
78
  function onInput(event) {
54
79
  autoResize();
55
- if (!modelModifiers.lazy)
80
+ if (!props.modelModifiers?.lazy)
56
81
  updateInput(event.target.value);
57
82
  }
58
83
  function onChange(event) {
59
84
  const value = event.target.value;
60
- if (modelModifiers.lazy)
85
+ if (props.modelModifiers?.lazy)
61
86
  updateInput(value);
62
- if (modelModifiers.trim)
87
+ if (props.modelModifiers?.trim)
63
88
  event.target.value = value.trim();
64
- emit("change", event);
65
89
  emitFormChange();
90
+ emit("change", event);
66
91
  }
67
92
  function onBlur(event) {
68
- emit("blur", event);
69
93
  emitFormBlur();
94
+ emit("blur", event);
95
+ }
96
+ function autoFocus() {
97
+ if (props.autofocus)
98
+ textareaRef.value?.focus();
70
99
  }
71
100
  function autoResize() {
72
- if (!props.autoResize)
73
- return;
74
- if (!textareaRef.value)
101
+ if (!props.autoresize || !textareaRef.value)
75
102
  return;
76
103
  textareaRef.value.rows = props.rows;
77
104
  const overflow = textareaRef.value.style.overflow;
@@ -82,46 +109,67 @@ function autoResize() {
82
109
  const padding = paddingTop + paddingBottom;
83
110
  const lineHeight = Number.parseInt(styles.lineHeight);
84
111
  const { scrollHeight } = textareaRef.value;
85
- const newRows = Math.ceil((scrollHeight - padding) / lineHeight);
112
+ const newRows = (scrollHeight - padding) / lineHeight;
86
113
  if (newRows > props.rows)
87
114
  textareaRef.value.rows = props.maxRows ? Math.min(newRows, props.maxRows) : newRows;
88
115
  textareaRef.value.style.overflow = overflow;
89
116
  }
90
- watch(modelValue, () => {
91
- nextTick(autoResize);
117
+ watch(modelValue, () => nextTick(autoResize));
118
+ onMounted(() => {
119
+ setTimeout(() => autoFocus(), props.autofocusDelay);
120
+ setTimeout(() => autoResize(), props.autoresizeDelay);
92
121
  });
93
122
  defineExpose({
94
123
  textareaRef
95
124
  });
96
- onMounted(() => {
97
- setTimeout(() => {
98
- autoFocus();
99
- }, props.autofocusDelay);
100
- });
101
125
  </script>
102
126
 
103
127
  <template>
104
- <Primitive
105
- :as="props.as"
106
- :aria-disabled="disabled ? true : void 0"
107
- :class="style.root({ class: [props.class, props.ui?.root] })"
108
- :data-part="$attrs['data-part'] ?? 'root'"
109
- >
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="leadingIcon"
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="leadingAvatar"
143
+ />
144
+ </slot>
145
+ </span>
146
+
110
147
  <textarea
111
148
  ref="textareaRef"
112
- :class="style.base({ class: props.ui?.base })"
113
- data-part="base"
114
149
  :value="modelValue"
115
150
  :rows="props.rows"
116
151
  :placeholder="props.placeholder"
117
152
  :required="props.required"
118
- 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"
119
156
  @input="onInput"
120
157
  @blur="onBlur"
121
158
  @change="onChange"
122
159
  @focus="emitFormFocus"
123
160
  ></textarea>
124
161
 
125
- <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="trailingIcon"
171
+ />
172
+ </slot>
173
+ </span>
126
174
  </Primitive>
127
175
  </template>
@@ -1,17 +1,13 @@
1
1
  import type { VariantProps } from '@byyuurin/ui-kit';
2
2
  import type { PrimitiveProps } from 'reka-ui';
3
- import type { textarea } from '../theme/index.js';
4
- import type { ComponentAttrs } from '../types/index.js';
5
- export interface TextareaEmits {
6
- 'update:modelValue': [payload: string];
7
- 'blur': [event: FocusEvent];
8
- 'change': [event: Event];
9
- }
10
- export interface TextareaSlots {
11
- default?: (props?: {}) => any;
12
- }
13
- type TextareaVariants = VariantProps<typeof textarea>;
14
- export interface TextareaProps extends ComponentAttrs<typeof textarea> {
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 {
15
11
  /**
16
12
  * The element or component this component should render as.
17
13
  * @default "div"
@@ -19,42 +15,62 @@ export interface TextareaProps extends ComponentAttrs<typeof textarea> {
19
15
  as?: PrimitiveProps['as'];
20
16
  id?: string;
21
17
  name?: string;
18
+ /** The placeholder text when the textarea is empty. */
22
19
  placeholder?: string;
23
- size?: TextareaVariants['size'];
24
- variant?: TextareaVariants['variant'];
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. */
25
27
  highlight?: boolean;
26
- underline?: boolean;
27
28
  required?: boolean;
28
29
  autofocus?: boolean;
29
30
  autofocusDelay?: number;
30
31
  disabled?: boolean;
31
32
  rows?: number;
32
33
  maxRows?: number;
33
- autoResize?: boolean;
34
+ autoresize?: boolean;
35
+ autoresizeDelay?: number;
36
+ modelValue?: T;
37
+ defaultValue?: T;
38
+ modelModifiers?: ModelModifiers;
39
+ ui?: ComponentUIProps<typeof theme>;
34
40
  }
35
- declare const _default: __VLS_WithSlots<import("vue").DefineComponent<TextareaProps & {
36
- modelValue?: string | number;
37
- }, {
38
- textareaRef: Readonly<import("vue").ShallowRef<HTMLTextAreaElement | null>>;
39
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
40
- blur: (event: FocusEvent) => any;
41
- change: (event: Event) => any;
42
- "update:modelValue": (...args: unknown[]) => any;
43
- }, string, import("vue").PublicProps, Readonly<TextareaProps & {
44
- modelValue?: string | number;
45
- }> & Readonly<{
46
- onBlur?: ((event: FocusEvent) => any) | undefined;
47
- onChange?: ((event: Event) => any) | undefined;
48
- "onUpdate:modelValue"?: ((...args: unknown[]) => any) | undefined;
49
- }>, {
50
- variant: "outline" | "soft" | "soft-outline" | "ghost" | "none";
51
- autofocusDelay: number;
52
- rows: number;
53
- maxRows: number;
54
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, TextareaSlots>;
55
- export default _default;
56
- type __VLS_WithSlots<T, S> = T & {
57
- new (): {
58
- $slots: S;
59
- };
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>;
60
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
+ } & {};
@@ -0,0 +1,102 @@
1
+ <script>
2
+ import theme from "#build/ui/timeline";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { useVModel } from "@vueuse/core";
7
+ import { Primitive, Separator } from "reka-ui";
8
+ import { computed } from "vue";
9
+ import { useAppConfig } from "#imports";
10
+ import { cv, merge } from "../utils/style";
11
+ import Avatar from "./Avatar.vue";
12
+ const props = defineProps({
13
+ as: { type: null, required: false },
14
+ items: { type: Array, required: true },
15
+ size: { type: null, required: false },
16
+ color: { type: null, required: false },
17
+ orientation: { type: null, required: false, default: "vertical" },
18
+ defaultValue: { type: [String, Number], required: false },
19
+ modelValue: { type: [String, Number], required: false },
20
+ reverse: { type: Boolean, required: false },
21
+ ui: { type: null, required: false },
22
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true }
23
+ });
24
+ const emit = defineEmits(["update:model-value"]);
25
+ const slots = defineSlots();
26
+ const modelValue = useVModel(props, "modelValue", emit);
27
+ const currentStepIndex = computed(() => {
28
+ const value = modelValue.value ?? props.defaultValue;
29
+ if (typeof value === "string")
30
+ return props.items.findIndex((item) => item.value === value) ?? -1;
31
+ if (props.reverse)
32
+ return value == null ? -1 : props.items.length - 1 - value;
33
+ return value ?? -1;
34
+ });
35
+ function getItemState(index) {
36
+ if (currentStepIndex.value === -1)
37
+ return void 0;
38
+ if (index === currentStepIndex.value)
39
+ return "active";
40
+ if (props.reverse)
41
+ return index > currentStepIndex.value ? "completed" : void 0;
42
+ return index < currentStepIndex.value ? "completed" : void 0;
43
+ }
44
+ const appConfig = useAppConfig();
45
+ const ui = computed(() => {
46
+ const styler = cv(merge(theme, appConfig.ui.timeline));
47
+ return styler(props);
48
+ });
49
+ </script>
50
+
51
+ <template>
52
+ <Primitive :as="props.as" :data-orientation="props.orientation" :class="ui.root({ class: [props.ui?.root, props.class] })" data-part="root">
53
+ <div
54
+ v-for="(item, index) in props.items"
55
+ :key="item.value ?? index"
56
+ :class="ui.item({ class: [props.ui?.item, item.ui?.item, item.class] })"
57
+ data-part="item"
58
+ :data-state="getItemState(index)"
59
+ >
60
+ <div :class="ui.container({ class: [props.ui?.container, item.ui?.container] })" data-part="container">
61
+ <Avatar
62
+ :size="props.size"
63
+ :icon="item.icon"
64
+ v-bind="typeof item.avatar === 'object' ? item.avatar : {}"
65
+ :ui="{
66
+ icon: ui.indicatorIcon({ class: props.ui?.indicatorIcon }),
67
+ fallback: ui.indicatorFallback({ class: props.ui?.indicatorFallback })
68
+ }"
69
+ :class="ui.indicator({ class: [props.ui?.indicator, item.ui?.indicator] })"
70
+ data-part="indicator"
71
+ >
72
+ <slot :name="item.slot ? `${item.slot}-indicator` : 'indicator'" :item="item"></slot>
73
+ </Avatar>
74
+
75
+ <Separator
76
+ v-if="index < items.length - 1"
77
+ :orientation="props.orientation"
78
+ :class="ui.separator({ class: [props.ui?.separator, item.ui?.separator] })"
79
+ data-part="separator"
80
+ />
81
+ </div>
82
+
83
+ <div :class="ui.wrapper({ class: [props.ui?.wrapper, item.ui?.wrapper] })" data-part="wrapper">
84
+ <div v-if="item.date" :class="ui.date({ class: [props.ui?.date, item.ui?.date] })" data-part="date">
85
+ <slot :name="item.slot ? `${item.slot}-date` : 'date'" :item="item">
86
+ {{ item.date }}
87
+ </slot>
88
+ </div>
89
+ <div v-if="item.title || !!slots.title" :class="ui.title({ class: [props.ui?.title, item.ui?.title] })" data-part="title">
90
+ <slot :name="item.slot ? `${item.slot}-title` : 'title'" :item="item">
91
+ {{ item.title }}
92
+ </slot>
93
+ </div>
94
+ <div v-if="item.description || !!slots.description" :class="ui.description({ class: [props.ui?.description, item.ui?.description] })" data-part="description">
95
+ <slot :name="item.slot ? `${item.slot}-description` : 'description'" :item="item">
96
+ {{ item.description }}
97
+ </slot>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </Primitive>
102
+ </template>
@@ -0,0 +1,74 @@
1
+ import type { VariantProps } from '@byyuurin/ui-kit';
2
+ import type { PrimitiveProps } from 'reka-ui';
3
+ import theme from '#build/ui/timeline';
4
+ import type { AvatarProps, ComponentBaseProps, ComponentUIProps, IconProps } from '../types';
5
+ import type { DynamicSlots, StaticSlot } from '../types/utils';
6
+ export interface TimelineItem {
7
+ date?: string;
8
+ title?: string;
9
+ description?: string;
10
+ icon?: IconProps['name'];
11
+ avatar?: AvatarProps;
12
+ value?: string | number;
13
+ slot?: string;
14
+ class?: ComponentBaseProps['class'];
15
+ ui?: Pick<ComponentUIProps<typeof theme>, 'item' | 'container' | 'indicator' | 'separator' | 'wrapper' | 'date' | 'title' | 'description'>;
16
+ [key: string]: any;
17
+ }
18
+ type ThemeVariants = VariantProps<typeof theme>;
19
+ export interface TimelineProps<T extends TimelineItem = TimelineItem> extends ComponentBaseProps {
20
+ /**
21
+ * The element or component this component should render as.
22
+ * @default "div"
23
+ */
24
+ as?: PrimitiveProps['as'];
25
+ items: T[];
26
+ /** @default "md" */
27
+ size?: ThemeVariants['size'];
28
+ /** @default "primary" */
29
+ color?: ThemeVariants['color'];
30
+ /**
31
+ * The orientation of the Timeline.
32
+ * @default "vertical"
33
+ */
34
+ orientation?: ThemeVariants['orientation'];
35
+ defaultValue?: string | number;
36
+ modelValue?: string | number;
37
+ reverse?: boolean;
38
+ ui?: ComponentUIProps<typeof theme>;
39
+ }
40
+ export interface TimelineEmits {
41
+ 'update:model-value': [value: string | number];
42
+ }
43
+ export type TimelineSlots<T extends TimelineItem = TimelineItem> = {
44
+ indicator: StaticSlot<{
45
+ item: T;
46
+ }>;
47
+ date: StaticSlot<{
48
+ item: T;
49
+ }>;
50
+ title: StaticSlot<{
51
+ item: T;
52
+ }>;
53
+ description: StaticSlot<{
54
+ item: T;
55
+ }>;
56
+ } & DynamicSlots<T, 'indicator' | 'date' | 'title' | 'description', {
57
+ item: T;
58
+ }, false>;
59
+ declare const __VLS_export: <T extends TimelineItem>(__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<{
60
+ props: __VLS_PrettifyLocal<TimelineProps<T> & {
61
+ "onUpdate:model-value"?: ((value: string | number) => any) | undefined;
62
+ }> & import("vue").PublicProps;
63
+ expose: (exposed: {}) => void;
64
+ attrs: any;
65
+ slots: TimelineSlots<T>;
66
+ emit: (evt: "update:model-value", value: string | number) => void;
67
+ }>) => import("vue").VNode & {
68
+ __ctx?: Awaited<typeof __VLS_setup>;
69
+ };
70
+ declare const _default: typeof __VLS_export;
71
+ export default _default;
72
+ type __VLS_PrettifyLocal<T> = {
73
+ [K in keyof T as K]: T[K];
74
+ } & {};