@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.
Files changed (158) 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.map +1 -1
  17. package/dist/components/CpMenu.vue.d.ts.map +1 -1
  18. package/dist/components/CpMenuItem.vue.d.ts.map +1 -1
  19. package/dist/components/CpMultiselect.vue.d.ts.map +1 -1
  20. package/dist/components/CpRadio.vue.d.ts.map +1 -1
  21. package/dist/components/CpRadioGroup.vue.d.ts.map +1 -1
  22. package/dist/components/CpRadioNew.vue.d.ts.map +1 -1
  23. package/dist/components/CpSelect.vue.d.ts.map +1 -1
  24. package/dist/components/CpSelectMenu.vue.d.ts.map +1 -1
  25. package/dist/components/CpSelectableButton.vue.d.ts +1 -1
  26. package/dist/components/CpSelectableButton.vue.d.ts.map +1 -1
  27. package/dist/components/CpSwitch.vue.d.ts.map +1 -1
  28. package/dist/components/CpTable.vue.d.ts.map +1 -1
  29. package/dist/components/CpTelInput.vue.d.ts.map +1 -1
  30. package/dist/components/CpTooltip.vue.d.ts +2 -0
  31. package/dist/components/CpTooltip.vue.d.ts.map +1 -1
  32. package/dist/components/CpTrip.vue.d.ts +48 -0
  33. package/dist/components/CpTrip.vue.d.ts.map +1 -0
  34. package/dist/components/CpTripTimeline.vue.d.ts +24 -0
  35. package/dist/components/CpTripTimeline.vue.d.ts.map +1 -0
  36. package/dist/components/index.d.ts +2 -1
  37. package/dist/components/index.d.ts.map +1 -1
  38. package/dist/composables/useDynamicSize.d.ts +9 -0
  39. package/dist/composables/useDynamicSize.d.ts.map +1 -0
  40. package/dist/constants/index.d.ts +2 -2
  41. package/dist/constants/index.d.ts.map +1 -1
  42. package/dist/constants/layout/Breakpoints.d.ts +9 -0
  43. package/dist/constants/layout/Breakpoints.d.ts.map +1 -0
  44. package/dist/constants/layout/Sizes.d.ts +2 -0
  45. package/dist/constants/layout/Sizes.d.ts.map +1 -0
  46. package/dist/constants/layout/index.d.ts +3 -0
  47. package/dist/constants/layout/index.d.ts.map +1 -0
  48. package/dist/helpers/functions.d.ts +1 -0
  49. package/dist/helpers/functions.d.ts.map +1 -1
  50. package/dist/libs/CoreDatepicker.vue.d.ts.map +1 -1
  51. package/dist/pimp.es.js +6794 -6459
  52. package/dist/pimp.umd.js +54 -54
  53. package/dist/style.css +1 -1
  54. package/package.json +14 -24
  55. package/src/assets/css/base.css +17 -11
  56. package/src/assets/css/colors.css +12 -22
  57. package/src/assets/css/dimensions.css +4 -0
  58. package/src/assets/css/shadows.css +0 -3
  59. package/src/assets/css/tokens.css +21 -65
  60. package/src/assets/css/typography.css +0 -17
  61. package/src/assets/main.css +7 -7
  62. package/src/assets/styles/helpers/_functions.scss +2 -2
  63. package/src/assets/styles/utilities/_index.scss +2 -3
  64. package/src/components/BaseInputLabel.vue +7 -11
  65. package/src/components/BaseSelectClearButton.vue +6 -7
  66. package/src/components/CpAccordion.vue +27 -28
  67. package/src/components/CpAccordionGroup.vue +2 -2
  68. package/src/components/CpAlert.vue +12 -11
  69. package/src/components/CpBadge.vue +4 -19
  70. package/src/components/CpButton.vue +23 -25
  71. package/src/components/CpButtonGroup.vue +2 -2
  72. package/src/components/CpButtonToggle.vue +22 -22
  73. package/src/components/CpCalendar.vue +30 -26
  74. package/src/components/CpCheckbox.vue +29 -33
  75. package/src/components/CpContextualMenu.vue +1 -2
  76. package/src/components/CpDate.vue +72 -76
  77. package/src/components/CpDatepicker.vue +2 -3
  78. package/src/components/CpDialog.vue +8 -8
  79. package/src/components/CpHeading.vue +6 -6
  80. package/src/components/CpIcon.vue +2 -2
  81. package/src/components/CpInput.vue +46 -48
  82. package/src/components/CpItemActions.vue +10 -10
  83. package/src/components/CpMenu.vue +8 -9
  84. package/src/components/CpMenuItem.vue +7 -7
  85. package/src/components/CpMenuList.vue +3 -3
  86. package/src/components/CpMultiselect.vue +29 -30
  87. package/src/components/CpRadio.vue +53 -59
  88. package/src/components/CpRadioGroup.vue +11 -12
  89. package/src/components/CpRadioNew.vue +56 -58
  90. package/src/components/CpSelect.vue +42 -42
  91. package/src/components/CpSelectMenu.vue +32 -32
  92. package/src/components/CpSelectableButton.vue +50 -51
  93. package/src/components/CpSwitch.vue +43 -44
  94. package/src/components/CpTable.vue +69 -81
  95. package/src/components/CpTableColumnEditor.vue +16 -16
  96. package/src/components/CpTableEmptyState.vue +4 -4
  97. package/src/components/CpTableFooter.vue +2 -2
  98. package/src/components/CpTableFooterDesktop.vue +2 -2
  99. package/src/components/CpTableFooterDetails.vue +2 -2
  100. package/src/components/CpTableFooterMobile.vue +4 -4
  101. package/src/components/CpTabs.vue +1 -1
  102. package/src/components/CpTelInput.vue +31 -32
  103. package/src/components/CpTextarea.vue +13 -13
  104. package/src/components/CpToast.vue +25 -24
  105. package/src/components/CpTooltip.vue +15 -13
  106. package/src/components/CpTransitionCounter.vue +1 -1
  107. package/src/components/CpTransitionExpand.vue +5 -5
  108. package/src/components/CpTransitionSize.vue +1 -1
  109. package/src/components/CpTrip.vue +190 -0
  110. package/src/components/CpTripTimeline.vue +272 -0
  111. package/src/components/index.ts +36 -34
  112. package/src/composables/useDynamicSize.ts +60 -0
  113. package/src/constants/index.ts +2 -2
  114. package/src/constants/layout/Breakpoints.ts +8 -0
  115. package/src/constants/layout/Sizes.ts +1 -0
  116. package/src/constants/layout/index.ts +3 -0
  117. package/src/directives/ClickOutside.ts +1 -1
  118. package/src/directives/ResizeSelect.ts +1 -1
  119. package/src/helpers/functions.ts +1 -1
  120. package/src/helpers/index.ts +1 -1
  121. package/src/libs/CoreDatepicker.vue +115 -134
  122. package/src/stories/Colors.stories.ts +2 -1
  123. package/src/stories/CpAccordion.stories.ts +2 -2
  124. package/src/stories/CpAccordionGroup.stories.ts +1 -2
  125. package/src/stories/CpButtonToggle.stories.ts +1 -2
  126. package/src/stories/CpCheckbox.stories.ts +1 -2
  127. package/src/stories/CpContextualMenu.stories.ts +1 -2
  128. package/src/stories/CpDate.stories.ts +1 -2
  129. package/src/stories/CpDatepicker.stories.ts +1 -2
  130. package/src/stories/CpDialog.stories.ts +1 -2
  131. package/src/stories/CpInput.stories.ts +1 -2
  132. package/src/stories/CpItemActions.stories.ts +1 -2
  133. package/src/stories/CpMenu.stories.ts +1 -2
  134. package/src/stories/CpMenuItem.stories.ts +1 -2
  135. package/src/stories/CpMultiselect.stories.ts +1 -2
  136. package/src/stories/CpRadio.stories.ts +1 -2
  137. package/src/stories/CpRadioGroup.stories.ts +1 -2
  138. package/src/stories/CpSelect.stories.ts +1 -2
  139. package/src/stories/CpSelectMenu.stories.ts +1 -2
  140. package/src/stories/CpSwitch.stories.ts +1 -2
  141. package/src/stories/CpTable.stories.ts +2 -3
  142. package/src/stories/CpTabs.stories.ts +1 -2
  143. package/src/stories/CpText.stories.ts +2 -1
  144. package/src/stories/CpTextarea.stories.ts +1 -2
  145. package/src/stories/CpToast.stories.ts +2 -3
  146. package/src/stories/CpTransitionCounter.stories.ts +1 -2
  147. package/src/stories/CpTransitionExpand.stories.ts +1 -2
  148. package/src/stories/CpTransitionListItems.stories.ts +1 -2
  149. package/src/stories/CpTransitionSize.stories.ts +1 -2
  150. package/src/stories/CpTransitionSlide.stories.ts +1 -2
  151. package/src/stories/CpTransitionTabContent.stories.ts +1 -2
  152. package/src/stories/CpTrip.stories.ts +323 -0
  153. package/src/stories/Dimensions.stories.ts +1 -0
  154. package/src/stories/Shadows.stories.ts +1 -0
  155. package/src/stories/Typography.stories.ts +1 -0
  156. package/src/vendors/ff-polyfill.ts +1 -1
  157. package/vitest.workspace.js +1 -1
  158. package/src/components/Pimp.vue +0 -10
@@ -41,13 +41,13 @@
41
41
  </template>
42
42
 
43
43
  <script setup lang="ts">
44
+ import type { ComponentPublicInstance } from 'vue'
44
45
  import { computed, nextTick, ref, useAttrs, useId, useTemplateRef } from 'vue'
45
46
 
46
- import type { ComponentPublicInstance } from 'vue'
47
+ import type { Sizes } from '@/constants'
47
48
 
48
49
  import BaseInputLabel from '@/components/BaseInputLabel.vue'
49
50
 
50
- import type { Sizes } from '@/constants'
51
51
  import { capitalizeFirstLetter } from '@/helpers'
52
52
 
53
53
  interface Props {
@@ -179,21 +179,21 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
179
179
  }
180
180
 
181
181
  &__container {
182
- z-index: 9;
183
182
  position: relative;
183
+ z-index: 9;
184
184
  display: flex;
185
185
  }
186
186
 
187
187
  &__wrapper {
188
188
  --box-shadow: var(--cp-shadows-3xs-inset);
189
189
 
190
+ width: 100%;
190
191
  border: 0;
192
+ border-radius: var(--cp-radius-md-lg);
193
+ appearance: none;
191
194
  box-shadow:
192
195
  var(--box-shadow),
193
196
  0 0 0 var(--cp-dimensions-0_25) var(--cp-border-soft);
194
- appearance: none;
195
- border-radius: var(--cp-radius-md-lg);
196
- width: 100%;
197
197
  color: inherit;
198
198
 
199
199
  &:not(.cpTelInput__wrapper--isDisabled):focus-within {
@@ -237,19 +237,19 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
237
237
 
238
238
  &__input {
239
239
  padding: var(--cp-spacing-md) var(--cp-spacing-xl);
240
+ border-bottom-right-radius: var(--cp-radius-md-lg);
241
+ border-top-right-radius: var(--cp-radius-md-lg);
240
242
  color: inherit;
241
- line-height: var(--cp-line-height-md);
242
243
  font-size: var(--cp-text-size-sm);
243
- border-top-right-radius: var(--cp-radius-md-lg);
244
- border-bottom-right-radius: var(--cp-radius-md-lg);
244
+ line-height: var(--cp-line-height-md);
245
245
 
246
246
  &:is(:hover, :focus) {
247
247
  z-index: 1;
248
248
  }
249
249
 
250
250
  &:not(.cpTelInput__input--isInvalid, .cpTelInput__input--isDisabled):focus {
251
- outline: var(--cp-dimensions-0_5) solid var(--cp-border-accent-solid);
252
251
  background-color: var(--cp-background-primary);
252
+ outline: var(--cp-dimensions-0_5) solid var(--cp-border-accent-solid);
253
253
  }
254
254
 
255
255
  &::placeholder {
@@ -257,8 +257,8 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
257
257
  }
258
258
 
259
259
  &--isDisabled {
260
- pointer-events: none;
261
260
  background-color: var(--cp-background-disabled);
261
+ pointer-events: none;
262
262
  }
263
263
  }
264
264
 
@@ -268,8 +268,8 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
268
268
  }
269
269
 
270
270
  .cpTelInput__input:focus {
271
- outline: var(--cp-dimensions-0_5) solid var(--cp-border-error-solid);
272
271
  box-shadow: 0 0 0 var(--cp-dimensions-0_25) solid var(--cp-border-error-solid);
272
+ outline: var(--cp-dimensions-0_5) solid var(--cp-border-error-solid);
273
273
  }
274
274
  }
275
275
 
@@ -280,20 +280,20 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
280
280
  }
281
281
 
282
282
  .vti__dropdown.open .cpTelInput__arrow {
283
- transform: rotate(180deg);
284
283
  color: var(--cp-foreground-primary);
284
+ transform: rotate(180deg);
285
285
  }
286
286
 
287
287
  .vti__dropdown {
288
- z-index: 1;
289
288
  position: unset;
289
+ z-index: 1;
290
290
  border-right: var(--cp-dimensions-0_25) solid var(--cp-border-strong);
291
291
 
292
292
  &:focus,
293
293
  &:focus-within {
294
294
  z-index: 2;
295
- outline: var(--cp-dimensions-0_5) solid var(--cp-border-accent-solid);
296
295
  border-right: var(--cp-dimensions-0_25) solid transparent;
296
+ outline: var(--cp-dimensions-0_5) solid var(--cp-border-accent-solid);
297
297
  }
298
298
  }
299
299
 
@@ -323,8 +323,8 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
323
323
  }
324
324
 
325
325
  .vti__flag {
326
- max-width: var(--cp-dimensions-5);
327
326
  min-width: var(--cp-dimensions-5);
327
+ max-width: var(--cp-dimensions-5);
328
328
  border-radius: var(--cp-radius-xs);
329
329
  }
330
330
 
@@ -342,26 +342,26 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
342
342
  }
343
343
 
344
344
  .vti__search_box {
345
+ width: 100%;
346
+ padding: var(--cp-spacing-sm) var(--cp-spacing-sm) var(--cp-spacing-sm) var(--cp-spacing-md);
347
+ border: none;
348
+ border-radius: var(--cp-radius-sm-md);
349
+ appearance: none;
345
350
  box-shadow:
346
351
  var(--cp-shadows-3xs),
347
352
  0 0 0 var(--cp-dimensions-0_25) var(--cp-border-soft);
348
- appearance: none;
349
- border-radius: var(--cp-radius-sm-md);
350
- width: 100%;
351
353
  color: inherit;
352
- padding: var(--cp-spacing-sm) var(--cp-spacing-sm) var(--cp-spacing-sm) var(--cp-spacing-md);
353
- line-height: var(--cp-line-height-md);
354
354
  font-size: var(--cp-text-size-sm);
355
+ line-height: var(--cp-line-height-md);
355
356
  text-indent: calc(var(--cp-dimensions-1) * 7);
356
- border: none;
357
357
 
358
358
  &:hover {
359
359
  box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-soft-hover);
360
360
  }
361
361
 
362
362
  &:focus {
363
- outline: var(--cp-dimensions-0_5) solid var(--cp-border-accent-solid);
364
363
  background-color: var(--cp-background-primary);
364
+ outline: var(--cp-dimensions-0_5) solid var(--cp-border-accent-solid);
365
365
  }
366
366
 
367
367
  &::placeholder {
@@ -370,22 +370,21 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
370
370
  }
371
371
 
372
372
  &__searchIcon {
373
- width: var(--cp-dimensions-4);
374
- height: var(--cp-dimensions-4);
375
-
376
373
  position: absolute;
377
374
  top: 50%;
378
- transform: translateY(-50%);
379
375
  left: var(--cp-dimensions-3);
376
+ width: var(--cp-dimensions-4);
377
+ height: var(--cp-dimensions-4);
378
+ transform: translateY(-50%);
380
379
  }
381
380
 
382
381
  .vti__dropdown-list {
383
- clip-path: inset(0 round var(--cp-radius-md-lg));
384
- max-height: calc(var(--cp-dimensions-1) * 32.5);
385
382
  width: calc(100% + var(--cp-dimensions-0_5));
383
+ max-height: calc(var(--cp-dimensions-1) * 32.5);
386
384
  padding: var(--cp-spacing-sm);
387
- border-radius: var(--cp-radius-md-lg);
388
385
  border: var(--cp-dimensions-0_25) solid var(--cp-border-soft);
386
+ border-radius: var(--cp-radius-md-lg);
387
+ clip-path: inset(0 round var(--cp-radius-md-lg));
389
388
 
390
389
  &:has(.vti__search_box) {
391
390
  max-height: calc(var(--cp-dimensions-1) * 42.5);
@@ -401,9 +400,9 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
401
400
  }
402
401
 
403
402
  .vti__dropdown-item {
404
- padding: var(--cp-spacing-lg) var(--cp-spacing-xl) var(--cp-spacing-lg) var(--cp-spacing-lg);
405
403
  display: flex;
406
404
  align-items: flex-start;
405
+ padding: var(--cp-spacing-lg) var(--cp-spacing-xl) var(--cp-spacing-lg) var(--cp-spacing-lg);
407
406
  border-radius: var(--cp-radius-sm-md);
408
407
  font-size: var(--cp-text-size-sm);
409
408
  line-height: var(--cp-line-height-md);
@@ -430,8 +429,8 @@ const handleOnValidate = (phoneObject: PhoneObject) => emit('validate', phoneObj
430
429
 
431
430
  &--lg {
432
431
  .cpTelInput__input {
433
- font-size: var(--cp-text-size-md);
434
432
  padding: var(--cp-spacing-lg) var(--cp-spacing-xl);
433
+ font-size: var(--cp-text-size-md);
435
434
  }
436
435
 
437
436
  .vti__dropdown {
@@ -28,7 +28,7 @@
28
28
  </template>
29
29
 
30
30
  <script setup lang="ts">
31
- import { ref, computed, useId } from 'vue'
31
+ import { computed, ref, useId } from 'vue'
32
32
 
33
33
  import BaseInputLabel from '@/components/BaseInputLabel.vue'
34
34
  import CpTransitionExpand from '@/components/CpTransitionExpand.vue'
@@ -89,19 +89,19 @@ const handleChange = (newValue: string) => emit('update:modelValue', newValue)
89
89
  position: relative;
90
90
 
91
91
  &__input {
92
- appearance: none;
92
+ width: 100%;
93
+ max-width: 100%;
94
+ height: 100%;
95
+ padding: var(--cp-spacing-xl);
93
96
  border: none;
97
+ border-radius: var(--cp-radius-md-lg);
98
+ appearance: none;
94
99
  box-shadow:
95
100
  var(--cp-shadows-3xs),
96
101
  0 0 0 var(--cp-dimensions-0_25) var(--cp-border-soft);
97
- border-radius: var(--cp-radius-md-lg);
98
- outline: none;
99
- padding: var(--cp-spacing-xl);
100
- width: 100%;
101
- max-width: 100%;
102
- height: 100%;
103
- font-size: var(--cp-text-size-md);
104
102
  color: var(--cp-text-primary);
103
+ font-size: var(--cp-text-size-md);
104
+ outline: none;
105
105
 
106
106
  &:hover {
107
107
  box-shadow:
@@ -110,15 +110,15 @@ const handleChange = (newValue: string) => emit('update:modelValue', newValue)
110
110
  }
111
111
 
112
112
  &:focus {
113
- outline: var(--cp-dimensions-0_5) solid var(--cp-focus);
114
113
  background-color: var(--cp-background-primary);
114
+ outline: var(--cp-dimensions-0_5) solid var(--cp-focus);
115
115
  }
116
116
 
117
117
  &:disabled {
118
- cursor: not-allowed;
119
118
  background: var(--cp-background-disabled);
120
- color: var(--cp-text-disabled);
121
119
  box-shadow: 0 0 0 var(--cp-dimensions-0_25) var(--cp-border-disabled);
120
+ color: var(--cp-text-disabled);
121
+ cursor: not-allowed;
122
122
  }
123
123
 
124
124
  &::placeholder {
@@ -144,9 +144,9 @@ const handleChange = (newValue: string) => emit('update:modelValue', newValue)
144
144
  }
145
145
 
146
146
  &__error {
147
+ color: var(--cp-text-error-primary);
147
148
  font-size: var(--cp-text-size-sm);
148
149
  line-height: var(--cp-line-height-md);
149
- color: var(--cp-text-error-primary);
150
150
  }
151
151
  }
152
152
  </style>
@@ -68,7 +68,6 @@ import { useWebHaptics } from 'web-haptics/vue'
68
68
 
69
69
  import { CpToastTypes } from '@/constants/CpToastTypes'
70
70
  import { Haptics } from '@/constants/Hapitcs'
71
-
72
71
  import { capitalizeFirstLetter } from '@/helpers'
73
72
 
74
73
  interface Message {
@@ -177,9 +176,9 @@ const handleToastAdded = (message: Message) => {
177
176
 
178
177
  .p-toast-message-enter-from,
179
178
  .p-toast-message-leave-to {
179
+ z-index: -1;
180
180
  opacity: 0;
181
181
  transform: translate3d(0, calc(var(--cp-dimensions-1) * -7.5), 0) scale3d(0.75, 0.75, 1);
182
- z-index: -1;
183
182
  }
184
183
 
185
184
  .cpToasts {
@@ -188,8 +187,8 @@ const handleToastAdded = (message: Message) => {
188
187
 
189
188
  .cpToasts .p-toast-message-leave-active:not(:only-child) {
190
189
  position: absolute;
191
- left: 0;
192
190
  right: 0;
191
+ left: 0;
193
192
  }
194
193
 
195
194
  .cpToasts[data-p$='center'] {
@@ -206,24 +205,24 @@ const handleToastAdded = (message: Message) => {
206
205
  .cpToasts > div {
207
206
  display: flex;
208
207
  flex-direction: column;
209
- pointer-events: auto;
210
208
  gap: var(--cp-spacing-md);
209
+ pointer-events: auto;
211
210
  }
212
211
 
213
212
  .cpToast {
214
213
  --toaster-shadow: #{var(--cp-drop-shadow-md-offset-x)} #{var(--cp-drop-shadow-md-offset-y)}
215
214
  #{var(--cp-drop-shadow-md-blur)} #{var(--cp-drop-shadow-md-spread)} #{var(--cp-drop-shadow-md-color)};
216
215
 
216
+ position: relative;
217
217
  display: inline-flex;
218
218
  overflow: hidden;
219
- position: relative;
220
- flex-direction: column;
221
219
  max-width: calc(var(--cp-dimensions-1) * 100);
220
+ flex-direction: column;
222
221
  padding: var(--cp-spacing-lg);
223
222
  border-radius: var(--cp-radius-md);
223
+ background-color: var(--cp-background-primary);
224
224
  box-shadow: var(--toaster-shadow);
225
225
  gap: var(--cp-spacing-md);
226
- background-color: var(--cp-background-primary);
227
226
 
228
227
  &__inner {
229
228
  display: flex;
@@ -233,11 +232,11 @@ const handleToastAdded = (message: Message) => {
233
232
 
234
233
  &__content {
235
234
  display: flex;
235
+ flex: 1;
236
236
  flex-direction: column;
237
237
  align-items: flex-start;
238
- flex: 1;
239
- text-align: left;
240
238
  gap: var(--cp-spacing-sm);
239
+ text-align: left;
241
240
  }
242
241
 
243
242
  &__icon {
@@ -255,30 +254,30 @@ const handleToastAdded = (message: Message) => {
255
254
  }
256
255
 
257
256
  &__summary {
258
- font-weight: 600;
259
257
  color: var(--cp-text-accent-primary);
258
+ font-weight: 600;
260
259
 
261
- &:first-letter {
260
+ &::first-letter {
262
261
  text-transform: capitalize;
263
262
  }
264
263
  }
265
264
 
266
265
  &__detail {
267
- font-weight: 500;
268
266
  color: var(--cp-text-accent-secondary);
267
+ font-weight: 500;
269
268
  }
270
269
 
271
270
  &__actions {
272
- margin-top: var(--cp-spacing-sm);
273
271
  display: flex;
274
272
  justify-content: flex-end;
273
+ margin-top: var(--cp-spacing-sm);
275
274
  gap: var(--cp-spacing-md);
276
275
  }
277
276
 
278
277
  &__close {
279
278
  display: flex;
280
- margin-top: var(--cp-spacing-xs);
281
279
  border-radius: var(--cp-radius-full);
280
+ margin-top: var(--cp-spacing-xs);
282
281
 
283
282
  &:focus-visible {
284
283
  outline: var(--cp-dimensions-0_5) solid var(--cp-border-accent-solid);
@@ -289,25 +288,23 @@ const handleToastAdded = (message: Message) => {
289
288
  from {
290
289
  transform: scale3d(1, 1, 1);
291
290
  }
291
+
292
292
  to {
293
293
  transform: scale3d(0, 1, 1);
294
294
  }
295
295
  }
296
296
 
297
- &:has(.cpToast__timer):hover .cpToast__timer {
298
- animation-play-state: paused;
299
- }
300
-
301
297
  &__timer {
302
298
  position: absolute;
303
- inset: 0;
304
299
  top: auto;
305
300
  height: var(--cp-dimensions-1);
306
- transform-origin: left;
301
+ animation-fill-mode: forwards;
307
302
  animation-name: toast-timer;
308
303
  animation-timing-function: linear;
309
- animation-fill-mode: forwards;
310
304
  background-color: var(--cp-border-accent-solid);
305
+ // stylelint-disable-next-line declaration-block-no-shorthand-property-overrides
306
+ inset: 0;
307
+ transform-origin: left;
311
308
  }
312
309
 
313
310
  &--isInfo {
@@ -393,21 +390,25 @@ const handleToastAdded = (message: Message) => {
393
390
  background-color: var(--cp-border-warning-solid);
394
391
  }
395
392
  }
393
+
394
+ &:has(.cpToast__timer):hover .cpToast__timer {
395
+ animation-play-state: paused;
396
+ }
396
397
  }
397
398
 
398
399
  @media (max-width: 551px) {
399
400
  .cpToasts {
400
- max-width: calc(100% - #{calc(var(--cp-spacing-2xl) * 3)});
401
- width: 100%;
402
401
  right: 0 !important;
403
402
  left: 0;
403
+ width: 100%;
404
+ max-width: calc(100% - #{calc(var(--cp-spacing-2xl) * 3)});
404
405
  margin: 0 auto;
405
406
  text-align: center;
406
407
  }
407
408
 
408
409
  .cpToast {
409
- max-width: 100%;
410
410
  min-width: 100%;
411
+ max-width: 100%;
411
412
  }
412
413
  }
413
414
 
@@ -1,12 +1,11 @@
1
1
  <template>
2
2
  <v-tooltip
3
3
  :aria-id="ariaId"
4
- class="cpTooltip"
5
- :class="dynamicTooltipClasses"
6
- :container="false"
4
+ :popper-class="dynamicTooltipClasses"
7
5
  :disabled
8
6
  :distance
9
7
  :placement
8
+ :container="dynamicContainer"
10
9
  >
11
10
  <slot />
12
11
  <template #popper>
@@ -34,10 +33,10 @@
34
33
  </template>
35
34
 
36
35
  <script setup lang="ts">
36
+ // biome-ignore lint: required for floating-vue
37
37
  import { Tooltip as VTooltip } from 'floating-vue'
38
- import { useId, useSlots, computed } from 'vue'
39
-
40
38
  import type { Slots } from 'vue'
39
+ import { computed, useId, useSlots } from 'vue'
41
40
 
42
41
  import { Colors } from '@/constants'
43
42
  import { capitalizeFirstLetter } from '@/helpers'
@@ -46,6 +45,7 @@ type TooltipColors = Extract<Colors, 'accent' | 'neutral'>
46
45
  type Placement = 'top' | 'right' | 'bottom' | 'left'
47
46
 
48
47
  interface Props {
48
+ allowOutsideContainer?: boolean
49
49
  color?: TooltipColors
50
50
  content?: string
51
51
  disabled?: boolean
@@ -60,6 +60,7 @@ const props = withDefaults(defineProps<Props>(), {
60
60
  color: 'accent',
61
61
  placement: undefined,
62
62
  subcontent: '',
63
+ allowOutsideContainer: false,
63
64
  })
64
65
 
65
66
  const ariaId = useId()
@@ -67,7 +68,8 @@ const slots: Slots = useSlots()
67
68
 
68
69
  const hasSubcontent = computed(() => !!(props.subcontent || slots.subcontent))
69
70
 
70
- const dynamicTooltipClasses = computed(() => [`cpTooltip--is${capitalizeFirstLetter(props.color)}`])
71
+ const dynamicTooltipClasses = computed(() => ['cpTooltip', `cpTooltip--is${capitalizeFirstLetter(props.color)}`])
72
+ const dynamicContainer = computed(() => props.allowOutsideContainer ? undefined : false)
71
73
  </script>
72
74
 
73
75
  <style lang="scss">
@@ -76,14 +78,14 @@ const dynamicTooltipClasses = computed(() => [`cpTooltip--is${capitalizeFirstLet
76
78
  white-space: pre-wrap;
77
79
 
78
80
  .v-popper__inner {
81
+ max-width: fn.px-to-rem(300);
79
82
  padding: var(--cp-spacing-md) var(--cp-spacing-lg);
80
83
  border-radius: var(--cp-radius-md);
81
84
  background-color: var(--cp-tooltip-bg);
82
85
  font-size: var(--cp-text-size-xs);
86
+ font-weight: 400;
83
87
  line-height: var(--cp-line-height-xs);
84
- max-width: fn.px-to-rem(300);
85
88
  text-align: left;
86
- font-weight: 400;
87
89
  }
88
90
 
89
91
  .cpTooltip__content {
@@ -97,16 +99,16 @@ const dynamicTooltipClasses = computed(() => [`cpTooltip--is${capitalizeFirstLet
97
99
  }
98
100
 
99
101
  .cpTooltip__separator {
102
+ width: 100%;
100
103
  border: none;
101
104
  border-top: 1px solid var(--cp-colors-white);
102
- opacity: 0.5;
103
- width: 100%;
104
105
  margin: var(--cp-spacing-md) 0;
106
+ opacity: 0.5;
105
107
  }
106
108
 
107
109
  .cpTooltip__subcontent {
108
- font-style: italic;
109
110
  color: var(--cp-tooltip-subcontent-text);
111
+ font-style: italic;
110
112
  }
111
113
 
112
114
  .v-popper__arrow-outer {
@@ -120,9 +122,9 @@ const dynamicTooltipClasses = computed(() => [`cpTooltip--is${capitalizeFirstLet
120
122
  }
121
123
 
122
124
  &.cpTooltip--isNeutral {
123
- --cp-tooltip-bg: color-mix(in srgb, var(--cp-background-black) 80%, transparent);
125
+ --cp-tooltip-bg: color-mix(in sRGB, var(--cp-background-black) 80%, transparent);
124
126
  --cp-tooltip-content-text: var(--cp-foreground-white);
125
- --cp-tooltip-subcontent-text: color-mix(in srgb, var(--cp-foreground-white) 70%, transparent);
127
+ --cp-tooltip-subcontent-text: color-mix(in sRGB, var(--cp-foreground-white) 70%, transparent);
126
128
  }
127
129
  }
128
130
  </style>
@@ -9,7 +9,7 @@
9
9
  </template>
10
10
 
11
11
  <script setup lang="ts">
12
- import { ref, computed, watch } from 'vue'
12
+ import { computed, ref, watch } from 'vue'
13
13
 
14
14
  interface Props {
15
15
  counterNumber?: number
@@ -29,7 +29,7 @@ const enter = (element: Element) => {
29
29
  // Force repaint to make sure the
30
30
  // animation is triggered correctly.
31
31
 
32
- // @typescript-eslint/no-unused-expressions
32
+ // Intentional expression statement to force layout recalculation before animating.
33
33
  void getComputedStyle(el).height
34
34
 
35
35
  requestAnimationFrame(() => (el.style.height = height))
@@ -51,20 +51,20 @@ const leave = (element: Element): void => {
51
51
 
52
52
  <style scoped>
53
53
  * {
54
- will-change: height;
55
- transform: translateZ(0);
56
54
  backface-visibility: hidden;
57
55
  perspective: 1000px;
56
+ transform: translateZ(0);
57
+ will-change: height;
58
58
  }
59
59
  </style>
60
60
 
61
61
  <style lang="scss">
62
62
  .expand-enter-active,
63
63
  .expand-leave-active {
64
- transition-property: opacity, height;
64
+ overflow: hidden;
65
65
  transition-duration: 0.2s;
66
+ transition-property: opacity, height;
66
67
  transition-timing-function: ease-out;
67
- overflow: hidden;
68
68
  }
69
69
 
70
70
  .expand-enter-from,
@@ -5,7 +5,7 @@
5
5
  </template>
6
6
 
7
7
  <script setup lang="ts">
8
- import { computed, ref, onMounted, onBeforeUnmount, useId, nextTick } from 'vue'
8
+ import { computed, nextTick, onBeforeUnmount, onMounted, ref, useId } from 'vue'
9
9
 
10
10
  interface Props {
11
11
  type?: 'width' | 'height'