@iqual/nuxt-icms 1.4.5 → 1.4.7

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 (53) hide show
  1. package/assets/css/components/container.css +1 -1
  2. package/components/Blokkli/Media/index.vue +7 -2
  3. package/components/DesignSystem/Atoms/Button.vue +3 -3
  4. package/components/DesignSystem/Atoms/Container.vue +32 -8
  5. package/components/DesignSystem/Molecules/Card.vue +1 -1
  6. package/components/DesignSystem/Molecules/IconText.vue +1 -1
  7. package/components/DesignSystem/Molecules/MediaSlider.vue +1 -1
  8. package/components/DesignSystem/Molecules/Partnership.vue +2 -2
  9. package/components/DesignSystem/Molecules/Table.vue +2 -2
  10. package/components/DesignSystem/Organisms/ContentBlock.vue +2 -2
  11. package/components/DesignSystem/Organisms/HeaderHero.vue +1 -1
  12. package/components/DesignSystem/Organisms/SearchResults.vue +1 -1
  13. package/components/DesignSystem/Organisms/TeaserCard.vue +2 -2
  14. package/components/DesignSystem/Organisms/Testimonial.vue +4 -1
  15. package/components/DesignSystem/Organisms/TimelineElement.vue +1 -1
  16. package/components/Drupal/Webform/index.vue +28 -13
  17. package/components/Drupal/Webform/query.graphql +2 -2
  18. package/components/Paragraph/Card/Layout/index.vue +4 -2
  19. package/components/Paragraph/Contact/index.vue +2 -2
  20. package/components/Paragraph/Downloads/index.vue +1 -1
  21. package/components/Paragraph/FAQ/Element/index.vue +1 -1
  22. package/components/Paragraph/FlipTeasers/index.vue +1 -3
  23. package/components/Paragraph/Gallery/index.vue +1 -3
  24. package/components/Paragraph/HeroImage/index.vue +1 -1
  25. package/components/Paragraph/Introduction/index.vue +1 -1
  26. package/components/Paragraph/Media/index.vue +21 -2
  27. package/components/Paragraph/Partnerships/Layout/index.vue +2 -2
  28. package/components/Paragraph/Table/index.vue +1 -1
  29. package/components/Paragraph/Tabs/Element/index.vue +1 -1
  30. package/components/Paragraph/Tabs/Layout/index.vue +3 -3
  31. package/components/Paragraph/Team/Layout/index.vue +1 -1
  32. package/components/Paragraph/Teasers/index.vue +1 -1
  33. package/components/Paragraph/Testimonial/Layout/index.vue +2 -2
  34. package/components/Paragraph/TextMedia/index.vue +3 -3
  35. package/components/Paragraph/Timeline/Layout/index.vue +5 -7
  36. package/components/Search/Facets/FacetDropdownUI.vue +5 -5
  37. package/components/Search/Facets/FacetedSearchUI.vue +2 -2
  38. package/components/Search/Input/index.vue +1 -1
  39. package/components/Section/Footer/index.vue +2 -2
  40. package/components/Section/Header/DesktopMainMenu.vue +25 -13
  41. package/components/Section/Header/DesktopMainMenuDropdown.vue +16 -10
  42. package/components/Section/Header/LanguageDropdown.vue +7 -1
  43. package/components/Section/Header/LanguageLinks.vue +10 -2
  44. package/components/Section/Header/Logo.vue +2 -0
  45. package/components/Section/Header/MenuIcon.vue +1 -1
  46. package/components/Section/Header/MetaMenu.vue +3 -2
  47. package/components/Section/Header/MobileMainMenuItem.vue +22 -9
  48. package/components/Section/Header/index.vue +8 -16
  49. package/composables/useIsHomepage.ts +4 -0
  50. package/composables/useNavigationOffset.ts +1 -1
  51. package/nuxt.config.ts +5 -0
  52. package/package.json +1 -1
  53. package/tailwind.config.ts +1 -1
@@ -1,6 +1,6 @@
1
1
  @layer components {
2
2
  .container {
3
- @apply max-w-full px-4;
3
+ @apply px-4;
4
4
 
5
5
  @screen md {
6
6
  @apply px-8;
@@ -9,7 +9,12 @@ const props = defineProps<ParagraphIcmsLayoutMediaFragment>()
9
9
 
10
10
  const blokkliData = defineBlokkli({
11
11
  bundle: 'icms_layout_media',
12
- globalOptions: ['spacingBottom', 'spacingTop', 'width', 'colorScheme'],
12
+ globalOptions: [
13
+ 'spacingBottom',
14
+ 'spacingTop',
15
+ 'width',
16
+ 'colorScheme',
17
+ 'showCaptions',
18
+ ],
13
19
  })
14
-
15
20
  </script>
@@ -47,7 +47,7 @@ const props = defineProps<{
47
47
  const button = tv({
48
48
  base: themedClass(
49
49
  'buttonBase',
50
- 'cursor-pointer font-medium py-3 px-10 duration-200 ease-in-out block w-full md:w-fit',
50
+ 'cursor-pointer font-medium py-3 px-10 block w-full md:w-fit motion-safe:transition-colors motion-safe:duration-200 motion-safe:ease-in-out',
51
51
  ),
52
52
  variants: {
53
53
  colorScheme: {
@@ -126,7 +126,7 @@ const button = tv({
126
126
  style: 'normal',
127
127
  class: themedClass(
128
128
  'buttonCompoundVariantsDarkNormal',
129
- 'bg-gray-950 text-white hover:bg-white hover:text-gray-950 border-white',
129
+ 'bg-gray-950 text-gray-200 hover:bg-white hover:text-gray-950 border-gray-200',
130
130
  ),
131
131
  },
132
132
  {
@@ -142,7 +142,7 @@ const button = tv({
142
142
  style: 'minimal',
143
143
  class: themedClass(
144
144
  'buttonCompoundVariantsDarkMinimal',
145
- 'text-primary hover:text-white',
145
+ 'text-primary hover:text-gray-200',
146
146
  ),
147
147
  },
148
148
 
@@ -30,28 +30,52 @@ const props = withDefaults(
30
30
  const containerClassList = computed(() => {
31
31
  const classList = []
32
32
  if (props.colorScheme === 'none') {
33
- classList.push('bg-white text-gray-950')
33
+ classList.push(
34
+ themedClass(
35
+ 'containerClassListColorSchemeNone',
36
+ 'bg-white text-gray-950',
37
+ ),
38
+ )
34
39
  }
35
40
  if (props.colorScheme === 'dark') {
36
- classList.push('bg-gray-950 text-white')
41
+ classList.push(
42
+ themedClass(
43
+ 'containerClassListColorSchemeDark',
44
+ 'bg-gray-950 text-gray-200',
45
+ ),
46
+ )
37
47
  }
38
48
  if (props.colorScheme === 'light') {
39
- classList.push('bg-gray-50 text-gray-950')
49
+ classList.push(
50
+ themedClass(
51
+ 'containerClassListColorSchemeLight',
52
+ 'bg-gray-50 text-gray-950',
53
+ ),
54
+ )
40
55
  }
41
56
  if (props.colorScheme === 'accent') {
42
- classList.push('bg-primary-600 text-white')
57
+ classList.push(
58
+ themedClass(
59
+ 'containerClassListColorSchemeAccent',
60
+ 'bg-primary-600 text-white',
61
+ ),
62
+ )
43
63
  }
44
64
  if (props.spacing.top === 'small') {
45
- classList.push('pt-16')
65
+ classList.push(themedClass('containerClassListSpacingTopSmall', 'pt-16'))
46
66
  }
47
67
  if (props.spacing.top === 'large') {
48
- classList.push('pt-24 md:pt-32')
68
+ classList.push(
69
+ themedClass('containerClassListSpacingTopLarge', 'pt-24 md:pt-32'),
70
+ )
49
71
  }
50
72
  if (props.spacing.bottom === 'small') {
51
- classList.push('pb-16')
73
+ classList.push(themedClass('containerClassListSpacingBottomSmall', 'pb-16'))
52
74
  }
53
75
  if (props.spacing.bottom === 'large') {
54
- classList.push('pb-24 md:pb-32')
76
+ classList.push(
77
+ themedClass('containerClassListSpacingBottomLarge', 'pb-24 md:pb-32'),
78
+ )
55
79
  }
56
80
  return classList.join(' ')
57
81
  })
@@ -17,7 +17,7 @@
17
17
  <Media
18
18
  v-if="image"
19
19
  :media="image"
20
- imageAspectRatios="4/3"
20
+ imageAspectRatios="16/9"
21
21
  imageSizes="xs:100vw sm:100vw md:50vw lg:50vw"
22
22
  :mediaClass="themedClass('mediaClass')"
23
23
  :figcaptionClass="themedClass('figcaptionClass')"
@@ -46,7 +46,7 @@ const iconText = tv({
46
46
  none: themedClass('iconTextVariantsColorSchemeNone', 'bg-gray-50'),
47
47
  dark: themedClass(
48
48
  'iconTextVariantsColorSchemeDark',
49
- 'bg-gray-900 text-white',
49
+ 'bg-gray-900 text-gray-200',
50
50
  ),
51
51
  light: themedClass('iconTextVariantsColorSchemeLight', 'bg-white'),
52
52
  accent: themedClass(
@@ -132,7 +132,7 @@ const carouselButton = tv({
132
132
  ),
133
133
  dark: themedClass(
134
134
  'carouselButtonVariantsColorSchemeDark',
135
- 'bg-gray-900 text-white hover:bg-black',
135
+ 'bg-gray-900 text-gray-200 hover:bg-black',
136
136
  ),
137
137
  light: themedClass(
138
138
  'carouselButtonVariantsColorSchemeLight',
@@ -53,11 +53,11 @@ const partnershipElement = tv({
53
53
  'bg-gray-900',
54
54
  ),
55
55
  light: themedClass(
56
- 'partnershipElementBaseVariantsColorSchemeLight',
56
+ 'partnershipElementVariantsColorSchemeLight',
57
57
  'bg-white',
58
58
  ),
59
59
  accent: themedClass(
60
- 'partnershipElementBaseVariantsColorSchemeAccent',
60
+ 'partnershipElementVariantsColorSchemeAccent',
61
61
  'bg-primary-700',
62
62
  ),
63
63
  },
@@ -9,7 +9,7 @@
9
9
  "
10
10
  >
11
11
  <thead>
12
- <tr>
12
+ <tr :class="themedClass('tableHeaderRowClass')">
13
13
  <th
14
14
  v-for="(header, index) in tableHeaders"
15
15
  :key="index"
@@ -142,7 +142,7 @@ const caption = tv({
142
142
  variants: {
143
143
  colorScheme: {
144
144
  none: themedClass('tableCaptionVariantsColorSchemeNone', 'text-gray-400'),
145
- dark: themedClass('tableCaptionVariantsColorSchemeDark', 'text-white'),
145
+ dark: themedClass('tableCaptionVariantsColorSchemeDark', 'text-gray-200'),
146
146
  light: themedClass(
147
147
  'tableCaptionVariantsColorSchemeLight',
148
148
  'text-gray-500',
@@ -14,8 +14,8 @@
14
14
  <DesignSystemMoleculesMediaSlider
15
15
  v-if="media && media.length"
16
16
  :media="media"
17
- imageAspectRatios="4/3"
18
- imageSizes="xs:100vw sm:100vw md:50vw lg:50vw"
17
+ :imageAspectRatios="imageAspectRatios"
18
+ :imageSizes="imageSizes"
19
19
  :colorScheme="colorScheme"
20
20
  :mediaClass="themedClass('mediaClass')"
21
21
  :containerClass="themedClass('mediaContainerClass')"
@@ -14,7 +14,7 @@
14
14
  v-if="image"
15
15
  :media="image"
16
16
  imageSizes="xs:100vw sm:100vw md:100vw lg:100vw"
17
- imageAspectRatios="xs:1/1 md:16/9"
17
+ imageAspectRatios="xs:1/1 sm:1/1 md:16/9 lg:16/9"
18
18
  :mediaClass="
19
19
  themedClass('mediaClass', 'header-grid-item max-h-[1080px] h-full')
20
20
  "
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div :class="themedClass('resultsContainerClass', 'mt-10 md:mt-20')">
2
+ <div :class="themedClass('resultsContainerClass', 'mt-10')">
3
3
  <p
4
4
  v-if="results && 'label' in results && results.label"
5
5
  :class="themedClass('resultLabelClass', 'h3 mb-4')"
@@ -5,7 +5,7 @@
5
5
  v-if="image"
6
6
  :media="image"
7
7
  imageSizes="xs:100vw sm:100vw md:420px lg:420px"
8
- imageAspectRatios="4/3"
8
+ imageAspectRatios="16/9"
9
9
  :mediaClass="themedClass('mediaClass', '@xl:w-1/2')"
10
10
  :figcaptionClass="themedClass('figcaptionClass')"
11
11
  :elementClass="themedClass('elementClass', 'w-full')"
@@ -25,7 +25,7 @@
25
25
  :pretitleClass="
26
26
  themedClass(
27
27
  'pretitleClass',
28
- 'mb-2 text-base lg:text-base font-medium',
28
+ 'mb-1 text-base lg:text-base font-medium',
29
29
  )
30
30
  "
31
31
  :title="title"
@@ -105,7 +105,10 @@ const authorDivider = tv({
105
105
  variants: {
106
106
  colorScheme: {
107
107
  none: themedClass('authorDividerVariantsColorSchemeNone', 'border-black'),
108
- dark: themedClass('authorDividerVariantsColorSchemeDark', 'border-white'),
108
+ dark: themedClass(
109
+ 'authorDividerVariantsColorSchemeDark',
110
+ 'border-gray-200',
111
+ ),
109
112
  light: themedClass(
110
113
  'authorDividerVariantsColorSchemeLight',
111
114
  'border-black',
@@ -44,7 +44,7 @@
44
44
  colorScheme="none"
45
45
  :containerClass="themedClass('mediaContainerClass', 'my-0')"
46
46
  imageSizes="xs:750px"
47
- imageAspectRatios="3/2"
47
+ imageAspectRatios="16/9"
48
48
  :mediaClass="themedClass('mediaClass', 'my-0')"
49
49
  :figcaptionClass="themedClass('figcaptionClass')"
50
50
  :elementClass="themedClass('elementClass')"
@@ -1,15 +1,20 @@
1
1
  <template>
2
2
  <div :class="themedClass('wrapperClass')">
3
3
  <Transition name="fade">
4
- <div v-if="!submitted && !showThankYou && !showError" :class="themedClass('formWrapperClass')">
4
+ <div
5
+ v-if="!submitted && !showThankYou && !showError"
6
+ :class="themedClass('formWrapperClass')"
7
+ >
5
8
  <FormKit
6
9
  type="form"
7
10
  :actions="false"
8
11
  :messages-class="themedClass('messagesClass', 'mt-2')"
9
- :incomplete-message="$texts(
10
- 'webform.submission_validation_incomplete',
11
- 'Please fill in all required fields.',
12
- )"
12
+ :incomplete-message="
13
+ $texts(
14
+ 'webform.submission_validation_incomplete',
15
+ 'Please fill in all required fields.',
16
+ )
17
+ "
13
18
  use-local-storage
14
19
  @submit="submitWebform"
15
20
  >
@@ -18,7 +23,6 @@
18
23
  :key="formElement?.metadata?.key"
19
24
  :class="themedClass('elementWrapperClass')"
20
25
  >
21
-
22
26
  <NuxtTurnstile
23
27
  v-model="token"
24
28
  v-if="formElement?.metadata?.key === 'actions'"
@@ -38,7 +42,12 @@
38
42
  <Transition name="fade">
39
43
  <div
40
44
  v-if="showThankYou"
41
- :class="themedClass('successMessageClass', 'mb-4 rounded-lg border border-success-500 px-6 py-4 text-success-500')"
45
+ :class="
46
+ themedClass(
47
+ 'successMessageClass',
48
+ 'border-success-500 text-success-500 mb-4 rounded-lg border px-6 py-4',
49
+ )
50
+ "
42
51
  >
43
52
  <p>
44
53
  {{
@@ -54,7 +63,12 @@
54
63
  <Transition name="fade">
55
64
  <div
56
65
  v-if="showError"
57
- :class="themedClass('errorMessageClass', 'mb-4 rounded-lg border border-error-500 px-6 py-4 text-error-500')"
66
+ :class="
67
+ themedClass(
68
+ 'errorMessageClass',
69
+ 'border-error-500 text-error-500 mb-4 rounded-lg border px-6 py-4',
70
+ )
71
+ "
58
72
  >
59
73
  <p>
60
74
  {{
@@ -111,12 +125,13 @@ const submitted = ref(false)
111
125
  const showThankYou = ref(false)
112
126
  const showError = ref(false)
113
127
 
114
- const queryKey = `drupalWebform-${props?.formId || '0'}`;
128
+ const queryKey = `drupalWebform-${props?.formId || '0'}`
129
+
115
130
  const { data: formDefinition } = await useAsyncData(queryKey, async () => {
116
- return await useGraphqlQuery('webformById', { id: props?.formId }).then(
117
- (v) => v?.data?.webformById || { elements: [] }
118
- )
119
- })
131
+ return await useGraphqlQuery('webformById', { id: props?.formId }).then(
132
+ (v) => v?.data?.webformById || { elements: [] },
133
+ )
134
+ })
120
135
 
121
136
  async function submitWebform(data: FormData) {
122
137
  try {
@@ -1,5 +1,5 @@
1
- query webformById($id: ID!) {
2
- webformById(id: "contact") {
1
+ query webformById($id: String!) {
2
+ webformById(id: $id) {
3
3
  label
4
4
  id
5
5
  elements {
@@ -9,6 +9,7 @@
9
9
  :class="themedClass('rowClass')"
10
10
  >
11
11
  <div
12
+ v-if="pretitle || title"
12
13
  :class="themedClass('firstColumnClass', 'col-span-12 md:col-span-9')"
13
14
  >
14
15
  <DesignSystemOrganismsContentBlock
@@ -22,6 +23,7 @@
22
23
  />
23
24
  </div>
24
25
  <div
26
+ v-if="subtitle || text"
25
27
  :class="themedClass('secondColumnClass', 'col-span-12 md:col-span-9')"
26
28
  >
27
29
  <DesignSystemOrganismsContentBlock
@@ -39,12 +41,12 @@
39
41
  :list="cards"
40
42
  :class="[
41
43
  themedClass(
42
- 'cardsContainerClass',
44
+ 'buttonsContainerClass',
43
45
  'grid-3-col container mx-auto grid gap-x-6 gap-y-12',
44
46
  ),
45
47
  { droptarget: isEditing },
46
48
  {
47
- [themedClass('buttonsContainerOffsetClass', 'mt-10 md:mt-20')]:
49
+ [themedClass('buttonsContainerOffsetClass', 'mt-10')]:
48
50
  pretitle || title,
49
51
  },
50
52
  ]"
@@ -58,7 +58,7 @@
58
58
  >
59
59
  <DrupalWebform
60
60
  v-if="contactWebform?.id"
61
- :form-id="contactWebform?.id"
61
+ :formId="contactWebform?.id"
62
62
  :wrapperClass="themedClass('wrapperClass')"
63
63
  :formWrapperClass="themedClass('formWrapperClass')"
64
64
  :messagesClass="themedClass('messagesClass')"
@@ -74,7 +74,7 @@
74
74
  import type { ParagraphIcmsLayoutContactFragment } from '#graphql-operations'
75
75
  import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
76
76
 
77
- defineProps<ParagraphIcmsLayoutContactFragment>()
77
+ const props = defineProps<ParagraphIcmsLayoutContactFragment>()
78
78
 
79
79
  const { options, isEditing } = useAttrs().blokkliData
80
80
 
@@ -97,7 +97,7 @@ const download = tv({
97
97
  none: themedClass('downloadVariantsColorSchemeNone', 'bg-gray-50'),
98
98
  dark: themedClass(
99
99
  'downloadVariantsColorSchemeDark',
100
- 'bg-gray-900 text-white',
100
+ 'bg-gray-900 text-gray-200',
101
101
  ),
102
102
  light: themedClass('downloadVariantsColorSchemeLight', 'bg-white'),
103
103
  accent: themedClass(
@@ -59,7 +59,7 @@ const accordionTrigger = tv({
59
59
  ),
60
60
  dark: themedClass(
61
61
  'accordionVariantsColorSchemeDark',
62
- 'bg-gray-900 text-white',
62
+ 'bg-gray-900 text-gray-200',
63
63
  ),
64
64
  light: themedClass(
65
65
  'accordionVariantsColorSchemeLight',
@@ -39,9 +39,7 @@
39
39
  </DesignSystemAtomsGridRow>
40
40
 
41
41
  <DesignSystemAtomsGridRow
42
- :class="
43
- themedClass('secondRowClass', pretitle || title ? 'mt-10 md:mt-20' : '')
44
- "
42
+ :class="themedClass('secondRowClass', pretitle || title ? 'mt-10' : '')"
45
43
  >
46
44
  <DesignSystemOrganismsFlipTeaser
47
45
  v-for="flipTeaser in flipTeasers"
@@ -38,9 +38,7 @@
38
38
 
39
39
  <DesignSystemAtomsGridRow
40
40
  v-if="media?.length"
41
- :class="
42
- themedClass('secondRowClass', pretitle || title ? 'mt-10 md:mt-20' : '')
43
- "
41
+ :class="themedClass('secondRowClass', pretitle || title ? 'mt-10' : '')"
44
42
  >
45
43
  <div
46
44
  v-for="(image, index) in media"
@@ -24,7 +24,7 @@
24
24
  <Media
25
25
  v-if="medium"
26
26
  :media="medium"
27
- imageAspectRatios="xs:1/1 md:16/9"
27
+ imageAspectRatios="xs:1/1 sm:1/1 md:16/9 lg:16/9 xl:16/9 xxl:16/9"
28
28
  imageSizes="xs:100vw sm:100vw md:100vw lg:100vw xl:100vw xxl:100vw"
29
29
  imageLoading="eager"
30
30
  :videoControls="false"
@@ -18,7 +18,7 @@
18
18
  <Media
19
19
  v-if="image"
20
20
  :media="image"
21
- imageAspectRatios="1/1"
21
+ imageAspectRatios="16/9"
22
22
  imageSizes="xs:100vw sm:100vw md:320px lg:380px"
23
23
  :mediaClass="themedClass('mediaClass')"
24
24
  :elementClass="themedClass('elementClass')"
@@ -9,6 +9,8 @@
9
9
  <DesignSystemMoleculesMediaSlider
10
10
  v-if="media && media.length > 1"
11
11
  :media="media"
12
+ :imageSizes="imageSizes"
13
+ :imageAspectRatios="imageAspectRatios"
12
14
  :containerClass="themedClass('mediaSliderContainerClass', 'my-0')"
13
15
  :mediaClass="themedClass('mediaSliderMediaClass')"
14
16
  :elementClass="
@@ -25,17 +27,18 @@
25
27
  themedClass('mediaSliderCarouselButtonNextClass')
26
28
  "
27
29
  colorScheme="none"
28
- showCaption
30
+ :showCaption="showCaptions"
29
31
  />
30
32
 
31
33
  <Media
32
34
  v-else-if="media && media.length === 1 && media[0]"
33
35
  :media="media[0]"
34
36
  :imageSizes="imageSizes"
37
+ :imageAspectRatios="imageAspectRatios"
35
38
  :mediaClass="themedClass('mediaMediaClass')"
36
39
  :elementClass="themedClass('mediaElementClass')"
37
40
  :figcaptionClass="themedClass('mediaFigcaptionClass')"
38
- showCaption
41
+ :showCaption="showCaptions"
39
42
  />
40
43
  </div>
41
44
  </div>
@@ -60,6 +63,10 @@ const spacing = computed(() => {
60
63
  return { bottom: options.value.spacingBottom, top: options.value.spacingTop }
61
64
  })
62
65
 
66
+ const showCaptions = computed(() => {
67
+ return options.value.showCaptions
68
+ })
69
+
63
70
  const rowClassList = computed(() => {
64
71
  const classList = ['grid grid-cols-12 gap-6']
65
72
  if (options.value.width === 'full') {
@@ -82,6 +89,18 @@ const imageSizes = computed(() => {
82
89
  return 'xs:100vw sm:100vw md:50vw lg:640px'
83
90
  })
84
91
 
92
+ const imageAspectRatios = computed(() => {
93
+ if (options.value.width === 'full') {
94
+ return '3/1'
95
+ }
96
+
97
+ if (options.value.width === 'page') {
98
+ return '16/9'
99
+ }
100
+
101
+ return '4/3'
102
+ })
103
+
85
104
  const columnClassList = computed(() => {
86
105
  const classList = ['col-span-12']
87
106
 
@@ -50,7 +50,7 @@
50
50
  <Media
51
51
  v-if="image"
52
52
  :media="image"
53
- imageAspectRatios="xs:16/9 md:1/1 lg:16/9"
53
+ imageAspectRatios="xs:16/9 sm:16/9 md:1/1 lg:16/9"
54
54
  imageSizes="xs:100vw sm:100vw md:50vw lg:600px"
55
55
  :mediaClass="themedClass('mediaClass')"
56
56
  :elementClass="themedClass('elementClass')"
@@ -156,7 +156,7 @@ const bulletPoint = tv({
156
156
  variants: {
157
157
  colorScheme: {
158
158
  none: themedClass('bulletPointVariantsColorSchemeNone', 'text-gray-950'),
159
- dark: themedClass('bulletPointVariantsColorSchemeDark', 'text-white'),
159
+ dark: themedClass('bulletPointVariantsColorSchemeDark', 'text-gray-200'),
160
160
  light: themedClass(
161
161
  'bulletPointVariantsColorSchemeLight',
162
162
  'text-gray-950',
@@ -38,7 +38,7 @@
38
38
  :class="
39
39
  themedClass(
40
40
  'secondRowClass',
41
- pretitle || title || subtitle || text ? 'mt-10 md:mt-20' : '',
41
+ pretitle || title || subtitle || text ? 'mt-10' : '',
42
42
  )
43
43
  "
44
44
  >
@@ -63,7 +63,7 @@ const tabContent = tv({
63
63
  ),
64
64
  dark: themedClass(
65
65
  'tabContentVariantsColorSchemeDark',
66
- 'bg-gray-900 text-white',
66
+ 'bg-gray-900 text-gray-200',
67
67
  ),
68
68
  light: themedClass(
69
69
  'tabContentVariantsColorSchemeLight',
@@ -179,7 +179,7 @@ const tabTrigger = tv({
179
179
  ),
180
180
  dark: themedClass(
181
181
  'tabTriggerVariantsColorSchemeDark',
182
- 'bg-gray-800 dark:bg-gray-800 text-white dark:text-white data-[state=active]:bg-gray-900 dark:data-[state=active]:bg-gray-900 data-[state=active]:text-white border-gray-950',
182
+ 'bg-gray-800 dark:bg-gray-800 text-gray-200 dark:text-gray-200 data-[state=active]:bg-gray-900 dark:data-[state=active]:bg-gray-900 data-[state=active]:text-gray-200 border-gray-950',
183
183
  ),
184
184
  light: themedClass(
185
185
  'tabTriggerVariantsColorSchemeLight',
@@ -203,7 +203,7 @@ const tabContent = tv({
203
203
  ),
204
204
  dark: themedClass(
205
205
  'tabContentVariantsColorSchemeDark',
206
- 'bg-gray-900 text-white',
206
+ 'bg-gray-900 text-gray-200',
207
207
  ),
208
208
  light: themedClass(
209
209
  'tabContentVariantsColorSchemeLight',
@@ -230,7 +230,7 @@ const accordionTrigger = tv({
230
230
  ),
231
231
  dark: themedClass(
232
232
  'accordionVariantsColorSchemeDark',
233
- 'bg-gray-900 text-white',
233
+ 'bg-gray-900 text-gray-200',
234
234
  ),
235
235
  light: themedClass(
236
236
  'accordionVariantsColorSchemeLight',
@@ -42,7 +42,7 @@
42
42
  themedClass(
43
43
  'teamElementsContainerClass',
44
44
  pretitle || title || subtitle || text
45
- ? 'container mx-auto mt-10 grid gap-6 md:mt-20 md:gap-12'
45
+ ? 'container mx-auto mt-10 grid gap-6 md:gap-12'
46
46
  : 'container mx-auto grid gap-6 md:gap-12',
47
47
  ),
48
48
  { droptarget: isEditing },
@@ -44,7 +44,7 @@
44
44
  themedClass(
45
45
  'secondRowClass',
46
46
  pretitle || title || subtitle || text
47
- ? 'grid-4-col mt-10 gap-y-12 md:mt-20'
47
+ ? 'grid-4-col mt-10 gap-y-12'
48
48
  : 'grid-4-col gap-y-12',
49
49
  )
50
50
  "
@@ -106,7 +106,7 @@ const carousel = tv({
106
106
  none: themedClass('carouselVariantsColorSchemeNone', 'bg-gray-50'),
107
107
  dark: themedClass(
108
108
  'carouselVariantsColorSchemeDark',
109
- 'bg-gray-900 text-white',
109
+ 'bg-gray-900 text-gray-200',
110
110
  ),
111
111
  light: themedClass('carouselVariantsColorSchemeLight', 'bg-white'),
112
112
  accent: themedClass(
@@ -133,7 +133,7 @@ const carouselButton = tv({
133
133
  ),
134
134
  dark: themedClass(
135
135
  'carouselButtonVariantsColorSchemeDark',
136
- 'bg-gray-800 text-white hover:bg-gray-950 dark:bg-gray-800 dark:text-white hover:dark:bg-gray-950',
136
+ 'bg-gray-800 text-gray-200 hover:bg-gray-950 dark:bg-gray-800 dark:text-gray-200 hover:dark:bg-gray-950',
137
137
  ),
138
138
  light: themedClass(
139
139
  'carouselButtonVariantsColorSchemeLight',
@@ -144,11 +144,11 @@ const imageAspectRatios = computed(() => {
144
144
 
145
145
  switch (width) {
146
146
  case 'narrow':
147
- return '3/2'
147
+ return '2/1'
148
148
  case 'medium':
149
- return '4/3'
149
+ return '16/9'
150
150
  default:
151
- return '1/1'
151
+ return '3/2'
152
152
  }
153
153
  })
154
154
 
@@ -38,9 +38,7 @@
38
38
  </div>
39
39
  </DesignSystemAtomsGridRow>
40
40
 
41
- <DesignSystemAtomsGridRow
42
- :class="themedClass('secondRowClass', 'mt-10 lg:mt-20')"
43
- >
41
+ <DesignSystemAtomsGridRow :class="themedClass('secondRowClass', 'mt-10')">
44
42
  <!-- Anchor navigation -->
45
43
  <div
46
44
  :class="
@@ -147,7 +145,7 @@
147
145
  cn(
148
146
  themedClass(
149
147
  'carouselButtonPrevClass',
150
- '-bottom-[90px] left-0 top-auto xl:bottom-auto xl:left-16 xl:top-1/2',
148
+ '-bottom-[90px] left-0 top-auto',
151
149
  ),
152
150
  carouselButton({ colorScheme }),
153
151
  )
@@ -164,7 +162,7 @@
164
162
  cn(
165
163
  themedClass(
166
164
  'carouselButtonNextClass',
167
- '-bottom-[90px] left-[66px] top-auto xl:bottom-auto xl:left-auto xl:right-16 xl:top-1/2',
165
+ '-bottom-[90px] left-[66px] top-auto',
168
166
  ),
169
167
  carouselButton({ colorScheme }),
170
168
  )
@@ -364,7 +362,7 @@ const carouselButton = tv({
364
362
  ),
365
363
  dark: themedClass(
366
364
  'carouselButtonVariantsColorSchemeDark',
367
- 'bg-gray-800 text-white dark:bg-gray-800 dark:text-white',
365
+ 'bg-gray-800 text-gray-200 dark:bg-gray-800 dark:text-gray-200',
368
366
  ),
369
367
  light: themedClass(
370
368
  'carouselButtonVariantsColorSchemeLight',
@@ -418,7 +416,7 @@ const decorativeCircle = tv({
418
416
  ),
419
417
  dark: themedClass(
420
418
  'decorativeCircleVariantsColorSchemeDark',
421
- 'border-white bg-gray-950',
419
+ 'border-gray-200 bg-gray-950',
422
420
  ),
423
421
  light: themedClass(
424
422
  'decorativeCircleVariantsColorSchemeLight',
@@ -398,7 +398,7 @@ const popoverTrigger = tv({
398
398
  ),
399
399
  dark: themedClass(
400
400
  'popoverTriggerVariantsColorSchemeDark',
401
- 'bg-gray-900 text-white border-gray-800 focus-visible:ring-primary',
401
+ 'bg-gray-900 text-gray-200 border-gray-800 focus-visible:ring-primary',
402
402
  ),
403
403
  light: themedClass(
404
404
  'popoverTriggerVariantsColorSchemeLight',
@@ -471,7 +471,7 @@ const resultsCount = tv({
471
471
  variants: {
472
472
  colorScheme: {
473
473
  none: themedClass('resultsTextVariantsColorSchemeNone', 'text-black'),
474
- dark: themedClass('resultsTextVariantsColorSchemeDark', 'text-white'),
474
+ dark: themedClass('resultsTextVariantsColorSchemeDark', 'text-gray-200'),
475
475
  light: themedClass('resultsTextVariantsColorSchemeLight', 'text-black'),
476
476
  accent: themedClass('resultsTextVariantsColorSchemeAccent', 'text-white'),
477
477
  },
@@ -545,7 +545,7 @@ const checkbox = tv({
545
545
  ),
546
546
  dark: themedClass(
547
547
  'checkboxVariantsColorSchemeDark',
548
- 'text-white border-gray-800 dark:border-gray-800 bg-gray-800 dark:bg-gray-800 data-[state=checked]:bg-primary dark:data-[state=checked]:bg-primary text-white dark:text-white data-[state=checked]:text-white dark:data-[state=checked]:text-white data-[state=checked]:border-primary dark:data-[state=checked]:border-primary',
548
+ 'text-gray-200 border-gray-800 dark:border-gray-800 bg-gray-800 dark:bg-gray-800 data-[state=checked]:bg-primary dark:data-[state=checked]:bg-primary text-gray-200 dark:text-gray-200 data-[state=checked]:text-gray-200 dark:data-[state=checked]:text-gray-200 data-[state=checked]:border-primary dark:data-[state=checked]:border-primary',
549
549
  ),
550
550
  light: themedClass(
551
551
  'checkboxVariantsColorSchemeLight',
@@ -599,7 +599,7 @@ const filterOptionLabel = tv({
599
599
  ),
600
600
  dark: themedClass(
601
601
  'filterOptionLabelVariantsColorSchemeDark',
602
- 'text-white',
602
+ 'text-gray-200',
603
603
  ),
604
604
  light: themedClass(
605
605
  'filterOptionLabelVariantsColorSchemeLight',
@@ -623,7 +623,7 @@ const filterOptionCount = tv({
623
623
  ),
624
624
  dark: themedClass(
625
625
  'filterOptionCountVariantsColorSchemeDark',
626
- 'text-white',
626
+ 'text-gray-200',
627
627
  ),
628
628
  light: themedClass(
629
629
  'filterOptionCountVariantsColorSchemeLight',
@@ -174,7 +174,7 @@ Facets: {{ facetData.length }} items</pre
174
174
  :class="
175
175
  themedClass(
176
176
  'globalLoadMoreButtonContainer',
177
- 'mt-10 flex justify-center lg:mt-20',
177
+ 'mt-10 flex justify-center',
178
178
  )
179
179
  "
180
180
  >
@@ -794,7 +794,7 @@ const button = tv({
794
794
  ),
795
795
  dark: themedClass(
796
796
  'buttonVariantsColorSchemeDark',
797
- 'bg-white text-black hover:bg-black hover:text-white border-black',
797
+ 'bg-white text-black hover:bg-black hover:text-gray-200 border-black',
798
798
  ),
799
799
  light: themedClass(
800
800
  'buttonVariantsColorSchemeLight',
@@ -85,7 +85,7 @@ const icon = tv({
85
85
  variants: {
86
86
  colorScheme: {
87
87
  none: themedClass('iconVariantsColorSchemeNone', 'text-primary'),
88
- dark: themedClass('iconVariantsColorSchemeDark', 'text-white'),
88
+ dark: themedClass('iconVariantsColorSchemeDark', 'text-gray-200'),
89
89
  light: themedClass('iconVariantsColorSchemeLight', 'text-primary'),
90
90
  accent: themedClass('iconVariantsColorSchemeAccent', 'text-black'),
91
91
  },
@@ -137,7 +137,7 @@
137
137
  :class="
138
138
  themedClass(
139
139
  'phoneNumberClass',
140
- 'hover:text-primary mb-2 block w-fit font-medium text-black motion-safe:transition-colors motion-safe:duration-200',
140
+ 'hover:text-primary mb-2 block w-fit font-medium motion-safe:transition-colors motion-safe:duration-200',
141
141
  )
142
142
  "
143
143
  >
@@ -150,7 +150,7 @@
150
150
  :class="
151
151
  themedClass(
152
152
  'emailAddressClass',
153
- 'hover:text-primary mb-2 block w-fit font-medium text-black motion-safe:transition-colors motion-safe:duration-200',
153
+ 'hover:text-primary mb-2 block w-fit font-medium motion-safe:transition-colors motion-safe:duration-200',
154
154
  )
155
155
  "
156
156
  >
@@ -1,10 +1,18 @@
1
1
  <template>
2
2
  <nav
3
3
  :aria-label="$texts('main_menu.nav_aria_label', 'Main navigation')"
4
- :class="themedClass('containerClass', 'flex h-full')"
4
+ :class="
5
+ themedClass(
6
+ 'containerClass',
7
+ 'ml-auto hidden empty:hidden 2xl:flex 2xl:h-full 2xl:items-center',
8
+ )
9
+ "
5
10
  >
6
11
  <ul
7
- :class="themedClass('listClass', 'flex items-stretch justify-end gap-8')"
12
+ v-if="menuItems.length"
13
+ :class="
14
+ themedClass('listClass', 'flex h-full items-stretch justify-end gap-8')
15
+ "
8
16
  >
9
17
  <li
10
18
  v-for="item in menuItems"
@@ -28,7 +36,7 @@
28
36
  'submenuToggleClass',
29
37
  'size-5 shrink-0 cursor-pointer text-black motion-safe:transition-transform motion-safe:duration-300',
30
38
  ),
31
- { 'rotate-180': isOpen(item) },
39
+ { 'motion-safe:rotate-180': isOpen(item) },
32
40
  ]"
33
41
  />
34
42
  </component>
@@ -37,30 +45,34 @@
37
45
  :enter-active-class="
38
46
  themedClass(
39
47
  'transitionEnterActiveClass',
40
- 'transition-opacity duration-200 ease-in-out',
48
+ 'motion-safe:transition-opacity motion-safe:duration-200 motion-safe:ease-in-out',
41
49
  )
42
50
  "
43
51
  :enter-from-class="
44
- themedClass('transitionEnterFromClass', 'opacity-0')
52
+ themedClass('transitionEnterFromClass', 'motion-safe:opacity-0')
53
+ "
54
+ :enter-to-class="
55
+ themedClass('transitionEnterToClass', 'motion-safe:opacity-100')
45
56
  "
46
- :enter-to-class="themedClass('transitionEnterToClass', 'opacity-100')"
47
57
  :leave-active-class="
48
58
  themedClass(
49
59
  'transitionLeaveActiveClass',
50
- 'transition-opacity duration-200 ease-in-out',
60
+ 'motion-safe:transition-opacity motion-safe:duration-200 motion-safe:ease-in-out',
51
61
  )
52
62
  "
53
63
  :leave-from-class="
54
- themedClass('transitionLeaveFromClass', 'opacity-100')
64
+ themedClass('transitionLeaveFromClass', 'motion-safe:opacity-100')
65
+ "
66
+ :leave-to-class="
67
+ themedClass('transitionLeaveToClass', 'motion-safe:opacity-0')
55
68
  "
56
- :leave-to-class="themedClass('transitionLeaveToClass', 'opacity-0')"
57
69
  >
58
70
  <ul
59
71
  v-if="hasSubmenu(item) && isOpen(item)"
60
72
  :id="submenuId(item)"
61
73
  :class="
62
74
  themedClass(
63
- 'submenulistClass',
75
+ 'submenuListClass',
64
76
  'absolute left-0 top-full w-fit min-w-48 border border-gray-100 bg-white',
65
77
  )
66
78
  "
@@ -79,7 +91,7 @@
79
91
  <script lang="ts" setup>
80
92
  import type { MappedMenuLink } from '@iqual/nuxt-icms/plugins/initData'
81
93
  import { NuxtLink } from '#components'
82
- import DesktopMainMenuDropdown from './DesktopMainMenuDropdown.vue'
94
+ import DesktopMainMenuDropdown from '@iqual/nuxt-icms/components/Section/Header/DesktopMainMenuDropdown.vue'
83
95
  import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
84
96
  import cn from '@iqual/nuxt-icms/composables/useCn'
85
97
 
@@ -122,11 +134,11 @@ function componentAttrs(item: MappedMenuLink) {
122
134
  class: cn(
123
135
  themedClass(
124
136
  'linkClass',
125
- 'flex items-center justify-between gap-1 hover:text-primary duration-200 whitespace-normal break-keep hyphens-none',
137
+ 'flex items-center justify-between gap-1 hover:text-primary motion-safe:transition-colors motion-safe:duration-200 whitespace-normal break-keep hyphens-none',
126
138
  ),
127
139
  item.additionalClass,
128
140
  ),
129
- 'exact-active-class': 'text-primary',
141
+ 'exact-active-class': themedClass('linkActiveClass', 'text-primary'),
130
142
  }
131
143
 
132
144
  case 'button':
@@ -34,19 +34,27 @@
34
34
  :enter-active-class="
35
35
  themedClass(
36
36
  'transitionEnterActiveClass',
37
- 'transition-opacity duration-200 ease-in-out',
37
+ 'motion-safe:transition-opacity motion-safe:duration-200 motion-safe:ease-in-out',
38
38
  )
39
39
  "
40
- :enter-from-class="themedClass('transitionEnterFromClass', 'opacity-0')"
41
- :enter-to-class="themedClass('transitionEnterToClass', 'opacity-100')"
40
+ :enter-from-class="
41
+ themedClass('transitionEnterFromClass', 'motion-safe:opacity-0')
42
+ "
43
+ :enter-to-class="
44
+ themedClass('transitionEnterToClass', 'motion-safe:opacity-100')
45
+ "
42
46
  :leave-active-class="
43
47
  themedClass(
44
48
  'transitionLeaveActiveClass',
45
- 'transition-opacity duration-200 ease-in-out',
49
+ 'motion-safe:transition-opacity motion-safe:duration-200 motion-safe:ease-in-out',
46
50
  )
47
51
  "
48
- :leave-from-class="themedClass('transitionLeaveFromClass', 'opacity-100')"
49
- :leave-to-class="themedClass('transitionLeaveToClass', 'opacity-0')"
52
+ :leave-from-class="
53
+ themedClass('transitionLeaveFromClass', 'motion-safe:opacity-100')
54
+ "
55
+ :leave-to-class="
56
+ themedClass('transitionLeaveToClass', 'motion-safe:opacity-0')
57
+ "
50
58
  >
51
59
  <ul
52
60
  v-if="hasSubmenu(child) && isOpen(child)"
@@ -83,9 +91,7 @@ const props = defineProps<{
83
91
  const { item, menuItemActive } = props
84
92
 
85
93
  const hasSubmenu = (child: MappedMenuLink) => (child.children?.length ?? 0) > 0
86
-
87
94
  const submenuId = (child: MappedMenuLink) => `${child.id}-submenu`
88
-
89
95
  const isActive = (child: MappedMenuLink) => menuItemActive?.id === child.id
90
96
 
91
97
  const openMap = ref<Record<string, boolean>>({})
@@ -132,11 +138,11 @@ function componentAttrs(child: MappedMenuLink) {
132
138
  'aria-controls': submenu ? submenuId(child) : undefined,
133
139
  'aria-current': active ? 'page' : undefined,
134
140
  tabindex: 0,
135
- 'exact-active-class': 'text-primary',
141
+ 'exact-active-class': themedClass('linkActiveClass', 'text-primary'),
136
142
  class: cn(
137
143
  themedClass(
138
144
  'linkClass',
139
- 'w-full flex items-center justify-between gap-4 px-6 py-3 hover:text-primary duration-200 whitespace-normal break-keep hyphens-none',
145
+ 'w-full flex items-center justify-between gap-4 px-6 py-3 hover:text-primary motion-safe:transition-colors motion-safe:duration-200 whitespace-normal break-keep hyphens-none',
140
146
  ),
141
147
  child.additionalClass,
142
148
  ),
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <ClientOnly>
3
3
  <div
4
+ v-if="showLanguageLinks"
4
5
  v-click-away="closeDropdown"
5
6
  @keydown.esc="closeDropdown"
6
7
  :class="themedClass('containerClass', 'relative py-2')"
@@ -105,9 +106,14 @@
105
106
  <script lang="ts" setup>
106
107
  import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
107
108
 
109
+ const themedClass = useTheme('SectionHeaderLanguageDropdown')
108
110
  const links = useLanguageLinks()
109
111
  const currentLanguage = useCurrentLanguage()
110
- const themedClass = useTheme('SectionHeaderLanguageDropdown')
112
+
113
+ const showLanguageLinks = computed(() => {
114
+ const list = links.value ?? []
115
+ return list.filter((l) => l.enabled).length > 1
116
+ })
111
117
 
112
118
  const isLangDropdownOpen = ref(false)
113
119
 
@@ -1,6 +1,9 @@
1
1
  <template>
2
2
  <ClientOnly>
3
- <div :class="themedClass('containerClass', 'flex items-center')">
3
+ <div
4
+ v-if="showLanguageLinks"
5
+ :class="themedClass('containerClass', 'flex items-center')"
6
+ >
4
7
  <ul :class="themedClass('listClass', 'flex gap-4 uppercase')">
5
8
  <li
6
9
  v-for="(lang, i) in links"
@@ -34,6 +37,11 @@
34
37
  import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
35
38
  const { close } = useMobileMenuOverlayBus()
36
39
 
37
- const links = useLanguageLinks()
38
40
  const themedClass = useTheme('SectionHeaderLanguageLinks')
41
+
42
+ const links = useLanguageLinks()
43
+ const showLanguageLinks = computed(() => {
44
+ const list = links.value ?? []
45
+ return list.filter((l) => l.enabled).length > 1
46
+ })
39
47
  </script>
@@ -10,6 +10,8 @@
10
10
  v-if="companyLogo"
11
11
  :media="companyLogo"
12
12
  :mediaClass="themedClass('mediaClass', 'h-10 2xl:h-16')"
13
+ :figcaptionClass="themedClass('figcaptionClass')"
14
+ :elementClass="themedClass('elementClass')"
13
15
  />
14
16
  </NuxtLink>
15
17
  </template>
@@ -10,7 +10,7 @@
10
10
  viewBox="0 0 24 24"
11
11
  fill="none"
12
12
  xmlns="http://www.w3.org/2000/svg"
13
- class="size-6 overflow-visible text-black"
13
+ :class="themedClass('hamburgerSvg', 'size-6 overflow-visible text-black')"
14
14
  aria-hidden
15
15
  >
16
16
  <rect
@@ -3,9 +3,10 @@
3
3
  :aria-label="
4
4
  $texts('meta_navigation.nav_aria_label', 'Meta navigation menu')
5
5
  "
6
- :class="themedClass('containerClass')"
6
+ :class="themedClass('containerClass', 'empty:hidden')"
7
7
  >
8
8
  <ul
9
+ v-if="menuItems.length"
9
10
  :class="
10
11
  themedClass(
11
12
  'listClass',
@@ -33,7 +34,7 @@
33
34
  :target="menuItem?.target"
34
35
  :rel="menuItem?.rel"
35
36
  @click="close()"
36
- exact-active-class="text-primary"
37
+ :exact-active-class="themedClass('linkActiveClass', 'text-primary')"
37
38
  :class="
38
39
  cn(
39
40
  themedClass(
@@ -29,37 +29,50 @@
29
29
  :class="[
30
30
  themedClass(
31
31
  'submenuToggleClass',
32
- 'size-5 cursor-pointer motion-safe:transition-transform motion-safe:duration-300',
32
+ 'size-5 cursor-pointer focus:outline-0 focus-visible:outline-2 motion-safe:transition-transform motion-safe:duration-300',
33
33
  ),
34
- { 'rotate-180': isOpen },
34
+ { 'motion-safe:rotate-180': isOpen },
35
35
  ]"
36
36
  />
37
37
  </div>
38
+
38
39
  <Transition
39
40
  v-if="hasSubmenu"
40
41
  :enter-active-class="
41
42
  themedClass(
42
43
  'transitionEnterActiveClass',
43
- 'transition-[max-height,opacity] duration-300 ease-in-out overflow-hidden',
44
+ 'motion-safe:transition-[max-height,opacity] motion-safe:duration-300 motion-safe:ease-in-out overflow-hidden',
44
45
  )
45
46
  "
46
47
  :enter-from-class="
47
- themedClass('transitionEnterFromClass', 'max-h-0 opacity-0')
48
+ themedClass(
49
+ 'transitionEnterFromClass',
50
+ 'motion-safe:max-h-0 motion-safe:opacity-0',
51
+ )
48
52
  "
49
53
  :enter-to-class="
50
- themedClass('transitionEnterToClass', 'max-h-96 opacity-100')
54
+ themedClass(
55
+ 'transitionEnterToClass',
56
+ 'motion-safe:max-h-96 motion-safe:opacity-100',
57
+ )
51
58
  "
52
59
  :leave-active-class="
53
60
  themedClass(
54
61
  'transitionLeaveActiveClass',
55
- 'transition-[max-height,opacity] duration-300 ease-in-out overflow-hidden',
62
+ 'motion-safe:transition-[max-height,opacity] motion-safe:duration-300 motion-safe:ease-in-out overflow-hidden',
56
63
  )
57
64
  "
58
65
  :leave-from-class="
59
- themedClass('transitionLeaveFromClass', 'max-h-96 opacity-100')
66
+ themedClass(
67
+ 'transitionLeaveFromClass',
68
+ 'motion-safe:max-h-96 motion-safe:opacity-100',
69
+ )
60
70
  "
61
71
  :leave-to-class="
62
- themedClass('transitionLeaveToClass', 'max-h-0 opacity-0')
72
+ themedClass(
73
+ 'transitionLeaveToClass',
74
+ 'motion-safe:max-h-0 motion-safe:opacity-0',
75
+ )
63
76
  "
64
77
  >
65
78
  <ul
@@ -163,7 +176,7 @@ const componentAttrs = computed(() => {
163
176
  'aria-current': menuItemActive?.id === item.id ? 'page' : undefined,
164
177
  tabindex: 0,
165
178
  class: cn(themedClass('linkClass'), item.additionalClass),
166
- 'exact-active-class': 'text-primary',
179
+ 'exact-active-class': themedClass('linkActiveClass', 'text-primary'),
167
180
  }
168
181
 
169
182
  case 'button':
@@ -25,21 +25,17 @@
25
25
  :class="
26
26
  themedClass(
27
27
  'metaRowClass',
28
- 'flex items-center justify-end gap-8 py-2',
28
+ 'flex items-center justify-end gap-8 py-2 empty:hidden',
29
29
  )
30
30
  "
31
31
  >
32
- <div :class="themedClass('metaMenuContainer')">
33
- <SectionHeaderMetaMenu />
34
- </div>
35
- <div :class="themedClass('metaButtonsContainer')">
36
- <SectionHeaderButtons :buttons="metaLinks" />
37
- </div>
32
+ <SectionHeaderMetaMenu />
33
+ <SectionHeaderMetaButtons :buttons="metaLinks" />
38
34
  <div
39
35
  :class="
40
36
  themedClass(
41
37
  'languageDropdownContainer',
42
- 'flex h-full items-center',
38
+ 'flex h-full items-center empty:hidden',
43
39
  )
44
40
  "
45
41
  >
@@ -64,18 +60,14 @@
64
60
  <div :class="themedClass('logoContainer', 'shrink-0')">
65
61
  <SectionHeaderLogo />
66
62
  </div>
63
+
64
+ <SectionHeaderDesktopMainMenu />
67
65
  <div
68
66
  :class="
69
- themedClass(
70
- 'mainMenuContainer',
71
- 'ml-auto hidden 2xl:flex 2xl:h-full 2xl:items-center',
72
- )
67
+ themedClass('mainButtonsContainer', 'hidden empty:hidden 2xl:block')
73
68
  "
74
69
  >
75
- <SectionHeaderDesktopMainMenu />
76
- </div>
77
- <div :class="themedClass('mainButtonsContainer', 'hidden 2xl:block')">
78
- <SectionHeaderButtons :buttons="contactButtons" />
70
+ <SectionHeaderMainButtons :buttons="contactButtons" />
79
71
  </div>
80
72
  <div
81
73
  :class="
@@ -0,0 +1,4 @@
1
+ export function useIsHomepage() {
2
+ const route = useRoute()
3
+ return computed(() => route.name === 'home')
4
+ }
@@ -1,4 +1,4 @@
1
- import { useIsMobile } from './useIsMobile'
1
+ import { useIsMobile } from '@iqual/nuxt-icms/composables/useIsMobile'
2
2
 
3
3
  const mobileNavHeight: number = 60 // actual height + 4
4
4
  const desktopNavHeight: number = 85 // actual height + 4
package/nuxt.config.ts CHANGED
@@ -499,6 +499,11 @@ export default defineNuxtConfig({
499
499
  label: 'Reverse columns',
500
500
  default: false,
501
501
  },
502
+ showCaptions: {
503
+ type: 'checkbox',
504
+ label: 'Show captions',
505
+ default: true,
506
+ },
502
507
  imageAlignment: {
503
508
  type: 'radios',
504
509
  label: 'Image Alingment',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iqual/nuxt-icms",
3
- "version": "1.4.5",
3
+ "version": "1.4.7",
4
4
  "description": "ICMS Base",
5
5
  "type": "module",
6
6
  "private": false,
@@ -223,8 +223,8 @@ const config: Config = {
223
223
  },
224
224
  ],
225
225
  corePlugins: {
226
+ container: true,
226
227
  textOpacity: false,
227
- container: false,
228
228
  },
229
229
  }
230
230