@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,123 @@
1
+ <template>
2
+ <div class="address__wrapper">
3
+ <div class="address__content">
4
+ <div class="address__flag">
5
+ <slot name="address-flag" />
6
+ </div>
7
+ <div class="address__address">
8
+ <p class="address__name">
9
+ {{ name }}
10
+ </p>
11
+ <p>{{ company }}</p>
12
+ <p>{{ addressLine1 }}</p>
13
+ <p>{{ addressLine2 }}</p>
14
+ <p v-if="addressLine3">
15
+ {{ addressLine3 }}
16
+ </p>
17
+ </div>
18
+ <div class="address__contact">
19
+ <atom-link v-if="website" underline="false" link-type="regular">
20
+ <a :href="'https://' + website" class="address__website">{{
21
+ website
22
+ }}</a>
23
+ </atom-link>
24
+ <atom-link
25
+ v-for="number in phoneNumbers"
26
+ :key="number"
27
+ underline="false"
28
+ link-type="regular"
29
+ >
30
+ <a :href="'tel:' + number" class="address__phone">{{ number }}</a>
31
+ </atom-link>
32
+ <a :href="'mailto:' + email" class="address__email">{{ email }}</a>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </template>
37
+
38
+ <script setup lang="ts">
39
+ import AtomLink from "../../atoms/link/link.vue";
40
+
41
+ export type Props = {
42
+ name: string;
43
+ company: string;
44
+ addressLine1: string;
45
+ addressLine2: string;
46
+ addressLine3?: string;
47
+ website?: string;
48
+ phoneNumbers: string[];
49
+ email: string;
50
+ };
51
+
52
+ withDefaults(defineProps<Props>(), {
53
+ addressLine3: undefined,
54
+ website: undefined,
55
+ });
56
+ </script>
57
+
58
+ <style scoped lang="scss">
59
+ @use "../../../assets/scss/variables.scss" as *;
60
+ .address {
61
+ &__wrapper {
62
+ max-width: 332px;
63
+ width: 100%;
64
+ }
65
+
66
+ &__content {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: 15px;
70
+
71
+ p {
72
+ font-size: $font-size-xsm;
73
+ }
74
+ }
75
+
76
+ &__flag {
77
+ :deep(img) {
78
+ width: 30px;
79
+ height: 22px;
80
+ box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.15);
81
+ }
82
+ }
83
+
84
+ &__name {
85
+ color: $grey-600;
86
+ }
87
+
88
+ &__contact {
89
+ display: flex;
90
+ flex-direction: column;
91
+ line-height: $line-height-xsm;
92
+ font-size: $font-size-xsm;
93
+ }
94
+
95
+ &__website {
96
+ color: $blue-600;
97
+ }
98
+
99
+ &__phone {
100
+ color: $blue-600;
101
+ position: relative;
102
+ display: inline-block;
103
+ padding: 0;
104
+ margin: -2px;
105
+ padding: 2px;
106
+ background-color: transparent;
107
+ pointer-events: auto;
108
+ margin-bottom: 5px;
109
+ }
110
+
111
+ &__email {
112
+ color: $blue-600;
113
+ position: relative;
114
+ display: inline-block;
115
+ padding: 0;
116
+ margin: -2px;
117
+ padding: 2px;
118
+ background-color: transparent;
119
+ pointer-events: auto;
120
+ margin-top: 5px;
121
+ }
122
+ }
123
+ </style>
@@ -0,0 +1,99 @@
1
+ <template>
2
+ <div class="bullet-list__wrapper">
3
+ <div :class="['bullet-list', variant]">
4
+ <ul>
5
+ <li v-for="item in list" :key="item">
6
+ <i class="checkmark"></i>
7
+ {{ item }}
8
+ </li>
9
+ </ul>
10
+ </div>
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ defineProps({
16
+ list: {
17
+ type: Array<string>,
18
+ required: true,
19
+ validator(value: Array<string>) {
20
+ return value.length <= 5;
21
+ },
22
+ },
23
+ variant: {
24
+ type: String,
25
+ required: false,
26
+ default: "light",
27
+ validator(value: string) {
28
+ return ["light"].includes(value);
29
+ },
30
+ },
31
+ });
32
+ </script>
33
+
34
+ <style scoped lang="scss">
35
+ @use "../../../assets/scss/variables.scss" as *;
36
+ .bullet-list {
37
+ width: 100%;
38
+ position: relative;
39
+ clip-path: polygon(
40
+ 0 0,
41
+ 100% 0,
42
+ 100% calc(100% - 43px),
43
+ calc(100% - 43px) 100%,
44
+ 0 100%
45
+ );
46
+
47
+ @media screen and (min-width: 942px) {
48
+ width: 328px;
49
+ }
50
+
51
+ &.light {
52
+ background-color: $blue-200;
53
+ color: $blue-900;
54
+ }
55
+
56
+ // Dark variant
57
+ /* &.dark {
58
+ background-color: $blue-900;
59
+ color: $blue-200;
60
+
61
+ ul li::before {
62
+ filter: brightness(100);
63
+ }
64
+ } */
65
+
66
+ ul {
67
+ padding: 30px 30px 50px 30px;
68
+ font-family: $font-opensans;
69
+ font-size: $font-size-xsm;
70
+ font-weight: 600;
71
+ gap: 30px;
72
+ display: flex;
73
+ flex-flow: column wrap;
74
+
75
+ li {
76
+ position: relative;
77
+ padding-left: 19px;
78
+ min-height: 21px;
79
+ display: flex;
80
+ align-items: center;
81
+ line-height: 20px;
82
+
83
+ &::before {
84
+ content: "";
85
+ display: inline-block;
86
+ position: absolute;
87
+ left: 0;
88
+ top: 4px;
89
+ width: 11px;
90
+ height: 13px;
91
+ background-image: url("https://a.storyblok.com/f/230581/11x13/a8e35b7bda/checkmark.svg?cv=1695125825950");
92
+ background-repeat: no-repeat;
93
+ background-size: contain;
94
+ background-position: center;
95
+ }
96
+ }
97
+ }
98
+ }
99
+ </style>
@@ -0,0 +1,302 @@
1
+ <template>
2
+ <div class="card__wrapper">
3
+ <div
4
+ class="card"
5
+ :class="[
6
+ theme === 'dark' ? 'card--dark' : 'card--light',
7
+ orientation === 'vertical' ? 'vertical' : 'horizontal',
8
+ selectedSize.class,
9
+ cardClass,
10
+ variant === 'product' ? 'card--product' : 'card--article',
11
+ ]"
12
+ :style="[variant === 'product' ? 'font-weight: 700' : 'font-weight: 300']"
13
+ @mouseover="isPlaying = true"
14
+ @mouseout="isPlaying = false"
15
+ @focus="isPlaying = true"
16
+ @blur="isPlaying = false"
17
+ >
18
+ <atom-image v-if="mediaType === 'image'"
19
+ ><slot
20
+ name="card-image"
21
+ v-bind="{
22
+ src: imgSrc,
23
+ width: '596',
24
+ height: '335',
25
+ alt: alt,
26
+ loading: 'auto',
27
+ sizes: '(min-width: 581px) 582px, 100vw',
28
+ }"
29
+ :srcset="srcSet"
30
+ ></slot
31
+ ></atom-image>
32
+
33
+ <div
34
+ v-else
35
+ class="video-card__wrapper"
36
+ :class="isPlaying === true ? 'vimeoPlaying' : ''"
37
+ >
38
+ <AtomVideo
39
+ :play="isPlaying"
40
+ :local-video="true"
41
+ :src="videoSrc"
42
+ :aria-label="arialabel"
43
+ :controls="false"
44
+ :poster="imgSrc"
45
+ :width="selectedSize.width"
46
+ :height="selectedSize.height"
47
+ :autoplay="true"
48
+ :loop="true"
49
+ :muted="true"
50
+ />
51
+ </div>
52
+ <div v-if="slots['card-label']">
53
+ <slot name="card-label"></slot>
54
+ </div>
55
+ <div
56
+ v-if="variant === 'product'"
57
+ :class="[
58
+ 'card__headline',
59
+ theme === 'dark' ? 'regular-dark' : 'regular-blue',
60
+ ]"
61
+ style="font-weight: 700"
62
+ >
63
+ {{ headline }}
64
+ </div>
65
+ <div
66
+ v-else
67
+ :class="[
68
+ 'card__headline',
69
+ theme === 'dark' ? 'regular-dark' : 'regular-dark-blue',
70
+ ]"
71
+ >
72
+ {{ headline }}
73
+ </div>
74
+ <p v-if="variant === 'product'">
75
+ {{ paragraph }}
76
+ </p>
77
+ </div>
78
+ </div>
79
+ </template>
80
+
81
+ <script setup lang="ts">
82
+ // TO DO: Gather classes for card sizes in a computed property to avoid repetition as seen from line 5 to 29
83
+
84
+ import { ref, useSlots, computed } from "vue";
85
+ import AtomImage from "../../atoms/image/image.vue";
86
+ import AtomVideo from "../../atoms/video/video.vue";
87
+
88
+ const slots = useSlots();
89
+
90
+ let isPlaying = ref(false);
91
+
92
+ const SIZES = {
93
+ xsmall: {
94
+ class: "card--xsmall",
95
+ width: "241",
96
+ height: "135",
97
+ },
98
+ small: {
99
+ class: "card--small",
100
+ width: "298",
101
+ height: "186",
102
+ },
103
+ medium: {
104
+ class: "card--medium",
105
+ width: "432",
106
+ height: "243",
107
+ },
108
+ large: {
109
+ class: "card--large",
110
+ width: "596",
111
+ height: "335",
112
+ },
113
+ };
114
+
115
+ type Size = keyof typeof SIZES;
116
+
117
+ export type Props = {
118
+ variant?: "product" | "article";
119
+ theme?: "light" | "dark";
120
+ linkType?: "link" | "button";
121
+ headline?: string;
122
+ paragraph?: string;
123
+ size?: Size;
124
+ mediaType?: "image" | "video";
125
+ orientation?: "horizontal" | "vertical";
126
+ srcSet?: string;
127
+ url?: string;
128
+ imgSrc?: string;
129
+ videoSrc?: string;
130
+ arialabel?: string;
131
+ poster?: string;
132
+ labelText?: string;
133
+ alt?: string;
134
+ };
135
+
136
+ const props = withDefaults(defineProps<Props>(), {
137
+ variant: "product",
138
+ theme: "light",
139
+ linkType: "link",
140
+ headline: "",
141
+ paragraph: "",
142
+ size: "small",
143
+ mediaType: "image",
144
+ orientation: "horizontal",
145
+ srcSet: "",
146
+ url: "",
147
+ imgSrc: "",
148
+ videoSrc: "",
149
+ arialabel: "",
150
+ poster: "",
151
+ labelText: "",
152
+ alt: "",
153
+ });
154
+
155
+ const selectedSize = computed(() => SIZES[props.size]);
156
+ const cardClass = computed(() => {
157
+ if (props.variant === "article" || props.variant === "product") {
158
+ return `card--${props.size}-${props.variant}`;
159
+ }
160
+ return `card--${props.variant}`;
161
+ });
162
+
163
+ defineEmits(["clicked"]);
164
+ </script>
165
+
166
+ <style scoped lang="scss">
167
+ @use "../../../assets/scss/variables.scss" as *;
168
+ .card {
169
+ border-radius: $border-radius;
170
+ transition: $transition-box-shadow;
171
+ height: 100%;
172
+ display: grid;
173
+
174
+ @include sm {
175
+ padding: 15px;
176
+ &:hover,
177
+ &:focus,
178
+ &:active,
179
+ &:target {
180
+ box-shadow: $box-shadow;
181
+ outline: none;
182
+ transition: transform 0.3s ease-in-out;
183
+ }
184
+ }
185
+
186
+ p {
187
+ margin-top: 5px;
188
+ }
189
+
190
+ &__headline {
191
+ font-family: $font-oscine;
192
+ font-weight: 300;
193
+ }
194
+ &--light {
195
+ background: none;
196
+ p {
197
+ color: $blue-900;
198
+ }
199
+ }
200
+
201
+ &--dark {
202
+ background: none;
203
+ p {
204
+ color: $white;
205
+ }
206
+ }
207
+
208
+ &--xsmall {
209
+ min-width: 241px;
210
+ width: 100%;
211
+ @include sm {
212
+ width: 241px;
213
+ }
214
+ }
215
+
216
+ &--small {
217
+ min-width: 270px;
218
+ width: 100%;
219
+ @include sm {
220
+ width: 328px;
221
+ }
222
+ }
223
+
224
+ &--medium {
225
+ min-width: 328px;
226
+ max-width: 492px;
227
+ width: 100%;
228
+ }
229
+
230
+ &--large {
231
+ min-width: 328px;
232
+ max-width: 656px;
233
+ width: 100%;
234
+ }
235
+
236
+ &--small-article {
237
+ .card__headline {
238
+ margin: 15px 0px;
239
+ font-size: $font-size-md;
240
+ line-height: $line-height-md;
241
+ }
242
+
243
+ button {
244
+ cursor: pointer;
245
+ }
246
+ }
247
+
248
+ &--xsmall-article {
249
+ .card__headline {
250
+ margin: 15px 0px;
251
+ font-size: $font-size-sm;
252
+ line-height: $line-height-sm;
253
+ }
254
+
255
+ button {
256
+ cursor: pointer;
257
+ }
258
+ }
259
+ &--product .card__headline {
260
+ font-size: $font-size-md;
261
+ line-height: $line-height-md;
262
+ }
263
+
264
+ &--large-article .card__headline {
265
+ font-size: $font-size-lg;
266
+ line-height: $line-height-lg;
267
+ }
268
+
269
+ :slotted(.card__label) {
270
+ display: flex;
271
+ gap: 15px;
272
+ flex-wrap: wrap;
273
+ margin-top: 15px;
274
+ }
275
+ }
276
+ :slotted(img) {
277
+ object-fit: cover;
278
+ width: 100%;
279
+ }
280
+ .vertical {
281
+ :slotted(img) {
282
+ aspect-ratio: 9 / 16;
283
+ }
284
+ }
285
+ .horizontal {
286
+ :slotted(img) {
287
+ aspect-ratio: 16 / 9;
288
+ }
289
+ }
290
+ span {
291
+ margin: 15px 0px 10px 0px;
292
+ }
293
+ .regular-blue {
294
+ color: $blue-800;
295
+ }
296
+ .regular-dark {
297
+ color: $white;
298
+ }
299
+ .regular-dark-blue {
300
+ color: $blue-900;
301
+ }
302
+ </style>
@@ -0,0 +1,178 @@
1
+ <template>
2
+ <div :class="['column-card', selectedBgColor]">
3
+ <div class="column-card__content">
4
+ <div
5
+ v-if="image.filename"
6
+ :class="['column-card__image', { cover: imageFit, contain: !imageFit }]"
7
+ >
8
+ <slot
9
+ name="column-card-image"
10
+ v-bind="{
11
+ src: image.filename,
12
+ alt: image.alt,
13
+ }"
14
+ ></slot>
15
+ </div>
16
+ <h3 class="column-card__headline">
17
+ {{ headline }}
18
+ </h3>
19
+ <div class="column-card__bodytext">
20
+ <slot name="column-card-body"></slot>
21
+ </div>
22
+ <atom-link
23
+ v-if="linkType === 'link'"
24
+ :link-type="
25
+ bgColor === 'dark'
26
+ ? 'regular_dark'
27
+ : bgColor === 'light'
28
+ ? 'regular_light'
29
+ : 'regular_light'
30
+ "
31
+ arrow
32
+ ><slot name="column-link"></slot
33
+ ></atom-link>
34
+ </div>
35
+ </div>
36
+ </template>
37
+
38
+ <script setup lang="ts">
39
+ import { computed } from "vue";
40
+ import AtomLink from "../../atoms/link/link.vue";
41
+
42
+ const BGCOLORS = {
43
+ white: "",
44
+ light: "column__wrapper--light",
45
+ dark: "column__wrapper--dark mirsaic--dark",
46
+ } as const;
47
+
48
+ type bgColor = "white" | "light" | "dark";
49
+
50
+ export type Props = {
51
+ headline: string;
52
+ bodytext: string;
53
+ image: {
54
+ filename: string;
55
+ alt: string;
56
+ };
57
+ imageFit: boolean;
58
+ bgColor?: bgColor;
59
+ linkText?: string;
60
+ linkType?: string;
61
+ };
62
+
63
+ const props = withDefaults(defineProps<Props>(), {
64
+ bgColor: "white",
65
+ linkText: "",
66
+ linkType: "link",
67
+ });
68
+
69
+ const selectedBgColor = computed(
70
+ () => BGCOLORS[(props.bgColor as keyof typeof BGCOLORS) || "white"],
71
+ );
72
+ </script>
73
+
74
+ <style scoped lang="scss">
75
+ @use "../../../assets/scss/variables.scss" as *;
76
+
77
+ .column-card {
78
+ max-width: 500px;
79
+ min-width: 235px;
80
+ display: flex;
81
+ flex-direction: column;
82
+ padding: 0;
83
+
84
+ &__image {
85
+ :deep(img) {
86
+ width: 100%;
87
+
88
+ max-width: 500px;
89
+ padding-bottom: 15px;
90
+ }
91
+ &.cover {
92
+ :deep(img) {
93
+ object-fit: cover;
94
+ min-height: 235px;
95
+ aspect-ratio: 1/1;
96
+ }
97
+ }
98
+ &.contain {
99
+ :deep(img) {
100
+ object-fit: contain;
101
+ }
102
+ }
103
+ }
104
+
105
+ &__headline {
106
+ margin-top: 0;
107
+ margin-bottom: 15px;
108
+ font-family: $font-opensans;
109
+ }
110
+ &__bodytext {
111
+ font-size: $font-size-sm;
112
+ line-height: $line-height-sm;
113
+ font-family: $font-opensans;
114
+ color: $blue-900;
115
+ font-weight: 300;
116
+ margin-top: 0;
117
+
118
+ :deep(b) {
119
+ font-weight: 700;
120
+ }
121
+
122
+ :deep(p) {
123
+ padding-bottom: 1rem;
124
+
125
+ a {
126
+ color: $blue-600;
127
+ text-decoration: 0.3px underline;
128
+ font-weight: 500;
129
+
130
+ &:hover {
131
+ color: $blue-800;
132
+ transition: $transition-color;
133
+ }
134
+ }
135
+ }
136
+
137
+ :deep(ol) {
138
+ padding-left: 1rem;
139
+ list-style-type: decimal;
140
+ font-family: $font-opensans;
141
+ font-weight: 300;
142
+
143
+ li {
144
+ margin: 5px 0;
145
+ p {
146
+ padding-bottom: 0px;
147
+ }
148
+ }
149
+ }
150
+
151
+ :deep(ul) {
152
+ list-style-type: none;
153
+ font-family: $font-opensans;
154
+ font-weight: 300;
155
+ padding-left: 1rem;
156
+
157
+ li {
158
+ margin: 5px 0;
159
+ list-style: none;
160
+ position: relative;
161
+ left: 0;
162
+
163
+ p {
164
+ padding-bottom: 0px;
165
+ }
166
+ }
167
+
168
+ li::before {
169
+ content: "\2022";
170
+ position: absolute;
171
+ left: -0.8em;
172
+ font-size: 1.1em;
173
+ color: $blue-900;
174
+ }
175
+ }
176
+ }
177
+ }
178
+ </style>