@citizenplane/pimp 18.6.2 → 18.8.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 (159) hide show
  1. package/biome.json +178 -0
  2. package/dist/components/BaseInputLabel.vue.d.ts.map +1 -1
  3. package/dist/components/BaseSelectClearButton.vue.d.ts.map +1 -1
  4. package/dist/components/CpAccordion.vue.d.ts.map +1 -1
  5. package/dist/components/CpAlert.vue.d.ts.map +1 -1
  6. package/dist/components/CpBadge.vue.d.ts.map +1 -1
  7. package/dist/components/CpButton.vue.d.ts.map +1 -1
  8. package/dist/components/CpButtonToggle.vue.d.ts +1 -1
  9. package/dist/components/CpButtonToggle.vue.d.ts.map +1 -1
  10. package/dist/components/CpCalendar.vue.d.ts.map +1 -1
  11. package/dist/components/CpCheckbox.vue.d.ts.map +1 -1
  12. package/dist/components/CpContextualMenu.vue.d.ts.map +1 -1
  13. package/dist/components/CpDate.vue.d.ts.map +1 -1
  14. package/dist/components/CpDatepicker.vue.d.ts.map +1 -1
  15. package/dist/components/CpInput.vue.d.ts.map +1 -1
  16. package/dist/components/CpItemActions.vue.d.ts +2 -0
  17. package/dist/components/CpItemActions.vue.d.ts.map +1 -1
  18. package/dist/components/CpMenu.vue.d.ts.map +1 -1
  19. package/dist/components/CpMenuItem.vue.d.ts.map +1 -1
  20. package/dist/components/CpMultiselect.vue.d.ts.map +1 -1
  21. package/dist/components/CpRadio.vue.d.ts.map +1 -1
  22. package/dist/components/CpRadioGroup.vue.d.ts.map +1 -1
  23. package/dist/components/CpRadioNew.vue.d.ts.map +1 -1
  24. package/dist/components/CpSelect.vue.d.ts.map +1 -1
  25. package/dist/components/CpSelectMenu.vue.d.ts.map +1 -1
  26. package/dist/components/CpSelectableButton.vue.d.ts +1 -1
  27. package/dist/components/CpSelectableButton.vue.d.ts.map +1 -1
  28. package/dist/components/CpSwitch.vue.d.ts.map +1 -1
  29. package/dist/components/CpTable.vue.d.ts.map +1 -1
  30. package/dist/components/CpTelInput.vue.d.ts.map +1 -1
  31. package/dist/components/CpTooltip.vue.d.ts +2 -0
  32. package/dist/components/CpTooltip.vue.d.ts.map +1 -1
  33. package/dist/components/CpTrip.vue.d.ts +48 -0
  34. package/dist/components/CpTrip.vue.d.ts.map +1 -0
  35. package/dist/components/CpTripTimeline.vue.d.ts +24 -0
  36. package/dist/components/CpTripTimeline.vue.d.ts.map +1 -0
  37. package/dist/components/index.d.ts +2 -1
  38. package/dist/components/index.d.ts.map +1 -1
  39. package/dist/composables/useDynamicSize.d.ts +9 -0
  40. package/dist/composables/useDynamicSize.d.ts.map +1 -0
  41. package/dist/constants/index.d.ts +2 -2
  42. package/dist/constants/index.d.ts.map +1 -1
  43. package/dist/constants/layout/Breakpoints.d.ts +9 -0
  44. package/dist/constants/layout/Breakpoints.d.ts.map +1 -0
  45. package/dist/constants/layout/Sizes.d.ts +2 -0
  46. package/dist/constants/layout/Sizes.d.ts.map +1 -0
  47. package/dist/constants/layout/index.d.ts +3 -0
  48. package/dist/constants/layout/index.d.ts.map +1 -0
  49. package/dist/helpers/functions.d.ts +1 -0
  50. package/dist/helpers/functions.d.ts.map +1 -1
  51. package/dist/libs/CoreDatepicker.vue.d.ts.map +1 -1
  52. package/dist/pimp.es.js +6797 -6461
  53. package/dist/pimp.umd.js +54 -54
  54. package/dist/style.css +1 -1
  55. package/package.json +14 -24
  56. package/src/assets/css/base.css +17 -11
  57. package/src/assets/css/colors.css +12 -22
  58. package/src/assets/css/dimensions.css +4 -0
  59. package/src/assets/css/shadows.css +0 -3
  60. package/src/assets/css/tokens.css +21 -65
  61. package/src/assets/css/typography.css +0 -17
  62. package/src/assets/main.css +7 -7
  63. package/src/assets/styles/helpers/_functions.scss +2 -2
  64. package/src/assets/styles/utilities/_index.scss +2 -3
  65. package/src/components/BaseInputLabel.vue +7 -11
  66. package/src/components/BaseSelectClearButton.vue +6 -7
  67. package/src/components/CpAccordion.vue +27 -28
  68. package/src/components/CpAccordionGroup.vue +2 -2
  69. package/src/components/CpAlert.vue +12 -11
  70. package/src/components/CpBadge.vue +4 -19
  71. package/src/components/CpButton.vue +23 -25
  72. package/src/components/CpButtonGroup.vue +2 -2
  73. package/src/components/CpButtonToggle.vue +22 -22
  74. package/src/components/CpCalendar.vue +30 -26
  75. package/src/components/CpCheckbox.vue +29 -33
  76. package/src/components/CpContextualMenu.vue +1 -2
  77. package/src/components/CpDate.vue +72 -76
  78. package/src/components/CpDatepicker.vue +2 -3
  79. package/src/components/CpDialog.vue +8 -8
  80. package/src/components/CpHeading.vue +6 -6
  81. package/src/components/CpIcon.vue +2 -2
  82. package/src/components/CpInput.vue +46 -48
  83. package/src/components/CpItemActions.vue +17 -16
  84. package/src/components/CpMenu.vue +8 -9
  85. package/src/components/CpMenuItem.vue +7 -7
  86. package/src/components/CpMenuList.vue +3 -3
  87. package/src/components/CpMultiselect.vue +29 -30
  88. package/src/components/CpRadio.vue +53 -59
  89. package/src/components/CpRadioGroup.vue +11 -12
  90. package/src/components/CpRadioNew.vue +56 -58
  91. package/src/components/CpSelect.vue +42 -42
  92. package/src/components/CpSelectMenu.vue +32 -32
  93. package/src/components/CpSelectableButton.vue +50 -51
  94. package/src/components/CpSwitch.vue +43 -44
  95. package/src/components/CpTable.vue +69 -81
  96. package/src/components/CpTableColumnEditor.vue +16 -16
  97. package/src/components/CpTableEmptyState.vue +4 -4
  98. package/src/components/CpTableFooter.vue +2 -2
  99. package/src/components/CpTableFooterDesktop.vue +2 -2
  100. package/src/components/CpTableFooterDetails.vue +2 -2
  101. package/src/components/CpTableFooterMobile.vue +4 -4
  102. package/src/components/CpTabs.vue +1 -1
  103. package/src/components/CpTelInput.vue +31 -32
  104. package/src/components/CpTextarea.vue +13 -13
  105. package/src/components/CpToast.vue +25 -24
  106. package/src/components/CpTooltip.vue +15 -13
  107. package/src/components/CpTransitionCounter.vue +1 -1
  108. package/src/components/CpTransitionExpand.vue +5 -5
  109. package/src/components/CpTransitionSize.vue +1 -1
  110. package/src/components/CpTrip.vue +190 -0
  111. package/src/components/CpTripTimeline.vue +272 -0
  112. package/src/components/index.ts +36 -34
  113. package/src/composables/useDynamicSize.ts +60 -0
  114. package/src/constants/index.ts +2 -2
  115. package/src/constants/layout/Breakpoints.ts +8 -0
  116. package/src/constants/layout/Sizes.ts +1 -0
  117. package/src/constants/layout/index.ts +3 -0
  118. package/src/directives/ClickOutside.ts +1 -1
  119. package/src/directives/ResizeSelect.ts +1 -1
  120. package/src/helpers/functions.ts +1 -1
  121. package/src/helpers/index.ts +1 -1
  122. package/src/libs/CoreDatepicker.vue +115 -134
  123. package/src/stories/Colors.stories.ts +2 -1
  124. package/src/stories/CpAccordion.stories.ts +2 -2
  125. package/src/stories/CpAccordionGroup.stories.ts +1 -2
  126. package/src/stories/CpButtonToggle.stories.ts +1 -2
  127. package/src/stories/CpCheckbox.stories.ts +1 -2
  128. package/src/stories/CpContextualMenu.stories.ts +1 -2
  129. package/src/stories/CpDate.stories.ts +1 -2
  130. package/src/stories/CpDatepicker.stories.ts +1 -2
  131. package/src/stories/CpDialog.stories.ts +1 -2
  132. package/src/stories/CpInput.stories.ts +1 -2
  133. package/src/stories/CpItemActions.stories.ts +10 -5
  134. package/src/stories/CpMenu.stories.ts +1 -2
  135. package/src/stories/CpMenuItem.stories.ts +1 -2
  136. package/src/stories/CpMultiselect.stories.ts +1 -2
  137. package/src/stories/CpRadio.stories.ts +1 -2
  138. package/src/stories/CpRadioGroup.stories.ts +1 -2
  139. package/src/stories/CpSelect.stories.ts +1 -2
  140. package/src/stories/CpSelectMenu.stories.ts +1 -2
  141. package/src/stories/CpSwitch.stories.ts +1 -2
  142. package/src/stories/CpTable.stories.ts +2 -3
  143. package/src/stories/CpTabs.stories.ts +1 -2
  144. package/src/stories/CpText.stories.ts +2 -1
  145. package/src/stories/CpTextarea.stories.ts +1 -2
  146. package/src/stories/CpToast.stories.ts +2 -3
  147. package/src/stories/CpTransitionCounter.stories.ts +1 -2
  148. package/src/stories/CpTransitionExpand.stories.ts +1 -2
  149. package/src/stories/CpTransitionListItems.stories.ts +1 -2
  150. package/src/stories/CpTransitionSize.stories.ts +1 -2
  151. package/src/stories/CpTransitionSlide.stories.ts +1 -2
  152. package/src/stories/CpTransitionTabContent.stories.ts +1 -2
  153. package/src/stories/CpTrip.stories.ts +323 -0
  154. package/src/stories/Dimensions.stories.ts +1 -0
  155. package/src/stories/Shadows.stories.ts +1 -0
  156. package/src/stories/Typography.stories.ts +1 -0
  157. package/src/vendors/ff-polyfill.ts +1 -1
  158. package/vitest.workspace.js +1 -1
  159. package/src/components/Pimp.vue +0 -10
@@ -55,13 +55,14 @@
55
55
  </template>
56
56
 
57
57
  <script setup lang="ts">
58
- import { Info, DateTime } from 'luxon'
59
- import { ref, computed, watch, useId } from 'vue'
58
+ import { DateTime, Info } from 'luxon'
59
+ import { computed, ref, useId, watch } from 'vue'
60
+
61
+ import type { Sizes } from '@/constants'
60
62
 
61
63
  import BaseInputLabel from '@/components/BaseInputLabel.vue'
62
64
 
63
65
  import { HUMAN_MAX_AGE } from '@/constants'
64
- import type { Sizes } from '@/constants'
65
66
  import { capitalizeFirstLetter } from '@/helpers'
66
67
 
67
68
  interface Emits {
@@ -101,7 +102,6 @@ const props = withDefaults(defineProps<Props>(), {
101
102
  disabled: false,
102
103
  isInvalid: false,
103
104
  errorMessage: '',
104
- // eslint-disable-next-line vue/no-boolean-default
105
105
  displayErrorMessage: true,
106
106
  autocompleteBirthday: false,
107
107
  locale: () => navigator.language,
@@ -317,24 +317,21 @@ watch(year, handleUpdate)
317
317
  // Hide arrows from number input
318
318
  input::-webkit-outer-spin-button,
319
319
  input::-webkit-inner-spin-button {
320
- -webkit-appearance: none;
321
320
  margin: 0;
321
+ appearance: none;
322
322
  }
323
323
 
324
324
  input[type='number'] {
325
325
  appearance: textfield;
326
- -moz-appearance: textfield;
327
326
  }
328
327
 
329
328
  // Remove select style
330
329
  select {
330
+ border: none;
331
331
  appearance: none;
332
332
  outline: none;
333
- border: none;
334
333
  }
335
- }
336
334
 
337
- .cpDate {
338
335
  input::placeholder,
339
336
  &__month--isEmpty {
340
337
  color: var(--cp-text-placeholder);
@@ -342,12 +339,12 @@ watch(year, handleUpdate)
342
339
 
343
340
  &__inputs {
344
341
  display: flex;
342
+ overflow: hidden;
343
+ border-radius: var(--cp-radius-md-lg);
344
+ background-color: var(--cp-background-primary);
345
345
  box-shadow:
346
346
  var(--cp-shadows-3xs),
347
347
  0 0 0 var(--cp-dimensions-0_25) var(--cp-border-soft);
348
- border-radius: var(--cp-radius-md-lg);
349
- overflow: hidden;
350
- background-color: var(--cp-background-primary);
351
348
 
352
349
  &:hover {
353
350
  border-color: var(--cp-border-soft-hover);
@@ -362,51 +359,6 @@ watch(year, handleUpdate)
362
359
  line-height: var(--cp-line-height-md);
363
360
  }
364
361
 
365
- &--lg {
366
- .cpDate__day,
367
- .cpDate__year {
368
- padding: var(--cp-spacing-lg) var(--cp-spacing-xl);
369
- font-size: var(--cp-text-size-md);
370
- }
371
-
372
- .cpDate__month select {
373
- padding: var(--cp-spacing-lg) var(--cp-dimensions-8) var(--cp-spacing-lg) var(--cp-spacing-xl);
374
- font-size: var(--cp-text-size-md);
375
- }
376
- }
377
-
378
- &--md {
379
- .cpDate__day,
380
- .cpDate__year {
381
- padding: var(--cp-spacing-md) var(--cp-spacing-xl);
382
- font-size: var(--cp-text-size-sm);
383
- }
384
-
385
- .cpDate__month select {
386
- padding: var(--cp-spacing-md) calc(var(--cp-dimensions-1) * 7) var(--cp-spacing-md) var(--cp-spacing-lg);
387
- font-size: var(--cp-text-size-sm);
388
- }
389
- }
390
-
391
- &--sm {
392
- .cpDate__day,
393
- .cpDate__year {
394
- padding: var(--cp-spacing-sm) var(--cp-spacing-lg);
395
- font-size: var(--cp-text-size-sm);
396
- }
397
-
398
- .cpDate__month select {
399
- padding: var(--cp-spacing-sm) var(--cp-dimensions-8) var(--cp-spacing-sm) var(--cp-spacing-lg);
400
- font-size: var(--cp-text-size-sm);
401
- }
402
- }
403
-
404
- &__divider {
405
- flex-shrink: 0;
406
- width: var(--cp-dimensions-0_25);
407
- background-color: var(--cp-border-soft);
408
- }
409
-
410
362
  &__month,
411
363
  &__day,
412
364
  &__year {
@@ -424,19 +376,17 @@ watch(year, handleUpdate)
424
376
  width: var(--cp-dimensions-5);
425
377
  height: var(--cp-dimensions-5);
426
378
  background-color: var(--cp-text-secondary);
379
+ content: '';
427
380
  mask-image: url('@/assets/images/icons/chevron-down-icon.svg');
428
- mask-size: cover;
429
381
  mask-repeat: no-repeat;
430
- -webkit-mask-image: url('@/assets/images/icons/chevron-down-icon.svg');
431
- -webkit-mask-size: cover;
432
- -webkit-mask-repeat: no-repeat;
433
- transform: translateY(-50%);
434
- content: '';
382
+ mask-size: cover;
435
383
  pointer-events: none;
384
+ transform: translateY(-50%);
436
385
  }
437
386
 
438
387
  select {
439
388
  @extend %u-text-ellipsis;
389
+
440
390
  width: 100%;
441
391
  color: inherit;
442
392
  cursor: pointer;
@@ -454,30 +404,60 @@ watch(year, handleUpdate)
454
404
 
455
405
  &__day,
456
406
  &__year {
457
- flex: 0 0 30%;
458
407
  width: 100%;
408
+ flex: 0 0 30%;
459
409
  }
460
410
 
461
- &--isInvalid {
462
- .cpDate__inputs,
463
- .cpDate__inputs:hover {
464
- box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-error-solid);
411
+
412
+ &--lg {
413
+ .cpDate__day,
414
+ .cpDate__year {
415
+ padding: var(--cp-spacing-lg) var(--cp-spacing-xl);
416
+ font-size: var(--cp-text-size-md);
465
417
  }
466
418
 
467
- .cpDate__inputs:focus-within {
468
- outline: var(--cp-dimensions-0_5) solid var(--cp-border-error-solid);
469
- box-shadow: 0 0 0 var(--cp-dimensions-0_25) color-mix(in srgb, #{var(--cp-border-error-solid)} 40%, transparent);
419
+ .cpDate__month select {
420
+ padding: var(--cp-spacing-lg) var(--cp-dimensions-8) var(--cp-spacing-lg) var(--cp-spacing-xl);
421
+ font-size: var(--cp-text-size-md);
470
422
  }
423
+ }
471
424
 
472
- .cpDate__divider {
473
- background-color: var(--cp-border-error-solid);
425
+ &--md {
426
+ .cpDate__day,
427
+ .cpDate__year {
428
+ padding: var(--cp-spacing-md) var(--cp-spacing-xl);
429
+ font-size: var(--cp-text-size-sm);
430
+ }
431
+
432
+ .cpDate__month select {
433
+ padding: var(--cp-spacing-md) calc(var(--cp-dimensions-1) * 7) var(--cp-spacing-md) var(--cp-spacing-lg);
434
+ font-size: var(--cp-text-size-sm);
435
+ }
436
+ }
437
+
438
+ &--sm {
439
+ .cpDate__day,
440
+ .cpDate__year {
441
+ padding: var(--cp-spacing-sm) var(--cp-spacing-lg);
442
+ font-size: var(--cp-text-size-sm);
443
+ }
444
+
445
+ .cpDate__month select {
446
+ padding: var(--cp-spacing-sm) var(--cp-dimensions-8) var(--cp-spacing-sm) var(--cp-spacing-lg);
447
+ font-size: var(--cp-text-size-sm);
474
448
  }
475
449
  }
476
450
 
451
+ &__divider {
452
+ width: var(--cp-dimensions-0_25);
453
+ flex-shrink: 0;
454
+ background-color: var(--cp-border-soft);
455
+ }
456
+
477
457
  &--isDisabled {
478
458
  .cpDate__inputs {
479
- background: var(--cp-background-disabled);
480
459
  border-color: var(--cp-border-disabled);
460
+ background: var(--cp-background-disabled);
481
461
  }
482
462
 
483
463
  .cpDate__inputs *,
@@ -488,20 +468,36 @@ watch(year, handleUpdate)
488
468
 
489
469
  .cpDate__month select:disabled {
490
470
  color: var(--cp-text-disabled) !important;
491
- -webkit-text-fill-color: var(--cp-text-disabled) !important;
492
471
  opacity: 1;
472
+ -webkit-text-fill-color: var(--cp-text-disabled) !important;
493
473
  }
494
474
 
495
475
  .cpDate__month::after {
496
476
  opacity: 0.4;
497
477
  }
498
478
  }
479
+
480
+ &--isInvalid {
481
+ .cpDate__inputs,
482
+ .cpDate__inputs:hover {
483
+ box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-error-solid);
484
+ }
485
+
486
+ .cpDate__inputs:focus-within {
487
+ box-shadow: 0 0 0 var(--cp-dimensions-0_25) color-mix(in srgb, #{var(--cp-border-error-solid)} 40%, transparent);
488
+ outline: var(--cp-dimensions-0_5) solid var(--cp-border-error-solid);
489
+ }
490
+
491
+ .cpDate__divider {
492
+ background-color: var(--cp-border-error-solid);
493
+ }
494
+ }
499
495
 
500
496
  &__errorMessage {
501
497
  margin-top: var(--cp-spacing-md);
498
+ color: var(--cp-text-error-primary);
502
499
  font-size: var(--cp-text-size-sm);
503
500
  line-height: var(--cp-line-height-md);
504
- color: var(--cp-text-error-primary);
505
501
  }
506
502
  }
507
503
  </style>
@@ -35,7 +35,7 @@
35
35
 
36
36
  <script setup lang="ts">
37
37
  import { DateTime } from 'luxon'
38
- import { ref, computed, watch, useId } from 'vue'
38
+ import { computed, ref, useId, watch } from 'vue'
39
39
 
40
40
  import CpInput from '@/components/CpInput.vue'
41
41
 
@@ -70,7 +70,6 @@ interface Emits {
70
70
  const props = withDefaults(defineProps<Props>(), {
71
71
  triggerElementId: '',
72
72
  mode: 'single',
73
- // eslint-disable-next-line vue/no-boolean-default
74
73
  closeAfterSelect: true,
75
74
  label: '',
76
75
  placeholder: 'Select a date',
@@ -182,8 +181,8 @@ watch(
182
181
 
183
182
  @media (max-width: 767px) and (min-width: 350px) {
184
183
  &__datepicker {
185
- left: 0;
186
184
  right: 0;
185
+ left: 0;
187
186
  transform: initial;
188
187
  }
189
188
 
@@ -45,7 +45,7 @@
45
45
  </template>
46
46
 
47
47
  <script setup lang="ts">
48
- import { computed, ref, useSlots, onMounted, nextTick, onBeforeUnmount, useId } from 'vue'
48
+ import { computed, nextTick, onBeforeUnmount, onMounted, ref, useId, useSlots } from 'vue'
49
49
 
50
50
  import { getKeyboardFocusableElements, handleTrapFocus } from '@/helpers/dom'
51
51
 
@@ -135,12 +135,12 @@ $dialog-breakpoint: 550px;
135
135
 
136
136
  .cpDialog {
137
137
  position: fixed;
138
+ z-index: 3;
138
139
  width: 100%;
139
140
  max-width: 100%;
140
141
  height: 100%;
141
142
  max-height: 100%;
142
143
  inset: 0;
143
- z-index: 3;
144
144
  transition-duration: 300ms;
145
145
 
146
146
  @media screen and (min-width: calc(#{$dialog-breakpoint} + 1px)) {
@@ -170,16 +170,16 @@ $dialog-breakpoint: 550px;
170
170
  transition: opacity 250ms ease;
171
171
 
172
172
  &--isClosableOnClickOutside {
173
- pointer-events: auto;
174
173
  z-index: 0;
175
174
  cursor: pointer;
175
+ pointer-events: auto;
176
176
  }
177
177
  }
178
178
 
179
179
  &__container {
180
180
  position: relative;
181
- display: flex;
182
181
  z-index: 2;
182
+ display: flex;
183
183
  overflow: hidden;
184
184
  width: 100%;
185
185
  max-height: 100%;
@@ -228,8 +228,8 @@ $dialog-breakpoint: 550px;
228
228
 
229
229
  &__headerText {
230
230
  display: flex;
231
- flex-direction: column;
232
231
  min-width: 0;
232
+ flex-direction: column;
233
233
  }
234
234
 
235
235
  &__title > * {
@@ -245,26 +245,26 @@ $dialog-breakpoint: 550px;
245
245
 
246
246
  &__subtitle,
247
247
  &__subtitle > p {
248
+ color: var(--cp-text-secondary);
248
249
  font-size: var(--cp-text-size-sm);
249
250
  font-weight: 400;
250
251
  line-height: var(--cp-line-height-md);
251
- color: var(--cp-text-secondary);
252
252
  }
253
253
 
254
254
  &__close {
255
255
  display: flex;
256
- margin-left: auto;
257
256
  align-items: center;
258
257
  justify-content: center;
259
258
  padding: var(--cp-spacing-sm);
260
259
  border-radius: var(--cp-radius-md);
260
+ margin-left: auto;
261
261
  color: var(--cp-foreground-secondary);
262
262
  transition: 200ms ease-in-out;
263
263
  transition-property: color, background-color;
264
264
 
265
265
  &:hover {
266
- color: var(--cp-foreground-primary);
267
266
  background-color: var(--cp-background-secondary);
267
+ color: var(--cp-foreground-primary);
268
268
  }
269
269
 
270
270
  &:focus-visible {
@@ -25,15 +25,15 @@ defineOptions({
25
25
 
26
26
  <style lang="scss">
27
27
  .cpHeading {
28
- &:first-letter {
28
+ &::first-letter {
29
29
  text-transform: capitalize;
30
30
  }
31
31
 
32
32
  &--100 {
33
33
  font-size: var(--cp-text-size-xs);
34
34
  font-weight: 400;
35
- line-height: var(--cp-line-height-xs);
36
35
  letter-spacing: var(--cp-letter-spacing-sm);
36
+ line-height: var(--cp-line-height-xs);
37
37
  }
38
38
 
39
39
  &--200 {
@@ -63,29 +63,29 @@ defineOptions({
63
63
  &--600 {
64
64
  font-size: var(--cp-text-size-lg);
65
65
  font-weight: 500;
66
- line-height: var(--cp-line-height-md);
67
66
  letter-spacing: var(--cp-letter-spacing-md);
67
+ line-height: var(--cp-line-height-md);
68
68
  }
69
69
 
70
70
  &--700 {
71
71
  font-size: var(--cp-text-size-xl);
72
72
  font-weight: 500;
73
- line-height: var(--cp-line-height-md);
74
73
  letter-spacing: var(--cp-letter-spacing-md);
74
+ line-height: var(--cp-line-height-md);
75
75
  }
76
76
 
77
77
  &--800 {
78
78
  font-size: var(--cp-text-size-3xl);
79
79
  font-weight: 500;
80
- line-height: var(--cp-line-height-2xl);
81
80
  letter-spacing: var(--cp-letter-spacing-md);
81
+ line-height: var(--cp-line-height-2xl);
82
82
  }
83
83
 
84
84
  &--900 {
85
85
  font-size: var(--cp-text-size-4xl);
86
86
  font-weight: 500;
87
- line-height: var(--cp-line-height-4xl);
88
87
  letter-spacing: var(--cp-letter-spacing-md);
88
+ line-height: var(--cp-line-height-4xl);
89
89
  }
90
90
  }
91
91
  </style>
@@ -77,7 +77,7 @@ const iconAttrs = computed(() => {
77
77
  } else {
78
78
  // Default to square icon if type is not found
79
79
  // @ts-expect-error cannot use string as index type for feather.icons
80
- const featherIcon = feather.icons[type.value] || feather.icons['square']
80
+ const featherIcon = feather.icons[type.value] || feather.icons.square
81
81
  return {
82
82
  ...featherIcon.attrs,
83
83
  ...attrs,
@@ -99,8 +99,8 @@ const iconAttrs = computed(() => {
99
99
  }
100
100
 
101
101
  &__content {
102
- height: inherit;
103
102
  width: inherit;
103
+ height: inherit;
104
104
  vertical-align: top;
105
105
  }
106
106
  }
@@ -51,11 +51,12 @@
51
51
  </template>
52
52
 
53
53
  <script setup lang="ts">
54
- import { ref, useAttrs, useSlots, computed, nextTick, onMounted, useId } from 'vue'
54
+ import { computed, nextTick, onMounted, ref, useAttrs, useId, useSlots } from 'vue'
55
+
56
+ import type { Sizes } from '@/constants'
55
57
 
56
58
  import BaseInputLabel from '@/components/BaseInputLabel.vue'
57
59
 
58
- import type { Sizes } from '@/constants'
59
60
  import { capitalizeFirstLetter } from '@/helpers'
60
61
 
61
62
  interface Emits {
@@ -94,8 +95,7 @@ defineOptions({ inheritAttrs: false })
94
95
  const attrs = useAttrs()
95
96
 
96
97
  // class is a reserved word, we can't remove 'class' property from attrs
97
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
98
- const { ['class']: value, id, ...restAttributes } = attrs
98
+ const { class: _class, id, ...restAttributes } = attrs
99
99
 
100
100
  const inputIdentifier = ref<string>((id as string | undefined) || useId())
101
101
 
@@ -123,7 +123,7 @@ const cpInputContainer = ref<HTMLDivElement | null>(null)
123
123
  const isDisabled = computed(() => checkAttribute('disabled'))
124
124
  const isRequired = computed(() => checkAttribute('required'))
125
125
 
126
- const isEmail = computed(() => attrs['type'] === 'email')
126
+ const isEmail = computed(() => attrs.type === 'email')
127
127
 
128
128
  const dynamicClasses = computed(() => {
129
129
  return [
@@ -191,17 +191,9 @@ onMounted(async () => {
191
191
  display: flex;
192
192
  flex-direction: column;
193
193
 
194
- &:has(.cpInput__help, .cpInput__error) .cpInput__container {
195
- margin-bottom: var(--cp-spacing-md);
196
- }
197
-
198
- &:has(.v-popper__popper--shown) {
199
- z-index: 3;
200
- }
201
-
202
194
  &__container {
203
- z-index: 1;
204
195
  position: relative;
196
+ z-index: 1;
205
197
  display: flex;
206
198
 
207
199
  * {
@@ -209,17 +201,25 @@ onMounted(async () => {
209
201
  }
210
202
  }
211
203
 
204
+ &:has(.cpInput__help, .cpInput__error) .cpInput__container {
205
+ margin-bottom: var(--cp-spacing-md);
206
+ }
207
+
208
+ &:has(.v-popper__popper--shown) {
209
+ z-index: 3;
210
+ }
211
+
212
212
  &__inner {
213
+ width: 100%;
214
+ padding: var(--cp-spacing-md) var(--cp-spacing-xl);
215
+ border-radius: var(--cp-radius-md);
216
+ appearance: none;
213
217
  box-shadow:
214
218
  var(--cp-shadows-3xs-inset),
215
219
  0 0 0 var(--cp-dimensions-0_25) var(--cp-border-soft);
216
- appearance: none;
217
- border-radius: var(--cp-radius-md);
218
- width: 100%;
219
220
  color: inherit;
220
- padding: var(--cp-spacing-md) var(--cp-spacing-xl);
221
- line-height: var(--cp-line-height-md);
222
221
  font-size: var(--cp-text-size-sm);
222
+ line-height: var(--cp-line-height-md);
223
223
 
224
224
  &:hover {
225
225
  box-shadow:
@@ -228,8 +228,8 @@ onMounted(async () => {
228
228
  }
229
229
 
230
230
  &:focus {
231
- outline: var(--cp-dimensions-0_5) solid var(--cp-focus);
232
231
  background-color: var(--cp-background-primary);
232
+ outline: var(--cp-dimensions-0_5) solid var(--cp-focus);
233
233
  }
234
234
 
235
235
  &::placeholder {
@@ -237,6 +237,14 @@ onMounted(async () => {
237
237
  }
238
238
  }
239
239
 
240
+ &--hasNoBorder .cpInput__inner,
241
+ &--hasNoBorder .cpInput__inner:hover,
242
+ &--hasNoBorder .cpInput__inner:focus,
243
+ &--hasNoBorder .cpInput__icon:hover ~ .cpInput__inner {
244
+ box-shadow: none;
245
+ outline: transparent;
246
+ }
247
+
240
248
  &--isInvalid {
241
249
  .cpInput__inner,
242
250
  .cpInput__inner:hover,
@@ -277,28 +285,19 @@ onMounted(async () => {
277
285
  }
278
286
  }
279
287
 
280
- &--hasNoBorder .cpInput__inner,
281
- &--hasNoBorder .cpInput__inner:hover,
282
- &--hasNoBorder .cpInput__inner:focus,
283
- &--hasNoBorder .cpInput__icon:hover ~ .cpInput__inner {
284
- outline: transparent;
285
- box-shadow: none;
286
- }
287
-
288
288
  &__icon {
289
+ position: absolute;
290
+ z-index: 1;
291
+ top: 50%;
292
+ left: var(--cp-dimensions-3_5);
293
+ display: flex;
294
+ overflow: hidden;
289
295
  width: var(--cp-dimensions-4);
290
296
  height: var(--cp-dimensions-4);
291
-
292
- color: var(--cp-foreground-primary);
293
- display: flex;
294
- align-items: center;
295
297
  flex-shrink: 0;
296
- left: var(--cp-dimensions-3_5);
297
- z-index: 1;
298
- position: absolute;
299
- top: 50%;
298
+ align-items: center;
299
+ color: var(--cp-foreground-primary);
300
300
  transform: translateY(-50%);
301
- overflow: hidden;
302
301
 
303
302
  &:hover ~ .cpInput__inner {
304
303
  box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-foreground-accent-primary);
@@ -316,8 +315,8 @@ onMounted(async () => {
316
315
  }
317
316
 
318
317
  &--isAfter {
319
- left: auto;
320
318
  right: var(--cp-dimensions-3_5);
319
+ left: auto;
321
320
  }
322
321
 
323
322
  &--isBefore ~ input {
@@ -331,15 +330,15 @@ onMounted(async () => {
331
330
 
332
331
  &--lg {
333
332
  .cpInput__inner {
334
- border-radius: var(--cp-radius-lg);
335
333
  padding: var(--cp-spacing-lg) var(--cp-spacing-xl);
334
+ border-radius: var(--cp-radius-lg);
336
335
  font-size: var(--cp-text-size-md);
337
336
  }
338
337
 
339
338
  .cpInput__icon {
339
+ left: var(--cp-spacing-lg);
340
340
  width: var(--cp-dimensions-5);
341
341
  height: var(--cp-dimensions-5);
342
- left: var(--cp-spacing-lg);
343
342
  }
344
343
 
345
344
  .cpInput__icon--isBefore,
@@ -348,8 +347,8 @@ onMounted(async () => {
348
347
  }
349
348
 
350
349
  .cpInput__icon--isAfter {
351
- left: auto;
352
350
  right: var(--cp-spacing-lg);
351
+ left: auto;
353
352
  }
354
353
 
355
354
  .cpInput__icon--isAfter ~ input {
@@ -363,8 +362,8 @@ onMounted(async () => {
363
362
 
364
363
  &--sm {
365
364
  .cpInput__inner {
366
- border-radius: var(--cp-radius-md);
367
365
  padding: var(--cp-spacing-sm) var(--cp-spacing-lg);
366
+ border-radius: var(--cp-radius-md);
368
367
  font-size: var(--cp-text-size-sm);
369
368
  }
370
369
 
@@ -378,8 +377,8 @@ onMounted(async () => {
378
377
  }
379
378
 
380
379
  .cpInput__icon--isAfter {
381
- left: auto;
382
380
  right: var(--cp-dimensions-2_5);
381
+ left: auto;
383
382
  }
384
383
 
385
384
  .cpInput__icon--isBefore ~ input {
@@ -400,23 +399,23 @@ onMounted(async () => {
400
399
 
401
400
  &--isSearch {
402
401
  .cpInput__icon--isAfter {
402
+ overflow: visible;
403
403
  width: auto;
404
404
  height: auto;
405
- overflow: visible;
406
405
  }
407
406
 
408
407
  .cpInput__clear {
409
408
  display: flex;
410
- color: var(--cp-foreground-secondary);
411
- padding: var(--cp-spacing-sm);
412
409
  width: var(--cp-dimensions-6);
413
410
  height: var(--cp-dimensions-6);
411
+ padding: var(--cp-spacing-sm);
414
412
  border-radius: var(--cp-radius-full);
415
413
  background-color: transparent;
414
+ color: var(--cp-foreground-secondary);
416
415
 
417
416
  &:hover {
418
- color: var(--cp-foreground-secondary-hover);
419
417
  background-color: var(--cp-background-primary-hover);
418
+ color: var(--cp-foreground-secondary-hover);
420
419
  }
421
420
 
422
421
  &:focus-visible {
@@ -428,7 +427,6 @@ onMounted(async () => {
428
427
  .cpInput__clearIcon {
429
428
  width: var(--cp-dimensions-4);
430
429
  height: var(--cp-dimensions-4);
431
-
432
430
  pointer-events: none;
433
431
  }
434
432