@dolanske/vui 0.3.4 → 0.5.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 (114) hide show
  1. package/LICENSE +673 -673
  2. package/README.md +41 -40
  3. package/dist/components/Dropdown/DropdownItem.vue.d.ts +1 -0
  4. package/dist/components/Flex/Flex.vue.d.ts +3 -1
  5. package/dist/components/Grid/Grid.vue.d.ts +3 -1
  6. package/dist/components/Tabs/Tabs.vue.d.ts +4 -0
  7. package/dist/style.css +1 -1
  8. package/dist/vui.js +1547 -1534
  9. package/package.json +68 -68
  10. package/src/App.vue +176 -175
  11. package/src/components/Accordion/Accordion.vue +91 -91
  12. package/src/components/Accordion/AccordionGroup.vue +43 -43
  13. package/src/components/Accordion/accordion.scss +81 -80
  14. package/src/components/Alert/Alert.vue +53 -53
  15. package/src/components/Alert/alert.scss +80 -80
  16. package/src/components/Avatar/Avatar.vue +50 -50
  17. package/src/components/Avatar/avatar.scss +52 -52
  18. package/src/components/Badge/Badge.vue +21 -21
  19. package/src/components/Badge/badge.scss +89 -89
  20. package/src/components/Breadcrumbs/BreadcrumbItem.vue +26 -26
  21. package/src/components/Breadcrumbs/Breadcrumbs.vue +33 -33
  22. package/src/components/Breadcrumbs/breadcrumbs.scss +30 -30
  23. package/src/components/Button/Button.vue +90 -90
  24. package/src/components/Button/button.scss +178 -176
  25. package/src/components/ButtonGroup/ButtonGroup.vue +25 -25
  26. package/src/components/ButtonGroup/button-group.scss +51 -51
  27. package/src/components/Calendar/Calendar.vue +63 -60
  28. package/src/components/Calendar/calendar.scss +60 -56
  29. package/src/components/Card/Card.vue +48 -48
  30. package/src/components/Card/card.scss +53 -53
  31. package/src/components/Checkbox/Checkbox.vue +51 -52
  32. package/src/components/Checkbox/checkbox.scss +75 -66
  33. package/src/components/CopyClipboard/CopyClipboard.vue +82 -82
  34. package/src/components/CopyClipboard/copy-clipboard.scss +17 -17
  35. package/src/components/Divider/Divider.vue +44 -44
  36. package/src/components/Divider/divider.scss +35 -35
  37. package/src/components/Drawer/Drawer.vue +97 -97
  38. package/src/components/Drawer/drawer.scss +36 -36
  39. package/src/components/Dropdown/Dropdown.vue +111 -111
  40. package/src/components/Dropdown/DropdownItem.vue +33 -29
  41. package/src/components/Dropdown/DropdownTitle.vue +8 -8
  42. package/src/components/Dropdown/dropdown-item.scss +77 -0
  43. package/src/components/Dropdown/dropdown.scss +39 -117
  44. package/src/components/Flex/Flex.vue +113 -106
  45. package/src/components/Grid/Grid.vue +60 -54
  46. package/src/components/Input/Counter.vue +70 -70
  47. package/src/components/Input/Dropzone.vue +65 -65
  48. package/src/components/Input/File.vue +15 -15
  49. package/src/components/Input/Input.vue +121 -121
  50. package/src/components/Input/Password.vue +47 -47
  51. package/src/components/Input/Textarea.vue +76 -76
  52. package/src/components/Input/input.scss +208 -208
  53. package/src/components/Kbd/Kbd.vue +48 -48
  54. package/src/components/Kbd/KbdGroup.vue +31 -31
  55. package/src/components/Kbd/kbd.scss +18 -18
  56. package/src/components/Modal/Confirm.vue +56 -56
  57. package/src/components/Modal/Modal.vue +91 -91
  58. package/src/components/Modal/modal.scss +49 -49
  59. package/src/components/OTP/OTP.vue +133 -133
  60. package/src/components/OTP/OTPItem.vue +37 -37
  61. package/src/components/OTP/otp.scss +83 -83
  62. package/src/components/Pagination/Pagination.vue +74 -74
  63. package/src/components/Pagination/pagination.ts +78 -78
  64. package/src/components/Popout/Popout.vue +42 -42
  65. package/src/components/Popout/popout.scss +8 -8
  66. package/src/components/Progress/Progress.vue +90 -90
  67. package/src/components/Progress/progress.scss +41 -41
  68. package/src/components/Radio/Radio.vue +36 -36
  69. package/src/components/Radio/RadioGroup.vue +40 -40
  70. package/src/components/Radio/radio.scss +68 -59
  71. package/src/components/Select/Select.vue +180 -180
  72. package/src/components/Select/select.scss +44 -44
  73. package/src/components/Sheet/Sheet.vue +92 -92
  74. package/src/components/Sheet/sheet.scss +60 -60
  75. package/src/components/Sidebar/Sidebar.vue +102 -0
  76. package/src/components/Sidebar/sidebar.scss +123 -0
  77. package/src/components/Skeleton/Skeleton.vue +43 -43
  78. package/src/components/Skeleton/skeleton.scss +14 -14
  79. package/src/components/Spinner/Spinner.vue +42 -42
  80. package/src/components/Spinner/spinner.scss +46 -46
  81. package/src/components/Switch/Switch.vue +30 -30
  82. package/src/components/Switch/switch.scss +60 -52
  83. package/src/components/Table/Cell.vue +23 -23
  84. package/src/components/Table/Header.vue +59 -59
  85. package/src/components/Table/Row.vue +9 -9
  86. package/src/components/Table/SelectAll.vue +23 -23
  87. package/src/components/Table/SelectRow.vue +29 -29
  88. package/src/components/Table/Table.vue +66 -66
  89. package/src/components/Table/table.scss +134 -134
  90. package/src/components/Table/table.ts +244 -244
  91. package/src/components/Tabs/Tab.vue +27 -27
  92. package/src/components/Tabs/Tabs.vue +89 -82
  93. package/src/components/Tabs/tabs.scss +80 -79
  94. package/src/components/Toast/Toasts.vue +47 -47
  95. package/src/components/Toast/toast.scss +41 -41
  96. package/src/components/Toast/toast.ts +68 -68
  97. package/src/components/Tooltip/Tooltip.vue +86 -86
  98. package/src/components/Tooltip/tooltip.scss +4 -4
  99. package/src/index.scss +1 -1
  100. package/src/index.ts +119 -119
  101. package/src/internal/Backdrop/Backdrop.vue +22 -22
  102. package/src/internal/Backdrop/backdrop.scss +28 -28
  103. package/src/main.ts +5 -5
  104. package/src/shared/helpers.ts +74 -74
  105. package/src/shared/types.ts +29 -29
  106. package/src/style/animation.scss +21 -21
  107. package/src/style/core.scss +150 -148
  108. package/src/style/layout.scss +168 -136
  109. package/src/style/media-query.scss +29 -29
  110. package/src/style/reset.scss +135 -135
  111. package/src/style/{fonts.scss → text.scss} +74 -53
  112. package/src/style/tooltip.scss +128 -128
  113. package/src/style/typography.scss +338 -338
  114. package/src/style/utils.scss +36 -36
@@ -1,117 +1,39 @@
1
- .vui-dropdown-trigger-wrap {
2
- // display: inline-block;
3
- width: fit-content;
4
- }
5
-
6
- .vui-dropdown {
7
- min-width: 156px;
8
- border-radius: var(--border-radius-m);
9
- border: 1px solid var(--color-border);
10
- padding: 4px;
11
- }
12
-
13
- .vui-dropdown-item {
14
- display: flex;
15
- align-items: center;
16
- justify-content: flex-start;
17
- width: fit-content;
18
- gap: var(--space-xs);
19
- width: 100%;
20
- height: 34px;
21
- border-radius: var(--border-radius-m);
22
- font-size: var(--font-size-s);
23
- cursor: default;
24
- transition: var(--transition);
25
- padding-inline: var(--space-s);
26
- white-space: nowrap;
27
- margin-bottom: 4px;
28
-
29
- &:last-child {
30
- margin-bottom: 0;
31
- }
32
-
33
- &.disabled {
34
- pointer-events: none;
35
-
36
- &:hover {
37
- background-color: transparent;
38
- }
39
-
40
- .vui-dropdown-item-slot,
41
- .vui-dropdown-item-icon svg path {
42
- color: var(--color-text-lighter);
43
- }
44
-
45
- .vui-dropdown-item-hint {
46
- visibility: hidden;
47
- opacity: 0;
48
- z-index: -1;
49
- }
50
- }
51
-
52
- .vui-dropdown-item-icon {
53
- width: 16px;
54
- height: 16px;
55
- display: flex;
56
- align-items: center;
57
- justify-content: center;
58
-
59
- svg {
60
- width: 16px;
61
- height: 16px;
62
-
63
- path {
64
- color: var(--color-text-light);
65
- }
66
- }
67
- }
68
-
69
- .vui-dropdown-item-hint {
70
- margin-left: 8px;
71
- font-size: 0.9rem;
72
- // white-space: nowrap;
73
- color: var(--color-text-lighter);
74
- }
75
-
76
- .vui-dropdown-item-slot {
77
- flex: 1;
78
- display: flex;
79
- align-items: center;
80
- justify-content: flex-start;
81
- color: var(--color-text);
82
- flex-wrap: nowrap;
83
- }
84
-
85
- &.selected,
86
- &:hover {
87
- background-color: var(--color-button-gray-hover);
88
- }
89
- }
90
-
91
- .vui-dropdown-title {
92
- position: relative;
93
- display: flex;
94
- align-items: center;
95
- justify-content: flex-start;
96
- padding-block: var(--space-s);
97
- padding-inline: calc(var(--space-s) + 4px);
98
- font-size: var(--font-size-ms);
99
- border-bottom: 1px solid var(--color-border);
100
- font-weight: 500;
101
- // margin-block: 4px;
102
- margin-inline: -4px;
103
- margin-top: -4px;
104
- margin-bottom: 4px;
105
- gap: var(--space-m);
106
- justify-content: space-between;
107
-
108
- &:not(:first-child) {
109
- border-top: 1px solid var(--color-border);
110
- }
111
-
112
- .vui-dropdown-title-end {
113
- font-size: var(--font-size-s);
114
- font-weight: 400;
115
- color: var(--color-text-lighter);
116
- }
117
- }
1
+ .vui-dropdown-trigger-wrap {
2
+ // display: inline-block;
3
+ width: fit-content;
4
+ }
5
+
6
+ .vui-dropdown {
7
+ min-width: 156px;
8
+ border-radius: var(--border-radius-m);
9
+ border: 1px solid var(--color-border);
10
+ padding: 4px;
11
+ }
12
+
13
+ .vui-dropdown-title {
14
+ position: relative;
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: flex-start;
18
+ padding-block: var(--space-s);
19
+ padding-inline: calc(var(--space-s) + 4px);
20
+ font-size: var(--font-size-ms);
21
+ border-bottom: 1px solid var(--color-border);
22
+ font-weight: 500;
23
+ // margin-block: 4px;
24
+ margin-inline: -4px;
25
+ margin-top: -4px;
26
+ margin-bottom: 4px;
27
+ gap: var(--space-m);
28
+ justify-content: space-between;
29
+
30
+ &:not(:first-child) {
31
+ border-top: 1px solid var(--color-border);
32
+ }
33
+
34
+ .vui-dropdown-title-end {
35
+ font-size: var(--font-size-s);
36
+ font-weight: 400;
37
+ color: var(--color-text-lighter);
38
+ }
39
+ }
@@ -1,106 +1,113 @@
1
- <script setup lang="ts">
2
- import type { Space } from '../../shared/types'
3
- import { computed } from 'vue'
4
-
5
- export interface FlexProps {
6
- inline?: boolean
7
- wrap?: boolean
8
- wrapReverse?: boolean
9
-
10
- row?: boolean
11
- column?: boolean
12
- rowReverse?: boolean
13
- columnReverse?: boolean
14
-
15
- gap?: Space | number
16
-
17
- // NOTE: Add more if needed
18
- justifyStart?: boolean
19
- justifyEnd?: boolean
20
- justifyCenter?: boolean
21
- spaceBetween?: boolean
22
- spaceAround?: boolean
23
- spaceEvenly?: boolean
24
-
25
- // NOTE: Add more if needed
26
- alignCenter?: boolean
27
- alignStart?: boolean
28
- alignEnd?: boolean
29
- alignBaseline?: boolean
30
-
31
- expand?: boolean
32
- }
33
-
34
- const props = defineProps<FlexProps>()
35
-
36
- // Flex gap
37
- const ag = computed(() => `var(--space-${props.gap})`)
38
-
39
- // Flex direction
40
- const ad = computed(() => {
41
- if (props.row)
42
- return 'row'
43
- else if (props.column)
44
- return 'column'
45
- else if (props.rowReverse)
46
- return 'row-reverse'
47
- else if (props.columnReverse)
48
- return 'column-reverse'
49
- else return 'row'
50
- })
51
-
52
- // Justify content
53
- const aj = computed(() => {
54
- if (props.justifyStart)
55
- return 'flex-start'
56
- else if (props.justifyEnd)
57
- return 'flex-end'
58
- else if (props.justifyCenter)
59
- return 'center'
60
- else if (props.spaceBetween)
61
- return 'space-between'
62
- else if (props.spaceEvenly)
63
- return 'space-evenly'
64
- else if (props.spaceAround)
65
- return 'space-around'
66
- else return 'flex-start'
67
- })
68
-
69
- // Align items
70
- const aA = computed(() => {
71
- if (props.alignStart)
72
- return 'flex-start'
73
- else if (props.alignEnd)
74
- return 'flex-end'
75
- else if (props.alignCenter)
76
- return 'center'
77
- else if (props.alignBaseline)
78
- return 'baseline'
79
- return 'flex-start'
80
- })
81
-
82
- const aY = computed(() => props.inline ? 'inline-flex' : 'flex')
83
- const aW = computed(() => props.wrap
84
- ? 'wrap'
85
- : props.wrapReverse
86
- ? 'wrap-reverse'
87
- : 'nowrap')
88
-
89
- const aH = computed(() => props.expand ? '100%' : 'auto')
90
- </script>
91
-
92
- <template>
93
- <div
94
- class="vui-flex" :style="{
95
- display: aY,
96
- flexWrap: aW,
97
- flexDirection: ad,
98
- justifyContent: aj,
99
- gap: ag,
100
- alignItems: aA,
101
- width: aH,
102
- }"
103
- >
104
- <slot />
105
- </div>
106
- </template>
1
+ <script setup lang="ts">
2
+ import type { Space } from '../../shared/types'
3
+ import { computed } from 'vue'
4
+ import { formatUnitValue } from '../../shared/helpers'
5
+
6
+ export interface FlexProps {
7
+ inline?: boolean
8
+ wrap?: boolean
9
+ wrapReverse?: boolean
10
+
11
+ row?: boolean
12
+ column?: boolean
13
+ rowReverse?: boolean
14
+ columnReverse?: boolean
15
+
16
+ gap?: Space | number
17
+
18
+ // NOTE: Add more if needed
19
+ justifyStart?: boolean
20
+ justifyEnd?: boolean
21
+ justifyCenter?: boolean
22
+ spaceBetween?: boolean
23
+ spaceAround?: boolean
24
+ spaceEvenly?: boolean
25
+
26
+ // NOTE: Add more if needed
27
+ alignCenter?: boolean
28
+ alignStart?: boolean
29
+ alignEnd?: boolean
30
+ alignBaseline?: boolean
31
+
32
+ expand?: boolean
33
+ }
34
+
35
+ const props = withDefaults(defineProps<FlexProps>(), {
36
+ // eslint-disable-next-line vue/require-valid-default-prop
37
+ gap: 's',
38
+ })
39
+
40
+ // Flex gap
41
+ const ag = computed(() => typeof props.gap === 'number'
42
+ ? formatUnitValue(props.gap)
43
+ : `var(--space-${props.gap})`,
44
+ )
45
+
46
+ // Flex direction
47
+ const ad = computed(() => {
48
+ if (props.row)
49
+ return 'row'
50
+ else if (props.column)
51
+ return 'column'
52
+ else if (props.rowReverse)
53
+ return 'row-reverse'
54
+ else if (props.columnReverse)
55
+ return 'column-reverse'
56
+ else return 'row'
57
+ })
58
+
59
+ // Justify content
60
+ const aj = computed(() => {
61
+ if (props.justifyStart)
62
+ return 'flex-start'
63
+ else if (props.justifyEnd)
64
+ return 'flex-end'
65
+ else if (props.justifyCenter)
66
+ return 'center'
67
+ else if (props.spaceBetween)
68
+ return 'space-between'
69
+ else if (props.spaceEvenly)
70
+ return 'space-evenly'
71
+ else if (props.spaceAround)
72
+ return 'space-around'
73
+ else return 'flex-start'
74
+ })
75
+
76
+ // Align items
77
+ const aA = computed(() => {
78
+ if (props.alignStart)
79
+ return 'flex-start'
80
+ else if (props.alignEnd)
81
+ return 'flex-end'
82
+ else if (props.alignCenter)
83
+ return 'center'
84
+ else if (props.alignBaseline)
85
+ return 'baseline'
86
+ return 'flex-start'
87
+ })
88
+
89
+ const aY = computed(() => props.inline ? 'inline-flex' : 'flex')
90
+ const aW = computed(() => props.wrap
91
+ ? 'wrap'
92
+ : props.wrapReverse
93
+ ? 'wrap-reverse'
94
+ : 'nowrap')
95
+
96
+ const aH = computed(() => props.expand ? '100%' : 'auto')
97
+ </script>
98
+
99
+ <template>
100
+ <div
101
+ class="vui-flex" :style="{
102
+ display: aY,
103
+ flexWrap: aW,
104
+ flexDirection: ad,
105
+ justifyContent: aj,
106
+ gap: ag,
107
+ alignItems: aA,
108
+ width: aH,
109
+ }"
110
+ >
111
+ <slot />
112
+ </div>
113
+ </template>
@@ -1,54 +1,60 @@
1
- <script setup lang="ts">
2
- import type { Space } from '../../shared/types'
3
- import { computed } from 'vue'
4
- import { createArray } from '../../shared/helpers'
5
-
6
- /**
7
- * This component is not meant for complex grids
8
- */
9
-
10
- interface Props {
11
- inline?: boolean
12
- gap?: Space | number
13
- rows?: number | string
14
- columns?: number | string
15
- areas?: string[]
16
- }
17
-
18
- const props = defineProps<Props>()
19
-
20
- const ag = computed(() => `var(--space-${props.gap})`)
21
-
22
- const aTC = computed(() => {
23
- if (typeof props.columns === 'number') {
24
- return createArray(props.columns)
25
- .map(() => '1fr')
26
- .join(' ')
27
- }
28
- return props.columns ?? 'none'
29
- })
30
-
31
- const aTR = computed(() => {
32
- if (typeof props.rows === 'number') {
33
- return createArray(props.rows || 1)
34
- .map(() => '')
35
- .join('1fr')
36
- }
37
- return props.rows ?? 'none'
38
- })
39
-
40
- const aD = computed(() => props.inline ? 'inline-grid' : 'grid')
41
- </script>
42
-
43
- <template>
44
- <div
45
- class="vui-grid" :style="{
46
- display: aD,
47
- gap: ag,
48
- gridTemplateColumns: aTC,
49
- gridTemplateRows: aTR,
50
- }"
51
- >
52
- <slot />
53
- </div>
54
- </template>
1
+ <script setup lang="ts">
2
+ import type { Space } from '../../shared/types'
3
+ import { computed } from 'vue'
4
+ import { createArray, formatUnitValue } from '../../shared/helpers'
5
+
6
+ /**
7
+ * This component is not meant for complex grids
8
+ */
9
+
10
+ interface Props {
11
+ inline?: boolean
12
+ gap?: Space | number
13
+ rows?: number | string
14
+ columns?: number | string
15
+ areas?: string[]
16
+ }
17
+
18
+ const props = withDefaults(defineProps<Props>(), {
19
+ // eslint-disable-next-line vue/require-valid-default-prop
20
+ gap: 's',
21
+ })
22
+
23
+ const ag = computed(() => typeof props.gap === 'number'
24
+ ? formatUnitValue(props.gap)
25
+ : `var(--space-${props.gap})`,
26
+ )
27
+
28
+ const aTC = computed(() => {
29
+ if (typeof props.columns === 'number') {
30
+ return createArray(props.columns)
31
+ .map(() => '1fr')
32
+ .join(' ')
33
+ }
34
+ return props.columns ?? 'none'
35
+ })
36
+
37
+ const aTR = computed(() => {
38
+ if (typeof props.rows === 'number') {
39
+ return createArray(props.rows || 1)
40
+ .map(() => '')
41
+ .join('1fr')
42
+ }
43
+ return props.rows ?? 'none'
44
+ })
45
+
46
+ const aD = computed(() => props.inline ? 'inline-grid' : 'grid')
47
+ </script>
48
+
49
+ <template>
50
+ <div
51
+ class="vui-grid" :style="{
52
+ display: aD,
53
+ gap: ag,
54
+ gridTemplateColumns: aTC,
55
+ gridTemplateRows: aTR,
56
+ }"
57
+ >
58
+ <slot />
59
+ </div>
60
+ </template>
@@ -1,70 +1,70 @@
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 Input from './Input.vue'
6
-
7
- type Props = Omit<InputProps, 'type'> & {
8
- incrementBy?: number
9
- incrementEnabled?: boolean
10
- hideIncrement?: boolean
11
- decrementBy?: number
12
- decrementEnabled?: boolean
13
- hideDecrement?: boolean
14
- }
15
-
16
- const {
17
- incrementBy = 1,
18
- incrementEnabled = true,
19
- hideIncrement = false,
20
- decrementBy = 1,
21
- decrementEnabled = true,
22
- hideDecrement = false,
23
- ...inputProps
24
- } = defineProps<Props>()
25
-
26
- const count = defineModel<number>({
27
- default: 0,
28
- })
29
- </script>
30
-
31
- <template>
32
- <Input v-bind="inputProps" v-model.number="count" type="number">
33
- <template v-if="!hideDecrement" #start>
34
- <Button key="decrease" :disabled="!decrementEnabled" size="s" @click="count -= decrementBy">
35
- <Icon icon="ph:minus" /> {{ decrementBy > 1 ? decrementBy : '' }}
36
- </Button>
37
- </template>
38
-
39
- <template v-if="!hideIncrement" #end>
40
- <Button key="increase" :disabled="!incrementEnabled" size="s" @click="count += incrementBy">
41
- <Icon icon="ph:plus" /> {{ incrementBy > 1 ? incrementBy : '' }}
42
- </Button>
43
- </template>
44
- </Input>
45
- </template>
46
-
47
- <style scoped lang="scss">
48
- :deep(.vui-input-style) {
49
- padding-inline: 4px !important;
50
- gap: 8px !important;
51
- }
52
-
53
- :deep(.vui-button) {
54
- padding-inline: 2px !important;
55
- }
56
-
57
- :deep(input) {
58
- text-align: center;
59
-
60
- ::-webkit-outer-spin-button,
61
- ::-webkit-inner-spin-button {
62
- -webkit-appearance: none;
63
- margin: 0;
64
- }
65
-
66
- /* Firefox */
67
- -moz-appearance: textfield;
68
- appearance: textfield;
69
- }
70
- </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 Input from './Input.vue'
6
+
7
+ type Props = Omit<InputProps, 'type'> & {
8
+ incrementBy?: number
9
+ incrementEnabled?: boolean
10
+ hideIncrement?: boolean
11
+ decrementBy?: number
12
+ decrementEnabled?: boolean
13
+ hideDecrement?: boolean
14
+ }
15
+
16
+ const {
17
+ incrementBy = 1,
18
+ incrementEnabled = true,
19
+ hideIncrement = false,
20
+ decrementBy = 1,
21
+ decrementEnabled = true,
22
+ hideDecrement = false,
23
+ ...inputProps
24
+ } = defineProps<Props>()
25
+
26
+ const count = defineModel<number>({
27
+ default: 0,
28
+ })
29
+ </script>
30
+
31
+ <template>
32
+ <Input v-bind="inputProps" v-model.number="count" type="number">
33
+ <template v-if="!hideDecrement" #start>
34
+ <Button key="decrease" :disabled="!decrementEnabled" size="s" @click="count -= decrementBy">
35
+ <Icon icon="ph:minus" /> {{ decrementBy > 1 ? decrementBy : '' }}
36
+ </Button>
37
+ </template>
38
+
39
+ <template v-if="!hideIncrement" #end>
40
+ <Button key="increase" :disabled="!incrementEnabled" size="s" @click="count += incrementBy">
41
+ <Icon icon="ph:plus" /> {{ incrementBy > 1 ? incrementBy : '' }}
42
+ </Button>
43
+ </template>
44
+ </Input>
45
+ </template>
46
+
47
+ <style scoped lang="scss">
48
+ :deep(.vui-input-style) {
49
+ padding-inline: 4px !important;
50
+ gap: 8px !important;
51
+ }
52
+
53
+ :deep(.vui-button) {
54
+ padding-inline: 2px !important;
55
+ }
56
+
57
+ :deep(input) {
58
+ text-align: center;
59
+
60
+ ::-webkit-outer-spin-button,
61
+ ::-webkit-inner-spin-button {
62
+ -webkit-appearance: none;
63
+ margin: 0;
64
+ }
65
+
66
+ /* Firefox */
67
+ -moz-appearance: textfield;
68
+ appearance: textfield;
69
+ }
70
+ </style>