@dolanske/vui 1.0.4 → 1.1.1

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 (195) hide show
  1. package/LICENSE +673 -673
  2. package/README.md +42 -42
  3. package/dist/components/Accordion/Accordion.vue.d.ts +3 -2
  4. package/dist/components/Accordion/AccordionGroup.vue.d.ts +5 -2
  5. package/dist/components/Alert/Alert.vue.d.ts +3 -2
  6. package/dist/components/Avatar/Avatar.vue.d.ts +3 -2
  7. package/dist/components/Badge/Badge.vue.d.ts +3 -2
  8. package/dist/components/Breadcrumbs/BreadcrumbItem.vue.d.ts +3 -2
  9. package/dist/components/Breadcrumbs/Breadcrumbs.vue.d.ts +3 -2
  10. package/dist/components/Button/Button.vue.d.ts +3 -2
  11. package/dist/components/ButtonGroup/ButtonGroup.vue.d.ts +3 -2
  12. package/dist/components/Calendar/Calendar.vue.d.ts +6 -6
  13. package/dist/components/Card/Card.vue.d.ts +4 -3
  14. package/dist/components/Checkbox/Checkbox.vue.d.ts +7 -6
  15. package/dist/components/CopyClipboard/CopyClipboard.vue.d.ts +2 -1
  16. package/dist/components/Divider/Divider.vue.d.ts +3 -2
  17. package/dist/components/Drawer/Drawer.vue.d.ts +10 -9
  18. package/dist/components/Dropdown/Dropdown.vue.d.ts +66 -3
  19. package/dist/components/Dropdown/DropdownItem.vue.d.ts +3 -2
  20. package/dist/components/Dropdown/DropdownTitle.vue.d.ts +6 -6
  21. package/dist/components/Flex/Flex.vue.d.ts +13 -12
  22. package/dist/components/Grid/Grid.vue.d.ts +7 -6
  23. package/dist/components/Input/Color.vue.d.ts +5 -5
  24. package/dist/components/Input/Counter.vue.d.ts +5 -5
  25. package/dist/components/Input/Dropzone.vue.d.ts +95 -10
  26. package/dist/components/Input/File.vue.d.ts +4 -3
  27. package/dist/components/Input/Input.vue.d.ts +7 -6
  28. package/dist/components/Input/Password.vue.d.ts +1 -1
  29. package/dist/components/Input/Textarea.vue.d.ts +7 -6
  30. package/dist/components/Kbd/Kbd.vue.d.ts +1 -1
  31. package/dist/components/Kbd/KbdGroup.vue.d.ts +2 -1
  32. package/dist/components/Modal/Confirm.vue.d.ts +7 -9
  33. package/dist/components/Modal/Modal.vue.d.ts +16 -13
  34. package/dist/components/OTP/OTP.vue.d.ts +7 -6
  35. package/dist/components/OTP/OTPItem.vue.d.ts +1 -1
  36. package/dist/components/Pagination/Pagination.vue.d.ts +3 -2
  37. package/dist/components/Popout/Popout.vue.d.ts +3 -2
  38. package/dist/components/Progress/Progress.vue.d.ts +5 -5
  39. package/dist/components/Radio/Radio.vue.d.ts +7 -6
  40. package/dist/components/Radio/RadioGroup.vue.d.ts +7 -6
  41. package/dist/components/Select/Select.vue.d.ts +4 -8
  42. package/dist/components/Sheet/Sheet.vue.d.ts +22 -13
  43. package/dist/components/Sidebar/Sidebar.vue.d.ts +7 -6
  44. package/dist/components/Skeleton/Skeleton.vue.d.ts +1 -1
  45. package/dist/components/Spinner/Spinner.vue.d.ts +1 -1
  46. package/dist/components/Switch/Switch.vue.d.ts +7 -6
  47. package/dist/components/Table/Cell.vue.d.ts +5 -2
  48. package/dist/components/Table/Head.vue.d.ts +3 -2
  49. package/dist/components/Table/Root.vue.d.ts +3 -2
  50. package/dist/components/Table/table.d.ts +2 -2
  51. package/dist/components/Tabs/Tab.vue.d.ts +3 -2
  52. package/dist/components/Tabs/Tabs.vue.d.ts +7 -6
  53. package/dist/components/Toast/toast.d.ts +6 -6
  54. package/dist/components/Tooltip/Tooltip.vue.d.ts +2 -1
  55. package/dist/internal/Backdrop/Backdrop.vue.d.ts +3 -2
  56. package/dist/vui.css +1 -0
  57. package/dist/vui.js +8090 -7884
  58. package/package.json +73 -72
  59. package/src/App.vue +95 -95
  60. package/src/components/Accordion/Accordion.vue +91 -91
  61. package/src/components/Accordion/AccordionGroup.vue +43 -43
  62. package/src/components/Accordion/accordion.scss +82 -82
  63. package/src/components/Alert/Alert.vue +59 -59
  64. package/src/components/Alert/alert.scss +161 -161
  65. package/src/components/Avatar/Avatar.vue +53 -53
  66. package/src/components/Avatar/avatar.scss +52 -52
  67. package/src/components/Badge/Badge.vue +21 -21
  68. package/src/components/Badge/badge.scss +210 -206
  69. package/src/components/Breadcrumbs/BreadcrumbItem.vue +26 -26
  70. package/src/components/Breadcrumbs/Breadcrumbs.vue +30 -30
  71. package/src/components/Breadcrumbs/breadcrumbs.scss +31 -31
  72. package/src/components/Button/Button.vue +85 -85
  73. package/src/components/Button/button.scss +279 -279
  74. package/src/components/ButtonGroup/ButtonGroup.vue +28 -28
  75. package/src/components/ButtonGroup/button-group.scss +51 -51
  76. package/src/components/Calendar/Calendar.vue +66 -66
  77. package/src/components/Calendar/calendar.scss +83 -83
  78. package/src/components/Card/Card.vue +48 -48
  79. package/src/components/Card/card.scss +53 -53
  80. package/src/components/Checkbox/Checkbox.vue +54 -54
  81. package/src/components/Checkbox/checkbox.scss +80 -80
  82. package/src/components/CopyClipboard/CopyClipboard.vue +91 -91
  83. package/src/components/CopyClipboard/copy-clipboard.scss +25 -25
  84. package/src/components/Divider/Divider.vue +44 -44
  85. package/src/components/Divider/divider.scss +35 -35
  86. package/src/components/Drawer/Drawer.vue +102 -97
  87. package/src/components/Drawer/drawer.scss +37 -37
  88. package/src/components/Dropdown/Dropdown.vue +135 -135
  89. package/src/components/Dropdown/DropdownItem.vue +33 -33
  90. package/src/components/Dropdown/DropdownTitle.vue +14 -14
  91. package/src/components/Dropdown/dropdown-item.scss +84 -84
  92. package/src/components/Dropdown/dropdown.scss +53 -53
  93. package/src/components/Flex/Flex.vue +113 -113
  94. package/src/components/Grid/Grid.vue +79 -80
  95. package/src/components/Input/Color.vue +26 -26
  96. package/src/components/Input/Counter.vue +66 -66
  97. package/src/components/Input/Dropzone.vue +65 -65
  98. package/src/components/Input/File.vue +15 -15
  99. package/src/components/Input/Input.vue +123 -123
  100. package/src/components/Input/Password.vue +35 -35
  101. package/src/components/Input/Textarea.vue +78 -78
  102. package/src/components/Input/input.scss +302 -302
  103. package/src/components/Kbd/Kbd.vue +48 -48
  104. package/src/components/Kbd/KbdGroup.vue +27 -27
  105. package/src/components/Kbd/kbd.scss +19 -19
  106. package/src/components/Modal/Confirm.vue +56 -56
  107. package/src/components/Modal/Modal.vue +103 -99
  108. package/src/components/Modal/modal.scss +54 -54
  109. package/src/components/OTP/OTP.vue +133 -133
  110. package/src/components/OTP/OTPItem.vue +37 -37
  111. package/src/components/OTP/otp.scss +84 -84
  112. package/src/components/Pagination/Pagination.vue +77 -77
  113. package/src/components/Pagination/pagination.ts +78 -78
  114. package/src/components/Popout/Popout.vue +52 -52
  115. package/src/components/Popout/popout.scss +15 -15
  116. package/src/components/Progress/Progress.vue +103 -103
  117. package/src/components/Progress/progress.scss +47 -47
  118. package/src/components/Radio/Radio.vue +38 -38
  119. package/src/components/Radio/RadioGroup.vue +40 -40
  120. package/src/components/Radio/radio.scss +78 -78
  121. package/src/components/Select/Select.vue +211 -211
  122. package/src/components/Select/select.scss +77 -77
  123. package/src/components/Sheet/Sheet.vue +108 -98
  124. package/src/components/Sheet/sheet.scss +69 -69
  125. package/src/components/Sidebar/Sidebar.vue +115 -115
  126. package/src/components/Sidebar/sidebar.scss +124 -124
  127. package/src/components/Skeleton/Skeleton.vue +43 -43
  128. package/src/components/Skeleton/skeleton.scss +14 -14
  129. package/src/components/Spinner/Spinner.vue +42 -42
  130. package/src/components/Spinner/spinner.scss +47 -47
  131. package/src/components/Switch/Switch.vue +31 -31
  132. package/src/components/Switch/switch.scss +93 -93
  133. package/src/components/Table/Cell.vue +23 -23
  134. package/src/components/Table/Head.vue +59 -59
  135. package/src/components/Table/Root.vue +66 -66
  136. package/src/components/Table/SelectAll.vue +23 -23
  137. package/src/components/Table/SelectRow.vue +30 -30
  138. package/src/components/Table/index.ts +7 -7
  139. package/src/components/Table/table.scss +154 -154
  140. package/src/components/Table/table.ts +248 -248
  141. package/src/components/Tabs/Tab.vue +25 -25
  142. package/src/components/Tabs/Tabs.vue +90 -90
  143. package/src/components/Tabs/tabs.scss +87 -87
  144. package/src/components/Toast/Toasts.vue +52 -52
  145. package/src/components/Toast/toast.scss +45 -45
  146. package/src/components/Toast/toast.ts +75 -75
  147. package/src/components/Tooltip/Tooltip.vue +86 -86
  148. package/src/components/Tooltip/tooltip.scss +8 -8
  149. package/src/examples/ExampleAccordions.vue +58 -58
  150. package/src/examples/ExampleAlerts.vue +78 -78
  151. package/src/examples/ExampleAvatars.vue +44 -44
  152. package/src/examples/ExampleBadges.vue +48 -48
  153. package/src/examples/ExampleBreadcrumbs.vue +46 -46
  154. package/src/examples/ExampleButtons.vue +140 -140
  155. package/src/examples/ExampleCalendars.vue +40 -40
  156. package/src/examples/ExampleCards.vue +94 -94
  157. package/src/examples/ExampleCheckboxes.vue +123 -123
  158. package/src/examples/ExampleCopyClipboard.vue +47 -47
  159. package/src/examples/ExampleDividers.vue +39 -39
  160. package/src/examples/ExampleDrawers.vue +67 -67
  161. package/src/examples/ExampleDropdowns.vue +114 -114
  162. package/src/examples/ExampleFlexGrid.vue +124 -122
  163. package/src/examples/ExampleInputs.vue +234 -234
  164. package/src/examples/ExampleKBD.vue +65 -65
  165. package/src/examples/ExampleModals.vue +143 -143
  166. package/src/examples/ExamplePalette.vue +159 -159
  167. package/src/examples/ExamplePopouts.vue +41 -41
  168. package/src/examples/ExampleSheets.vue +77 -77
  169. package/src/examples/ExampleSidebars.vue +270 -270
  170. package/src/examples/ExampleSkeletons.vue +26 -26
  171. package/src/examples/ExampleSpinners.vue +80 -78
  172. package/src/examples/ExampleTables.vue +195 -195
  173. package/src/examples/ExampleTabs.vue +119 -119
  174. package/src/examples/ExampleToasts.vue +96 -96
  175. package/src/examples/ExampleTooltips.vue +70 -70
  176. package/src/examples/shared/ExampleColor.vue +28 -28
  177. package/src/index.ts +116 -116
  178. package/src/internal/Backdrop/Backdrop.vue +22 -22
  179. package/src/internal/Backdrop/backdrop.scss +34 -34
  180. package/src/main.ts +5 -5
  181. package/src/shared/helpers.ts +117 -117
  182. package/src/shared/theme.ts +22 -22
  183. package/src/shared/types.ts +29 -29
  184. package/src/style/animation.scss +22 -22
  185. package/src/style/core.scss +119 -125
  186. package/src/style/layout.scss +207 -233
  187. package/src/style/media-query.scss +29 -29
  188. package/src/style/reset.scss +135 -135
  189. package/src/style/text.scss +137 -124
  190. package/src/style/theme.scss +195 -195
  191. package/src/style/tooltip.scss +146 -146
  192. package/src/style/typography.scss +415 -415
  193. package/src/style/utils.scss +36 -36
  194. package/src/style.scss +1 -1
  195. package/dist/style.css +0 -1
@@ -1,26 +1,26 @@
1
- <script setup lang="ts">
2
- import type { InputProps } from './Input.vue'
3
- import { Icon } from '@iconify/vue'
4
- import { useAttrs, useId } from 'vue'
5
- import Input from './Input.vue'
6
-
7
- const props = defineProps<InputProps>()
8
-
9
- const attrs = useAttrs()
10
- const color = defineModel<string>()
11
- const id = useId()
12
- </script>
13
-
14
- <template>
15
- <Input v-bind="{ ...attrs, ...props }" type="color" class="vui-input-color">
16
- <template #__internal_replace_input>
17
- <input :id v-model="color" type="color" tabindex="0">
18
- <label :for="id">
19
- <div class="vui-input-color-indicator" :style="{ backgroundColor: color }">
20
- <Icon v-if="!color" icon="ph:palette" />
21
- </div>
22
- <input v-model="color" type="text" :placeholder="props.placeholder">
23
- </label>
24
- </template>
25
- </Input>
26
- </template>
1
+ <script setup lang="ts">
2
+ import type { InputProps } from './Input.vue'
3
+ import { Icon } from '@iconify/vue'
4
+ import { useAttrs, useId } from 'vue'
5
+ import Input from './Input.vue'
6
+
7
+ const props = defineProps<InputProps>()
8
+
9
+ const attrs = useAttrs()
10
+ const color = defineModel<string>()
11
+ const id = useId()
12
+ </script>
13
+
14
+ <template>
15
+ <Input v-bind="{ ...attrs, ...props }" type="color" class="vui-input-color">
16
+ <template #__internal_replace_input>
17
+ <input :id v-model="color" type="color" tabindex="0">
18
+ <label :for="id">
19
+ <div class="vui-input-color-indicator" :style="{ backgroundColor: color }">
20
+ <Icon v-if="!color" icon="ph:palette" />
21
+ </div>
22
+ <input v-model="color" type="text" :placeholder="props.placeholder">
23
+ </label>
24
+ </template>
25
+ </Input>
26
+ </template>
@@ -1,66 +1,66 @@
1
- <script setup lang='ts'>
2
- import type { InputProps } from './Input.vue'
3
- import { Icon } from '@iconify/vue'
4
- import Button from '../Button/Button.vue'
5
- import ButtonGroup from '../ButtonGroup/ButtonGroup.vue'
6
- import Input from './Input.vue'
7
-
8
- type Props = Omit<InputProps, 'type'> & {
9
- incrementBy?: number
10
- incrementEnabled?: boolean
11
- hideIncrement?: boolean
12
- decrementBy?: number
13
- decrementEnabled?: boolean
14
- hideDecrement?: boolean
15
- }
16
-
17
- const {
18
- incrementBy = 1,
19
- incrementEnabled = true,
20
- hideIncrement = false,
21
- decrementBy = 1,
22
- decrementEnabled = true,
23
- hideDecrement = false,
24
- ...inputProps
25
- } = defineProps<Props>()
26
-
27
- const count = defineModel<number>({
28
- default: 0,
29
- })
30
- </script>
31
-
32
- <template>
33
- <Input v-bind="inputProps" v-model.number="count" type="number">
34
- <!-- <template v-if="!hideDecrement" #start>
35
- </template> -->
36
-
37
- <template #end>
38
- <ButtonGroup>
39
- <Button v-if="!hideDecrement" key="decrease" :disabled="!decrementEnabled" :style="{ 'border-top-left-radius': 0, 'border-bottom-left-radius': 0 }" @click="count -= decrementBy">
40
- <Icon icon="ph:minus" /> {{ decrementBy > 1 ? decrementBy : '' }}
41
- </Button>
42
- <Button v-if="!hideIncrement" key="increase" :disabled="!incrementEnabled" @click="count += incrementBy">
43
- <Icon icon="ph:plus" /> {{ incrementBy > 1 ? incrementBy : '' }}
44
- </Button>
45
- </ButtonGroup>
46
- </template>
47
- </Input>
48
- </template>
49
-
50
- <style scoped lang="scss">
51
- :deep(.vui-button) {
52
- padding-inline: 2px !important;
53
- }
54
-
55
- :deep(input) {
56
- ::-webkit-outer-spin-button,
57
- ::-webkit-inner-spin-button {
58
- -webkit-appearance: none;
59
- margin: 0;
60
- }
61
-
62
- /* Firefox */
63
- -moz-appearance: textfield;
64
- appearance: textfield;
65
- }
66
- </style>
1
+ <script setup lang='ts'>
2
+ import type { InputProps } from './Input.vue'
3
+ import { Icon } from '@iconify/vue'
4
+ import Button from '../Button/Button.vue'
5
+ import ButtonGroup from '../ButtonGroup/ButtonGroup.vue'
6
+ import Input from './Input.vue'
7
+
8
+ type Props = Omit<InputProps, 'type'> & {
9
+ incrementBy?: number
10
+ incrementEnabled?: boolean
11
+ hideIncrement?: boolean
12
+ decrementBy?: number
13
+ decrementEnabled?: boolean
14
+ hideDecrement?: boolean
15
+ }
16
+
17
+ const {
18
+ incrementBy = 1,
19
+ incrementEnabled = true,
20
+ hideIncrement = false,
21
+ decrementBy = 1,
22
+ decrementEnabled = true,
23
+ hideDecrement = false,
24
+ ...inputProps
25
+ } = defineProps<Props>()
26
+
27
+ const count = defineModel<number>({
28
+ default: 0,
29
+ })
30
+ </script>
31
+
32
+ <template>
33
+ <Input v-bind="inputProps" v-model.number="count" type="number">
34
+ <!-- <template v-if="!hideDecrement" #start>
35
+ </template> -->
36
+
37
+ <template #end>
38
+ <ButtonGroup>
39
+ <Button v-if="!hideDecrement" key="decrease" :disabled="!decrementEnabled" :style="{ 'border-top-left-radius': 0, 'border-bottom-left-radius': 0 }" @click="count -= decrementBy">
40
+ <Icon icon="ph:minus" /> {{ decrementBy > 1 ? decrementBy : '' }}
41
+ </Button>
42
+ <Button v-if="!hideIncrement" key="increase" :disabled="!incrementEnabled" @click="count += incrementBy">
43
+ <Icon icon="ph:plus" /> {{ incrementBy > 1 ? incrementBy : '' }}
44
+ </Button>
45
+ </ButtonGroup>
46
+ </template>
47
+ </Input>
48
+ </template>
49
+
50
+ <style scoped lang="scss">
51
+ :deep(.vui-button) {
52
+ padding-inline: 2px !important;
53
+ }
54
+
55
+ :deep(input) {
56
+ ::-webkit-outer-spin-button,
57
+ ::-webkit-inner-spin-button {
58
+ -webkit-appearance: none;
59
+ margin: 0;
60
+ }
61
+
62
+ /* Firefox */
63
+ -moz-appearance: textfield;
64
+ appearance: textfield;
65
+ }
66
+ </style>
@@ -1,65 +1,65 @@
1
- <script setup lang='ts'>
2
- import type { InputProps } from './Input.vue'
3
- import { Icon } from '@iconify/vue'
4
- import { useEventListener } from '@vueuse/core'
5
- import { onMounted, ref, useTemplateRef } from 'vue'
6
- import Flex from '../Flex/Flex.vue'
7
- import Input from './Input.vue'
8
-
9
- type Props = Omit<InputProps, 'type' | 'modelValue' | 'focus' | 'limit' | 'placeholder'>
10
-
11
- const props = defineProps<Props>()
12
- const emits = defineEmits<{ files: [FileList] }>()
13
-
14
- const dragging = ref(false)
15
-
16
- function onSubmitHandler(e: any, isFromField?: boolean) {
17
- e.preventDefault()
18
- e.stopPropagation()
19
-
20
- const files = isFromField ? e.target.files : e.dataTransfer.files
21
-
22
- if (files.length > 0)
23
- emits('files', files)
24
- }
25
-
26
- const dropzoneRef = useTemplateRef<HTMLDivElement>('dropzone')
27
-
28
- onMounted(() => {
29
- useEventListener(dropzoneRef, 'dragenter', onSubmitHandler, false)
30
- useEventListener(dropzoneRef, 'dragleave', onSubmitHandler, false)
31
- useEventListener(dropzoneRef, 'dragover', onSubmitHandler, false)
32
- useEventListener(dropzoneRef, 'drop', onSubmitHandler, false)
33
- useEventListener(dropzoneRef, 'input', e => onSubmitHandler(e, true), false)
34
- })
35
- </script>
36
-
37
- <template>
38
- <Input
39
- v-bind="props"
40
- ref="dropzone"
41
- type="file"
42
- class="vui-dropzone"
43
- :class="{ dragging }"
44
- @dragenter="dragging = true"
45
- @mouseleave="dragging = false"
46
- >
47
- <template #__internal_replace_input="{ inputId }">
48
- <input :id="inputId" type="file">
49
- <label :for="inputId">
50
- <slot :dragging>
51
- <Flex justify-center gap="xs" align-center>
52
- <template v-if="dragging">
53
- <Icon icon="ph:target" />
54
- Drop it
55
- </template>
56
- <template v-else>
57
- <Icon icon="ph:file" />
58
- Click or drag files over here
59
- </template>
60
- </Flex>
61
- </slot>
62
- </label>
63
- </template>
64
- </Input>
65
- </template>
1
+ <script setup lang='ts'>
2
+ import type { InputProps } from './Input.vue'
3
+ import { Icon } from '@iconify/vue'
4
+ import { useEventListener } from '@vueuse/core'
5
+ import { onMounted, ref, useTemplateRef } from 'vue'
6
+ import Flex from '../Flex/Flex.vue'
7
+ import Input from './Input.vue'
8
+
9
+ type Props = Omit<InputProps, 'type' | 'modelValue' | 'focus' | 'limit' | 'placeholder'>
10
+
11
+ const props = defineProps<Props>()
12
+ const emits = defineEmits<{ files: [FileList] }>()
13
+
14
+ const dragging = ref(false)
15
+
16
+ function onSubmitHandler(e: any, isFromField?: boolean) {
17
+ e.preventDefault()
18
+ e.stopPropagation()
19
+
20
+ const files = isFromField ? e.target.files : e.dataTransfer.files
21
+
22
+ if (files.length > 0)
23
+ emits('files', files)
24
+ }
25
+
26
+ const dropzoneRef = useTemplateRef<HTMLDivElement>('dropzone')
27
+
28
+ onMounted(() => {
29
+ useEventListener(dropzoneRef, 'dragenter', onSubmitHandler, false)
30
+ useEventListener(dropzoneRef, 'dragleave', onSubmitHandler, false)
31
+ useEventListener(dropzoneRef, 'dragover', onSubmitHandler, false)
32
+ useEventListener(dropzoneRef, 'drop', onSubmitHandler, false)
33
+ useEventListener(dropzoneRef, 'input', e => onSubmitHandler(e, true), false)
34
+ })
35
+ </script>
36
+
37
+ <template>
38
+ <Input
39
+ v-bind="props"
40
+ ref="dropzone"
41
+ type="file"
42
+ class="vui-dropzone"
43
+ :class="{ dragging }"
44
+ @dragenter="dragging = true"
45
+ @mouseleave="dragging = false"
46
+ >
47
+ <template #__internal_replace_input="{ inputId }">
48
+ <input :id="inputId" type="file">
49
+ <label :for="inputId">
50
+ <slot :dragging>
51
+ <Flex x-center gap="xs" y-center>
52
+ <template v-if="dragging">
53
+ <Icon icon="ph:target" />
54
+ Drop it
55
+ </template>
56
+ <template v-else>
57
+ <Icon icon="ph:file" />
58
+ Click or drag files over here
59
+ </template>
60
+ </Flex>
61
+ </slot>
62
+ </label>
63
+ </template>
64
+ </Input>
65
+ </template>
@@ -1,15 +1,15 @@
1
- <script setup lang='ts'>
2
- import type { InputProps } from './Input.vue'
3
- import Input from './Input.vue'
4
-
5
- const props = defineProps<Omit<InputProps, 'type'>>()
6
- const emits = defineEmits<{ files: [FileList] }>()
7
- </script>
8
-
9
- <template>
10
- <Input
11
- type="file"
12
- v-bind="props"
13
- @input="emits('files', $event.target.files)"
14
- />
15
- </template>
1
+ <script setup lang='ts'>
2
+ import type { InputProps } from './Input.vue'
3
+ import Input from './Input.vue'
4
+
5
+ const props = defineProps<Omit<InputProps, 'type'>>()
6
+ const emits = defineEmits<{ files: [FileList] }>()
7
+ </script>
8
+
9
+ <template>
10
+ <Input
11
+ type="file"
12
+ v-bind="props"
13
+ @input="emits('files', $event.target.files)"
14
+ />
15
+ </template>
@@ -1,123 +1,123 @@
1
- <script setup lang="ts">
2
- import { computed, useId, useTemplateRef, watchEffect } from 'vue'
3
- import { getMaybeRefLength } from '../../shared/helpers'
4
- import Flex from '../Flex/Flex.vue'
5
- import '../../style/core.scss'
6
- import './input.scss'
7
-
8
- // FIXME: sometimes spamming inputs when limit is set, it will _just_ let me write one more letter
9
-
10
- export type InputType = 'text' | 'password' | 'color' | 'date' | 'email' | 'number' | 'range' | 'search' | 'tel' | 'time' | 'url' | 'file'
11
-
12
- export interface InputProps {
13
- type?: InputType
14
- label?: string
15
- hint?: string
16
- limit?: number | string
17
- expand?: boolean
18
- placeholder?: string
19
- required?: boolean
20
- modelValue?: string | number
21
- readonly?: boolean
22
- focus?: boolean
23
- errors?: string[]
24
- accept?: string
25
- multiple?: boolean
26
- min?: number
27
- max?: number
28
- disabled?: boolean
29
- }
30
-
31
- const {
32
- type = 'text',
33
- limit,
34
- label,
35
- expand = false,
36
- hint,
37
- placeholder,
38
- required,
39
- modelValue = '',
40
- readonly,
41
- focus,
42
- accept,
43
- min,
44
- max,
45
- errors = [] as string[],
46
- disabled,
47
- } = defineProps<InputProps>()
48
-
49
- const model = defineModel<string | number>({
50
- default: '',
51
- set(newValue) {
52
- // Completely ignore inputs
53
- if (readonly)
54
- return modelValue
55
-
56
- if (getMaybeRefLength(newValue) > Number(limit)) {
57
- return modelValue
58
- }
59
- return newValue
60
- },
61
- })
62
- const id = useId()
63
-
64
- const inputRef = useTemplateRef('input')
65
-
66
- watchEffect(() => {
67
- if (focus)
68
- inputRef.value?.focus({ preventScroll: true })
69
- })
70
-
71
- defineExpose({
72
- focus: () => {
73
- inputRef.value?.focus({ preventScroll: true })
74
- },
75
- })
76
-
77
- const renderLimit = computed(() => {
78
- return `${getMaybeRefLength(model.value)}/${limit}`
79
- })
80
- </script>
81
-
82
- <template>
83
- <div class="vui-input-container" :class="{ expand, disabled, required, readonly, 'has-errors': errors.length > 0 }">
84
- <slot name="before" />
85
- <div class="vui-input">
86
- <label v-if="label" :for="id">{{ label }}</label>
87
- <p v-if="hint" class="vui-input-hint">
88
- {{ hint }}
89
- </p>
90
- <Flex class="vui-input-style" :gap="5" align-center>
91
- <slot name="start" />
92
- <slot name="__internal_replace_input" :input-id="id" />
93
- <input
94
- v-if="!$slots.__internal_replace_input"
95
- :id
96
- ref="input"
97
- v-model="model"
98
- :readonly
99
- :type
100
- name="id"
101
- :placeholder
102
- :required
103
- :max="max ?? limit"
104
- :accept
105
- :multiple
106
- :min
107
- :disabled
108
- >
109
- <slot name="end" />
110
- </Flex>
111
- </div>
112
- <p v-if="limit" class="vui-input-limit">
113
- {{ renderLimit }}
114
- </p>
115
- <ul v-if="errors.length > 0" class="vui-input-errors">
116
- <li v-for="err in errors" :key="err">
117
- {{ err }}
118
- </li>
119
- </ul>
120
-
121
- <slot name="after" />
122
- </div>
123
- </template>
1
+ <script setup lang="ts">
2
+ import { computed, useId, useTemplateRef, watchEffect } from 'vue'
3
+ import { getMaybeRefLength } from '../../shared/helpers'
4
+ import Flex from '../Flex/Flex.vue'
5
+ import '../../style/core.scss'
6
+ import './input.scss'
7
+
8
+ // FIXME: sometimes spamming inputs when limit is set, it will _just_ let me write one more letter
9
+
10
+ export type InputType = 'text' | 'password' | 'color' | 'date' | 'email' | 'number' | 'range' | 'search' | 'tel' | 'time' | 'url' | 'file'
11
+
12
+ export interface InputProps {
13
+ type?: InputType
14
+ label?: string
15
+ hint?: string
16
+ limit?: number | string
17
+ expand?: boolean
18
+ placeholder?: string
19
+ required?: boolean
20
+ modelValue?: string | number
21
+ readonly?: boolean
22
+ focus?: boolean
23
+ errors?: string[]
24
+ accept?: string
25
+ multiple?: boolean
26
+ min?: number
27
+ max?: number
28
+ disabled?: boolean
29
+ }
30
+
31
+ const {
32
+ type = 'text',
33
+ limit,
34
+ label,
35
+ expand = false,
36
+ hint,
37
+ placeholder,
38
+ required,
39
+ modelValue = '',
40
+ readonly,
41
+ focus,
42
+ accept,
43
+ min,
44
+ max,
45
+ errors = [] as string[],
46
+ disabled,
47
+ } = defineProps<InputProps>()
48
+
49
+ const model = defineModel<string | number>({
50
+ default: '',
51
+ set(newValue) {
52
+ // Completely ignore inputs
53
+ if (readonly)
54
+ return modelValue
55
+
56
+ if (getMaybeRefLength(newValue) > Number(limit)) {
57
+ return modelValue
58
+ }
59
+ return newValue
60
+ },
61
+ })
62
+ const id = useId()
63
+
64
+ const inputRef = useTemplateRef('input')
65
+
66
+ watchEffect(() => {
67
+ if (focus)
68
+ inputRef.value?.focus({ preventScroll: true })
69
+ })
70
+
71
+ defineExpose({
72
+ focus: () => {
73
+ inputRef.value?.focus({ preventScroll: true })
74
+ },
75
+ })
76
+
77
+ const renderLimit = computed(() => {
78
+ return `${getMaybeRefLength(model.value)}/${limit}`
79
+ })
80
+ </script>
81
+
82
+ <template>
83
+ <div class="vui-input-container" :class="{ expand, disabled, required, readonly, 'has-errors': errors.length > 0 }">
84
+ <slot name="before" />
85
+ <div class="vui-input">
86
+ <label v-if="label" :for="id">{{ label }}</label>
87
+ <p v-if="hint" class="vui-input-hint">
88
+ {{ hint }}
89
+ </p>
90
+ <Flex class="vui-input-style" :gap="5" y-center>
91
+ <slot name="start" />
92
+ <slot name="__internal_replace_input" :input-id="id" />
93
+ <input
94
+ v-if="!$slots.__internal_replace_input"
95
+ :id
96
+ ref="input"
97
+ v-model="model"
98
+ :readonly
99
+ :type
100
+ name="id"
101
+ :placeholder
102
+ :required
103
+ :max="max ?? limit"
104
+ :accept
105
+ :multiple
106
+ :min
107
+ :disabled
108
+ >
109
+ <slot name="end" />
110
+ </Flex>
111
+ </div>
112
+ <p v-if="limit" class="vui-input-limit">
113
+ {{ renderLimit }}
114
+ </p>
115
+ <ul v-if="errors.length > 0" class="vui-input-errors">
116
+ <li v-for="err in errors" :key="err">
117
+ {{ err }}
118
+ </li>
119
+ </ul>
120
+
121
+ <slot name="after" />
122
+ </div>
123
+ </template>
@@ -1,35 +1,35 @@
1
- <script setup lang='ts'>
2
- import type { InputProps } from './Input.vue'
3
- import { Icon } from '@iconify/vue'
4
- import { ref } from 'vue'
5
- import Button from '../Button/Button.vue'
6
- import Input from './Input.vue'
7
-
8
- type Props = Omit<InputProps, 'type'> & {
9
- showPassword?: boolean
10
- }
11
-
12
- const {
13
- showPassword = false,
14
- // @ts-expect-error Don't want to actually provide type as we handle that in
15
- // this component manually
16
- type,
17
- ...inputProps
18
- } = defineProps<Props>()
19
-
20
- const show = ref(showPassword)
21
- </script>
22
-
23
- <template>
24
- <Input v-bind="inputProps" :type="show ? 'text' : 'password'" autocomplete="off">
25
- <template #end>
26
- <Button
27
- square
28
- :data-title-top="show ? 'Hide' : 'Reveal'"
29
- @click="show = !show"
30
- >
31
- <Icon :width="18" :height="18" :icon="show ? 'ph:eye-slash' : 'ph:eye'" />
32
- </Button>
33
- </template>
34
- </Input>
35
- </template>
1
+ <script setup lang='ts'>
2
+ import type { InputProps } from './Input.vue'
3
+ import { Icon } from '@iconify/vue'
4
+ import { ref } from 'vue'
5
+ import Button from '../Button/Button.vue'
6
+ import Input from './Input.vue'
7
+
8
+ type Props = Omit<InputProps, 'type'> & {
9
+ showPassword?: boolean
10
+ }
11
+
12
+ const {
13
+ showPassword = false,
14
+ // @ts-expect-error Don't want to actually provide type as we handle that in
15
+ // this component manually
16
+ type,
17
+ ...inputProps
18
+ } = defineProps<Props>()
19
+
20
+ const show = ref(showPassword)
21
+ </script>
22
+
23
+ <template>
24
+ <Input v-bind="inputProps" :type="show ? 'text' : 'password'" autocomplete="off">
25
+ <template #end>
26
+ <Button
27
+ square
28
+ :data-title-top="show ? 'Hide' : 'Reveal'"
29
+ @click="show = !show"
30
+ >
31
+ <Icon :width="18" :height="18" :icon="show ? 'ph:eye-slash' : 'ph:eye'" />
32
+ </Button>
33
+ </template>
34
+ </Input>
35
+ </template>