@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,201 @@
1
+ <template>
2
+ <div
3
+ class="column-grid"
4
+ :class="
5
+ bgColor === 'dark'
6
+ ? 'column-grid--dark'
7
+ : bgColor === 'light'
8
+ ? 'column-grid--light'
9
+ : 'column-grid--white'
10
+ "
11
+ >
12
+ <div class="column-grid__top-section">
13
+ <h2 v-if="headline" class="column-grid__headline">{{ headline }}</h2>
14
+ <div v-if="bodytext" class="column-grid__bodytext">
15
+ <slot name="column-grid-body"></slot>
16
+ <atom-link
17
+ v-if="linkType === 'link'"
18
+ :link-type="
19
+ bgColor === 'dark'
20
+ ? 'regular_dark'
21
+ : bgColor === 'light'
22
+ ? 'regular_light'
23
+ : 'regular_light'
24
+ "
25
+ arrow
26
+ ><slot name="column-grid-body-link"></slot
27
+ ></atom-link>
28
+ </div>
29
+ </div>
30
+ <div class="column-grid__teaser-list">
31
+ <MoleculeColumnCard
32
+ v-for="card in columns"
33
+ :key="card._uid"
34
+ :headline="card.headline"
35
+ :bodytext="card.bodytext"
36
+ :link="card.link"
37
+ :link-text="card.linkText"
38
+ :image="card.image"
39
+ :image-fit="card.imageFit"
40
+ ><template #column-card-body>
41
+ <slot name="column-card-body" v-bind="{ body: card.bodytext }"></slot>
42
+ </template>
43
+ <template #column-link>
44
+ <slot
45
+ name="column-link"
46
+ v-bind="{
47
+ link: card.link,
48
+ linkText: card.linkText,
49
+ }"
50
+ ></slot>
51
+ </template>
52
+ <template #column-card-image>
53
+ <slot
54
+ v-if="card.image"
55
+ name="column-card-image"
56
+ v-bind="{
57
+ src: card.image.filename,
58
+ alt: card.image.alt,
59
+ style: { 'object-fit': card.imageFit ? 'cover' : 'contain' },
60
+ }"
61
+ ></slot
62
+ ></template>
63
+ </MoleculeColumnCard>
64
+ </div>
65
+ </div>
66
+ </template>
67
+
68
+ <script setup lang="ts">
69
+ import MoleculeColumnCard from "../../molecules/column-card/column-card.vue";
70
+ import AtomLink from "../../atoms/link/link.vue";
71
+
72
+ export type Props = {
73
+ headline?: string;
74
+ bgColor: string;
75
+ bodytext?: string;
76
+ linkText?: string;
77
+ linkType?: string;
78
+ columns: Array<{
79
+ headline: string;
80
+ bodytext: string;
81
+ link: string;
82
+ linkText: string;
83
+ image: {
84
+ filename: string;
85
+ alt: string;
86
+ };
87
+ imageFit: boolean;
88
+ _uid: string;
89
+ }>;
90
+ };
91
+
92
+ withDefaults(defineProps<Props>(), {
93
+ headline: "",
94
+ bodytext: "",
95
+ linkText: "",
96
+ linkType: "link",
97
+ });
98
+ </script>
99
+
100
+ <style scoped lang="scss">
101
+ @use "../../../assets/scss/variables.scss" as *;
102
+
103
+ .column-grid {
104
+ margin-bottom: 30px;
105
+ padding: 0px 30px 30px 30px;
106
+
107
+ @include md {
108
+ padding: 0 0 60px 0;
109
+ }
110
+
111
+ &--light {
112
+ background-color: $blue-000;
113
+ color: $blue-900;
114
+ :deep(.grid-card__bodytext > p) {
115
+ color: $blue-900;
116
+ }
117
+ }
118
+
119
+ &--white {
120
+ background-color: transparent;
121
+ color: $blue-900;
122
+ :deep(.grid-card__bodytext > p) {
123
+ color: $blue-900;
124
+ }
125
+ }
126
+
127
+ &--dark {
128
+ background-color: $blue-900;
129
+ .column-grid__headline,
130
+ .column-grid__bodytext :deep(p) {
131
+ color: $white;
132
+ }
133
+
134
+ :deep(.column-card__headline, .grid-card__bodytext) {
135
+ color: $white;
136
+ }
137
+
138
+ :deep(.column-card__bodytext p) {
139
+ color: $white;
140
+ }
141
+
142
+ :deep(.column-card__bodytext li::before) {
143
+ color: $white;
144
+ }
145
+
146
+ :deep(.column-card__bodytext ol) {
147
+ color: $white;
148
+ }
149
+ }
150
+
151
+ &__headline {
152
+ padding-bottom: 30px;
153
+ font-family: $font-oscine;
154
+ }
155
+ &__top-section {
156
+ display: grid;
157
+ margin: 0 auto;
158
+ padding-left: 0px;
159
+ max-width: $screen-lg-min;
160
+ padding-top: 60px;
161
+ }
162
+ &__bodytext {
163
+ font-size: 16px;
164
+ font-weight: 300;
165
+ max-width: 658px;
166
+ font-family: $font-opensans;
167
+ margin-bottom: 60px;
168
+
169
+ :deep(p) {
170
+ padding-bottom: 1rem;
171
+
172
+ a {
173
+ color: $blue-600;
174
+ text-decoration: 0.3px underline;
175
+ font-weight: 500;
176
+
177
+ &:hover {
178
+ color: $blue-800;
179
+ transition: $transition-color;
180
+ }
181
+ }
182
+ }
183
+
184
+ :deep(b),
185
+ :deep(strong) {
186
+ font-weight: 600;
187
+ }
188
+ }
189
+ &__teaser-list {
190
+ display: grid;
191
+ grid-gap: 30px;
192
+ margin: 0 auto;
193
+ max-width: $screen-lg-min;
194
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
195
+ }
196
+ }
197
+
198
+ .no-bodytext {
199
+ padding-bottom: 0px;
200
+ }
201
+ </style>
@@ -0,0 +1,156 @@
1
+ <template>
2
+ <div class="facts__wrapper">
3
+ <div class="facts__content">
4
+ <h2 class="facts__headline">{{ headline }}</h2>
5
+ <div class="facts">
6
+ <div v-for="fact in facts" :key="fact.value + fact.metric" class="fact">
7
+ <div class="fact__value">
8
+ <span>{{ fact.value }}</span>
9
+ </div>
10
+ <div class="fact__metric">
11
+ <span>{{ fact.metric }}</span>
12
+ </div>
13
+ </div>
14
+ </div>
15
+ <div v-if="link" class="facts__link">
16
+ <atom-link link-type="regular_light" arrow>
17
+ <slot name="facts-link"></slot>
18
+ </atom-link>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import AtomLink from "../../atoms/link/link.vue";
26
+
27
+ interface Fact {
28
+ value: string;
29
+ metric: string;
30
+ }
31
+
32
+ interface Link {
33
+ title: string;
34
+ url: string;
35
+ }
36
+
37
+ export type Props = {
38
+ headline: string;
39
+ facts: Fact[];
40
+ link: Link;
41
+ };
42
+
43
+ withDefaults(defineProps<Props>(), {
44
+ headline: "",
45
+ facts: () => [
46
+ {
47
+ value: "",
48
+ metric: "",
49
+ },
50
+ {
51
+ value: "",
52
+ metric: "",
53
+ },
54
+ {
55
+ value: "",
56
+ metric: "",
57
+ },
58
+ ],
59
+ link: () => ({
60
+ title: "",
61
+ url: "",
62
+ }),
63
+ });
64
+ </script>
65
+
66
+ <style scoped lang="scss">
67
+ @use "../../../assets/scss/variables.scss" as *;
68
+ .facts {
69
+ display: flex;
70
+ flex-direction: row;
71
+ justify-content: space-between;
72
+ align-items: center;
73
+ flex-wrap: wrap;
74
+
75
+ &__wrapper {
76
+ width: 100%;
77
+ }
78
+ &__content {
79
+ max-width: $max-width;
80
+ margin: 0 auto;
81
+ padding: $padding-mobile;
82
+
83
+ @include md {
84
+ padding: $padding-desktop;
85
+ }
86
+ }
87
+
88
+ &__headline {
89
+ font-weight: 300;
90
+ margin-bottom: 30px;
91
+ }
92
+
93
+ &__link {
94
+ text-align: center;
95
+ margin-top: 30px;
96
+ }
97
+ }
98
+
99
+ .fact {
100
+ display: flex;
101
+ flex-direction: column;
102
+ text-align: center;
103
+ font-family: $font-oscine;
104
+ font-weight: 300;
105
+ flex: 1;
106
+ padding: 7px;
107
+ white-space: nowrap;
108
+
109
+ @include sm {
110
+ padding: 15px;
111
+ }
112
+
113
+ &:not(:last-child) {
114
+ @include md {
115
+ border-bottom: 0;
116
+ }
117
+ @include sm {
118
+ border-bottom: 0;
119
+ border-right: 0.5px solid $grey-100;
120
+ align-self: stretch;
121
+ }
122
+ }
123
+
124
+ &__value {
125
+ font-size: $font-size-md;
126
+ line-height: $line-height-md;
127
+ font-weight: 400;
128
+
129
+ @include sm {
130
+ font-weight: 300;
131
+ font-size: $font-size-lg;
132
+ line-height: $line-height-lg;
133
+ }
134
+
135
+ @include md {
136
+ font-size: $font-size-xlg;
137
+ line-height: $line-height-xlg;
138
+ }
139
+ }
140
+
141
+ &__metric {
142
+ font-size: $font-size-sm;
143
+ line-height: $line-height-sm;
144
+
145
+ @include sm {
146
+ font-size: $font-size-md;
147
+ line-height: $line-height-md;
148
+ }
149
+
150
+ @include md {
151
+ font-size: $font-size-lg;
152
+ line-height: $line-height-lg;
153
+ }
154
+ }
155
+ }
156
+ </style>
@@ -0,0 +1,176 @@
1
+ <template>
2
+ <div class="features__wrapper">
3
+ <div class="features__content">
4
+ <div v-if="headline" class="features__headline">
5
+ <h2>{{ headline }}</h2>
6
+ </div>
7
+ <div v-if="hasBody" class="features__body">
8
+ <slot name="features-body"></slot>
9
+ </div>
10
+ <div
11
+ class="features__elements"
12
+ :class="[elements.length === 6 ? 'features__elements--grid-6' : '']"
13
+ >
14
+ <div
15
+ v-for="element in elements"
16
+ :key="element.headline"
17
+ class="features__element"
18
+ >
19
+ <atom-image class="element__icon"
20
+ ><slot
21
+ name="features-icon"
22
+ v-bind="{
23
+ src: element.icon.src,
24
+ height: 30,
25
+ width: 30,
26
+ alt: element.icon.alt,
27
+ }"
28
+ ></slot
29
+ ></atom-image>
30
+ <p class="element__headline">{{ element.headline }}</p>
31
+ <p class="element__body">{{ element.body }}</p>
32
+ <atom-link
33
+ v-if="element.link && element.linkText"
34
+ link-type="regular_light"
35
+ arrow
36
+ ><slot
37
+ name="feature-link"
38
+ v-bind="{ link: element.link, linkText: element.linkText }"
39
+ ></slot
40
+ ></atom-link>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </template>
46
+
47
+ <script setup lang="ts">
48
+ import AtomImage from "../../atoms/image/image.vue";
49
+ import AtomLink from "../../atoms/link/link.vue";
50
+
51
+ interface Element {
52
+ icon: Icon;
53
+ headline: string;
54
+ body: string;
55
+ link?: string;
56
+ linkText?: string;
57
+ }
58
+
59
+ interface Icon {
60
+ src: string;
61
+ alt: string;
62
+ }
63
+
64
+ export type Props = {
65
+ headline: string;
66
+ hasBody: boolean;
67
+ elements: Element[];
68
+ };
69
+
70
+ withDefaults(defineProps<Props>(), {
71
+ headline: "",
72
+ body: false,
73
+ elements: () => [],
74
+ });
75
+ </script>
76
+
77
+ <style scoped lang="scss">
78
+ @use "../../../assets/scss/variables.scss" as *;
79
+ .features {
80
+ &__content {
81
+ max-width: $max-width;
82
+ margin: 0 auto;
83
+ display: flex;
84
+ flex-direction: column;
85
+ padding: $padding-mobile;
86
+
87
+ @include md {
88
+ padding: $padding-desktop;
89
+ }
90
+ }
91
+
92
+ &__wrapper {
93
+ width: 100%;
94
+ background-color: $blue-100;
95
+ margin: $extra-margin-mobile-bg;
96
+ @include md {
97
+ margin: $extra-margin-desktop-bg;
98
+ }
99
+ }
100
+
101
+ &__headline {
102
+ margin-bottom: 30px;
103
+ font-weight: 300;
104
+ }
105
+
106
+ &__body {
107
+ margin-bottom: 60px;
108
+ max-width: 579px;
109
+
110
+ :deep(p) {
111
+ padding-bottom: 1rem;
112
+
113
+ a {
114
+ color: $blue-600;
115
+ text-decoration: 0.3px underline;
116
+ font-weight: 500;
117
+
118
+ &:hover {
119
+ color: $blue-800;
120
+ transition: $transition-color;
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ &__elements {
127
+ display: grid;
128
+ grid-template-columns: repeat(auto-fit, minmax(164px, 1fr));
129
+ grid-gap: 30px;
130
+
131
+ &--grid-6 {
132
+ grid-template-columns: repeat(auto-fit, minmax(164px, 1fr));
133
+
134
+ @include md {
135
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
136
+ }
137
+ }
138
+
139
+ .element {
140
+ &__icon {
141
+ margin-bottom: 5px;
142
+ height: 30px;
143
+ width: 30px;
144
+
145
+ @include md {
146
+ margin-bottom: 15px;
147
+ }
148
+ }
149
+
150
+ &__headline {
151
+ margin-bottom: 2px;
152
+ font-weight: 600;
153
+ font-size: $font-size-xsm;
154
+
155
+ @include md {
156
+ margin-bottom: 10px;
157
+ }
158
+ }
159
+
160
+ &__body {
161
+ font-size: $font-size-xsm;
162
+ }
163
+ }
164
+ }
165
+
166
+ &__element {
167
+ min-width: 164px;
168
+ max-width: 600px;
169
+ word-wrap: break-word;
170
+
171
+ :deep(.link__wrapper) {
172
+ margin-top: 15px;
173
+ }
174
+ }
175
+ }
176
+ </style>