@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.
Files changed (60) 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 +23 -31
  5. package/dist/cjs/inputClasses.js +127 -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 +28 -36
  14. package/dist/es/inputClasses.js +127 -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-textarea/p-textarea.vue.d.ts +11 -7
  29. package/dist/squirrel/components/p-toggle/p-toggle.vue.d.ts +11 -7
  30. package/dist/squirrel/composables/useInputClasses.d.ts +3 -3
  31. package/dist/squirrel/index.d.ts +1 -0
  32. package/dist/squirrel/utils/index.d.ts +2 -2
  33. package/dist/squirrel/utils/inputClasses.d.ts +938 -0
  34. package/dist/squirrel/utils/inputClassesMixin.d.ts +12 -8
  35. package/dist/squirrel.css +13 -13
  36. package/package.json +10 -7
  37. package/squirrel/components/p-btn/p-btn.spec.js +1 -1
  38. package/squirrel/components/p-btn/p-btn.types.ts +3 -1
  39. package/squirrel/components/p-btn/p-btn.vue +60 -74
  40. package/squirrel/components/p-file-upload/p-file-upload.spec.js +3 -8
  41. package/squirrel/components/p-inline-date-picker/p-inline-date-picker.spec.js +3 -10
  42. package/squirrel/components/p-input/p-input.spec.js +3 -8
  43. package/squirrel/components/p-input-number/p-input-number.spec.js +15 -18
  44. package/squirrel/components/p-input-percent/p-input-percent.spec.js +3 -8
  45. package/squirrel/components/p-input-percent/p-input-percent.vue +3 -3
  46. package/squirrel/components/p-input-search/p-input-search.vue +4 -4
  47. package/squirrel/components/p-select/p-select.spec.js +27 -33
  48. package/squirrel/components/p-select/p-select.vue +4 -4
  49. package/squirrel/components/p-textarea/p-textarea.spec.js +3 -8
  50. package/squirrel/composables/useInputClasses.spec.js +138 -77
  51. package/squirrel/composables/useInputClasses.ts +25 -39
  52. package/squirrel/index.ts +1 -0
  53. package/squirrel/utils/index.ts +3 -36
  54. package/squirrel/utils/inputClasses.ts +128 -0
  55. package/squirrel/utils/inputClassesMixin.spec.js +153 -64
  56. package/squirrel/utils/inputClassesMixin.ts +26 -43
  57. package/dist/cjs/inputClassesShared.js +0 -76
  58. package/dist/es/inputClassesShared.js +0 -76
  59. package/dist/squirrel/utils/inputClassesShared.d.ts +0 -45
  60. package/squirrel/utils/inputClassesShared.ts +0 -75
@@ -1,10 +1,10 @@
1
- import { type InputSize } from './inputClassesShared';
1
+ import { type Size } from '../components/p-btn/p-btn.types';
2
2
  import { type PropType } from 'vue';
3
3
  declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
4
  size: {
5
- type: PropType<InputSize>;
5
+ type: PropType<Size>;
6
6
  default: string;
7
- validator(value: InputSize): boolean;
7
+ validator(value: Size): boolean;
8
8
  };
9
9
  errorMsg: {
10
10
  type: StringConstructor;
@@ -18,18 +18,22 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
18
18
  type: BooleanConstructor;
19
19
  default: boolean;
20
20
  };
21
- }>, {}, {
22
- errorMsgClasses: string;
23
- }, {
21
+ }>, {}, {}, {
22
+ allClasses(): {
23
+ input: string;
24
+ label: string;
25
+ errorMessage: string;
26
+ };
24
27
  inputClasses(): string;
25
28
  labelClasses(): string;
29
+ errorMsgClasses(): string;
26
30
  selectClasses(): string;
27
31
  textareaClasses(): string;
28
32
  }, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
29
33
  size: {
30
- type: PropType<InputSize>;
34
+ type: PropType<Size>;
31
35
  default: string;
32
- validator(value: InputSize): boolean;
36
+ validator(value: Size): boolean;
33
37
  };
34
38
  errorMsg: {
35
39
  type: StringConstructor;
package/dist/squirrel.css CHANGED
@@ -263,77 +263,77 @@ from {
263
263
  to {
264
264
  opacity: 0;
265
265
  }
266
- }.icon.clear[data-v-2674242c] {
266
+ }.icon.clear[data-v-78b7a6f8] {
267
267
  background-image: url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_1634_880)'%3e%3cpath%20d='M16%208C16%206.41775%2015.5308%204.87104%2014.6518%203.55544C13.7727%202.23985%2012.5233%201.21447%2011.0615%200.608967C9.59966%200.00346629%207.99113%20-0.15496%206.43928%200.153721C4.88743%200.462403%203.46197%201.22433%202.34315%202.34315C1.22433%203.46197%200.462403%204.88743%200.153721%206.43928C-0.15496%207.99113%200.00346629%209.59966%200.608967%2011.0615C1.21447%2012.5233%202.23985%2013.7727%203.55544%2014.6518C4.87104%2015.5308%206.41775%2016%208%2016C10.1217%2016%2012.1566%2015.1571%2013.6569%2013.6569C15.1571%2012.1566%2016%2010.1217%2016%208ZM11.14%2010.1867C11.2642%2010.3116%2011.3339%2010.4805%2011.3339%2010.6567C11.3339%2010.8328%2011.2642%2011.0018%2011.14%2011.1267C11.078%2011.1892%2011.0043%2011.2388%2010.9231%2011.2726C10.8418%2011.3064%2010.7547%2011.3239%2010.6667%2011.3239C10.5787%2011.3239%2010.4915%2011.3064%2010.4103%2011.2726C10.329%2011.2388%2010.2553%2011.1892%2010.1933%2011.1267L8.12%209.05334C8.08809%209.02429%208.04649%209.0082%208.00334%209.0082C7.96019%209.0082%207.91858%209.02429%207.88667%209.05334L5.81334%2011.1267C5.6858%2011.2359%205.52175%2011.293%205.35397%2011.2865C5.18618%2011.28%205.02702%2011.2104%204.90829%2011.0917C4.78957%2010.973%204.72001%2010.8138%204.71353%2010.646C4.70705%2010.4783%204.76412%2010.3142%204.87334%2010.1867L6.94667%208.11334C6.97572%208.08142%206.99181%208.03982%206.99181%207.99667C6.99181%207.95352%206.97572%207.91192%206.94667%207.88L4.87334%205.80667C4.81085%205.7447%204.76126%205.67096%204.72741%205.58972C4.69356%205.50848%204.67614%205.42135%204.67614%205.33334C4.67614%205.24533%204.69356%205.15819%204.72741%205.07695C4.76126%204.99571%204.81085%204.92198%204.87334%204.86C4.99825%204.73584%205.16721%204.66614%205.34334%204.66614C5.51946%204.66614%205.68843%204.73584%205.81334%204.86L7.88667%206.93334C7.90163%206.94928%207.91971%206.96199%207.93977%206.97068C7.95984%206.97936%207.98147%206.98384%208.00334%206.98384C8.0252%206.98384%208.04684%206.97936%208.0669%206.97068C8.08697%206.96199%208.10504%206.94928%208.12%206.93334L10.1933%204.86C10.2555%204.79784%2010.3293%204.74854%2010.4105%204.7149C10.4917%204.68126%2010.5788%204.66394%2010.6667%204.66394C10.7546%204.66394%2010.8416%204.68126%2010.9228%204.7149C11.0041%204.74854%2011.0778%204.79784%2011.14%204.86C11.2022%204.92216%2011.2515%204.99596%2011.2851%205.07717C11.3188%205.15839%2011.3361%205.24543%2011.3361%205.33334C11.3361%205.42124%2011.3188%205.50829%2011.2851%205.5895C11.2515%205.67072%2011.2022%205.74451%2011.14%205.80667L9.06667%207.88C9.05073%207.89497%209.03802%207.91304%209.02933%207.93311C9.02065%207.95317%209.01616%207.97481%209.01616%207.99667C9.01616%208.01854%209.02065%208.04017%209.02933%208.06024C9.03802%208.0803%209.05073%208.09837%209.06667%208.11334L11.14%2010.1867Z'%20fill='%23A0AEC0'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_1634_880'%3e%3crect%20width='16'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
268
268
  background-position: center center;
269
269
  transition: background-image 0.4s;
270
270
  }
271
- .icon.clear-sm[data-v-2674242c] {
271
+ .icon.clear-sm[data-v-78b7a6f8] {
272
272
  background-size: 0.875rem 0.875rem;
273
273
  width: 0.875rem;
274
274
  height: 0.875rem;
275
275
  bottom: 0.5rem;
276
276
  right: 0.375rem;
277
277
  }
278
- .icon.clear-md[data-v-2674242c] {
278
+ .icon.clear-md[data-v-78b7a6f8] {
279
279
  background-size: 1rem 1rem;
280
280
  height: 1rem;
281
281
  width: 1rem;
282
282
  bottom: 0.75rem;
283
283
  right: 0.5rem;
284
284
  }
285
- .icon.clear-lg[data-v-2674242c] {
285
+ .icon.clear-lg[data-v-78b7a6f8] {
286
286
  background-size: 1rem 1rem;
287
287
  height: 1rem;
288
288
  width: 1rem;
289
289
  bottom: 1rem;
290
290
  right: 0.5rem;
291
291
  }
292
- .icon.clear[data-v-2674242c]:hover {
292
+ .icon.clear[data-v-78b7a6f8]:hover {
293
293
  background-image: url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_1634_896)'%3e%3cpath%20d='M16%208C16%206.41775%2015.5308%204.87104%2014.6518%203.55544C13.7727%202.23985%2012.5233%201.21447%2011.0615%200.608967C9.59966%200.00346629%207.99113%20-0.15496%206.43928%200.153721C4.88743%200.462403%203.46197%201.22433%202.34315%202.34315C1.22433%203.46197%200.462403%204.88743%200.153721%206.43928C-0.15496%207.99113%200.00346629%209.59966%200.608967%2011.0615C1.21447%2012.5233%202.23985%2013.7727%203.55544%2014.6518C4.87104%2015.5308%206.41775%2016%208%2016C10.1217%2016%2012.1566%2015.1571%2013.6569%2013.6569C15.1571%2012.1566%2016%2010.1217%2016%208ZM11.14%2010.1867C11.2642%2010.3116%2011.3339%2010.4805%2011.3339%2010.6567C11.3339%2010.8328%2011.2642%2011.0018%2011.14%2011.1267C11.078%2011.1892%2011.0043%2011.2388%2010.9231%2011.2726C10.8418%2011.3064%2010.7547%2011.3239%2010.6667%2011.3239C10.5787%2011.3239%2010.4915%2011.3064%2010.4103%2011.2726C10.329%2011.2388%2010.2553%2011.1892%2010.1933%2011.1267L8.12%209.05334C8.08809%209.02429%208.04649%209.0082%208.00334%209.0082C7.96019%209.0082%207.91858%209.02429%207.88667%209.05334L5.81334%2011.1267C5.6858%2011.2359%205.52175%2011.293%205.35397%2011.2865C5.18618%2011.28%205.02702%2011.2104%204.90829%2011.0917C4.78957%2010.973%204.72001%2010.8138%204.71353%2010.646C4.70705%2010.4783%204.76412%2010.3142%204.87334%2010.1867L6.94667%208.11334C6.97572%208.08142%206.99181%208.03982%206.99181%207.99667C6.99181%207.95352%206.97572%207.91192%206.94667%207.88L4.87334%205.80667C4.81085%205.7447%204.76126%205.67096%204.72741%205.58972C4.69356%205.50848%204.67614%205.42135%204.67614%205.33334C4.67614%205.24533%204.69356%205.15819%204.72741%205.07695C4.76126%204.99571%204.81085%204.92198%204.87334%204.86C4.99825%204.73584%205.16721%204.66614%205.34334%204.66614C5.51946%204.66614%205.68843%204.73584%205.81334%204.86L7.88667%206.93334C7.90163%206.94928%207.91971%206.96199%207.93977%206.97068C7.95984%206.97936%207.98147%206.98384%208.00334%206.98384C8.0252%206.98384%208.04684%206.97936%208.0669%206.97068C8.08697%206.96199%208.10504%206.94928%208.12%206.93334L10.1933%204.86C10.2555%204.79784%2010.3293%204.74854%2010.4105%204.7149C10.4917%204.68126%2010.5788%204.66394%2010.6667%204.66394C10.7546%204.66394%2010.8416%204.68126%2010.9228%204.7149C11.0041%204.74854%2011.0778%204.79784%2011.14%204.86C11.2022%204.92216%2011.2515%204.99596%2011.2851%205.07717C11.3188%205.15839%2011.3361%205.24543%2011.3361%205.33334C11.3361%205.42124%2011.3188%205.50829%2011.2851%205.5895C11.2515%205.67072%2011.2022%205.74451%2011.14%205.80667L9.06667%207.88C9.05073%207.89497%209.03802%207.91304%209.02933%207.93311C9.02065%207.95317%209.01616%207.97481%209.01616%207.99667C9.01616%208.01854%209.02065%208.04017%209.02933%208.06024C9.03802%208.0803%209.05073%208.09837%209.06667%208.11334L11.14%2010.1867Z'%20fill='%23424E6E'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_1634_896'%3e%3crect%20width='16'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
294
294
  }
295
- .icon.search[data-v-2674242c] {
295
+ .icon.search[data-v-78b7a6f8] {
296
296
  background-image: url("data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_9127_330342)'%3e%3cpath%20d='M11.705%2010.295L9.38501%208.00004C10.0193%207.0497%2010.3178%205.91467%2010.2331%204.77526C10.1484%203.63584%209.68546%202.5574%208.91771%201.71124C8.14996%200.86508%207.12147%200.299735%205.99563%200.105014C4.8698%20-0.0897079%203.71117%200.0973621%202.70383%200.636506C1.69648%201.17565%200.898177%202.03595%200.435738%203.08073C-0.0267015%204.12552%20-0.126757%205.29487%200.151467%206.40303C0.429691%207.51119%201.07024%208.4946%201.97135%209.19704C2.87246%209.89948%203.98246%2010.2807%205.12501%2010.28C6.13901%2010.2811%207.13002%209.97801%207.97001%209.41004L10.295%2011.735C10.4824%2011.9213%2010.7358%2012.0258%2011%2012.0258C11.2642%2012.0258%2011.5176%2011.9213%2011.705%2011.735C11.8018%2011.6418%2011.8788%2011.5299%2011.9314%2011.4062C11.9839%2011.2825%2012.011%2011.1495%2012.011%2011.015C12.011%2010.8806%2011.9839%2010.7476%2011.9314%2010.6239C11.8788%2010.5002%2011.8018%2010.3883%2011.705%2010.295ZM5.12501%201.50004C5.84176%201.50004%206.54241%201.71251%207.13843%202.11061C7.73445%202.50871%208.19908%203.07456%208.47359%203.73666C8.74811%204.39875%208.82019%205.12736%208.68072%205.8304C8.54125%206.53345%208.1965%207.17937%207.69004%207.68653C7.18357%208.19369%206.53813%208.53934%205.83527%208.67977C5.13242%208.82021%204.40371%208.74913%203.74125%208.47553C3.07878%208.20193%202.51228%207.73808%202.11336%207.14261C1.71444%206.54714%201.501%205.84678%201.50001%205.13004C1.50001%204.16817%201.88177%203.24562%202.56145%202.565C3.24112%201.88439%204.16314%201.50136%205.12501%201.50004Z'%20fill='%23718096'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_9127_330342'%3e%3crect%20width='12'%20height='12'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
297
297
  }
298
- .icon.search-sm[data-v-2674242c] {
298
+ .icon.search-sm[data-v-78b7a6f8] {
299
299
  background-size: 0.75rem 0.75rem;
300
300
  left: 0.5rem;
301
301
  bottom: 0.625rem;
302
302
  width: 0.75rem;
303
303
  height: 0.75rem;
304
304
  }
305
- .icon.search-md[data-v-2674242c] {
305
+ .icon.search-md[data-v-78b7a6f8] {
306
306
  background-size: 1rem 1rem;
307
307
  width: 1rem;
308
308
  height: 1rem;
309
309
  left: 0.75rem;
310
310
  bottom: 0.75rem;
311
311
  }
312
- .icon.search-lg[data-v-2674242c] {
312
+ .icon.search-lg[data-v-78b7a6f8] {
313
313
  background-size: 1rem 1rem;
314
314
  width: 1rem;
315
315
  height: 1rem;
316
316
  left: 1.125rem;
317
317
  bottom: 1rem;
318
318
  }
319
- .icon.enter[data-v-2674242c] {
319
+ .icon.enter[data-v-78b7a6f8] {
320
320
  background-image: url("data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_1627_786)'%3e%3crect%20width='24'%20height='24'%20rx='5'%20fill='%23ECF1FF'/%3e%3cpath%20d='M19.17%201.03744e-05H4.83C4.19619%20-0.00130459%203.56834%200.122398%202.98239%200.364037C2.39645%200.605676%201.86392%200.960506%201.41528%201.40822C0.966641%201.85592%200.610708%202.38772%200.367855%202.97316C0.125002%203.55861%20-1.36406e-06%204.1862%200%204.82001L0%2019.17C0%2020.451%200.508874%2021.6795%201.41467%2022.5853C2.32048%2023.4911%203.549%2024%204.83%2024H19.17C20.4502%2023.9974%2021.6772%2023.4876%2022.5824%2022.5824C23.4876%2021.6772%2023.9974%2020.4502%2024%2019.17V4.82001C23.9974%203.54075%2023.4873%202.31479%2022.5818%201.41115C21.6763%200.507508%2020.4493%207.63258e-06%2019.17%201.03744e-05ZM22%2019.17C22%2019.9206%2021.7018%2020.6404%2021.1711%2021.1711C20.6404%2021.7018%2019.9206%2022%2019.17%2022H4.83C4.07944%2022%203.35962%2021.7018%202.82889%2021.1711C2.29816%2020.6404%202%2019.9206%202%2019.17V4.82001C2.00265%204.07118%202.30197%203.35393%202.83242%202.82536C3.36286%202.29679%204.08117%202.00001%204.83%202.00001H19.17C19.9188%202.00001%2020.6371%202.29679%2021.1676%202.82536C21.698%203.35393%2021.9974%204.07118%2022%204.82001V19.17Z'%20fill='%234750EB'/%3e%3cpath%20d='M17.5%207.5C17.2348%207.5%2016.9804%207.60536%2016.7929%207.79289C16.6054%207.98043%2016.5%208.23478%2016.5%208.5V11.25C16.5%2011.3163%2016.4737%2011.3799%2016.4268%2011.4268C16.3799%2011.4737%2016.3163%2011.5%2016.25%2011.5H10.75C10.6837%2011.5%2010.6201%2011.4737%2010.5732%2011.4268C10.5263%2011.3799%2010.5%2011.3163%2010.5%2011.25V9.5C10.5012%209.30138%2010.4431%209.10691%2010.3333%208.94139C10.2235%208.77587%2010.0669%208.6468%209.88348%208.57063C9.70004%208.49446%209.49807%208.47465%209.30332%208.51372C9.10857%208.55279%208.92987%208.64897%208.79%208.79L5.79%2011.79C5.60375%2011.9774%205.49921%2012.2308%205.49921%2012.495C5.49921%2012.7592%205.60375%2013.0126%205.79%2013.2L8.79%2016.2C8.88261%2016.2945%208.99306%2016.3697%209.11493%2016.4212C9.23681%2016.4727%209.36769%2016.4995%209.5%2016.5C9.76522%2016.5%2010.0196%2016.3946%2010.2071%2016.2071C10.3946%2016.0196%2010.5%2015.7652%2010.5%2015.5V13.75C10.5%2013.6837%2010.5263%2013.6201%2010.5732%2013.5732C10.6201%2013.5263%2010.6837%2013.5%2010.75%2013.5H16.5C17.0304%2013.5%2017.5391%2013.2893%2017.9142%2012.9142C18.2893%2012.5391%2018.5%2012.0304%2018.5%2011.5V8.5C18.5%208.23478%2018.3946%207.98043%2018.2071%207.79289C18.0196%207.60536%2017.7652%207.5%2017.5%207.5Z'%20fill='%234750EB'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_1627_786'%3e%3crect%20width='24'%20height='24'%20rx='5'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
321
321
  }
322
- .icon.enter-sm[data-v-2674242c] {
322
+ .icon.enter-sm[data-v-78b7a6f8] {
323
323
  background-size: 1rem 1rem;
324
324
  width: 1rem;
325
325
  height: 1rem;
326
326
  right: 1.5rem;
327
327
  bottom: 0.5rem;
328
328
  }
329
- .icon.enter-md[data-v-2674242c] {
329
+ .icon.enter-md[data-v-78b7a6f8] {
330
330
  background-size: 1.5rem 1.5rem;
331
331
  width: 1.5rem;
332
332
  height: 1.5rem;
333
333
  right: 2.0625rem;
334
334
  bottom: 0.5rem;
335
335
  }
336
- .icon.enter-lg[data-v-2674242c] {
336
+ .icon.enter-lg[data-v-78b7a6f8] {
337
337
  background-size: 1.5rem 1.5rem;
338
338
  width: 1.5rem;
339
339
  height: 1.5rem;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pequity/squirrel",
3
3
  "description": "Squirrel component library",
4
- "version": "6.0.12",
4
+ "version": "6.0.13",
5
5
  "packageManager": "pnpm@9.15.5",
6
6
  "type": "module",
7
7
  "scripts": {
@@ -61,7 +61,7 @@
61
61
  "@storybook/blocks": "^8.5.6",
62
62
  "@storybook/manager-api": "^8.5.6",
63
63
  "@storybook/test": "^8.5.6",
64
- "@storybook/test-runner": "^0.21.0",
64
+ "@storybook/test-runner": "^0.21.1",
65
65
  "@storybook/theming": "^8.5.6",
66
66
  "@storybook/vue3": "^8.5.6",
67
67
  "@storybook/vue3-vite": "^8.5.6",
@@ -70,14 +70,14 @@
70
70
  "@types/lodash-es": "^4.17.12",
71
71
  "@types/node": "^22.13.4",
72
72
  "@vitejs/plugin-vue": "^5.2.1",
73
- "@vitest/coverage-v8": "^3.0.5",
73
+ "@vitest/coverage-v8": "^3.0.6",
74
74
  "@vue/compiler-sfc": "3.5.13",
75
75
  "@vue/test-utils": "^2.4.6",
76
76
  "@vuepic/vue-datepicker": "11.0.1",
77
77
  "autoprefixer": "^10.4.20",
78
78
  "dayjs": "1.11.13",
79
79
  "eslint": "^9.20.1",
80
- "eslint-plugin-storybook": "^0.11.2",
80
+ "eslint-plugin-storybook": "^0.11.3",
81
81
  "floating-vue": "5.2.2",
82
82
  "glob": "^11.0.1",
83
83
  "husky": "^9.1.7",
@@ -87,22 +87,25 @@
87
87
  "lodash-es": "4.17.21",
88
88
  "make-coverage-badge": "^1.2.0",
89
89
  "postcss": "^8.5.2",
90
- "prettier": "^3.4.2",
90
+ "prettier": "^3.5.1",
91
91
  "prettier-plugin-tailwindcss": "^0.6.11",
92
92
  "resolve-tspaths": "^0.8.23",
93
93
  "rimraf": "^6.0.1",
94
94
  "sass": "^1.85.0",
95
- "semantic-release": "^24.2.2",
95
+ "semantic-release": "^24.2.3",
96
96
  "storybook": "^8.5.6",
97
97
  "svgo": "^3.3.2",
98
98
  "tailwindcss": "^3.4.17",
99
99
  "typescript": "5.7.3",
100
100
  "vite": "^6.1.0",
101
- "vitest": "^3.0.5",
101
+ "vitest": "^3.0.6",
102
102
  "vue": "3.5.13",
103
103
  "vue-currency-input": "3.2.1",
104
104
  "vue-router": "4.5.0",
105
105
  "vue-toastification": "2.0.0-rc.5",
106
106
  "vue-tsc": "2.2.0"
107
+ },
108
+ "dependencies": {
109
+ "tailwind-variants": "^0.3.1"
107
110
  }
108
111
  }
@@ -163,7 +163,7 @@ describe('PBtn.vue', () => {
163
163
  it.each([
164
164
  ['sm', ['py-1', 'px-2', 'rounded', 'font-medium', 'text-sm']],
165
165
  ['md', ['py-2', 'px-6', 'rounded', 'font-medium', 'text-base']],
166
- ['lg', ['py-3', 'px-6', 'rounded', 'font-medium', 'text-lg']],
166
+ ['lg', ['py-2.5', 'px-6', 'rounded', 'font-medium', 'text-lg']],
167
167
  ])('renders a button of size %s', async (size, classes) => {
168
168
  const wrapper = createWrapperFor(PBtn, { props: { size } });
169
169
 
@@ -1 +1,3 @@
1
- export type Size = 'sm' | 'md' | 'lg';
1
+ export const SIZES = ['sm', 'md', 'lg'] as const;
2
+
3
+ export type Size = (typeof SIZES)[number];
@@ -4,7 +4,7 @@
4
4
  v-bind="$attrs"
5
5
  :href="sanitizeUrl(to)"
6
6
  target="_blank"
7
- :class="classes"
7
+ :class="classes.button"
8
8
  :disabled="!!$attrs.disabled ? true : null"
9
9
  :aria-disabled="!!$attrs.disabled"
10
10
  >
@@ -16,93 +16,80 @@
16
16
  :type="to ? null : nativeType"
17
17
  :to="to ? to : null"
18
18
  :aria-selected="selected"
19
- :class="classes"
19
+ :class="classes.button"
20
20
  v-bind="$attrs"
21
21
  :disabled="!!$attrs.disabled || loading ? true : null"
22
22
  :aria-disabled="$attrs.disabled"
23
23
  >
24
24
  <div :class="{ invisible: loading }"><slot></slot></div>
25
- <PRingLoader
26
- v-if="loading"
27
- :color="loaderColor"
28
- :size="loaderSize"
29
- class="absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center"
30
- />
25
+ <PRingLoader v-if="loading" :size="loaderSize" :class="classes.loader" />
31
26
  </Component>
32
27
  </template>
33
28
 
34
29
  <script lang="ts">
35
- import { type Size } from '@squirrel/components/p-btn/p-btn.types';
30
+ import { type Size, SIZES } from '@squirrel/components/p-btn/p-btn.types';
36
31
  import PRingLoader from '@squirrel/components/p-ring-loader/p-ring-loader.vue';
37
32
  import { isExternalLink } from '@squirrel/utils/link';
38
33
  import { sanitizeUrl } from '@squirrel/utils/sanitization';
34
+ import { tv, type VariantProps } from 'tailwind-variants';
39
35
  import { defineComponent, type PropType } from 'vue';
40
36
  import { type RouteLocationRaw, RouterLink } from 'vue-router';
41
37
 
42
- const BUTTON_TYPES = {
43
- PRIMARY: 'primary',
44
- SECONDARY: 'secondary',
45
- PRIMARY_OUTLINE: 'primary-outline',
46
- SECONDARY_OUTLINE: 'secondary-outline',
47
- SECONDARY_OUTLINE_BLUE: 'secondary-outline-blue',
48
- ERROR: 'error',
49
- SUCCESS: 'success',
50
- PRIMARY_LINK: 'primary-link',
51
- SECONDARY_GHOST: 'secondary-ghost',
52
- SECONDARY_GHOST_DARK: 'secondary-ghost-dark',
38
+ const btnClasses = {
39
+ slots: {
40
+ button:
41
+ 'relative inline-block rounded font-medium outline-none disabled:pointer-events-none disabled:cursor-default disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:cursor-default aria-disabled:opacity-50',
42
+ loader: 'absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center font-medium',
43
+ },
44
+ variants: {
45
+ type: {
46
+ primary: {
47
+ button: 'bg-primary text-surface hover:bg-accent active:bg-p-blue-80',
48
+ loader: 'text-surface',
49
+ },
50
+ secondary: {
51
+ button: 'bg-p-gray-20 hover:bg-p-gray-30 active:bg-p-gray-40',
52
+ loader: 'text-p-purple-60',
53
+ },
54
+ 'primary-outline': {
55
+ button: 'bg-p-blue-10 text-p-purple-60 ring-1 ring-inset ring-p-purple-60 hover:bg-p-gray-20',
56
+ loader: 'text-p-purple-60',
57
+ },
58
+ 'secondary-outline': {
59
+ button:
60
+ 'bg-surface text-p-purple-60 ring-1 ring-inset ring-p-gray-30 hover:bg-p-blue-10 aria-selected:bg-p-blue-10',
61
+ loader: 'text-p-purple-60',
62
+ },
63
+ 'secondary-outline-blue': {
64
+ button:
65
+ 'bg-surface text-p-purple-60 ring-1 ring-inset ring-p-gray-30 hover:bg-p-blue-10 aria-selected:bg-p-blue-15 aria-selected:text-p-blue-60',
66
+ loader: 'text-p-purple-60',
67
+ },
68
+ error: { button: 'bg-p-red-40 text-white hover:bg-p-red-50', loader: 'text-white' },
69
+ success: { button: 'bg-p-green-40 text-white hover:bg-p-green-50', loader: 'text-white' },
70
+ 'primary-link': { button: 'bg-transparent text-primary underline hover:text-accent', loader: 'text-p-blue-60' },
71
+ 'secondary-ghost': { button: 'text-on-surface hover:bg-p-gray-20', loader: 'text-p-purple-60' },
72
+ 'secondary-ghost-dark': { button: 'text-white hover:bg-p-purple-50', loader: 'text-p-blue-15' },
73
+ },
74
+ size: {
75
+ sm: { button: 'px-2 py-1 text-sm' },
76
+ md: { button: 'px-6 py-2 text-base' },
77
+ lg: { button: 'px-6 py-2.5 text-lg' },
78
+ },
79
+ },
80
+ defaultVariants: {
81
+ type: 'primary',
82
+ size: 'md',
83
+ },
53
84
  } as const;
54
85
 
86
+ const btn = tv(btnClasses);
87
+ const BUTTON_TYPES = Object.keys(btnClasses.variants.type);
55
88
  const BUTTON_NATIVE_TYPES = ['button', 'submit', 'reset'] as const;
89
+ const LOADER_SIZES = { sm: 24, md: 30, lg: 40 } as const satisfies { [key in Size]: number };
56
90
 
57
91
  type ButtonNativeType = (typeof BUTTON_NATIVE_TYPES)[number];
58
- type ButtonTypeKeys = keyof typeof BUTTON_TYPES;
59
- type ButtonType = (typeof BUTTON_TYPES)[ButtonTypeKeys];
60
-
61
- const DEFAULT_CLASSES = `relative inline-block outline-none disabled:opacity-50 disabled:cursor-default disabled:pointer-events-none aria-disabled:opacity-50 aria-disabled:cursor-default aria-disabled:pointer-events-none`;
62
-
63
- type ButtonClass = {
64
- [key in ButtonType]: string;
65
- };
66
-
67
- const BUTTON_CLASSES: ButtonClass = {
68
- [BUTTON_TYPES.PRIMARY]: 'text-surface bg-primary hover:bg-accent active:bg-p-blue-80',
69
- [BUTTON_TYPES.SECONDARY]: 'bg-p-gray-20 hover:bg-p-gray-30 active:bg-p-gray-40',
70
- [BUTTON_TYPES.PRIMARY_OUTLINE]: 'text-p-purple-60 bg-p-blue-10 ring-1 ring-inset ring-p-purple-60 hover:bg-p-gray-20',
71
- [BUTTON_TYPES.SECONDARY_OUTLINE]:
72
- 'text-p-purple-60 bg-surface ring-1 ring-inset ring-p-gray-30 hover:bg-p-blue-10 aria-selected:bg-p-blue-10',
73
- [BUTTON_TYPES.SECONDARY_OUTLINE_BLUE]:
74
- 'text-p-purple-60 bg-surface ring-1 ring-inset ring-p-gray-30 hover:bg-p-blue-10 aria-selected:bg-p-blue-15 aria-selected:text-p-blue-60',
75
- [BUTTON_TYPES.ERROR]: 'text-white bg-p-red-40 hover:bg-p-red-50',
76
- [BUTTON_TYPES.SUCCESS]: 'text-white bg-p-green-40 hover:bg-p-green-50',
77
- [BUTTON_TYPES.PRIMARY_LINK]: 'text-primary bg-transparent hover:text-accent underline',
78
- [BUTTON_TYPES.SECONDARY_GHOST]: 'text-on-surface hover:bg-p-gray-20',
79
- [BUTTON_TYPES.SECONDARY_GHOST_DARK]: 'text-white hover:bg-p-purple-50',
80
- };
81
-
82
- const BUTTON_SIZES = {
83
- sm: 'py-1 px-2 rounded font-medium text-sm',
84
- md: 'py-2 px-6 rounded font-medium text-base',
85
- lg: 'py-3 px-6 rounded font-medium text-lg',
86
- } as const satisfies { [key in Size]: string };
87
-
88
- const LOADER_SIZES = {
89
- sm: 24,
90
- md: 30,
91
- lg: 40,
92
- } as const satisfies { [key in Size]: number };
93
-
94
- const LOADER_COLORS = {
95
- [BUTTON_TYPES.PRIMARY]: 'var(--color-p-blue-15)',
96
- [BUTTON_TYPES.SECONDARY]: 'var(--color-p-purple-60)',
97
- [BUTTON_TYPES.PRIMARY_OUTLINE]: 'var(--color-p-blue-60)',
98
- [BUTTON_TYPES.SECONDARY_OUTLINE]: 'var(--color-p-purple-60)',
99
- [BUTTON_TYPES.SECONDARY_OUTLINE_BLUE]: 'var(--color-p-purple-60)',
100
- [BUTTON_TYPES.ERROR]: 'var(--color-p-blue-15)',
101
- [BUTTON_TYPES.SUCCESS]: 'var(--color-p-blue-15)',
102
- [BUTTON_TYPES.PRIMARY_LINK]: 'var(--color-p-blue-60)',
103
- [BUTTON_TYPES.SECONDARY_GHOST]: 'var(--color-p-purple-60)',
104
- [BUTTON_TYPES.SECONDARY_GHOST_DARK]: 'var(--color-p-blue-15)',
105
- } as const;
92
+ type ButtonType = NonNullable<VariantProps<typeof btn>['type']>;
106
93
 
107
94
  export default defineComponent({
108
95
  name: 'PBtn',
@@ -119,7 +106,7 @@ export default defineComponent({
119
106
  type: String as PropType<ButtonType>,
120
107
  default: 'primary',
121
108
  validator(value: ButtonType) {
122
- return Object.values(BUTTON_TYPES).includes(value);
109
+ return BUTTON_TYPES.includes(value);
123
110
  },
124
111
  },
125
112
  /**
@@ -139,7 +126,7 @@ export default defineComponent({
139
126
  type: String as PropType<Size>,
140
127
  default: 'md',
141
128
  validator(value: Size) {
142
- return Object.keys(BUTTON_SIZES).includes(value);
129
+ return SIZES.includes(value);
143
130
  },
144
131
  },
145
132
  /**
@@ -167,14 +154,13 @@ export default defineComponent({
167
154
  },
168
155
  computed: {
169
156
  classes() {
170
- return `${DEFAULT_CLASSES} ${BUTTON_SIZES[this.size]} ${BUTTON_CLASSES[this.type]}`;
157
+ const { button, loader } = btn({ type: this.type, size: this.size });
158
+
159
+ return { button: button(), loader: loader() };
171
160
  },
172
161
  loaderSize() {
173
162
  return Number(`${LOADER_SIZES[this.size]}`);
174
163
  },
175
- loaderColor() {
176
- return LOADER_COLORS[this.type];
177
- },
178
164
  },
179
165
  methods: {
180
166
  isExternalLink,
@@ -40,14 +40,9 @@ describe('PFileUpload.vue', () => {
40
40
  },
41
41
  });
42
42
 
43
- expect(wrapper.find('label').classes()).toEqual([
44
- 'block',
45
- 'mb-1',
46
- 'font-medium',
47
- 'text-sm',
48
- "after:content-['_*']",
49
- 'after:text-on-error',
50
- ]);
43
+ const labelClasses = ['block', 'mb-1', 'font-medium', 'text-sm', 'after:content-["_*"]', 'after:text-on-error'];
44
+
45
+ expect(wrapper.find('label').classes()).toEqual(expect.arrayContaining(labelClasses));
51
46
  });
52
47
 
53
48
  it('sets the disabled state correctly', () => {
@@ -60,16 +60,9 @@ describe('PInlineDatePicker.vue', () => {
60
60
  it('adds the required class when the required prop is set', () => {
61
61
  const wrapper = createWrapper({ label: 'test datepicker', required: true });
62
62
 
63
- expect(wrapper.find('label').classes()).toEqual([
64
- 'block',
65
- 'mb-1',
66
- 'font-medium',
67
- 'text-sm',
68
- "after:content-['_*']",
69
- 'after:text-on-error',
70
- ]);
71
-
72
- expect(wrapper.props().required).toBe(true);
63
+ const labelClasses = ['block', 'mb-1', 'font-medium', 'text-sm', 'after:content-["_*"]', 'after:text-on-error'];
64
+
65
+ expect(wrapper.find('label').classes()).toEqual(expect.arrayContaining(labelClasses));
73
66
  });
74
67
 
75
68
  it('passes listeners to the datepicker', () => {
@@ -62,14 +62,9 @@ describe('PInput.vue', () => {
62
62
  },
63
63
  });
64
64
 
65
- expect(wrapper.find('label').classes()).toEqual([
66
- 'block',
67
- 'mb-1',
68
- 'font-medium',
69
- 'text-sm',
70
- "after:content-['_*']",
71
- 'after:text-on-error',
72
- ]);
65
+ const res = ['block', 'mb-1', 'font-medium', 'text-sm', 'after:content-["_*"]', 'after:text-on-error'];
66
+
67
+ expect(wrapper.find('label').classes()).toEqual(expect.arrayContaining(res));
73
68
  });
74
69
 
75
70
  it('sets the disabled state correctly', () => {
@@ -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: {