@citizenplane/pimp 8.26.0 → 8.27.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 (150) hide show
  1. package/dist/{IconAccompaniedMinorEach-DDeSlaA_.js → IconAccompaniedMinorEach-BJYaPpW3.js} +1 -1
  2. package/dist/{IconAccompaniedMinorNone-BKs1gk1K.js → IconAccompaniedMinorNone-D1JR2Qpd.js} +1 -1
  3. package/dist/{IconAccompaniedMinorOne-CpL8FNve.js → IconAccompaniedMinorOne-BJ3jzEDZ.js} +1 -1
  4. package/dist/{IconAddReceipt-DLH3pqjA.js → IconAddReceipt-BX_va94f.js} +1 -1
  5. package/dist/{IconAirportTerminal-Cc4CU6MC.js → IconAirportTerminal-Dzr98nfc.js} +1 -1
  6. package/dist/{IconArrival-CdtUsRVo.js → IconArrival-Ced9HrJH.js} +1 -1
  7. package/dist/{IconBroadcast-QjMZtFA9.js → IconBroadcast-BYX44Wak.js} +1 -1
  8. package/dist/{IconCabinBag-xVC6mOQF.js → IconCabinBag-D1Qs952U.js} +1 -1
  9. package/dist/{IconCheckedBaggage-I_1h49TJ.js → IconCheckedBaggage-Q4_SQL9l.js} +1 -1
  10. package/dist/{IconCheckedBaggage20-CyPcsqrn.js → IconCheckedBaggage20-DVH1-A0V.js} +1 -1
  11. package/dist/{IconCheckedBaggage30-s5htbUIA.js → IconCheckedBaggage30-DYOAf-7Z.js} +1 -1
  12. package/dist/{IconChild-DL43kbm1.js → IconChild-BeCLAr8Y.js} +1 -1
  13. package/dist/{IconContact-FdhTr03q.js → IconContact-B3r39fyI.js} +1 -1
  14. package/dist/{IconDeparture-DNR3OGPD.js → IconDeparture-BflKZUiE.js} +1 -1
  15. package/dist/{IconDistribution-Cl8L6177.js → IconDistribution-CBxQ7UWb.js} +1 -1
  16. package/dist/{IconDistributionClosed-DBT6wR78.js → IconDistributionClosed-BWp_k24K.js} +1 -1
  17. package/dist/{IconDistributionExclusivePair-CkRG6yNV.js → IconDistributionExclusivePair-erLbcLps.js} +1 -1
  18. package/dist/{IconDistributionSided-D_wdvDNf.js → IconDistributionSided-y000n4qB.js} +1 -1
  19. package/dist/{IconDistributionSupplySided-C3VcE8Dw.js → IconDistributionSupplySided-7kCvGwnz.js} +1 -1
  20. package/dist/{IconDynamicContent-Ct1HRd3s.js → IconDynamicContent-SwBxkPMB.js} +1 -1
  21. package/dist/{IconFares-dIGVrtE4.js → IconFares-DTm0Q_RI.js} +1 -1
  22. package/dist/{IconFaresOutlined-bd8kT44f.js → IconFaresOutlined-BFMo_x9Q.js} +1 -1
  23. package/dist/{IconFemale-CMeYHrDy.js → IconFemale-Ma0KeaEM.js} +1 -1
  24. package/dist/{IconFindConversation-BdN2Yd3R.js → IconFindConversation-CpsDYPgD.js} +1 -1
  25. package/dist/{IconFire-obwuluyJ.js → IconFire-DECrDnLM.js} +1 -1
  26. package/dist/{IconFlight-B_6tJxB3.js → IconFlight-D5M0A0CM.js} +1 -1
  27. package/dist/{IconFlightReturn-BEO97PwR.js → IconFlightReturn-CTvqEFME.js} +1 -1
  28. package/dist/{IconHandHeart-hs0yFSEL.js → IconHandHeart-ChgdfXQa.js} +1 -1
  29. package/dist/{IconHistory-CT-jOMRt.js → IconHistory-DpIXDYI5.js} +1 -1
  30. package/dist/{IconHourGlass-CF940vmy.js → IconHourGlass-CIRkFUSM.js} +1 -1
  31. package/dist/{IconIdCard-DKkU58Ix.js → IconIdCard-UD5VZsUi.js} +1 -1
  32. package/dist/{IconInfant-DIUT-6_4.js → IconInfant-CmLUvWpO.js} +1 -1
  33. package/dist/{IconItinerary-D7mOGUmj.js → IconItinerary-CY8irele.js} +1 -1
  34. package/dist/{IconLeave-BExl4uyV.js → IconLeave-C3bpPz6L.js} +1 -1
  35. package/dist/{IconMale-eHGH5XBz.js → IconMale-x4xdulWB.js} +1 -1
  36. package/dist/{IconMultiSegments-KkrKiZrK.js → IconMultiSegments-BhTMfvhQ.js} +1 -1
  37. package/dist/{IconNoPassport-PJ2QqqoI.js → IconNoPassport-_Xm76k6b.js} +1 -1
  38. package/dist/{IconNoRefund-W47AQisu.js → IconNoRefund-B78s0oyF.js} +1 -1
  39. package/dist/{IconNotion-CCnhatKK.js → IconNotion-C22PTLTU.js} +1 -1
  40. package/dist/{IconOffline-3wunTEJG.js → IconOffline-BDzikWE9.js} +1 -1
  41. package/dist/{IconOneWay-BQ5K41Bu.js → IconOneWay-DlTVxokv.js} +2 -2
  42. package/dist/{IconPaid-zwDwWzF8.js → IconPaid-DmGERe85.js} +1 -1
  43. package/dist/{IconPassport-IxhNLS8P.js → IconPassport-6VOlXjxJ.js} +1 -1
  44. package/dist/{IconPayout-BNSON3dj.js → IconPayout-abr6BXCd.js} +1 -1
  45. package/dist/{IconReceipt-DOosYtgi.js → IconReceipt-BnTaihcq.js} +1 -1
  46. package/dist/{IconRecurrence-B8i5kO2Q.js → IconRecurrence-C5TPG2ht.js} +1 -1
  47. package/dist/{IconRefund-DkjF9lEI.js → IconRefund-Ysv8pyMJ.js} +1 -1
  48. package/dist/{IconRoundTrip-BZvhS65z.js → IconRoundTrip-CIVDw8LK.js} +1 -1
  49. package/dist/{IconRouteNoStop-CeSlfnpx.js → IconRouteNoStop-DQrq4gW5.js} +1 -1
  50. package/dist/{IconRouteOneStop-aP1Mj-Bv.js → IconRouteOneStop-pzisj4i4.js} +1 -1
  51. package/dist/{IconScheduleChange-QQ4AMAMI.js → IconScheduleChange-BONs1AAT.js} +1 -1
  52. package/dist/{IconSeatEmpty-DgVBD165.js → IconSeatEmpty-CHij3aGA.js} +1 -1
  53. package/dist/{IconSeatSold-BGBwNZUa.js → IconSeatSold-QspS_zCh.js} +1 -1
  54. package/dist/{IconSeatTotal-Dq9uXccZ.js → IconSeatTotal-DTZ1TcAX.js} +1 -1
  55. package/dist/{IconTemplate-BgruEhjI.js → IconTemplate-BDmmr-9L.js} +1 -1
  56. package/dist/{IconTicket-BTaYnuPt.js → IconTicket--vVn61Ey.js} +1 -1
  57. package/dist/{IconTimer-CyJzne5T.js → IconTimer-CspKpwqZ.js} +1 -1
  58. package/dist/{IconTrafficControl-BeQtpwhK.js → IconTrafficControl-DBamcJNe.js} +1 -1
  59. package/dist/{index-B8RNa4cx.js → index-C3oHnZQk.js} +9152 -10064
  60. package/dist/pimp.es.js +1 -1
  61. package/dist/pimp.umd.js +17 -17
  62. package/dist/style.css +1 -1
  63. package/package.json +2 -1
  64. package/src/components/atomic-elements/CpAirlineLogo.vue +9 -10
  65. package/src/components/atomic-elements/CpBadge.vue +33 -41
  66. package/src/components/atomic-elements/CpDialog.vue +14 -9
  67. package/src/components/atomic-elements/CpPartnerBadge.vue +12 -20
  68. package/src/components/atomic-elements/CpTooltip.vue +12 -11
  69. package/src/components/buttons/CpButton.vue +63 -104
  70. package/src/components/core/BaseInputLabel.vue +9 -15
  71. package/src/components/core/BaseSelectClearButton.vue +1 -1
  72. package/src/components/date-pickers/CpCalendar.vue +154 -153
  73. package/src/components/date-pickers/CpDate.vue +202 -212
  74. package/src/components/date-pickers/CpDatepicker.vue +112 -138
  75. package/src/components/feedback-indicators/CpAlert.vue +16 -27
  76. package/src/components/feedback-indicators/CpLoader.vue +7 -8
  77. package/src/components/feedback-indicators/CpToaster.vue +197 -192
  78. package/src/components/helpers-utilities/TransitionExpand.vue +31 -33
  79. package/src/components/icons/IconOneWay.vue +1 -1
  80. package/src/components/index.ts +28 -40
  81. package/src/components/inputs/CpInput.vue +40 -57
  82. package/src/components/inputs/CpTextarea.vue +30 -50
  83. package/src/components/lists-and-table/CpTable.vue +165 -114
  84. package/src/components/lists-and-table/CpTableEmptyState.vue +5 -8
  85. package/src/components/selects/CpMultiselect.vue +58 -89
  86. package/src/components/selects/CpSelect.vue +70 -90
  87. package/src/components/selects/CpSelectMenu.vue +94 -96
  88. package/src/components/toggles/CpCheckbox.vue +45 -54
  89. package/src/components/toggles/CpRadio.vue +47 -58
  90. package/src/components/toggles/CpSwitch.vue +51 -67
  91. package/src/components/typography/CpHeading.vue +11 -31
  92. package/src/components/visual/CpIcon.vue +2 -1
  93. package/src/constants/{src/CpCustomIcons.ts → CpCustomIcons.ts} +1 -1
  94. package/src/constants/CpTableConfig.ts +12 -0
  95. package/src/constants/Heading.ts +8 -0
  96. package/src/{utils/constants/src/Intent.js → constants/Intent.ts} +1 -1
  97. package/src/constants/PartnerTypes.ts +6 -0
  98. package/src/constants/Position.ts +10 -0
  99. package/src/constants/Sizes.ts +5 -0
  100. package/src/constants/colors/Colors.ts +10 -0
  101. package/src/constants/colors/ToggleColors.ts +6 -0
  102. package/src/constants/index.ts +10 -5
  103. package/src/directives/ClickOutside.ts +17 -0
  104. package/src/directives/{ResizeSelect.js → ResizeSelect.ts} +3 -3
  105. package/src/helpers/{dom.js → dom.ts} +13 -9
  106. package/src/helpers/{index.js → index.ts} +13 -3
  107. package/src/helpers/object.ts +9 -0
  108. package/src/helpers/string/src/camelize.ts +6 -0
  109. package/src/helpers/string/src/{decamelize.js → decamelize.ts} +1 -1
  110. package/src/libs/CoreDatepicker.vue +4 -4
  111. package/src/plugins/toaster.ts +71 -0
  112. package/src/stories/BaseInputLabel.stories.ts +1 -0
  113. package/src/stories/CpAlert.stories.ts +1 -0
  114. package/src/stories/CpBadge.stories.ts +18 -0
  115. package/src/stories/CpCheckbox.stories.ts +3 -1
  116. package/src/stories/CpDate.stories.ts +3 -1
  117. package/src/stories/CpDatepicker.stories.ts +3 -1
  118. package/src/stories/CpDialog.stories.ts +2 -1
  119. package/src/stories/CpHeading.stories.ts +1 -0
  120. package/src/stories/CpIcon.stories.ts +2 -0
  121. package/src/stories/CpInput.stories.ts +3 -1
  122. package/src/stories/CpLoader.stories.ts +1 -0
  123. package/src/stories/CpMultiselect.stories.ts +2 -1
  124. package/src/stories/CpPartnerBadge.stories.ts +1 -1
  125. package/src/stories/CpRadio.stories.ts +3 -1
  126. package/src/stories/CpSelect.stories.ts +3 -1
  127. package/src/stories/CpSelectMenu.stories.ts +3 -1
  128. package/src/stories/CpSwitch.stories.ts +3 -1
  129. package/src/stories/CpTable.stories.ts +8 -1
  130. package/src/stories/CpTableEmptyState.stories.ts +1 -0
  131. package/src/stories/CpTextarea.stories.ts +3 -1
  132. package/src/stories/CpToaster.stories.ts +1 -0
  133. package/src/stories/CpTooltip.stories.ts +1 -0
  134. package/src/stories/TransitionExpand.stories.ts +3 -1
  135. package/src/types/luxon.d.ts +1 -0
  136. package/src/vendors/ff-polyfill.ts +38 -0
  137. package/vitest.workspace.js +1 -3
  138. package/src/constants/src/CpTableConfig.ts +0 -14
  139. package/src/constants/src/Position.ts +0 -10
  140. package/src/constants/src/colors/Colors.ts +0 -10
  141. package/src/constants/src/colors/ToggleColors.ts +0 -6
  142. package/src/directives/ClickOutside.js +0 -13
  143. package/src/helpers/object.js +0 -9
  144. package/src/helpers/string/src/camelize.js +0 -6
  145. package/src/plugins/toaster.js +0 -61
  146. package/src/utils/constants/index.js +0 -3
  147. package/src/utils/constants/src/PartnerTypes.js +0 -6
  148. package/src/utils/constants/src/Sizes.js +0 -5
  149. package/src/vendors/ff-polyfill.js +0 -36
  150. /package/src/helpers/string/{index.js → index.ts} +0 -0
@@ -22,76 +22,60 @@
22
22
  </label>
23
23
  </template>
24
24
 
25
- <script>
26
- import { capitalizeFirstLetter, randomString } from '@/helpers'
25
+ <script setup lang="ts">
26
+ import { ref, computed } from 'vue'
27
+
27
28
  import { ToggleColors } from '@/constants'
29
+ import { capitalizeFirstLetter, randomString } from '@/helpers'
28
30
 
29
- export default {
30
- props: {
31
- modelValue: {
32
- type: Boolean,
33
- default: null,
34
- },
35
- label: {
36
- type: String,
37
- default: '',
38
- },
39
- disabled: {
40
- type: Boolean,
41
- default: false,
42
- },
43
- groupName: {
44
- type: String,
45
- default: '',
46
- required: false,
47
- },
48
- color: {
49
- type: String,
50
- required: false,
51
- default: ToggleColors.BLUE,
52
- validator: (value) => Object.values(ToggleColors).includes(value),
53
- },
54
- reverseLabel: {
55
- type: Boolean,
56
- required: false,
57
- default: false,
58
- },
59
- autofocus: {
60
- type: Boolean,
61
- required: false,
62
- default: false,
63
- },
64
- },
65
- emits: ['update:modelValue'],
66
- data() {
67
- return {
68
- switchUniqueId: '',
69
- }
70
- },
71
- computed: {
72
- capitalizedColor() {
73
- return capitalizeFirstLetter(this.color)
74
- },
75
- computedClasses() {
76
- return [
77
- {
78
- 'cpSwitch--hasLabel': this.label,
79
- 'cpSwitch--isActive': this.modelValue,
80
- 'cpSwitch--isDisabled': this.disabled,
81
- 'cpSwitch--isReversed': this.reverseLabel,
82
- },
83
- `cpSwitch--is${this.capitalizedColor}`,
84
- ]
85
- },
86
- },
87
- mounted() {
88
- this.switchUniqueId = randomString()
89
- },
90
- methods: {
91
- handleClick(value) {
92
- this.$emit('update:modelValue', !value)
31
+ interface Props {
32
+ autofocus?: boolean
33
+ color?: string
34
+ disabled?: boolean
35
+ groupName?: string
36
+ label?: string
37
+ modelValue?: boolean
38
+ reverseLabel?: boolean
39
+ }
40
+
41
+ interface Emits {
42
+ (e: 'update:modelValue', value: boolean): void
43
+ }
44
+
45
+ const props = withDefaults(defineProps<Props>(), {
46
+ modelValue: false,
47
+ label: '',
48
+ disabled: false,
49
+ groupName: '',
50
+ color: ToggleColors.BLUE,
51
+ reverseLabel: false,
52
+ autofocus: false,
53
+ })
54
+
55
+ const emit = defineEmits<Emits>()
56
+
57
+ const switchUniqueId = ref('')
58
+
59
+ switchUniqueId.value = randomString()
60
+
61
+ const capitalizedColor = computed(() => {
62
+ return capitalizeFirstLetter(props.color)
63
+ })
64
+
65
+ const computedClasses = computed(() => {
66
+ return [
67
+ {
68
+ 'cpSwitch--hasLabel': props.label,
69
+ 'cpSwitch--isActive': props.modelValue,
70
+ 'cpSwitch--isDisabled': props.disabled,
71
+ 'cpSwitch--isReversed': props.reverseLabel,
93
72
  },
94
- },
73
+ `cpSwitch--is${capitalizedColor.value}`,
74
+ ]
75
+ })
76
+
77
+ const handleClick = (value: boolean): void => {
78
+ emit('update:modelValue', !value)
95
79
  }
96
80
  </script>
97
81
 
@@ -4,42 +4,24 @@
4
4
  </component>
5
5
  </template>
6
6
 
7
- <script>
8
- const headingLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']
7
+ <script setup lang="ts">
8
+ import { HeadingLevels } from '@/constants'
9
9
 
10
- const sizes = [100, 200, 300, 400, 500, 600, 700, 800, 900]
10
+ type HeadingSize = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900
11
11
 
12
- export default {
13
- props: {
14
- headingLevel: {
15
- type: String,
16
- default: headingLevels[0],
17
- validator: (value) => {
18
- return headingLevels.includes(value)
19
- },
20
- required: false,
21
- },
22
- size: {
23
- type: Number,
24
- default: sizes[4],
25
- validator: (value) => {
26
- return sizes.includes(value)
27
- },
28
- required: false,
29
- },
30
- },
31
- data() {
32
- return {
33
- headingLevels,
34
- }
35
- },
12
+ interface Props {
13
+ headingLevel?: HeadingLevels
14
+ size?: HeadingSize
36
15
  }
16
+
17
+ withDefaults(defineProps<Props>(), {
18
+ headingLevel: HeadingLevels.H1,
19
+ size: 500,
20
+ })
37
21
  </script>
38
22
 
39
23
  <style lang="scss">
40
24
  .cpHeading {
41
- color: colors.$neutral-dark;
42
-
43
25
  &:first-letter {
44
26
  text-transform: capitalize;
45
27
  }
@@ -49,14 +31,12 @@ export default {
49
31
  font-weight: 400;
50
32
  line-height: fn.px-to-rem(16);
51
33
  letter-spacing: fn.px-to-em(0.6);
52
- color: colors.$neutral-dark-1;
53
34
  }
54
35
 
55
36
  &--200 {
56
37
  font-size: fn.px-to-rem(12);
57
38
  font-weight: 600;
58
39
  line-height: fn.px-to-rem(16);
59
- color: colors.$neutral-dark-1;
60
40
  }
61
41
 
62
42
  &--300 {
@@ -5,8 +5,9 @@
5
5
  </template>
6
6
 
7
7
  <script setup lang="ts">
8
- import { computed } from 'vue'
9
8
  import * as feather from 'feather-icons'
9
+ import { computed } from 'vue'
10
+
10
11
  import { CustomCpIcons } from '@/constants'
11
12
 
12
13
  interface Props {
@@ -1,6 +1,6 @@
1
1
  import { defineAsyncComponent } from 'vue'
2
2
 
3
- export default {
3
+ export const CustomCpIcons = {
4
4
  'accompanied-minor-each': defineAsyncComponent(() => import('@/components/icons/IconAccompaniedMinorEach.vue')),
5
5
  'accompanied-minor-none': defineAsyncComponent(() => import('@/components/icons/IconAccompaniedMinorNone.vue')),
6
6
  'accompanied-minor-one': defineAsyncComponent(() => import('@/components/icons/IconAccompaniedMinorOne.vue')),
@@ -0,0 +1,12 @@
1
+ export const VISIBLE_ROWS_MAX = 100
2
+
3
+ export enum RESERVED_KEYS {
4
+ GROUP_BY = 'groupBy',
5
+ FULL_WIDTH = 'fullWidth',
6
+ IS_SELECTED = 'isSelected',
7
+ }
8
+
9
+ export enum PAGINATION_FORMATS {
10
+ RESULTS = 'results',
11
+ PAGES = 'pages',
12
+ }
@@ -0,0 +1,8 @@
1
+ export enum HeadingLevels {
2
+ H1 = 'h1',
3
+ H2 = 'h2',
4
+ H3 = 'h3',
5
+ H4 = 'h4',
6
+ H5 = 'h5',
7
+ H6 = 'h6',
8
+ }
@@ -1,4 +1,4 @@
1
- export default {
1
+ export const Intent = {
2
2
  SUCCESS: {
3
3
  value: 'success',
4
4
  icon: 'check-circle',
@@ -0,0 +1,6 @@
1
+ export enum PartnerTypes {
2
+ OTA = 'ota',
3
+ AIRLINE = 'airline',
4
+ SUPPLIER = 'supplier',
5
+ THIRDPARTY = 'thirdParty',
6
+ }
@@ -0,0 +1,10 @@
1
+ export enum Position {
2
+ TOP = 'top',
3
+ TOP_LEFT = 'top-left',
4
+ TOP_RIGHT = 'top-right',
5
+ BOTTOM = 'bottom',
6
+ BOTTOM_LEFT = 'bottom-left',
7
+ BOTTOM_RIGHT = 'bottom-right',
8
+ LEFT = 'left',
9
+ RIGHT = 'right',
10
+ }
@@ -0,0 +1,5 @@
1
+ export enum Sizes {
2
+ XS = 'xs',
3
+ SM = 'sm',
4
+ MD = 'md',
5
+ }
@@ -0,0 +1,10 @@
1
+ export enum Colors {
2
+ BLUE = 'blue',
3
+ GRAY = 'gray',
4
+ GREEN = 'green',
5
+ ORANGE = 'orange',
6
+ PINK = 'pink',
7
+ PURPLE = 'purple',
8
+ RED = 'red',
9
+ YELLOW = 'yellow',
10
+ }
@@ -0,0 +1,6 @@
1
+ import { Colors } from './Colors'
2
+
3
+ export enum ToggleColors {
4
+ BLUE = Colors.BLUE,
5
+ PURPLE = Colors.PURPLE,
6
+ }
@@ -1,5 +1,10 @@
1
- export { default as Colors } from './src/colors/Colors'
2
- export { default as ToggleColors } from './src/colors/ToggleColors'
3
- export { default as Position } from './src/Position'
4
- export { default as CpTableConfig } from './src/CpTableConfig'
5
- export { default as CustomCpIcons } from './src/CpCustomIcons'
1
+ export { Colors } from './colors/Colors'
2
+ export { Position } from './Position'
3
+ export { ToggleColors } from './colors/ToggleColors'
4
+ export { HeadingLevels } from './Heading'
5
+ export { PAGINATION_FORMATS, RESERVED_KEYS, VISIBLE_ROWS_MAX } from './CpTableConfig'
6
+ export { Sizes } from './Sizes'
7
+ export { PartnerTypes } from './PartnerTypes'
8
+
9
+ export { CustomCpIcons } from './CpCustomIcons'
10
+ export { Intent } from './Intent'
@@ -0,0 +1,17 @@
1
+ type ClickOutsideBinding = {
2
+ value: (event: MouseEvent, el: HTMLElement) => void
3
+ }
4
+
5
+ export default {
6
+ beforeMount(el: HTMLElement & { clickOutsideEvent?: (e: MouseEvent) => void }, binding: ClickOutsideBinding) {
7
+ el.clickOutsideEvent = function (event: MouseEvent) {
8
+ if (!(el === event.target || el.contains(event.target as Node))) {
9
+ binding.value(event, el)
10
+ }
11
+ }
12
+ document.body.addEventListener('click', el.clickOutsideEvent)
13
+ },
14
+ unmounted(el: HTMLElement & { clickOutsideEvent?: (e: MouseEvent) => void }) {
15
+ document.body.removeEventListener('click', el.clickOutsideEvent as (e: MouseEvent) => void)
16
+ },
17
+ }
@@ -3,13 +3,13 @@ export default {
3
3
  inserted: resizeSelect,
4
4
  }
5
5
 
6
- function resizeSelect(el) {
6
+ function resizeSelect(el: HTMLSelectElement) {
7
7
  const select = document.createElement('select')
8
8
  select.className = el.className
9
9
  const option = document.createElement('option')
10
10
  option.textContent = el.value
11
11
  select.appendChild(option)
12
- el.parentNode.appendChild(select)
12
+ el.parentNode?.appendChild(select)
13
13
  el.style.width = select.offsetWidth + 'px'
14
- select.parentNode.removeChild(select)
14
+ select.parentNode?.removeChild(select)
15
15
  }
@@ -1,9 +1,11 @@
1
- export const getKeyboardFocusableElements = (DOMElement = document) => {
2
- if (DOMElement === null) return []
1
+ export const getKeyboardFocusableElements = (DOMElement: Document | HTMLElement | null = document) => {
2
+ if (DOMElement === null) return [] as (HTMLElement | SVGElement)[]
3
3
 
4
- const focusableElements = [
5
- ...DOMElement.querySelectorAll('a, button, input, textarea, select, details,[tabindex]:not([tabindex="-1"])'),
6
- ]
4
+ const focusableElements = Array.from(
5
+ (DOMElement as Document | HTMLElement).querySelectorAll<HTMLElement | SVGElement>(
6
+ 'a, button, input, textarea, select, details,[tabindex]:not([tabindex="-1"])',
7
+ ),
8
+ )
7
9
 
8
10
  if (!focusableElements.length) {
9
11
  return DOMElement instanceof HTMLElement ? [DOMElement] : []
@@ -11,7 +13,7 @@ export const getKeyboardFocusableElements = (DOMElement = document) => {
11
13
 
12
14
  return focusableElements.filter((element) => {
13
15
  const isElementDisabled = element.hasAttribute('disabled')
14
- const isElementVisible = element.offsetHeight !== 0 && element.offsetWidth !== 0
16
+ const isElementVisible = (element as HTMLElement).offsetHeight !== 0 && (element as HTMLElement).offsetWidth !== 0
15
17
 
16
18
  const isInputElement = element instanceof HTMLInputElement
17
19
  const isElementRadioNotChecked = isInputElement && element.type === 'radio' && element.checked === false
@@ -20,7 +22,9 @@ export const getKeyboardFocusableElements = (DOMElement = document) => {
20
22
  })
21
23
  }
22
24
 
23
- export const handleTrapFocus = (event, DOMElement) => {
25
+ export const handleTrapFocus = (event: KeyboardEvent, DOMElement?: HTMLElement) => {
26
+ if (!DOMElement) return
27
+
24
28
  const childFocusableElements = getKeyboardFocusableElements(DOMElement)
25
29
  const firstElement = childFocusableElements[0]
26
30
  const lastElement = childFocusableElements[childFocusableElements.length - 1]
@@ -32,10 +36,10 @@ export const handleTrapFocus = (event, DOMElement) => {
32
36
  // only TAB is pressed, not SHIFT simultaneously
33
37
  // Prevent default behavior of keydown on TAB (i.e. focus next element)
34
38
  event.preventDefault()
35
- firstElement.focus()
39
+ firstElement?.focus()
36
40
  } else if (tabBackwards) {
37
41
  // TAB and SHIFT are pressed simultaneously
38
42
  event.preventDefault()
39
- lastElement.focus()
43
+ lastElement?.focus()
40
44
  }
41
45
  }
@@ -1,10 +1,20 @@
1
1
  import { DateTime } from 'luxon'
2
2
 
3
- export const randomString = () => {
3
+ export const randomString = (): string => {
4
4
  return `_${Math.random().toString(36).substr(2, 9)}`
5
5
  }
6
6
 
7
- export const formatDates = function formatDates({ dateOne, dateTwo, format, locale }) {
7
+ export const formatDates = ({
8
+ dateOne,
9
+ dateTwo,
10
+ format,
11
+ locale,
12
+ }: {
13
+ dateOne?: string
14
+ dateTwo?: string
15
+ format: string
16
+ locale?: string
17
+ }): string => {
8
18
  let formattedDates = ''
9
19
 
10
20
  if (dateOne) {
@@ -17,7 +27,7 @@ export const formatDates = function formatDates({ dateOne, dateTwo, format, loca
17
27
  return formattedDates
18
28
  }
19
29
 
20
- export const capitalizeFirstLetter = (rawString) => {
30
+ export const capitalizeFirstLetter = (rawString: unknown): string => {
21
31
  if (typeof rawString !== 'string') return ''
22
32
  return rawString.charAt(0).toUpperCase() + rawString.slice(1)
23
33
  }
@@ -0,0 +1,9 @@
1
+ export const isObject = (value: unknown): value is Record<string, unknown> => {
2
+ return value !== null && typeof value === 'object'
3
+ }
4
+
5
+ export const isEmpty = (obj: unknown): boolean => {
6
+ if (!isObject(obj)) return true
7
+
8
+ return Reflect.ownKeys(obj).length === 0 && (obj as { constructor: unknown }).constructor === Object
9
+ }
@@ -0,0 +1,6 @@
1
+ export default function camelize(input: string): string {
2
+ return input.replace(/^[\w]|[A-Z]|\b\w|\s+/g, (match, index: number) => {
3
+ if (+match === 0) return ''
4
+ return index === 0 ? match.toLowerCase() : match.toUpperCase()
5
+ })
6
+ }
@@ -1,4 +1,4 @@
1
- export default function decamelize(camelCasedString, separator = ' ') {
1
+ export default function decamelize(camelCasedString: string, separator = ' '): string {
2
2
  return camelCasedString
3
3
  .replace(/([a-z\d])([A-Z])/g, `$1${separator}$2`)
4
4
  .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, `$1${separator}$2`)
@@ -126,14 +126,14 @@
126
126
  </transition>
127
127
  </template>
128
128
 
129
- <script>
129
+ <script lang="ts">
130
130
  import { DateTime, Info } from 'luxon'
131
131
 
132
- import { randomString } from '@/helpers'
133
- import ResizeSelect from '@/directives/ResizeSelect'
134
-
135
132
  import CpIcon from '@/components/visual/CpIcon.vue'
136
133
 
134
+ import ResizeSelect from '@/directives/ResizeSelect'
135
+ import { randomString } from '@/helpers'
136
+
137
137
  export default {
138
138
  name: 'CoreDatepicker',
139
139
  components: {
@@ -0,0 +1,71 @@
1
+ import { App, h, render, VNode } from 'vue'
2
+
3
+ import CpToaster from '@/components/feedback-indicators/CpToaster.vue'
4
+
5
+ import { Intent } from '@/constants'
6
+
7
+ type MountOptions = {
8
+ app?: App | null
9
+ children?: unknown
10
+ element?: HTMLElement | null
11
+ props?: Record<string, unknown>
12
+ }
13
+
14
+ const createElement = () => (typeof document !== 'undefined' ? document.createElement('div') : null)
15
+
16
+ const mount = (component: unknown, { props, children, element, app }: MountOptions = {}) => {
17
+ let el: HTMLElement | null = element ? element : createElement()
18
+
19
+ // @ts-expect-error <comment on type error>
20
+ let vNode: VNode = h(component, props, children)
21
+ if (app && app._context) {
22
+ vNode.appContext = app._context
23
+ }
24
+
25
+ render(vNode, el as HTMLElement)
26
+
27
+ const destroy = () => {
28
+ if (el) {
29
+ render(null, el)
30
+ }
31
+ el = null
32
+ // @ts-expect-error explicit nulling for GC
33
+ vNode = null
34
+ }
35
+
36
+ return { vNode, destroy, el }
37
+ }
38
+
39
+ const createToaster = (globalOptions: Record<string, unknown> = {}) => {
40
+ return {
41
+ show(options: Record<string, unknown> = {}) {
42
+ const localOptions = { ...options }
43
+
44
+ mount(CpToaster, {
45
+ props: { ...globalOptions, ...localOptions },
46
+ })
47
+ },
48
+ unique(options: Record<string, unknown> = {}) {
49
+ options.isUnique = true
50
+ return this.show(options)
51
+ },
52
+ success(options: Record<string, unknown> = {}) {
53
+ options.type = Intent.SUCCESS.value
54
+ return this.show(options)
55
+ },
56
+ critical(options: Record<string, unknown> = {}) {
57
+ options.type = Intent.CRITICAL.value
58
+ return this.show(options)
59
+ },
60
+ info(options: Record<string, unknown> = {}) {
61
+ options.type = Intent.INFO.value
62
+ return this.show(options)
63
+ },
64
+ warning(options: Record<string, unknown> = {}) {
65
+ options.type = Intent.WARNING.value
66
+ return this.show(options)
67
+ },
68
+ }
69
+ }
70
+
71
+ export default createToaster
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/vue3'
2
+
2
3
  import BaseInputLabel from '@/components/core/BaseInputLabel.vue'
3
4
 
4
5
  const meta = {
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/vue3'
2
+
2
3
  import CpAlert from '@/components/feedback-indicators/CpAlert.vue'
3
4
 
4
5
  const meta = {
@@ -20,6 +20,10 @@ const meta = {
20
20
  control: 'boolean',
21
21
  description: 'Whether the badge has a stroked border',
22
22
  },
23
+ isSquare: {
24
+ control: 'boolean',
25
+ description: 'Whether the badge has a square border',
26
+ },
23
27
  leadingIcon: {
24
28
  control: 'select',
25
29
  options: ['check', 'arrow-right', 'arrow-left', 'arrow-up', 'arrow-down'],
@@ -46,6 +50,7 @@ export const Default: Story = {
46
50
  color: 'gray',
47
51
  size: 'md',
48
52
  isStroked: false,
53
+ isSquare: false,
49
54
  leadingIcon: '',
50
55
  trailingIcon: '',
51
56
  label: 'Badge',
@@ -115,6 +120,19 @@ export const WithIcons: Story = {
115
120
  }),
116
121
  }
117
122
 
123
+ export const IsSquare: Story = {
124
+ render: () => ({
125
+ components: { CpBadge },
126
+ template: `
127
+ <div style="display: flex; gap: 8px; align-items: center;">
128
+ <CpBadge color="blue" isSquare label="Square" />
129
+ <CpBadge color="green" isSquare label="Square" />
130
+ <CpBadge color="red" isSquare label="Square" />
131
+ </div>
132
+ `,
133
+ }),
134
+ }
135
+
118
136
  export const IsClearable: Story = {
119
137
  render: () => ({
120
138
  components: { CpBadge },
@@ -1,5 +1,7 @@
1
- import type { Meta, StoryObj } from '@storybook/vue3'
2
1
  import { ref } from 'vue'
2
+
3
+ import type { Meta, StoryObj } from '@storybook/vue3'
4
+
3
5
  import CpCheckbox from '@/components/toggles/CpCheckbox.vue'
4
6
 
5
7
  const meta = {
@@ -1,5 +1,7 @@
1
- import type { Meta, StoryObj } from '@storybook/vue3'
2
1
  import { ref } from 'vue'
2
+
3
+ import type { Meta, StoryObj } from '@storybook/vue3'
4
+
3
5
  import CpDate from '@/components/date-pickers/CpDate.vue'
4
6
 
5
7
  const meta = {
@@ -1,5 +1,7 @@
1
- import type { Meta, StoryObj } from '@storybook/vue3'
2
1
  import { ref } from 'vue'
2
+
3
+ import type { Meta, StoryObj } from '@storybook/vue3'
4
+
3
5
  import CpDatepicker from '@/components/date-pickers/CpDatepicker.vue'
4
6
 
5
7
  const meta = {
@@ -1,6 +1,7 @@
1
- import type { Meta, StoryObj } from '@storybook/vue3'
2
1
  import { ref } from 'vue'
3
2
 
3
+ import type { Meta, StoryObj } from '@storybook/vue3'
4
+
4
5
  import CpDialog from '@/components/atomic-elements/CpDialog.vue'
5
6
 
6
7
  const meta = {
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/vue3'
2
+
2
3
  import CpHeading from '@/components/typography/CpHeading.vue'
3
4
 
4
5
  const meta = {
@@ -1,5 +1,7 @@
1
1
  import type { Meta, StoryObj } from '@storybook/vue3'
2
+
2
3
  import CpIcon from '@/components/visual/CpIcon.vue'
4
+
3
5
  import { CustomCpIcons } from '@/constants'
4
6
 
5
7
  const iconsOptions = [
@@ -1,5 +1,7 @@
1
- import type { Meta, StoryObj } from '@storybook/vue3'
2
1
  import { ref } from 'vue'
2
+
3
+ import type { Meta, StoryObj } from '@storybook/vue3'
4
+
3
5
  import CpInput from '@/components/inputs/CpInput.vue'
4
6
 
5
7
  const meta = {