@pequity/squirrel 6.0.12 → 6.0.13
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.
- package/dist/cjs/chunks/index.js +2645 -0
- package/dist/cjs/chunks/p-btn.types.js +3 -0
- package/dist/cjs/chunks/p-select.js +2 -2
- package/dist/cjs/index.js +23 -31
- package/dist/cjs/inputClasses.js +127 -0
- package/dist/cjs/inputClassesMixin.js +23 -19
- package/dist/cjs/p-btn.js +56 -57
- package/dist/cjs/p-input-search.js +3 -3
- package/dist/cjs/useInputClasses.js +19 -18
- package/dist/es/chunks/index.js +2646 -0
- package/dist/es/chunks/p-btn.types.js +4 -0
- package/dist/es/chunks/p-select.js +2 -2
- package/dist/es/index.js +28 -36
- package/dist/es/inputClasses.js +127 -0
- package/dist/es/inputClassesMixin.js +23 -19
- package/dist/es/p-btn.js +56 -57
- package/dist/es/p-input-search.js +3 -3
- package/dist/es/useInputClasses.js +23 -22
- package/dist/squirrel/components/p-btn/p-btn.types.d.ts +2 -1
- package/dist/squirrel/components/p-btn/p-btn.vue.d.ts +395 -17
- package/dist/squirrel/components/p-dropdown-select/p-dropdown-select.vue.d.ts +30 -22
- package/dist/squirrel/components/p-input/p-input.vue.d.ts +11 -7
- package/dist/squirrel/components/p-input-number/p-input-number.vue.d.ts +11 -7
- package/dist/squirrel/components/p-input-percent/p-input-percent.vue.d.ts +3 -3
- package/dist/squirrel/components/p-input-search/p-input-search.vue.d.ts +16 -12
- package/dist/squirrel/components/p-select/p-select.vue.d.ts +5 -5
- package/dist/squirrel/components/p-select-list/p-select-list.vue.d.ts +30 -22
- package/dist/squirrel/components/p-textarea/p-textarea.vue.d.ts +11 -7
- package/dist/squirrel/components/p-toggle/p-toggle.vue.d.ts +11 -7
- package/dist/squirrel/composables/useInputClasses.d.ts +3 -3
- package/dist/squirrel/index.d.ts +1 -0
- package/dist/squirrel/utils/index.d.ts +2 -2
- package/dist/squirrel/utils/inputClasses.d.ts +938 -0
- package/dist/squirrel/utils/inputClassesMixin.d.ts +12 -8
- package/dist/squirrel.css +13 -13
- package/package.json +10 -7
- package/squirrel/components/p-btn/p-btn.spec.js +1 -1
- package/squirrel/components/p-btn/p-btn.types.ts +3 -1
- package/squirrel/components/p-btn/p-btn.vue +60 -74
- package/squirrel/components/p-file-upload/p-file-upload.spec.js +3 -8
- package/squirrel/components/p-inline-date-picker/p-inline-date-picker.spec.js +3 -10
- package/squirrel/components/p-input/p-input.spec.js +3 -8
- package/squirrel/components/p-input-number/p-input-number.spec.js +15 -18
- package/squirrel/components/p-input-percent/p-input-percent.spec.js +3 -8
- package/squirrel/components/p-input-percent/p-input-percent.vue +3 -3
- package/squirrel/components/p-input-search/p-input-search.vue +4 -4
- package/squirrel/components/p-select/p-select.spec.js +27 -33
- package/squirrel/components/p-select/p-select.vue +4 -4
- package/squirrel/components/p-textarea/p-textarea.spec.js +3 -8
- package/squirrel/composables/useInputClasses.spec.js +138 -77
- package/squirrel/composables/useInputClasses.ts +25 -39
- package/squirrel/index.ts +1 -0
- package/squirrel/utils/index.ts +3 -36
- package/squirrel/utils/inputClasses.ts +128 -0
- package/squirrel/utils/inputClassesMixin.spec.js +153 -64
- package/squirrel/utils/inputClassesMixin.ts +26 -43
- package/dist/cjs/inputClassesShared.js +0 -76
- package/dist/es/inputClassesShared.js +0 -76
- package/dist/squirrel/utils/inputClassesShared.d.ts +0 -45
- package/squirrel/utils/inputClassesShared.ts +0 -75
|
@@ -3,30 +3,29 @@ import { createWrapperFor, sleep, waitNT } from '@tests/vitest.helpers';
|
|
|
3
3
|
import { cloneDeep } from 'lodash-es';
|
|
4
4
|
|
|
5
5
|
const baseClasses = () => [
|
|
6
|
-
'text-night',
|
|
7
6
|
'w-full',
|
|
8
|
-
'
|
|
9
|
-
'focus:outline-none',
|
|
7
|
+
'rounded',
|
|
10
8
|
'border-0',
|
|
9
|
+
'text-night',
|
|
11
10
|
'ring-1',
|
|
12
11
|
'ring-inset',
|
|
13
|
-
'focus:ring-2',
|
|
14
|
-
'disabled:ring-p-gray-30',
|
|
15
|
-
'disabled:hover:ring-p-gray-30',
|
|
16
|
-
'disabled:bg-p-blue-10',
|
|
17
|
-
'disabled:cursor-default',
|
|
18
|
-
'placeholder:text-p-gray-40',
|
|
19
|
-
'h-10',
|
|
20
|
-
'text-base',
|
|
21
|
-
'rounded',
|
|
22
|
-
'pl-4',
|
|
23
12
|
'ring-p-gray-30',
|
|
13
|
+
'placeholder:text-p-gray-40',
|
|
24
14
|
'hover:ring-primary',
|
|
15
|
+
'focus:outline-none',
|
|
16
|
+
'focus:ring-2',
|
|
25
17
|
'focus:ring-primary',
|
|
26
|
-
'
|
|
18
|
+
'disabled:cursor-default',
|
|
19
|
+
'disabled:bg-p-blue-10',
|
|
20
|
+
'disabled:ring-p-gray-30',
|
|
21
|
+
'disabled:hover:ring-p-gray-30',
|
|
27
22
|
'squirrel-bg-chevron-down',
|
|
28
|
-
'bg-no-repeat',
|
|
29
23
|
'appearance-none',
|
|
24
|
+
'truncate',
|
|
25
|
+
'bg-no-repeat',
|
|
26
|
+
'h-10',
|
|
27
|
+
'pl-4',
|
|
28
|
+
'text-base',
|
|
30
29
|
'bg-[right_1rem_center]',
|
|
31
30
|
'pr-10',
|
|
32
31
|
];
|
|
@@ -44,7 +43,7 @@ describe('PSelect.vue', () => {
|
|
|
44
43
|
const select = wrapper.find('select');
|
|
45
44
|
|
|
46
45
|
expect(select.exists()).toBe(true);
|
|
47
|
-
expect(select.classes()).toEqual(baseClasses());
|
|
46
|
+
expect(select.classes()).toEqual(expect.arrayContaining(baseClasses()));
|
|
48
47
|
expect(wrapper.find('label').exists()).toBe(false);
|
|
49
48
|
expect(wrapper.find('div.text-xs.text-on-error.mt-1').isVisible()).toBe(false);
|
|
50
49
|
});
|
|
@@ -69,7 +68,7 @@ describe('PSelect.vue', () => {
|
|
|
69
68
|
expect(wrapper.classes()).toContain('hidden');
|
|
70
69
|
});
|
|
71
70
|
|
|
72
|
-
it('adds the required class when the required prop is set', () => {
|
|
71
|
+
it('adds the required class 2 when the required prop is set', () => {
|
|
73
72
|
const wrapper = createWrapperFor(PSelect, {
|
|
74
73
|
props: {
|
|
75
74
|
label: 'test select',
|
|
@@ -77,14 +76,9 @@ describe('PSelect.vue', () => {
|
|
|
77
76
|
},
|
|
78
77
|
});
|
|
79
78
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
'font-medium',
|
|
84
|
-
'text-sm',
|
|
85
|
-
"after:content-['_*']",
|
|
86
|
-
'after:text-on-error',
|
|
87
|
-
]);
|
|
79
|
+
const labelClasses = ['block', 'mb-1', 'font-medium', 'text-sm', 'after:content-["_*"]', 'after:text-on-error'];
|
|
80
|
+
|
|
81
|
+
expect(wrapper.find('label').classes()).toEqual(expect.arrayContaining(labelClasses));
|
|
88
82
|
});
|
|
89
83
|
|
|
90
84
|
it('sets the disabled state correctly', () => {
|
|
@@ -108,15 +102,15 @@ describe('PSelect.vue', () => {
|
|
|
108
102
|
},
|
|
109
103
|
});
|
|
110
104
|
|
|
105
|
+
const res = baseClasses().map((c) => {
|
|
106
|
+
if (c === 'ring-p-gray-30') return 'ring-on-error';
|
|
107
|
+
if (c === 'hover:ring-primary') return 'hover:ring-on-error';
|
|
108
|
+
if (c === 'focus:ring-primary') return 'focus:ring-on-error';
|
|
109
|
+
return c;
|
|
110
|
+
});
|
|
111
|
+
|
|
111
112
|
expect(wrapper.attributes()['data-has-error']).toBeDefined();
|
|
112
|
-
expect(wrapper.find('select').classes().
|
|
113
|
-
baseClasses()
|
|
114
|
-
.join(' ')
|
|
115
|
-
.replace(
|
|
116
|
-
'ring-p-gray-30 hover:ring-primary focus:ring-primary',
|
|
117
|
-
'ring-on-error hover:ring-on-error focus:ring-on-error'
|
|
118
|
-
)
|
|
119
|
-
);
|
|
113
|
+
expect(wrapper.find('select').classes()).toEqual(expect.arrayContaining(res));
|
|
120
114
|
expect(wrapper.find('div.text-xs.text-on-error.mt-1').isVisible()).toBe(true);
|
|
121
115
|
});
|
|
122
116
|
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
</template>
|
|
16
16
|
|
|
17
17
|
<script setup lang="ts">
|
|
18
|
+
import { type Size, SIZES } from '@squirrel/components/p-btn/p-btn.types';
|
|
18
19
|
import { useInputClasses } from '@squirrel/composables/useInputClasses';
|
|
19
|
-
import { INPUT_SIZES, type InputSize } from '@squirrel/utils/inputClassesShared';
|
|
20
20
|
import { type PropType, type StyleValue } from 'vue';
|
|
21
21
|
import { computed, useAttrs } from 'vue';
|
|
22
22
|
|
|
@@ -49,10 +49,10 @@ const props = defineProps({
|
|
|
49
49
|
default: false,
|
|
50
50
|
},
|
|
51
51
|
size: {
|
|
52
|
-
type: String as PropType<
|
|
52
|
+
type: String as PropType<Size>,
|
|
53
53
|
default: 'md',
|
|
54
|
-
validator(value:
|
|
55
|
-
return
|
|
54
|
+
validator(value: Size) {
|
|
55
|
+
return SIZES.includes(value);
|
|
56
56
|
},
|
|
57
57
|
},
|
|
58
58
|
itemText: {
|
|
@@ -50,14 +50,9 @@ describe('PTextarea.vue', () => {
|
|
|
50
50
|
},
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
'font-medium',
|
|
57
|
-
'text-sm',
|
|
58
|
-
"after:content-['_*']",
|
|
59
|
-
'after:text-on-error',
|
|
60
|
-
]);
|
|
53
|
+
const labelClasses = ['block', 'mb-1', 'font-medium', 'text-sm', 'after:content-["_*"]', 'after:text-on-error'];
|
|
54
|
+
|
|
55
|
+
expect(wrapper.find('label').classes()).toEqual(expect.arrayContaining(labelClasses));
|
|
61
56
|
});
|
|
62
57
|
|
|
63
58
|
it('sets the disabled state correctly', () => {
|
|
@@ -1,50 +1,57 @@
|
|
|
1
1
|
import { useInputClasses } from '@squirrel/composables/useInputClasses';
|
|
2
|
-
import { SPACING_LEFT, SPACING_PREFIX, SPACING_RIGHT, SPACING_SUFFIX } from '@squirrel/utils/inputClassesShared';
|
|
3
2
|
import { reactive } from 'vue';
|
|
4
3
|
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
].join(' ');
|
|
4
|
+
const baseInputClassesMd = () => [
|
|
5
|
+
'text-night',
|
|
6
|
+
'w-full',
|
|
7
|
+
'bg-surface',
|
|
8
|
+
'focus:outline-none',
|
|
9
|
+
'border-0',
|
|
10
|
+
'ring-1',
|
|
11
|
+
'ring-inset',
|
|
12
|
+
'focus:ring-2',
|
|
13
|
+
'disabled:ring-p-gray-30',
|
|
14
|
+
'disabled:hover:ring-p-gray-30',
|
|
15
|
+
'disabled:bg-p-blue-10',
|
|
16
|
+
'disabled:cursor-default',
|
|
17
|
+
'placeholder:text-p-gray-40',
|
|
18
|
+
'h-10',
|
|
19
|
+
'text-base',
|
|
20
|
+
'rounded',
|
|
21
|
+
'pl-4',
|
|
22
|
+
'pr-4',
|
|
23
|
+
'ring-p-gray-30',
|
|
24
|
+
'hover:ring-primary',
|
|
25
|
+
'focus:ring-primary',
|
|
26
|
+
];
|
|
29
27
|
|
|
30
28
|
const baseInputClassesSm = () => {
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
return baseInputClassesMd().map((item) => {
|
|
30
|
+
return (
|
|
31
|
+
{
|
|
32
|
+
'h-10': 'h-8',
|
|
33
|
+
'text-base': 'text-sm',
|
|
34
|
+
'pl-4': 'pl-3',
|
|
35
|
+
'pr-4': 'pr-3',
|
|
36
|
+
}[item] || item
|
|
37
|
+
);
|
|
38
|
+
});
|
|
37
39
|
};
|
|
38
40
|
|
|
39
41
|
const baseInputClassesLg = () => {
|
|
40
|
-
return
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
return baseInputClassesMd().map((item) => {
|
|
43
|
+
return (
|
|
44
|
+
{
|
|
45
|
+
'h-10': 'h-12',
|
|
46
|
+
'text-base': 'text-lg',
|
|
47
|
+
'pl-4': 'pl-5',
|
|
48
|
+
'pr-4': 'pr-5',
|
|
49
|
+
}[item] || item
|
|
50
|
+
);
|
|
51
|
+
});
|
|
45
52
|
};
|
|
46
53
|
|
|
47
|
-
const
|
|
54
|
+
const baseLabelClassesMd = ['block', 'mb-1', 'font-medium', 'text-sm'];
|
|
48
55
|
|
|
49
56
|
describe('useInputClasses', () => {
|
|
50
57
|
it('generates input classes md', () => {
|
|
@@ -52,7 +59,7 @@ describe('useInputClasses', () => {
|
|
|
52
59
|
|
|
53
60
|
const { inputClasses } = useInputClasses(props);
|
|
54
61
|
|
|
55
|
-
expect(inputClasses.value).
|
|
62
|
+
expect(inputClasses.value.split(' ')).toEqual(expect.arrayContaining(baseInputClassesMd()));
|
|
56
63
|
});
|
|
57
64
|
|
|
58
65
|
it('generates input classes sm', () => {
|
|
@@ -60,7 +67,7 @@ describe('useInputClasses', () => {
|
|
|
60
67
|
|
|
61
68
|
const { inputClasses } = useInputClasses(props);
|
|
62
69
|
|
|
63
|
-
expect(inputClasses.value).
|
|
70
|
+
expect(inputClasses.value.split(' ')).toEqual(expect.arrayContaining(baseInputClassesSm()));
|
|
64
71
|
});
|
|
65
72
|
|
|
66
73
|
it('generates input classes lg', () => {
|
|
@@ -68,7 +75,7 @@ describe('useInputClasses', () => {
|
|
|
68
75
|
|
|
69
76
|
const { inputClasses } = useInputClasses(props);
|
|
70
77
|
|
|
71
|
-
expect(inputClasses.value).
|
|
78
|
+
expect(inputClasses.value.split(' ')).toEqual(expect.arrayContaining(baseInputClassesLg()));
|
|
72
79
|
});
|
|
73
80
|
|
|
74
81
|
it('generates label classes md', () => {
|
|
@@ -76,133 +83,187 @@ describe('useInputClasses', () => {
|
|
|
76
83
|
|
|
77
84
|
const { labelClasses } = useInputClasses(props);
|
|
78
85
|
|
|
79
|
-
expect(labelClasses.value).
|
|
86
|
+
expect(labelClasses.value.split(' ')).toEqual(expect.arrayContaining(baseLabelClassesMd));
|
|
80
87
|
});
|
|
81
88
|
|
|
82
89
|
it('generates label classes sm', () => {
|
|
83
90
|
const props = reactive({ size: 'sm' });
|
|
84
91
|
|
|
85
92
|
const { labelClasses } = useInputClasses(props);
|
|
93
|
+
const baseLabelClasses = baseLabelClassesMd.map((item) => {
|
|
94
|
+
return (
|
|
95
|
+
{
|
|
96
|
+
'text-sm': 'text-xs',
|
|
97
|
+
}[item] || item
|
|
98
|
+
);
|
|
99
|
+
});
|
|
86
100
|
|
|
87
|
-
expect(labelClasses.value
|
|
101
|
+
expect(labelClasses.value.split(' ')).toEqual(expect.arrayContaining(baseLabelClasses));
|
|
88
102
|
});
|
|
89
103
|
|
|
90
104
|
it('generates label classes lg', () => {
|
|
91
105
|
const props = reactive({ size: 'lg' });
|
|
92
106
|
|
|
93
107
|
const { labelClasses } = useInputClasses(props);
|
|
108
|
+
const baseLabelClassesLg = baseLabelClassesMd.map((item) => {
|
|
109
|
+
return (
|
|
110
|
+
{
|
|
111
|
+
'text-sm': 'text-base',
|
|
112
|
+
}[item] || item
|
|
113
|
+
);
|
|
114
|
+
});
|
|
94
115
|
|
|
95
|
-
expect(labelClasses.value
|
|
116
|
+
expect(labelClasses.value.split(' ')).toEqual(expect.arrayContaining(baseLabelClassesLg));
|
|
96
117
|
});
|
|
97
118
|
|
|
98
119
|
it('generates select classes md', () => {
|
|
99
120
|
const props = reactive({ size: 'md' });
|
|
100
121
|
|
|
101
122
|
const { selectClasses } = useInputClasses(props);
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
123
|
+
const baseInputClasses = baseInputClassesMd().filter((item) => {
|
|
124
|
+
return !['pr-4', 'bg-surface'].includes(item);
|
|
125
|
+
});
|
|
126
|
+
const baseSelectClasses = [
|
|
127
|
+
'appearance-none',
|
|
128
|
+
'bg-[right_1rem_center]',
|
|
129
|
+
'bg-no-repeat',
|
|
130
|
+
'pr-10',
|
|
131
|
+
'squirrel-bg-chevron-down',
|
|
132
|
+
'truncate',
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
const res = baseInputClasses.concat(baseSelectClasses);
|
|
136
|
+
|
|
137
|
+
expect(selectClasses.value.split(' ')).toEqual(expect.arrayContaining(res));
|
|
107
138
|
});
|
|
108
139
|
|
|
109
140
|
it('generates select classes sm', () => {
|
|
110
141
|
const props = reactive({ size: 'sm' });
|
|
111
142
|
|
|
112
143
|
const { selectClasses } = useInputClasses(props);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
144
|
+
const baseInputClasses = baseInputClassesSm().filter((item) => {
|
|
145
|
+
return !['pr-3', 'bg-surface'].includes(item);
|
|
146
|
+
});
|
|
147
|
+
const baseSelectClasses = [
|
|
148
|
+
'appearance-none',
|
|
149
|
+
'bg-[right_0.675rem_center]',
|
|
150
|
+
'bg-no-repeat',
|
|
151
|
+
'pr-8',
|
|
152
|
+
'squirrel-bg-chevron-down',
|
|
153
|
+
'truncate',
|
|
154
|
+
];
|
|
155
|
+
const res = baseInputClasses.concat(baseSelectClasses);
|
|
156
|
+
|
|
157
|
+
expect(selectClasses.value.split(' ')).toEqual(expect.arrayContaining(res));
|
|
118
158
|
});
|
|
119
159
|
|
|
120
160
|
it('generates select classes lg', () => {
|
|
121
161
|
const props = reactive({ size: 'lg' });
|
|
122
162
|
|
|
123
163
|
const { selectClasses } = useInputClasses(props);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
164
|
+
const baseInputClasses = baseInputClassesLg().filter((item) => {
|
|
165
|
+
return !['pr-5', 'bg-surface'].includes(item);
|
|
166
|
+
});
|
|
167
|
+
const baseSelectClasses = [
|
|
168
|
+
'appearance-none',
|
|
169
|
+
'bg-[right_1.25rem_center]',
|
|
170
|
+
'bg-no-repeat',
|
|
171
|
+
'pr-12',
|
|
172
|
+
'squirrel-bg-chevron-down',
|
|
173
|
+
'truncate',
|
|
174
|
+
];
|
|
175
|
+
const res = baseInputClasses.concat(baseSelectClasses);
|
|
176
|
+
|
|
177
|
+
expect(selectClasses.value.split(' ')).toEqual(expect.arrayContaining(res));
|
|
129
178
|
});
|
|
130
179
|
|
|
131
180
|
it('generates textarea classes md', () => {
|
|
132
181
|
const props = reactive({ size: 'md' });
|
|
133
182
|
|
|
134
183
|
const { textareaClasses } = useInputClasses(props);
|
|
184
|
+
const baseInputClasses = baseInputClassesMd().filter((item) => {
|
|
185
|
+
return !['pl-3', 'pr-3', 'h-10'].includes(item);
|
|
186
|
+
});
|
|
187
|
+
const res = baseInputClasses.concat(['resize-y', 'px-3', 'py-3', 'overflow-auto', 'h-auto']);
|
|
135
188
|
|
|
136
|
-
expect(textareaClasses.value
|
|
189
|
+
expect(textareaClasses.value.split(' ')).toEqual(expect.arrayContaining(res));
|
|
137
190
|
});
|
|
138
191
|
|
|
139
192
|
it('generates textarea classes sm', () => {
|
|
140
193
|
const props = reactive({ size: 'sm' });
|
|
141
194
|
|
|
142
195
|
const { textareaClasses } = useInputClasses(props);
|
|
196
|
+
const baseInputClasses = baseInputClassesSm().filter((item) => {
|
|
197
|
+
return !['pr-3', 'pl-3', 'h-8', 'text-sm'].includes(item);
|
|
198
|
+
});
|
|
199
|
+
const res = baseInputClasses.concat(['resize-y', 'px-3', 'py-3', 'overflow-auto', 'h-auto', 'pr-4', 'pl-4']);
|
|
143
200
|
|
|
144
|
-
expect(textareaClasses.value
|
|
201
|
+
expect(textareaClasses.value.split(' ')).toEqual(expect.arrayContaining(res));
|
|
145
202
|
});
|
|
146
203
|
|
|
147
204
|
it('generates textarea classes lg', () => {
|
|
148
205
|
const props = reactive({ size: 'lg' });
|
|
149
206
|
|
|
150
207
|
const { textareaClasses } = useInputClasses(props);
|
|
208
|
+
const baseInputClasses = baseInputClassesLg().filter((item) => {
|
|
209
|
+
return !['pr-5', 'pl-5', 'h-12', 'text-lg'].includes(item);
|
|
210
|
+
});
|
|
211
|
+
const res = baseInputClasses.concat(['resize-y', 'px-3', 'py-3', 'overflow-auto', 'h-auto', 'pr-4', 'pl-4']);
|
|
151
212
|
|
|
152
|
-
expect(textareaClasses.value
|
|
213
|
+
expect(textareaClasses.value.split(' ')).toEqual(expect.arrayContaining(res));
|
|
153
214
|
});
|
|
154
215
|
|
|
155
216
|
it('generates error classes', () => {
|
|
156
217
|
const props = reactive({ size: 'md', errorMsg: 'Test error' });
|
|
157
218
|
|
|
158
219
|
const { inputClasses, errorMsgClasses } = useInputClasses(props);
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
);
|
|
166
|
-
expect(errorMsgClasses.value).
|
|
220
|
+
const resInputClasses = baseInputClassesMd()
|
|
221
|
+
.filter((item) => {
|
|
222
|
+
return !['ring-p-gray-30', 'hover:ring-primary', 'focus:ring-primary'].includes(item);
|
|
223
|
+
})
|
|
224
|
+
.concat(['ring-on-error', 'hover:ring-on-error', 'focus:ring-on-error']);
|
|
225
|
+
|
|
226
|
+
expect(inputClasses.value.split(' ')).toEqual(expect.arrayContaining(resInputClasses));
|
|
227
|
+
expect(errorMsgClasses.value.split(' ')).toEqual(expect.arrayContaining(['text-xs', 'text-on-error', 'mt-1']));
|
|
167
228
|
});
|
|
168
229
|
|
|
169
|
-
it('should apply
|
|
230
|
+
it('should apply left padding when prefix is true', () => {
|
|
170
231
|
const props = reactive({
|
|
171
232
|
size: 'md',
|
|
172
233
|
prefix: true,
|
|
173
234
|
});
|
|
174
235
|
const { inputClasses } = useInputClasses(props);
|
|
175
236
|
|
|
176
|
-
expect(inputClasses.value).toContain(
|
|
237
|
+
expect(inputClasses.value.split(' ')).toContain('pl-8');
|
|
177
238
|
});
|
|
178
239
|
|
|
179
|
-
it('should apply
|
|
240
|
+
it('should apply right padding when suffix is true', () => {
|
|
180
241
|
const props = reactive({
|
|
181
242
|
size: 'md',
|
|
182
243
|
suffix: true,
|
|
183
244
|
});
|
|
184
245
|
const { inputClasses } = useInputClasses(props);
|
|
185
246
|
|
|
186
|
-
expect(inputClasses.value).toContain(
|
|
247
|
+
expect(inputClasses.value.split(' ')).toContain('pr-8');
|
|
187
248
|
});
|
|
188
249
|
|
|
189
|
-
it('should apply
|
|
250
|
+
it('should apply the default left padding when prefix is false', () => {
|
|
190
251
|
const props = reactive({
|
|
191
252
|
size: 'md',
|
|
192
253
|
prefix: false,
|
|
193
254
|
});
|
|
194
255
|
const { inputClasses } = useInputClasses(props);
|
|
195
256
|
|
|
196
|
-
expect(inputClasses.value).toContain(
|
|
257
|
+
expect(inputClasses.value.split(' ')).toContain('pl-4');
|
|
197
258
|
});
|
|
198
259
|
|
|
199
|
-
it('should apply
|
|
260
|
+
it('should apply apply the default right padding when suffix is false', () => {
|
|
200
261
|
const props = reactive({
|
|
201
262
|
size: 'md',
|
|
202
263
|
suffix: false,
|
|
203
264
|
});
|
|
204
265
|
const { inputClasses } = useInputClasses(props);
|
|
205
266
|
|
|
206
|
-
expect(inputClasses.value).toContain(
|
|
267
|
+
expect(inputClasses.value.split(' ')).toContain('pr-4');
|
|
207
268
|
});
|
|
208
269
|
});
|
|
@@ -1,26 +1,13 @@
|
|
|
1
|
+
import { type Size } from '@squirrel/components/p-btn/p-btn.types';
|
|
1
2
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
INPUT_SIZES,
|
|
7
|
-
type InputSize,
|
|
8
|
-
LABEL_BASE,
|
|
9
|
-
LABEL_REQUIRED,
|
|
10
|
-
LABEL_SIZES,
|
|
11
|
-
SELECT_ARROW,
|
|
12
|
-
SELECT_BASE,
|
|
13
|
-
SELECT_SIZES,
|
|
14
|
-
SPACING_LEFT,
|
|
15
|
-
SPACING_PREFIX,
|
|
16
|
-
SPACING_RIGHT,
|
|
17
|
-
SPACING_SUFFIX,
|
|
18
|
-
TEXTAREA_BASE,
|
|
19
|
-
} from '@squirrel/utils/inputClassesShared';
|
|
3
|
+
inputClasses as tvInputClasses,
|
|
4
|
+
selectClasses as tvSelectClasses,
|
|
5
|
+
textareaClasses as tvTextareaClasses,
|
|
6
|
+
} from '@squirrel/utils/inputClasses';
|
|
20
7
|
import { computed, ref, toRefs } from 'vue';
|
|
21
8
|
|
|
22
9
|
const defaults = {
|
|
23
|
-
size: ref<
|
|
10
|
+
size: ref<Size>('md'),
|
|
24
11
|
errorMsg: ref(''),
|
|
25
12
|
required: ref(false),
|
|
26
13
|
prefix: ref(false),
|
|
@@ -29,7 +16,7 @@ const defaults = {
|
|
|
29
16
|
};
|
|
30
17
|
|
|
31
18
|
type Props = {
|
|
32
|
-
size:
|
|
19
|
+
size: Size;
|
|
33
20
|
errorMsg: string;
|
|
34
21
|
required: boolean;
|
|
35
22
|
prefix: boolean;
|
|
@@ -43,38 +30,37 @@ export function useInputClasses(props: Partial<Props>) {
|
|
|
43
30
|
const opts = { ...defaults, ...toRefs(props) } as Defaults;
|
|
44
31
|
const { size, errorMsg, required, rounded, prefix, suffix } = opts;
|
|
45
32
|
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
33
|
+
const allClasses = computed(() => {
|
|
34
|
+
const { input, label, errorMessage } = tvInputClasses({
|
|
35
|
+
size: size.value,
|
|
36
|
+
prefix: prefix.value,
|
|
37
|
+
suffix: suffix.value,
|
|
38
|
+
required: required.value,
|
|
39
|
+
error: !!errorMsg.value,
|
|
40
|
+
rounded: rounded.value,
|
|
41
|
+
});
|
|
51
42
|
|
|
52
|
-
return
|
|
43
|
+
return { input: input(), label: label(), errorMessage: errorMessage() };
|
|
53
44
|
});
|
|
54
45
|
|
|
55
|
-
const
|
|
56
|
-
const base = `${LABEL_BASE} ${LABEL_SIZES[size.value]}`;
|
|
57
|
-
const res = required.value ? `${base} ${LABEL_REQUIRED}` : base;
|
|
46
|
+
const inputClasses = computed(() => allClasses.value.input);
|
|
58
47
|
|
|
59
|
-
|
|
60
|
-
|
|
48
|
+
const labelClasses = computed(() => allClasses.value.label);
|
|
49
|
+
|
|
50
|
+
const errorMsgClasses = computed(() => allClasses.value.errorMessage);
|
|
61
51
|
|
|
62
52
|
const selectClasses = computed(() => {
|
|
63
|
-
const
|
|
64
|
-
SELECT_SIZES[size.value]
|
|
65
|
-
}`;
|
|
53
|
+
const { input } = tvSelectClasses({ size: size.value, required: required.value, error: !!errorMsg.value });
|
|
66
54
|
|
|
67
|
-
return
|
|
55
|
+
return input();
|
|
68
56
|
});
|
|
69
57
|
|
|
70
58
|
const textareaClasses = computed(() => {
|
|
71
|
-
const
|
|
59
|
+
const { input } = tvTextareaClasses({ required: required.value, error: !!errorMsg.value });
|
|
72
60
|
|
|
73
|
-
return
|
|
61
|
+
return input();
|
|
74
62
|
});
|
|
75
63
|
|
|
76
|
-
const errorMsgClasses = ref(ERROR_MSG);
|
|
77
|
-
|
|
78
64
|
return {
|
|
79
65
|
inputClasses,
|
|
80
66
|
labelClasses,
|
package/squirrel/index.ts
CHANGED
package/squirrel/utils/index.ts
CHANGED
|
@@ -1,25 +1,7 @@
|
|
|
1
|
+
import { type Size, SIZES } from '@squirrel/components/p-btn/p-btn.types';
|
|
1
2
|
import { CURRENCY_INPUT_DEFAULTS } from '@squirrel/utils/currency';
|
|
2
3
|
import { getNextActiveElement, isElement, isVisible } from '@squirrel/utils/dom';
|
|
3
4
|
import inputClassesMixin from '@squirrel/utils/inputClassesMixin';
|
|
4
|
-
import {
|
|
5
|
-
ERROR_MSG,
|
|
6
|
-
INPUT_BASE,
|
|
7
|
-
INPUT_ERROR,
|
|
8
|
-
INPUT_NORMAL,
|
|
9
|
-
INPUT_SIZES,
|
|
10
|
-
type InputSize,
|
|
11
|
-
LABEL_BASE,
|
|
12
|
-
LABEL_REQUIRED,
|
|
13
|
-
LABEL_SIZES,
|
|
14
|
-
SELECT_ARROW,
|
|
15
|
-
SELECT_BASE,
|
|
16
|
-
SELECT_SIZES,
|
|
17
|
-
SPACING_LEFT,
|
|
18
|
-
SPACING_PREFIX,
|
|
19
|
-
SPACING_RIGHT,
|
|
20
|
-
SPACING_SUFFIX,
|
|
21
|
-
TEXTAREA_BASE,
|
|
22
|
-
} from '@squirrel/utils/inputClassesShared';
|
|
23
5
|
import { setupListKeyboardNavigation } from '@squirrel/utils/listKeyboardNavigation';
|
|
24
6
|
import { toNumberOrNull } from '@squirrel/utils/number';
|
|
25
7
|
import { isObject } from '@squirrel/utils/object';
|
|
@@ -33,34 +15,19 @@ export {
|
|
|
33
15
|
Color,
|
|
34
16
|
createPagingRange,
|
|
35
17
|
CURRENCY_INPUT_DEFAULTS,
|
|
36
|
-
ERROR_MSG,
|
|
37
18
|
getColor,
|
|
38
19
|
getColorDeep,
|
|
39
20
|
getNextActiveElement,
|
|
40
21
|
getScreen,
|
|
41
|
-
INPUT_BASE,
|
|
42
|
-
INPUT_ERROR,
|
|
43
|
-
INPUT_NORMAL,
|
|
44
|
-
INPUT_SIZES,
|
|
45
22
|
inputClassesMixin,
|
|
46
|
-
InputSize,
|
|
47
23
|
isElement,
|
|
48
24
|
isObject,
|
|
49
25
|
isVisible,
|
|
50
|
-
LABEL_BASE,
|
|
51
|
-
LABEL_REQUIRED,
|
|
52
|
-
LABEL_SIZES,
|
|
53
26
|
sanitizeUrl,
|
|
54
|
-
SELECT_ARROW,
|
|
55
|
-
SELECT_BASE,
|
|
56
|
-
SELECT_SIZES,
|
|
57
27
|
setupListKeyboardNavigation,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
SPACING_RIGHT,
|
|
61
|
-
SPACING_SUFFIX,
|
|
28
|
+
Size,
|
|
29
|
+
SIZES,
|
|
62
30
|
splitStringForHighlight,
|
|
63
|
-
TEXTAREA_BASE,
|
|
64
31
|
toNumberOrNull,
|
|
65
32
|
toString,
|
|
66
33
|
};
|