@iqual/nuxt-icms 1.3.0 → 1.4.0

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 (122) hide show
  1. package/assets/symbols/chevron-right.svg +1 -1
  2. package/components/Blokkli/HeroImage/index.vue +1 -1
  3. package/components/Blokkli/Teasers/icon.svg +3 -3
  4. package/components/DesignSystem/Atoms/Button.vue +86 -36
  5. package/components/DesignSystem/Atoms/Caption.vue +10 -10
  6. package/components/DesignSystem/Atoms/Container.vue +10 -6
  7. package/components/DesignSystem/Atoms/GridRow.vue +4 -3
  8. package/components/DesignSystem/Atoms/LinkListItem.vue +31 -8
  9. package/components/DesignSystem/Molecules/ButtonGroup.vue +18 -3
  10. package/components/DesignSystem/Molecules/Card.vue +86 -31
  11. package/components/DesignSystem/Molecules/IconText.vue +37 -16
  12. package/components/DesignSystem/Molecules/MediaLightbox.vue +213 -58
  13. package/components/DesignSystem/Molecules/MediaSlider.vue +88 -25
  14. package/components/DesignSystem/Molecules/Partnership.vue +40 -9
  15. package/components/DesignSystem/Molecules/Table.vue +90 -25
  16. package/components/DesignSystem/Molecules/TitleComposition.vue +15 -12
  17. package/components/DesignSystem/Organisms/ContentBlock.vue +61 -15
  18. package/components/DesignSystem/Organisms/FacetedListing.vue +170 -0
  19. package/components/DesignSystem/Organisms/FlipTeaser.vue +119 -47
  20. package/components/DesignSystem/Organisms/HeaderHero.vue +167 -0
  21. package/components/DesignSystem/Organisms/HeaderTextImage.vue +71 -0
  22. package/components/DesignSystem/Organisms/LogoElement.vue +33 -10
  23. package/components/DesignSystem/Organisms/Map.vue +11 -6
  24. package/components/DesignSystem/Organisms/SearchResults.vue +41 -0
  25. package/components/DesignSystem/Organisms/TeamElement.vue +84 -20
  26. package/components/DesignSystem/Organisms/TeaserCard.vue +87 -34
  27. package/components/DesignSystem/Organisms/Testimonial.vue +82 -12
  28. package/components/DesignSystem/Organisms/TimelineElement.vue +42 -12
  29. package/components/DesignSystem/Organisms/TwoColumnTextElement.vue +44 -9
  30. package/components/DesignSystem/Pages/Search.vue +39 -0
  31. package/components/Drupal/Breadcrumb/index.vue +16 -5
  32. package/components/Drupal/Messages/index.vue +16 -5
  33. package/components/Drupal/Webform/fragment.graphql +8 -5
  34. package/components/Drupal/Webform/index.vue +20 -9
  35. package/components/Drupal/Webform/query.graphql +18 -16
  36. package/components/Form/CheckboxInput.vue +6 -6
  37. package/components/Form/CheckboxInputs.vue +5 -5
  38. package/components/Form/FileUploadInput.vue +6 -6
  39. package/components/Form/RadioButtonsInput.vue +5 -5
  40. package/components/Form/SelectInput.vue +7 -7
  41. package/components/Form/SubmitButton.vue +1 -1
  42. package/components/Form/TextAreaInput.vue +2 -2
  43. package/components/Form/TextEmailInput.vue +2 -2
  44. package/components/Form/TextInput.vue +2 -2
  45. package/components/Form/TextPhoneInput.vue +2 -2
  46. package/components/Form/composables/useFormElement.ts +5 -5
  47. package/components/Form/utils/types.ts +8 -7
  48. package/components/Media/Icon/index.vue +10 -6
  49. package/components/Media/Image/index.vue +26 -20
  50. package/components/Media/RemoteVideo/index.vue +34 -21
  51. package/components/Media/Video/index.vue +6 -5
  52. package/components/Node/Icms/Page/Teaser/index.vue +6 -4
  53. package/components/Node/Icms/Page/index.vue +2 -2
  54. package/components/Paragraph/Button/Element/index.vue +9 -2
  55. package/components/Paragraph/CallToAction/index.vue +43 -10
  56. package/components/Paragraph/Card/Element/index.vue +2 -1
  57. package/components/Paragraph/Card/Layout/index.vue +29 -10
  58. package/components/Paragraph/Contact/index.vue +41 -12
  59. package/components/Paragraph/Downloads/index.vue +82 -33
  60. package/components/Paragraph/FAQ/Element/index.vue +41 -12
  61. package/components/Paragraph/FAQ/Layout/index.vue +47 -13
  62. package/components/Paragraph/FlipTeasers/index.vue +26 -6
  63. package/components/Paragraph/Gallery/index.vue +42 -10
  64. package/components/Paragraph/HeroImage/index.vue +62 -16
  65. package/components/Paragraph/IconText/Element/index.vue +7 -1
  66. package/components/Paragraph/IconText/Layout/index.vue +39 -12
  67. package/components/Paragraph/Introduction/index.vue +50 -15
  68. package/components/Paragraph/Logo/Element/fragment.graphql +1 -0
  69. package/components/Paragraph/Logo/Element/index.vue +7 -2
  70. package/components/Paragraph/Media/index.vue +32 -31
  71. package/components/Paragraph/Partnerships/Element/fragment.graphql +1 -0
  72. package/components/Paragraph/Partnerships/Element/index.vue +7 -0
  73. package/components/Paragraph/Partnerships/Layout/index.vue +100 -27
  74. package/components/Paragraph/SingleTestimonial/index.vue +58 -15
  75. package/components/Paragraph/Table/index.vue +32 -9
  76. package/components/Paragraph/Tabs/Element/index.vue +44 -10
  77. package/components/Paragraph/Tabs/Layout/index.vue +123 -37
  78. package/components/Paragraph/Team/Element/index.vue +18 -1
  79. package/components/Paragraph/Team/Layout/index.vue +30 -7
  80. package/components/Paragraph/Teasers/index.vue +33 -7
  81. package/components/Paragraph/Testimonial/Element/index.vue +30 -5
  82. package/components/Paragraph/Testimonial/Layout/index.vue +78 -24
  83. package/components/Paragraph/Text/index.vue +32 -10
  84. package/components/Paragraph/TextMedia/index.vue +44 -13
  85. package/components/Paragraph/Timeline/Element/index.vue +23 -7
  86. package/components/Paragraph/Timeline/Layout/index.vue +232 -67
  87. package/components/Paragraph/TwoColumnText/Element/index.vue +20 -3
  88. package/components/Paragraph/TwoColumnText/Layout/index.vue +8 -1
  89. package/components/Paragraph/iFrame/index.vue +31 -11
  90. package/components/Search/Facets/FacetDropdownUI.vue +351 -77
  91. package/components/Search/Facets/FacetedSearchUI.vue +257 -101
  92. package/components/Search/Facets/fragment.graphql +5 -1
  93. package/components/Search/Input/index.vue +125 -0
  94. package/components/Section/Footer/index.vue +170 -30
  95. package/components/Section/Header/Buttons.vue +34 -0
  96. package/components/Section/Header/DesktopMainMenu.vue +160 -0
  97. package/components/Section/Header/DesktopMainMenuDropdown.vue +170 -0
  98. package/components/Section/Header/LanguageDropdown.vue +95 -64
  99. package/components/Section/Header/LanguageLinks.vue +39 -0
  100. package/components/Section/Header/Logo.vue +23 -0
  101. package/components/Section/Header/MainButtons.vue +31 -0
  102. package/components/Section/Header/MenuIcon.vue +60 -49
  103. package/components/Section/Header/MetaButtons.vue +31 -0
  104. package/components/Section/Header/MetaMenu.vue +55 -53
  105. package/components/Section/Header/MobileMainMenu.vue +23 -0
  106. package/components/Section/Header/MobileMainMenuItem.vue +191 -0
  107. package/components/Section/Header/index.vue +182 -186
  108. package/composables/useMenu.ts +2 -2
  109. package/composables/useMobileMenuOverlayBus.ts +44 -0
  110. package/composables/useNavigationOffset.ts +2 -2
  111. package/composables/useTheme.ts +107 -0
  112. package/formkit.theme.ts +541 -586
  113. package/layouts/default.vue +7 -35
  114. package/layouts/error.vue +7 -32
  115. package/nuxt.config.ts +13 -0
  116. package/package.json +1 -1
  117. package/plugins/initData.ts +8 -5
  118. package/queries/query.initData.graphql +4 -2
  119. package/tailwind.config.ts +11 -11
  120. package/types/global.ts +1 -0
  121. package/components/Section/Header/GlobalMenu.vue +0 -335
  122. package/components/Section/Header/LanguageSwitcher.vue +0 -37
@@ -1,36 +1,54 @@
1
1
  <template>
2
2
  <div
3
- :class="{ 'shadow-custom-small': open }"
4
- class="flip-teaser relative col-span-12 aspect-square overflow-hidden rounded-lg transition-shadow duration-300 ease-in-out hover:shadow-custom-small md:col-span-6 xl:col-span-3"
5
- @mouseenter="open = true"
6
- @mouseleave="open = false"
3
+ class="flip-teaser relative"
4
+ :class="[
5
+ themedClass(
6
+ 'containerClass',
7
+ 'col-span-12 aspect-square md:col-span-6 xl:col-span-3',
8
+ ),
9
+ ]"
10
+ @mouseenter="active = true"
11
+ @mouseleave="active = false"
7
12
  >
8
13
  <!-- Image -->
9
- <div class="flip-teaser-grid-item">
14
+ <div :class="themedClass('imageContainerClass', 'flip-teaser-grid-item')">
10
15
  <Media
11
16
  v-if="image"
12
17
  :media="image"
13
18
  imageSizes="xs:100vw sm:100vw md:50vw lg:320px"
19
+ imageAspectRatios="1/1"
20
+ :mediaClass="themedClass('mediaClass', 'w-full')"
21
+ :figcaptionClass="themedClass('figcaptionClass')"
22
+ :elementClass="themedClass('elementClass')"
14
23
  />
15
24
  <!-- Opaque Overlay -->
16
- <div :class="flipTeaserOpaqueOverlay({ colorScheme })" />
25
+ <div :class="opaqueOverlay({ colorScheme })" />
17
26
  </div>
18
27
 
19
28
  <!-- Title -->
20
- <div class="flip-teaser-grid-item relative flex items-end px-6 py-7">
29
+ <div
30
+ :class="[
31
+ themedClass(
32
+ 'titleContainerClass',
33
+ 'flip-teaser-grid-item relative flex items-end px-6 py-7 transition-opacity',
34
+ ),
35
+ { 'opacity-0': active },
36
+ ]"
37
+ >
21
38
  <DesignSystemOrganismsContentBlock
22
39
  :title="title"
23
40
  :titleWeight="titleWeight"
24
41
  :titleStyle="'heading-5'"
25
- titleClass="font-semibold mb-0"
42
+ :titleClass="themedClass('titleClass', 'font-semibold mb-0')"
26
43
  />
27
44
  </div>
28
45
 
29
46
  <!-- Overlay -->
30
47
  <div
31
48
  :class="
32
- cn(flipTeaserOverlay({ colorScheme }), {
33
- '!cursor-default opacity-100': open,
49
+ cn(overlay({ colorScheme }), {
50
+ [themedClass('overlayActiveClass', '!cursor-default opacity-85')]:
51
+ active,
34
52
  })
35
53
  "
36
54
  >
@@ -38,37 +56,44 @@
38
56
  <div>
39
57
  <DesignSystemOrganismsContentBlock
40
58
  :pretitle="pretitle"
41
- pretitleClass="text-gray-300 font-medium text-base lg:text-base mb-2"
59
+ :pretitleClass="
60
+ themedClass(
61
+ 'overlayPretitleClass',
62
+ 'text-gray-300 font-medium text-base lg:text-base mb-2',
63
+ )
64
+ "
42
65
  :title="title"
66
+ :titleStyle="'heading-5'"
43
67
  :titleWeight="titleWeight"
44
- titleClass="mb-2"
68
+ :titleClass="themedClass('overlayTitleClass', 'mb-2')"
45
69
  :subtitle="subtitle"
70
+ :subtitleClass="themedClass('overlaySubtitleClass')"
46
71
  :text="text"
47
- textClass="text-sm line-clamp-3"
48
- :titleStyle="'heading-5'"
72
+ :textClass="themedClass('overlayTextClass', 'text-sm line-clamp-3')"
49
73
  :colorScheme="colorScheme"
50
74
  />
51
75
  </div>
52
76
 
53
77
  <!-- Decorative arrow -->
54
78
  <NuxtLink
55
- :class="flipTeaserIconWrapper({ colorScheme })"
79
+ :class="iconWrapper({ colorScheme })"
56
80
  :to="link === '' ? language : language + link"
57
81
  :title="linkLabel"
58
82
  >
59
- <SpriteSymbol
60
- name="chevron-down"
61
- :class="flipTeaserIcon({ colorScheme })"
62
- />
83
+ <SpriteSymbol name="chevron-down" :class="icon({ colorScheme })" />
63
84
  </NuxtLink>
64
85
  </div>
65
86
  </div>
66
87
  </template>
67
88
 
68
89
  <script lang="ts" setup>
90
+ import type { ColorScheme } from '@iqual/nuxt-icms/types/global'
91
+ import type { MediaFragment } from '#graphql-operations'
69
92
  import { tv } from 'tailwind-variants'
70
93
  import cn from '@iqual/nuxt-icms/composables/useCn'
71
- import type { MediaFragment } from '#graphql-operations'
94
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
95
+
96
+ const themedClass = useTheme()
72
97
 
73
98
  defineProps<{
74
99
  image?: MediaFragment
@@ -79,16 +104,31 @@ defineProps<{
79
104
  text?: string
80
105
  link?: string
81
106
  linkLabel?: string
107
+ containerClass?: string
108
+ titleContainerClass?: string
109
+ titleClass?: string
110
+ imageContainerClass?: string
111
+ mediaClass?: string
112
+ figcaptionClass?: string
113
+ elementClass?: string
114
+ overlayActiveClass?: string
115
+ overlayPretitleClass?: string
116
+ overlayTitleClass?: string
117
+ overlaySubtitleClass?: string
118
+ overlayTextClass?: string
82
119
  }>()
83
120
 
84
- const flipTeaserOverlay = tv({
85
- base: 'flip-teaser-grid-item absolute inset-0 flex cursor-pointer flex-col justify-between gap-4 p-6 opacity-0 transition-opacity duration-300 ease-in-out',
121
+ const overlay = tv({
122
+ base: themedClass(
123
+ 'overlayBase',
124
+ 'flip-teaser-grid-item absolute inset-0 flex cursor-pointer flex-col justify-between gap-4 p-6 opacity-0 transition-opacity duration-300 ease-in-out',
125
+ ),
86
126
  variants: {
87
127
  colorScheme: {
88
- none: 'bg-white',
89
- dark: 'bg-gray-900',
90
- light: 'bg-gray-50',
91
- accent: 'bg-primary-700',
128
+ none: themedClass('overlayVariantsColorSchemeNone', 'bg-gray-50'),
129
+ dark: themedClass('overlayVariantsColorSchemeDark', 'bg-gray-900'),
130
+ light: themedClass('overlayVariantsColorSchemeLight', 'bg-white'),
131
+ accent: themedClass('overlayVariantsColorSchemeAccent', 'bg-primary-700'),
92
132
  },
93
133
  },
94
134
  defaultVariants: {
@@ -96,14 +136,20 @@ const flipTeaserOverlay = tv({
96
136
  },
97
137
  })
98
138
 
99
- const flipTeaserOpaqueOverlay = tv({
100
- base: 'pointer-events-none absolute inset-0 opacity-60',
139
+ const opaqueOverlay = tv({
140
+ base: themedClass(
141
+ 'opaqueOverlayBase',
142
+ 'pointer-events-none absolute inset-0 opacity-60',
143
+ ),
101
144
  variants: {
102
145
  colorScheme: {
103
- none: 'bg-white',
104
- dark: 'bg-gray-900',
105
- light: 'bg-gray-50',
106
- accent: 'bg-primary-700',
146
+ none: themedClass('opaqueOverlayVariantsColorSchemeNone', 'bg-white'),
147
+ dark: themedClass('opaqueOverlayVariantsColorSchemeDark', 'bg-black'),
148
+ light: themedClass('opaqueOverlayVariantsColorSchemeLight', 'bg-white'),
149
+ accent: themedClass(
150
+ 'opaqueOverlayVariantsColorSchemeAccent',
151
+ 'bg-primary-700',
152
+ ),
107
153
  },
108
154
  },
109
155
  defaultVariants: {
@@ -111,14 +157,29 @@ const flipTeaserOpaqueOverlay = tv({
111
157
  },
112
158
  })
113
159
 
114
- const flipTeaserIconWrapper = tv({
115
- base: 'group ml-auto grid size-12 shrink-0 cursor-pointer place-content-center rounded-full transition-all',
160
+ const iconWrapper = tv({
161
+ base: themedClass(
162
+ 'iconWrapperBase',
163
+ 'group ml-auto grid size-12 shrink-0 cursor-pointer place-content-center rounded-full transition-all',
164
+ ),
116
165
  variants: {
117
166
  colorScheme: {
118
- none: 'bg-gray-50 hover:bg-black',
119
- dark: 'bg-black hover:bg-white',
120
- light: 'bg-gray-100 hover:bg-black',
121
- accent: 'bg-primary-600 hover:bg-primary-800',
167
+ none: themedClass(
168
+ 'iconWrapperVariantsColorSchemeNone',
169
+ 'bg-gray-100 hover:bg-black',
170
+ ),
171
+ dark: themedClass(
172
+ 'iconWrapperVariantsColorSchemeDark',
173
+ 'bg-gray-950 hover:bg-white',
174
+ ),
175
+ light: themedClass(
176
+ 'iconWrapperVariantsColorSchemeLight',
177
+ 'bg-gray-50 hover:bg-gray-950',
178
+ ),
179
+ accent: themedClass(
180
+ 'iconWrapperVariantsColorSchemeAccent',
181
+ 'bg-primary-600 hover:bg-primary-800',
182
+ ),
122
183
  },
123
184
  },
124
185
  defaultVariants: {
@@ -126,14 +187,26 @@ const flipTeaserIconWrapper = tv({
126
187
  },
127
188
  })
128
189
 
129
- const flipTeaserIcon = tv({
130
- base: 'size-8 -rotate-90 transition-all duration-300 ease-in-out',
190
+ const icon = tv({
191
+ base: themedClass(
192
+ 'iconBase',
193
+ 'size-8 -rotate-90 transition-all duration-300 ease-in-out',
194
+ ),
131
195
  variants: {
132
196
  colorScheme: {
133
- none: 'text-black group-hover:text-white',
134
- dark: 'text-white group-hover:text-black',
135
- light: 'text-black group-hover:text-white',
136
- accent: 'text-white',
197
+ none: themedClass(
198
+ 'iconVariantsColorSchemeNone',
199
+ 'text-black group-hover:text-white',
200
+ ),
201
+ dark: themedClass(
202
+ 'iconVariantsColorSchemeDark',
203
+ 'text-white group-hover:text-black',
204
+ ),
205
+ light: themedClass(
206
+ 'iconVariantsColorSchemeLight',
207
+ 'text-black group-hover:text-white',
208
+ ),
209
+ accent: themedClass('iconVariantsColorSchemeAccent', 'text-white'),
137
210
  },
138
211
  },
139
212
  defaultVariants: {
@@ -141,11 +214,10 @@ const flipTeaserIcon = tv({
141
214
  },
142
215
  })
143
216
 
144
- const colorScheme = inject<string>('colorScheme')
217
+ const colorScheme = inject<ColorScheme>('colorScheme')
145
218
 
146
- const open = ref(false)
219
+ const active = ref(false)
147
220
  const language = ref(useCurrentLanguage())
148
-
149
221
  </script>
150
222
 
151
223
  <style lang="css" scoped>
@@ -0,0 +1,167 @@
1
+ <template>
2
+ <DesignSystemAtomsContainer
3
+ :color-scheme="'dark'"
4
+ :spacing="{ top: '', bottom: '' }"
5
+ :class="
6
+ themedClass(
7
+ 'containerClass',
8
+ 'header-grid aspect-square max-h-[1080px] w-full items-center md:aspect-video',
9
+ )
10
+ "
11
+ >
12
+ <!-- Image -->
13
+ <Media
14
+ v-if="image"
15
+ :media="image"
16
+ imageSizes="xs:100vw sm:100vw md:100vw lg:100vw"
17
+ imageAspectRatios="xs:1/1 md:16/9"
18
+ :mediaClass="
19
+ themedClass('mediaClass', 'header-grid-item max-h-[1080px] h-full')
20
+ "
21
+ :figcaptionClass="themedClass('figcaptionClass')"
22
+ :elementClass="
23
+ themedClass('elementClass', 'size-full object-cover object-center')
24
+ "
25
+ />
26
+
27
+ <!-- Image overlay -->
28
+ <div
29
+ v-if="image"
30
+ :class="
31
+ themedClass(
32
+ 'imageOverlayClass',
33
+ 'header-grid-item z-10 w-full self-stretch bg-black opacity-50',
34
+ )
35
+ "
36
+ ></div>
37
+
38
+ <!-- Content row -->
39
+ <DesignSystemAtomsGridRow
40
+ :class="themedClass('rowClass', 'header-grid-item relative z-20 mx-auto')"
41
+ >
42
+ <div :class="themedClass('columnClass', 'col-span-12')">
43
+ <DesignSystemOrganismsContentBlock
44
+ :pretitle="pretitle"
45
+ :pretitleClass="themedClass('pretitleClass')"
46
+ :title="title"
47
+ :titleClass="themedClass('titleClass', 'mb-0')"
48
+ titleWeight="h1"
49
+ colorScheme="dark"
50
+ />
51
+
52
+ <slot name="subtitle">
53
+ <div
54
+ :class="
55
+ themedClass(
56
+ 'metaContainerClass',
57
+ 'mt-4 flex flex-col flex-nowrap justify-between gap-4 lg:mt-10 lg:flex-row lg:items-center',
58
+ )
59
+ "
60
+ >
61
+ <div
62
+ v-if="author"
63
+ :class="
64
+ themedClass('authorContainerClass', 'flex items-center gap-4')
65
+ "
66
+ >
67
+ <img
68
+ v-if="author?.userPicture"
69
+ :src="
70
+ author?.userPicture?.entity?.uri?.replace(
71
+ 'public://',
72
+ '/sites/default/files/',
73
+ )
74
+ "
75
+ :alt="`${$texts('bundle.profile_picture_of', 'Profile picture of') + ' ' + author?.label || author?.name}`"
76
+ width="64"
77
+ :class="
78
+ themedClass(
79
+ 'authorImageClass',
80
+ 'size-12 rounded-full object-cover object-center md:size-16',
81
+ )
82
+ "
83
+ />
84
+ <span
85
+ :class="themedClass('authorNameClass', 'text-lg font-semibold')"
86
+ >
87
+ {{ author?.label || author?.name }}
88
+ </span>
89
+ </div>
90
+
91
+ <div
92
+ v-if="publishingDate"
93
+ :class="themedClass('publishingDateContainerClass', 'text-lg')"
94
+ >
95
+ <span>
96
+ {{ $texts('page.published_on', 'Published on') }}
97
+ </span>
98
+ <span>{{ ' ' + publishingDate?.first?.formatted }}</span>
99
+ </div>
100
+
101
+ <div :class="themedClass('subtitleContainerClass', 'text-lg')">
102
+ <span>{{ subtitle }}</span>
103
+ </div>
104
+ </div>
105
+ </slot>
106
+ </div>
107
+ </DesignSystemAtomsGridRow>
108
+ </DesignSystemAtomsContainer>
109
+ </template>
110
+
111
+ <script lang="ts" setup>
112
+ import { type MediaFragment } from '#graphql-operations'
113
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
114
+
115
+ defineProps<{
116
+ title?: string
117
+ image?: MediaFragment
118
+ pretitle?: string
119
+ subtitle?: string
120
+ publishingDate?: {
121
+ first?: {
122
+ value?: string
123
+ formatted: string
124
+ }
125
+ }
126
+ author?: {
127
+ id?: string
128
+ label?: string
129
+ name?: string
130
+ userPicture?: {
131
+ entity?: {
132
+ uri?: string
133
+ }
134
+ }
135
+ }
136
+ containerClass?: string
137
+ rowClass?: string
138
+ columnClass?: string
139
+ mediaClass?: string
140
+ figcaptionClass?: string
141
+ elementClass?: string
142
+ imageOverlayClass?: string
143
+ pretitleClass?: string
144
+ titleClass?: string
145
+ subtitleClass?: string
146
+ metaContainerClass?: string
147
+ authorContainerClass?: string
148
+ authorImageClass?: string
149
+ authorNameClass?: string
150
+ publishingDateContainerClass?: string
151
+ subtitleContainerClass?: string
152
+ }>()
153
+
154
+ const themedClass = useTheme()
155
+ const { $texts } = useNuxtApp()
156
+ </script>
157
+
158
+ <style scoped>
159
+ .header-grid {
160
+ display: grid;
161
+ grid-template-areas: 'content';
162
+ }
163
+
164
+ .header-grid-item {
165
+ grid-area: content;
166
+ }
167
+ </style>
@@ -0,0 +1,71 @@
1
+ <template>
2
+ <DesignSystemAtomsContainer
3
+ :spacing="{ top: 'large', bottom: 'large' }"
4
+ :class="themedClass('containerClass')"
5
+ >
6
+ <DesignSystemAtomsGridRow
7
+ :class="themedClass('rowClass', 'flex flex-col-reverse lg:grid')"
8
+ >
9
+ <div
10
+ :class="themedClass('firstColumnClass', 'col-span-12 md:col-span-5')"
11
+ >
12
+ <slot name="content">
13
+ <DesignSystemOrganismsContentBlock
14
+ :title="title"
15
+ titleWeight="p"
16
+ :titleClass="themedClass('titleClass', 'text-h1 mb-4')"
17
+ :text="description"
18
+ :textClass="themedClass('textClass', 'text-h6')"
19
+ />
20
+ </slot>
21
+ <slot name="extra"></slot>
22
+ </div>
23
+
24
+ <div
25
+ :class="
26
+ themedClass(
27
+ 'secondColumnClass',
28
+ 'col-span-12 md:col-span-5 md:col-start-8',
29
+ )
30
+ "
31
+ >
32
+ <Media
33
+ v-if="image"
34
+ :media="image"
35
+ imageSizes="xs:100vw sm:100vw md:800px lg:800px"
36
+ :mediaClass="themedClass('mediaClass')"
37
+ :figcaptionClass="themedClass('figcaptionClass')"
38
+ :elementClass="
39
+ themedClass(
40
+ 'elementClass',
41
+ 'aspect-4/3 object-cover object-center rounded-lg',
42
+ )
43
+ "
44
+ />
45
+ </div>
46
+ </DesignSystemAtomsGridRow>
47
+ </DesignSystemAtomsContainer>
48
+ </template>
49
+
50
+ <script lang="ts" setup>
51
+ import { type MediaFragment } from '#graphql-operations'
52
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
53
+
54
+ defineProps<{
55
+ title?: string
56
+ image?: MediaFragment
57
+ description?: string
58
+ containerClass?: string
59
+ rowClass?: string
60
+ firstColumnClass?: string
61
+ secondColumnClass?: string
62
+ titleClass?: string
63
+ subtitleClass?: string
64
+ textClass?: string
65
+ mediaClass?: string
66
+ figcaptionClass?: string
67
+ elementClass?: string
68
+ }>()
69
+
70
+ const themedClass = useTheme()
71
+ </script>
@@ -1,33 +1,56 @@
1
1
  <template>
2
- <NuxtLink :class="logoElement({ colorScheme })" :to="link" :title="title">
3
- <Media
2
+ <NuxtLink
3
+ :to="link"
4
+ :title="title"
5
+ :target="targetBlank ? '_blank' : '_self'"
6
+ :class="logoElement({ colorScheme })"
7
+ >
8
+ <Media
4
9
  v-if="logo"
5
10
  :media="logo"
6
- mediaClass="h-full"
7
11
  imageSizes="xs:200px"
12
+ :mediaClass="themedClass('mediaClass', 'w-full h-full')"
13
+ :figcaptionClass="themedClass('figcaptionClass')"
14
+ :elementClass="
15
+ themedClass('elementClass', 'w-full h-full object-scale-down')
16
+ "
8
17
  />
9
18
  </NuxtLink>
10
19
  </template>
11
20
 
12
21
  <script lang="ts" setup>
13
- import { tv } from 'tailwind-variants'
22
+ import type { ColorScheme } from '@iqual/nuxt-icms/types/global'
14
23
  import type { MediaFragment } from '#graphql-operations'
24
+ import { tv } from 'tailwind-variants'
25
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
26
+
27
+ const themedClass = useTheme()
15
28
 
16
29
  defineProps<{
17
30
  logo?: MediaFragment
18
31
  link?: string
19
32
  title?: string
20
- colorScheme?: string
33
+ targetBlank?: boolean
34
+ colorScheme?: ColorScheme
35
+ mediaClass?: string
36
+ figcaptionClass?: string
37
+ elementClass?: string
21
38
  }>()
22
39
 
23
40
  const logoElement = tv({
24
- base: 'flex h-[160px] w-full items-center justify-center rounded-lg bg-white p-8 shadow-custom',
41
+ base: themedClass(
42
+ 'logoElementBase',
43
+ 'flex h-[160px] w-full items-center justify-center p-8',
44
+ ),
25
45
  variants: {
26
46
  colorScheme: {
27
- none: 'bg-white',
28
- dark: 'bg-gray-900',
29
- light: 'bg-white',
30
- accent: 'bg-primary-700',
47
+ none: themedClass('logoElementVariantsColorSchemeNone', 'bg-gray-50'),
48
+ dark: themedClass('logoElementVariantsColorSchemeDark', 'bg-gray-900'),
49
+ light: themedClass('logoElementVariantsColorSchemeLight', 'bg-white'),
50
+ accent: themedClass(
51
+ 'logoElementVariantsColorSchemeAccent',
52
+ 'bg-primary-700',
53
+ ),
31
54
  },
32
55
  },
33
56
  defaultVariants: {
@@ -10,13 +10,16 @@
10
10
  :center="props.center"
11
11
  :zoom="props.zoom"
12
12
  :height="props.height"
13
- >
13
+ >
14
14
  <MglNavigationControl />
15
15
 
16
16
  <mgl-marker
17
- v-for="(location, index) in (locations || [])"
17
+ v-for="(location, index) in locations || []"
18
18
  :key="index"
19
- :coordinates="[location.coordinates?.lng || 0, location.coordinates?.lat || 0]"
19
+ :coordinates="[
20
+ location.coordinates?.lng || 0,
21
+ location.coordinates?.lat || 0,
22
+ ]"
20
23
  :color="location.color || props.markerColor"
21
24
  >
22
25
  <mgl-popup>
@@ -30,6 +33,8 @@
30
33
  </template>
31
34
 
32
35
  <script lang="ts" setup>
36
+ import type { ColorScheme } from '@iqual/nuxt-icms/types/global'
37
+
33
38
  interface Location {
34
39
  label?: string
35
40
  coordinates?: {
@@ -46,7 +51,7 @@ interface Props {
46
51
  center?: [number, number]
47
52
  height?: string
48
53
  locations?: Location[]
49
- colorScheme?: string
54
+ colorScheme?: ColorScheme
50
55
  isEditing?: boolean
51
56
  markerColor?: string
52
57
  }
@@ -56,6 +61,6 @@ const props = withDefaults(defineProps<Props>(), {
56
61
  center: () => [8.2267, 46.8011],
57
62
  zoom: 12,
58
63
  height: '500px',
59
- markerColor: '#e95e27'
64
+ markerColor: '#e95e27',
60
65
  })
61
- </script>
66
+ </script>
@@ -0,0 +1,41 @@
1
+ <template>
2
+ <div :class="themedClass('resultsContainerClass', 'mt-10 md:mt-20')">
3
+ <p
4
+ v-if="results && 'label' in results && results.label"
5
+ :class="themedClass('resultLabelClass', 'h3 mb-4')"
6
+ >
7
+ {{ results.label }}
8
+ <span
9
+ v-if="results?.count"
10
+ :class="themedClass('resultCountClass', 'text-base text-gray-500')"
11
+ >
12
+ ({{ results.count }})
13
+ </span>
14
+ </p>
15
+ <component
16
+ v-for="teaser in results?.results"
17
+ :is="searchComponent(teaser?.bundle!)"
18
+ v-bind="teaser"
19
+ />
20
+ </div>
21
+ </template>
22
+
23
+ <script setup lang="ts">
24
+ import type { ContentSearchQuery } from '#graphql-operations'
25
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
26
+
27
+ type GroupedSearchResults = NonNullable<
28
+ NonNullable<ContentSearchQuery['searchApiQuery']>['facets']
29
+ >[number]
30
+
31
+ defineProps<{
32
+ results: GroupedSearchResults
33
+ }>()
34
+
35
+ const themedClass = useTheme()
36
+
37
+ const { $resolveDynamicEntityComponent } = useNuxtApp()
38
+ const searchComponent = (bundle: string) => {
39
+ return $resolveDynamicEntityComponent(`${bundle}SearchResult`)
40
+ }
41
+ </script>