@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,212 @@
1
+ <template>
2
+ <div
3
+ class="flashcards"
4
+ :class="bgColor === 'light' ? 'flashcards--light' : 'flashcards--white'"
5
+ >
6
+ <div class="flashcard-wrapper">
7
+ <div
8
+ :class="[
9
+ { 'no-bodytext': !hasBodytext },
10
+ 'flashcard-wrapper__top-section',
11
+ ]"
12
+ >
13
+ <h2 v-if="headline" class="flashcard-wrapper__headline">
14
+ {{ headline }}
15
+ </h2>
16
+ <div v-if="body" class="flashcard-wrapper__bodytext">
17
+ <slot name="flashcard-wrapper-body"></slot>
18
+ </div>
19
+ </div>
20
+ <div
21
+ class="flashcard-wrapper__teaser-list"
22
+ :class="{
23
+ sm: cardSize === 'sm',
24
+ md: cardSize === 'md',
25
+ lg: cardSize === 'lg',
26
+ }"
27
+ >
28
+ <molecule-flashcard
29
+ v-for="card in flashcards"
30
+ :key="card._uid"
31
+ :name="card.name"
32
+ :bodytext="card.bodytext"
33
+ :image="card.image"
34
+ :namebackside="card.namebackside ? card.namebackside : ''"
35
+ :bodytextbackside="card.bodytextbackside"
36
+ :imagebackside="
37
+ card.imagebackside ? card.imagebackside : { filename: '', alt: '' }
38
+ "
39
+ :size="cardSize"
40
+ :image-fit="card.imageFit"
41
+ :image-fit-back="card.imageFitBack"
42
+ ><template #flashcard-front-body="{ bodytext }"
43
+ ><slot name="flashcard-front-body" v-bind="{ bodytext }"></slot
44
+ ></template>
45
+ <template #flashcard-front-image="{ src, alt }"
46
+ ><slot
47
+ name="flashcard-front-image"
48
+ v-bind="{ src, alt }"
49
+ ></slot></template
50
+ ><template #flashcard-back-body="{ bodytextbackside }"
51
+ ><slot
52
+ name="flashcard-back-body"
53
+ v-bind="{ bodytextbackside }"
54
+ ></slot
55
+ ></template>
56
+ <template #flashcard-back-image="{ src, alt }"
57
+ ><slot name="flashcard-back-image" v-bind="{ src, alt }"></slot
58
+ ></template>
59
+ </molecule-flashcard>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </template>
64
+
65
+ <script setup lang="ts">
66
+ import MoleculeFlashcard from "../../molecules/flashcard/flashcard.vue";
67
+ import { computed } from "vue";
68
+
69
+ export type Props = {
70
+ headline: string;
71
+ body: string;
72
+ bgColor: string;
73
+ flashcards: Array<{
74
+ name: string;
75
+ bodytext: string;
76
+ image: {
77
+ filename: string;
78
+ alt: string;
79
+ };
80
+ namebackside: string;
81
+ bodytextbackside: string;
82
+ imagebackside: {
83
+ filename: string;
84
+ alt: string;
85
+ };
86
+ imageFit: boolean;
87
+ imageFitBack: boolean;
88
+ _uid: string;
89
+ }>;
90
+ };
91
+
92
+ const props = withDefaults(defineProps<Props>(), {});
93
+
94
+ const hasBodytext = computed(() => props.body.trim().length > 0);
95
+
96
+ const cardSize = computed(() => {
97
+ const count = props.flashcards?.length;
98
+ if (count === 4 || count === 5) {
99
+ return "sm";
100
+ } else if (count === 6) {
101
+ return "md";
102
+ } else if (count === 3) {
103
+ return "md";
104
+ } else if (count === 2) {
105
+ return "lg";
106
+ }
107
+ return "sm";
108
+ });
109
+ </script>
110
+
111
+ <style scoped lang="scss">
112
+ @use "../../../assets/scss/variables.scss" as *;
113
+
114
+ .flashcards {
115
+ width: 100%;
116
+
117
+ &--light {
118
+ background-color: $blue-000;
119
+ }
120
+
121
+ &--white {
122
+ background-color: $white;
123
+ }
124
+ }
125
+
126
+ .flashcard-wrapper {
127
+ margin: 30px 30px;
128
+ max-width: $screen-lg-min;
129
+
130
+ @include md {
131
+ margin: 30px 0;
132
+ margin: 0 auto;
133
+ }
134
+
135
+ &__top-section {
136
+ display: grid;
137
+ margin: 0 auto;
138
+ padding-top: 60px;
139
+ padding-bottom: 60px;
140
+ }
141
+
142
+ &__headline {
143
+ padding-bottom: 30px;
144
+ }
145
+
146
+ &__bodytext {
147
+ font-size: 16px;
148
+ line-height: 24px;
149
+ font-family: $font-opensans;
150
+ color: $blue-900;
151
+ font-weight: 300;
152
+ max-width: 658px;
153
+ }
154
+
155
+ &__teaser-list {
156
+ display: grid;
157
+ gap: 30px;
158
+ padding-bottom: 60px;
159
+
160
+ &.sm {
161
+ grid-template-columns: repeat(auto-fit, minmax(223px, 1fr));
162
+ @media screen and (max-width: $screen-lg-min) {
163
+ grid-template-columns: repeat(auto-fit, minmax(308px, 1fr));
164
+ }
165
+ @media screen and (max-width: $screen-md-min) {
166
+ grid-template-columns: auto;
167
+ }
168
+ }
169
+
170
+ &.md {
171
+ grid-template-columns: repeat(auto-fit, minmax(308px, 1fr));
172
+ @media screen and (max-width: $screen-md-min) {
173
+ grid-template-columns: auto;
174
+ }
175
+ }
176
+
177
+ &.lg {
178
+ grid-template-columns: repeat(auto-fit, minmax(477px, 1fr));
179
+ @media screen and (max-width: $screen-lg-min) {
180
+ grid-template-columns: repeat(auto-fit, minmax(308px, 1fr));
181
+ }
182
+ @media screen and (max-width: $screen-md-min) {
183
+ grid-template-columns: auto;
184
+ }
185
+ }
186
+ }
187
+
188
+ :deep(.flashcard-front, .flashcard-back) {
189
+ transition: $transition-box-shadow;
190
+ }
191
+
192
+ :hover:deep(.flashcard-front) {
193
+ box-shadow: 0px 0px 20px $blue-300;
194
+ }
195
+
196
+ :hover:deep(.flashcard-back) {
197
+ box-shadow: 0px 0px 20px $blue-300;
198
+ }
199
+
200
+ :hover:deep(.flashcard-front:not(:hover)) {
201
+ box-shadow: 0px 0px 5px $blue-300;
202
+ }
203
+
204
+ :hover:deep(.flashcard-back:not(:hover)) {
205
+ box-shadow: 0px 0px 5px $blue-300;
206
+ }
207
+ }
208
+
209
+ .no-bodytext {
210
+ padding-bottom: 0px;
211
+ }
212
+ </style>
@@ -0,0 +1,172 @@
1
+ <template>
2
+ <div :class="['form__wrapper', selectedVariant]">
3
+ <div class="form__content">
4
+ <div class="form__information">
5
+ <h2 class="form__headline">
6
+ {{ headline }}
7
+ </h2>
8
+ <div class="form__body">
9
+ <slot name="form-body" />
10
+ </div>
11
+ <atom-link
12
+ v-if="linkType === 'link'"
13
+ :link-type="
14
+ variant === 'dark'
15
+ ? 'regular_dark'
16
+ : variant === 'light'
17
+ ? 'regular_light'
18
+ : 'regular_light'
19
+ "
20
+ arrow
21
+ ><slot name="form-link"></slot
22
+ ></atom-link>
23
+ </div>
24
+ <div class="form__script">
25
+ <slot name="form-script" />
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ import { computed } from "vue";
33
+ import AtomLink from "../../atoms/link/link.vue";
34
+
35
+ const VARIANTS = {
36
+ dark: "form__wrapper--dark",
37
+ light: "form__wrapper--light",
38
+ default: "form__wrapper--default",
39
+ } as const;
40
+
41
+ type Variant = keyof typeof VARIANTS;
42
+
43
+ export type Props = {
44
+ headline?: string;
45
+ linkText?: string;
46
+ variant?: Variant;
47
+ linkType?: string;
48
+ };
49
+
50
+ const props = withDefaults(defineProps<Props>(), {
51
+ headline: "",
52
+ linkText: "",
53
+ variant: "default",
54
+ linkType: "link",
55
+ });
56
+
57
+ const selectedVariant = computed(() => VARIANTS[props.variant]);
58
+ </script>
59
+
60
+ <style scoped lang="scss">
61
+ @use "../../../assets/scss/variables.scss" as *;
62
+
63
+ .form {
64
+ &__wrapper {
65
+ width: 100%;
66
+ background-color: $blue-000;
67
+ padding: 60px 30px;
68
+
69
+ @include md {
70
+ padding: 60px 0;
71
+ }
72
+ }
73
+
74
+ &__content {
75
+ max-width: $max-width;
76
+ margin: 0 auto;
77
+ display: flex;
78
+ gap: 60px;
79
+ flex-wrap: wrap;
80
+ justify-content: space-between;
81
+ }
82
+
83
+ &__information {
84
+ max-width: 410px;
85
+ width: 100%;
86
+ min-width: 328px;
87
+ }
88
+
89
+ &__headline {
90
+ margin-bottom: 30px;
91
+ }
92
+
93
+ &__body {
94
+ font-family: $font-opensans;
95
+ line-height: $line-height-sm;
96
+ font-size: $font-size-sm;
97
+ font-weight: 300;
98
+
99
+ :deep(h3) {
100
+ margin: 1rem 0;
101
+ font-weight: 300;
102
+ }
103
+
104
+ :deep(p) {
105
+ padding-bottom: 1rem;
106
+
107
+ a {
108
+ color: $blue-600;
109
+ text-decoration: 0.3px underline;
110
+ font-weight: 500;
111
+
112
+ &:hover {
113
+ color: $blue-800;
114
+ transition: $transition-color;
115
+ }
116
+ }
117
+ }
118
+ :deep(ol) {
119
+ padding-left: 1rem;
120
+ list-style-type: decimal;
121
+ font-family: $font-opensans;
122
+ font-weight: 300;
123
+
124
+ li {
125
+ margin: 5px 0;
126
+ p {
127
+ padding-bottom: 0px;
128
+ }
129
+ }
130
+ }
131
+
132
+ :deep(ul) {
133
+ list-style-type: none;
134
+ font-family: $font-opensans;
135
+ font-weight: 300;
136
+ padding-left: 1rem;
137
+
138
+ li {
139
+ margin: 5px 0;
140
+ list-style: none;
141
+ position: relative;
142
+ left: 0;
143
+
144
+ p {
145
+ padding-bottom: 0px;
146
+ }
147
+ }
148
+
149
+ li::before {
150
+ content: "\2022";
151
+ position: absolute;
152
+ left: -0.8em;
153
+ font-size: 1.1em;
154
+ }
155
+ }
156
+ }
157
+
158
+ &__script {
159
+ background-color: $white;
160
+ padding: 15px 15px 0 15px;
161
+ max-width: 492px;
162
+ width: 100%;
163
+ border-radius: $border-radius;
164
+ margin: 0 auto;
165
+ box-shadow: $box-shadow;
166
+
167
+ @include md {
168
+ margin: 0;
169
+ }
170
+ }
171
+ }
172
+ </style>
@@ -0,0 +1,214 @@
1
+ <template>
2
+ <div class="academy-overview" :style="bgStyle">
3
+ <div class="academy-overview__content-wrapper">
4
+ <div class="academy-overview__content">
5
+ <div>
6
+ <h1 class="academy-overview__title">{{ hero.headline }}</h1>
7
+ <div class="academy-overview__description">
8
+ <slot name="academy-description"></slot>
9
+ </div>
10
+ <div class="academy-overview__button-wrapper">
11
+ <slot name="button"></slot>
12
+ </div>
13
+ </div>
14
+
15
+ <div v-if="hero.showStats" class="academy-overview__stats">
16
+ <div class="academy-overview__stats-row">
17
+ <div class="academy-overview__stat">
18
+ <div class="academy-overview__value">{{ hero.lessonValue }}</div>
19
+ <div class="academy-overview__label">{{ hero.lessonLabel }}</div>
20
+ </div>
21
+ <div class="academy-overview__stat">
22
+ <div class="academy-overview__value">{{ hero.pointsValue }}</div>
23
+ <div class="academy-overview__label">{{ hero.pointsLabel }}</div>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </template>
31
+
32
+ <script setup lang="ts">
33
+ import { computed } from "vue";
34
+
35
+ interface Hero {
36
+ headline: string;
37
+ cover?: string;
38
+ lessonValue: number;
39
+ lessonLabel: string;
40
+ pointsValue: number;
41
+ pointsLabel: string;
42
+ showStats: boolean;
43
+ }
44
+ export type Props = {
45
+ hero: Hero;
46
+ };
47
+
48
+ const props = withDefaults(defineProps<Props>(), {
49
+ hero: () => ({
50
+ headline: "Welcome back",
51
+ cover: "",
52
+ lessonValue: 0,
53
+ lessonLabel: "Lessons Completed",
54
+ pointsValue: 0,
55
+ pointsLabel: "Points",
56
+ showStats: false,
57
+ }),
58
+ });
59
+
60
+ const mirsaicUrl =
61
+ "https://a.storyblok.com/f/230581/1202x489/e76c5d687c/mirsaic-dark.svg?cv=1695126163753";
62
+
63
+ const bgStyle = computed(() => {
64
+ if (props.hero.cover) {
65
+ return {
66
+ backgroundImage: `url("${mirsaicUrl}"), url(${props.hero.cover})`,
67
+ };
68
+ } else {
69
+ return {
70
+ backgroundImage: `url("${mirsaicUrl}"), linear-gradient(155deg, #143a67 0%, #0c0931 100%)`,
71
+ };
72
+ }
73
+ });
74
+ </script>
75
+
76
+ <style lang="scss" scoped>
77
+ @use "../../../assets/scss/variables.scss" as *;
78
+
79
+ .academy-overview {
80
+ display: flex;
81
+ flex-direction: column;
82
+ position: relative;
83
+ min-height: 422px;
84
+ justify-content: center;
85
+ width: 100%;
86
+ background-repeat: repeat-x, no-repeat;
87
+ background-size: 984px, cover;
88
+ background-position: center top;
89
+ color: $white;
90
+ align-self: center;
91
+ font-family: $font-oscine;
92
+
93
+ &__content-wrapper {
94
+ position: relative;
95
+ display: flex;
96
+ width: 100%;
97
+ padding: 30px 0 60px 0px;
98
+ max-width: 100%;
99
+ margin: auto;
100
+ @include md {
101
+ max-width: $max-width;
102
+ }
103
+ }
104
+ &__content {
105
+ position: relative;
106
+ display: flex;
107
+ width: 100%;
108
+ max-width: 100%;
109
+ flex-direction: column;
110
+ justify-content: space-between;
111
+ gap: 60px;
112
+ padding: 60px 30px;
113
+
114
+ @include md {
115
+ padding: 60px 0px;
116
+ }
117
+
118
+ @include sm {
119
+ flex-direction: row;
120
+ }
121
+ }
122
+ &__title {
123
+ color: $white;
124
+ }
125
+ &__description {
126
+ max-width: 540px;
127
+ margin-top: 30px;
128
+ color: $white;
129
+
130
+ :deep(p) {
131
+ padding-bottom: 1rem;
132
+ color: $white;
133
+ }
134
+
135
+ :deep(b),
136
+ :deep(strong) {
137
+ font-weight: 600;
138
+ color: $white;
139
+ }
140
+
141
+ :deep(ul) {
142
+ list-style-type: none;
143
+ font-family: $font-opensans;
144
+ font-weight: 300;
145
+ padding-left: 1rem;
146
+ color: $white;
147
+
148
+ li {
149
+ margin: 5px 0;
150
+ list-style: none;
151
+ position: relative;
152
+ left: 0;
153
+ color: $white;
154
+
155
+ p {
156
+ padding-bottom: 0px;
157
+ }
158
+ }
159
+
160
+ li::before {
161
+ content: "\2022";
162
+ position: absolute;
163
+ left: -0.8em;
164
+ font-size: 1.1em;
165
+ }
166
+ }
167
+ }
168
+ &__stats {
169
+ @include sm {
170
+ border-bottom: 0;
171
+ border-left: 0.5px solid $blue-600;
172
+ align-self: stretch;
173
+ padding-left: 60px;
174
+ }
175
+ }
176
+ &__stats-row {
177
+ gap: 30px;
178
+ display: flex;
179
+ flex-direction: column;
180
+ }
181
+ &__stat {
182
+ display: flex;
183
+ flex-direction: column;
184
+ line-height: normal;
185
+ flex-grow: 1;
186
+ color: $white;
187
+ font-weight: 300;
188
+ text-align: center;
189
+ }
190
+ &__value,
191
+ &__label {
192
+ align-self: center;
193
+ font-family: $font-oscine;
194
+ max-width: 120px;
195
+ }
196
+ &__value {
197
+ line-height: 52px;
198
+ font-weight: 300;
199
+ font-size: 40px;
200
+ @include md {
201
+ font-size: 60px;
202
+ }
203
+ }
204
+ &__label {
205
+ margin-top: 10px;
206
+ font-size: $font-size-md;
207
+ font-weight: 300;
208
+ line-height: $line-height-sm;
209
+ }
210
+ &__button-wrapper {
211
+ margin-top: 60px;
212
+ }
213
+ }
214
+ </style>
@@ -0,0 +1,93 @@
1
+ <template>
2
+ <div class="headline__wrapper">
3
+ <div
4
+ :class="{
5
+ 'headline__content--article-and-submenu': article && subMenu,
6
+ 'headline__content--article': article && !subMenu,
7
+ 'headline__content--default headline__content--submenu':
8
+ !article && subMenu,
9
+ 'headline__content--default': !article && !subMenu,
10
+ }"
11
+ >
12
+ <h1 class="headline__h1">
13
+ {{ headline }}
14
+ </h1>
15
+ </div>
16
+ </div>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ defineProps({
21
+ headline: {
22
+ type: String,
23
+ required: true,
24
+ },
25
+ article: {
26
+ type: Boolean,
27
+ required: false,
28
+ },
29
+ subMenu: {
30
+ type: Boolean,
31
+ required: false,
32
+ },
33
+ });
34
+ </script>
35
+
36
+ <style lang="scss" scoped>
37
+ @use "../../../assets/scss/variables.scss" as *;
38
+ .headline {
39
+ &__wrapper {
40
+ width: 100%;
41
+ }
42
+ &__content {
43
+ &--default {
44
+ max-width: $max-width;
45
+ margin: 30px auto 0 auto;
46
+ padding: 60px 30px 30px 30px;
47
+
48
+ @include md {
49
+ padding: 60px 0px 30px 0px;
50
+ }
51
+ }
52
+
53
+ &--article {
54
+ max-width: 658px;
55
+ margin: 30px auto 0px auto;
56
+ padding-top: 60px;
57
+
58
+ @media screen and (max-width: 942px) {
59
+ margin: 30px 30px 0 30px;
60
+ }
61
+ }
62
+
63
+ &--submenu {
64
+ padding: 132px 30px 30px 30px;
65
+
66
+ @include md {
67
+ padding: 132px 0px 30px 0px;
68
+ }
69
+ }
70
+
71
+ &--article-and-submenu {
72
+ max-width: 658px;
73
+ margin: 30px auto 0px auto;
74
+ padding-top: 132px;
75
+
76
+ @media screen and (max-width: 942px) {
77
+ margin: 30px 30px 0 30px;
78
+ }
79
+ }
80
+ }
81
+ &__h1 {
82
+ font-size: 44px;
83
+ line-height: 52px;
84
+ font-family: $font-oscine;
85
+ font-weight: 300;
86
+
87
+ @include sm {
88
+ font-size: $font-size-xlg;
89
+ line-height: $line-height-xlg;
90
+ }
91
+ }
92
+ }
93
+ </style>