@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
@@ -19,8 +19,8 @@
19
19
  <script setup lang="ts">
20
20
  import { computed, provide, reactive, toRef, useId } from 'vue'
21
21
 
22
- import CpRadioNew, { type RadioOption } from './CpRadioNew.vue'
23
22
  import { capitalizeFirstLetter } from '@/helpers'
23
+ import CpRadioNew, { type RadioOption } from './CpRadioNew.vue'
24
24
 
25
25
  interface Props {
26
26
  autofocus?: boolean
@@ -83,9 +83,9 @@ provide(
83
83
  <style lang="scss">
84
84
  .cpRadioGroup {
85
85
  display: flex;
86
- gap: var(--cp-spacing-md);
87
- flex-direction: column;
88
86
  width: 100%;
87
+ flex-direction: column;
88
+ gap: var(--cp-spacing-md);
89
89
 
90
90
  &__options {
91
91
  display: flex;
@@ -94,16 +94,15 @@ provide(
94
94
  }
95
95
 
96
96
  &--isHorizontal .cpRadioGroup__options {
97
- flex-direction: row;
98
- gap: var(--cp-spacing-2xl);
99
- flex-wrap: wrap;
97
+ flex-flow: row wrap;
100
98
  align-items: flex-start;
99
+ gap: var(--cp-spacing-2xl);
101
100
  }
102
101
 
103
102
  &__header {
104
103
  display: flex;
105
104
  flex-direction: column;
106
- font-family: 'Figtree', sans-serif;
105
+ font-family: Figtree, sans-serif;
107
106
  font-size: var(--cp-text-size-sm);
108
107
  line-height: var(--cp-line-height-sm);
109
108
  }
@@ -114,16 +113,16 @@ provide(
114
113
  }
115
114
 
116
115
  &__label {
117
- font-weight: 500;
118
- color: var(--cp-text-primary);
119
116
  display: flex;
120
- gap: var(--cp-spacing-sm);
121
117
  align-items: baseline;
118
+ color: var(--cp-text-primary);
119
+ font-weight: 500;
120
+ gap: var(--cp-spacing-sm);
122
121
  }
123
122
 
124
123
  &__helperText {
125
- font-weight: 400;
126
124
  color: var(--cp-text-secondary);
125
+ font-weight: 400;
127
126
  }
128
127
 
129
128
  &__required {
@@ -133,8 +132,8 @@ provide(
133
132
 
134
133
  &__optional {
135
134
  color: var(--cp-text-secondary);
136
- font-weight: 400;
137
135
  font-size: var(--cp-text-size-xs);
136
+ font-weight: 400;
138
137
  line-height: var(--cp-line-height-xs);
139
138
  }
140
139
 
@@ -24,7 +24,7 @@
24
24
  </template>
25
25
 
26
26
  <script setup lang="ts">
27
- import { inject, computed } from 'vue'
27
+ import { computed, inject } from 'vue'
28
28
 
29
29
  export interface RadioOption {
30
30
  disabled?: boolean
@@ -63,9 +63,41 @@ const radioId = computed(() => getRadioId(props.option.value))
63
63
  .cpRadioNew {
64
64
  position: relative;
65
65
  display: flex;
66
- gap: var(--cp-spacing-md);
67
66
  align-items: flex-start;
68
67
  cursor: pointer;
68
+ gap: var(--cp-spacing-md);
69
+
70
+ &__label {
71
+ display: flex;
72
+ align-items: baseline;
73
+ font-weight: 500;
74
+ gap: var(--cp-spacing-sm);
75
+ }
76
+
77
+ &__helperText {
78
+ color: var(--cp-text-secondary);
79
+ font-weight: 400;
80
+ }
81
+
82
+ &__required {
83
+ color: var(--cp-text-error-primary);
84
+ font-family: Figtree, sans-serif;
85
+ font-size: var(--cp-text-size-sm);
86
+ font-weight: 700;
87
+ line-height: var(--cp-line-height-sm);
88
+ }
89
+
90
+ &__optional {
91
+ color: var(--cp-text-secondary);
92
+ font-size: var(--cp-text-size-xs);
93
+ font-weight: 400;
94
+ line-height: var(--cp-line-height-xs);
95
+ }
96
+
97
+ &--lg .cpRadioNew__optional {
98
+ font-size: var(--cp-text-size-sm);
99
+ line-height: var(--cp-line-height-sm);
100
+ }
69
101
 
70
102
  &:not(:has(.cpRadioNew__helperText)) {
71
103
  align-items: center;
@@ -75,7 +107,7 @@ const radioId = computed(() => getRadioId(props.option.value))
75
107
  &:has(:disabled) * {
76
108
  cursor: not-allowed;
77
109
  }
78
-
110
+
79
111
  &:has(:disabled) .cpRadioNew__helperText,
80
112
  &:has(:disabled) .cpRadioNew__label,
81
113
  &:has(:disabled) .cpRadioNew__optional {
@@ -95,76 +127,49 @@ const radioId = computed(() => getRadioId(props.option.value))
95
127
  line-height: var(--cp-line-height-md);
96
128
  }
97
129
 
98
- &--lg .cpRadioNew__optional {
99
- font-size: var(--cp-text-size-sm);
100
- line-height: var(--cp-line-height-sm);
101
- }
102
-
103
- &__label {
104
- font-weight: 500;
105
- display: flex;
106
- gap: var(--cp-spacing-sm);
107
- align-items: baseline;
108
- }
109
-
110
- &__helperText {
111
- font-weight: 400;
112
- color: var(--cp-text-secondary);
113
- }
114
-
115
- &__required {
116
- color: var(--cp-text-error-primary);
117
- font-weight: 700;
118
- font-size: var(--cp-text-size-sm);
119
- line-height: var(--cp-line-height-sm);
120
- font-family: 'Figtree', sans-serif;
121
- }
122
-
123
- &__optional {
124
- color: var(--cp-text-secondary);
125
- font-weight: 400;
126
- font-size: var(--cp-text-size-xs);
127
- line-height: var(--cp-line-height-xs);
130
+ &--lg {
131
+ input {
132
+ width: var(--cp-dimensions-5);
133
+ height: var(--cp-dimensions-5);
134
+ }
128
135
  }
129
136
 
130
137
  input {
131
- -webkit-appearance: none;
132
- -moz-appearance: none;
133
- appearance: none;
134
- border: var(--cp-dimensions-0_25) solid var(--cp-border-soft);
135
- border-radius: var(--cp-radius-full);
136
138
  width: var(--cp-dimensions-4);
137
139
  height: var(--cp-dimensions-4);
140
+ border: var(--cp-dimensions-0_25) solid var(--cp-border-soft);
141
+ border-radius: var(--cp-radius-full);
142
+ margin: var(--cp-spacing-sm);
143
+ appearance: none;
144
+ background-color: var(--cp-background-primary);
145
+ box-shadow: var(--cp-shadows-3xs);
138
146
  transition:
139
147
  transform 0.1s linear,
140
148
  box-shadow 0.1s linear,
141
149
  background-color 0.1s linear;
142
- margin: var(--cp-spacing-sm);
143
- box-shadow: var(--cp-shadows-3xs);
144
- background-color: var(--cp-background-primary);
150
+
151
+ &:focus {
152
+ box-shadow: var(--cp-shadow-focus-ring-accent);
153
+ }
145
154
 
146
155
  &:checked {
147
- background-color: var(--cp-foreground-accent-primary);
148
156
  border-color: var(--cp-foreground-accent-primary);
157
+ background-color: var(--cp-foreground-accent-primary);
149
158
  }
150
159
 
151
160
  &:hover:checked {
152
161
  background-color: var(--cp-foreground-accent-primary-hover);
153
162
  }
154
163
 
155
- &:focus {
156
- box-shadow: var(--cp-shadow-focus-ring-accent);
157
- }
158
-
159
- &:before {
160
- content: '';
164
+ &::before {
161
165
  display: flex;
162
166
  width: 100%;
163
167
  height: 100%;
164
168
  border-radius: var(--cp-radius-full);
165
169
  background-color: var(--cp-background-primary);
166
- transition: transform 0.15s linear;
170
+ content: '';
167
171
  transform: scale(0);
172
+ transition: transform 0.15s linear;
168
173
  }
169
174
 
170
175
  &:hover:not(:checked, :disabled) {
@@ -175,7 +180,7 @@ const radioId = computed(() => getRadioId(props.option.value))
175
180
  transform: scale(0.8);
176
181
  }
177
182
 
178
- &:checked:before {
183
+ &:checked::before {
179
184
  transform: scale(0.5);
180
185
  }
181
186
 
@@ -184,16 +189,9 @@ const radioId = computed(() => getRadioId(props.option.value))
184
189
  background-color: var(--cp-background-disabled);
185
190
  }
186
191
 
187
- &:checked:disabled:before {
192
+ &:checked:disabled::before {
188
193
  background-color: var(--cp-foreground-disabled);
189
194
  }
190
195
  }
191
-
192
- &--lg {
193
- input {
194
- width: var(--cp-dimensions-5);
195
- height: var(--cp-dimensions-5);
196
- }
197
- }
198
196
  }
199
197
  </style>
@@ -38,10 +38,11 @@
38
38
  <script setup lang="ts">
39
39
  import { computed, useId } from 'vue'
40
40
 
41
+ import type { Sizes } from '@/constants'
42
+
41
43
  import BaseInputLabel from '@/components/BaseInputLabel.vue'
42
44
  import CpTransitionExpand from '@/components/CpTransitionExpand.vue'
43
45
 
44
- import type { Sizes } from '@/constants'
45
46
  import { capitalizeFirstLetter } from '@/helpers'
46
47
 
47
48
  interface SelectOption {
@@ -106,48 +107,47 @@ const displayErrorMessage = computed(() => props.isInvalid && props.errorMessage
106
107
  .cpSelect {
107
108
  position: relative;
108
109
 
109
- &:has(.cpSelect__help, .cpSelect__error) .cpSelect__container {
110
- margin-bottom: var(--cp-spacing-md);
111
- }
112
-
113
110
  &__container {
114
111
  position: relative;
115
112
 
116
- &:after {
117
- width: var(--cp-dimensions-4);
118
- height: var(--cp-dimensions-4);
119
-
120
- content: '';
113
+ &::after {
121
114
  position: absolute;
122
- right: var(--cp-dimensions-3);
123
115
  top: 50%;
124
- transform: translateY(-50%);
116
+ right: var(--cp-dimensions-3);
117
+ width: var(--cp-dimensions-4);
118
+ height: var(--cp-dimensions-4);
125
119
  background-color: var(--cp-foreground-secondary);
120
+ content: '';
126
121
  mask-image: url('@/assets/images/icons/chevron-down-icon.svg');
127
- mask-size: cover;
128
122
  mask-repeat: no-repeat;
123
+ mask-size: cover;
129
124
  pointer-events: none;
125
+ transform: translateY(-50%);
130
126
  }
131
127
  }
132
128
 
129
+ &:has(.cpSelect__help, .cpSelect__error) .cpSelect__container {
130
+ margin-bottom: var(--cp-spacing-md);
131
+ }
132
+
133
133
  &__inner {
134
134
  @extend %u-text-ellipsis;
135
135
 
136
- box-shadow:
137
- var(--cp-shadows-3xs),
138
- 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-soft);
139
- appearance: none;
136
+ width: 100%;
137
+ padding: var(--cp-spacing-md)
138
+ calc(var(--cp-spacing-lg) + var(--cp-spacing-sm) + var(--cp-dimensions-4) + var(--cp-spacing-md))
139
+ var(--cp-spacing-md) var(--cp-spacing-xl);
140
140
  border: none;
141
141
  border-radius: var(--cp-radius-md);
142
+ appearance: none;
142
143
  background-color: var(--cp-background-primary);
143
- width: 100%;
144
+ box-shadow:
145
+ var(--cp-shadows-3xs),
146
+ 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-soft);
144
147
  color: var(--cp-foreground-primary);
145
148
  cursor: pointer;
146
- padding: var(--cp-spacing-md)
147
- calc(var(--cp-spacing-lg) + var(--cp-spacing-sm) + var(--cp-dimensions-4) + var(--cp-spacing-md))
148
- var(--cp-spacing-md) var(--cp-spacing-xl);
149
- line-height: var(--cp-line-height-md);
150
149
  font-size: var(--cp-text-size-sm);
150
+ line-height: var(--cp-line-height-md);
151
151
 
152
152
  &:hover {
153
153
  box-shadow:
@@ -156,8 +156,8 @@ const displayErrorMessage = computed(() => props.isInvalid && props.errorMessage
156
156
  }
157
157
 
158
158
  &:focus {
159
- outline: var(--cp-dimensions-0_5) solid var(--cp-focus);
160
159
  background-color: var(--cp-background-primary);
160
+ outline: var(--cp-dimensions-0_5) solid var(--cp-focus);
161
161
  }
162
162
  }
163
163
 
@@ -181,34 +181,22 @@ const displayErrorMessage = computed(() => props.isInvalid && props.errorMessage
181
181
 
182
182
  &--isDisabled {
183
183
  .cpSelect__inner {
184
- box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-disabled);
185
184
  background: var(--cp-background-disabled);
185
+ box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-disabled);
186
186
  }
187
187
 
188
188
  .cpSelect__inner,
189
- .cpSelect__container:after {
190
- cursor: not-allowed;
189
+ .cpSelect__container::after {
191
190
  color: var(--cp-text-disabled);
191
+ cursor: not-allowed;
192
192
  opacity: 1;
193
193
  }
194
194
 
195
- .cpSelect__container:after {
195
+ .cpSelect__container::after {
196
196
  background-color: var(--cp-foreground-disabled);
197
197
  }
198
198
  }
199
199
 
200
- &--isInvalid {
201
- .cpSelect__inner,
202
- .cpSelect__inner:hover,
203
- .cpSelect__inner:focus {
204
- box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-error-solid);
205
- }
206
-
207
- .cpSelect__inner:focus {
208
- outline: var(--cp-dimensions-0_5) solid var(--cp-border-error-solid);
209
- }
210
- }
211
-
212
200
  &--sm {
213
201
  .cpSelect__inner {
214
202
  padding: var(--cp-spacing-sm) calc(var(--cp-spacing-2xl) + var(--cp-dimensions-3)) var(--cp-spacing-sm)
@@ -218,16 +206,28 @@ const displayErrorMessage = computed(() => props.isInvalid && props.errorMessage
218
206
 
219
207
  &--lg {
220
208
  .cpSelect__inner {
221
- border-radius: var(--cp-radius-md-lg);
222
- font-size: var(--cp-text-size-md);
223
209
  padding: var(--cp-spacing-lg) calc(var(--cp-spacing-xl) + var(--cp-dimensions-5) + var(--cp-spacing-sm))
224
210
  var(--cp-spacing-lg) var(--cp-spacing-xl);
211
+ border-radius: var(--cp-radius-md-lg);
212
+ font-size: var(--cp-text-size-md);
225
213
  }
226
214
 
227
- .cpSelect__container:after {
215
+ .cpSelect__container::after {
228
216
  width: var(--cp-dimensions-5);
229
217
  height: var(--cp-dimensions-5);
230
218
  }
231
219
  }
220
+
221
+ &--isInvalid {
222
+ .cpSelect__inner,
223
+ .cpSelect__inner:hover,
224
+ .cpSelect__inner:focus {
225
+ box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-error-solid);
226
+ }
227
+
228
+ .cpSelect__inner:focus {
229
+ outline: var(--cp-dimensions-0_5) solid var(--cp-border-error-solid);
230
+ }
231
+ }
232
232
  }
233
233
  </style>
@@ -47,7 +47,7 @@
47
47
  </template>
48
48
 
49
49
  <script setup lang="ts">
50
- import { ref, computed, nextTick } from 'vue'
50
+ import { computed, nextTick, ref } from 'vue'
51
51
 
52
52
  export interface SelectValue {
53
53
  label: string
@@ -77,7 +77,6 @@ const props = withDefaults(defineProps<Props>(), {
77
77
  dropdownTitle: 'Select value',
78
78
  dropdownFilterPlaceholder: 'Filter...',
79
79
  dropdownEmptyViewPlaceholder: 'No option found',
80
- // eslint-disable-next-line vue/no-boolean-default
81
80
  closeOnSelect: true,
82
81
  })
83
82
 
@@ -142,19 +141,19 @@ const isSelectedValue = (value: string): boolean => {
142
141
  font-size: var(--cp-text-size-sm);
143
142
 
144
143
  &__button {
145
- box-shadow: inset 0 var(--cp-dimensions-0_25) var(--cp-dimensions-0_5) rgba(0, 0, 0, 0.12);
146
- border: none;
147
- outline: var(--cp-dimensions-0_25) solid var(--cp-border-soft);
148
- border-radius: var(--cp-radius-md-lg);
149
- background: var(--cp-background-white);
150
- padding: var(--cp-spacing-md);
151
- width: 100%;
152
144
  display: flex;
145
+ width: 100%;
153
146
  align-items: center;
154
147
  justify-content: space-between;
148
+ padding: var(--cp-spacing-md);
149
+ border: none;
150
+ border-radius: var(--cp-radius-md-lg);
151
+ background: var(--cp-background-white);
152
+ box-shadow: inset 0 var(--cp-dimensions-0_25) var(--cp-dimensions-0_5) rgba(0, 0, 0, 12%);
155
153
  font-size: inherit;
156
- line-height: var(--cp-line-height-md);
157
154
  font-weight: normal;
155
+ line-height: var(--cp-line-height-md);
156
+ outline: var(--cp-dimensions-0_25) solid var(--cp-border-soft);
158
157
  text-transform: capitalize;
159
158
 
160
159
  &:hover,
@@ -164,8 +163,8 @@ const isSelectedValue = (value: string): boolean => {
164
163
  }
165
164
 
166
165
  &:focus {
167
- outline: var(--cp-dimensions-0_5) solid var(--cp-background-accent-solid);
168
166
  box-shadow: 0 0 0 var(--cp-dimensions-0_5) var(--cp-background-accent-solid);
167
+ outline: var(--cp-dimensions-0_5) solid var(--cp-background-accent-solid);
169
168
  }
170
169
  }
171
170
 
@@ -174,10 +173,10 @@ const isSelectedValue = (value: string): boolean => {
174
173
  }
175
174
 
176
175
  &__icon {
177
- margin-left: var(--cp-dimensions-3);
178
176
  width: var(--cp-dimensions-5);
179
177
  height: var(--cp-dimensions-5);
180
178
  flex-shrink: 0;
179
+ margin-left: var(--cp-dimensions-3);
181
180
  transition: transform 0.2s ease-out;
182
181
 
183
182
  &--isOpened {
@@ -186,14 +185,14 @@ const isSelectedValue = (value: string): boolean => {
186
185
  }
187
186
 
188
187
  &__dropdown {
189
- z-index: 3;
190
188
  position: absolute;
189
+ z-index: 3;
191
190
  top: calc(100% + var(--cp-dimensions-1));
192
191
  left: 0;
192
+ width: max(100%, calc(var(--cp-dimensions-1) * 62.5));
193
193
  border: var(--cp-dimensions-0_25) solid var(--cp-border-soft);
194
194
  border-radius: var(--cp-radius-md-lg);
195
195
  background: var(--cp-background-white);
196
- width: max(100%, calc(var(--cp-dimensions-1) * 62.5));
197
196
  font-size: inherit;
198
197
  }
199
198
 
@@ -204,50 +203,51 @@ const isSelectedValue = (value: string): boolean => {
204
203
  }
205
204
 
206
205
  &__title {
207
- padding: var(--cp-spacing-lg) var(--cp-spacing-md);
208
206
  display: flex;
209
207
  align-items: center;
210
208
  justify-content: space-between;
211
- white-space: normal;
212
- font-weight: 600;
209
+ padding: var(--cp-spacing-lg) var(--cp-spacing-md);
213
210
  color: var(--cp-text-primary);
211
+ font-weight: 600;
212
+ white-space: normal;
214
213
  }
215
214
 
216
215
  &__filterBar {
216
+ display: flex;
217
+ align-items: center;
218
+ padding: var(--cp-spacing-md);
217
219
  border-top: var(--cp-dimensions-0_25) solid var(--cp-border-soft);
218
220
  border-bottom: var(--cp-dimensions-0_25) solid var(--cp-border-soft);
219
221
  background-color: var(--cp-background-disabled);
220
- padding: var(--cp-spacing-md);
221
- display: flex;
222
- align-items: center;
223
222
 
224
223
  & > input {
225
- background-color: transparent;
226
224
  flex: 1;
225
+ background-color: transparent;
227
226
  color: var(--cp-text-primary);
228
227
 
228
+ // stylelint-disable-next-line max-nesting-depth
229
229
  &::placeholder {
230
230
  color: var(--cp-text-secondary);
231
231
  }
232
232
  }
233
233
 
234
234
  i {
235
+ flex-shrink: 0;
235
236
  margin-right: var(--cp-spacing-md);
236
237
  color: var(--cp-text-primary);
237
- flex-shrink: 0;
238
238
  }
239
239
  }
240
240
 
241
241
  &__list {
242
242
  display: flex;
243
- flex-direction: column;
244
243
  min-height: calc(var(--cp-dimensions-1) * 62.5);
244
+ flex-direction: column;
245
245
  }
246
246
 
247
247
  &__items {
248
- margin: var(--cp-spacing-sm) 0;
249
- padding: 0;
250
248
  max-height: calc(var(--cp-dimensions-1) * 62.5);
249
+ padding: 0;
250
+ margin: var(--cp-spacing-sm) 0;
251
251
  overflow-y: auto;
252
252
 
253
253
  li {
@@ -257,11 +257,11 @@ const isSelectedValue = (value: string): boolean => {
257
257
 
258
258
  &__item {
259
259
  position: relative;
260
- padding: var(--cp-spacing-md) var(--cp-spacing-xl) var(--cp-spacing-md) calc(var(--cp-dimensions-1) * 9);
261
- width: 100%;
262
260
  display: flex;
263
- text-align: initial;
261
+ width: 100%;
262
+ padding: var(--cp-spacing-md) var(--cp-spacing-xl) var(--cp-spacing-md) calc(var(--cp-dimensions-1) * 9);
264
263
  cursor: pointer;
264
+ text-align: initial;
265
265
  text-transform: capitalize;
266
266
 
267
267
  &:hover {
@@ -275,18 +275,18 @@ const isSelectedValue = (value: string): boolean => {
275
275
 
276
276
  &__icon {
277
277
  position: absolute;
278
- left: var(--cp-spacing-md);
279
278
  top: 50%;
280
- transform: translateY(-50%);
279
+ left: var(--cp-spacing-md);
281
280
  color: var(--cp-background-accent-solid);
281
+ transform: translateY(-50%);
282
282
  }
283
283
 
284
284
  &__emptyState {
285
- padding: var(--cp-spacing-xl) var(--cp-spacing-md);
286
- flex: 1;
287
285
  display: flex;
286
+ flex: 1;
288
287
  align-items: center;
289
288
  justify-content: center;
289
+ padding: var(--cp-spacing-xl) var(--cp-spacing-md);
290
290
  color: var(--cp-text-secondary);
291
291
  }
292
292
  }