@citizenplane/pimp 18.7.0 → 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.
- package/biome.json +178 -0
- package/dist/components/BaseInputLabel.vue.d.ts.map +1 -1
- package/dist/components/BaseSelectClearButton.vue.d.ts.map +1 -1
- package/dist/components/CpAccordion.vue.d.ts.map +1 -1
- package/dist/components/CpAlert.vue.d.ts.map +1 -1
- package/dist/components/CpBadge.vue.d.ts.map +1 -1
- package/dist/components/CpButton.vue.d.ts.map +1 -1
- package/dist/components/CpButtonToggle.vue.d.ts +1 -1
- package/dist/components/CpButtonToggle.vue.d.ts.map +1 -1
- package/dist/components/CpCalendar.vue.d.ts.map +1 -1
- package/dist/components/CpCheckbox.vue.d.ts.map +1 -1
- package/dist/components/CpContextualMenu.vue.d.ts.map +1 -1
- package/dist/components/CpDate.vue.d.ts.map +1 -1
- package/dist/components/CpDatepicker.vue.d.ts.map +1 -1
- package/dist/components/CpInput.vue.d.ts.map +1 -1
- package/dist/components/CpItemActions.vue.d.ts.map +1 -1
- package/dist/components/CpMenu.vue.d.ts.map +1 -1
- package/dist/components/CpMenuItem.vue.d.ts.map +1 -1
- package/dist/components/CpMultiselect.vue.d.ts.map +1 -1
- package/dist/components/CpRadio.vue.d.ts.map +1 -1
- package/dist/components/CpRadioGroup.vue.d.ts.map +1 -1
- package/dist/components/CpRadioNew.vue.d.ts.map +1 -1
- package/dist/components/CpSelect.vue.d.ts.map +1 -1
- package/dist/components/CpSelectMenu.vue.d.ts.map +1 -1
- package/dist/components/CpSelectableButton.vue.d.ts +1 -1
- package/dist/components/CpSelectableButton.vue.d.ts.map +1 -1
- package/dist/components/CpSwitch.vue.d.ts.map +1 -1
- package/dist/components/CpTable.vue.d.ts.map +1 -1
- package/dist/components/CpTelInput.vue.d.ts.map +1 -1
- package/dist/components/CpTooltip.vue.d.ts +2 -0
- package/dist/components/CpTooltip.vue.d.ts.map +1 -1
- package/dist/components/CpTrip.vue.d.ts +48 -0
- package/dist/components/CpTrip.vue.d.ts.map +1 -0
- package/dist/components/CpTripTimeline.vue.d.ts +24 -0
- package/dist/components/CpTripTimeline.vue.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/composables/useDynamicSize.d.ts +9 -0
- package/dist/composables/useDynamicSize.d.ts.map +1 -0
- package/dist/constants/index.d.ts +2 -2
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/layout/Breakpoints.d.ts +9 -0
- package/dist/constants/layout/Breakpoints.d.ts.map +1 -0
- package/dist/constants/layout/Sizes.d.ts +2 -0
- package/dist/constants/layout/Sizes.d.ts.map +1 -0
- package/dist/constants/layout/index.d.ts +3 -0
- package/dist/constants/layout/index.d.ts.map +1 -0
- package/dist/helpers/functions.d.ts +1 -0
- package/dist/helpers/functions.d.ts.map +1 -1
- package/dist/libs/CoreDatepicker.vue.d.ts.map +1 -1
- package/dist/pimp.es.js +6794 -6459
- package/dist/pimp.umd.js +54 -54
- package/dist/style.css +1 -1
- package/package.json +14 -24
- package/src/assets/css/base.css +17 -11
- package/src/assets/css/colors.css +12 -22
- package/src/assets/css/dimensions.css +4 -0
- package/src/assets/css/shadows.css +0 -3
- package/src/assets/css/tokens.css +21 -65
- package/src/assets/css/typography.css +0 -17
- package/src/assets/main.css +7 -7
- package/src/assets/styles/helpers/_functions.scss +2 -2
- package/src/assets/styles/utilities/_index.scss +2 -3
- package/src/components/BaseInputLabel.vue +7 -11
- package/src/components/BaseSelectClearButton.vue +6 -7
- package/src/components/CpAccordion.vue +27 -28
- package/src/components/CpAccordionGroup.vue +2 -2
- package/src/components/CpAlert.vue +12 -11
- package/src/components/CpBadge.vue +4 -19
- package/src/components/CpButton.vue +23 -25
- package/src/components/CpButtonGroup.vue +2 -2
- package/src/components/CpButtonToggle.vue +22 -22
- package/src/components/CpCalendar.vue +30 -26
- package/src/components/CpCheckbox.vue +29 -33
- package/src/components/CpContextualMenu.vue +1 -2
- package/src/components/CpDate.vue +72 -76
- package/src/components/CpDatepicker.vue +2 -3
- package/src/components/CpDialog.vue +8 -8
- package/src/components/CpHeading.vue +6 -6
- package/src/components/CpIcon.vue +2 -2
- package/src/components/CpInput.vue +46 -48
- package/src/components/CpItemActions.vue +10 -10
- package/src/components/CpMenu.vue +8 -9
- package/src/components/CpMenuItem.vue +7 -7
- package/src/components/CpMenuList.vue +3 -3
- package/src/components/CpMultiselect.vue +29 -30
- package/src/components/CpRadio.vue +53 -59
- package/src/components/CpRadioGroup.vue +11 -12
- package/src/components/CpRadioNew.vue +56 -58
- package/src/components/CpSelect.vue +42 -42
- package/src/components/CpSelectMenu.vue +32 -32
- package/src/components/CpSelectableButton.vue +50 -51
- package/src/components/CpSwitch.vue +43 -44
- package/src/components/CpTable.vue +69 -81
- package/src/components/CpTableColumnEditor.vue +16 -16
- package/src/components/CpTableEmptyState.vue +4 -4
- package/src/components/CpTableFooter.vue +2 -2
- package/src/components/CpTableFooterDesktop.vue +2 -2
- package/src/components/CpTableFooterDetails.vue +2 -2
- package/src/components/CpTableFooterMobile.vue +4 -4
- package/src/components/CpTabs.vue +1 -1
- package/src/components/CpTelInput.vue +31 -32
- package/src/components/CpTextarea.vue +13 -13
- package/src/components/CpToast.vue +25 -24
- package/src/components/CpTooltip.vue +15 -13
- package/src/components/CpTransitionCounter.vue +1 -1
- package/src/components/CpTransitionExpand.vue +5 -5
- package/src/components/CpTransitionSize.vue +1 -1
- package/src/components/CpTrip.vue +190 -0
- package/src/components/CpTripTimeline.vue +272 -0
- package/src/components/index.ts +36 -34
- package/src/composables/useDynamicSize.ts +60 -0
- package/src/constants/index.ts +2 -2
- package/src/constants/layout/Breakpoints.ts +8 -0
- package/src/constants/layout/Sizes.ts +1 -0
- package/src/constants/layout/index.ts +3 -0
- package/src/directives/ClickOutside.ts +1 -1
- package/src/directives/ResizeSelect.ts +1 -1
- package/src/helpers/functions.ts +1 -1
- package/src/helpers/index.ts +1 -1
- package/src/libs/CoreDatepicker.vue +115 -134
- package/src/stories/Colors.stories.ts +2 -1
- package/src/stories/CpAccordion.stories.ts +2 -2
- package/src/stories/CpAccordionGroup.stories.ts +1 -2
- package/src/stories/CpButtonToggle.stories.ts +1 -2
- package/src/stories/CpCheckbox.stories.ts +1 -2
- package/src/stories/CpContextualMenu.stories.ts +1 -2
- package/src/stories/CpDate.stories.ts +1 -2
- package/src/stories/CpDatepicker.stories.ts +1 -2
- package/src/stories/CpDialog.stories.ts +1 -2
- package/src/stories/CpInput.stories.ts +1 -2
- package/src/stories/CpItemActions.stories.ts +1 -2
- package/src/stories/CpMenu.stories.ts +1 -2
- package/src/stories/CpMenuItem.stories.ts +1 -2
- package/src/stories/CpMultiselect.stories.ts +1 -2
- package/src/stories/CpRadio.stories.ts +1 -2
- package/src/stories/CpRadioGroup.stories.ts +1 -2
- package/src/stories/CpSelect.stories.ts +1 -2
- package/src/stories/CpSelectMenu.stories.ts +1 -2
- package/src/stories/CpSwitch.stories.ts +1 -2
- package/src/stories/CpTable.stories.ts +2 -3
- package/src/stories/CpTabs.stories.ts +1 -2
- package/src/stories/CpText.stories.ts +2 -1
- package/src/stories/CpTextarea.stories.ts +1 -2
- package/src/stories/CpToast.stories.ts +2 -3
- package/src/stories/CpTransitionCounter.stories.ts +1 -2
- package/src/stories/CpTransitionExpand.stories.ts +1 -2
- package/src/stories/CpTransitionListItems.stories.ts +1 -2
- package/src/stories/CpTransitionSize.stories.ts +1 -2
- package/src/stories/CpTransitionSlide.stories.ts +1 -2
- package/src/stories/CpTransitionTabContent.stories.ts +1 -2
- package/src/stories/CpTrip.stories.ts +323 -0
- package/src/stories/Dimensions.stories.ts +1 -0
- package/src/stories/Shadows.stories.ts +1 -0
- package/src/stories/Typography.stories.ts +1 -0
- package/src/vendors/ff-polyfill.ts +1 -1
- package/vitest.workspace.js +1 -1
- package/src/components/Pimp.vue +0 -10
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
</template>
|
|
25
25
|
|
|
26
26
|
<script setup lang="ts">
|
|
27
|
-
import {
|
|
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
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
|
@@ -79,38 +79,21 @@ const dynamicClasses = computed(() => {
|
|
|
79
79
|
<style lang="scss">
|
|
80
80
|
.cpSelectableButton {
|
|
81
81
|
display: inline-flex;
|
|
82
|
-
border-radius: var(--cp-selectable-border-radius);
|
|
83
82
|
padding: var(--cp-selectable-border-padding);
|
|
83
|
+
border-radius: var(--cp-selectable-border-radius);
|
|
84
|
+
background-color: var(--cp-selectable-background-color);
|
|
85
|
+
box-shadow:
|
|
86
|
+
var(--cp-selectable-box-shadow),
|
|
87
|
+
0 0 0 var(--cp-dimensions-0_25) var(--cp-selectable-border-color);
|
|
88
|
+
color: var(--cp-selectable-text-color);
|
|
84
89
|
font-size: var(--cp-selectable-font-size);
|
|
85
|
-
line-height: var(--cp-selectable-line-height);
|
|
86
90
|
font-weight: 500;
|
|
91
|
+
line-height: var(--cp-selectable-line-height);
|
|
87
92
|
transition:
|
|
88
93
|
background-color 0.1s ease-out,
|
|
89
94
|
box-shadow 0.1s ease-out,
|
|
90
95
|
color 0.1s ease-out,
|
|
91
96
|
transform 0.15s ease-out;
|
|
92
|
-
box-shadow:
|
|
93
|
-
var(--cp-selectable-box-shadow),
|
|
94
|
-
0 0 0 var(--cp-dimensions-0_25) var(--cp-selectable-border-color);
|
|
95
|
-
background-color: var(--cp-selectable-background-color);
|
|
96
|
-
color: var(--cp-selectable-text-color);
|
|
97
|
-
|
|
98
|
-
&:hover:not(.cpSelectableButton--isDisabled) {
|
|
99
|
-
box-shadow:
|
|
100
|
-
var(--cp-selectable-box-shadow),
|
|
101
|
-
0 0 0 var(--cp-dimensions-0_25) var(--cp-selectable-border-color-hover);
|
|
102
|
-
background-color: var(--cp-selectable-background-color-hover);
|
|
103
|
-
color: var(--cp-selectable-text-color-hover);
|
|
104
|
-
transform: translateY(var(--cp-dimensions-minus-0_25));
|
|
105
|
-
|
|
106
|
-
& > .cpSelectableButton__body {
|
|
107
|
-
background-color: var(--cp-selectable-body-background-color-hover);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
&:active:not(.cpSelectableButton--isDisabled) {
|
|
112
|
-
transform: translateY(var(--cp-dimensions-0_25));
|
|
113
|
-
}
|
|
114
97
|
|
|
115
98
|
&:focus-visible {
|
|
116
99
|
outline: var(--cp-dimensions-0_5) solid var(--cp-background-accent-solid);
|
|
@@ -119,25 +102,56 @@ const dynamicClasses = computed(() => {
|
|
|
119
102
|
|
|
120
103
|
&__body {
|
|
121
104
|
display: inline-flex;
|
|
105
|
+
width: 100%;
|
|
122
106
|
align-items: center;
|
|
123
107
|
justify-content: center;
|
|
124
108
|
padding: var(--cp-selectable-body-padding);
|
|
125
|
-
gap: var(--cp-selectable-body-gap);
|
|
126
|
-
background-color: var(--cp-selectable-body-background-color);
|
|
127
109
|
border-radius: var(--cp-selectable-body-border-radius);
|
|
110
|
+
background-color: var(--cp-selectable-body-background-color);
|
|
111
|
+
gap: var(--cp-selectable-body-gap);
|
|
128
112
|
transition:
|
|
129
113
|
background-color 0.1s ease-out,
|
|
130
114
|
box-shadow 0.1s ease-out,
|
|
131
115
|
color 0.1s ease-out;
|
|
132
|
-
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
&--isDisabled {
|
|
119
|
+
background-color: var(--cp-background-disabled);
|
|
120
|
+
box-shadow: var(--cp-shadows-3xs);
|
|
121
|
+
color: var(--cp-text-disabled);
|
|
122
|
+
cursor: not-allowed;
|
|
123
|
+
transform: none;
|
|
124
|
+
|
|
125
|
+
& > .cpSelectableButton__body {
|
|
126
|
+
background-color: var(--cp-background-disabled);
|
|
127
|
+
color: var(--cp-text-disabled);
|
|
128
|
+
cursor: not-allowed;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
&:hover:not(.cpSelectableButton--isDisabled) {
|
|
133
|
+
background-color: var(--cp-selectable-background-color-hover);
|
|
134
|
+
box-shadow:
|
|
135
|
+
var(--cp-selectable-box-shadow),
|
|
136
|
+
0 0 0 var(--cp-dimensions-0_25) var(--cp-selectable-border-color-hover);
|
|
137
|
+
color: var(--cp-selectable-text-color-hover);
|
|
138
|
+
transform: translateY(var(--cp-dimensions-minus-0_25));
|
|
139
|
+
|
|
140
|
+
& > .cpSelectableButton__body {
|
|
141
|
+
background-color: var(--cp-selectable-body-background-color-hover);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
&:active:not(.cpSelectableButton--isDisabled) {
|
|
146
|
+
transform: translateY(var(--cp-dimensions-0_25));
|
|
133
147
|
}
|
|
134
148
|
|
|
135
149
|
&__icon i,
|
|
136
150
|
&__icon svg {
|
|
137
151
|
width: var(--cp-selectable-icon-size);
|
|
138
152
|
height: var(--cp-selectable-icon-size);
|
|
139
|
-
aspect-ratio: 1 / 1;
|
|
140
153
|
flex-shrink: 0;
|
|
154
|
+
aspect-ratio: 1 / 1;
|
|
141
155
|
}
|
|
142
156
|
|
|
143
157
|
--cp-selectable-border-padding: var(--cp-spacing-sm);
|
|
@@ -148,7 +162,6 @@ const dynamicClasses = computed(() => {
|
|
|
148
162
|
--cp-selectable-body-gap: var(--cp-spacing-sm-md);
|
|
149
163
|
--cp-selectable-body-border-radius: var(--cp-radius-sm);
|
|
150
164
|
--cp-selectable-icon-size: var(--cp-dimensions-5);
|
|
151
|
-
|
|
152
165
|
--cp-selectable-border-color: transparent;
|
|
153
166
|
--cp-selectable-border-color-hover: transparent;
|
|
154
167
|
--cp-selectable-text-color: var(--cp-foreground-white);
|
|
@@ -342,21 +355,21 @@ const dynamicClasses = computed(() => {
|
|
|
342
355
|
--cp-selectable-text-color: var(--cp-foreground-white);
|
|
343
356
|
--cp-selectable-text-color-hover: var(--cp-foreground-white);
|
|
344
357
|
--cp-selectable-background-color: transparent;
|
|
345
|
-
--cp-selectable-background-color-hover: color-mix(in
|
|
358
|
+
--cp-selectable-background-color-hover: color-mix(in sRGB, var(--cp-background-white) 10%, transparent);
|
|
346
359
|
--cp-selectable-body-background-color: transparent;
|
|
347
360
|
--cp-selectable-body-background-color-hover: transparent;
|
|
348
361
|
--cp-selectable-box-shadow: var(--cp-shadows-3xs-inset);
|
|
349
362
|
}
|
|
350
363
|
|
|
351
364
|
&--isInverse:is(&--isSelected) {
|
|
352
|
-
--cp-selectable-border-color: color-mix(in
|
|
353
|
-
--cp-selectable-border-color-hover: color-mix(in
|
|
365
|
+
--cp-selectable-border-color: color-mix(in sRGB, var(--cp-background-white) 20%, transparent);
|
|
366
|
+
--cp-selectable-border-color-hover: color-mix(in sRGB, var(--cp-background-white) 20%, transparent);
|
|
354
367
|
--cp-selectable-text-color: var(--cp-foreground-white);
|
|
355
368
|
--cp-selectable-text-color-hover: var(--cp-foreground-white);
|
|
356
369
|
--cp-selectable-background-color: transparent;
|
|
357
370
|
--cp-selectable-background-color-hover: transparent;
|
|
358
|
-
--cp-selectable-body-background-color: color-mix(in
|
|
359
|
-
--cp-selectable-body-background-color-hover: color-mix(in
|
|
371
|
+
--cp-selectable-body-background-color: color-mix(in sRGB, var(--cp-background-white) 20%, transparent);
|
|
372
|
+
--cp-selectable-body-background-color-hover: color-mix(in sRGB, var(--cp-background-white) 30%, transparent);
|
|
360
373
|
}
|
|
361
374
|
|
|
362
375
|
&--isInverse:is(&--isExpanded) {
|
|
@@ -366,8 +379,8 @@ const dynamicClasses = computed(() => {
|
|
|
366
379
|
--cp-selectable-text-color-hover: var(--cp-foreground-white);
|
|
367
380
|
--cp-selectable-background-color: transparent;
|
|
368
381
|
--cp-selectable-background-color-hover: transparent;
|
|
369
|
-
--cp-selectable-body-background-color: color-mix(in
|
|
370
|
-
--cp-selectable-body-background-color-hover: color-mix(in
|
|
382
|
+
--cp-selectable-body-background-color: color-mix(in sRGB, var(--cp-background-white) 20%, transparent);
|
|
383
|
+
--cp-selectable-body-background-color-hover: color-mix(in sRGB, var(--cp-background-white) 30%, transparent);
|
|
371
384
|
}
|
|
372
385
|
|
|
373
386
|
&__icon {
|
|
@@ -377,23 +390,9 @@ const dynamicClasses = computed(() => {
|
|
|
377
390
|
|
|
378
391
|
&__label {
|
|
379
392
|
display: flex;
|
|
380
|
-
align-items: center;
|
|
381
393
|
flex-shrink: 0;
|
|
394
|
+
align-items: center;
|
|
382
395
|
padding: var(--cp-spacing-none) var(--cp-spacing-xs);
|
|
383
396
|
}
|
|
384
|
-
|
|
385
|
-
&--isDisabled {
|
|
386
|
-
background-color: var(--cp-background-disabled);
|
|
387
|
-
color: var(--cp-text-disabled);
|
|
388
|
-
cursor: not-allowed;
|
|
389
|
-
box-shadow: var(--cp-shadows-3xs);
|
|
390
|
-
transform: none;
|
|
391
|
-
|
|
392
|
-
& > .cpSelectableButton__body {
|
|
393
|
-
background-color: var(--cp-background-disabled);
|
|
394
|
-
color: var(--cp-text-disabled);
|
|
395
|
-
cursor: not-allowed;
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
397
|
}
|
|
399
398
|
</style>
|