@pequity/squirrel 6.0.12 → 6.0.14

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 (69) hide show
  1. package/dist/cjs/chunks/index.js +2645 -0
  2. package/dist/cjs/chunks/p-btn.types.js +3 -0
  3. package/dist/cjs/chunks/p-select.js +2 -2
  4. package/dist/cjs/index.js +49 -52
  5. package/dist/cjs/inputClasses.js +129 -0
  6. package/dist/cjs/inputClassesMixin.js +23 -19
  7. package/dist/cjs/p-btn.js +56 -57
  8. package/dist/cjs/p-input-search.js +3 -3
  9. package/dist/cjs/useInputClasses.js +19 -18
  10. package/dist/es/chunks/index.js +2646 -0
  11. package/dist/es/chunks/p-btn.types.js +4 -0
  12. package/dist/es/chunks/p-select.js +2 -2
  13. package/dist/es/index.js +75 -78
  14. package/dist/es/inputClasses.js +129 -0
  15. package/dist/es/inputClassesMixin.js +23 -19
  16. package/dist/es/p-btn.js +56 -57
  17. package/dist/es/p-input-search.js +3 -3
  18. package/dist/es/useInputClasses.js +23 -22
  19. package/dist/squirrel/components/p-btn/p-btn.types.d.ts +2 -1
  20. package/dist/squirrel/components/p-btn/p-btn.vue.d.ts +395 -17
  21. package/dist/squirrel/components/p-dropdown-select/p-dropdown-select.vue.d.ts +30 -22
  22. package/dist/squirrel/components/p-input/p-input.vue.d.ts +11 -7
  23. package/dist/squirrel/components/p-input-number/p-input-number.vue.d.ts +11 -7
  24. package/dist/squirrel/components/p-input-percent/p-input-percent.vue.d.ts +3 -3
  25. package/dist/squirrel/components/p-input-search/p-input-search.vue.d.ts +16 -12
  26. package/dist/squirrel/components/p-select/p-select.vue.d.ts +5 -5
  27. package/dist/squirrel/components/p-select-list/p-select-list.vue.d.ts +30 -22
  28. package/dist/squirrel/components/p-table-header-cell/p-table-header-cell.vue.d.ts +1 -1
  29. package/dist/squirrel/components/p-textarea/p-textarea.vue.d.ts +11 -7
  30. package/dist/squirrel/components/p-toggle/p-toggle.vue.d.ts +11 -7
  31. package/dist/squirrel/composables/useInputClasses.d.ts +3 -3
  32. package/dist/squirrel/index.d.ts +1 -0
  33. package/dist/squirrel/utils/index.d.ts +2 -2
  34. package/dist/squirrel/utils/inputClasses.d.ts +988 -0
  35. package/dist/squirrel/utils/inputClassesMixin.d.ts +12 -8
  36. package/dist/squirrel.css +15 -22
  37. package/package.json +22 -19
  38. package/squirrel/assets/squirrel.css +1 -1
  39. package/squirrel/components/p-action-bar/p-action-bar.stories.js +1 -2
  40. package/squirrel/components/p-btn/p-btn.spec.js +1 -1
  41. package/squirrel/components/p-btn/p-btn.types.ts +3 -1
  42. package/squirrel/components/p-btn/p-btn.vue +60 -74
  43. package/squirrel/components/p-file-upload/p-file-upload.spec.js +3 -8
  44. package/squirrel/components/p-file-upload/p-file-upload.vue +6 -16
  45. package/squirrel/components/p-inline-date-picker/p-inline-date-picker.spec.js +3 -10
  46. package/squirrel/components/p-input/p-input.spec.js +3 -8
  47. package/squirrel/components/p-input-number/p-input-number.spec.js +15 -18
  48. package/squirrel/components/p-input-percent/p-input-percent.spec.js +3 -8
  49. package/squirrel/components/p-input-percent/p-input-percent.vue +3 -3
  50. package/squirrel/components/p-input-search/p-input-search.vue +4 -4
  51. package/squirrel/components/p-select/p-select.spec.js +28 -34
  52. package/squirrel/components/p-select/p-select.vue +4 -4
  53. package/squirrel/components/p-tabs/p-tabs.stories.js +2 -2
  54. package/squirrel/components/p-textarea/p-textarea.spec.js +3 -8
  55. package/squirrel/composables/useInputClasses.spec.js +138 -77
  56. package/squirrel/composables/useInputClasses.ts +25 -39
  57. package/squirrel/index.ts +1 -0
  58. package/squirrel/utils/index.ts +3 -36
  59. package/squirrel/utils/inputClasses.ts +130 -0
  60. package/squirrel/utils/inputClassesMixin.spec.js +153 -64
  61. package/squirrel/utils/inputClassesMixin.ts +26 -43
  62. package/dist/cjs/inputClassesShared.js +0 -76
  63. package/dist/es/inputClassesShared.js +0 -76
  64. package/dist/squirrel/utils/inputClassesShared.d.ts +0 -45
  65. package/squirrel/assets/file-upload-drag-over-icon.svg +0 -5
  66. package/squirrel/assets/file-upload-upload-icon.svg +0 -5
  67. package/squirrel/assets/file-upload-x-icon-hover.svg +0 -8
  68. package/squirrel/assets/file-upload-x-icon.svg +0 -8
  69. package/squirrel/utils/inputClassesShared.ts +0 -75
@@ -33,7 +33,7 @@ describe('PInputNumber.vue', () => {
33
33
 
34
34
  expect(input.exists()).toBe(true);
35
35
 
36
- expect(input.classes()).toEqual(baseClasses());
36
+ expect(input.classes()).toEqual(expect.arrayContaining(baseClasses()));
37
37
  expect(wrapper.find('label').exists()).toBe(false);
38
38
  expect(wrapper.find('input-prefix').exists()).toBe(false);
39
39
  expect(wrapper.find('div.text-xs.text-on-error.mt-1').isVisible()).toBe(false);
@@ -67,14 +67,9 @@ describe('PInputNumber.vue', () => {
67
67
  },
68
68
  });
69
69
 
70
- expect(wrapper.find('label').classes()).toEqual([
71
- 'block',
72
- 'mb-1',
73
- 'font-medium',
74
- 'text-sm',
75
- "after:content-['_*']",
76
- 'after:text-on-error',
77
- ]);
70
+ const labelClasses = ['block', 'mb-1', 'font-medium', 'text-sm', 'after:content-["_*"]', 'after:text-on-error'];
71
+
72
+ expect(wrapper.find('label').classes()).toEqual(expect.arrayContaining(labelClasses));
78
73
  });
79
74
 
80
75
  it('sets the disabled state correctly', () => {
@@ -116,15 +111,15 @@ describe('PInputNumber.vue', () => {
116
111
  },
117
112
  });
118
113
 
114
+ const res = baseClasses().map((c) => {
115
+ if (c === 'ring-p-gray-30') return 'ring-on-error';
116
+ if (c === 'hover:ring-primary') return 'hover:ring-on-error';
117
+ if (c === 'focus:ring-primary') return 'focus:ring-on-error';
118
+ return c;
119
+ });
120
+
119
121
  expect(wrapper.attributes()['data-has-error']).toBeDefined();
120
- expect(wrapper.find('input').classes().join(' ')).toEqual(
121
- baseClasses()
122
- .join(' ')
123
- .replace(
124
- 'ring-p-gray-30 hover:ring-primary focus:ring-primary',
125
- 'ring-on-error hover:ring-on-error focus:ring-on-error'
126
- )
127
- );
122
+ expect(wrapper.find('input').classes()).toEqual(expect.arrayContaining(res));
128
123
  expect(wrapper.find('div.text-xs.text-on-error.mt-1').isVisible()).toBe(true);
129
124
  });
130
125
 
@@ -138,8 +133,10 @@ describe('PInputNumber.vue', () => {
138
133
  },
139
134
  });
140
135
 
136
+ const res = baseClasses().map((c) => (c === 'pl-4' ? 'pl-8' : c));
137
+
141
138
  expect(wrapper.find('i.icon')).toBeTruthy();
142
- expect(wrapper.find('input').classes()).toEqual(baseClasses().map((c) => (c === 'pl-4' ? 'pl-8' : c)));
139
+ expect(wrapper.find('input').classes()).toEqual(expect.arrayContaining(res));
143
140
  });
144
141
 
145
142
  it('emits a number on input', async () => {
@@ -35,15 +35,10 @@ describe('PInputPercent.vue', () => {
35
35
  },
36
36
  });
37
37
 
38
+ const labelClasses = ['block', 'mb-1', 'font-medium', 'text-sm', 'after:content-["_*"]', 'after:text-on-error'];
39
+
38
40
  expect(wrapper.find('label').text()).toBe('test input');
39
- expect(wrapper.find('label').classes()).toEqual([
40
- 'block',
41
- 'mb-1',
42
- 'font-medium',
43
- 'text-sm',
44
- "after:content-['_*']",
45
- 'after:text-on-error',
46
- ]);
41
+ expect(wrapper.find('label').classes()).toEqual(expect.arrayContaining(labelClasses));
47
42
  expect(wrapper.find('div.text-xs.text-on-error.mt-1').text()).toBe('error message');
48
43
  });
49
44
 
@@ -9,12 +9,12 @@
9
9
  </template>
10
10
 
11
11
  <script setup lang="ts">
12
+ import { type Size } from '@squirrel/components/p-btn/p-btn.types';
12
13
  import PInputNumber from '@squirrel/components/p-input-number/p-input-number.vue';
13
- import { type InputSize } from '@squirrel/utils/inputClassesShared';
14
14
  import { isNumber } from 'lodash-es';
15
15
  import { computed, type PropType } from 'vue';
16
16
 
17
- const prefixClasses: Record<InputSize, string> = {
17
+ const prefixClasses: Record<Size, string> = {
18
18
  sm: 'text-sm h-8 left-2',
19
19
  md: 'text-base h-10 left-3',
20
20
  lg: 'text-lg h-12 left-5',
@@ -30,7 +30,7 @@ const props = defineProps({
30
30
  default: null,
31
31
  },
32
32
  size: {
33
- type: String as PropType<InputSize>,
33
+ type: String as PropType<Size>,
34
34
  default: 'md',
35
35
  },
36
36
  });
@@ -33,8 +33,8 @@
33
33
  </template>
34
34
 
35
35
  <script lang="ts">
36
+ import { type Size, SIZES } from '@squirrel/components/p-btn/p-btn.types';
36
37
  import PInput from '@squirrel/components/p-input/p-input.vue';
37
- import { INPUT_SIZES, type InputSize } from '@squirrel/utils/inputClassesShared';
38
38
  import { defineComponent, type PropType } from 'vue';
39
39
 
40
40
  type PInputInstance = InstanceType<typeof PInput>;
@@ -51,10 +51,10 @@ export default defineComponent({
51
51
  default: '',
52
52
  },
53
53
  size: {
54
- type: String as PropType<InputSize>,
54
+ type: String as PropType<Size>,
55
55
  default: 'md',
56
- validator(value: InputSize) {
57
- return Object.keys(INPUT_SIZES).includes(value);
56
+ validator(value: Size) {
57
+ return SIZES.includes(value);
58
58
  },
59
59
  },
60
60
  showEnterIcon: {
@@ -3,31 +3,30 @@ 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
- 'bg-surface',
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
- 'truncate',
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',
30
- 'bg-[right_1rem_center]',
24
+ 'truncate',
25
+ 'bg-no-repeat',
26
+ 'h-10',
27
+ 'pl-4',
28
+ 'text-base',
29
+ 'bg-[position:right_1rem_center]',
31
30
  'pr-10',
32
31
  ];
33
32
 
@@ -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
- expect(wrapper.find('label').classes()).toEqual([
81
- 'block',
82
- 'mb-1',
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().join(' ')).toEqual(
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<InputSize>,
52
+ type: String as PropType<Size>,
53
53
  default: 'md',
54
- validator(value: InputSize) {
55
- return Object.keys(INPUT_SIZES).includes(value);
54
+ validator(value: Size) {
55
+ return SIZES.includes(value);
56
56
  },
57
57
  },
58
58
  itemText: {
@@ -1,4 +1,4 @@
1
- import FileUploadIcon from '@squirrel/assets/file-upload-upload-icon.svg?inline';
1
+ import PaginateRightIcon from '@squirrel/assets/pagination-right-icon.svg?inline';
2
2
  import PTabs from '@squirrel/components/p-tabs/p-tabs.vue';
3
3
  import { action } from '@storybook/addon-actions';
4
4
 
@@ -34,7 +34,7 @@ export const Default = {
34
34
  {
35
35
  title: 'Tab 2',
36
36
  name: 'tab2',
37
- icon: FileUploadIcon,
37
+ icon: PaginateRightIcon,
38
38
  },
39
39
  {
40
40
  title: 'Tab 3',
@@ -50,14 +50,9 @@ describe('PTextarea.vue', () => {
50
50
  },
51
51
  });
52
52
 
53
- expect(wrapper.find('label').classes()).toEqual([
54
- 'block',
55
- 'mb-1',
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 baseInputClasses = () =>
6
- [
7
- 'text-night',
8
- 'w-full',
9
- 'bg-surface',
10
- 'focus:outline-none',
11
- 'border-0',
12
- 'ring-1',
13
- 'ring-inset',
14
- 'focus:ring-2',
15
- 'disabled:ring-p-gray-30',
16
- 'disabled:hover:ring-p-gray-30',
17
- 'disabled:bg-p-blue-10',
18
- 'disabled:cursor-default',
19
- 'placeholder:text-p-gray-40',
20
- 'h-10',
21
- 'text-base',
22
- 'rounded',
23
- 'pl-4',
24
- 'pr-4',
25
- 'ring-p-gray-30',
26
- 'hover:ring-primary',
27
- 'focus:ring-primary',
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 baseInputClasses()
32
- .replace('h-10', 'h-8')
33
- .replace('text-base', 'text-sm')
34
- .replace('pl-4', 'pl-3')
35
- .replace('pr-4', 'pr-3')
36
- .replace('rounded', 'rounded');
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 baseInputClasses()
41
- .replace('h-10', 'h-12')
42
- .replace('text-base', 'text-lg')
43
- .replace('pl-4', 'pl-5')
44
- .replace('pr-4', 'pr-5');
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 baseLabelClasses = 'block mb-1 font-medium text-sm';
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).toBe(baseInputClasses());
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).toBe(baseInputClassesSm());
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).toBe(baseInputClassesLg());
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).toBe(baseLabelClasses);
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).toBe(baseLabelClasses.replace('text-sm', 'text-xs'));
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).toBe(baseLabelClasses.replace('text-sm', 'text-base'));
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
- expect(selectClasses.value).toBe(
104
- baseInputClasses().replace('pr-4 ', '') +
105
- ` truncate squirrel-bg-chevron-down bg-no-repeat appearance-none bg-[right_1rem_center] pr-10`
106
- );
123
+ const baseInputClasses = baseInputClassesMd().filter((item) => {
124
+ return !['pr-4', 'bg-surface'].includes(item);
125
+ });
126
+ const baseSelectClasses = [
127
+ 'appearance-none',
128
+ 'bg-[position: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
- expect(selectClasses.value).toBe(
115
- baseInputClassesSm().replace('pr-3 ', '') +
116
- ` truncate squirrel-bg-chevron-down bg-no-repeat appearance-none bg-[right_0.675rem_center] pr-8`
117
- );
144
+ const baseInputClasses = baseInputClassesSm().filter((item) => {
145
+ return !['pr-3', 'bg-surface'].includes(item);
146
+ });
147
+ const baseSelectClasses = [
148
+ 'appearance-none',
149
+ 'bg-[position: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
- expect(selectClasses.value).toBe(
126
- baseInputClassesLg().replace('pr-5 ', '') +
127
- ` truncate squirrel-bg-chevron-down bg-no-repeat appearance-none bg-[right_1.25rem_center] pr-12`
128
- );
164
+ const baseInputClasses = baseInputClassesLg().filter((item) => {
165
+ return !['pr-5', 'bg-surface'].includes(item);
166
+ });
167
+ const baseSelectClasses = [
168
+ 'appearance-none',
169
+ 'bg-[position: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).toBe(baseInputClasses() + ' resize-y px-3 py-3 overflow-auto h-auto');
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).toBe(baseInputClassesSm() + ' resize-y px-3 py-3 overflow-auto h-auto');
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).toBe(baseInputClassesLg() + ' resize-y px-3 py-3 overflow-auto h-auto');
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
- expect(inputClasses.value).toBe(
161
- baseInputClasses().replace(
162
- 'ring-p-gray-30 hover:ring-primary focus:ring-primary',
163
- 'ring-on-error hover:ring-on-error focus:ring-on-error'
164
- )
165
- );
166
- expect(errorMsgClasses.value).toBe('text-xs text-on-error mt-1');
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 the SPACING_PREFIX when prefix is true', () => {
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(SPACING_PREFIX.md);
237
+ expect(inputClasses.value.split(' ')).toContain('pl-8');
177
238
  });
178
239
 
179
- it('should apply the SPACING_SUFFIX when suffix is true', () => {
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(SPACING_SUFFIX.md);
247
+ expect(inputClasses.value.split(' ')).toContain('pr-8');
187
248
  });
188
249
 
189
- it('should apply SPACING_LEFT when prefix is false', () => {
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(SPACING_LEFT.md);
257
+ expect(inputClasses.value.split(' ')).toContain('pl-4');
197
258
  });
198
259
 
199
- it('should apply SPACING_RIGHT when suffix is false', () => {
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(SPACING_RIGHT.md);
267
+ expect(inputClasses.value.split(' ')).toContain('pr-4');
207
268
  });
208
269
  });