@mirweb/mir-web-components 1.15.3 → 2.0.1

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 (184) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/index-Cl4fzBs2.js +17 -0
  3. package/dist/assets/scss/globals.scss +231 -0
  4. package/dist/assets/scss/index.scss +4 -0
  5. package/dist/assets/scss/normalize.scss +393 -0
  6. package/dist/assets/scss/reset.scss +102 -0
  7. package/dist/assets/scss/variables.scss +95 -0
  8. package/dist/components/atoms/button/button.vue +81 -0
  9. package/dist/components/atoms/checkbox/checkbox.vue +125 -0
  10. package/dist/components/atoms/chip/chip.vue +55 -0
  11. package/dist/components/atoms/dropdown/dropdown.vue +490 -0
  12. package/dist/components/atoms/image/image.vue +42 -0
  13. package/dist/components/atoms/label/label.vue +52 -0
  14. package/dist/components/atoms/link/link.vue +166 -0
  15. package/dist/components/atoms/radio-button/radio-button.vue +110 -0
  16. package/dist/components/atoms/select/select.vue +116 -0
  17. package/dist/components/atoms/select-multiple/select-multiple.vue +210 -0
  18. package/dist/components/atoms/slider/slider.vue +322 -0
  19. package/dist/components/atoms/text-field/text-field.vue +273 -0
  20. package/dist/components/atoms/textarea/textarea.vue +179 -0
  21. package/dist/components/atoms/video/video.vue +98 -0
  22. package/dist/components/blocks/accordion/accordion.vue +222 -0
  23. package/dist/components/blocks/card-display/card-display.vue +125 -0
  24. package/dist/components/blocks/column-grid/column-grid.vue +201 -0
  25. package/dist/components/blocks/facts/facts.vue +156 -0
  26. package/dist/components/blocks/features/features.vue +176 -0
  27. package/dist/components/blocks/flashcards/flashcards.vue +212 -0
  28. package/dist/components/blocks/form-script/form-script.vue +172 -0
  29. package/dist/components/blocks/frontpage-hero/frontpage-hero.vue +214 -0
  30. package/dist/components/blocks/headline/headline.vue +93 -0
  31. package/dist/components/blocks/hero/hero.vue +173 -0
  32. package/dist/components/blocks/image/image.vue +93 -0
  33. package/dist/components/blocks/image-gallery/image-gallery.vue +289 -0
  34. package/dist/components/blocks/logo-wall/logo-wall.vue +125 -0
  35. package/dist/components/blocks/micro-stories/micro-stories.vue +316 -0
  36. package/dist/components/blocks/pallet-jack/pallet-jack.vue +440 -0
  37. package/dist/components/blocks/policy/policy.vue +106 -0
  38. package/dist/components/blocks/product-hero/product-hero.vue +140 -0
  39. package/dist/components/blocks/promo/promo.vue +403 -0
  40. package/dist/components/blocks/quote/quote.vue +127 -0
  41. package/dist/components/blocks/rich-text/rich-text-columns.vue +159 -0
  42. package/dist/components/blocks/rich-text/rich-text.vue +296 -0
  43. package/dist/components/blocks/timeline/timeline.vue +232 -0
  44. package/dist/components/blocks/vimeo/vimeo.vue +52 -0
  45. package/dist/components/index.ts +51 -0
  46. package/dist/components/molecules/address/address.vue +123 -0
  47. package/dist/components/molecules/bullet-list/bullet-list.vue +99 -0
  48. package/dist/components/molecules/card/card.vue +302 -0
  49. package/dist/components/molecules/column-card/column-card.vue +178 -0
  50. package/dist/components/molecules/event-card/event-card.vue +111 -0
  51. package/dist/components/molecules/flashcard/flashcard.vue +293 -0
  52. package/dist/components/molecules/modal/modal.vue +113 -0
  53. package/dist/components/molecules/text-card/text-card.vue +74 -0
  54. package/dist/components/organisms/404/404.vue +79 -0
  55. package/dist/components/organisms/filter/filter.vue +89 -0
  56. package/dist/components/organisms/footer/footer.vue +356 -0
  57. package/dist/components/organisms/header/header.vue +754 -0
  58. package/dist/components/organisms/language-switcher/language-switcher.vue +68 -0
  59. package/dist/components/organisms/pagination/pagination.vue +85 -0
  60. package/dist/components/organisms/search/search.vue +153 -0
  61. package/dist/components/templates/404-error-page.vue +0 -0
  62. package/dist/directives/clickOutside.ts +15 -0
  63. package/dist/fonts/OpenSans-Light.woff2 +0 -0
  64. package/dist/fonts/OpenSans-Medium.woff2 +0 -0
  65. package/dist/fonts/OpenSans-Regular.woff2 +0 -0
  66. package/dist/fonts/OpenSans-SemiBold.woff2 +0 -0
  67. package/dist/fonts/Oscine_Bd.woff2 +0 -0
  68. package/dist/fonts/Oscine_Lt.woff2 +0 -0
  69. package/dist/fonts/Oscine_Rg.woff2 +0 -0
  70. package/dist/index.html +12 -0
  71. package/dist/main.css +1 -0
  72. package/package.json +8 -10
  73. package/dist/components/atoms/button/button.vue.d.ts +0 -5
  74. package/dist/components/atoms/button/button.vue.d.ts.map +0 -1
  75. package/dist/components/atoms/checkbox/checkbox.vue.d.ts +0 -5
  76. package/dist/components/atoms/checkbox/checkbox.vue.d.ts.map +0 -1
  77. package/dist/components/atoms/chip/chip.vue.d.ts +0 -5
  78. package/dist/components/atoms/chip/chip.vue.d.ts.map +0 -1
  79. package/dist/components/atoms/dropdown/dropdown.vue.d.ts +0 -5
  80. package/dist/components/atoms/dropdown/dropdown.vue.d.ts.map +0 -1
  81. package/dist/components/atoms/image/image.vue.d.ts +0 -5
  82. package/dist/components/atoms/image/image.vue.d.ts.map +0 -1
  83. package/dist/components/atoms/label/label.vue.d.ts +0 -5
  84. package/dist/components/atoms/label/label.vue.d.ts.map +0 -1
  85. package/dist/components/atoms/link/link.vue.d.ts +0 -5
  86. package/dist/components/atoms/link/link.vue.d.ts.map +0 -1
  87. package/dist/components/atoms/radio-button/radio-button.vue.d.ts +0 -5
  88. package/dist/components/atoms/radio-button/radio-button.vue.d.ts.map +0 -1
  89. package/dist/components/atoms/select/select.vue.d.ts +0 -5
  90. package/dist/components/atoms/select/select.vue.d.ts.map +0 -1
  91. package/dist/components/atoms/select-multiple/select-multiple.vue.d.ts +0 -5
  92. package/dist/components/atoms/select-multiple/select-multiple.vue.d.ts.map +0 -1
  93. package/dist/components/atoms/slider/slider.vue.d.ts +0 -5
  94. package/dist/components/atoms/slider/slider.vue.d.ts.map +0 -1
  95. package/dist/components/atoms/text-field/text-field.vue.d.ts +0 -5
  96. package/dist/components/atoms/text-field/text-field.vue.d.ts.map +0 -1
  97. package/dist/components/atoms/textarea/textarea.vue.d.ts +0 -5
  98. package/dist/components/atoms/textarea/textarea.vue.d.ts.map +0 -1
  99. package/dist/components/atoms/video/video.vue.d.ts +0 -5
  100. package/dist/components/atoms/video/video.vue.d.ts.map +0 -1
  101. package/dist/components/blocks/accordion/accordion.vue.d.ts +0 -5
  102. package/dist/components/blocks/accordion/accordion.vue.d.ts.map +0 -1
  103. package/dist/components/blocks/card-display/card-display.vue.d.ts +0 -6
  104. package/dist/components/blocks/card-display/card-display.vue.d.ts.map +0 -1
  105. package/dist/components/blocks/column-grid/column-grid.vue.d.ts +0 -5
  106. package/dist/components/blocks/column-grid/column-grid.vue.d.ts.map +0 -1
  107. package/dist/components/blocks/facts/facts.vue.d.ts +0 -5
  108. package/dist/components/blocks/facts/facts.vue.d.ts.map +0 -1
  109. package/dist/components/blocks/features/features.vue.d.ts +0 -5
  110. package/dist/components/blocks/features/features.vue.d.ts.map +0 -1
  111. package/dist/components/blocks/flashcards/flashcards.vue.d.ts +0 -5
  112. package/dist/components/blocks/flashcards/flashcards.vue.d.ts.map +0 -1
  113. package/dist/components/blocks/form-script/form-script.vue.d.ts +0 -5
  114. package/dist/components/blocks/form-script/form-script.vue.d.ts.map +0 -1
  115. package/dist/components/blocks/frontpage-hero/frontpage-hero.vue.d.ts +0 -5
  116. package/dist/components/blocks/frontpage-hero/frontpage-hero.vue.d.ts.map +0 -1
  117. package/dist/components/blocks/headline/headline.vue.d.ts +0 -5
  118. package/dist/components/blocks/headline/headline.vue.d.ts.map +0 -1
  119. package/dist/components/blocks/hero/hero.vue.d.ts +0 -5
  120. package/dist/components/blocks/hero/hero.vue.d.ts.map +0 -1
  121. package/dist/components/blocks/image/image.vue.d.ts +0 -5
  122. package/dist/components/blocks/image/image.vue.d.ts.map +0 -1
  123. package/dist/components/blocks/image-gallery/image-gallery.vue.d.ts +0 -5
  124. package/dist/components/blocks/image-gallery/image-gallery.vue.d.ts.map +0 -1
  125. package/dist/components/blocks/logo-wall/logo-wall.vue.d.ts +0 -5
  126. package/dist/components/blocks/logo-wall/logo-wall.vue.d.ts.map +0 -1
  127. package/dist/components/blocks/micro-stories/micro-stories.vue.d.ts +0 -5
  128. package/dist/components/blocks/micro-stories/micro-stories.vue.d.ts.map +0 -1
  129. package/dist/components/blocks/pallet-jack/pallet-jack.vue.d.ts +0 -5
  130. package/dist/components/blocks/pallet-jack/pallet-jack.vue.d.ts.map +0 -1
  131. package/dist/components/blocks/policy/policy.vue.d.ts +0 -4
  132. package/dist/components/blocks/policy/policy.vue.d.ts.map +0 -1
  133. package/dist/components/blocks/product-hero/product-hero.vue.d.ts +0 -5
  134. package/dist/components/blocks/product-hero/product-hero.vue.d.ts.map +0 -1
  135. package/dist/components/blocks/promo/promo.vue.d.ts +0 -5
  136. package/dist/components/blocks/promo/promo.vue.d.ts.map +0 -1
  137. package/dist/components/blocks/quote/quote.vue.d.ts +0 -5
  138. package/dist/components/blocks/quote/quote.vue.d.ts.map +0 -1
  139. package/dist/components/blocks/rich-text/rich-text-columns.vue.d.ts +0 -4
  140. package/dist/components/blocks/rich-text/rich-text-columns.vue.d.ts.map +0 -1
  141. package/dist/components/blocks/rich-text/rich-text.vue.d.ts +0 -5
  142. package/dist/components/blocks/rich-text/rich-text.vue.d.ts.map +0 -1
  143. package/dist/components/blocks/timeline/timeline.vue.d.ts +0 -5
  144. package/dist/components/blocks/timeline/timeline.vue.d.ts.map +0 -1
  145. package/dist/components/blocks/vimeo/vimeo.vue.d.ts +0 -5
  146. package/dist/components/blocks/vimeo/vimeo.vue.d.ts.map +0 -1
  147. package/dist/components/index.d.ts +0 -51
  148. package/dist/components/main.d.ts +0 -59
  149. package/dist/components/molecules/address/address.vue.d.ts +0 -5
  150. package/dist/components/molecules/address/address.vue.d.ts.map +0 -1
  151. package/dist/components/molecules/bullet-list/bullet-list.vue.d.ts +0 -5
  152. package/dist/components/molecules/bullet-list/bullet-list.vue.d.ts.map +0 -1
  153. package/dist/components/molecules/card/card.vue.d.ts +0 -5
  154. package/dist/components/molecules/card/card.vue.d.ts.map +0 -1
  155. package/dist/components/molecules/column-card/column-card.vue.d.ts +0 -5
  156. package/dist/components/molecules/column-card/column-card.vue.d.ts.map +0 -1
  157. package/dist/components/molecules/event-card/event-card.vue.d.ts +0 -5
  158. package/dist/components/molecules/event-card/event-card.vue.d.ts.map +0 -1
  159. package/dist/components/molecules/flashcard/flashcard.vue.d.ts +0 -5
  160. package/dist/components/molecules/flashcard/flashcard.vue.d.ts.map +0 -1
  161. package/dist/components/molecules/modal/modal.vue.d.ts +0 -5
  162. package/dist/components/molecules/modal/modal.vue.d.ts.map +0 -1
  163. package/dist/components/molecules/text-card/text-card.vue.d.ts +0 -5
  164. package/dist/components/molecules/text-card/text-card.vue.d.ts.map +0 -1
  165. package/dist/components/organisms/404/404.vue.d.ts +0 -5
  166. package/dist/components/organisms/404/404.vue.d.ts.map +0 -1
  167. package/dist/components/organisms/filter/filter.vue.d.ts +0 -5
  168. package/dist/components/organisms/filter/filter.vue.d.ts.map +0 -1
  169. package/dist/components/organisms/footer/footer.vue.d.ts +0 -5
  170. package/dist/components/organisms/footer/footer.vue.d.ts.map +0 -1
  171. package/dist/components/organisms/header/header.vue.d.ts +0 -6
  172. package/dist/components/organisms/header/header.vue.d.ts.map +0 -1
  173. package/dist/components/organisms/language-switcher/language-switcher.vue.d.ts +0 -5
  174. package/dist/components/organisms/language-switcher/language-switcher.vue.d.ts.map +0 -1
  175. package/dist/components/organisms/pagination/pagination.vue.d.ts +0 -5
  176. package/dist/components/organisms/pagination/pagination.vue.d.ts.map +0 -1
  177. package/dist/components/organisms/search/search.vue.d.ts +0 -4
  178. package/dist/components/organisms/search/search.vue.d.ts.map +0 -1
  179. package/dist/directives/clickOutside.d.ts +0 -3
  180. package/dist/main.d.ts +0 -1
  181. package/dist/mir-web-components.cjs.js +0 -1
  182. package/dist/mir-web-components.css +0 -1
  183. package/dist/mir-web-components.es.js +0 -3187
  184. package/dist/mir-web-components.umd.js +0 -2
@@ -0,0 +1,179 @@
1
+ <template>
2
+ <div class="textarea-wrapper">
3
+ <label :for="id" :class="{ required: required }"
4
+ >{{ labelText }}{{ required ? " *" : "" }}</label
5
+ >
6
+ <div
7
+ :class="
8
+ modelValue !== undefined && modelValue.length === maxLength
9
+ ? 'textarea-wrapper__inner'
10
+ : ''
11
+ "
12
+ >
13
+ <textarea
14
+ :id="id"
15
+ rows="10"
16
+ cols="50"
17
+ :name="name"
18
+ :placeholder="placeholder"
19
+ :required="required"
20
+ :disabled="disabled"
21
+ :maxlength="maxLength"
22
+ :value="modelValue"
23
+ :class="
24
+ modelValue !== undefined && modelValue.length === maxLength
25
+ ? 'reached-meter-limit'
26
+ : 'border'
27
+ "
28
+ @input="
29
+ $emit('update:modelValue', ($event.target as HTMLInputElement).value)
30
+ "
31
+ />
32
+ </div>
33
+ <div class="textarea-info">
34
+ <div>
35
+ <p v-if="modelValue !== undefined && modelValue.length === maxLength">
36
+ Too many characters. Please make it shorter
37
+ </p>
38
+ </div>
39
+ <p
40
+ :class="
41
+ modelValue !== undefined && modelValue.length === maxLength
42
+ ? 'reached-meter-limit-meter'
43
+ : ''
44
+ "
45
+ >
46
+ {{
47
+ maxLength !== undefined &&
48
+ modelValue !== undefined &&
49
+ maxLength - modelValue.length >= 0
50
+ ? modelValue.length
51
+ : 0
52
+ }}
53
+ / {{ maxLength }}
54
+ </p>
55
+ </div>
56
+ </div>
57
+ </template>
58
+
59
+ <script setup lang="ts">
60
+ export type Props = {
61
+ id: string;
62
+ name: string;
63
+ placeholder: string;
64
+ required: boolean;
65
+ disabled: boolean;
66
+ labelText: string;
67
+ maxLength: number;
68
+ modelValue: string;
69
+ };
70
+
71
+ withDefaults(defineProps<Props>(), {
72
+ id: "",
73
+ name: "",
74
+ placeholder: "",
75
+ required: false,
76
+ disabled: false,
77
+ labelText: "",
78
+ maxLength: undefined,
79
+ modelValue: undefined,
80
+ });
81
+
82
+ defineEmits(["update:modelValue"]);
83
+ </script>
84
+ <style scoped lang="scss">
85
+ @use "../../../assets/scss/variables.scss" as *;
86
+ .textarea-wrapper {
87
+ display: flex;
88
+ flex-direction: column;
89
+ width: 100%;
90
+ font-weight: 300;
91
+
92
+ .textarea-wrapper__inner {
93
+ position: relative;
94
+ &::before {
95
+ content: "";
96
+ position: absolute;
97
+ top: 15px;
98
+ right: 15px;
99
+ width: 21px;
100
+ height: 21px;
101
+ background: center / contain no-repeat
102
+ url("https://a.storyblok.com/f/230581/22x22/ff2897a955/info-red.svg?cv=1695125825848");
103
+ }
104
+ }
105
+
106
+ textarea {
107
+ width: 100%;
108
+ resize: none;
109
+ border-radius: $border-radius;
110
+ padding: 15px;
111
+ font-family: $font-opensans;
112
+ font-size: $font-size-xsm;
113
+ position: relative;
114
+
115
+ &::placeholder {
116
+ color: $grey-400;
117
+ }
118
+
119
+ &:disabled {
120
+ background-color: #f5f6f6;
121
+ border: 1px solid #ced4da;
122
+ color: #ced4da;
123
+ }
124
+ }
125
+
126
+ .textarea-info {
127
+ width: 100%;
128
+ display: grid;
129
+ grid: 1fr / 1fr 1fr;
130
+ margin-top: 7px;
131
+ font-size: $font-size-xsm;
132
+
133
+ p {
134
+ font-size: $font-size-xsm;
135
+
136
+ &:first-child {
137
+ justify-self: left;
138
+ color: $warning;
139
+ font-weight: 700;
140
+ }
141
+
142
+ &:last-child {
143
+ justify-self: right;
144
+ }
145
+ }
146
+ }
147
+
148
+ label {
149
+ margin-bottom: 7px;
150
+ font-weight: 300;
151
+ }
152
+
153
+ .border {
154
+ border: 1px solid $grey-400;
155
+
156
+ &:hover,
157
+ &:focus,
158
+ &:active,
159
+ &:target {
160
+ box-shadow: 0 0 15px #cfeffb;
161
+ border: 1px solid $blue-500;
162
+ transition: $transition-box-shadow;
163
+ transition: $transition-border;
164
+ }
165
+ }
166
+
167
+ .reached-meter-limit {
168
+ border: 1px solid $warning;
169
+ box-shadow: 0 0 15px $grey-400;
170
+ transition: $transition-box-shadow;
171
+ transition: $transition-border;
172
+ }
173
+
174
+ .reached-meter-limit-meter {
175
+ color: $warning;
176
+ font-weight: 700;
177
+ }
178
+ }
179
+ </style>
@@ -0,0 +1,98 @@
1
+ <template>
2
+ <div class="video__wrapper">
3
+ <video
4
+ v-if="localVideo"
5
+ ref="videoRef"
6
+ :aria-label="ariaLabel"
7
+ :controls="controls"
8
+ :poster="poster"
9
+ :width="width"
10
+ :height="height"
11
+ :autoplay="autoplay"
12
+ :loop="loop"
13
+ :muted="muted"
14
+ type="video/mp4"
15
+ playsinline
16
+ :src="src"
17
+ ></video>
18
+ <iframe
19
+ v-else
20
+ :src="src"
21
+ :aria-label="ariaLabel"
22
+ :title="title"
23
+ :width="width"
24
+ :height="height"
25
+ frameborder="0"
26
+ allow="autoplay; fullscreen"
27
+ allowfullscreen
28
+ ></iframe>
29
+ </div>
30
+ </template>
31
+
32
+ <script setup lang="ts">
33
+ import { ref, watchEffect } from "vue";
34
+
35
+ export type Props = {
36
+ play?: boolean;
37
+ src: string;
38
+ localVideo?: boolean;
39
+ ariaLabel: string;
40
+ title?: string;
41
+ controls?: boolean;
42
+ poster?: string;
43
+ width?: string | number;
44
+ height?: string | number;
45
+ autoplay?: boolean;
46
+ loop?: boolean;
47
+ muted?: boolean;
48
+ };
49
+
50
+ const props = withDefaults(defineProps<Props>(), {
51
+ play: false,
52
+ localVideo: false,
53
+ ariaLabel: "",
54
+ title: "",
55
+ controls: true,
56
+ poster: "",
57
+ width: "100%",
58
+ height: "auto",
59
+ autoplay: false,
60
+ loop: false,
61
+ muted: false,
62
+ });
63
+
64
+ let videoRef = ref<HTMLVideoElement | null>(null);
65
+
66
+ watchEffect(() => {
67
+ if (!videoRef.value) {
68
+ return;
69
+ }
70
+ if (props.play) {
71
+ videoRef.value.play();
72
+ } else if (!props.play) {
73
+ videoRef.value.pause();
74
+ }
75
+ });
76
+
77
+ const resetVideo = () => {
78
+ if (videoRef.value) {
79
+ videoRef.value.currentTime = 0;
80
+ videoRef.value.play();
81
+ }
82
+ };
83
+
84
+ defineExpose({
85
+ resetVideo,
86
+ });
87
+ </script>
88
+
89
+ <style scoped lang="scss">
90
+ .video__wrapper {
91
+ position: relative;
92
+ width: 100%;
93
+ display: flex;
94
+ overflow: hidden;
95
+ justify-content: center;
96
+ align-items: center;
97
+ }
98
+ </style>
@@ -0,0 +1,222 @@
1
+ <template>
2
+ <section class="accordions">
3
+ <div class="accordions__wrapper">
4
+ <div v-for="accordion in accordions" :key="accordion._uid">
5
+ <div class="accordion">
6
+ <div
7
+ class="accordion__header"
8
+ @click="toggleAccordion(accordion._uid)"
9
+ >
10
+ <h3 class="accordion__headline">{{ accordion.headline }}</h3>
11
+ <span class="accordion__icon"
12
+ ><img
13
+ v-if="!isAccordionActive(accordion._uid)"
14
+ src="https://a.storyblok.com/f/230581/21x21/42c9c3b5ba/icon_add.svg"
15
+ />
16
+ <img
17
+ v-else
18
+ src="https://a.storyblok.com/f/230581/22x21/adfe5d1742/icon_substract.svg"
19
+ />
20
+ </span>
21
+ </div>
22
+ <div
23
+ class="accordion__content"
24
+ :class="{ 'accordion__content--reverse': accordion.imageFirst }"
25
+ :style="{
26
+ display: isAccordionActive(accordion._uid) ? 'flex' : 'none',
27
+ }"
28
+ >
29
+ <div class="accordion__bodytext">
30
+ <slot
31
+ name="accordion-body"
32
+ v-bind="{ body: accordion.bodytext }"
33
+ ></slot>
34
+ </div>
35
+ <atom-image>
36
+ <slot
37
+ v-if="accordion.image"
38
+ name="accordion-image"
39
+ v-bind="{
40
+ src: accordion.image.filename,
41
+ alt: accordion.image.alt,
42
+ class: 'accordion__image',
43
+ }"
44
+ ></slot
45
+ ></atom-image>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </section>
51
+ </template>
52
+
53
+ <script setup lang="ts">
54
+ import AtomImage from "../../atoms/image/image.vue";
55
+ import { ref } from "vue";
56
+
57
+ export type Props = {
58
+ accordions: Array<{
59
+ headline: string;
60
+ _uid: string;
61
+ bodytext: string;
62
+ image: {
63
+ filename: string;
64
+ alt: string;
65
+ };
66
+ imageFirst: boolean;
67
+ }>;
68
+ };
69
+
70
+ withDefaults(defineProps<Props>(), {});
71
+
72
+ const activeAccordions = ref<string[]>([]);
73
+
74
+ const toggleAccordion = (id: string) => {
75
+ const index = activeAccordions.value.indexOf(id);
76
+ if (index > -1) {
77
+ activeAccordions.value.splice(index, 1);
78
+ } else {
79
+ activeAccordions.value.push(id);
80
+ }
81
+ };
82
+
83
+ const isAccordionActive = (id: string) => {
84
+ return activeAccordions.value.includes(id);
85
+ };
86
+ </script>
87
+
88
+ <style scoped lang="scss">
89
+ @use "../../../assets/scss/variables.scss" as *;
90
+
91
+ .accordions {
92
+ max-width: $screen-lg-min;
93
+ margin: 0 auto;
94
+
95
+ &__wrapper {
96
+ margin: 60px 30px;
97
+ border: 1px solid $grey-400;
98
+ box-shadow: 0 0 15px $grey-100;
99
+
100
+ &:last-child {
101
+ border-bottom: none;
102
+ }
103
+
104
+ @include md {
105
+ margin: 60px 0px;
106
+ }
107
+ }
108
+
109
+ .accordion {
110
+ border-bottom: 1px solid $grey-400;
111
+ transition: $transition-background-color;
112
+ background-color: $white;
113
+
114
+ &__header {
115
+ padding: 30px 30px;
116
+ cursor: pointer;
117
+ display: flex;
118
+ justify-content: space-between;
119
+ align-items: center;
120
+ transition: $transition-background-color;
121
+ &:hover {
122
+ background-color: $blue-200;
123
+ }
124
+ }
125
+ &__icon {
126
+ font-size: 24px;
127
+ line-height: 0;
128
+ font-weight: 700;
129
+
130
+ :deep(img) {
131
+ width: 21px;
132
+ height: 21px;
133
+ }
134
+ }
135
+ &__content {
136
+ padding: 30px;
137
+ background-color: white;
138
+ transition: all 0.3s ease-in-out;
139
+ display: flex;
140
+ flex-direction: column;
141
+ gap: 30px;
142
+
143
+ &--reverse {
144
+ flex-direction: column-reverse;
145
+ }
146
+ }
147
+ &__image {
148
+ max-width: 100%;
149
+ height: auto;
150
+ margin-bottom: 15px;
151
+ }
152
+ &__bodytext {
153
+ margin: 0;
154
+ font-size: 16px;
155
+ line-height: 1.5;
156
+ line-height: 24px;
157
+ font-family: OpenSans, sans-serif;
158
+ color: $blue-900;
159
+ font-weight: 300;
160
+
161
+ :deep(b) {
162
+ font-weight: 700;
163
+ }
164
+
165
+ :deep(p) {
166
+ padding-bottom: 1rem;
167
+
168
+ a {
169
+ color: $blue-600;
170
+ text-decoration: 0.3px underline;
171
+ font-weight: 500;
172
+
173
+ &:hover {
174
+ color: $blue-800;
175
+ transition: $transition-color;
176
+ }
177
+ }
178
+ }
179
+
180
+ :deep(ol) {
181
+ padding-left: 1rem;
182
+ list-style-type: decimal;
183
+ font-family: OpenSans, sans-serif;
184
+ font-weight: 300;
185
+
186
+ li {
187
+ margin: 5px 0;
188
+ p {
189
+ padding-bottom: 0px;
190
+ }
191
+ }
192
+ }
193
+
194
+ :deep(ul) {
195
+ list-style-type: none;
196
+ font-family: OpenSans, sans-serif;
197
+ font-weight: 300;
198
+ padding-left: 1rem;
199
+
200
+ li {
201
+ margin: 5px 0;
202
+ list-style: none;
203
+ position: relative;
204
+ left: 0;
205
+
206
+ p {
207
+ padding-bottom: 0px;
208
+ }
209
+ }
210
+
211
+ li::before {
212
+ content: "\2022";
213
+ position: absolute;
214
+ left: -0.8em;
215
+ font-size: 1.1em;
216
+ color: $blue-900;
217
+ }
218
+ }
219
+ }
220
+ }
221
+ }
222
+ </style>
@@ -0,0 +1,125 @@
1
+ <template>
2
+ <div
3
+ :class="[
4
+ 'card-display',
5
+
6
+ bgColor === 'blue' ? 'card-display--blue' : 'card-display--white',
7
+ ]"
8
+ >
9
+ <div
10
+ :class="[
11
+ 'card-display__wrapper',
12
+ isBlock
13
+ ? 'card-display__wrapper--block'
14
+ : 'card-display__wrapper--inline',
15
+ ]"
16
+ >
17
+ <div v-if="headline || paragraph" class="card__content">
18
+ <h2 v-if="headline">
19
+ {{ headline }}
20
+ </h2>
21
+ <p v-if="paragraph">
22
+ {{ paragraph }}
23
+ </p>
24
+ </div>
25
+ <div class="card__cards">
26
+ <slot name="card-display-cards" />
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </template>
31
+
32
+ <script setup lang="ts">
33
+ defineProps({
34
+ headline: {
35
+ type: String,
36
+ default: "",
37
+ },
38
+ paragraph: {
39
+ type: String,
40
+ default: "",
41
+ },
42
+ bgColor: {
43
+ type: String,
44
+ default: "white",
45
+ },
46
+ isBlock: {
47
+ type: Boolean,
48
+ default: true,
49
+ },
50
+ });
51
+ </script>
52
+ <style lang="scss">
53
+ @use "../../../assets/scss/variables.scss" as *;
54
+
55
+ .card__cards a {
56
+ width: 100%;
57
+ @include sm {
58
+ width: auto;
59
+ }
60
+ }
61
+ </style>
62
+
63
+ <style scoped lang="scss">
64
+ @use "../../../assets/scss/variables.scss" as *;
65
+ .card {
66
+ &-display {
67
+ width: 100%;
68
+ &--blue {
69
+ background-color: $blue-100;
70
+
71
+ :deep(video) {
72
+ outline: 4px solid transparent;
73
+ outline-offset: -4px;
74
+ mix-blend-mode: multiply;
75
+ }
76
+ }
77
+
78
+ &--white {
79
+ background-color: transparent;
80
+
81
+ :deep(video) {
82
+ outline: 4px solid transparent;
83
+ outline-offset: -4px;
84
+ mix-blend-mode: multiply;
85
+ }
86
+ }
87
+ &__wrapper {
88
+ padding: $padding-mobile;
89
+ max-width: $max-width;
90
+ margin: auto;
91
+
92
+ &--block {
93
+ @include md {
94
+ padding: $padding-desktop;
95
+ }
96
+ }
97
+
98
+ &--inline {
99
+ @include md {
100
+ padding: 30px 0px;
101
+ }
102
+ }
103
+ }
104
+ }
105
+
106
+ &__content {
107
+ max-width: 499px;
108
+
109
+ h2,
110
+ p {
111
+ margin-bottom: 25px;
112
+ }
113
+ }
114
+
115
+ &__cards {
116
+ display: flex;
117
+ flex-wrap: wrap;
118
+ row-gap: 30px;
119
+
120
+ @include sm {
121
+ row-gap: 0px;
122
+ }
123
+ }
124
+ }
125
+ </style>