@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
@@ -0,0 +1,108 @@
1
+ <script>
2
+ import theme from "#build/ui/form-field";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { Label, Primitive } from "reka-ui";
7
+ import { computed, ref, useId, watch } from "vue";
8
+ import { useAppConfig } from "#imports";
9
+ import { injectFormErrors, injectFormInputs, provideFormField, provideFormInputId } from "../composables/useFormField";
10
+ import { cv, merge } from "../utils/style";
11
+ const props = defineProps({
12
+ as: { type: null, required: false },
13
+ name: { type: String, required: false },
14
+ errorPattern: { type: null, required: false },
15
+ label: { type: String, required: false },
16
+ description: { type: String, required: false },
17
+ help: { type: String, required: false },
18
+ error: { type: [String, Boolean], required: false },
19
+ hint: { type: String, required: false },
20
+ size: { type: null, required: false },
21
+ required: { type: Boolean, required: false },
22
+ eagerValidation: { type: Boolean, required: false },
23
+ validateOnInputDelay: { type: Number, required: false },
24
+ ui: { type: null, required: false },
25
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true }
26
+ });
27
+ const slots = defineSlots();
28
+ const formErrors = injectFormErrors();
29
+ const error = computed(() => {
30
+ if (props.error)
31
+ return props.error;
32
+ const formError = formErrors?.value.find((error2) => {
33
+ if (error2.name && error2.name === props.name)
34
+ return true;
35
+ if (error2.name && props.errorPattern)
36
+ return error2.name.match(props.errorPattern);
37
+ return false;
38
+ });
39
+ return formError?.message;
40
+ });
41
+ const id = ref(useId());
42
+ const ariaId = id.value;
43
+ const formInputs = injectFormInputs();
44
+ watch(id, () => {
45
+ if (formInputs && props.name)
46
+ formInputs.value[props.name] = { id: id.value, pattern: props.errorPattern };
47
+ }, {
48
+ immediate: true
49
+ });
50
+ provideFormInputId(id);
51
+ provideFormField(computed(() => ({
52
+ name: props.name,
53
+ size: props.size,
54
+ eagerValidation: props.eagerValidation,
55
+ validateOnInputDelay: props.validateOnInputDelay,
56
+ errorPattern: props.errorPattern,
57
+ hint: props.hint,
58
+ description: props.description,
59
+ help: props.help,
60
+ ariaId,
61
+ error: error.value
62
+ })));
63
+ const appConfig = useAppConfig();
64
+ const ui = computed(() => {
65
+ const styler = cv(merge(theme, appConfig.ui.formField));
66
+ return styler(props);
67
+ });
68
+ </script>
69
+
70
+ <template>
71
+ <Primitive :as="props.as" :class="ui.root({ class: [props.ui?.root, props.class] })" data-part="root">
72
+ <div :class="ui.wrapper({ class: props.ui?.wrapper })" data-part="wrapper">
73
+ <div v-if="props.label || !!slots.label" :class="ui.labelWrapper({ class: props.ui?.labelWrapper })" data-part="label-wrapper">
74
+ <Label :for="id" :class="ui.label({ class: props.ui?.label })" data-part="label">
75
+ <slot name="label" :label="props.label">
76
+ {{ props.label }}
77
+ </slot>
78
+ </Label>
79
+ <span v-if="props.hint || !!slots.hint" :id="`${ariaId}-hint`" :class="ui.hint({ class: props.ui?.hint })" data-part="hint">
80
+ <slot name="hint" :hint="props.hint">
81
+ {{ props.hint }}
82
+ </slot>
83
+ </span>
84
+ </div>
85
+
86
+ <p v-if="props.description || !!slots.description" :id="`${ariaId}-description`" :class="ui.description({ class: props.ui?.description })" data-part="description">
87
+ <slot name="description" :description="props.description">
88
+ {{ props.description }}
89
+ </slot>
90
+ </p>
91
+ </div>
92
+
93
+ <div :class="(props.label || !!slots.label || props.description || !!slots.description) && ui.container({ class: props.ui?.container })" data-part="container">
94
+ <slot :error="error"></slot>
95
+
96
+ <div v-if="typeof error === 'string' && error || !!slots.error" :id="`${ariaId}-error`" :class="ui.error({ class: props.ui?.error })" data-part="error">
97
+ <slot name="error" :error="error">
98
+ {{ error }}
99
+ </slot>
100
+ </div>
101
+ <div v-else-if="props.help || !!slots.help" :class="ui.help({ class: props.ui?.help })" data-part="help">
102
+ <slot name="help" :help="props.help">
103
+ {{ props.help }}
104
+ </slot>
105
+ </div>
106
+ </div>
107
+ </Primitive>
108
+ </template>
@@ -0,0 +1,63 @@
1
+ import type { VariantProps } from '@byyuurin/ui-kit';
2
+ import type { PrimitiveProps } from 'reka-ui';
3
+ import theme from '#build/ui/form-field';
4
+ import type { ComponentBaseProps, ComponentUIProps } from '../types';
5
+ import type { StaticSlot } from '../types/utils';
6
+ type ThemeVariants = VariantProps<typeof theme>;
7
+ export interface FormFieldProps extends ComponentBaseProps {
8
+ /**
9
+ * The element or component this component should render as.
10
+ * @default "div"
11
+ */
12
+ as?: PrimitiveProps['as'];
13
+ /** The name of the FormField. Also used to match form errors. */
14
+ name?: string;
15
+ /** A regular expression to match form error names. */
16
+ errorPattern?: RegExp;
17
+ label?: string;
18
+ description?: string;
19
+ help?: string;
20
+ error?: string | boolean;
21
+ hint?: string;
22
+ /**
23
+ * @default "md"
24
+ */
25
+ size?: ThemeVariants['size'];
26
+ required?: boolean;
27
+ /** If true, validation on input will be active immediately instead of waiting for a blur event. */
28
+ eagerValidation?: boolean;
29
+ /**
30
+ * Delay in milliseconds before validating the form on input events.
31
+ * @default 300
32
+ */
33
+ validateOnInputDelay?: number;
34
+ ui?: ComponentUIProps<typeof theme>;
35
+ }
36
+ export interface FormFieldSlots {
37
+ label: StaticSlot<{
38
+ label?: string;
39
+ }>;
40
+ hint: StaticSlot<{
41
+ hint?: string;
42
+ }>;
43
+ description: StaticSlot<{
44
+ description?: string;
45
+ }>;
46
+ help: StaticSlot<{
47
+ help?: string;
48
+ }>;
49
+ error: StaticSlot<{
50
+ error?: boolean | string;
51
+ }>;
52
+ default: StaticSlot<{
53
+ error?: boolean | string;
54
+ }>;
55
+ }
56
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FormFieldProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FormFieldProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, FormFieldSlots>;
57
+ declare const _default: typeof __VLS_export;
58
+ export default _default;
59
+ type __VLS_WithSlots<T, S> = T & {
60
+ new (): {
61
+ $slots: S;
62
+ };
63
+ };
@@ -0,0 +1,20 @@
1
+ <script>
2
+
3
+ </script>
4
+
5
+ <script setup>
6
+ import { reactivePick } from "@vueuse/core";
7
+ import { useForwardProps } from "reka-ui";
8
+ const props = defineProps({
9
+ name: { type: [String, Object], required: true },
10
+ mode: { type: String, required: false },
11
+ size: { type: [String, Number], required: false },
12
+ customize: { type: Function, required: false }
13
+ });
14
+ const iconProps = useForwardProps(reactivePick(props, "name", "mode", "size", "customize"));
15
+ </script>
16
+
17
+ <template>
18
+ <Icon v-if="typeof props.name === 'string'" v-bind="iconProps" />
19
+ <component :is="props.name" v-else />
20
+ </template>
@@ -0,0 +1,9 @@
1
+ export interface IconProps {
2
+ name: string | object;
3
+ mode?: 'svg' | 'css';
4
+ size?: string | number;
5
+ customize?: (content: string, name?: string, prefix?: string, provider?: string) => string;
6
+ }
7
+ declare const __VLS_export: import("vue").DefineComponent<IconProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<IconProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
+ declare const _default: typeof __VLS_export;
9
+ export default _default;
@@ -1,188 +1,157 @@
1
- <script lang="ts">
2
- import type { VariantProps } from '@byyuurin/ui-kit'
3
- import type { PrimitiveProps } from 'reka-ui'
4
- import type { InputHTMLAttributes } from 'vue'
5
- import type { UseComponentIconsProps } from '../composables/useComponentIcons'
6
- import type { input } from '../theme'
7
- import type { ComponentAttrs } from '../types'
8
-
9
- export interface InputEmits {
10
- 'update:modelValue': [payload: string | number]
11
- 'blur': [event: FocusEvent]
12
- 'change': [event: Event]
13
- }
14
-
15
- export interface InputSlots {
16
- leading?: (props?: {}) => any
17
- default?: (props?: {}) => any
18
- trailing?: (props?: {}) => any
19
- }
20
-
21
- type InputVariants = VariantProps<typeof input>
22
-
23
- export interface InputProps extends ComponentAttrs<typeof input>, UseComponentIconsProps {
24
- /**
25
- * The element or component this component should render as.
26
- * @default "div"
27
- */
28
- as?: PrimitiveProps['as']
29
- id?: string
30
- name?: string
31
- type?: InputHTMLAttributes['type']
32
- placeholder?: string
33
- size?: InputVariants['size']
34
- variant?: InputVariants['variant']
35
- loading?: boolean
36
- highlight?: boolean
37
- underline?: boolean
38
- required?: boolean
39
- autocomplete?: InputHTMLAttributes['autocomplete']
40
- autofocus?: boolean
41
- autofocusDelay?: number
42
- disabled?: boolean
43
- }
1
+ <script>
2
+ import theme from "#build/ui/input";
44
3
  </script>
45
4
 
46
- <script setup lang="ts">
47
- import { Primitive } from 'reka-ui'
48
- import { computed, onMounted, ref } from 'vue'
49
- import { useButtonGroup } from '../composables/useButtonGroup'
50
- import { useComponentIcons } from '../composables/useComponentIcons'
51
- import { useFormItem } from '../composables/useFormItem'
52
- import { useTheme } from '../composables/useTheme'
53
- import { looseToNumber } from '../utils'
54
-
55
- defineOptions({
56
- inheritAttrs: false,
57
- })
58
-
59
- const props = withDefaults(defineProps<InputProps>(), {
60
- type: 'text',
61
- variant: 'outline',
62
- autocomplete: 'off',
63
- autofocusDelay: 0,
64
- })
65
-
66
- const emit = defineEmits<InputEmits>()
67
- const slots = defineSlots<InputSlots>()
68
- const [modelValue, modelModifiers] = defineModel<string | number>()
69
-
70
- const inputRef = ref<HTMLInputElement | null>(null)
71
-
72
- const {
73
- size: formItemSize,
74
- id,
75
- name,
76
- highlight,
77
- disabled,
78
- ariaAttrs,
79
- emitFormBlur,
80
- emitFormInput,
81
- emitFormChange,
82
- emitFormFocus,
83
- } = useFormItem<InputProps>(props, { deferInputValidation: true })
84
- const { size: buttonGroupSize, orientation } = useButtonGroup(props)
85
- const { isLeading, leadingIconName, isTrailing, trailingIconName } = useComponentIcons(props)
86
-
87
- const { generateStyle } = useTheme()
88
- const style = computed(() => generateStyle('input', {
89
- ...props,
90
- type: props.type as InputVariants['type'],
91
- size: buttonGroupSize.value || formItemSize.value,
92
- highlight: highlight.value,
93
- groupOrientation: orientation.value,
94
- leading: isLeading.value || !!slots.leading,
95
- trailing: isTrailing.value || !!slots.trailing,
96
- }))
97
-
98
- function autoFocus() {
99
- if (props.autofocus)
100
- inputRef.value?.focus()
5
+ <script setup>
6
+ import { useVModel } from "@vueuse/core";
7
+ import { Primitive } from "reka-ui";
8
+ import { computed, onMounted, ref } from "vue";
9
+ import { useAppConfig } from "#imports";
10
+ import { useComponentIcons } from "../composables/useComponentIcons";
11
+ import { useFieldGroup } from "../composables/useFieldGroup";
12
+ import { useFormField } from "../composables/useFormField";
13
+ import { looseToNumber } from "../utils";
14
+ import { cv, merge } from "../utils/style";
15
+ import Avatar from "./Avatar.vue";
16
+ import Icon from "./Icon.vue";
17
+ defineOptions({ inheritAttrs: false });
18
+ const props = defineProps({
19
+ as: { type: null, required: false },
20
+ id: { type: String, required: false },
21
+ name: { type: String, required: false },
22
+ type: { type: null, required: false, default: "text" },
23
+ placeholder: { type: String, required: false },
24
+ color: { type: null, required: false },
25
+ size: { type: null, required: false },
26
+ variant: { type: null, required: false },
27
+ loading: { type: Boolean, required: false },
28
+ highlight: { type: Boolean, required: false },
29
+ required: { type: Boolean, required: false },
30
+ autocomplete: { type: null, required: false, default: "off" },
31
+ autofocus: { type: Boolean, required: false },
32
+ autofocusDelay: { type: Number, required: false, default: 0 },
33
+ disabled: { type: Boolean, required: false },
34
+ defaultValue: { type: null, required: false },
35
+ modelValue: { 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
+ loadingIcon: { type: [String, Object], required: false }
46
+ });
47
+ const emit = defineEmits(["update:modelValue", "blur", "change"]);
48
+ const slots = defineSlots();
49
+ const modelValue = useVModel(props, "modelValue", emit, { defaultValue: props.defaultValue });
50
+ const { id, name, size: formFieldSize, color, highlight, disabled, ariaAttrs, emitFormBlur, emitFormInput, emitFormChange, emitFormFocus } = useFormField(props, { deferInputValidation: true });
51
+ const { size: fieldGroupSize, orientation } = useFieldGroup(props);
52
+ const { isLeading, leadingIconName, isTrailing, trailingIconName } = useComponentIcons(props);
53
+ const appConfig = useAppConfig();
54
+ const ui = computed(() => {
55
+ const styler = cv(merge(theme, appConfig.ui.input));
56
+ return styler({
57
+ ...props,
58
+ type: props.type,
59
+ color: color.value,
60
+ size: fieldGroupSize.value || formFieldSize.value,
61
+ highlight: highlight.value,
62
+ fieldGroup: orientation.value,
63
+ leading: isLeading.value || !!props.avatar || !!slots.leading,
64
+ trailing: isTrailing.value || !!slots.trailing
65
+ });
66
+ });
67
+ const inputRef = ref(null);
68
+ function updateInput(value) {
69
+ if (props.modelModifiers?.trim)
70
+ value = value?.trim() ?? null;
71
+ if (props.modelModifiers?.number)
72
+ value = looseToNumber(value);
73
+ if (props.modelModifiers?.nullable)
74
+ value ||= null;
75
+ if (props.modelModifiers?.optional)
76
+ value ||= void 0;
77
+ modelValue.value = value;
78
+ emitFormInput();
101
79
  }
102
-
103
- function updateInput(value: string) {
104
- if (modelModifiers.trim)
105
- value = value.trim()
106
-
107
- if (modelModifiers.number || props.type === 'number')
108
- value = looseToNumber(value)
109
-
110
- modelValue.value = value
111
- emitFormInput()
80
+ function onInput(event) {
81
+ if (!props.modelModifiers?.lazy)
82
+ updateInput(event.target.value);
112
83
  }
113
-
114
- function onInput(event: Event) {
115
- if (!modelModifiers.lazy)
116
- updateInput((event.target as HTMLInputElement).value)
84
+ function onChange(event) {
85
+ const value = event.target.value;
86
+ if (props.modelModifiers?.lazy)
87
+ updateInput(value);
88
+ if (props.modelModifiers?.trim)
89
+ event.target.value = value.trim();
90
+ emitFormChange();
91
+ emit("change", event);
117
92
  }
118
-
119
- function onChange(event: Event) {
120
- const value = (event.target as HTMLInputElement).value
121
-
122
- if (modelModifiers.lazy)
123
- updateInput(value)
124
-
125
- if (modelModifiers.trim)
126
- (event.target as HTMLInputElement).value = value.trim()
127
-
128
- emit('change', event)
129
- emitFormChange()
93
+ function onBlur(event) {
94
+ emitFormBlur();
95
+ emit("blur", event);
130
96
  }
131
-
132
- function onBlur(event: FocusEvent) {
133
- emit('blur', event)
134
- emitFormBlur()
97
+ function autoFocus() {
98
+ if (props.autofocus)
99
+ inputRef.value?.focus();
135
100
  }
136
-
137
- defineExpose({
138
- inputRef,
139
- })
140
-
141
101
  onMounted(() => {
142
- setTimeout(() => {
143
- autoFocus()
144
- }, props.autofocusDelay)
145
- })
102
+ setTimeout(() => autoFocus(), props.autofocusDelay);
103
+ });
104
+ defineExpose({
105
+ inputRef
106
+ });
146
107
  </script>
147
108
 
148
109
  <template>
149
- <Primitive
150
- :as="as"
151
- :class="style.base({ class: [props.class, props.ui?.base] })"
152
- :aria-disabled="disabled ? true : undefined"
153
- >
154
- <span v-if="isLeading || slots.leading" :class="style.leading({ class: props.ui?.leading })">
155
- <slot name="leading">
156
- <span
110
+ <Primitive :as="as" :class="ui.root({ class: [props.ui?.root, props.class] })" data-part="root">
111
+ <span v-if="isLeading || !!props.avatar || !!slots.leading" :class="ui.leading({ class: props.ui?.leading })" data-part="leading">
112
+ <slot name="leading" :ui="ui">
113
+ <Icon
157
114
  v-if="isLeading && leadingIconName"
158
- :class="style.leadingIcon({ class: [leadingIconName, props.ui?.leadingIcon] })"
159
- ></span>
115
+ :name="leadingIconName"
116
+ :class="ui.leadingIcon({ class: props.ui?.leadingIcon })"
117
+ data-part="leading-icon"
118
+ />
119
+ <Avatar
120
+ v-else-if="props.avatar"
121
+ :size="props.ui?.leadingAvatarSize || ui.leadingAvatarSize()"
122
+ v-bind="props.avatar"
123
+ :class="ui.leadingAvatar({ class: props.ui?.leadingAvatar })"
124
+ data-part="leading-avatar"
125
+ />
160
126
  </slot>
161
127
  </span>
162
128
 
163
129
  <input
164
130
  ref="inputRef"
165
- :class="style.input({ class: props.ui?.input })"
166
131
  :type="props.type"
167
132
  :value="modelValue"
168
133
  :placeholder="props.placeholder"
169
134
  :required="props.required"
170
135
  :autocomplete="props.autocomplete"
171
- v-bind="{ ...$attrs, ...ariaAttrs, id, name, disabled }"
136
+ v-bind="{ id, name, disabled, ...$attrs, ...ariaAttrs }"
137
+ :class="ui.base({ class: props.ui?.base })"
138
+ data-part="base"
172
139
  @input="onInput"
173
140
  @blur="onBlur"
174
141
  @change="onChange"
175
142
  @focus="emitFormFocus"
176
143
  />
177
144
 
178
- <slot></slot>
145
+ <slot :ui="ui"></slot>
179
146
 
180
- <span v-if="isTrailing || slots.trailing" :class="style.trailing({ class: props.ui?.trailing })">
181
- <slot name="trailing">
182
- <span
183
- v-if="isTrailing && trailingIconName"
184
- :class="style.trailingIcon({ class: [trailingIconName, props.ui?.trailingIcon] })"
185
- ></span>
147
+ <span v-if="isTrailing || slots.trailing" :class="ui.trailing({ class: props.ui?.trailing })" data-part="trailing">
148
+ <slot name="trailing" :ui="ui">
149
+ <Icon
150
+ v-if="trailingIconName"
151
+ :name="trailingIconName"
152
+ :class="ui.trailingIcon({ class: props.ui?.trailingIcon })"
153
+ data-part="trailing-icon"
154
+ />
186
155
  </slot>
187
156
  </span>
188
157
  </Primitive>
@@ -0,0 +1,76 @@
1
+ import type { VariantProps } from '@byyuurin/ui-kit';
2
+ import type { PrimitiveProps } from 'reka-ui';
3
+ import type { InputHTMLAttributes } from 'vue';
4
+ import theme from '#build/ui/input';
5
+ import type { UseComponentIconsProps } from '../composables/useComponentIcons';
6
+ import type { ComponentBaseProps, ComponentStyler, ComponentUIProps } from '../types';
7
+ import type { ModelModifiers } from '../types/input';
8
+ import type { AcceptableValue, MaybeNull, StaticSlot } from '../types/utils';
9
+ export type InputValue = AcceptableValue;
10
+ type ThemeVariants = VariantProps<typeof theme>;
11
+ export interface InputProps<T extends InputValue = InputValue> extends ComponentBaseProps, UseComponentIconsProps {
12
+ /**
13
+ * The element or component this component should render as.
14
+ * @default "div"
15
+ */
16
+ as?: PrimitiveProps['as'];
17
+ id?: string;
18
+ name?: string;
19
+ type?: InputHTMLAttributes['type'];
20
+ /** The placeholder text when the input is empty. */
21
+ placeholder?: string;
22
+ /** @default "primary" */
23
+ color?: ThemeVariants['color'];
24
+ /** @default "md" */
25
+ size?: ThemeVariants['size'];
26
+ /** @default "outline" */
27
+ variant?: ThemeVariants['variant'];
28
+ loading?: boolean;
29
+ /** Highlight the ring color like a focus state. */
30
+ highlight?: boolean;
31
+ required?: boolean;
32
+ autocomplete?: InputHTMLAttributes['autocomplete'];
33
+ autofocus?: boolean;
34
+ autofocusDelay?: number;
35
+ disabled?: boolean;
36
+ defaultValue?: T;
37
+ modelValue?: T;
38
+ modelModifiers?: ModelModifiers;
39
+ ui?: ComponentUIProps<typeof theme>;
40
+ }
41
+ export interface InputEmits<T extends InputValue> {
42
+ 'update:modelValue': [value: T];
43
+ 'blur': [event: FocusEvent];
44
+ 'change': [event: Event];
45
+ }
46
+ export interface InputSlots {
47
+ leading: StaticSlot<{
48
+ ui: ComponentStyler<typeof theme>;
49
+ }>;
50
+ default: StaticSlot<{
51
+ ui: ComponentStyler<typeof theme>;
52
+ }>;
53
+ trailing: StaticSlot<{
54
+ ui: ComponentStyler<typeof theme>;
55
+ }>;
56
+ }
57
+ declare const __VLS_export: <T extends InputValue>(__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<InputProps<T> & {
59
+ onChange?: ((event: Event) => any) | undefined;
60
+ onBlur?: ((event: FocusEvent) => any) | undefined;
61
+ "onUpdate:modelValue"?: ((value: T) => any) | undefined;
62
+ }> & import("vue").PublicProps;
63
+ expose: (exposed: import("vue").ShallowUnwrapRef<{
64
+ inputRef: import("vue").Ref<MaybeNull<HTMLInputElement>, MaybeNull<HTMLInputElement>>;
65
+ }>) => void;
66
+ attrs: any;
67
+ slots: InputSlots;
68
+ emit: ((evt: "change", event: Event) => void) & ((evt: "blur", event: FocusEvent) => void) & ((evt: "update:modelValue", value: T) => 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
+ } & {};