cja-phoenix 0.6.0 → 0.6.2

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 (283) hide show
  1. package/dist/cja-phoenix.es.js +3816 -4306
  2. package/dist/style.css +1 -0
  3. package/dist/types/components/composite/CheckoutCrossSell.vue.d.ts +29 -0
  4. package/dist/types/components/composite/CheckoutLayout.vue.d.ts +23 -0
  5. package/dist/types/components/composite/CheckoutMilestones.vue.d.ts +16 -0
  6. package/dist/types/components/composite/CjaFooter.vue.d.ts +34 -0
  7. package/dist/types/components/composite/CjaMenuBar.vue.d.ts +52 -0
  8. package/dist/types/components/composite/FunnelLayout.vue.d.ts +35 -0
  9. package/dist/types/components/composite/FunnelSubmit.vue.d.ts +26 -0
  10. package/dist/types/components/composite/FunnelSummary.vue.d.ts +77 -0
  11. package/dist/types/components/composite/FunnelTitle.vue.d.ts +19 -0
  12. package/dist/types/components/composite/InfoShowcase.vue.d.ts +25 -0
  13. package/dist/types/components/composite/JourneyMacroSteps.vue.d.ts +16 -0
  14. package/dist/types/components/composite/ResultsSidebar.vue.d.ts +9 -0
  15. package/dist/types/components/forms/CheckboxInput.vue.d.ts +41 -0
  16. package/dist/types/components/forms/CurrencyInput.vue.d.ts +65 -0
  17. package/dist/types/components/forms/FileInput.vue.d.ts +89 -0
  18. package/dist/types/components/forms/NumberInput.vue.d.ts +58 -0
  19. package/dist/types/components/forms/PhoneInput.vue.d.ts +69 -0
  20. package/dist/types/components/forms/RadioInput.vue.d.ts +43 -0
  21. package/dist/types/components/forms/RadioInputList.vue.d.ts +65 -0
  22. package/dist/types/components/forms/SelectInput.vue.d.ts +80 -0
  23. package/dist/types/components/forms/SelectionTiles.vue.d.ts +51 -0
  24. package/dist/types/components/forms/TextInput.vue.d.ts +76 -0
  25. package/dist/types/components/forms/TileCheckboxInput.vue.d.ts +23 -0
  26. package/dist/types/components/forms/ToggleInput.vue.d.ts +51 -0
  27. package/dist/types/components/forms/structure/InputContainer.vue.d.ts +22 -0
  28. package/dist/types/components/forms/structure/InputError.vue.d.ts +15 -0
  29. package/dist/types/components/forms/structure/InputTitle.vue.d.ts +21 -0
  30. package/dist/types/components/structural/CjaButton.vue.d.ts +59 -0
  31. package/dist/types/components/structural/CollapseContainer.vue.d.ts +51 -0
  32. package/dist/{components → types/components}/structural/ContentTabs.vue.d.ts +17 -20
  33. package/dist/types/components/structural/FixedContainer.vue.d.ts +68 -0
  34. package/dist/types/components/structural/GridContainer.vue.d.ts +36 -0
  35. package/dist/types/components/structural/GridItem.vue.d.ts +26 -0
  36. package/dist/types/components/structural/InfoMessage.vue.d.ts +30 -0
  37. package/dist/types/components/structural/LoadingSpinner.vue.d.ts +17 -0
  38. package/dist/types/components/structural/Modal.vue.d.ts +65 -0
  39. package/dist/types/components/structural/Scaffold.vue.d.ts +9 -0
  40. package/dist/types/index.d.ts +16 -7
  41. package/dist/types/stories/CjaButton.story.vue.d.ts +2 -0
  42. package/dist/types/stories/ContentTabs.story.vue.d.ts +2 -0
  43. package/dist/types/stories/Modal.story.vue.d.ts +2 -0
  44. package/dist/types/stories/RadioInputList.story.vue.d.ts +2 -0
  45. package/dist/types/{Router.d.ts → types/Router.d.ts} +1 -0
  46. package/dist/types/types/index.d.ts +7 -0
  47. package/dist/{utils → types/utils}/formValidations.d.ts +3 -0
  48. package/package.json +21 -30
  49. package/src/assets/backdrop.scss +10 -0
  50. package/src/assets/breakpoints.scss +12 -0
  51. package/src/assets/fonts.scss +1 -0
  52. package/src/assets/forms.scss +97 -0
  53. package/src/assets/grid.scss +14 -0
  54. package/src/assets/iconia/Read Me.txt +7 -0
  55. package/src/assets/iconia/demo-files/demo.css +155 -0
  56. package/src/assets/iconia/demo-files/demo.js +30 -0
  57. package/src/assets/iconia/demo.html +7055 -0
  58. package/src/assets/iconia/fonts/CGG-icomoon.eot +0 -0
  59. package/src/assets/iconia/fonts/CGG-icomoon.svg +513 -0
  60. package/src/assets/iconia/fonts/CGG-icomoon.ttf +0 -0
  61. package/src/assets/iconia/fonts/CGG-icomoon.woff +0 -0
  62. package/src/assets/iconia/selection.json +1 -0
  63. package/src/assets/iconia/style.css +1547 -0
  64. package/src/assets/iconia/style.scss +2556 -0
  65. package/src/assets/iconia/variables.scss +507 -0
  66. package/src/assets/main.scss +30 -0
  67. package/src/assets/radioOld.scss +52 -0
  68. package/src/assets/shadows.scss +3 -0
  69. package/src/assets/tippy.scss +45 -0
  70. package/src/assets/vars/development.scss +4 -0
  71. package/src/assets/vars/production.scss +4 -0
  72. package/src/components/composite/CheckoutCrossSell.vue +478 -0
  73. package/src/components/composite/CheckoutLayout.vue +59 -0
  74. package/src/components/composite/CheckoutMilestones.vue +161 -0
  75. package/src/components/composite/CjaFooter.vue +223 -0
  76. package/src/components/composite/CjaMenuBar.vue +543 -0
  77. package/src/components/composite/FunnelLayout.vue +197 -0
  78. package/src/components/composite/FunnelSubmit.vue +53 -0
  79. package/src/components/composite/FunnelSummary.vue +198 -0
  80. package/src/components/composite/FunnelTitle.vue +59 -0
  81. package/src/components/composite/InfoShowcase.vue +87 -0
  82. package/src/components/composite/JourneyMacroSteps.vue +104 -0
  83. package/src/components/composite/ProductDetails.vue +149 -0
  84. package/src/components/composite/ResultsLayout.vue +156 -0
  85. package/src/components/composite/ResultsSidebar.vue +74 -0
  86. package/src/components/forms/CheckboxInput.vue +103 -0
  87. package/src/components/forms/CurrencyInput.vue +126 -0
  88. package/src/components/forms/FileInput.vue +250 -0
  89. package/src/components/forms/NumberInput.vue +165 -0
  90. package/src/components/forms/PhoneInput.vue +122 -0
  91. package/src/components/forms/RadioInput.vue +98 -0
  92. package/src/components/forms/RadioInputList.vue +156 -0
  93. package/src/components/forms/SelectInput.vue +392 -0
  94. package/src/components/forms/SelectionTiles.vue +196 -0
  95. package/src/components/forms/TextInput.vue +144 -0
  96. package/src/components/forms/TileCheckboxInput.vue +96 -0
  97. package/src/components/forms/ToggleInput.vue +88 -0
  98. package/src/components/forms/structure/InputContainer.vue +28 -0
  99. package/src/components/forms/structure/InputError.vue +26 -0
  100. package/src/components/forms/structure/InputTitle.vue +52 -0
  101. package/src/components/index.ts +73 -0
  102. package/src/components/structural/CjaButton.vue +332 -0
  103. package/src/components/structural/CollapseContainer.vue +141 -0
  104. package/src/components/structural/ContentTabs.vue +105 -0
  105. package/src/components/structural/FixedContainer.vue +107 -0
  106. package/src/components/structural/GridContainer.vue +70 -0
  107. package/src/components/structural/GridItem.vue +47 -0
  108. package/src/components/structural/InfoMessage.vue +105 -0
  109. package/src/components/structural/LoadingSpinner.vue +39 -0
  110. package/src/components/structural/Modal.vue +209 -0
  111. package/src/components/structural/Scaffold.vue +3 -0
  112. package/src/constants/MyConstants.ts +1 -0
  113. package/src/constants/index.ts +5 -0
  114. package/src/env.d.ts +11 -0
  115. package/src/index.ts +31 -0
  116. package/src/stories/CjaButton.story.vue +192 -0
  117. package/src/stories/ContentTabs.story.vue +59 -0
  118. package/src/stories/Modal.story.vue +127 -0
  119. package/src/stories/RadioInputList.story.vue +61 -0
  120. package/src/types/CheckoutMilestone.ts +5 -0
  121. package/src/types/Footer.ts +17 -0
  122. package/src/types/Menu.ts +19 -0
  123. package/src/types/RadioOption.ts +7 -0
  124. package/src/types/Router.ts +19 -0
  125. package/src/types/SelectOption.ts +6 -0
  126. package/src/types/StoreDataValue.ts +12 -0
  127. package/src/types/Storyblok.ts +10 -0
  128. package/src/types/TileOption.ts +8 -0
  129. package/src/types/index.ts +19 -0
  130. package/src/utils/cjaRouter.ts +74 -0
  131. package/src/utils/cjaStore.ts +43 -0
  132. package/src/utils/findScrollAncestor.ts +16 -0
  133. package/src/utils/formValidations.ts +192 -0
  134. package/src/utils/generateRoutes.ts +36 -0
  135. package/src/utils/getFromUrl.ts +25 -0
  136. package/src/utils/getMessages.ts +23 -0
  137. package/src/utils/gtm.ts +158 -0
  138. package/src/utils/index.ts +31 -0
  139. package/src/utils/jsonReviver.ts +20 -0
  140. package/src/utils/storyblokLink.ts +4 -0
  141. package/src/utils/updateForm.ts +40 -0
  142. package/src/utils/uploadFile.ts +25 -0
  143. package/src/utils/useGlobalProperties.ts +11 -0
  144. package/src/utils/useViewportDetector.ts +35 -0
  145. package/dist/cja-phoenix.cjs.js +0 -44
  146. package/dist/cja-phoenix.d.ts +0 -3
  147. package/dist/cja-phoenix.umd.js +0 -45
  148. package/dist/components/composite/CheckoutCrossSell.vue.d.ts +0 -36
  149. package/dist/components/composite/CheckoutLayout.vue.d.ts +0 -20
  150. package/dist/components/composite/CheckoutMilestones.vue.d.ts +0 -13
  151. package/dist/components/composite/CjaFooter.vue.d.ts +0 -29
  152. package/dist/components/composite/CjaMenuBar.vue.d.ts +0 -53
  153. package/dist/components/composite/FunnelLayout.vue.d.ts +0 -38
  154. package/dist/components/composite/FunnelSubmit.vue.d.ts +0 -25
  155. package/dist/components/composite/FunnelSummary.vue.d.ts +0 -76
  156. package/dist/components/composite/FunnelTitle.vue.d.ts +0 -24
  157. package/dist/components/composite/InfoShowcase.vue.d.ts +0 -28
  158. package/dist/components/composite/JourneyMacroSteps.vue.d.ts +0 -13
  159. package/dist/components/forms/CheckboxInput.vue.d.ts +0 -38
  160. package/dist/components/forms/CurrencyInput.vue.d.ts +0 -92
  161. package/dist/components/forms/FileInput.vue.d.ts +0 -118
  162. package/dist/components/forms/NumberInput.vue.d.ts +0 -73
  163. package/dist/components/forms/PhoneInput.vue.d.ts +0 -104
  164. package/dist/components/forms/RadioInputList.vue.d.ts +0 -96
  165. package/dist/components/forms/SelectInput.vue.d.ts +0 -121
  166. package/dist/components/forms/SelectionTiles.vue.d.ts +0 -64
  167. package/dist/components/forms/TextInput.vue.d.ts +0 -127
  168. package/dist/components/forms/TileCheckboxInput.vue.d.ts +0 -34
  169. package/dist/components/forms/ToggleInput.vue.d.ts +0 -70
  170. package/dist/components/forms/structure/InputContainer.vue.d.ts +0 -17
  171. package/dist/components/forms/structure/InputError.vue.d.ts +0 -12
  172. package/dist/components/forms/structure/InputTitle.vue.d.ts +0 -30
  173. package/dist/components/structural/CjaButton.vue.d.ts +0 -66
  174. package/dist/components/structural/CollapseContainer.vue.d.ts +0 -40
  175. package/dist/components/structural/FixedContainer.vue.d.ts +0 -69
  176. package/dist/components/structural/GridContainer.vue.d.ts +0 -21
  177. package/dist/components/structural/GridItem.vue.d.ts +0 -29
  178. package/dist/components/structural/InfoMessage.vue.d.ts +0 -39
  179. package/dist/components/structural/LoadingSpinner.vue.d.ts +0 -16
  180. package/dist/components/structural/Modal.vue.d.ts +0 -50
  181. package/dist/components/structural/Scaffold.vue.d.ts +0 -3
  182. package/dist/components/structural/Scaffold.vue.d.ts.map +0 -1
  183. package/dist/index.d.ts +0 -14
  184. package/dist/src/components/composite/CheckoutCrossSell.vue.d.ts +0 -5
  185. package/dist/src/components/composite/CheckoutCrossSell.vue.d.ts.map +0 -1
  186. package/dist/src/components/composite/CheckoutLayout.vue.d.ts +0 -5
  187. package/dist/src/components/composite/CheckoutLayout.vue.d.ts.map +0 -1
  188. package/dist/src/components/composite/CheckoutMilestones.vue.d.ts +0 -5
  189. package/dist/src/components/composite/CheckoutMilestones.vue.d.ts.map +0 -1
  190. package/dist/src/components/composite/CjaFooter.vue.d.ts +0 -5
  191. package/dist/src/components/composite/CjaFooter.vue.d.ts.map +0 -1
  192. package/dist/src/components/composite/CjaMenuBar.vue.d.ts +0 -5
  193. package/dist/src/components/composite/CjaMenuBar.vue.d.ts.map +0 -1
  194. package/dist/src/components/composite/FunnelLayout.vue.d.ts +0 -5
  195. package/dist/src/components/composite/FunnelLayout.vue.d.ts.map +0 -1
  196. package/dist/src/components/composite/FunnelSubmit.vue.d.ts +0 -5
  197. package/dist/src/components/composite/FunnelSubmit.vue.d.ts.map +0 -1
  198. package/dist/src/components/composite/FunnelSummary.vue.d.ts +0 -5
  199. package/dist/src/components/composite/FunnelSummary.vue.d.ts.map +0 -1
  200. package/dist/src/components/composite/FunnelTitle.vue.d.ts +0 -5
  201. package/dist/src/components/composite/FunnelTitle.vue.d.ts.map +0 -1
  202. package/dist/src/components/composite/InfoShowcase.vue.d.ts +0 -5
  203. package/dist/src/components/composite/InfoShowcase.vue.d.ts.map +0 -1
  204. package/dist/src/components/composite/JourneyMacroSteps.vue.d.ts +0 -5
  205. package/dist/src/components/composite/JourneyMacroSteps.vue.d.ts.map +0 -1
  206. package/dist/src/components/composite/ProductDetails.vue.d.ts +0 -5
  207. package/dist/src/components/composite/ProductDetails.vue.d.ts.map +0 -1
  208. package/dist/src/components/composite/ResultsLayout.vue.d.ts +0 -5
  209. package/dist/src/components/composite/ResultsLayout.vue.d.ts.map +0 -1
  210. package/dist/src/components/forms/CheckboxInput.vue.d.ts +0 -5
  211. package/dist/src/components/forms/CheckboxInput.vue.d.ts.map +0 -1
  212. package/dist/src/components/forms/CurrencyInput.vue.d.ts +0 -5
  213. package/dist/src/components/forms/CurrencyInput.vue.d.ts.map +0 -1
  214. package/dist/src/components/forms/FileInput.vue.d.ts +0 -5
  215. package/dist/src/components/forms/FileInput.vue.d.ts.map +0 -1
  216. package/dist/src/components/forms/NumberInput.vue.d.ts +0 -5
  217. package/dist/src/components/forms/NumberInput.vue.d.ts.map +0 -1
  218. package/dist/src/components/forms/PhoneInput.vue.d.ts +0 -5
  219. package/dist/src/components/forms/PhoneInput.vue.d.ts.map +0 -1
  220. package/dist/src/components/forms/RadioInputList.vue.d.ts +0 -5
  221. package/dist/src/components/forms/RadioInputList.vue.d.ts.map +0 -1
  222. package/dist/src/components/forms/SelectInput.vue.d.ts +0 -5
  223. package/dist/src/components/forms/SelectInput.vue.d.ts.map +0 -1
  224. package/dist/src/components/forms/SelectionTiles.vue.d.ts +0 -5
  225. package/dist/src/components/forms/SelectionTiles.vue.d.ts.map +0 -1
  226. package/dist/src/components/forms/TextInput.vue.d.ts +0 -5
  227. package/dist/src/components/forms/TextInput.vue.d.ts.map +0 -1
  228. package/dist/src/components/forms/TileCheckboxInput.vue.d.ts +0 -5
  229. package/dist/src/components/forms/TileCheckboxInput.vue.d.ts.map +0 -1
  230. package/dist/src/components/forms/ToggleInput.vue.d.ts +0 -5
  231. package/dist/src/components/forms/ToggleInput.vue.d.ts.map +0 -1
  232. package/dist/src/components/forms/structure/InputContainer.vue.d.ts +0 -5
  233. package/dist/src/components/forms/structure/InputContainer.vue.d.ts.map +0 -1
  234. package/dist/src/components/forms/structure/InputError.vue.d.ts +0 -5
  235. package/dist/src/components/forms/structure/InputError.vue.d.ts.map +0 -1
  236. package/dist/src/components/forms/structure/InputTitle.vue.d.ts +0 -5
  237. package/dist/src/components/forms/structure/InputTitle.vue.d.ts.map +0 -1
  238. package/dist/src/components/structural/CjaButton.vue.d.ts +0 -5
  239. package/dist/src/components/structural/CjaButton.vue.d.ts.map +0 -1
  240. package/dist/src/components/structural/CollapseContainer.vue.d.ts +0 -5
  241. package/dist/src/components/structural/CollapseContainer.vue.d.ts.map +0 -1
  242. package/dist/src/components/structural/ContentTabs.vue.d.ts +0 -5
  243. package/dist/src/components/structural/ContentTabs.vue.d.ts.map +0 -1
  244. package/dist/src/components/structural/FixedContainer.vue.d.ts +0 -5
  245. package/dist/src/components/structural/FixedContainer.vue.d.ts.map +0 -1
  246. package/dist/src/components/structural/GridContainer.vue.d.ts +0 -5
  247. package/dist/src/components/structural/GridContainer.vue.d.ts.map +0 -1
  248. package/dist/src/components/structural/GridItem.vue.d.ts +0 -5
  249. package/dist/src/components/structural/GridItem.vue.d.ts.map +0 -1
  250. package/dist/src/components/structural/InfoMessage.vue.d.ts +0 -5
  251. package/dist/src/components/structural/InfoMessage.vue.d.ts.map +0 -1
  252. package/dist/src/components/structural/LoadingSpinner.vue.d.ts +0 -5
  253. package/dist/src/components/structural/LoadingSpinner.vue.d.ts.map +0 -1
  254. package/dist/src/components/structural/Modal.vue.d.ts +0 -5
  255. package/dist/src/components/structural/Modal.vue.d.ts.map +0 -1
  256. package/dist/styles.css +0 -1
  257. /package/dist/{components → types/components}/composite/ProductDetails.vue.d.ts +0 -0
  258. /package/dist/{components → types/components}/composite/ResultsLayout.vue.d.ts +0 -0
  259. /package/dist/{components → types/components}/index.d.ts +0 -0
  260. /package/dist/{constants → types/constants}/MyConstants.d.ts +0 -0
  261. /package/dist/{constants → types/constants}/index.d.ts +0 -0
  262. /package/dist/types/{CheckoutMilestone.d.ts → types/CheckoutMilestone.d.ts} +0 -0
  263. /package/dist/types/{Footer.d.ts → types/Footer.d.ts} +0 -0
  264. /package/dist/types/{Menu.d.ts → types/Menu.d.ts} +0 -0
  265. /package/dist/types/{RadioOption.d.ts → types/RadioOption.d.ts} +0 -0
  266. /package/dist/types/{SelectOption.d.ts → types/SelectOption.d.ts} +0 -0
  267. /package/dist/types/{StoreDataValue.d.ts → types/StoreDataValue.d.ts} +0 -0
  268. /package/dist/types/{Storyblok.d.ts → types/Storyblok.d.ts} +0 -0
  269. /package/dist/types/{TileOption.d.ts → types/TileOption.d.ts} +0 -0
  270. /package/dist/{utils → types/utils}/cjaRouter.d.ts +0 -0
  271. /package/dist/{utils → types/utils}/cjaStore.d.ts +0 -0
  272. /package/dist/{utils → types/utils}/findScrollAncestor.d.ts +0 -0
  273. /package/dist/{utils → types/utils}/generateRoutes.d.ts +0 -0
  274. /package/dist/{utils → types/utils}/getFromUrl.d.ts +0 -0
  275. /package/dist/{utils → types/utils}/getMessages.d.ts +0 -0
  276. /package/dist/{utils → types/utils}/gtm.d.ts +0 -0
  277. /package/dist/{utils → types/utils}/index.d.ts +0 -0
  278. /package/dist/{utils → types/utils}/jsonReviver.d.ts +0 -0
  279. /package/dist/{utils → types/utils}/storyblokLink.d.ts +0 -0
  280. /package/dist/{utils → types/utils}/updateForm.d.ts +0 -0
  281. /package/dist/{utils → types/utils}/uploadFile.d.ts +0 -0
  282. /package/dist/{utils → types/utils}/useGlobalProperties.d.ts +0 -0
  283. /package/dist/{utils → types/utils}/useViewportDetector.d.ts +0 -0
@@ -0,0 +1,332 @@
1
+ <template>
2
+ <component
3
+ class="cja-btn"
4
+ :is="href ? 'a' : 'button'"
5
+ :href="href"
6
+ :target="target"
7
+ :class="[
8
+ `btn-${type}`,
9
+ `btn-size-${size}`,
10
+ `btn-color-${color}`,
11
+ `icon-${iconPosition}`,
12
+ { 'btn-loading': loading, 'btn-icon-only': !$slots.default && icon },
13
+ ]"
14
+ >
15
+ <Scaffold v-if="!loading">
16
+ <slot></slot>
17
+ <span v-if="icon" class="icon" :class="icon"></span>
18
+ </Scaffold>
19
+ <div class="spinner" v-else></div>
20
+ </component>
21
+ </template>
22
+
23
+ <script lang="ts" setup>
24
+ import { AnchorHTMLAttributes } from "vue";
25
+ import Scaffold from "./Scaffold.vue";
26
+
27
+ withDefaults(
28
+ defineProps<{
29
+ type?: "primary" | "secondary" | "tertiary";
30
+ color?: "blue" | "orange" | "white";
31
+ size?: "sm" | "md" | "lg";
32
+ icon?: string;
33
+ iconPosition?: "left" | "right";
34
+ loading?: boolean;
35
+ href?: AnchorHTMLAttributes["href"];
36
+ target?: AnchorHTMLAttributes["target"];
37
+ }>(),
38
+ {
39
+ type: "primary",
40
+ color: "blue",
41
+ size: "md",
42
+ iconPosition: "right",
43
+ }
44
+ );
45
+ </script>
46
+
47
+ <style lang="scss" scoped>
48
+ @import "../../assets/shadows.scss";
49
+
50
+ .cja-btn {
51
+ display: inline-flex;
52
+ justify-content: center;
53
+ align-items: center;
54
+ font-weight: 700;
55
+ cursor: pointer;
56
+ transition: all 0.2s ease-in-out;
57
+ border-width: 1px;
58
+ border-style: solid;
59
+ border-color: transparent;
60
+ background: none;
61
+ text-decoration: none;
62
+ font-family: Nunito Sans, Helvetica, sans-serif;
63
+
64
+ &:focus-visible {
65
+ outline: none;
66
+ }
67
+
68
+ &:hover {
69
+ box-shadow: none;
70
+ text-decoration: none;
71
+ }
72
+
73
+ &.icon-left {
74
+ flex-direction: row-reverse;
75
+ }
76
+
77
+ &.btn-size-sm {
78
+ font-size: 14px;
79
+ line-height: 18px;
80
+ padding: 8px 12px;
81
+ border-radius: 8px;
82
+ gap: 8px;
83
+
84
+ &.btn-icon-only,
85
+ &.btn-loading {
86
+ padding: 4px 10px;
87
+ }
88
+
89
+ &.btn-loading .spinner {
90
+ width: 14px;
91
+ height: 14px;
92
+ }
93
+ }
94
+
95
+ &.btn-size-md {
96
+ font-size: 18px;
97
+ line-height: 18px;
98
+ padding: 8px 24px;
99
+ border-radius: 8px;
100
+ gap: 8px;
101
+
102
+ &.btn-icon-only,
103
+ &.btn-loading {
104
+ padding: 8px 12px;
105
+ }
106
+
107
+ &.btn-loading .spinner {
108
+ width: 18px;
109
+ height: 18px;
110
+ }
111
+ }
112
+
113
+ &.btn-size-lg {
114
+ font-size: 22px;
115
+ line-height: 22px;
116
+ padding: 16px 32px;
117
+ border-radius: 8px;
118
+ gap: 12px;
119
+
120
+ &.btn-icon-only,
121
+ &.btn-loading {
122
+ padding: 16px;
123
+ }
124
+
125
+ &.btn-loading .spinner {
126
+ width: 22px;
127
+ height: 22px;
128
+ }
129
+ }
130
+
131
+ &.btn-primary {
132
+ box-shadow: $box-shadow-s;
133
+
134
+ &.btn-color-blue:not(:disabled) {
135
+ background: #076b9c;
136
+ border-color: #076b9c;
137
+ color: #fff;
138
+
139
+ &:hover {
140
+ background: #0d2745;
141
+ border-color: #0d2745;
142
+ }
143
+
144
+ &:focus {
145
+ background: #155072;
146
+ border-color: #155072;
147
+ }
148
+ }
149
+
150
+ &.btn-color-orange:not(:disabled) {
151
+ background: #f58423;
152
+ border-color: #f58423;
153
+ color: #fff;
154
+
155
+ &:hover {
156
+ background: #ea730b;
157
+ border-color: #ea730b;
158
+ }
159
+
160
+ &:focus {
161
+ background: #f9b377;
162
+ border-color: #f9b377;
163
+ }
164
+ }
165
+
166
+ &.btn-color-white:not(:disabled) {
167
+ background: #fff;
168
+ border-color: #fff;
169
+ color: #0d2745;
170
+
171
+ &:hover {
172
+ background: #fafafa;
173
+ border-color: #fafafa;
174
+ }
175
+
176
+ &:focus {
177
+ background: #ebebeb;
178
+ border-color: #ebebeb;
179
+ }
180
+ }
181
+
182
+ &:disabled {
183
+ background: #f1f5f9;
184
+ border-color: #f1f5f9;
185
+ color: #9fabbc;
186
+ cursor: auto;
187
+ }
188
+
189
+ &.btn-loading .spinner {
190
+ border-color: #fff;
191
+ border-top-color: rgba(255, 255, 255, 0.2);
192
+ }
193
+ }
194
+
195
+ &.btn-secondary {
196
+ &.btn-color-blue:not(:disabled) {
197
+ border-color: #076b9c;
198
+ color: #076b9c;
199
+
200
+ &:hover {
201
+ background: #f4f9fc;
202
+ border-color: #155072;
203
+ color: #155072;
204
+ }
205
+
206
+ &:focus {
207
+ border-color: #0d2745;
208
+ color: #0d2745;
209
+ }
210
+ }
211
+
212
+ &.btn-color-orange:not(:disabled) {
213
+ border-color: #f58423;
214
+ color: #f58423;
215
+
216
+ &:hover {
217
+ background: #fdf1e2;
218
+ border-color: #f9b377;
219
+ color: #f9b377;
220
+ }
221
+
222
+ &:focus {
223
+ border-color: #ea730b;
224
+ color: #ea730b;
225
+ }
226
+ }
227
+
228
+ &.btn-color-white:not(:disabled) {
229
+ border-color: #fff;
230
+ color: #fff;
231
+
232
+ &:hover {
233
+ background: #ebebeb;
234
+ border-color: #fafafa;
235
+ color: #fafafa;
236
+ }
237
+
238
+ &:focus {
239
+ border-color: #ebebeb;
240
+ color: #ebebeb;
241
+ }
242
+ }
243
+
244
+ &:disabled {
245
+ border-color: #9fabbc;
246
+ color: #9fabbc;
247
+ cursor: auto;
248
+ }
249
+
250
+ &.btn-loading .spinner {
251
+ border-top-color: rgba(255, 255, 255, 0.2);
252
+ }
253
+ }
254
+
255
+ &.btn-tertiary {
256
+ &.btn-color-blue:not(:disabled) {
257
+ color: #076b9c;
258
+
259
+ &:hover {
260
+ box-shadow: $box-shadow-s;
261
+ color: #155072;
262
+ background: #f4f9fc;
263
+ }
264
+
265
+ &:focus {
266
+ color: #0d2745;
267
+ }
268
+ }
269
+
270
+ &.btn-color-orange:not(:disabled) {
271
+ color: #f58423;
272
+
273
+ &:hover {
274
+ box-shadow: $box-shadow-s;
275
+ color: #f9b377;
276
+ background: #fdf1e2;
277
+ }
278
+
279
+ &:focus {
280
+ color: #ea730b;
281
+ }
282
+ }
283
+
284
+ &.btn-color-white:not(:disabled) {
285
+ color: #fff;
286
+
287
+ &:hover {
288
+ box-shadow: $box-shadow-s;
289
+ color: #0d2745;
290
+ background: #fafafa;
291
+ }
292
+
293
+ &:focus {
294
+ color: #ebebeb;
295
+ }
296
+ }
297
+
298
+ &:disabled {
299
+ color: #9fabbc;
300
+ cursor: auto;
301
+ }
302
+
303
+ &.btn-loading .spinner {
304
+ border-top-color: rgba(255, 255, 255, 0.2);
305
+ }
306
+ }
307
+
308
+ &.btn-loading {
309
+ cursor: auto;
310
+
311
+ .spinner {
312
+ width: 20px;
313
+ height: 20px;
314
+ border-width: 2px;
315
+ border-style: solid;
316
+ border-radius: 50%;
317
+ animation: spin 1s infinite;
318
+ animation-timing-function: linear;
319
+ }
320
+ }
321
+ }
322
+
323
+ @keyframes spin {
324
+ from {
325
+ transform: rotate(0deg);
326
+ }
327
+
328
+ to {
329
+ transform: rotate(360deg);
330
+ }
331
+ }
332
+ </style>
@@ -0,0 +1,141 @@
1
+ <template>
2
+ <div class="collapse-container" :class="{ active: active }">
3
+ <div class="collapse-header" @click="toggleCollapse">
4
+ <div class="header-wrapper">
5
+ <slot name="header"></slot>
6
+ </div>
7
+ <span class="m-cgg-icon--chevron-down"></span>
8
+ </div>
9
+ <Transition name="slide" @enter="slideEnter" @leave="slideLeave">
10
+ <div
11
+ v-show="active"
12
+ ref="contentContainer"
13
+ class="content-container"
14
+ :style="{ height: containerHeight }"
15
+ >
16
+ <div ref="contentWrapper" class="content-wrapper">
17
+ <slot name="content"></slot>
18
+ </div>
19
+ </div>
20
+ </Transition>
21
+ </div>
22
+ </template>
23
+
24
+ <script lang="ts" setup>
25
+ import { ref } from "vue";
26
+
27
+ const props = withDefaults(
28
+ defineProps<{
29
+ active?: boolean;
30
+ scrollToContent?: {
31
+ element: HTMLElement;
32
+ };
33
+ }>(),
34
+ {
35
+ active: false,
36
+ }
37
+ );
38
+
39
+ const active = ref(props.active);
40
+ const contentContainer = ref();
41
+ const contentWrapper = ref();
42
+ const containerHeight = ref();
43
+
44
+ const emit = defineEmits([
45
+ "toggle:collapse",
46
+ "open:collapse",
47
+ "close:collapse",
48
+ ]);
49
+
50
+ const toggleCollapse = () => {
51
+ active.value = !active.value;
52
+ emit("toggle:collapse", active.value);
53
+ };
54
+
55
+ const openCollapse = () => {
56
+ active.value = true;
57
+ emit("open:collapse");
58
+ };
59
+
60
+ const closeCollapse = () => {
61
+ active.value = false;
62
+ emit("close:collapse");
63
+ };
64
+
65
+ const slideEnter = () => {
66
+ containerHeight.value = "0";
67
+
68
+ requestAnimationFrame(() => {
69
+ if (contentContainer.value && contentWrapper.value) {
70
+ containerHeight.value = `${contentWrapper.value.clientHeight}px`;
71
+
72
+ setTimeout(() => {
73
+ containerHeight.value = "";
74
+ }, 200);
75
+
76
+ if (active.value && props.scrollToContent) {
77
+ setTimeout(() => {
78
+ props.scrollToContent?.element.scrollTo({
79
+ top: contentWrapper.value.offsetTop,
80
+ left: 0,
81
+ behavior: "smooth",
82
+ });
83
+ }, 250);
84
+ }
85
+ }
86
+ });
87
+ };
88
+
89
+ const slideLeave = () => {
90
+ containerHeight.value = `${contentWrapper.value.clientHeight}px`;
91
+
92
+ requestAnimationFrame(() => {
93
+ containerHeight.value = "0";
94
+ });
95
+ };
96
+
97
+ defineExpose({ toggleCollapse, openCollapse, closeCollapse });
98
+ </script>
99
+
100
+ <style lang="scss" scoped>
101
+ .collapse-container {
102
+ .collapse-header {
103
+ display: flex;
104
+ flex-direction: row;
105
+ align-items: center;
106
+ justify-content: space-between;
107
+ gap: 16px;
108
+ cursor: pointer;
109
+ user-select: none;
110
+
111
+ > span {
112
+ transition: all 0.2s linear;
113
+ }
114
+ }
115
+
116
+ .content-container {
117
+ transition: all 0.2s linear;
118
+
119
+ &.slide-leave-active,
120
+ &.slide-enter-active {
121
+ overflow: hidden;
122
+ }
123
+
124
+ .content-wrapper {
125
+ padding-top: 16px;
126
+ }
127
+ }
128
+
129
+ &.active {
130
+ .collapse-header > span {
131
+ transform: rotate(180deg);
132
+ }
133
+ }
134
+
135
+ &:not(.active) {
136
+ .content-container {
137
+ overflow: hidden;
138
+ }
139
+ }
140
+ }
141
+ </style>
@@ -0,0 +1,105 @@
1
+ <template>
2
+ <div class="content-tabs">
3
+ <div class="control-container">
4
+ <button
5
+ v-for="(tab, i) in tabs"
6
+ :key="i"
7
+ :class="{ active: activeTab == i }"
8
+ @click="
9
+ activeTab = i;
10
+ $emit('tab:changed', i);
11
+ "
12
+ >
13
+ {{ tab }}
14
+ </button>
15
+ </div>
16
+ <div class="content-container">
17
+ <TransitionGroup name="fade">
18
+ <div
19
+ v-for="(tab, i) in tabs"
20
+ :key="i"
21
+ v-show="activeTab == i"
22
+ :class="`tab-${i}`"
23
+ >
24
+ <slot :name="i"></slot>
25
+ </div>
26
+ </TransitionGroup>
27
+ </div>
28
+ </div>
29
+ </template>
30
+
31
+ <script lang="ts" setup>
32
+ import { ref } from "vue";
33
+
34
+ const props = defineProps<{
35
+ defaultTab: number;
36
+ tabs: string[];
37
+ }>();
38
+ const activeTab = ref(props.defaultTab);
39
+
40
+ defineEmits(["tab:changed"]);
41
+ defineExpose({ activeTab });
42
+ </script>
43
+
44
+ <style lang="scss" scoped>
45
+ .content-tabs {
46
+ .control-container {
47
+ display: flex;
48
+ flex-direction: row;
49
+ flex-wrap: nowrap;
50
+ margin-bottom: 30px;
51
+
52
+ button {
53
+ flex-grow: 1;
54
+ outline: none;
55
+ background: none;
56
+ font-weight: 700;
57
+ padding: 0 5px 7px;
58
+ font-size: 16px;
59
+ line-height: 19px;
60
+ text-align: center;
61
+ border: none;
62
+ color: #979290;
63
+ cursor: pointer;
64
+ border-bottom: 1px solid #979290;
65
+
66
+ &.active {
67
+ color: #076b9c;
68
+ padding: 0 5px 5px;
69
+ border-bottom: 3px solid #076b9c;
70
+ }
71
+
72
+ &:focus {
73
+ outline: none;
74
+ }
75
+ }
76
+ }
77
+
78
+ .content-container {
79
+ position: relative;
80
+ overflow: hidden;
81
+
82
+ .fade-leave-active {
83
+ position: absolute;
84
+ left: 0;
85
+ top: 0;
86
+ width: 100%;
87
+ transition: all 0.3s ease-in-out;
88
+ }
89
+
90
+ .fade-enter-active {
91
+ transition: all 0.3s ease-in-out 0.3s;
92
+ }
93
+
94
+ .fade-enter-from,
95
+ .fade-leave-to {
96
+ opacity: 0;
97
+ }
98
+
99
+ .fade-enter-to,
100
+ .fade-leave-from {
101
+ opacity: 1;
102
+ }
103
+ }
104
+ }
105
+ </style>
@@ -0,0 +1,107 @@
1
+ <template>
2
+ <div
3
+ class="fixed-container"
4
+ :style="{ height: fixedContainerHeight }"
5
+ ref="fixedContainer"
6
+ v-if="active"
7
+ >
8
+ <div
9
+ class="fixed-wrapper"
10
+ :class="{ 'position-fixed': positionFixed }"
11
+ :style="{ ...size, ...position, maxWidth: fixedWrapperWidth }"
12
+ ref="fixedWrapper"
13
+ >
14
+ <slot></slot>
15
+ </div>
16
+ </div>
17
+ <slot v-else></slot>
18
+ </template>
19
+
20
+ <script lang="ts" setup>
21
+ import { onUnmounted, onMounted, watch } from "vue";
22
+ import { ref } from "vue";
23
+
24
+ const props = withDefaults(
25
+ defineProps<{
26
+ active?: boolean;
27
+ scrollThreshold?: number;
28
+ fixWidth?: boolean;
29
+ size?: {
30
+ height?: string;
31
+ width?: string;
32
+ };
33
+ position?: {
34
+ left?: string;
35
+ top?: string;
36
+ right?: string;
37
+ bottom?: string;
38
+ };
39
+ }>(),
40
+ {
41
+ active: true,
42
+ scrollThreshold: 0,
43
+ fixWidth: true,
44
+ }
45
+ );
46
+
47
+ const positionFixed = ref(false);
48
+ const fixedContainer = ref();
49
+ const fixedContainerHeight = ref("");
50
+ const fixedWrapper = ref();
51
+ const fixedWrapperWidth = ref("");
52
+
53
+ const fixPosition = () => {
54
+ if (fixedContainer.value && props.active) {
55
+ positionFixed.value =
56
+ window.scrollY > fixedContainer.value.offsetTop + props.scrollThreshold;
57
+
58
+ fixedContainerHeight.value = positionFixed.value
59
+ ? `${fixedWrapper.value.clientHeight}px`
60
+ : "";
61
+ } else {
62
+ positionFixed.value = false;
63
+ fixedContainerHeight.value = "";
64
+ }
65
+ };
66
+
67
+ const setWidth = () => {
68
+ fixedWrapperWidth.value =
69
+ props.active && fixedContainer.value
70
+ ? `${fixedContainer.value.offsetWidth}px`
71
+ : "";
72
+ };
73
+
74
+ watch(
75
+ () => props.active,
76
+ () => {
77
+ if (props.fixWidth) {
78
+ setWidth();
79
+ }
80
+ }
81
+ );
82
+
83
+ onMounted(() => {
84
+ window.addEventListener("scroll", fixPosition);
85
+ fixPosition();
86
+
87
+ if (props.fixWidth) {
88
+ window.addEventListener("resize", setWidth);
89
+ setWidth();
90
+ }
91
+ });
92
+
93
+ onUnmounted(() => {
94
+ window.removeEventListener("scroll", fixPosition);
95
+ window.removeEventListener("resize", setWidth);
96
+ });
97
+
98
+ defineExpose({ positionFixed });
99
+ </script>
100
+
101
+ <style lang="scss" scoped>
102
+ .fixed-wrapper {
103
+ &.position-fixed {
104
+ position: fixed;
105
+ }
106
+ }
107
+ </style>