@cooperco/cooper-component-library 0.0.10

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 (139) hide show
  1. package/README.md +11 -0
  2. package/package.json +85 -0
  3. package/src/assets/main.css +155 -0
  4. package/src/assets/theme.css +67 -0
  5. package/src/assets/usercard.jpg +0 -0
  6. package/src/assets/vue.svg +1 -0
  7. package/src/components/Accordion.vue +33 -0
  8. package/src/components/AccordionItem.vue +53 -0
  9. package/src/components/CTA.vue +39 -0
  10. package/src/components/CarouselModule.vue +46 -0
  11. package/src/components/ContainerCollectionModule.vue +33 -0
  12. package/src/components/ContainerModule.vue +116 -0
  13. package/src/components/ContentAndImage.vue +34 -0
  14. package/src/components/ContentMediaModule.vue +50 -0
  15. package/src/components/ContentModule.vue +51 -0
  16. package/src/components/FooterNavigation.vue +57 -0
  17. package/src/components/IconChevron.vue +107 -0
  18. package/src/components/Image.vue +15 -0
  19. package/src/components/LogoCollectionModule.vue +30 -0
  20. package/src/components/LogoContainerModule.vue +30 -0
  21. package/src/components/NavigationElement.vue +92 -0
  22. package/src/components/PrimaryNavigation.vue +68 -0
  23. package/src/components/SplitModule.vue +42 -0
  24. package/src/components/Testimonial.vue +48 -0
  25. package/src/components/TestimonialModule.vue +48 -0
  26. package/src/components/TileCollection.vue +37 -0
  27. package/src/components/TileCollectionModule.vue +45 -0
  28. package/src/components/TileContent.vue +105 -0
  29. package/src/components/Video.vue +18 -0
  30. package/src/components/types/Accordion.ts +18 -0
  31. package/src/components/types/AccordionItem.ts +19 -0
  32. package/src/components/types/CTA.ts +13 -0
  33. package/src/components/types/CarouselModule.ts +21 -0
  34. package/src/components/types/ContainerCollectionModule.ts +12 -0
  35. package/src/components/types/ContainerModule.ts +35 -0
  36. package/src/components/types/ContentAndImage.ts +14 -0
  37. package/src/components/types/ContentMediaModule.ts +14 -0
  38. package/src/components/types/ContentModule.ts +21 -0
  39. package/src/components/types/FooterNavigation.ts +12 -0
  40. package/src/components/types/Image.ts +12 -0
  41. package/src/components/types/LogoCollectionModule.ts +12 -0
  42. package/src/components/types/LogoContainerModule.ts +12 -0
  43. package/src/components/types/NavigationElement.ts +19 -0
  44. package/src/components/types/PrimaryNavigation.ts +10 -0
  45. package/src/components/types/SplitModule.ts +16 -0
  46. package/src/components/types/Testimonial.ts +17 -0
  47. package/src/components/types/TileCollection.ts +14 -0
  48. package/src/components/types/TileContent.ts +34 -0
  49. package/src/components/types/Video.ts +8 -0
  50. package/src/components/types/index.ts +10 -0
  51. package/src/presets/aura/accordion/index.js +81 -0
  52. package/src/presets/aura/autocomplete/index.js +280 -0
  53. package/src/presets/aura/avatar/index.js +46 -0
  54. package/src/presets/aura/badge/index.js +43 -0
  55. package/src/presets/aura/badgedirective/index.js +49 -0
  56. package/src/presets/aura/blockui/index.js +8 -0
  57. package/src/presets/aura/breadcrumb/index.js +63 -0
  58. package/src/presets/aura/button/index.js +511 -0
  59. package/src/presets/aura/calendar/index.js +702 -0
  60. package/src/presets/aura/card/index.js +53 -0
  61. package/src/presets/aura/carousel/index.js +160 -0
  62. package/src/presets/aura/cascadeselect/index.js +220 -0
  63. package/src/presets/aura/checkbox/index.js +107 -0
  64. package/src/presets/aura/chip/index.js +45 -0
  65. package/src/presets/aura/chips/index.js +126 -0
  66. package/src/presets/aura/colorpicker/index.js +132 -0
  67. package/src/presets/aura/confirmpopup/index.js +111 -0
  68. package/src/presets/aura/contextmenu/index.js +132 -0
  69. package/src/presets/aura/datatable/index.js +1290 -0
  70. package/src/presets/aura/dataview/index.js +40 -0
  71. package/src/presets/aura/deferred/index.js +3 -0
  72. package/src/presets/aura/dialog/index.js +250 -0
  73. package/src/presets/aura/divider/index.js +72 -0
  74. package/src/presets/aura/dock/index.js +97 -0
  75. package/src/presets/aura/dropdown/index.js +297 -0
  76. package/src/presets/aura/fieldset/index.js +95 -0
  77. package/src/presets/aura/fileupload/index.js +175 -0
  78. package/src/presets/aura/floatlabel/index.js +26 -0
  79. package/src/presets/aura/galleria/index.js +353 -0
  80. package/src/presets/aura/global.js +90 -0
  81. package/src/presets/aura/iconfield/index.js +22 -0
  82. package/src/presets/aura/image/index.js +206 -0
  83. package/src/presets/aura/index.js +181 -0
  84. package/src/presets/aura/inlinemessage/index.js +46 -0
  85. package/src/presets/aura/inplace/index.js +27 -0
  86. package/src/presets/aura/inputgroup/index.js +5 -0
  87. package/src/presets/aura/inputgroupaddon/index.js +28 -0
  88. package/src/presets/aura/inputmask/index.js +47 -0
  89. package/src/presets/aura/inputnumber/index.js +293 -0
  90. package/src/presets/aura/inputotp/index.js +69 -0
  91. package/src/presets/aura/inputswitch/index.js +94 -0
  92. package/src/presets/aura/inputtext/index.js +63 -0
  93. package/src/presets/aura/knob/index.js +47 -0
  94. package/src/presets/aura/listbox/index.js +158 -0
  95. package/src/presets/aura/megamenu/index.js +206 -0
  96. package/src/presets/aura/menu/index.js +122 -0
  97. package/src/presets/aura/menubar/index.js +184 -0
  98. package/src/presets/aura/message/index.js +112 -0
  99. package/src/presets/aura/metergroup/index.js +110 -0
  100. package/src/presets/aura/multiselect/index.js +579 -0
  101. package/src/presets/aura/orderlist/index.js +281 -0
  102. package/src/presets/aura/organizationchart/index.js +142 -0
  103. package/src/presets/aura/overlaypanel/index.js +34 -0
  104. package/src/presets/aura/paginator/index.js +566 -0
  105. package/src/presets/aura/panel/index.js +102 -0
  106. package/src/presets/aura/panelmenu/index.js +130 -0
  107. package/src/presets/aura/password/index.js +143 -0
  108. package/src/presets/aura/picklist/index.js +718 -0
  109. package/src/presets/aura/progressbar/index.js +64 -0
  110. package/src/presets/aura/progressspinner/index.js +51 -0
  111. package/src/presets/aura/radiobutton/index.js +121 -0
  112. package/src/presets/aura/rating/index.js +95 -0
  113. package/src/presets/aura/ripple/index.js +6 -0
  114. package/src/presets/aura/scrollpanel/index.js +77 -0
  115. package/src/presets/aura/scrolltop/index.js +45 -0
  116. package/src/presets/aura/selectbutton/index.js +66 -0
  117. package/src/presets/aura/sidebar/index.js +160 -0
  118. package/src/presets/aura/skeleton/index.js +19 -0
  119. package/src/presets/aura/slider/index.js +144 -0
  120. package/src/presets/aura/speeddial/index.js +579 -0
  121. package/src/presets/aura/splitbutton/index.js +1185 -0
  122. package/src/presets/aura/splitter/index.js +71 -0
  123. package/src/presets/aura/stepper/index.js +183 -0
  124. package/src/presets/aura/steps/index.js +117 -0
  125. package/src/presets/aura/tabmenu/index.js +75 -0
  126. package/src/presets/aura/tabview/index.js +162 -0
  127. package/src/presets/aura/tag/index.js +44 -0
  128. package/src/presets/aura/terminal/index.js +60 -0
  129. package/src/presets/aura/textarea/index.js +49 -0
  130. package/src/presets/aura/tieredmenu/index.js +125 -0
  131. package/src/presets/aura/timeline/index.js +114 -0
  132. package/src/presets/aura/toast/index.js +151 -0
  133. package/src/presets/aura/togglebutton/index.js +98 -0
  134. package/src/presets/aura/toolbar/index.js +28 -0
  135. package/src/presets/aura/tooltip/index.js +73 -0
  136. package/src/presets/aura/tree/index.js +294 -0
  137. package/src/presets/aura/treeselect/index.js +404 -0
  138. package/src/presets/aura/treetable/index.js +513 -0
  139. package/src/presets/aura/tristatecheckbox/index.js +121 -0
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import { ContentMediaModule } from './types/ContentMediaModule'
3
+ import { VariantOptions } from '../types'
4
+ import { computed } from 'vue'
5
+ import ContentModule from './ContentModule.vue'
6
+
7
+ const props = defineProps<ContentMediaModule>()
8
+
9
+ const variantValue = computed(() => {
10
+ return VariantOptions[props.variant]
11
+ })
12
+
13
+ const computedStyle = computed(() => {
14
+ return {
15
+ 'background-color': props.backgroundColor ?? 'transparent',
16
+ color: props.textColor ?? 'inherit',
17
+ }
18
+ })
19
+ </script>
20
+
21
+ <template>
22
+ <component
23
+ :is="isChild ? 'div' : 'section'"
24
+ :style="computedStyle"
25
+ class="content-media-module"
26
+ >
27
+ <div
28
+ class="content-media-container flex flex-row gap-5 relative"
29
+ :class="{ container: variantValue != VariantOptions.Hero }"
30
+ >
31
+ <img
32
+ v-if="media"
33
+ class="media"
34
+ :class="{ 'w-screen': variantValue == VariantOptions.Hero }"
35
+ :src="media.src"
36
+ :alt="media.altTag"
37
+ :height="media.height"
38
+ :width="media.width"
39
+ />
40
+
41
+ <ContentModule
42
+ class="content"
43
+ :class="{
44
+ absolute: variantValue == VariantOptions.Hero,
45
+ }"
46
+ :="content"
47
+ />
48
+ </div>
49
+ </component>
50
+ </template>
@@ -0,0 +1,51 @@
1
+ <script setup lang="ts">
2
+ import { ContentModule } from './types/ContentModule'
3
+ import CTA from './CTA.vue'
4
+ import { computed } from 'vue'
5
+
6
+ const props = defineProps<ContentModule>()
7
+
8
+ const computedStyle = computed(() => {
9
+ return {
10
+ 'background-color': props.backgroundColor ?? 'transparent',
11
+ color: props.textColor ?? 'inherit',
12
+ }
13
+ })
14
+ const computedClassname = computed(
15
+ () => `content-module p-5 ${props.class ?? ''}`
16
+ )
17
+ </script>
18
+
19
+ <template>
20
+ <div :class="computedClassname" :style="computedStyle">
21
+ <div :class="`content-module-container mx-auto ${pt?.container ?? ''}`">
22
+ <img
23
+ v-if="logo"
24
+ :src="logo.src"
25
+ :alt="logo.alt"
26
+ :class="`${pt?.logo ?? ''}`"
27
+ />
28
+ <h2
29
+ v-if="headline"
30
+ :class="`content-module-headline ${pt?.headline ?? ''}`"
31
+ >
32
+ {{ headline }}
33
+ </h2>
34
+ <h2
35
+ v-if="subHeadline"
36
+ :class="`content-module-subHeadline ${pt?.subHeadline ?? ''}`"
37
+ >
38
+ {{ subHeadline }}
39
+ </h2>
40
+ <p
41
+ v-if="description"
42
+ :class="`content-module-description ${pt?.description ?? ''}`"
43
+ >
44
+ {{ description }}
45
+ </p>
46
+ <div v-if="CTAs" :class="`content-module-ctas ${pt?.ctas ?? ''}`">
47
+ <CTA v-for="(item, index) in CTAs" v-bind="item" />
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </template>
@@ -0,0 +1,57 @@
1
+ <script setup lang="ts">
2
+ import { type FooterNavigation } from './types/FooterNavigation'
3
+ import NavigationElement from './NavigationElement.vue'
4
+ import { computed } from 'vue'
5
+
6
+ const props = defineProps<FooterNavigation>()
7
+
8
+ const computedStyle = computed(() => {
9
+ return {
10
+ 'background-color': props.backgroundColor ?? 'transparent',
11
+ color: props.textColor ?? 'inherit',
12
+ }
13
+ })
14
+ </script>
15
+ <template>
16
+ <footer class="w-full p-5" :style="computedStyle">
17
+ <div class="container flex flex-col mx-auto">
18
+ <div class="flex justify-between flex-col sm:flex-row p-5 gap-4">
19
+ <a href="/" class="footer-navigation-logo text-center">
20
+ <img
21
+ v-if="logo"
22
+ class="min-h-[95px] min-w-[100px] w-[100px] h-[95px]"
23
+ :="logo"
24
+ />
25
+ {{ title }}
26
+ </a>
27
+ <div
28
+ v-if="navigation"
29
+ class="footer-navigation px-2 pt-2 pb-4 sm:flex sm:p-0 sm:space-x-2 md:space-x-4 space-y-5 sm:space-y-0"
30
+ >
31
+ <NavigationElement
32
+ v-for="(item, index) in navigation"
33
+ :class="`footer-nav-item-${index}`"
34
+ role="menuitem"
35
+ tabindex="-1"
36
+ :="{ ...item, isChild: false, elementType: 'footer' }"
37
+ />
38
+ </div>
39
+ <div
40
+ v-if="socialMediaRef"
41
+ class="flex flex-wrap footer-social space-x-2"
42
+ >
43
+ <a
44
+ v-for="(item, index) in socialMediaRef"
45
+ :class="`footer-social-item-${index}`"
46
+ :href="item?.url?.link"
47
+ >
48
+ <img :="item.icon" />
49
+ </a>
50
+ </div>
51
+ </div>
52
+ <hr />
53
+ <!-- switch to rich text if we go forward with this -->
54
+ <div v-if="legalText" class="footer-legal py-5" v-html="legalText" />
55
+ </div>
56
+ </footer>
57
+ </template>
@@ -0,0 +1,107 @@
1
+ <script lang="ts" setup>
2
+ import { computed } from 'vue'
3
+ const props = defineProps({
4
+ bold: {
5
+ type: Boolean,
6
+ default: false,
7
+ },
8
+ orientation: {
9
+ type: String,
10
+ default: 'right',
11
+ },
12
+ })
13
+
14
+ const orientClass = computed(() => {
15
+ return 'orient-' + props.orientation
16
+ })
17
+ </script>
18
+
19
+ <template>
20
+ <i>
21
+ <svg
22
+ v-if="!props.bold"
23
+ :class="orientClass"
24
+ xwidth="19px"
25
+ xheight="35px"
26
+ height="1em"
27
+ viewBox="0 0 19 35"
28
+ version="1.1"
29
+ xmlns="http://www.w3.org/2000/svg"
30
+ xmlns:xlink="http://www.w3.org/1999/xlink"
31
+ >
32
+ <title>icon-arrow-lg</title>
33
+ <defs>
34
+ <path
35
+ id="path-1"
36
+ d="M366,124.5 C366,124.907277 365.845623,125.313759 365.536079,125.624786 L349.70258,141.534057 C349.084282,142.155314 348.08123,142.155314 347.463724,141.534057 C346.845425,140.9128 346.845425,139.905743 347.463724,139.284486 L362.177794,124.5 L347.463724,109.715514 C346.845425,109.094257 346.845425,108.0872 347.463724,107.465943 C348.082022,106.844686 349.085074,106.844686 349.70258,107.465943 L365.536079,123.375214 C365.845623,123.686241 366,124.092723 366,124.5"
37
+ ></path>
38
+ </defs>
39
+ <g id="r4" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
40
+ <g
41
+ id="CCB_Sperm-Donor_HP_M_R4"
42
+ transform="translate(-380.000000, -2753.000000)"
43
+ >
44
+ <g id="TESTIMONIALS" transform="translate(0.000000, 2175.000000)">
45
+ <g id="Group-15" transform="translate(33.000000, 471.000000)">
46
+ <mask id="mask-2" fill="white">
47
+ <use xlink:href="#path-1"></use>
48
+ </mask>
49
+ <use
50
+ id="icon-arrow-lg"
51
+ fill="currentcolor"
52
+ xlink:href="#path-1"
53
+ ></use>
54
+ </g>
55
+ </g>
56
+ </g>
57
+ </g>
58
+ </svg>
59
+ <svg
60
+ v-if="props.bold"
61
+ :class="orientClass"
62
+ xwidth="7px"
63
+ xheight="10px"
64
+ height="1em"
65
+ viewBox="0 0 7 10"
66
+ version="1.1"
67
+ xmlns="http://www.w3.org/2000/svg"
68
+ xmlns:xlink="http://www.w3.org/1999/xlink"
69
+ >
70
+ <title>icon-arrow</title>
71
+ <g id="r4" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
72
+ <g
73
+ id="CCB_Sperm-Donor_Location_1_D_R4"
74
+ transform="translate(-182.000000, -2023.000000)"
75
+ fill="currentcolor"
76
+ >
77
+ <g id="Group-2" transform="translate(120.000000, 409.000000)">
78
+ <g id="Group" transform="translate(0.000000, 90.000000)">
79
+ <g id="LOS-ALTOS" transform="translate(60.000000, 1294.000000)">
80
+ <g id="ADDRESS" transform="translate(0.000000, 12.000000)">
81
+ <g id="Group-19" transform="translate(2.696552, 214.000000)">
82
+ <path
83
+ id="icon-arrow"
84
+ d="M5.59137931,8.92855676 C5.59137931,9.13884623 5.51349799,9.34872498 5.35733597,9.50931713 L1.36342228,13.6165333 C1.05149763,13.9373069 0.545868153,13.9373069 0.233943494,13.6165333 C-0.0779811647,13.2957597 -0.0779811647,12.7757862 0.233943494,12.4550126 L3.66271839,8.92855676 L0.233943494,5.40210093 C-0.0779811647,5.08132735 -0.0779811647,4.56135377 0.233943494,4.24058019 C0.545868153,3.9198066 1.05149763,3.9198066 1.36342228,4.24058019 L5.35733597,8.34779639 C5.51349799,8.50838854 5.59137931,8.71826729 5.59137931,8.92855676 Z"
85
+ ></path>
86
+ </g>
87
+ </g>
88
+ </g>
89
+ </g>
90
+ </g>
91
+ </g>
92
+ </g>
93
+ </svg>
94
+ </i>
95
+ </template>
96
+
97
+ <style scoped>
98
+ .orient-up {
99
+ transform: rotate(-90deg);
100
+ }
101
+ .orient-down {
102
+ transform: rotate(90deg);
103
+ }
104
+ .orient-left {
105
+ transform: rotate(180deg);
106
+ }
107
+ </style>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { Image } from './types/Image'
3
+
4
+ defineProps<Image>()
5
+ </script>
6
+
7
+ <template>
8
+ <img
9
+ :src="media.src"
10
+ :alt="altTag"
11
+ :height="media.height"
12
+ :width="media.width"
13
+ :class="class"
14
+ />
15
+ </template>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import { LogoCollectionModule } from './types/LogoCollectionModule'
3
+ import { computed } from 'vue'
4
+
5
+ const props = defineProps<LogoCollectionModule>()
6
+
7
+ const computedStyle = computed(() => {
8
+ return {
9
+ 'background-color': props.backgroundColor ?? 'transparent',
10
+ color: props.textColor ?? 'inherit',
11
+ }
12
+ })
13
+ </script>
14
+
15
+ <template>
16
+ <section :style="computedStyle" class="logo-module">
17
+ <div :class="`container mx-auto ${pt?.container ?? ''}`">
18
+ <h2 v-if="headline" :class="`logo-module-headline ${pt?.headline ?? ''}`">
19
+ {{ headline }}
20
+ </h2>
21
+ <div
22
+ v-if="modules"
23
+ :class="`logo-module-content flex flex-wrap justify-evenly gap-2 ${pt?.content ?? ''}`"
24
+ >
25
+ <Image v-for="image in modules" v-bind="image" />
26
+ </div>
27
+ </div>
28
+ </section>
29
+ </template>
30
+ ./types/LogoCollectionModule
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import { LogoContainerModule } from './types/LogoContainerModule'
3
+ import { computed } from 'vue'
4
+
5
+ const props = defineProps<LogoContainerModule>()
6
+
7
+ const computedStyle = computed(() => {
8
+ return {
9
+ 'background-color': props.backgroundColor ?? 'transparent',
10
+ color: props.textColor ?? 'inherit',
11
+ }
12
+ })
13
+ </script>
14
+
15
+ <template>
16
+ <section :style="computedStyle" class="logo-module">
17
+ <div :class="`container mx-auto ${pt?.container ?? ''}`">
18
+ <h2 v-if="headline" :class="`logo-module-headline ${pt?.headline ?? ''}`">
19
+ {{ headline }}
20
+ </h2>
21
+ <div
22
+ v-if="modules"
23
+ :class="`logo-module-content flex flex-wrap justify-evenly gap-2 ${pt?.content ?? ''}`"
24
+ >
25
+ <Image v-for="image in modules" v-bind="image" />
26
+ </div>
27
+ </div>
28
+ </section>
29
+ </template>
30
+ ./types/LogoContainerModule
@@ -0,0 +1,92 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ NavigationElement as NavigationElementT,
4
+ NavigationElementType,
5
+ } from './types/NavigationElement'
6
+ import { computed, ref } from 'vue'
7
+ import IconChevron from './IconChevron.vue'
8
+ import { RouterLink } from 'vue-router'
9
+
10
+ const props = defineProps<NavigationElementT>()
11
+
12
+ // Update to support url vs page
13
+ const url = computed(() => {
14
+ if (props.linkRef?.page) {
15
+ return `/${props.linkRef?.page}`
16
+ }
17
+ return props?.linkRef?.link
18
+ })
19
+
20
+ const elementTypeValue = computed(() => {
21
+ console.log(props.title, props.isChild)
22
+ return NavigationElementType[props.elementType ?? 'header']
23
+ })
24
+ const showSubNavigation = ref(false)
25
+ const builtClassname = computed(
26
+ () =>
27
+ `relative m-0 ${props.class ?? ''} ${props.isChild ? 'sub-' : ''}navigation-element`
28
+ )
29
+ </script>
30
+
31
+ <template>
32
+ <component :is="isChild ? 'li' : 'div'" :class="builtClassname">
33
+ <component
34
+ v-if="
35
+ elementTypeValue === NavigationElementType.header ||
36
+ (isChild && (url || subNavigation))
37
+ "
38
+ :is="url || isChild ? RouterLink : 'button'"
39
+ :to="url"
40
+ class="flex items-center hover:underline"
41
+ :class="{
42
+ 'whitespace-nowrap': elementTypeValue === NavigationElementType.header,
43
+ }"
44
+ aria-expanded="true"
45
+ aria-haspopup="true"
46
+ @click.prevent="showSubNavigation = !showSubNavigation"
47
+ >
48
+ {{ title }}
49
+ <IconChevron
50
+ v-if="!isChild && subNavigation && !(url || isChild)"
51
+ class="ps-2 text-xs"
52
+ :orientation="showSubNavigation ? 'up' : 'down'"
53
+ :bold="true"
54
+ />
55
+ </component>
56
+ <h2
57
+ v-else-if="elementTypeValue == NavigationElementType.footer"
58
+ class="mb-2 font-bold"
59
+ >
60
+ {{ title }}
61
+ </h2>
62
+
63
+ <ul
64
+ v-if="!isChild && subNavigation"
65
+ :class="{
66
+ hidden:
67
+ !showSubNavigation &&
68
+ elementTypeValue == NavigationElementType.header,
69
+ 'sm:absolute left-0 z-10 sm:mt-2 space-y-2 origin-top-right rounded-md ring-opacity-5 focus:outline-none sm:shadow-lg sm:ring-1 sm:ring-white sm:bg-white p-5':
70
+ elementTypeValue == NavigationElementType.header,
71
+ }"
72
+ role="menu"
73
+ aria-orientation="vertical"
74
+ aria-labelledby="menu-button"
75
+ tabindex="-1"
76
+ >
77
+ <NavigationElement
78
+ v-for="(item, index) in subNavigation"
79
+ :key="item.title"
80
+ class="ms-3 sm:ms-0"
81
+ :class="`sub-navigation-element-item-${index}`"
82
+ role="menuitem"
83
+ tabindex="-1"
84
+ :="{ ...item, elementType, isChild: true }"
85
+ />
86
+ </ul>
87
+
88
+ <template v-if="htmlRef">
89
+ <div v-html="htmlRef" />
90
+ </template>
91
+ </component>
92
+ </template>
@@ -0,0 +1,68 @@
1
+ <script setup lang="ts">
2
+ import { PrimaryNavigation } from './types/PrimaryNavigation'
3
+ import Image from './Image.vue'
4
+ import NavigationElement from './NavigationElement.vue'
5
+ import { ref, computed } from 'vue'
6
+
7
+ const props = defineProps<PrimaryNavigation>()
8
+ const isOpen = ref(true)
9
+ const computedStyle = computed(() => {
10
+ return {
11
+ 'background-color': props.backgroundColor ?? 'white',
12
+ color: props.textColor ?? 'inherit',
13
+ }
14
+ })
15
+ </script>
16
+
17
+ <template>
18
+ <header
19
+ class="primary-navigation-header sticky top-0 z-50 p-5 shadow-2xl"
20
+ :style="computedStyle"
21
+ >
22
+ <div class="container sm:flex sm:justify-between sm:items-center mx-auto">
23
+ <div class="flex items-center justify-between py-3 sm:p-0">
24
+ <a
25
+ href="/"
26
+ class="primary-navigation-logo flex items-center h-12 sm:h-16 ps-5"
27
+ >
28
+ <Image v-bind="logo" />
29
+ </a>
30
+ <div class="sm:hidden">
31
+ <button @click="isOpen = !isOpen" type="button" class="block">
32
+ <svg class="h-6 w-6 fill-current" viewBox="0 0 24 24">
33
+ <!-- Hamburger SVG path-->
34
+ <path
35
+ v-if="isOpen"
36
+ fill-rule="evenodd"
37
+ d="M18.278 16.864a1 1 0 0 1-1.414 1.414l-4.829-4.828-4.828 4.828a1 1 0 0 1-1.414-1.414l4.828-4.829-4.828-4.828a1 1 0 0 1 1.414-1.414l4.829 4.828 4.828-4.828a1 1 0 1 1 1.414 1.414l-4.828 4.829 4.828 4.828z"
38
+ />
39
+ <!-- X SVG path -->
40
+ <path
41
+ v-if="!isOpen"
42
+ fill-rule="evenodd"
43
+ d="M4 5h16a1 1 0 0 1 0 2H4a1 1 0 1 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2z"
44
+ />
45
+ </svg>
46
+ </button>
47
+ </div>
48
+ </div>
49
+ <nav
50
+ v-if="navigation"
51
+ class="primary-navigation items-center px-2 pt-2 pb-4 sm:flex gap-4 sm:justify-evenly sm:p-0"
52
+ :class="isOpen ? 'block' : 'hidden'"
53
+ >
54
+ <NavigationElement
55
+ v-for="(item, index) in navigation"
56
+ role="menuitem"
57
+ tabindex="-1"
58
+ :="{
59
+ ...item,
60
+ class: `primary-nav-item-${index} ${item.class}`,
61
+ isChild: false,
62
+ elementType: 'header',
63
+ }"
64
+ />
65
+ </nav>
66
+ </div>
67
+ </header>
68
+ </template>
@@ -0,0 +1,42 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import { SplitModule } from './types/SplitModule'
4
+
5
+ const props = defineProps<SplitModule>()
6
+
7
+ const computedStyle = computed(() => {
8
+ return {
9
+ 'background-color': props.backgroundColor ?? 'transparent',
10
+ 'background-image': `url(${props.backgroundImage ?? ''})`,
11
+ 'background-size': 'cover',
12
+ }
13
+ })
14
+ </script>
15
+
16
+ <template>
17
+ <section class="split-module" :style="computedStyle">
18
+ <h2 :class="`headline ${pt?.headline ?? ''}`">{{ headline }}</h2>
19
+ <div
20
+ :class="`split-module-content flex justify-evenly gap-4 mx-auto ${pt?.content ?? ''}`"
21
+ >
22
+ <component
23
+ v-if="start"
24
+ :is="start.__typename"
25
+ v-bind="start"
26
+ class="split-module-left"
27
+ />
28
+ <component
29
+ v-if="center"
30
+ :is="center.__typename"
31
+ v-bind="center"
32
+ class="split-module-center"
33
+ />
34
+ <component
35
+ v-if="end"
36
+ :is="end.__typename"
37
+ v-bind="end"
38
+ class="split-module-right"
39
+ />
40
+ </div>
41
+ </section>
42
+ </template>
@@ -0,0 +1,48 @@
1
+ <script setup lang="ts">
2
+ import { Testimonial } from './types/Testimonial'
3
+ import { MediaOptions } from '../types'
4
+ import { computed } from 'vue'
5
+
6
+ const props = defineProps<Testimonial>()
7
+
8
+ const mediaTypeValue = computed(() => {
9
+ if (!props.media) {
10
+ return null
11
+ }
12
+ return MediaOptions[props.media.mediaType]
13
+ })
14
+
15
+ const computedStyle = computed(() => {
16
+ return {
17
+ 'background-color': props.backgroundColor ?? 'transparent',
18
+ color: props.textColor ?? 'inherit',
19
+ }
20
+ })
21
+ </script>
22
+
23
+ <template>
24
+ <div class="testimonial p-5" :style="computedStyle">
25
+ <div
26
+ :class="`container mx-auto flex flex-col items-center lg:flex-row gap-5 ${pt?.container ?? ''}`"
27
+ >
28
+ <div v-if="media" :class="`testimonial-media ${pt?.media}`">
29
+ <component :is="mediaTypeValue" :="media" />
30
+ </div>
31
+ <div
32
+ v-if="headline || quote"
33
+ :class="`testimonial-text ${pt?.text ?? ''}`"
34
+ >
35
+ <h3
36
+ v-if="headline"
37
+ :class="`testimonial-headline ${pt?.headline ?? ''}`"
38
+ >
39
+ {{ headline }}
40
+ </h3>
41
+
42
+ <p v-if="quote" :class="`testimonial-quote ${pt?.quote ?? ''}`">
43
+ {{ quote }}
44
+ </p>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </template>
@@ -0,0 +1,48 @@
1
+ <script setup lang="ts">
2
+ import { Testimonial } from './types/Testimonial'
3
+ import { MediaOptions } from '../types'
4
+ import { computed } from 'vue'
5
+
6
+ const props = defineProps<Testimonial>()
7
+
8
+ const mediaTypeValue = computed(() => {
9
+ if (!props.media) {
10
+ return null
11
+ }
12
+ return MediaOptions[props.media.mediaType]
13
+ })
14
+
15
+ const computedStyle = computed(() => {
16
+ return {
17
+ 'background-color': props.backgroundColor ?? 'transparent',
18
+ color: props.textColor ?? 'inherit',
19
+ }
20
+ })
21
+ </script>
22
+
23
+ <template>
24
+ <div class="testimonial p-5" :style="computedStyle">
25
+ <div
26
+ :class="`container mx-auto flex flex-col items-center lg:flex-row gap-5 ${pt?.container ?? ''}`"
27
+ >
28
+ <div v-if="media" :class="`testimonial-media ${pt?.media}`">
29
+ <component :is="mediaTypeValue" :="media" />
30
+ </div>
31
+ <div
32
+ v-if="headline || quote"
33
+ :class="`testimonial-text ${pt?.text ?? ''}`"
34
+ >
35
+ <h3
36
+ v-if="headline"
37
+ :class="`testimonial-headline ${pt?.headline ?? ''}`"
38
+ >
39
+ {{ headline }}
40
+ </h3>
41
+
42
+ <p v-if="quote" :class="`testimonial-quote ${pt?.quote ?? ''}`">
43
+ {{ quote }}
44
+ </p>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </template>
@@ -0,0 +1,37 @@
1
+ <script setup lang="ts">
2
+ import { TileCollection } from './types/TileCollection'
3
+ import TileContent from './TileContent.vue'
4
+ import { computed } from 'vue'
5
+
6
+ const props = defineProps<TileCollection>()
7
+
8
+ const computedStyle = computed(() => {
9
+ return {
10
+ 'background-color': props.backgroundColor ?? 'transparent',
11
+ color: props.textColor ?? 'inherit',
12
+ }
13
+ })
14
+ </script>
15
+
16
+ <template>
17
+ <section :class="`tile-collection ${variant}`" :style="computedStyle">
18
+ <div :class="`container mx-auto ${pt?.container ?? ''}`">
19
+ <h2
20
+ v-if="headline"
21
+ :class="`tile-collection-headline ${pt?.headline ?? ''}`"
22
+ >
23
+ {{ headline }}
24
+ </h2>
25
+ <ul
26
+ v-if="modules"
27
+ :class="`tile-collection-content flex flex-col md:flex-row justify-center gap-3 ${pt?.content ?? ''}`"
28
+ >
29
+ <TileContent
30
+ v-for="(item, index) in modules"
31
+ :class="`tile-collection-content-item-${index}`"
32
+ :="item"
33
+ />
34
+ </ul>
35
+ </div>
36
+ </section>
37
+ </template>